diff --git a/.github/workflows/develop-status.yml b/.github/workflows/develop-status.yml index 7ad395a48b7..0e5abcf99a4 100644 --- a/.github/workflows/develop-status.yml +++ b/.github/workflows/develop-status.yml @@ -11,7 +11,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - jdk: [1.8, 11] + jdk: [1.8, 13] steps: - uses: actions/checkout@v1 diff --git a/.github/workflows/master-status.yml b/.github/workflows/master-status.yml index 529d89b41e6..e0aee8c89ff 100644 --- a/.github/workflows/master-status.yml +++ b/.github/workflows/master-status.yml @@ -11,7 +11,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - jdk: [1.8, 11] + jdk: [1.8, 13] steps: - uses: actions/checkout@v1 diff --git a/.github/workflows/new-issue.yml b/.github/workflows/new-issue.yml index 0b1eb2c8729..01fe3ee1785 100644 --- a/.github/workflows/new-issue.yml +++ b/.github/workflows/new-issue.yml @@ -10,5 +10,5 @@ jobs: env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} GITHUB_PROJECT_URL: https://github.com/eclipse/rdf4j/projects/19 - GITHUB_PROJECT_COLUMN_NAME: Inbox + GITHUB_PROJECT_COLUMN_NAME: 📥 Inbox diff --git a/.github/workflows/pr-verify.yml b/.github/workflows/pr-verify.yml index c6307927115..473c6de8cd6 100644 --- a/.github/workflows/pr-verify.yml +++ b/.github/workflows/pr-verify.yml @@ -8,7 +8,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - jdk: [1.8, 11] + jdk: [1.8, 13] steps: - uses: actions/checkout@v1 diff --git a/README.md b/README.md index 0b3c11dffd8..cc18d1dc3e4 100644 --- a/README.md +++ b/README.md @@ -2,8 +2,8 @@ This is the main code repository for the Eclipse RDF4J project. -![](https://github.com/eclipse/rdf4j/workflows/master%20status/badge.svg) -![](https://github.com/eclipse/rdf4j/workflows/develop%20status/badge.svg) +[![master status](https://github.com/eclipse/rdf4j/workflows/master%20status/badge.svg)](https://github.com/eclipse/rdf4j/actions?query=workflow%3A%22master+status%22) +[![develop status](https://github.com/eclipse/rdf4j/workflows/develop%20status/badge.svg)](https://github.com/eclipse/rdf4j/actions?query=workflow%3A%22develop+status%22) Visit the [project website](https://rdf4j.org/) for news, documentation, and downloadable releases. diff --git a/assembly/pom.xml b/assembly/pom.xml index 12e63b65750..c17a4897b4e 100644 --- a/assembly/pom.xml +++ b/assembly/pom.xml @@ -4,7 +4,7 @@ org.eclipse.rdf4j rdf4j - 3.1.5-SNAPSHOT + 3.2.2-SNAPSHOT rdf4j-assembly pom diff --git a/bom/pom.xml b/bom/pom.xml index 3cc54a438aa..896baebe17b 100644 --- a/bom/pom.xml +++ b/bom/pom.xml @@ -4,7 +4,7 @@ org.eclipse.rdf4j rdf4j - 3.1.5-SNAPSHOT + 3.2.2-SNAPSHOT rdf4j-bom pom diff --git a/compliance/elasticsearch/pom.xml b/compliance/elasticsearch/pom.xml index 0eb91f47ecf..b54c8f45bc5 100644 --- a/compliance/elasticsearch/pom.xml +++ b/compliance/elasticsearch/pom.xml @@ -4,7 +4,7 @@ org.eclipse.rdf4j rdf4j-compliance - 3.1.5-SNAPSHOT + 3.2.2-SNAPSHOT rdf4j-elasticsearch-compliance RDF4J Elasticsearch Sail Tests diff --git a/compliance/elasticsearch/src/test/java/org/eclipse/rdf4j/sail/elasticsearch/ElasticsearchIndexTest.java b/compliance/elasticsearch/src/test/java/org/eclipse/rdf4j/sail/elasticsearch/ElasticsearchIndexTest.java index 04e39f0bcf7..7d55a6303b3 100644 --- a/compliance/elasticsearch/src/test/java/org/eclipse/rdf4j/sail/elasticsearch/ElasticsearchIndexTest.java +++ b/compliance/elasticsearch/src/test/java/org/eclipse/rdf4j/sail/elasticsearch/ElasticsearchIndexTest.java @@ -40,7 +40,6 @@ import org.elasticsearch.test.ESIntegTestCase.ClusterScope; import org.junit.After; import org.junit.Before; -import org.junit.Ignore; import org.junit.Test; @ClusterScope(numDataNodes = 1) @@ -443,15 +442,17 @@ public void testRejectedDatatypes() { private void assertStatement(Statement statement) throws Exception { SearchDocument document = index.getDocument(statement.getSubject(), statement.getContext()); - if (document == null) + if (document == null) { fail("Missing document " + statement.getSubject()); + } assertStatement(statement, document); } private void assertNoStatement(Statement statement) throws Exception { SearchDocument document = index.getDocument(statement.getSubject(), statement.getContext()); - if (document == null) + if (document == null) { return; + } assertNoStatement(statement, document); } @@ -463,8 +464,9 @@ private void assertStatement(Statement statement, SearchDocument document) { List fields = document.getProperty(SearchFields.getPropertyField(statement.getPredicate())); assertNotNull("field " + statement.getPredicate() + " not found in document " + document, fields); for (String f : fields) { - if (((Literal) statement.getObject()).getLabel().equals(f)) + if (((Literal) statement.getObject()).getLabel().equals(f)) { return; + } } fail("Statement not found in document " + statement); } @@ -475,11 +477,13 @@ private void assertStatement(Statement statement, SearchDocument document) { */ private void assertNoStatement(Statement statement, SearchDocument document) { List fields = document.getProperty(SearchFields.getPropertyField(statement.getPredicate())); - if (fields == null) + if (fields == null) { return; + } for (String f : fields) { - if (((Literal) statement.getObject()).getLabel().equals(f)) + if (((Literal) statement.getObject()).getLabel().equals(f)) { fail("Statement should not be found in document " + statement); + } } } diff --git a/compliance/elasticsearch/src/test/java/org/eclipse/rdf4j/sail/elasticsearch/ElasticsearchSailIndexedPropertiesTest.java b/compliance/elasticsearch/src/test/java/org/eclipse/rdf4j/sail/elasticsearch/ElasticsearchSailIndexedPropertiesTest.java index f5bfa998c7b..d25f8ac2eb6 100644 --- a/compliance/elasticsearch/src/test/java/org/eclipse/rdf4j/sail/elasticsearch/ElasticsearchSailIndexedPropertiesTest.java +++ b/compliance/elasticsearch/src/test/java/org/eclipse/rdf4j/sail/elasticsearch/ElasticsearchSailIndexedPropertiesTest.java @@ -22,7 +22,6 @@ import org.elasticsearch.test.ESIntegTestCase.ClusterScope; import org.junit.After; import org.junit.Before; -import org.junit.Ignore; import org.junit.Test; @ClusterScope(numDataNodes = 1) diff --git a/compliance/elasticsearch/src/test/java/org/eclipse/rdf4j/sail/elasticsearch/ElasticsearchSailTest.java b/compliance/elasticsearch/src/test/java/org/eclipse/rdf4j/sail/elasticsearch/ElasticsearchSailTest.java index 333dcd5eaac..1b8e349dff2 100644 --- a/compliance/elasticsearch/src/test/java/org/eclipse/rdf4j/sail/elasticsearch/ElasticsearchSailTest.java +++ b/compliance/elasticsearch/src/test/java/org/eclipse/rdf4j/sail/elasticsearch/ElasticsearchSailTest.java @@ -22,7 +22,6 @@ import org.elasticsearch.test.ESIntegTestCase.ClusterScope; import org.junit.After; import org.junit.Before; -import org.junit.Ignore; import org.junit.Test; @ClusterScope(numDataNodes = 1) diff --git a/compliance/elasticsearch/src/test/java/org/eclipse/rdf4j/sail/elasticsearch/examples/ElasticsearchSailExample.java b/compliance/elasticsearch/src/test/java/org/eclipse/rdf4j/sail/elasticsearch/examples/ElasticsearchSailExample.java index 992791312e3..0c2644e46e2 100644 --- a/compliance/elasticsearch/src/test/java/org/eclipse/rdf4j/sail/elasticsearch/examples/ElasticsearchSailExample.java +++ b/compliance/elasticsearch/src/test/java/org/eclipse/rdf4j/sail/elasticsearch/examples/ElasticsearchSailExample.java @@ -29,14 +29,14 @@ /** * Example code showing how to use the LuceneSail - * + * * @author sauermann */ public class ElasticsearchSailExample { /** * Create a lucene sail and use it - * + * * @param args */ public static void main(String[] args) throws Exception { diff --git a/compliance/elasticsearch/src/test/java/org/elasticsearch/bootstrap/JarHell.java b/compliance/elasticsearch/src/test/java/org/elasticsearch/bootstrap/JarHell.java index e25d3501b6a..22a75373aca 100644 --- a/compliance/elasticsearch/src/test/java/org/elasticsearch/bootstrap/JarHell.java +++ b/compliance/elasticsearch/src/test/java/org/elasticsearch/bootstrap/JarHell.java @@ -4,7 +4,6 @@ import java.util.Collections; import java.util.Set; import java.util.function.Consumer; -import java.util.logging.Logger; /** * test of elasticsearch pass. Thus as a workaround we deactivate this test. see diff --git a/compliance/geosparql/pom.xml b/compliance/geosparql/pom.xml index 69918115cb7..1c23c8e1335 100644 --- a/compliance/geosparql/pom.xml +++ b/compliance/geosparql/pom.xml @@ -4,7 +4,7 @@ org.eclipse.rdf4j rdf4j-compliance - 3.1.5-SNAPSHOT + 3.2.2-SNAPSHOT rdf4j-geosparql-compliance RDF4J GeoSPARQL compliance tests diff --git a/compliance/lucene/pom.xml b/compliance/lucene/pom.xml index 523adf33a28..4bc9c6ee523 100644 --- a/compliance/lucene/pom.xml +++ b/compliance/lucene/pom.xml @@ -4,7 +4,7 @@ org.eclipse.rdf4j rdf4j-compliance - 3.1.5-SNAPSHOT + 3.2.2-SNAPSHOT rdf4j-lucene-compliance RDF4J Lucene Sail Tests diff --git a/compliance/lucene/src/test/java/org/eclipse/rdf4j/sail/lucene/LuceneGeoSPARQLTest.java b/compliance/lucene/src/test/java/org/eclipse/rdf4j/sail/lucene/LuceneGeoSPARQLTest.java index cd997eeadf5..e60b83616f2 100644 --- a/compliance/lucene/src/test/java/org/eclipse/rdf4j/sail/lucene/LuceneGeoSPARQLTest.java +++ b/compliance/lucene/src/test/java/org/eclipse/rdf4j/sail/lucene/LuceneGeoSPARQLTest.java @@ -4,7 +4,7 @@ * are made available under the terms of the Eclipse Distribution License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/org/documents/edl-v10.php. - *******************************************************************************/ + *******************************************************************************/ package org.eclipse.rdf4j.sail.lucene; import java.io.File; diff --git a/compliance/lucene/src/test/java/org/eclipse/rdf4j/sail/lucene/LuceneSailIndexedPropertiesTest.java b/compliance/lucene/src/test/java/org/eclipse/rdf4j/sail/lucene/LuceneSailIndexedPropertiesTest.java index 88718e90518..e3036f71499 100644 --- a/compliance/lucene/src/test/java/org/eclipse/rdf4j/sail/lucene/LuceneSailIndexedPropertiesTest.java +++ b/compliance/lucene/src/test/java/org/eclipse/rdf4j/sail/lucene/LuceneSailIndexedPropertiesTest.java @@ -15,7 +15,7 @@ public class LuceneSailIndexedPropertiesTest extends AbstractLuceneSailIndexedPr /* * (non-Javadoc) - * + * * @see * org.eclipse.rdf4j.sail.lucene.AbstractLuceneSailIndexedPropertiesTest#configure(org.eclipse.rdf4j.sail.lucene. * LuceneSail) diff --git a/compliance/lucene/src/test/java/org/eclipse/rdf4j/sail/lucene/LuceneSailTest.java b/compliance/lucene/src/test/java/org/eclipse/rdf4j/sail/lucene/LuceneSailTest.java index 768e1e04d3e..014c4f83416 100644 --- a/compliance/lucene/src/test/java/org/eclipse/rdf4j/sail/lucene/LuceneSailTest.java +++ b/compliance/lucene/src/test/java/org/eclipse/rdf4j/sail/lucene/LuceneSailTest.java @@ -17,7 +17,7 @@ public class LuceneSailTest extends AbstractLuceneSailTest { /* * (non-Javadoc) - * + * * @see org.eclipse.rdf4j.sail.lucene.AbstractLuceneSailTest#configure(org.eclipse.rdf4j.sail.lucene.LuceneSail) */ @Override diff --git a/compliance/model/pom.xml b/compliance/model/pom.xml index 47cf63a26e1..1aedf0cc7b1 100644 --- a/compliance/model/pom.xml +++ b/compliance/model/pom.xml @@ -3,7 +3,7 @@ rdf4j-compliance org.eclipse.rdf4j - 3.1.5-SNAPSHOT + 3.2.2-SNAPSHOT 4.0.0 rdf4j-model-compliance diff --git a/compliance/model/src/test/java/org/eclipse/rdf4j/model/DynamicModelTest.java b/compliance/model/src/test/java/org/eclipse/rdf4j/model/DynamicModelTest.java new file mode 100644 index 00000000000..79f9f92de5d --- /dev/null +++ b/compliance/model/src/test/java/org/eclipse/rdf4j/model/DynamicModelTest.java @@ -0,0 +1,20 @@ +/******************************************************************************* + * Copyright (c) 2015 Eclipse RDF4J contributors, Aduna, and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Distribution License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ +package org.eclipse.rdf4j.model; + +import org.eclipse.rdf4j.model.impl.DynamicModel; +import org.eclipse.rdf4j.model.impl.LinkedHashModelFactory; + +public class DynamicModelTest extends AbstractModelTest { + + @Override + protected Model getNewModel() { + return new DynamicModel(new LinkedHashModelFactory()); + } + +} diff --git a/compliance/model/src/test/java/org/eclipse/rdf4j/model/LinkedHashModelNamespacesTest.java b/compliance/model/src/test/java/org/eclipse/rdf4j/model/LinkedHashModelNamespacesTest.java index ffdf9f62887..86e0fd8268f 100644 --- a/compliance/model/src/test/java/org/eclipse/rdf4j/model/LinkedHashModelNamespacesTest.java +++ b/compliance/model/src/test/java/org/eclipse/rdf4j/model/LinkedHashModelNamespacesTest.java @@ -12,7 +12,7 @@ /** * Tests for {@link Namespace} support in {@link LinkedHashModel} using the abstract tests defined in * {@link ModelNamespacesTest}. - * + * * @author Peter Ansell p_ansell@yahoo.com */ public class LinkedHashModelNamespacesTest extends ModelNamespacesTest { diff --git a/compliance/model/src/test/java/org/eclipse/rdf4j/model/TreeModelNamespacesTest.java b/compliance/model/src/test/java/org/eclipse/rdf4j/model/TreeModelNamespacesTest.java index c35f467d50b..982dc0add2a 100644 --- a/compliance/model/src/test/java/org/eclipse/rdf4j/model/TreeModelNamespacesTest.java +++ b/compliance/model/src/test/java/org/eclipse/rdf4j/model/TreeModelNamespacesTest.java @@ -12,7 +12,7 @@ /** * Tests for {@link Namespace} support in {@link TreeModel} using the abstract tests defined in * {@link ModelNamespacesTest}. - * + * * @author Peter Ansell p_ansell@yahoo.com */ public class TreeModelNamespacesTest extends ModelNamespacesTest { diff --git a/compliance/model/src/test/java/org/eclipse/rdf4j/model/util/IsomorphicBenchmark.java b/compliance/model/src/test/java/org/eclipse/rdf4j/model/util/IsomorphicBenchmark.java index acf4b30aac4..ba718403001 100644 --- a/compliance/model/src/test/java/org/eclipse/rdf4j/model/util/IsomorphicBenchmark.java +++ b/compliance/model/src/test/java/org/eclipse/rdf4j/model/util/IsomorphicBenchmark.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 201 Eclipse RDF4J contributors. + * Copyright (c) 2019 Eclipse RDF4J contributors. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Distribution License v1.0 * which accompanies this distribution, and is available at diff --git a/compliance/model/src/test/java/org/eclipse/rdf4j/model/util/IsomorphicTest.java b/compliance/model/src/test/java/org/eclipse/rdf4j/model/util/IsomorphicTest.java index 4278dfd718c..0121eea91df 100644 --- a/compliance/model/src/test/java/org/eclipse/rdf4j/model/util/IsomorphicTest.java +++ b/compliance/model/src/test/java/org/eclipse/rdf4j/model/util/IsomorphicTest.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 201 Eclipse RDF4J contributors. + * Copyright (c) 2019 Eclipse RDF4J contributors. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Distribution License v1.0 * which accompanies this distribution, and is available at diff --git a/compliance/model/src/test/java/org/eclipse/rdf4j/model/util/Main.java b/compliance/model/src/test/java/org/eclipse/rdf4j/model/util/Main.java index 3fcc4fcb049..6f7edddd8be 100644 --- a/compliance/model/src/test/java/org/eclipse/rdf4j/model/util/Main.java +++ b/compliance/model/src/test/java/org/eclipse/rdf4j/model/util/Main.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 201 Eclipse RDF4J contributors. + * Copyright (c) 2019 Eclipse RDF4J contributors. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Distribution License v1.0 * which accompanies this distribution, and is available at diff --git a/compliance/pom.xml b/compliance/pom.xml index 2560d0ce820..f863e4cc53e 100644 --- a/compliance/pom.xml +++ b/compliance/pom.xml @@ -4,7 +4,7 @@ org.eclipse.rdf4j rdf4j - 3.1.5-SNAPSHOT + 3.2.2-SNAPSHOT rdf4j-compliance pom diff --git a/compliance/repository/pom.xml b/compliance/repository/pom.xml index f769929ebcf..912e51ae1fc 100644 --- a/compliance/repository/pom.xml +++ b/compliance/repository/pom.xml @@ -4,7 +4,7 @@ org.eclipse.rdf4j rdf4j-compliance - 3.1.5-SNAPSHOT + 3.2.2-SNAPSHOT rdf4j-repository-compliance war @@ -56,18 +56,6 @@ ${project.version} test - - ${project.groupId} - rdf4j-repository-sail - ${project.version} - test - - - ${project.groupId} - rdf4j-sail-memory - ${project.version} - test - org.eclipse.jetty jetty-server diff --git a/compliance/repository/src/test/java/org/eclipse/rdf4j/repository/manager/LocalRepositoryManagerIntegrationTest.java b/compliance/repository/src/test/java/org/eclipse/rdf4j/repository/manager/LocalRepositoryManagerIntegrationTest.java index 2726f8f046d..37844c1b83e 100644 --- a/compliance/repository/src/test/java/org/eclipse/rdf4j/repository/manager/LocalRepositoryManagerIntegrationTest.java +++ b/compliance/repository/src/test/java/org/eclipse/rdf4j/repository/manager/LocalRepositoryManagerIntegrationTest.java @@ -40,7 +40,7 @@ /** * Integration tests for {@link LocalRepositoryManager} - * + * * @author Jeen Broekstra */ public class LocalRepositoryManagerIntegrationTest extends RepositoryManagerIntegrationTest { diff --git a/compliance/repository/src/test/java/org/eclipse/rdf4j/repository/manager/RepositoryManagerIntegrationTest.java b/compliance/repository/src/test/java/org/eclipse/rdf4j/repository/manager/RepositoryManagerIntegrationTest.java index 5e457c17674..e058e61e04b 100644 --- a/compliance/repository/src/test/java/org/eclipse/rdf4j/repository/manager/RepositoryManagerIntegrationTest.java +++ b/compliance/repository/src/test/java/org/eclipse/rdf4j/repository/manager/RepositoryManagerIntegrationTest.java @@ -53,4 +53,4 @@ protected Repository createRepository(String id) throws RepositoryConfigExceptio }; } -} \ No newline at end of file +} diff --git a/compliance/repository/src/test/java/org/eclipse/rdf4j/repository/sparql/SPARQLStoreConnectionTest.java b/compliance/repository/src/test/java/org/eclipse/rdf4j/repository/sparql/SPARQLStoreConnectionTest.java index 39d7f5e5297..1c81b8f9566 100644 --- a/compliance/repository/src/test/java/org/eclipse/rdf4j/repository/sparql/SPARQLStoreConnectionTest.java +++ b/compliance/repository/src/test/java/org/eclipse/rdf4j/repository/sparql/SPARQLStoreConnectionTest.java @@ -13,7 +13,6 @@ import static org.junit.Assert.assertTrue; import java.lang.reflect.Field; -import java.lang.reflect.Modifier; import java.util.List; import org.eclipse.rdf4j.IsolationLevel; @@ -91,73 +90,53 @@ public void testDuplicateFilter() throws Exception { } @Override - @Ignore + @Ignore("relies on SPARQL update operation handled as part of txn") public void testAddDelete() throws RDF4JException { System.err.println("temporarily disabled testAddDelete() for SPARQLRepository"); } @Override - @Ignore + @Ignore("relies on SPARQL update operation handled as part of txn") public void testAddRemoveInsert() throws RDF4JException { System.err.println("temporarily disabled testAddRemoveInsert() for SPARQLRepository"); } @Override - @Ignore + @Ignore("relies on pending updates being visible in own connection") public void testSizeRollback() throws Exception { System.err.println("temporarily disabled testSizeRollback() for SPARQLRepository"); } - @Test - @Ignore - @Override - public void testURISerialization() throws Exception { - System.err.println("temporarily disabled testURISerialization() for SPARQLRepository"); - } - - @Test - @Ignore - @Override - public void testStatementSerialization() throws Exception { - System.err.println("temporarily disabled testStatementSerialization() for SPARQLRepository"); - } - @Override - @Ignore + @Ignore("relies on pending updates being visible in own connection") public void testAutoCommit() throws Exception { System.err.println("temporarily disabled testAutoCommit() for SPARQLRepository"); } @Override - @Ignore + @Ignore("relies on pending updates being visible in own connection") public void testRollback() throws Exception { System.err.println("temporarily disabled testRollback() for SPARQLRepository"); } @Override - @Ignore + @Ignore("relies on pending updates being visible in own connection") public void testEmptyRollback() throws Exception { System.err.println("temporarily disabled testEmptyRollback() for SPARQLRepository"); } @Override - @Ignore + @Ignore("relies on pending updates being visible in own connection") public void testEmptyCommit() throws Exception { System.err.println("temporarily disabled testEmptyCommit() for SPARQLRepository"); } @Override - @Ignore + @Ignore("SeRQL language not supported on SPARQL endpoints") public void testPrepareSeRQLQuery() throws Exception { System.err.println("disabled testPrepareSeRQLQuery() for SPARQLRepository"); } - @Override - @Ignore - public void testLiteralSerialization() throws Exception { - System.err.println("temporarily disabled testLiteralSerialization() for SPARQLRepository"); - } - @Override @Ignore public void testSizeCommit() throws Exception { @@ -212,12 +191,6 @@ public void testGetStatementsContextHandling() throws Exception { private void enableQuadModeOnConnection(SPARQLConnection con) throws Exception { Field quadModeField = SPARQLConnection.class.getDeclaredField("quadMode"); quadModeField.setAccessible(true); - - // remove final modifier from field - Field modifiersField = Field.class.getDeclaredField("modifiers"); - modifiersField.setAccessible(true); - modifiersField.setInt(quadModeField, quadModeField.getModifiers() & ~Modifier.FINAL); - quadModeField.set(con, true); } diff --git a/compliance/repository/src/test/java/org/eclipse/rdf4j/repository/sparql/federation/RepositoryFederatedServiceIntegrationTest.java b/compliance/repository/src/test/java/org/eclipse/rdf4j/repository/sparql/federation/RepositoryFederatedServiceIntegrationTest.java index c954080ab6c..7f8eab07221 100644 --- a/compliance/repository/src/test/java/org/eclipse/rdf4j/repository/sparql/federation/RepositoryFederatedServiceIntegrationTest.java +++ b/compliance/repository/src/test/java/org/eclipse/rdf4j/repository/sparql/federation/RepositoryFederatedServiceIntegrationTest.java @@ -33,7 +33,7 @@ /** * Integration tests for {@link RepositoryFederatedService} - * + * * @author Andreas Schwarte * */ @@ -101,7 +101,7 @@ public void test3() throws Exception { vf.createStatement(iri("s2"), RDFS.LABEL, l("val2")), vf.createStatement(iri("s3"), RDFS.LABEL, l("val3")))); - String query = "SELECT ?var WHERE { VALUES ?var { 'val1' 'val2' } . SERVICE { SELECT ?var { ?s ?p ?var } LIMIT 1000 } }"; + String query = "SELECT ?var WHERE { VALUES ?var { 'val1' 'val2' } . SERVICE { SELECT ?var { ?s ?p ?var } LIMIT 1000 } } order by ?var"; assertResultEquals(evaluateQuery(query), "var", Lists.newArrayList(l("val1"), l("val2"))); } @@ -129,7 +129,7 @@ public void test4() throws Exception { vf.createStatement(iri("s2"), RDFS.LABEL, l("val2")), vf.createStatement(iri("s3"), RDFS.LABEL, l("val3")))); - String query = "SELECT ?var WHERE { SERVICE { ?s ?p ?var } . SERVICE { ?s ?p ?var } }"; + String query = "SELECT ?var WHERE { SERVICE { ?s ?p ?var } . SERVICE { ?s ?p ?var } } order by ?var"; assertResultEquals(evaluateQuery(query), "var", Lists.newArrayList(l("val1"), l("val2"), l("val3"))); } @@ -143,7 +143,7 @@ public void test4a() throws Exception { vf.createStatement(iri("s3"), RDFS.LABEL, l("val3")))); // Note: here we apply a workaround and explicitly project "?__rowIdx" - String query = "SELECT ?var WHERE { SERVICE { SELECT ?var { ?s ?p ?var } LIMIT 3 } . SERVICE { SELECT ?s ?var ?__rowIdx { ?s ?p ?var } LIMIT 3 } }"; + String query = "SELECT ?var WHERE { SERVICE { SELECT ?var { ?s ?p ?var } LIMIT 3 } . SERVICE { SELECT ?s ?var ?__rowIdx { ?s ?p ?var } LIMIT 3 } } order by ?var"; assertResultEquals(evaluateQuery(query), "var", Lists.newArrayList(l("val1"), l("val2"), l("val3"))); } @@ -156,7 +156,7 @@ public void test4b() throws Exception { vf.createStatement(iri("s2"), RDFS.LABEL, l("val2")), vf.createStatement(iri("s3"), RDFS.LABEL, l("val3")))); - String query = "SELECT ?var WHERE { SERVICE { SELECT ?var { ?s ?p ?var } LIMIT 3 } . SERVICE { SELECT ?s ?var { ?s ?p ?var } LIMIT 3 } }"; + String query = "SELECT ?var WHERE { SERVICE { SELECT ?var { ?s ?p ?var } LIMIT 3 } . SERVICE { SELECT ?s ?var { ?s ?p ?var } LIMIT 3 } } order by ?var"; assertResultEquals(evaluateQuery(query), "var", Lists.newArrayList(l("val1"), l("val2"), l("val3"))); } diff --git a/compliance/rio/pom.xml b/compliance/rio/pom.xml index b732c4d6899..3b3bfa5d446 100644 --- a/compliance/rio/pom.xml +++ b/compliance/rio/pom.xml @@ -4,7 +4,7 @@ org.eclipse.rdf4j rdf4j-compliance - 3.1.5-SNAPSHOT + 3.2.2-SNAPSHOT rdf4j-rio-compliance RDF4J Rio compliance tests diff --git a/compliance/rio/src/test/java/org/eclipse/rdf4j/rio/nquads/NQuadsParserTest.java b/compliance/rio/src/test/java/org/eclipse/rdf4j/rio/nquads/NQuadsParserTest.java index 429702080ae..1ac0ff3c415 100644 --- a/compliance/rio/src/test/java/org/eclipse/rdf4j/rio/nquads/NQuadsParserTest.java +++ b/compliance/rio/src/test/java/org/eclipse/rdf4j/rio/nquads/NQuadsParserTest.java @@ -13,7 +13,7 @@ /** * JUnit test for the N-Quads parser. - * + * * @author Arjohn Kampman */ public class NQuadsParserTest extends AbstractNQuadsParserTest { diff --git a/compliance/rio/src/test/java/org/eclipse/rdf4j/rio/ntriples/NTriplesParserTest.java b/compliance/rio/src/test/java/org/eclipse/rdf4j/rio/ntriples/NTriplesParserTest.java index 72b038ca07d..80ec12281aa 100644 --- a/compliance/rio/src/test/java/org/eclipse/rdf4j/rio/ntriples/NTriplesParserTest.java +++ b/compliance/rio/src/test/java/org/eclipse/rdf4j/rio/ntriples/NTriplesParserTest.java @@ -13,7 +13,7 @@ /** * JUnit test for the N-Triples parser. - * + * * @author Arjohn Kampman */ public class NTriplesParserTest extends AbstractNTriplesParserTest { diff --git a/compliance/rio/src/test/java/org/eclipse/rdf4j/rio/rdfjson/RDFJSONParserTest.java b/compliance/rio/src/test/java/org/eclipse/rdf4j/rio/rdfjson/RDFJSONParserTest.java index deedb7f37d9..b2f1d0db1d5 100644 --- a/compliance/rio/src/test/java/org/eclipse/rdf4j/rio/rdfjson/RDFJSONParserTest.java +++ b/compliance/rio/src/test/java/org/eclipse/rdf4j/rio/rdfjson/RDFJSONParserTest.java @@ -11,7 +11,7 @@ /** * JUnit test for the RDF/JSON parser. - * + * * @author Peter Ansell */ public class RDFJSONParserTest extends RDFJSONParserTestCase { diff --git a/compliance/serql/pom.xml b/compliance/serql/pom.xml index fcbcdc30539..1f83d1b7c68 100644 --- a/compliance/serql/pom.xml +++ b/compliance/serql/pom.xml @@ -4,7 +4,7 @@ org.eclipse.rdf4j rdf4j-compliance - 3.1.5-SNAPSHOT + 3.2.2-SNAPSHOT rdf4j-serql-compliance RDF4J SeRQL query parser compliance tests diff --git a/compliance/serql/src/test/java/org/eclipse/rdf4j/query/parser/serql/MemorySeRQLQueryTest.java b/compliance/serql/src/test/java/org/eclipse/rdf4j/query/parser/serql/MemorySeRQLQueryTest.java index 66f4cdf49bc..28ebd4b6511 100644 --- a/compliance/serql/src/test/java/org/eclipse/rdf4j/query/parser/serql/MemorySeRQLQueryTest.java +++ b/compliance/serql/src/test/java/org/eclipse/rdf4j/query/parser/serql/MemorySeRQLQueryTest.java @@ -10,7 +10,6 @@ import java.util.List; import org.eclipse.rdf4j.query.QueryLanguage; -import org.eclipse.rdf4j.query.parser.serql.SeRQLQueryTestCase; import org.eclipse.rdf4j.sail.NotifyingSail; import org.eclipse.rdf4j.sail.memory.MemoryStore; diff --git a/compliance/serql/src/test/java/org/eclipse/rdf4j/query/parser/serql/NativeSeRQLQueryTest.java b/compliance/serql/src/test/java/org/eclipse/rdf4j/query/parser/serql/NativeSeRQLQueryTest.java index f084bb765be..720c40782ec 100644 --- a/compliance/serql/src/test/java/org/eclipse/rdf4j/query/parser/serql/NativeSeRQLQueryTest.java +++ b/compliance/serql/src/test/java/org/eclipse/rdf4j/query/parser/serql/NativeSeRQLQueryTest.java @@ -13,7 +13,6 @@ import org.eclipse.rdf4j.common.io.FileUtil; import org.eclipse.rdf4j.query.QueryLanguage; -import org.eclipse.rdf4j.query.parser.serql.SeRQLQueryTestCase; import org.eclipse.rdf4j.sail.NotifyingSail; import org.eclipse.rdf4j.sail.nativerdf.NativeStore; diff --git a/compliance/shacl/pom.xml b/compliance/shacl/pom.xml index 531c9069bb2..50c2786a6ce 100644 --- a/compliance/shacl/pom.xml +++ b/compliance/shacl/pom.xml @@ -4,7 +4,7 @@ org.eclipse.rdf4j rdf4j-compliance - 3.1.5-SNAPSHOT + 3.2.2-SNAPSHOT rdf4j-shacl-compliance RDF4J SHACL compliance tests diff --git a/compliance/shacl/src/test/java/org/eclipse/rdf4j/sail/shacl/SHACLComplianceTest.java b/compliance/shacl/src/test/java/org/eclipse/rdf4j/sail/shacl/SHACLComplianceTest.java index c9454fb31da..1f89a92f40e 100644 --- a/compliance/shacl/src/test/java/org/eclipse/rdf4j/sail/shacl/SHACLComplianceTest.java +++ b/compliance/shacl/src/test/java/org/eclipse/rdf4j/sail/shacl/SHACLComplianceTest.java @@ -34,8 +34,9 @@ public class SHACLComplianceTest extends AbstractSHACLTest { public static TestSuite suite() throws Exception { String[] ignoredDirectories = { "targets", "sparql", "complex", "misc", "node", "path", "validation-reports", "property" }; - if (RUN_ALL) + if (RUN_ALL) { ignoredDirectories = new String[0]; + } return new SHACLManifestTestSuiteFactory().createTestSuite(new TestFactory() { diff --git a/compliance/solr/pom.xml b/compliance/solr/pom.xml index 3fd877c7623..46adfe15f24 100644 --- a/compliance/solr/pom.xml +++ b/compliance/solr/pom.xml @@ -4,7 +4,7 @@ org.eclipse.rdf4j rdf4j-compliance - 3.1.5-SNAPSHOT + 3.2.2-SNAPSHOT rdf4j-solr-compliance RDF4J Solr Sail Tests diff --git a/compliance/solr/src/test/java/org/eclipse/rdf4j/sail/solr/SolrIndexTest.java b/compliance/solr/src/test/java/org/eclipse/rdf4j/sail/solr/SolrIndexTest.java index a89114efca7..5650225e130 100644 --- a/compliance/solr/src/test/java/org/eclipse/rdf4j/sail/solr/SolrIndexTest.java +++ b/compliance/solr/src/test/java/org/eclipse/rdf4j/sail/solr/SolrIndexTest.java @@ -391,8 +391,9 @@ private void assertStatement(Statement statement, SearchDocument document) { List fields = document.getProperty(SearchFields.getPropertyField(statement.getPredicate())); assertNotNull("field " + statement.getPredicate() + " not found in document " + document, fields); for (String f : fields) { - if (((Literal) statement.getObject()).getLabel().equals(f)) + if (((Literal) statement.getObject()).getLabel().equals(f)) { return; + } } fail("Statement not found in document " + statement); } diff --git a/compliance/solr/src/test/java/org/eclipse/rdf4j/sail/solr/examples/SolrSailExample.java b/compliance/solr/src/test/java/org/eclipse/rdf4j/sail/solr/examples/SolrSailExample.java index 3c0125cd958..c1654f6c2e4 100644 --- a/compliance/solr/src/test/java/org/eclipse/rdf4j/sail/solr/examples/SolrSailExample.java +++ b/compliance/solr/src/test/java/org/eclipse/rdf4j/sail/solr/examples/SolrSailExample.java @@ -29,14 +29,14 @@ /** * Example code showing how to use the LuceneSail - * + * * @author sauermann */ public class SolrSailExample { /** * Create a lucene sail and use it - * + * * @param args */ public static void main(String[] args) throws Exception { diff --git a/compliance/sparql/pom.xml b/compliance/sparql/pom.xml index 8ff52b54902..62cf9863506 100644 --- a/compliance/sparql/pom.xml +++ b/compliance/sparql/pom.xml @@ -4,7 +4,7 @@ org.eclipse.rdf4j rdf4j-compliance - 3.1.5-SNAPSHOT + 3.2.2-SNAPSHOT rdf4j-sparql-compliance war @@ -119,6 +119,11 @@ rdf4j-sail-federation ${project.version} + + ${project.groupId} + rdf4j-tools-federation + ${project.version} + org.slf4j slf4j-api diff --git a/compliance/sparql/src/test/java/org/eclipse/rdf4j/query/parser/sparql/SPARQLEmbeddedServer.java b/compliance/sparql/src/test/java/org/eclipse/rdf4j/query/parser/sparql/SPARQLEmbeddedServer.java index eeb2ff0c0fd..e5ccbd2a466 100644 --- a/compliance/sparql/src/test/java/org/eclipse/rdf4j/query/parser/sparql/SPARQLEmbeddedServer.java +++ b/compliance/sparql/src/test/java/org/eclipse/rdf4j/query/parser/sparql/SPARQLEmbeddedServer.java @@ -27,7 +27,7 @@ /** * An embedded http server for SPARQL query testing. Initializes a memory store repository for each specified * repositoryId. - * + * * @author Andreas Schwarte */ public class SPARQLEmbeddedServer { diff --git a/compliance/sparql/src/test/java/org/eclipse/rdf4j/query/parser/sparql/SPARQLServiceEvaluationTest.java b/compliance/sparql/src/test/java/org/eclipse/rdf4j/query/parser/sparql/SPARQLServiceEvaluationTest.java index 2981e7d0415..af09932d5e2 100644 --- a/compliance/sparql/src/test/java/org/eclipse/rdf4j/query/parser/sparql/SPARQLServiceEvaluationTest.java +++ b/compliance/sparql/src/test/java/org/eclipse/rdf4j/query/parser/sparql/SPARQLServiceEvaluationTest.java @@ -23,7 +23,6 @@ import org.eclipse.rdf4j.common.iteration.Iterations; import org.eclipse.rdf4j.common.text.StringUtil; import org.eclipse.rdf4j.model.IRI; -import org.eclipse.rdf4j.model.Literal; import org.eclipse.rdf4j.model.Statement; import org.eclipse.rdf4j.model.Value; import org.eclipse.rdf4j.model.ValueFactory; @@ -47,7 +46,6 @@ import org.eclipse.rdf4j.query.impl.TupleQueryResultBuilder; import org.eclipse.rdf4j.query.resultio.QueryResultFormat; import org.eclipse.rdf4j.query.resultio.QueryResultIO; -import org.eclipse.rdf4j.query.resultio.TupleQueryResultFormat; import org.eclipse.rdf4j.query.resultio.TupleQueryResultParser; import org.eclipse.rdf4j.repository.Repository; import org.eclipse.rdf4j.repository.RepositoryConnection; @@ -63,7 +61,6 @@ import org.eclipse.rdf4j.sail.memory.MemoryStore; import org.junit.After; import org.junit.Before; -import org.junit.Ignore; import org.junit.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -74,7 +71,7 @@ * Test suite for evaluation of SPARQL queries involving SERVICE clauses. The test suite starts up an embedded Jetty * server running RDF4J Server, which functions as the SPARQL endpoint to test against. The test is configured to * execute the W3C service tests located in rdf4j-sparql-testsuite/src/main/resources/testcases-service - * + * * @author Jeen Broekstra * @author Andreas Schwarte */ @@ -103,9 +100,10 @@ public SPARQLServiceEvaluationTest() { @Before public void setUp() throws Exception { // set up the server: the maximal number of endpoints must be known - List repositoryIds = new ArrayList(MAX_ENDPOINTS); - for (int i = 1; i <= MAX_ENDPOINTS; i++) + List repositoryIds = new ArrayList<>(MAX_ENDPOINTS); + for (int i = 1; i <= MAX_ENDPOINTS; i++) { repositoryIds.add("endpoint" + i); + } server = new SPARQLEmbeddedServer(repositoryIds); try { @@ -115,7 +113,7 @@ public void setUp() throws Exception { throw e; } - remoteRepositories = new ArrayList(MAX_ENDPOINTS); + remoteRepositories = new ArrayList<>(MAX_ENDPOINTS); for (int i = 1; i <= MAX_ENDPOINTS; i++) { HTTPRepository r = new HTTPRepository(getRepositoryUrl(i)); r.initialize(); @@ -128,7 +126,7 @@ public void setUp() throws Exception { /** * Get the repository url, initialized repositories are called endpoint1 endpoint2 .. endpoint%MAX_ENDPOINTS% - * + * * @param i the index of the repository, starting with 1 * @return */ @@ -138,7 +136,7 @@ protected String getRepositoryUrl(int i) { /** * Get the repository, initialized repositories are called endpoint1 endpoint2 .. endpoint%MAX_ENDPOINTS% - * + * * @param i the index of the repository, starting with 1 * @return */ @@ -148,7 +146,7 @@ public HTTPRepository getRepository(int i) { /** * Prepare a particular test, and load the specified data. Note: the repositories are cleared before loading data - * + * * @param localData a local data file that is added to local repository, use null if there is no local data * @param endpointData a list of endpoint data files, dataFile at index is loaded to endpoint%i%, use empty list for * no remote data @@ -156,9 +154,10 @@ public HTTPRepository getRepository(int i) { */ protected void prepareTest(String localData, List endpointData) throws Exception { - if (endpointData.size() > MAX_ENDPOINTS) + if (endpointData.size() > MAX_ENDPOINTS) { throw new RuntimeException( "MAX_ENDPOINTs to low, " + endpointData.size() + " repositories needed. Adjust configuration"); + } if (localData != null) { loadDataSet(localRepository, localData); @@ -173,7 +172,7 @@ protected void prepareTest(String localData, List endpointData) throws E /** * Load a dataset. Note: the repositories are cleared before loading data - * + * * @param rep * @param datasetFile * @throws RDFParseException @@ -185,8 +184,9 @@ protected void loadDataSet(Repository rep, String datasetFile) logger.debug("loading dataset..."); InputStream dataset = SPARQLServiceEvaluationTest.class.getResourceAsStream(datasetFile); - if (dataset == null) + if (dataset == null) { throw new IllegalArgumentException("Datasetfile " + datasetFile + " not found."); + } RepositoryConnection con = rep.getConnection(); try { @@ -214,7 +214,7 @@ public void tearDown() throws Exception { /** * Verify that BIND clause alias from the SERVICE clause gets added to the result set. - * + * * @see #646 */ @Test @@ -243,7 +243,7 @@ public void testValuesBindClauseHandling() throws Exception { /** * Verify that all relevant variable names from the SERVICE clause get added to the result set when a BIND clause is * present. - * + * * @see #703 */ @Test @@ -456,7 +456,7 @@ public void testNonAsciiCharHandling() throws Exception { /** * Execute a testcase, both queryFile and expectedResultFile must be files located on the class path. - * + * * @param queryFile * @param expectedResultFile * @param checkOrder @@ -497,7 +497,7 @@ private void execute(String queryFile, String expectedResultFile, boolean checkO /** * Read the query string from the specified resource - * + * * @param queryResource * @return * @throws RepositoryException @@ -514,7 +514,7 @@ private String readQueryString(String queryResource) throws RepositoryException, /** * Read the expected tuple query result from the specified resource - * + * * @param queryResource * @return * @throws RepositoryException @@ -545,7 +545,7 @@ private TupleQueryResult readExpectedTupleQueryResult(String resultFile) throws /** * Read the expected graph query result from the specified resource - * + * * @param resultFile * @return * @throws Exception @@ -558,7 +558,7 @@ private Set readExpectedGraphQueryResult(String resultFile) throws Ex parser.setPreserveBNodeIDs(true); parser.setValueFactory(SimpleValueFactory.getInstance()); - Set result = new LinkedHashSet(); + Set result = new LinkedHashSet<>(); parser.setRDFHandler(new StatementCollector(result)); InputStream in = SPARQLServiceEvaluationTest.class.getResourceAsStream(resultFile); @@ -573,7 +573,7 @@ private Set readExpectedGraphQueryResult(String resultFile) throws Ex /** * Compare two tuple query results - * + * * @param queryResult * @param expectedResult * @param checkOrder @@ -625,10 +625,10 @@ private void compareTupleQueryResults(TupleQueryResult queryResult, TupleQueryRe List expectedBindings = Iterations.asList(expectedResultTable); - List missingBindings = new ArrayList(expectedBindings); + List missingBindings = new ArrayList<>(expectedBindings); missingBindings.removeAll(queryBindings); - List unexpectedBindings = new ArrayList(queryBindings); + List unexpectedBindings = new ArrayList<>(queryBindings); unexpectedBindings.removeAll(expectedBindings); StringBuilder message = new StringBuilder(128); @@ -694,7 +694,7 @@ private void compareTupleQueryResults(TupleQueryResult queryResult, TupleQueryRe /** * Compare two graphs - * + * * @param queryResult * @param expectedResult * @throws Exception diff --git a/compliance/sparql/src/test/java/org/eclipse/rdf4j/query/parser/sparql/manifest/EarlReport.java b/compliance/sparql/src/test/java/org/eclipse/rdf4j/query/parser/sparql/manifest/EarlReport.java index d9d62e047ea..f98bda3da8e 100644 --- a/compliance/sparql/src/test/java/org/eclipse/rdf4j/query/parser/sparql/manifest/EarlReport.java +++ b/compliance/sparql/src/test/java/org/eclipse/rdf4j/query/parser/sparql/manifest/EarlReport.java @@ -21,9 +21,6 @@ import org.eclipse.rdf4j.model.vocabulary.EARL; import org.eclipse.rdf4j.model.vocabulary.RDF; import org.eclipse.rdf4j.model.vocabulary.XMLSchema; -import org.eclipse.rdf4j.query.parser.sparql.manifest.SPARQL11SyntaxTest; -import org.eclipse.rdf4j.query.parser.sparql.manifest.SPARQLQueryTest; -import org.eclipse.rdf4j.query.parser.sparql.manifest.SPARQLUpdateConformanceTest; import org.eclipse.rdf4j.repository.Repository; import org.eclipse.rdf4j.repository.RepositoryConnection; import org.eclipse.rdf4j.repository.RepositoryException; diff --git a/compliance/sparql/src/test/java/org/eclipse/rdf4j/query/parser/sparql/manifest/SPARQL12QueryTest.java b/compliance/sparql/src/test/java/org/eclipse/rdf4j/query/parser/sparql/manifest/SPARQL12QueryTest.java index c2ac46ecc7c..626e8a7fd7e 100644 --- a/compliance/sparql/src/test/java/org/eclipse/rdf4j/query/parser/sparql/manifest/SPARQL12QueryTest.java +++ b/compliance/sparql/src/test/java/org/eclipse/rdf4j/query/parser/sparql/manifest/SPARQL12QueryTest.java @@ -19,7 +19,7 @@ /** * SPARQL Query tests using testcase from the SPARQL 1.2 Working Group - * + * * @author Jeen Broekstra * */ diff --git a/compliance/sparql/src/test/java/org/eclipse/rdf4j/query/parser/sparql/manifest/W3CApprovedSPARQL10QueryTest.java b/compliance/sparql/src/test/java/org/eclipse/rdf4j/query/parser/sparql/manifest/W3CApprovedSPARQL10QueryTest.java index cf9654d665c..2ba2c926e6b 100644 --- a/compliance/sparql/src/test/java/org/eclipse/rdf4j/query/parser/sparql/manifest/W3CApprovedSPARQL10QueryTest.java +++ b/compliance/sparql/src/test/java/org/eclipse/rdf4j/query/parser/sparql/manifest/W3CApprovedSPARQL10QueryTest.java @@ -8,8 +8,6 @@ package org.eclipse.rdf4j.query.parser.sparql.manifest; import org.eclipse.rdf4j.query.Dataset; -import org.eclipse.rdf4j.query.parser.sparql.manifest.SPARQL11ManifestTest; -import org.eclipse.rdf4j.query.parser.sparql.manifest.SPARQLQueryTest; import org.eclipse.rdf4j.repository.Repository; import org.eclipse.rdf4j.repository.dataset.DatasetRepository; import org.eclipse.rdf4j.repository.sail.SailRepository; @@ -19,7 +17,7 @@ /** * Checks conformance of SPARQL query evaluation against the W3C-approved SPARQL 1.0 query test cases - * + * * @author Jeen Broekstra */ public class W3CApprovedSPARQL10QueryTest extends SPARQLQueryTest { diff --git a/compliance/sparql/src/test/java/org/eclipse/rdf4j/query/parser/sparql/manifest/W3CApprovedSPARQL10SyntaxTest.java b/compliance/sparql/src/test/java/org/eclipse/rdf4j/query/parser/sparql/manifest/W3CApprovedSPARQL10SyntaxTest.java index 0667ca16927..06caaf5335a 100644 --- a/compliance/sparql/src/test/java/org/eclipse/rdf4j/query/parser/sparql/manifest/W3CApprovedSPARQL10SyntaxTest.java +++ b/compliance/sparql/src/test/java/org/eclipse/rdf4j/query/parser/sparql/manifest/W3CApprovedSPARQL10SyntaxTest.java @@ -11,13 +11,12 @@ import org.eclipse.rdf4j.query.QueryLanguage; import org.eclipse.rdf4j.query.parser.ParsedOperation; import org.eclipse.rdf4j.query.parser.QueryParserUtil; -import org.eclipse.rdf4j.query.parser.sparql.manifest.SPARQL11SyntaxTest; import junit.framework.Test; /** * Checks conformance of SPARQL query parsing against the W3C-approved SPARQL 1.0 test cases - * + * * @author Jeen Broekstra */ public class W3CApprovedSPARQL10SyntaxTest extends SPARQL11SyntaxTest { diff --git a/compliance/sparql/src/test/java/org/eclipse/rdf4j/query/parser/sparql/manifest/W3CApprovedSPARQL11QueryTest.java b/compliance/sparql/src/test/java/org/eclipse/rdf4j/query/parser/sparql/manifest/W3CApprovedSPARQL11QueryTest.java index f2281611d5e..a197fcbedf3 100644 --- a/compliance/sparql/src/test/java/org/eclipse/rdf4j/query/parser/sparql/manifest/W3CApprovedSPARQL11QueryTest.java +++ b/compliance/sparql/src/test/java/org/eclipse/rdf4j/query/parser/sparql/manifest/W3CApprovedSPARQL11QueryTest.java @@ -14,9 +14,11 @@ import org.eclipse.rdf4j.repository.dataset.DatasetRepository; import org.eclipse.rdf4j.repository.sail.SailRepository; import org.eclipse.rdf4j.sail.memory.MemoryStore; +import org.junit.Ignore; import junit.framework.Test; +@Ignore("replaced by org.eclipse.rdf4j.sail.memory.MemorySPARQL11QueryComplianceTest") public class W3CApprovedSPARQL11QueryTest extends SPARQLQueryTest { public static Test suite() throws Exception { diff --git a/compliance/sparql/src/test/java/org/eclipse/rdf4j/query/parser/sparql/manifest/W3CApprovedSPARQL11SyntaxTest.java b/compliance/sparql/src/test/java/org/eclipse/rdf4j/query/parser/sparql/manifest/W3CApprovedSPARQL11SyntaxTest.java index f5637f490c8..027dd1fa9ba 100644 --- a/compliance/sparql/src/test/java/org/eclipse/rdf4j/query/parser/sparql/manifest/W3CApprovedSPARQL11SyntaxTest.java +++ b/compliance/sparql/src/test/java/org/eclipse/rdf4j/query/parser/sparql/manifest/W3CApprovedSPARQL11SyntaxTest.java @@ -11,7 +11,6 @@ import org.eclipse.rdf4j.query.QueryLanguage; import org.eclipse.rdf4j.query.parser.ParsedOperation; import org.eclipse.rdf4j.query.parser.QueryParserUtil; -import org.eclipse.rdf4j.query.parser.sparql.manifest.SPARQL11SyntaxTest; import junit.framework.Test; diff --git a/compliance/sparql/src/test/java/org/eclipse/rdf4j/sail/federation/FedXSPARQL11QueryComplianceTest.java b/compliance/sparql/src/test/java/org/eclipse/rdf4j/sail/federation/FedXSPARQL11QueryComplianceTest.java new file mode 100644 index 00000000000..833fb3ec6f2 --- /dev/null +++ b/compliance/sparql/src/test/java/org/eclipse/rdf4j/sail/federation/FedXSPARQL11QueryComplianceTest.java @@ -0,0 +1,81 @@ +/******************************************************************************* + * Copyright (c) 2020 Eclipse RDF4J contributors. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Distribution License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ +package org.eclipse.rdf4j.sail.federation; + +import java.io.IOException; + +import org.eclipse.rdf4j.federated.FedXFactory; +import org.eclipse.rdf4j.federated.repository.FedXRepository; +import org.eclipse.rdf4j.query.Dataset; +import org.eclipse.rdf4j.query.parser.sparql.manifest.SPARQL11QueryComplianceTest; +import org.eclipse.rdf4j.repository.Repository; +import org.eclipse.rdf4j.repository.RepositoryException; +import org.eclipse.rdf4j.repository.config.RepositoryConfig; +import org.eclipse.rdf4j.repository.config.RepositoryConfigException; +import org.eclipse.rdf4j.repository.config.RepositoryImplConfig; +import org.eclipse.rdf4j.repository.dataset.DatasetRepository; +import org.eclipse.rdf4j.repository.manager.RepositoryManager; +import org.eclipse.rdf4j.repository.manager.RepositoryProvider; +import org.eclipse.rdf4j.repository.sail.config.SailRepositoryConfig; +import org.eclipse.rdf4j.sail.memory.config.MemoryStoreConfig; +import org.junit.Rule; +import org.junit.rules.TemporaryFolder; + +/** + * @author jeen + * + */ +public class FedXSPARQL11QueryComplianceTest extends SPARQL11QueryComplianceTest { + + @Rule + public TemporaryFolder tempFolder = new TemporaryFolder(); + + private static final String dirName = "testmanager"; + + private RepositoryManager manager; + + public FedXSPARQL11QueryComplianceTest(String displayName, String testURI, String name, String queryFileURL, + String resultFileURL, Dataset dataset, boolean ordered) { + super(displayName, testURI, name, queryFileURL, resultFileURL, dataset, ordered); + + // FIXME see https://github.com/eclipse/rdf4j/issues/2173 + addIgnoredTest("sq04 - Subquery within graph pattern, default graph does not apply"); + } + + private void initManager() { + if (manager == null) { + try { + manager = RepositoryProvider.getRepositoryManager(tempFolder.newFolder(dirName)); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + } + + @Override + protected Repository newRepository() throws Exception { + initManager(); + + addMemoryStore("repo1"); + addMemoryStore("repo2"); + FedXRepository repo = FedXFactory.newFederation() + .withResolvableEndpoint("repo1", true) + .withResolvableEndpoint("repo2") + .withRepositoryResolver(manager) + .create(); + + // Use DatasetRepository to handle on-the-fly loading of local datasets, as specified in the test manifest + return new DatasetRepository(repo); + } + + private void addMemoryStore(String repoId) throws RepositoryConfigException, RepositoryException, IOException { + RepositoryImplConfig implConfig = new SailRepositoryConfig(new MemoryStoreConfig()); + RepositoryConfig config = new RepositoryConfig(repoId, implConfig); + manager.addRepositoryConfig(config); + } +} diff --git a/compliance/sparql/src/test/java/org/eclipse/rdf4j/sail/memory/MemoryComplexSPARQLQueryTest.java b/compliance/sparql/src/test/java/org/eclipse/rdf4j/sail/memory/MemoryComplexSPARQLQueryTest.java index f309521dc7c..a96091f7c18 100644 --- a/compliance/sparql/src/test/java/org/eclipse/rdf4j/sail/memory/MemoryComplexSPARQLQueryTest.java +++ b/compliance/sparql/src/test/java/org/eclipse/rdf4j/sail/memory/MemoryComplexSPARQLQueryTest.java @@ -10,7 +10,6 @@ import org.eclipse.rdf4j.query.parser.sparql.ComplexSPARQLQueryTest; import org.eclipse.rdf4j.repository.Repository; import org.eclipse.rdf4j.repository.sail.SailRepository; -import org.eclipse.rdf4j.sail.memory.MemoryStore; /** * @author jeen diff --git a/compliance/sparql/src/test/java/org/eclipse/rdf4j/sail/memory/MemorySPARQL11QueryComplianceTest.java b/compliance/sparql/src/test/java/org/eclipse/rdf4j/sail/memory/MemorySPARQL11QueryComplianceTest.java new file mode 100644 index 00000000000..ec038081e7c --- /dev/null +++ b/compliance/sparql/src/test/java/org/eclipse/rdf4j/sail/memory/MemorySPARQL11QueryComplianceTest.java @@ -0,0 +1,32 @@ +/******************************************************************************* + * Copyright (c) 2020 Eclipse RDF4J contributors. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Distribution License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ +package org.eclipse.rdf4j.sail.memory; + +import org.eclipse.rdf4j.query.Dataset; +import org.eclipse.rdf4j.query.parser.sparql.manifest.SPARQL11QueryComplianceTest; +import org.eclipse.rdf4j.repository.Repository; +import org.eclipse.rdf4j.repository.dataset.DatasetRepository; +import org.eclipse.rdf4j.repository.sail.SailRepository; + +/** + * Run {@link SPARQL11QueryComplianceTest} on an in-memory store + * + * @author Jeen Broekstra + */ +public class MemorySPARQL11QueryComplianceTest extends SPARQL11QueryComplianceTest { + + public MemorySPARQL11QueryComplianceTest(String displayName, String testURI, String name, String queryFileURL, + String resultFileURL, Dataset dataset, boolean ordered) { + super(displayName, testURI, name, queryFileURL, resultFileURL, dataset, ordered); + } + + @Override + protected Repository newRepository() throws Exception { + return new DatasetRepository(new SailRepository(new MemoryStore())); + } +} diff --git a/compliance/sparql/src/test/java/org/eclipse/rdf4j/sail/memory/MemorySPARQLUpdateTest.java b/compliance/sparql/src/test/java/org/eclipse/rdf4j/sail/memory/MemorySPARQLUpdateTest.java index 6a19cc296b4..bf8d3dc308d 100644 --- a/compliance/sparql/src/test/java/org/eclipse/rdf4j/sail/memory/MemorySPARQLUpdateTest.java +++ b/compliance/sparql/src/test/java/org/eclipse/rdf4j/sail/memory/MemorySPARQLUpdateTest.java @@ -10,11 +10,10 @@ import org.eclipse.rdf4j.query.parser.sparql.SPARQLUpdateTest; import org.eclipse.rdf4j.repository.Repository; import org.eclipse.rdf4j.repository.sail.SailRepository; -import org.eclipse.rdf4j.sail.memory.MemoryStore; /** * Test SPARQL 1.1 Update functionality on an in-memory store. - * + * * @author Jeen Broekstra */ public class MemorySPARQLUpdateTest extends SPARQLUpdateTest { diff --git a/compliance/sparql/src/test/java/org/eclipse/rdf4j/sail/nativerdf/NativeComplexSPARQLQueryTest.java b/compliance/sparql/src/test/java/org/eclipse/rdf4j/sail/nativerdf/NativeComplexSPARQLQueryTest.java index de746cc7b2e..b58b43be962 100644 --- a/compliance/sparql/src/test/java/org/eclipse/rdf4j/sail/nativerdf/NativeComplexSPARQLQueryTest.java +++ b/compliance/sparql/src/test/java/org/eclipse/rdf4j/sail/nativerdf/NativeComplexSPARQLQueryTest.java @@ -13,7 +13,6 @@ import org.eclipse.rdf4j.query.parser.sparql.ComplexSPARQLQueryTest; import org.eclipse.rdf4j.repository.Repository; import org.eclipse.rdf4j.repository.sail.SailRepository; -import org.eclipse.rdf4j.sail.nativerdf.NativeStore; /** * @author jeen diff --git a/core/client/pom.xml b/core/client/pom.xml index accfb619ceb..57fa76a9154 100644 --- a/core/client/pom.xml +++ b/core/client/pom.xml @@ -4,7 +4,7 @@ org.eclipse.rdf4j rdf4j-core - 3.1.5-SNAPSHOT + 3.2.2-SNAPSHOT rdf4j-client RDF4J: Client Libraries diff --git a/core/http/client/pom.xml b/core/http/client/pom.xml index b4db03916bf..c3db1e141ba 100644 --- a/core/http/client/pom.xml +++ b/core/http/client/pom.xml @@ -4,7 +4,7 @@ org.eclipse.rdf4j rdf4j-http - 3.1.5-SNAPSHOT + 3.2.2-SNAPSHOT rdf4j-http-client RDF4J: HTTP client @@ -80,6 +80,24 @@ ${project.version} test + + ${project.groupId} + rdf4j-rio-nquads + ${project.version} + test + + + ${project.groupId} + rdf4j-rio-jsonld + ${project.version} + test + + + ${project.groupId} + rdf4j-rio-turtle + ${project.version} + test + diff --git a/core/http/client/src/main/java/org/eclipse/rdf4j/http/client/BackgroundGraphResult.java b/core/http/client/src/main/java/org/eclipse/rdf4j/http/client/BackgroundGraphResult.java index 845cc8e3468..a9d850a6cd6 100644 --- a/core/http/client/src/main/java/org/eclipse/rdf4j/http/client/BackgroundGraphResult.java +++ b/core/http/client/src/main/java/org/eclipse/rdf4j/http/client/BackgroundGraphResult.java @@ -15,14 +15,14 @@ /** * Provides concurrent access to statements as they are being parsed. - * + * * @author James Leigh * @deprecated Use {@link org.eclipse.rdf4j.query.impl.BackgroundGraphResult} instead. */ @Deprecated public class BackgroundGraphResult extends org.eclipse.rdf4j.query.impl.BackgroundGraphResult { public BackgroundGraphResult(RDFParser parser, InputStream in, Charset charset, String baseURI) { - this(new QueueCursor(10), parser, in, charset, baseURI); + this(new QueueCursor<>(10), parser, in, charset, baseURI); } public BackgroundGraphResult(QueueCursor queue, RDFParser parser, InputStream in, Charset charset, diff --git a/core/http/client/src/main/java/org/eclipse/rdf4j/http/client/BackgroundTupleResult.java b/core/http/client/src/main/java/org/eclipse/rdf4j/http/client/BackgroundTupleResult.java index b2ebe51a06c..00b59c387d7 100644 --- a/core/http/client/src/main/java/org/eclipse/rdf4j/http/client/BackgroundTupleResult.java +++ b/core/http/client/src/main/java/org/eclipse/rdf4j/http/client/BackgroundTupleResult.java @@ -14,14 +14,14 @@ /** * Provides concurrent access to tuple results as they are being parsed. - * + * * @author James Leigh * @deprecated Use {@link org.eclipse.rdf4j.query.resultio.helpers.BackgroundTupleResult} instead. */ @Deprecated public class BackgroundTupleResult extends org.eclipse.rdf4j.query.resultio.helpers.BackgroundTupleResult { public BackgroundTupleResult(TupleQueryResultParser parser, InputStream in) { - this(new QueueCursor(10), parser, in); + this(new QueueCursor<>(10), parser, in); } public BackgroundTupleResult(QueueCursor queue, TupleQueryResultParser parser, InputStream in) { diff --git a/core/http/client/src/main/java/org/eclipse/rdf4j/http/client/HttpClientDependent.java b/core/http/client/src/main/java/org/eclipse/rdf4j/http/client/HttpClientDependent.java index e8193603430..29a6160dac7 100644 --- a/core/http/client/src/main/java/org/eclipse/rdf4j/http/client/HttpClientDependent.java +++ b/core/http/client/src/main/java/org/eclipse/rdf4j/http/client/HttpClientDependent.java @@ -11,7 +11,7 @@ /** * Common interface for objects, such as Repository and RepositoryConnection, that are dependent on {@link HttpClient}. - * + * * @author James Leigh */ public interface HttpClientDependent { @@ -20,7 +20,7 @@ public interface HttpClientDependent { * {@link HttpClient} that has been assigned or has been used by this object. The life cycle might not be or might * be tied to this object, depending on whether {@link HttpClient} was passed to or created by this object * respectively. - * + * * @return an {@link HttpClient} instance or null */ HttpClient getHttpClient(); @@ -29,7 +29,7 @@ public interface HttpClientDependent { * Assign an {@link HttpClient} that this object should use. The life cycle of the given {@link HttpClient} is * independent of this object. Closing or shutting down this object does not have any impact on the given client. * Callers must ensure that the given client is properly closed elsewhere. - * + * * @param client */ void setHttpClient(HttpClient client); diff --git a/core/http/client/src/main/java/org/eclipse/rdf4j/http/client/HttpClientSessionManager.java b/core/http/client/src/main/java/org/eclipse/rdf4j/http/client/HttpClientSessionManager.java index 5051ed84f35..d97179f3b05 100644 --- a/core/http/client/src/main/java/org/eclipse/rdf4j/http/client/HttpClientSessionManager.java +++ b/core/http/client/src/main/java/org/eclipse/rdf4j/http/client/HttpClientSessionManager.java @@ -11,7 +11,7 @@ /** * Manager for remote HTTP sessions using a {@link HttpClient}. - * + * * @author James Leigh */ @SuppressWarnings("deprecation") diff --git a/core/http/client/src/main/java/org/eclipse/rdf4j/http/client/QueueCursor.java b/core/http/client/src/main/java/org/eclipse/rdf4j/http/client/QueueCursor.java index 422f89d50de..269fab0d67e 100644 --- a/core/http/client/src/main/java/org/eclipse/rdf4j/http/client/QueueCursor.java +++ b/core/http/client/src/main/java/org/eclipse/rdf4j/http/client/QueueCursor.java @@ -12,7 +12,7 @@ /** * Makes working with a queue easier by adding the methods {@link #done()} and {@link #toss(Exception)} and * automatically converting the exception into a QueryEvaluationException with an appropriate stack trace. - * + * * @author James Leigh * @deprecated Use {@link org.eclipse.rdf4j.query.impl.QueueCursor} instead */ @@ -21,7 +21,7 @@ public class QueueCursor extends org.eclipse.rdf4j.query.impl.QueueCursor /** * Creates an QueueCursor with the given (fixed) capacity and default access policy. - * + * * @param capacity the capacity of this queue */ public QueueCursor(int capacity) { @@ -30,7 +30,7 @@ public QueueCursor(int capacity) { /** * Creates an QueueCursor with the given (fixed) capacity and the specified access policy. - * + * * @param capacity the capacity of this queue * @param fair if true then queue accesses for threads blocked on insertion or removal, are processed * in FIFO order; if false the access order is unspecified. diff --git a/core/http/client/src/main/java/org/eclipse/rdf4j/http/client/RDF4JProtocolSession.java b/core/http/client/src/main/java/org/eclipse/rdf4j/http/client/RDF4JProtocolSession.java index 03d20ce19be..d11080eeb1f 100644 --- a/core/http/client/src/main/java/org/eclipse/rdf4j/http/client/RDF4JProtocolSession.java +++ b/core/http/client/src/main/java/org/eclipse/rdf4j/http/client/RDF4JProtocolSession.java @@ -90,7 +90,7 @@ /** * A {@link SPARQLProtocolSession} subclass which extends the standard SPARQL 1.1 Protocol with additional * functionality, as documented in the RDF4J REST API. - * + * * @author Andreas Schwarte * @author Jeen Broekstra * @see RDF4J REST API @@ -298,7 +298,7 @@ public long size(Resource... contexts) throws IOException, RepositoryException, /** * Create a new repository. - * + * * @param config the repository configuration * @throws IOException * @throws RepositoryException @@ -332,7 +332,7 @@ public void createRepository(RepositoryConfig config) throws IOException, Reposi /** * Update the config of an existing repository. - * + * * @param config the repository configuration * @throws IOException * @throws RepositoryException @@ -389,7 +389,7 @@ public void deleteRepository(String repositoryID) throws IOException, Repository * @throws RDFHandlerException * @throws QueryInterruptedException * @throws UnauthorizedException - * + * * @since 3.1.0 */ public void getRepositoryConfig(StatementCollector statementCollector) throws UnauthorizedException, @@ -758,7 +758,7 @@ void executeTransactionPing() { /** * Appends the action as a parameter to the supplied url - * + * * @param url a url on which to append the parameter. it is assumed the url has no parameters. * @param action the action to add as a parameter * @return the url parametrized with the supplied action @@ -769,7 +769,7 @@ private String appendAction(String url, Action action) { /** * Sends a transaction list as serialized XML to the server. - * + * * @deprecated since 2.8.0 * @param txn * @throws IOException diff --git a/core/http/client/src/main/java/org/eclipse/rdf4j/http/client/SPARQLProtocolSession.java b/core/http/client/src/main/java/org/eclipse/rdf4j/http/client/SPARQLProtocolSession.java index c109458c24c..cf4ba06eb97 100644 --- a/core/http/client/src/main/java/org/eclipse/rdf4j/http/client/SPARQLProtocolSession.java +++ b/core/http/client/src/main/java/org/eclipse/rdf4j/http/client/SPARQLProtocolSession.java @@ -10,18 +10,24 @@ import static org.eclipse.rdf4j.http.protocol.Protocol.ACCEPT_PARAM_NAME; import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.io.StringReader; import java.net.HttpURLConnection; import java.net.URISyntaxException; import java.nio.charset.Charset; import java.nio.charset.IllegalCharsetNameException; import java.nio.charset.StandardCharsets; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collections; import java.util.List; import java.util.Map; +import java.util.Optional; import java.util.Set; import java.util.concurrent.ExecutorService; +import org.apache.commons.io.IOUtils; import org.apache.http.Header; import org.apache.http.HeaderElement; import org.apache.http.HttpEntity; @@ -52,6 +58,7 @@ import org.apache.http.util.EntityUtils; import org.eclipse.rdf4j.RDF4JConfigException; import org.eclipse.rdf4j.RDF4JException; +import org.eclipse.rdf4j.http.client.shacl.RemoteShaclValidationException; import org.eclipse.rdf4j.http.protocol.Protocol; import org.eclipse.rdf4j.http.protocol.UnauthorizedException; import org.eclipse.rdf4j.http.protocol.error.ErrorInfo; @@ -80,6 +87,7 @@ import org.eclipse.rdf4j.query.resultio.TupleQueryResultFormat; import org.eclipse.rdf4j.query.resultio.TupleQueryResultParser; import org.eclipse.rdf4j.query.resultio.TupleQueryResultParserRegistry; +import org.eclipse.rdf4j.query.resultio.TupleQueryResultWriter; import org.eclipse.rdf4j.query.resultio.helpers.BackgroundTupleResult; import org.eclipse.rdf4j.query.resultio.helpers.QueryResultCollector; import org.eclipse.rdf4j.repository.RepositoryException; @@ -90,6 +98,7 @@ import org.eclipse.rdf4j.rio.RDFParseException; import org.eclipse.rdf4j.rio.RDFParser; import org.eclipse.rdf4j.rio.RDFParserRegistry; +import org.eclipse.rdf4j.rio.RDFWriter; import org.eclipse.rdf4j.rio.Rio; import org.eclipse.rdf4j.rio.UnsupportedRDFormatException; import org.eclipse.rdf4j.rio.helpers.BasicParserSettings; @@ -108,7 +117,7 @@ *

* Functionality specific to the RDF4J HTTP protocol can be found in {@link RDF4JProtocolSession} (which is used by * HTTPRepository). - * + * * @author Herko ter Horst * @author Arjohn Kampman * @author Andreas Schwarte @@ -148,7 +157,7 @@ public class SPARQLProtocolSession implements HttpClientDependent, AutoCloseable */ private final int maximumUrlLength; - final Logger logger = LoggerFactory.getLogger(SPARQLProtocolSession.class); + final static Logger logger = LoggerFactory.getLogger(SPARQLProtocolSession.class); /*-----------* * Variables * @@ -245,7 +254,7 @@ protected void setUpdateURL(String updateURL) { /** * Sets the preferred format for encoding tuple query results. The {@link TupleQueryResultFormat#BINARY binary} * format is preferred by default. - * + * * @param format The preferred {@link TupleQueryResultFormat}, or null to indicate no specific format is * preferred. */ @@ -255,7 +264,7 @@ public void setPreferredTupleQueryResultFormat(TupleQueryResultFormat format) { /** * Gets the preferred {@link TupleQueryResultFormat} for encoding tuple query results. - * + * * @return The preferred format, of null if no specific format is preferred. */ public TupleQueryResultFormat getPreferredTupleQueryResultFormat() { @@ -265,7 +274,7 @@ public TupleQueryResultFormat getPreferredTupleQueryResultFormat() { /** * Sets the preferred format for encoding RDF documents. The {@link RDFFormat#TURTLE Turtle} format is preferred by * default. - * + * * @param format The preferred {@link RDFFormat}, or null to indicate no specific format is preferred. */ public void setPreferredRDFFormat(RDFFormat format) { @@ -274,7 +283,7 @@ public void setPreferredRDFFormat(RDFFormat format) { /** * Gets the preferred {@link RDFFormat} for encoding RDF documents. - * + * * @return The preferred format, of null if no specific format is preferred. */ public RDFFormat getPreferredRDFFormat() { @@ -284,7 +293,7 @@ public RDFFormat getPreferredRDFFormat() { /** * Sets the preferred format for encoding boolean query results. The {@link BooleanQueryResultFormat#TEXT binary} * format is preferred by default. - * + * * @param format The preferred {@link BooleanQueryResultFormat}, or null to indicate no specific format is * preferred. */ @@ -294,7 +303,7 @@ public void setPreferredBooleanQueryResultFormat(BooleanQueryResultFormat format /** * Gets the preferred {@link BooleanQueryResultFormat} for encoding boolean query results. - * + * * @return The preferred format, of null if no specific format is preferred. */ public BooleanQueryResultFormat getPreferredBooleanQueryResultFormat() { @@ -303,7 +312,7 @@ public BooleanQueryResultFormat getPreferredBooleanQueryResultFormat() { /** * Set the username and password for authentication with the remote server. - * + * * @param username the username * @param password the password */ @@ -445,7 +454,7 @@ public boolean sendBooleanQuery(QueryLanguage ql, String query, String baseURI, /** * Get the additional HTTP headers which will be used - * + * * @return a read-only view of the additional HTTP headers which will be included in every request to the server. */ public Map getAdditionalHttpHeaders() { @@ -455,7 +464,7 @@ public Map getAdditionalHttpHeaders() { /** * Set additional HTTP headers to be included in every request to the server, which may be required for certain * unusual server configurations. - * + * * @param additionalHttpHeaders a map containing pairs of header names and values. May be null */ public void setAdditionalHttpHeaders(Map additionalHttpHeaders) { @@ -474,8 +483,9 @@ protected HttpUriRequest getQueryMethod(QueryLanguage ql, String query, String b String queryUrlWithParams; try { URIBuilder urib = new URIBuilder(getQueryURL()); - for (NameValuePair nvp : queryParams) + for (NameValuePair nvp : queryParams) { urib.addParameter(nvp.getName(), nvp.getValue()); + } queryUrlWithParams = urib.toString(); } catch (URISyntaxException e) { throw new AssertionError(e); @@ -501,7 +511,7 @@ protected HttpUriRequest getQueryMethod(QueryLanguage ql, String query, String b /** * Return whether the provided query should use POST (otherwise use GET) - * + * * @param fullQueryUrl the complete URL, including hostname and all HTTP query parameters */ protected boolean shouldUsePost(String fullQueryUrl) { @@ -525,8 +535,9 @@ protected HttpUriRequest getUpdateMethod(QueryLanguage ql, String update, String method.setEntity(new UrlEncodedFormEntity(queryParams, UTF8)); if (this.additionalHttpHeaders != null) { - for (Map.Entry additionalHeader : additionalHttpHeaders.entrySet()) + for (Map.Entry additionalHeader : additionalHttpHeaders.entrySet()) { method.addHeader(additionalHeader.getKey(), additionalHeader.getValue()); + } } return method; @@ -688,6 +699,21 @@ protected void getTupleQueryResult(HttpUriRequest method, TupleQueryResultHandle QueryResultFormat format = TupleQueryResultFormat.matchMIMEType(mimeType, tqrFormats) .orElseThrow(() -> new RepositoryException( "Server responded with an unsupported file format: " + mimeType)); + + // Check if we can pass through to the output stream directly + if (handler instanceof TupleQueryResultWriter) { + TupleQueryResultWriter tqrWriter = (TupleQueryResultWriter) handler; + if (tqrWriter.getTupleQueryResultFormat().equals(format)) { + OutputStream out = tqrWriter.getOutputStream().orElse(null); + if (out != null) { + InputStream in = response.getEntity().getContent(); + IOUtils.copy(in, out); + return; + } + } + } + + // we need to parse the result and re-serialize. TupleQueryResultParser parser = QueryResultIO.createTupleParser(format, getValueFactory()); parser.setQueryResultHandler(handler); parser.parseQueryResult(response.getEntity().getContent()); @@ -709,7 +735,7 @@ protected void getTupleQueryResult(HttpUriRequest method, TupleQueryResultHandle * Send the tuple query via HTTP and throws an exception in case anything goes wrong, i.e. only for HTTP 200 the * method returns without exception. If HTTP status code is not equal to 200, the request is aborted, however pooled * connections are not released. - * + * * @param method * @throws RepositoryException * @throws HttpException @@ -842,6 +868,20 @@ protected void getRDF(HttpUriRequest method, RDFHandler handler, boolean require RDFFormat format = RDFFormat.matchMIMEType(mimeType, rdfFormats) .orElseThrow(() -> new RepositoryException( "Server responded with an unsupported file format: " + mimeType)); + // Check if we can pass through to the output stream directly + if (handler instanceof RDFWriter) { + RDFWriter rdfWriter = (RDFWriter) handler; + if (rdfWriter.getRDFFormat().equals(format)) { + OutputStream out = rdfWriter.getOutputStream().orElse(null); + if (out != null) { + InputStream in = response.getEntity().getContent(); + IOUtils.copy(in, out); + return; + } + } + } + + // we need to parse the result and re-serialize. RDFParser parser = Rio.createParser(format, getValueFactory()); parser.setParserConfig(getParserConfig()); parser.setParseErrorListener(new ParseErrorLogger()); @@ -874,7 +914,7 @@ private HttpResponse sendGraphQueryViaHttp(HttpUriRequest method, boolean requir /** * Parse the response in this thread using a suitable {@link BooleanQueryResultParser}. All HTTP connections are * closed and released in this method - * + * * @throws RDF4JException */ protected boolean getBoolean(HttpUriRequest method) throws IOException, RDF4JException { @@ -941,7 +981,7 @@ private HttpResponse sendBooleanQueryViaHttp(HttpUriRequest method, Set 0) { throw new RepositoryException(errInfo.toString()); } else { @@ -1021,6 +1066,63 @@ protected HttpResponse execute(HttpUriRequest method) throws IOException, RDF4JE } } + static RDFFormat getContentTypeSerialisation(HttpResponse response) { + Header[] headers = response.getHeaders("Content-Type"); + + Set rdfFormats = RDFParserRegistry.getInstance().getKeys(); + if (rdfFormats.isEmpty()) { + throw new RepositoryException("No tuple RDF parsers have been registered"); + } + + for (Header header : headers) { + for (HeaderElement element : header.getElements()) { + // SHACL Validation report Content-Type gets transformed from: + // application/shacl-validation-report+n-quads => application/n-quads + // application/shacl-validation-report+ld+json => application/ld+json + // text/shacl-validation-report+turtle => text/turtle + + String[] split = element.getName().split("\\+"); + StringBuilder serialisation = new StringBuilder(element.getName().split("/")[0] + "/"); + for (int i = 1; i < split.length; i++) { + serialisation.append(split[i]); + if (i + 1 < split.length) { + serialisation.append("+"); + } + } + + logger.debug("SHACL validation report is serialised as: " + serialisation.toString()); + + Optional rdfFormat = RDFFormat.matchMIMEType(serialisation.toString(), rdfFormats); + + if (rdfFormat.isPresent()) { + return rdfFormat.get(); + } + } + } + + throw new RepositoryException("Unsupported content-type for SHACL Validation Report: " + + Arrays.toString(response.getHeaders("Content-Type"))); + + } + + private static boolean contentTypeIs(HttpResponse response, String contentType) { + Header[] headers = response.getHeaders("Content-Type"); + if (headers.length == 0) { + return false; + } + + for (Header header : headers) { + for (HeaderElement element : header.getElements()) { + String name = element.getName().split("\\+")[0]; + if (contentType.equals(name)) { + return true; + } + } + } + + return false; + } + /*-------------------------* * General utility methods * *-------------------------*/ @@ -1029,7 +1131,7 @@ protected HttpResponse execute(HttpUriRequest method) throws IOException, RDF4JE * Gets the MIME type specified in the response headers of the supplied method, if any. For example, if the response * headers contain Content-Type: application/xml;charset=UTF-8, this method will return * application/xml as the MIME type. - * + * * @param method The method to get the reponse MIME type from. * @return The response MIME type, or null if not available. */ @@ -1042,7 +1144,7 @@ protected String getResponseMIMEType(HttpResponse method) throws IOException { for (HeaderElement headerEl : headerElements) { String mimeType = headerEl.getName(); if (mimeType != null) { - logger.debug("reponse MIME type is {}", mimeType); + logger.debug("response MIME type is {}", mimeType); return mimeType; } } @@ -1064,7 +1166,7 @@ protected ErrorInfo getErrorInfo(HttpResponse response) throws RepositoryExcepti /** * Sets the parser configuration used to process HTTP response data. - * + * * @param parserConfig The parserConfig to set. */ public void setParserConfig(ParserConfig parserConfig) { @@ -1085,12 +1187,12 @@ public long getConnectionTimeout() { if (params == null) { return 0; } - return (long) params.getIntParameter(CoreConnectionPNames.SO_TIMEOUT, 0); + return params.getIntParameter(CoreConnectionPNames.SO_TIMEOUT, 0); } /** * Sets the http connection read timeout. - * + * * @param timeout timeout in milliseconds. Zero sets to infinity. */ public void setConnectionTimeout(long timeout) { diff --git a/core/http/client/src/main/java/org/eclipse/rdf4j/http/client/SesameClientDependent.java b/core/http/client/src/main/java/org/eclipse/rdf4j/http/client/SesameClientDependent.java index b8a6569e038..0b409eafe1a 100644 --- a/core/http/client/src/main/java/org/eclipse/rdf4j/http/client/SesameClientDependent.java +++ b/core/http/client/src/main/java/org/eclipse/rdf4j/http/client/SesameClientDependent.java @@ -18,7 +18,7 @@ public interface SesameClientDependent { * {@link HttpClientSessionManager} that has been assigned or has been used by this object. The life cycle might not * be or might be tied to this object, depending on whether {@link HttpClientSessionManager} was passed to or * created by this object respectively. - * + * * @return a {@link HttpClientSessionManager} instance or null */ HttpClientSessionManager getHttpClientSessionManager(); @@ -35,7 +35,7 @@ default HttpClientSessionManager getSesameClient() { * Assign an {@link HttpClientSessionManager} that this object should use. The life cycle of the given * {@link HttpClientSessionManager} is independent of this object. Closing or shutting down this object does not * have any impact on the given client. Callers must ensure that the given client is properly closed elsewhere. - * + * * @param client */ void setHttpClientSessionManager(HttpClientSessionManager client); diff --git a/core/http/client/src/main/java/org/eclipse/rdf4j/http/client/SessionManagerDependent.java b/core/http/client/src/main/java/org/eclipse/rdf4j/http/client/SessionManagerDependent.java index a5bbad7a520..190f34def0a 100644 --- a/core/http/client/src/main/java/org/eclipse/rdf4j/http/client/SessionManagerDependent.java +++ b/core/http/client/src/main/java/org/eclipse/rdf4j/http/client/SessionManagerDependent.java @@ -10,7 +10,7 @@ /** * Common interface for objects, such as Repository and RepositoryConnection, that are dependent on * {@link HttpClientSessionManager}. - * + * * @author James Leigh */ @SuppressWarnings("deprecation") @@ -20,7 +20,7 @@ public interface SessionManagerDependent extends SesameClientDependent { * {@link HttpClientSessionManager} that has been assigned or has been used by this object. The life cycle might not * be or might be tied to this object, depending on whether {@link HttpClientSessionManager} was passed to or * created by this object respectively. - * + * * @return a {@link HttpClientSessionManager} instance or null */ @Override @@ -30,7 +30,7 @@ public interface SessionManagerDependent extends SesameClientDependent { * Assign an {@link HttpClientSessionManager} that this object should use. The life cycle of the given * {@link HttpClientSessionManager} is independent of this object. Closing or shutting down this object does not * have any impact on the given client. Callers must ensure that the given client is properly closed elsewhere. - * + * * @param client */ @Override diff --git a/core/http/client/src/main/java/org/eclipse/rdf4j/http/client/SharedHttpClientSessionManager.java b/core/http/client/src/main/java/org/eclipse/rdf4j/http/client/SharedHttpClientSessionManager.java index 09cbcf23f60..cedf5fbd32f 100644 --- a/core/http/client/src/main/java/org/eclipse/rdf4j/http/client/SharedHttpClientSessionManager.java +++ b/core/http/client/src/main/java/org/eclipse/rdf4j/http/client/SharedHttpClientSessionManager.java @@ -28,18 +28,15 @@ /** * A Manager for HTTP sessions that uses a shared {@link HttpClient} to manage HTTP connections. - * + * * @author James Leigh */ public class SharedHttpClientSessionManager implements HttpClientSessionManager, HttpClientDependent { /** - * FIXME: issue #1271, workaround for OpenJDK 8 bug. ScheduledThreadPoolExecutor with 0 core threads may cause 100% - * CPU usage. Using 1 core thread instead of 0 (default) fixes the problem but wastes some resources. - * - * @see JDK-8129861 + * Configurable system property {@code org.eclipse.rdf4j.client.executors.corePoolSize} for specifying the + * background executor core thread pool size. */ - private static final int cores = (System.getProperty("org.eclipse.rdf4j.client.executors.jdkbug") != null) ? 1 : 0; - /**/ + public static final String CORE_POOL_SIZE_PROPERTY = "org.eclipse.rdf4j.client.executors.corePoolSize"; private static final AtomicLong threadCount = new AtomicLong(); @@ -66,7 +63,8 @@ public class SharedHttpClientSessionManager implements HttpClientSessionManager, public SharedHttpClientSessionManager() { final ThreadFactory backingThreadFactory = Executors.defaultThreadFactory(); - this.executor = Executors.newScheduledThreadPool(cores, (Runnable runnable) -> { + final int corePoolSize = Integer.getInteger(CORE_POOL_SIZE_PROPERTY, 1); + this.executor = Executors.newScheduledThreadPool(corePoolSize, (Runnable runnable) -> { Thread thread = backingThreadFactory.newThread(runnable); thread.setName(String.format("rdf4j-sesameclientimpl-%d", threadCount.getAndIncrement())); thread.setDaemon(true); @@ -207,7 +205,7 @@ public void shutDown() { /** * No-op - * + * * @deprecated Create a new instance instead of trying to reactivate an old instance. */ @Deprecated diff --git a/core/http/client/src/main/java/org/eclipse/rdf4j/http/client/query/AbstractHTTPQuery.java b/core/http/client/src/main/java/org/eclipse/rdf4j/http/client/query/AbstractHTTPQuery.java index 4c9ceb1363d..9c6b8f654ad 100644 --- a/core/http/client/src/main/java/org/eclipse/rdf4j/http/client/query/AbstractHTTPQuery.java +++ b/core/http/client/src/main/java/org/eclipse/rdf4j/http/client/query/AbstractHTTPQuery.java @@ -18,7 +18,7 @@ /** * Base class for any {@link Query} operation over HTTP. - * + * * @author Andreas Schwarte */ public abstract class AbstractHTTPQuery extends AbstractQuery { @@ -65,8 +65,8 @@ public Binding[] getBindingsArray() { } @Override - public void setMaxExecutionTime(int maxExecutionTime) { - super.setMaxExecutionTime(maxExecutionTime); + public void setMaxExecutionTime(int maxExecutionTimeSeconds) { + super.setMaxExecutionTime(maxExecutionTimeSeconds); this.httpClient.setConnectionTimeout(1000L * this.getMaxExecutionTime()); } diff --git a/core/http/client/src/main/java/org/eclipse/rdf4j/http/client/query/AbstractHTTPUpdate.java b/core/http/client/src/main/java/org/eclipse/rdf4j/http/client/query/AbstractHTTPUpdate.java index 6df08ee4684..da3e592428d 100644 --- a/core/http/client/src/main/java/org/eclipse/rdf4j/http/client/query/AbstractHTTPUpdate.java +++ b/core/http/client/src/main/java/org/eclipse/rdf4j/http/client/query/AbstractHTTPUpdate.java @@ -18,7 +18,7 @@ /** * Base class for any {@link Update} operation over HTTP. - * + * * @author Andreas Schwarte */ public abstract class AbstractHTTPUpdate extends AbstractUpdate { diff --git a/core/http/client/src/main/java/org/eclipse/rdf4j/http/client/shacl/RemoteShaclValidationException.java b/core/http/client/src/main/java/org/eclipse/rdf4j/http/client/shacl/RemoteShaclValidationException.java new file mode 100644 index 00000000000..e04108eb8f7 --- /dev/null +++ b/core/http/client/src/main/java/org/eclipse/rdf4j/http/client/shacl/RemoteShaclValidationException.java @@ -0,0 +1,43 @@ +/******************************************************************************* + * Copyright (c) 2020 Eclipse RDF4J contributors. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Distribution License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ + +package org.eclipse.rdf4j.http.client.shacl; + +import java.io.StringReader; + +import org.eclipse.rdf4j.RDF4JException; +import org.eclipse.rdf4j.common.annotation.Experimental; +import org.eclipse.rdf4j.exceptions.ValidationException; +import org.eclipse.rdf4j.model.Model; +import org.eclipse.rdf4j.model.vocabulary.SHACL; +import org.eclipse.rdf4j.rio.RDFFormat; + +/** + * Experimental support for handling SHACL violations against a remote RDF4J server. + */ +@Experimental +public class RemoteShaclValidationException extends RDF4JException implements ValidationException { + + private final RemoteValidation remoteValidation; + + public RemoteShaclValidationException(StringReader stringReader, String s, RDFFormat format) { + remoteValidation = new RemoteValidation(stringReader, s, format); + } + + /** + * @return A Model containing the validation report as specified by the SHACL Recommendation + */ + @Override + public Model validationReportAsModel() { + Model model = remoteValidation.asModel(); + model.setNamespace(SHACL.PREFIX, SHACL.NAMESPACE); + return model; + + } + +} diff --git a/core/http/client/src/main/java/org/eclipse/rdf4j/http/client/shacl/RemoteValidation.java b/core/http/client/src/main/java/org/eclipse/rdf4j/http/client/shacl/RemoteValidation.java new file mode 100644 index 00000000000..2fb431516e3 --- /dev/null +++ b/core/http/client/src/main/java/org/eclipse/rdf4j/http/client/shacl/RemoteValidation.java @@ -0,0 +1,46 @@ +/******************************************************************************* + * Copyright (c) 2020 Eclipse RDF4J contributors. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Distribution License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ + +package org.eclipse.rdf4j.http.client.shacl; + +import java.io.IOException; +import java.io.StringReader; + +import org.eclipse.rdf4j.common.annotation.InternalUseOnly; +import org.eclipse.rdf4j.model.Model; +import org.eclipse.rdf4j.rio.RDFFormat; +import org.eclipse.rdf4j.rio.Rio; + +@InternalUseOnly +class RemoteValidation { + + StringReader stringReader; + String baseUri; + RDFFormat format; + + Model model; + + RemoteValidation(StringReader stringReader, String baseUri, RDFFormat format) { + this.stringReader = stringReader; + this.baseUri = baseUri; + this.format = format; + } + + Model asModel() { + if (model == null) { + try { + model = Rio.parse(stringReader, baseUri, format); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + return model; + } + +} diff --git a/core/http/client/src/main/java/org/eclipse/rdf4j/http/client/util/HttpClientBuilders.java b/core/http/client/src/main/java/org/eclipse/rdf4j/http/client/util/HttpClientBuilders.java index 91dee10ffc1..b907c390d11 100644 --- a/core/http/client/src/main/java/org/eclipse/rdf4j/http/client/util/HttpClientBuilders.java +++ b/core/http/client/src/main/java/org/eclipse/rdf4j/http/client/util/HttpClientBuilders.java @@ -7,7 +7,6 @@ *******************************************************************************/ package org.eclipse.rdf4j.http.client.util; -import java.security.cert.CertificateException; import java.security.cert.X509Certificate; import javax.net.ssl.HostnameVerifier; @@ -18,12 +17,11 @@ import org.apache.http.impl.client.HttpClientBuilder; import org.apache.http.impl.client.HttpClients; import org.apache.http.ssl.SSLContextBuilder; -import org.apache.http.ssl.TrustStrategy; import org.eclipse.rdf4j.http.client.HttpClientDependent; /** * Convenience utility class offering helper methods to configure {@link HttpClient}s and {@link HttpClientBuilders}. - * + * * @author Andreas Schwarte * @see HttpClientDependent */ @@ -32,7 +30,7 @@ public class HttpClientBuilders { /** * Return an {@link HttpClientBuilder} that can be used to build an {@link HttpClient} which trusts all certificates * (particularly including self-signed certificates). - * + * * @return a {@link HttpClientBuilder} for SSL trust all */ public static HttpClientBuilder getSSLTrustAllHttpClientBuilder() { diff --git a/core/http/client/src/test/java/org/eclipse/rdf4j/http/client/RDF4JProtocolSessionTest.java b/core/http/client/src/test/java/org/eclipse/rdf4j/http/client/RDF4JProtocolSessionTest.java index ca3ab20c674..d0c86447af2 100644 --- a/core/http/client/src/test/java/org/eclipse/rdf4j/http/client/RDF4JProtocolSessionTest.java +++ b/core/http/client/src/test/java/org/eclipse/rdf4j/http/client/RDF4JProtocolSessionTest.java @@ -25,10 +25,20 @@ import static org.assertj.core.api.Assertions.assertThat; import java.util.HashMap; +import java.util.Locale; import org.apache.http.Header; +import org.apache.http.HeaderElement; +import org.apache.http.HeaderIterator; +import org.apache.http.HttpEntity; +import org.apache.http.HttpResponse; +import org.apache.http.NameValuePair; +import org.apache.http.ParseException; +import org.apache.http.ProtocolVersion; +import org.apache.http.StatusLine; import org.apache.http.client.methods.HttpGet; import org.apache.http.message.BasicHeader; +import org.apache.http.params.HttpParams; import org.eclipse.rdf4j.IsolationLevels; import org.eclipse.rdf4j.http.protocol.Protocol; import org.eclipse.rdf4j.query.resultio.TupleQueryResultFormat; @@ -154,6 +164,220 @@ public void testClose() throws Exception { postRequestedFor(urlEqualTo("/rdf4j-server/repositories/test/transactions/1?action=PING"))); } + @Test + public void getContentTypeSerialisationTest() { + + { + HttpResponse httpResponse = withContentType("application/shacl-validation-report+n-quads"); + RDFFormat format = SPARQLProtocolSession.getContentTypeSerialisation(httpResponse); + + assertThat(format).isEqualTo(RDFFormat.NQUADS); + } + + { + HttpResponse httpResponse = withContentType("application/shacl-validation-report+ld+json"); + RDFFormat format = SPARQLProtocolSession.getContentTypeSerialisation(httpResponse); + + assertThat(format).isEqualTo(RDFFormat.JSONLD); + } + + { + HttpResponse httpResponse = withContentType("text/shacl-validation-report+turtle"); + RDFFormat format = SPARQLProtocolSession.getContentTypeSerialisation(httpResponse); + + assertThat(format).isEqualTo(RDFFormat.TURTLE); + } + } + + private HttpResponse withContentType(String contentType) { + Header header = new Header() { + @Override + public String getName() { + return null; + } + + @Override + public String getValue() { + return null; + } + + @Override + public HeaderElement[] getElements() throws ParseException { + + HeaderElement[] elements = { new HeaderElement() { + @Override + public String getName() { + return contentType; + } + + @Override + public String getValue() { + return null; + } + + @Override + public NameValuePair[] getParameters() { + return new NameValuePair[0]; + } + + @Override + public NameValuePair getParameterByName(String name) { + return null; + } + + @Override + public int getParameterCount() { + return 0; + } + + @Override + public NameValuePair getParameter(int index) { + return null; + } + } }; + return elements; + } + }; + + return new HttpResponse() { + @Override + public ProtocolVersion getProtocolVersion() { + return null; + } + + @Override + public boolean containsHeader(String name) { + return false; + } + + @Override + public Header[] getHeaders(String name) { + Header[] headers = { header }; + return headers; + } + + @Override + public Header getFirstHeader(String name) { + return null; + } + + @Override + public Header getLastHeader(String name) { + return null; + } + + @Override + public Header[] getAllHeaders() { + return new Header[0]; + } + + @Override + public void addHeader(Header header1) { + + } + + @Override + public void addHeader(String name, String value) { + + } + + @Override + public void setHeader(Header header1) { + + } + + @Override + public void setHeader(String name, String value) { + + } + + @Override + public void setHeaders(Header[] headers) { + + } + + @Override + public void removeHeader(Header header1) { + + } + + @Override + public void removeHeaders(String name) { + + } + + @Override + public HeaderIterator headerIterator() { + return null; + } + + @Override + public HeaderIterator headerIterator(String name) { + return null; + } + + @Override + public HttpParams getParams() { + return null; + } + + @Override + public void setParams(HttpParams params) { + + } + + @Override + public StatusLine getStatusLine() { + return null; + } + + @Override + public void setStatusLine(StatusLine statusline) { + + } + + @Override + public void setStatusLine(ProtocolVersion ver, int code) { + + } + + @Override + public void setStatusLine(ProtocolVersion ver, int code, String reason) { + + } + + @Override + public void setStatusCode(int code) throws IllegalStateException { + + } + + @Override + public void setReasonPhrase(String reason) throws IllegalStateException { + + } + + @Override + public HttpEntity getEntity() { + return null; + } + + @Override + public void setEntity(HttpEntity entity) { + + } + + @Override + public Locale getLocale() { + return null; + } + + @Override + public void setLocale(Locale loc) { + + } + }; + } + private void verifyHeader(String path) { verify(anyRequestedFor(urlEqualTo(path)).withHeader(testHeader, containing(testValue))); } diff --git a/core/http/pom.xml b/core/http/pom.xml index b4f863434bc..54cc94a9aca 100644 --- a/core/http/pom.xml +++ b/core/http/pom.xml @@ -4,7 +4,7 @@ org.eclipse.rdf4j rdf4j-core - 3.1.5-SNAPSHOT + 3.2.2-SNAPSHOT rdf4j-http pom diff --git a/core/http/protocol/pom.xml b/core/http/protocol/pom.xml index ba2e6358478..fcb780914c8 100644 --- a/core/http/protocol/pom.xml +++ b/core/http/protocol/pom.xml @@ -4,7 +4,7 @@ org.eclipse.rdf4j rdf4j-http - 3.1.5-SNAPSHOT + 3.2.2-SNAPSHOT rdf4j-http-protocol RDF4J: HTTP protocol diff --git a/core/http/protocol/src/main/java/org/eclipse/rdf4j/http/protocol/Protocol.java b/core/http/protocol/src/main/java/org/eclipse/rdf4j/http/protocol/Protocol.java index 795ced003b2..d0b134ae263 100644 --- a/core/http/protocol/src/main/java/org/eclipse/rdf4j/http/protocol/Protocol.java +++ b/core/http/protocol/src/main/java/org/eclipse/rdf4j/http/protocol/Protocol.java @@ -8,12 +8,12 @@ package org.eclipse.rdf4j.http.protocol; import org.eclipse.rdf4j.OpenRDFUtil; -import org.eclipse.rdf4j.model.BNode; import org.eclipse.rdf4j.model.IRI; import org.eclipse.rdf4j.model.Resource; +import org.eclipse.rdf4j.model.Triple; import org.eclipse.rdf4j.model.Value; import org.eclipse.rdf4j.model.ValueFactory; -import org.eclipse.rdf4j.rio.ntriples.NTriplesUtil; +import org.eclipse.rdf4j.rio.helpers.NTriplesUtil; public abstract class Protocol { @@ -76,7 +76,7 @@ public static enum TIMEOUT { /** * Protocol version. - * + * *

    *
  • 10: since RDF4J 3.1.0
  • *
  • 9: since RDF4J 3.0.0
  • @@ -275,7 +275,7 @@ private static String getServerDir(String serverLocation) { /** * Get the location of the protocol resource on the specified server. - * + * * @param serverLocation the base location of a server implementing this REST protocol. * @return the location of the protocol resource on the specified server */ @@ -285,7 +285,7 @@ public static final String getProtocolLocation(String serverLocation) { /** * Get the location of the server configuration resource on the specified server. - * + * * @param serverLocation the base location of a server implementing this REST protocol. * @return the location of the server configuration resource on the specified server */ @@ -295,7 +295,7 @@ public static final String getConfigLocation(String serverLocation) { /** * Get the location of the repository list resource on the specified server. - * + * * @param serverLocation the base location of a server implementing this REST protocol. * @return the location of the repository list resource on the specified server */ @@ -305,7 +305,7 @@ public static final String getRepositoriesLocation(String serverLocation) { /** * Get the location of a specific repository resource on the specified server. - * + * * @param serverLocation the base location of a server implementing this REST protocol. * @param repositoryID the ID of the repository * @return the location of a specific repository resource on the specified server @@ -316,10 +316,10 @@ public static final String getRepositoryLocation(String serverLocation, String r /** * Get the location of the config of a specific repository resource. - * + * * @param repositoryLocation the location of a repository implementing this REST protocol. * @return the location of the configuration resource for the specified repository - * + * */ public static final String getRepositoryConfigLocation(String repositoryLocation) { return repositoryLocation + "/" + CONFIG; @@ -327,7 +327,7 @@ public static final String getRepositoryConfigLocation(String repositoryLocation /** * Get the location of the statements resource for a specific repository. - * + * * @param repositoryLocation the location of a repository implementing this REST protocol. * @return the location of the statements resource for the specified repository */ @@ -337,7 +337,7 @@ public static final String getStatementsLocation(String repositoryLocation) { /** * Get the location of the transaction resources for a specific repository. - * + * * @param repositoryLocation the location of a repository implementing this REST protocol. * @return the location of the transaction resources for the specified repository */ @@ -347,7 +347,7 @@ public static final String getTransactionsLocation(String repositoryLocation) { /** * Extracts the server location from the repository location. - * + * * @param repositoryLocation the location of a repository implementing this REST protocol. * @return the location of the server resource for the specified repository. */ @@ -359,7 +359,7 @@ public static final String getServerLocation(String repositoryLocation) { /** * Extracts the repository ID from the repository location. - * + * * @param repositoryLocation the location of a repository implementing this REST protocol. * @return the ID of the repository. */ @@ -370,7 +370,7 @@ public static final String getRepositoryID(String repositoryLocation) { /** * Get the location of the contexts lists resource for a specific repository. - * + * * @param repositoryLocation the location of a repository implementing this REST protocol. * @return the location of the contexts lists resource for the specified repository */ @@ -380,7 +380,7 @@ public static final String getContextsLocation(String repositoryLocation) { /** * Get the location of the namespaces lists resource for a specific repository on the specified server. - * + * * @param repositoryLocation the base location of a server implementing this REST protocol. * @return the location of the namespaces lists resource for a specific repository on the specified server */ @@ -390,7 +390,7 @@ public static final String getNamespacesLocation(String repositoryLocation) { /** * Get the location of the namespace with the specified prefix for a specific repository on the specified server. - * + * * @param repositoryLocation the location of a repository implementing this REST protocol. * @param prefix the namespace prefix * @return the location of the the namespace with the specified prefix for a specific repository on the specified @@ -402,7 +402,7 @@ public static final String getNamespacePrefixLocation(String repositoryLocation, /** * Get the location of the 'size' resource for a specific repository on the specified server. - * + * * @param repositoryLocation the location of a repository implementing this REST protocol. * @return the location of the 'size' resource for a specific repository on the specified server */ @@ -412,24 +412,18 @@ public static final String getSizeLocation(String repositoryLocation) { /** * Encodes a value in a canonical serialized string format, for use in a URL query parameter. - * + * * @param value The value to encode, possibly null. * @return The protocol-serialized representation of the supplied value, or {@link #NULL_PARAM_VALUE} if the * supplied value was null. */ public static String encodeValue(Value value) { - if (value instanceof BNode) { - // SES-2129 special treatment of blank node names to avoid problems with round-tripping. - return "_:" + ((BNode) value).getID(); - } - - // for everything else we just use N-Triples serialization. return NTriplesUtil.toNTriplesString(value); } /** * Decode a previously encoded value. - * + * * @param encodedValue the encoded value * @param valueFactory the factory to use for constructing the Value * @return the decoded Value @@ -445,7 +439,7 @@ public static Value decodeValue(String encodedValue, ValueFactory valueFactory) /** * Decode a previously encoded Resource. - * + * * @param encodedValue the encoded value * @param valueFactory the factory to use for constructing the Resource * @return the decoded Resource @@ -461,7 +455,7 @@ public static Resource decodeResource(String encodedValue, ValueFactory valueFac /** * Decode a previously encoded URI. - * + * * @param encodedValue the encoded value * @param valueFactory the factory to use for constructing the URI * @return the decoded URI @@ -477,7 +471,7 @@ public static IRI decodeURI(String encodedValue, ValueFactory valueFactory) { /** * Encodes a context resource for use in a URL. - * + * * @param context The context to encode, possibly null. * @return The protocol-serialized representation of the supplied context, or {@link #NULL_PARAM_VALUE} if the * supplied value was null. @@ -492,7 +486,7 @@ public static String encodeContext(Resource context) { /** * Decode a previously encoded context Resource. - * + * * @param encodedValue the encoded value * @param valueFactory the factory to use for constructing the Resource * @return the decoded Resource, or null if the encoded values was null or equal to {@link #NULL_PARAM_VALUE} @@ -503,13 +497,18 @@ public static Resource decodeContext(String encodedValue, ValueFactory valueFact } else if (NULL_PARAM_VALUE.equals(encodedValue)) { return null; } else { - return decodeResource(encodedValue, valueFactory); + Resource context = decodeResource(encodedValue, valueFactory); + // Context must be an IRI or BNode but never Triple + if (context instanceof Triple) { + throw new IllegalArgumentException("Invalid context value: " + encodedValue); + } + return context; } } /** * Encode context resources for use in a URL. - * + * * @param contexts the contexts to encode, must not be null. * @return the encoded contexts * @throws IllegalArgumentException If the contexts is null. @@ -527,7 +526,7 @@ public static String[] encodeContexts(Resource... contexts) { /** * Decode previously encoded contexts. - * + * * @param encodedValues the encoded values * @param valueFactory the factory to use for constructing the Resources * @return the decoded Resources, or an empty array if the supplied encodedValues was null. @@ -546,4 +545,4 @@ public static Resource[] decodeContexts(String[] encodedValues, ValueFactory val return result; } -} \ No newline at end of file +} diff --git a/core/http/protocol/src/main/java/org/eclipse/rdf4j/http/protocol/error/ErrorType.java b/core/http/protocol/src/main/java/org/eclipse/rdf4j/http/protocol/error/ErrorType.java index 57d4c16cd1e..6f81ca1c6e3 100644 --- a/core/http/protocol/src/main/java/org/eclipse/rdf4j/http/protocol/error/ErrorType.java +++ b/core/http/protocol/src/main/java/org/eclipse/rdf4j/http/protocol/error/ErrorType.java @@ -15,7 +15,7 @@ */ public class ErrorType { - private static final Map registry = new HashMap(); + private static final Map registry = new HashMap<>(); public static final ErrorType MALFORMED_QUERY = register("MALFORMED QUERY"); diff --git a/core/http/protocol/src/main/java/org/eclipse/rdf4j/http/protocol/transaction/TransactionReader.java b/core/http/protocol/src/main/java/org/eclipse/rdf4j/http/protocol/transaction/TransactionReader.java index 09f031787a5..88b8ec22af1 100644 --- a/core/http/protocol/src/main/java/org/eclipse/rdf4j/http/protocol/transaction/TransactionReader.java +++ b/core/http/protocol/src/main/java/org/eclipse/rdf4j/http/protocol/transaction/TransactionReader.java @@ -20,7 +20,7 @@ public class TransactionReader { /** * parse the transaction from the serialization - * + * * @throws SAXException If the SimpleSAXParser was unable to create an XMLReader or if the XML is faulty. * @throws IOException If IO problems during parsing. */ @@ -36,7 +36,7 @@ public Collection parse(InputStream in) throws SAXExceptio /** * parse the transaction from the serialization - * + * * @throws SAXException If the SimpleSAXParser was unable to create an XMLReader or if the XML is faulty. * @throws IOException If IO problems during parsing. */ diff --git a/core/http/protocol/src/main/java/org/eclipse/rdf4j/http/protocol/transaction/TransactionSAXParser.java b/core/http/protocol/src/main/java/org/eclipse/rdf4j/http/protocol/transaction/TransactionSAXParser.java index 38d7e922033..c178d9e6be1 100644 --- a/core/http/protocol/src/main/java/org/eclipse/rdf4j/http/protocol/transaction/TransactionSAXParser.java +++ b/core/http/protocol/src/main/java/org/eclipse/rdf4j/http/protocol/transaction/TransactionSAXParser.java @@ -34,7 +34,7 @@ /** * Parses an RDF transaction document into a collection of {@link TransactionOperation} objects. - * + * * @author Arjohn Kampman * @author Leo Sauermann */ @@ -62,7 +62,7 @@ public TransactionSAXParser(ValueFactory valueFactory) { /** * get the parsed transaction - * + * * @return the parsed transaction */ public Collection getTxn() { diff --git a/core/http/protocol/src/main/java/org/eclipse/rdf4j/http/protocol/transaction/TransactionWriter.java b/core/http/protocol/src/main/java/org/eclipse/rdf4j/http/protocol/transaction/TransactionWriter.java index 580279d6210..6cd716ae278 100644 --- a/core/http/protocol/src/main/java/org/eclipse/rdf4j/http/protocol/transaction/TransactionWriter.java +++ b/core/http/protocol/src/main/java/org/eclipse/rdf4j/http/protocol/transaction/TransactionWriter.java @@ -35,7 +35,7 @@ /** * Serializes of an RDF transaction. - * + * * @author Arjohn Kampman * @author Leo Sauermann */ @@ -46,7 +46,7 @@ public TransactionWriter() { /** * serialize the passed list of operations to the passed writer. - * + * * @param txn the operations * @param out the output stream to write to * @throws IOException @@ -72,7 +72,7 @@ public void serialize(Iterable txn, OutputStream /** * Serializes the supplied operation. - * + * * @param op The operation to serialize * @param xmlWriter * @throws IOException diff --git a/core/http/protocol/src/main/java/org/eclipse/rdf4j/http/protocol/transaction/TransactionXMLConstants.java b/core/http/protocol/src/main/java/org/eclipse/rdf4j/http/protocol/transaction/TransactionXMLConstants.java index c446c34e5b5..b40099d54f7 100644 --- a/core/http/protocol/src/main/java/org/eclipse/rdf4j/http/protocol/transaction/TransactionXMLConstants.java +++ b/core/http/protocol/src/main/java/org/eclipse/rdf4j/http/protocol/transaction/TransactionXMLConstants.java @@ -9,7 +9,7 @@ /** * Interface defining tags and attribute names for the XML serialization of transactions. - * + * * @author Arjohn Kampman * @author Leo Sauermann */ diff --git a/core/http/protocol/src/main/java/org/eclipse/rdf4j/http/protocol/transaction/operations/AddStatementOperation.java b/core/http/protocol/src/main/java/org/eclipse/rdf4j/http/protocol/transaction/operations/AddStatementOperation.java index 474a8ab415b..e0bf3d783c1 100644 --- a/core/http/protocol/src/main/java/org/eclipse/rdf4j/http/protocol/transaction/operations/AddStatementOperation.java +++ b/core/http/protocol/src/main/java/org/eclipse/rdf4j/http/protocol/transaction/operations/AddStatementOperation.java @@ -17,14 +17,14 @@ /** * Operation to add a statement. - * + * * @author Arjohn Kampman * @author Leo Sauermann */ public class AddStatementOperation extends StatementOperation implements Serializable { /** - * + * */ private static final long serialVersionUID = 7055177153036638975L; diff --git a/core/http/protocol/src/main/java/org/eclipse/rdf4j/http/protocol/transaction/operations/ClearNamespacesOperation.java b/core/http/protocol/src/main/java/org/eclipse/rdf4j/http/protocol/transaction/operations/ClearNamespacesOperation.java index 5a91a14451c..720c7c00cc8 100644 --- a/core/http/protocol/src/main/java/org/eclipse/rdf4j/http/protocol/transaction/operations/ClearNamespacesOperation.java +++ b/core/http/protocol/src/main/java/org/eclipse/rdf4j/http/protocol/transaction/operations/ClearNamespacesOperation.java @@ -14,14 +14,14 @@ /** * Operation that removes all namespace declarations. - * + * * @author Arjohn Kampman * @author Leo Sauermann */ public class ClearNamespacesOperation implements TransactionOperation, Serializable { /** - * + * */ private static final long serialVersionUID = 804163331093326031L; diff --git a/core/http/protocol/src/main/java/org/eclipse/rdf4j/http/protocol/transaction/operations/ClearOperation.java b/core/http/protocol/src/main/java/org/eclipse/rdf4j/http/protocol/transaction/operations/ClearOperation.java index 6e3b7ce8de2..85117a8ef8b 100644 --- a/core/http/protocol/src/main/java/org/eclipse/rdf4j/http/protocol/transaction/operations/ClearOperation.java +++ b/core/http/protocol/src/main/java/org/eclipse/rdf4j/http/protocol/transaction/operations/ClearOperation.java @@ -15,14 +15,14 @@ /** * Operation that clears the whole repository. - * + * * @author Arjohn Kampman * @author Leo Sauermann */ public class ClearOperation extends ContextOperation implements Serializable { /** - * + * */ private static final long serialVersionUID = -1570893715836564121L; diff --git a/core/http/protocol/src/main/java/org/eclipse/rdf4j/http/protocol/transaction/operations/ContextOperation.java b/core/http/protocol/src/main/java/org/eclipse/rdf4j/http/protocol/transaction/operations/ContextOperation.java index 623a0a2642b..e2e51786fa6 100644 --- a/core/http/protocol/src/main/java/org/eclipse/rdf4j/http/protocol/transaction/operations/ContextOperation.java +++ b/core/http/protocol/src/main/java/org/eclipse/rdf4j/http/protocol/transaction/operations/ContextOperation.java @@ -14,7 +14,7 @@ /** * A TransactionOperation that operates on a specific (set of) contexts. - * + * * @author Arjohn Kampman * @author Leo Sauermann */ diff --git a/core/http/protocol/src/main/java/org/eclipse/rdf4j/http/protocol/transaction/operations/RemoveNamespaceOperation.java b/core/http/protocol/src/main/java/org/eclipse/rdf4j/http/protocol/transaction/operations/RemoveNamespaceOperation.java index a4261c09840..fc78a3f6870 100644 --- a/core/http/protocol/src/main/java/org/eclipse/rdf4j/http/protocol/transaction/operations/RemoveNamespaceOperation.java +++ b/core/http/protocol/src/main/java/org/eclipse/rdf4j/http/protocol/transaction/operations/RemoveNamespaceOperation.java @@ -15,14 +15,14 @@ /** * Operation that removes the namespace for a specific prefix. - * + * * @author Arjohn Kampman * @author Leo Sauermann */ public class RemoveNamespaceOperation implements TransactionOperation, Serializable { /** - * + * */ private static final long serialVersionUID = 3227597422508894927L; diff --git a/core/http/protocol/src/main/java/org/eclipse/rdf4j/http/protocol/transaction/operations/RemoveStatementsOperation.java b/core/http/protocol/src/main/java/org/eclipse/rdf4j/http/protocol/transaction/operations/RemoveStatementsOperation.java index bc65c11ee1e..5222befe0f2 100644 --- a/core/http/protocol/src/main/java/org/eclipse/rdf4j/http/protocol/transaction/operations/RemoveStatementsOperation.java +++ b/core/http/protocol/src/main/java/org/eclipse/rdf4j/http/protocol/transaction/operations/RemoveStatementsOperation.java @@ -17,14 +17,14 @@ /** * Operation to remove statements matching specific pattern of subject, predicate and object. - * + * * @author Arjohn Kampman * @author Leo Sauermann */ public class RemoveStatementsOperation extends StatementOperation implements Serializable { /** - * + * */ private static final long serialVersionUID = 1497684375399016153L; diff --git a/core/http/protocol/src/main/java/org/eclipse/rdf4j/http/protocol/transaction/operations/SPARQLUpdateOperation.java b/core/http/protocol/src/main/java/org/eclipse/rdf4j/http/protocol/transaction/operations/SPARQLUpdateOperation.java index af005dde485..e4bfde60525 100644 --- a/core/http/protocol/src/main/java/org/eclipse/rdf4j/http/protocol/transaction/operations/SPARQLUpdateOperation.java +++ b/core/http/protocol/src/main/java/org/eclipse/rdf4j/http/protocol/transaction/operations/SPARQLUpdateOperation.java @@ -20,13 +20,13 @@ /** * Encapsulation of a SPARQL 1.1 update operation executed as part of a transaction. - * + * * @author Jeen Broekstra */ public class SPARQLUpdateOperation implements TransactionOperation, Serializable { /** - * + * */ private static final long serialVersionUID = 4432275498318918582L; diff --git a/core/http/protocol/src/main/java/org/eclipse/rdf4j/http/protocol/transaction/operations/SetNamespaceOperation.java b/core/http/protocol/src/main/java/org/eclipse/rdf4j/http/protocol/transaction/operations/SetNamespaceOperation.java index d0f40f5e4f5..2353232997e 100644 --- a/core/http/protocol/src/main/java/org/eclipse/rdf4j/http/protocol/transaction/operations/SetNamespaceOperation.java +++ b/core/http/protocol/src/main/java/org/eclipse/rdf4j/http/protocol/transaction/operations/SetNamespaceOperation.java @@ -15,14 +15,14 @@ /** * Operation that sets the namespace for a specific prefix. - * + * * @author Arjohn Kampman * @author Leo Sauermann */ public class SetNamespaceOperation implements TransactionOperation, Serializable { /** - * + * */ private static final long serialVersionUID = 7197096029612751574L; diff --git a/core/http/protocol/src/main/java/org/eclipse/rdf4j/http/protocol/transaction/operations/StatementOperation.java b/core/http/protocol/src/main/java/org/eclipse/rdf4j/http/protocol/transaction/operations/StatementOperation.java index fe0d9b160f4..7d5d5083210 100644 --- a/core/http/protocol/src/main/java/org/eclipse/rdf4j/http/protocol/transaction/operations/StatementOperation.java +++ b/core/http/protocol/src/main/java/org/eclipse/rdf4j/http/protocol/transaction/operations/StatementOperation.java @@ -14,7 +14,7 @@ /** * A context operation with (optional) subject, predicate, object. - * + * * @author Arjohn Kampman * @author Leo Sauermann */ diff --git a/core/http/protocol/src/main/java/org/eclipse/rdf4j/http/protocol/transaction/operations/TransactionOperation.java b/core/http/protocol/src/main/java/org/eclipse/rdf4j/http/protocol/transaction/operations/TransactionOperation.java index aa5906b1eb6..04dd2e50ebe 100644 --- a/core/http/protocol/src/main/java/org/eclipse/rdf4j/http/protocol/transaction/operations/TransactionOperation.java +++ b/core/http/protocol/src/main/java/org/eclipse/rdf4j/http/protocol/transaction/operations/TransactionOperation.java @@ -12,7 +12,7 @@ /** * An update operation that is part of a transaction. - * + * * @author Arjohn Kampman * @author Leo Sauermann */ @@ -20,7 +20,7 @@ public interface TransactionOperation { /** * Executes this operation on the supplied connection. - * + * * @param con The connection the operation should be performed on. * @throws RepositoryException If such an exception is thrown by the connection while executing the operation. */ diff --git a/core/http/protocol/src/test/java/org/eclipse/rdf4j/http/protocol/ProtocolTest.java b/core/http/protocol/src/test/java/org/eclipse/rdf4j/http/protocol/ProtocolTest.java index 3dee208eb63..8620041f9cf 100644 --- a/core/http/protocol/src/test/java/org/eclipse/rdf4j/http/protocol/ProtocolTest.java +++ b/core/http/protocol/src/test/java/org/eclipse/rdf4j/http/protocol/ProtocolTest.java @@ -24,9 +24,11 @@ import static org.eclipse.rdf4j.http.protocol.Protocol.getRepositoryLocation; import static org.eclipse.rdf4j.http.protocol.Protocol.getServerLocation; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.fail; import org.eclipse.rdf4j.model.BNode; import org.eclipse.rdf4j.model.IRI; +import org.eclipse.rdf4j.model.Triple; import org.eclipse.rdf4j.model.ValueFactory; import org.eclipse.rdf4j.model.impl.SimpleValueFactory; import org.junit.Test; @@ -113,5 +115,35 @@ public void testEncodeValueRoundtrip() { BNode decodedNode = (BNode) Protocol.decodeValue(encodedBnode, vf); assertEquals(bnode, decodedNode); + Triple triple1 = vf.createTriple(bnode, uri, vf.createLiteral(16)); + String encodedTriple1 = Protocol.encodeValue(triple1); + Triple decodedTriple1 = (Triple) Protocol.decodeValue(encodedTriple1, vf); + assertEquals(triple1, decodedTriple1); + + Triple triple2 = vf.createTriple(bnode, uri, triple1); + String encodedTriple2 = Protocol.encodeValue(triple2); + Triple decodedTriple2 = (Triple) Protocol.decodeValue(encodedTriple2, vf); + assertEquals(triple2, decodedTriple2); + } + + @Test + public void testDecodeContext() { + ValueFactory vf = SimpleValueFactory.getInstance(); + + assertEquals(vf.createBNode("bnode1"), Protocol.decodeContext("_:bnode1", vf)); + assertEquals(vf.createIRI("urn:test"), Protocol.decodeContext("", vf)); + + // RDF* triples are resources but they can't be used as context values + try { + Protocol.decodeContext("<< >>", SimpleValueFactory.getInstance()); + fail("Must fail with exception"); + } catch (IllegalArgumentException e) { + // ignore + } + } + + @Test(expected = IllegalArgumentException.class) + public void testParseIRIvsTriple() { + Protocol.decodeURI("<<>>", SimpleValueFactory.getInstance()); } } diff --git a/core/model/pom.xml b/core/model/pom.xml index 94463ab5582..36d6603d07a 100644 --- a/core/model/pom.xml +++ b/core/model/pom.xml @@ -4,7 +4,7 @@ org.eclipse.rdf4j rdf4j-core - 3.1.5-SNAPSHOT + 3.2.2-SNAPSHOT rdf4j-model RDF4J: Model diff --git a/core/model/src/main/java/org/eclipse/rdf4j/IsolationLevel.java b/core/model/src/main/java/org/eclipse/rdf4j/IsolationLevel.java index 3d70850c08c..b6dd177bbed 100644 --- a/core/model/src/main/java/org/eclipse/rdf4j/IsolationLevel.java +++ b/core/model/src/main/java/org/eclipse/rdf4j/IsolationLevel.java @@ -13,7 +13,7 @@ * A Transaction Isolation Level. Defaul levels supported by Sesame are provided by {@link IsolationLevels}, third-party * triplestore implementors may choose to add additional IsolationLevel implementations if their triplestore's isolation * contract is different from what is provided by default. - * + * * @author Jeen Broekstra */ public interface IsolationLevel { @@ -22,7 +22,7 @@ public interface IsolationLevel { * Verifies if this transaction isolation level is compatible with the supplied other isolation level - that is, if * this transaction isolation level offers at least the same guarantees as the other level. By definition, every * transaction isolation level is compatible with itself. - * + * * @param otherLevel an other isolation level to check compatibility against. * @return true iff this isolation level is compatible with the supplied other isolation level, false otherwise. */ @@ -30,7 +30,7 @@ public interface IsolationLevel { /** * Get a URI uniquely representing this isolation level. - * + * * @return a URI that uniquely represents this isolation level. */ IRI getURI(); diff --git a/core/model/src/main/java/org/eclipse/rdf4j/IsolationLevels.java b/core/model/src/main/java/org/eclipse/rdf4j/IsolationLevels.java index 52308173ed7..35a2e67f8c9 100644 --- a/core/model/src/main/java/org/eclipse/rdf4j/IsolationLevels.java +++ b/core/model/src/main/java/org/eclipse/rdf4j/IsolationLevels.java @@ -19,7 +19,7 @@ * Enumeration of Transaction {@link IsolationLevel}s supported by Sesame. Note that Sesame stores are not required to * support all levels, consult the documentatation for the specific SAIL implementation you are using to find out which * levels are supported. - * + * * @author Jeen Broekstra * @author James Leigh */ @@ -78,7 +78,7 @@ public boolean isCompatibleWith(IsolationLevel otherLevel) { /** * Determines the first compatible isolation level in the list of supported levels, for the given level. Returns the * level itself if it is in the list of supported levels. Returns null if no compatible level can be found. - * + * * @param level the {@link IsolationLevel} for which to determine a compatible level. * @param supportedLevels a list of supported isolation levels from which to select the closest compatible level. * @return the given level if it occurs in the list of supported levels. Otherwise, the first compatible level in diff --git a/core/model/src/main/java/org/eclipse/rdf4j/OpenRDFException.java b/core/model/src/main/java/org/eclipse/rdf4j/OpenRDFException.java index 44bcce7d0df..e8248c57647 100644 --- a/core/model/src/main/java/org/eclipse/rdf4j/OpenRDFException.java +++ b/core/model/src/main/java/org/eclipse/rdf4j/OpenRDFException.java @@ -9,7 +9,7 @@ /** * abstract superclass of all OpenRDF Sesame exceptions - * + * * @author Jeen Broekstra * @deprecated use {@link RDF4JException} instead. */ diff --git a/core/model/src/main/java/org/eclipse/rdf4j/OpenRDFUtil.java b/core/model/src/main/java/org/eclipse/rdf4j/OpenRDFUtil.java index df8b43ec415..090ebfc7a28 100644 --- a/core/model/src/main/java/org/eclipse/rdf4j/OpenRDFUtil.java +++ b/core/model/src/main/java/org/eclipse/rdf4j/OpenRDFUtil.java @@ -11,7 +11,7 @@ /** * General utility methods for OpenRDF/Sesame modules. - * + * * @author Arjohn Kampman */ public class OpenRDFUtil { @@ -25,7 +25,7 @@ public class OpenRDFUtil { * supplying a null-Resource value (e.g.: matching all statements with no associated context). As we so far * haven't been able to prefer one over the other, methods operating on contexts currently throw * {@link IllegalArgumentException}s. - * + * * @param contexts The parameter to check. * @throws IllegalArgumentException If the supplied contexts parameter is null. */ diff --git a/core/model/src/main/java/org/eclipse/rdf4j/RDF4JConfigException.java b/core/model/src/main/java/org/eclipse/rdf4j/RDF4JConfigException.java index ecdf3ff9fd5..31cc577f6bd 100644 --- a/core/model/src/main/java/org/eclipse/rdf4j/RDF4JConfigException.java +++ b/core/model/src/main/java/org/eclipse/rdf4j/RDF4JConfigException.java @@ -9,7 +9,7 @@ /** * Exception indicating a configuration problem in an RDF4J component. - * + * * @author Jeen Broekstra */ public class RDF4JConfigException extends RDF4JException { diff --git a/core/model/src/main/java/org/eclipse/rdf4j/RDF4JException.java b/core/model/src/main/java/org/eclipse/rdf4j/RDF4JException.java index 9020c1a0ae2..32adba08ace 100644 --- a/core/model/src/main/java/org/eclipse/rdf4j/RDF4JException.java +++ b/core/model/src/main/java/org/eclipse/rdf4j/RDF4JException.java @@ -9,7 +9,7 @@ /** * General superclass of all unchecked exceptions that parts of RDF4J can throw. - * + * * @author Jeen Broekstra */ @SuppressWarnings("deprecation") diff --git a/core/model/src/main/java/org/eclipse/rdf4j/exceptions/ValidationException.java b/core/model/src/main/java/org/eclipse/rdf4j/exceptions/ValidationException.java new file mode 100644 index 00000000000..afa3585e1c2 --- /dev/null +++ b/core/model/src/main/java/org/eclipse/rdf4j/exceptions/ValidationException.java @@ -0,0 +1,25 @@ +/******************************************************************************* + * Copyright (c) 2020 Eclipse RDF4J contributors. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Distribution License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ + +package org.eclipse.rdf4j.exceptions; + +import org.eclipse.rdf4j.common.annotation.Experimental; +import org.eclipse.rdf4j.model.Model; + +/** + * MAY BE MOVED IN THE FUTURE! + */ +@Experimental +public interface ValidationException { + + /** + * @return A Model containing the validation report as specified by the SHACL Recommendation + */ + Model validationReportAsModel(); + +} diff --git a/core/model/src/main/java/org/eclipse/rdf4j/model/BNode.java b/core/model/src/main/java/org/eclipse/rdf4j/model/BNode.java index 0278323c826..2b9b8023988 100644 --- a/core/model/src/main/java/org/eclipse/rdf4j/model/BNode.java +++ b/core/model/src/main/java/org/eclipse/rdf4j/model/BNode.java @@ -11,7 +11,7 @@ * An RDF-1.1 blank node (aka bnode, aka anonymous node). A blank node has an identifier to be able to * compare it to other blank nodes internally. Please note that, conceptually, blank node equality can only be * determined by examining the statements that refer to them. - * + * * @see RDF-1.1 Concepts and Abstract Syntax */ public interface BNode extends Resource { @@ -35,7 +35,7 @@ public interface BNode extends Resource { /** * The hash code of a blank node is defined as the hash code of its identifier: id.hashCode(). - * + * * @return A hash code for the blank node. */ @Override diff --git a/core/model/src/main/java/org/eclipse/rdf4j/model/IRI.java b/core/model/src/main/java/org/eclipse/rdf4j/model/IRI.java index 536b3e08c17..60777708113 100644 --- a/core/model/src/main/java/org/eclipse/rdf4j/model/IRI.java +++ b/core/model/src/main/java/org/eclipse/rdf4j/model/IRI.java @@ -22,7 +22,7 @@ *
* The last step should never fail as every legal (full) IRI contains at least one ':' character to seperate the scheme * from the rest of the IRI. The implementation should check this upon object creation. - * + * * @see RFC 3987 * @author Jeen Broekstra */ @@ -31,7 +31,7 @@ public interface IRI extends URI, Resource { /** * Returns the String-representation of this IRI. - * + * * @return The String-representation of this IRI. */ @Override @@ -40,7 +40,7 @@ public interface IRI extends URI, Resource { /** * Gets the namespace part of this IRI. The namespace is defined as per the algorithm described in the class * documentation. - * + * * @return The IRI's namespace. */ @Override @@ -49,7 +49,7 @@ public interface IRI extends URI, Resource { /** * Gets the local name part of this IRI. The local name is defined as per the algorithm described in the class * documentation. - * + * * @return The IRI's local name. */ @Override @@ -57,7 +57,7 @@ public interface IRI extends URI, Resource { /** * Compares a IRI object to another object. - * + * * @param o The object to compare this IRI to. * @return true if the other object is an instance of {@link IRI} and their String-representations are * equal, false otherwise. @@ -67,7 +67,7 @@ public interface IRI extends URI, Resource { /** * The hash code of an IRI is defined as the hash code of its String-representation: toString().hashCode. - * + * * @return A hash code for the IRI. */ @Override diff --git a/core/model/src/main/java/org/eclipse/rdf4j/model/Literal.java b/core/model/src/main/java/org/eclipse/rdf4j/model/Literal.java index 6b4a1ea6595..a408ed2d6d5 100644 --- a/core/model/src/main/java/org/eclipse/rdf4j/model/Literal.java +++ b/core/model/src/main/java/org/eclipse/rdf4j/model/Literal.java @@ -18,7 +18,7 @@ /** * An RDF-1.1 literal consisting of a label (the lexical value), a datatype, and optionally a language tag. - * + * * @author Arjohn Kampman * @see RDF-1.1 Concepts and Abstract Syntax */ @@ -26,14 +26,14 @@ public interface Literal extends Value { /** * Gets the label (the lexical value) of this literal. - * + * * @return The literal's label. */ public String getLabel(); /** * Gets the language tag for this literal, normalized to lower case. - * + * * @return The language tag for this literal, or {@link Optional#empty()} if it doesn't have one. */ public Optional getLanguage(); @@ -42,14 +42,14 @@ public interface Literal extends Value { * Gets the datatype for this literal. If {@link #getLanguage()} returns a non-empty value than this must return * {@link RDF#LANGSTRING}. If no datatype was assigned to this literal by the creator, then this method must return * {@link XMLSchema#STRING}. - * + * * @return The datatype for this literal. */ public IRI getDatatype(); /** * Compares a literal object to another object. - * + * * @param other The object to compare this literal to. * @return true if the other object is an instance of {@link Literal} and if their labels, language tags * and datatypes are equal. @@ -60,7 +60,7 @@ public interface Literal extends Value { /** * Returns the literal's hash code. The hash code of a literal is defined as the hash code of its label: * label.hashCode(). - * + * * @return A hash code for the literal. */ @Override @@ -68,7 +68,7 @@ public interface Literal extends Value { /** * Returns the byte value of this literal. - * + * * @return The byte value of the literal. * @throws NumberFormatException * If the literal cannot be represented by a byte. @@ -77,7 +77,7 @@ public interface Literal extends Value { /** * Returns the short value of this literal. - * + * * @return The short value of the literal. * @throws NumberFormatException If the literal's label cannot be represented by a short. */ @@ -85,7 +85,7 @@ public interface Literal extends Value { /** * Returns the int value of this literal. - * + * * @return The int value of the literal. * @throws NumberFormatException If the literal's label cannot be represented by a int. */ @@ -93,7 +93,7 @@ public interface Literal extends Value { /** * Returns the long value of this literal. - * + * * @return The long value of the literal. * @throws NumberFormatException If the literal's label cannot be represented by to a long . */ @@ -101,7 +101,7 @@ public interface Literal extends Value { /** * Returns the integer value of this literal. - * + * * @return The integer value of the literal. * @throws NumberFormatException If the literal's label is not a valid integer. */ @@ -109,7 +109,7 @@ public interface Literal extends Value { /** * Returns the decimal value of this literal. - * + * * @return The decimal value of the literal. * @throws NumberFormatException If the literal's label is not a valid decimal. */ @@ -117,7 +117,7 @@ public interface Literal extends Value { /** * Returns the float value of this literal. - * + * * @return The float value of the literal. * @throws NumberFormatException If the literal's label cannot be represented by a float. */ @@ -125,7 +125,7 @@ public interface Literal extends Value { /** * Returns the double value of this literal. - * + * * @return The double value of the literal. * @throws NumberFormatException If the literal's label cannot be represented by a double. */ @@ -133,7 +133,7 @@ public interface Literal extends Value { /** * Returns the boolean value of this literal. - * + * * @return The long value of the literal. * @throws IllegalArgumentException If the literal's label cannot be represented by a boolean . */ @@ -144,7 +144,7 @@ public interface Literal extends Value { * literals whose label conforms to the syntax of the following XML * Schema datatypes: dateTime, time, date, gYearMonth, gMonthDay, * gYear, gMonth or gDay. - * + * * @return The calendar value of the literal. * @throws IllegalArgumentException If the literal cannot be represented by a {@link XMLGregorianCalendar}. */ diff --git a/core/model/src/main/java/org/eclipse/rdf4j/model/Model.java b/core/model/src/main/java/org/eclipse/rdf4j/model/Model.java index 8c9022a5365..0ac76199e29 100644 --- a/core/model/src/main/java/org/eclipse/rdf4j/model/Model.java +++ b/core/model/src/main/java/org/eclipse/rdf4j/model/Model.java @@ -19,7 +19,7 @@ *

* Additional utility functionality for working with Model objects is available in the * {@link org.eclipse.rdf4j.model.util.Models Models} utility class. - * + * * @author James Leigh * @author Jeen Broekstra * @see org.eclipse.rdf4j.model.util.Models the Models utility class @@ -31,14 +31,14 @@ public interface Model extends Set, Serializable, NamespaceAware { * operations on the returned model "read through" to this model, and attempts to modify the returned model, whether * direct or via its iterator, result in an {@link UnsupportedOperationException}. *

- * + * * @return an unmodifiable view of the specified set. */ public Model unmodifiable(); /** * Sets the prefix for a namespace. This will replace any existing namespace associated to the prefix. - * + * * @param prefix The new prefix. * @param name The namespace name that the prefix maps to. * @return The {@link Namespace} object for the given namespace. @@ -54,14 +54,14 @@ public default Namespace setNamespace(String prefix, String name) { /** * Sets the prefix for a namespace. This will replace any existing namespace associated to the prefix. - * + * * @param namespace A {@link Namespace} object to use in this Model. */ public void setNamespace(Namespace namespace); /** * Removes a namespace declaration by removing the association between a prefix and a namespace name. - * + * * @param prefix The namespace prefix of which the assocation with a namespace name is to be removed. * @return the previous namespace bound to the prefix or {@link Optional#empty()} */ @@ -82,7 +82,7 @@ public default Namespace setNamespace(String prefix, String name) { * associated context,
* {@code model.contains(null, null, null, c1, c2, c3)} is true if any statements in this model have context * {@code c1}, {@code c2} or {@code c3} . - * + * * @param subj The subject of the statements to match, {@code null} to match statements with any subject. * @param pred The predicate of the statements to match, {@code null} to match statements with any predicate. * @param obj The object of the statements to match, {@code null} to match statements with any object. @@ -106,7 +106,7 @@ public default boolean contains(Resource subj, URI pred, Value obj, Resource... * those to the model. If no contexts are specified, a single statement with no associated context is added. If this * Model is a filtered Model then null (if context empty) values are permitted and will use the corresponding * filtered values. - * + * * @param subj The statement's subject. * @param pred The statement's predicate. * @param obj The statement's object. @@ -128,7 +128,7 @@ public default boolean add(Resource subj, URI pred, Value obj, Resource... conte /** * Removes statements with the specified context exist in this model. - * + * * @param context The context of the statements to remove. * @return true if one or more statements have been removed. */ @@ -148,7 +148,7 @@ public default boolean add(Resource subj, URI pred, Value obj, Resource... conte * context,
* {@code model.remove(null, null, null, c1, c2, c3)} removes any statements in this model have context {@code c1}, * {@code c2} or {@code c3}. - * + * * @param subj The subject of the statements to remove, {@code null} to remove statements with any subject. * @param pred The predicate of the statements to remove, {@code null} to remove statements with any predicate. * @param obj The object of the statements to remove, {@code null} to remove statements with any object. @@ -167,12 +167,43 @@ public default boolean remove(Resource subj, URI pred, Value obj, Resource... co return remove(subj, (IRI) pred, obj, contexts); } - // Views + /** + * Returns an {@link Iterable} over all {@link Statement}s in this Model that match the supplied criteria. + *

+ * Examples: + *

    + *
  • {@code model.getStatements(s1, null, null)} matches all statements that have subject {@code s1}
  • + *
  • {@code model.getStatements(s1, p1, null)} matches all statements that have subject {@code s1} and predicate + * {@code p1}
  • + *
  • {@code model.getStatements(null, null, null, c1)} matches all statements that have context {@code c1}
  • + *
  • {@code model.getStatements(null, null, null, (Resource)null)} matches all statements that have no associated + * context
  • + *
  • {@code model.getStatements(null, null, null, c1, c2, c3)} matches all statements that have context + * {@code c1}, {@code c2} or {@code c3}
  • + *
+ * + * @param subject The subject of the statements to match, {@code null} to match statements with any subject. + * @param predicate The predicate of the statements to match, {@code null} to match statements with any predicate. + * @param object The object of the statements to match, {@code null} to match statements with any object. + * @param contexts The contexts of the statements to match. If no contexts are specified, statements will match + * disregarding their context. If one or more contexts are specified, statements with a context + * matching any one of these will match. To match statements without an associated context, specify + * the value {@code null} and explicitly cast it to type {@code Resource}. + * @return an {@link Iterable} over the statements in this Model that match the specified pattern. + * + * @since 3.2.0 + * + * @see #filter(Resource, IRI, Value, Resource...) + */ + public default Iterable getStatements(Resource subject, IRI predicate, Value object, + Resource... contexts) { + return () -> filter(subject, predicate, object, contexts).iterator(); + } /** - * Returns a view of the statements with the specified subject, predicate, object and (optionally) context. The - * {@code subject}, {@code predicate} and {@code object} parameters can be {@code null} to indicate wildcards. The - * {@code contexts} parameter is a wildcard and accepts zero or more values. If no contexts are specified, + * Returns a filtered view of the statements with the specified subject, predicate, object and (optionally) context. + * The {@code subject}, {@code predicate} and {@code object} parameters can be {@code null} to indicate wildcards. + * The {@code contexts} parameter is a wildcard and accepts zero or more values. If no contexts are specified, * statements will match disregarding their context. If one or more contexts are specified, statements with a * context matching one of these will match. Note: to match statements without an associated context, specify the * value {@code null} and explicitly cast it to type {@code Resource}. @@ -190,7 +221,7 @@ public default boolean remove(Resource subj, URI pred, Value obj, Resource... co * context,
* {@code model.filter(null, null, null, c1, c2, c3)} matches all statements that have context {@code c1}, * {@code c2} or {@code c3}. - * + * * @param subj The subject of the statements to match, {@code null} to match statements with any subject. * @param pred The predicate of the statements to match, {@code null} to match statements with any predicate. * @param obj The object of the statements to match, {@code null} to match statements with any object. @@ -198,6 +229,8 @@ public default boolean remove(Resource subj, URI pred, Value obj, Resource... co * disregarding their context. If one or more contexts are specified, statements with a context * matching one of these will match. * @return The statements that match the specified pattern. + * + * @see #getStatements(Resource, IRI, Value, Resource...) */ public Model filter(Resource subj, IRI pred, Value obj, Resource... contexts); @@ -214,7 +247,7 @@ public default Model filter(Resource subj, URI pred, Value obj, Resource... cont * is a subject value, via the {@code Iterator.remove}, {@code Set.remove}, {@code removeAll}, {@code retainAll}, * and {@code clear} operations. It does not support the {@code add} or {@code addAll} operations if the parameters * {@code pred} or {@code obj} are null. - * + * * @return a set view of the subjects contained in this model */ public Set subjects(); @@ -227,7 +260,7 @@ public default Model filter(Resource subj, URI pred, Value obj, Resource... cont * is a predicate value, via the {@code Iterator.remove}, {@code Set.remove}, {@code removeAll}, {@code retainAll}, * and {@code clear} operations. It does not support the {@code add} or {@code addAll} operations if the parameters * {@code subj} or {@code obj} are null. - * + * * @return a set view of the predicates contained in this model */ public Set predicates(); @@ -240,7 +273,7 @@ public default Model filter(Resource subj, URI pred, Value obj, Resource... cont * is an object value, via the {@code Iterator.remove}, {@code Set.remove}, {@code removeAll}, {@code retainAll}, * and {@code clear} operations. It does not support the {@code add} or {@code addAll} operations if the parameters * {@code subj} or {@code pred} are null. - * + * * @return a set view of the objects contained in this model */ public Set objects(); @@ -253,12 +286,14 @@ public default Model filter(Resource subj, URI pred, Value obj, Resource... cont * is a context value, via the {@code Iterator.remove}, {@code Set.remove}, {@code removeAll}, {@code retainAll}, * and {@code clear} operations. It does not support the {@code add} or {@code addAll} operations if the parameters * {@code subj} , {@code pred} or {@code obj} are null. - * + * * @return a set view of the contexts contained in this model */ public default Set contexts() { Set subjects = stream().map(st -> st.getContext()).collect(Collectors.toSet()); return subjects; - }; + } + + ; } diff --git a/core/model/src/main/java/org/eclipse/rdf4j/model/ModelFactory.java b/core/model/src/main/java/org/eclipse/rdf4j/model/ModelFactory.java index 0335a044d7e..99a9c96a880 100644 --- a/core/model/src/main/java/org/eclipse/rdf4j/model/ModelFactory.java +++ b/core/model/src/main/java/org/eclipse/rdf4j/model/ModelFactory.java @@ -9,7 +9,7 @@ /** * Factory to create empty {@link Model} implementations. - * + * * @author James Leigh */ public interface ModelFactory { diff --git a/core/model/src/main/java/org/eclipse/rdf4j/model/Namespace.java b/core/model/src/main/java/org/eclipse/rdf4j/model/Namespace.java index b04f18563b5..3f7c37c5945 100644 --- a/core/model/src/main/java/org/eclipse/rdf4j/model/Namespace.java +++ b/core/model/src/main/java/org/eclipse/rdf4j/model/Namespace.java @@ -16,14 +16,14 @@ public interface Namespace extends Serializable, Comparable { /** * Gets the name of the current namespace (i.e. its IRI). - * + * * @return name of namespace */ public String getName(); /** * Gets the prefix of the current namespace. The default namespace is represented by an empty prefix string. - * + * * @return prefix of namespace, or an empty string in case of the default namespace. */ public String getPrefix(); diff --git a/core/model/src/main/java/org/eclipse/rdf4j/model/NamespaceAware.java b/core/model/src/main/java/org/eclipse/rdf4j/model/NamespaceAware.java index 1000aa136e7..02886223b00 100644 --- a/core/model/src/main/java/org/eclipse/rdf4j/model/NamespaceAware.java +++ b/core/model/src/main/java/org/eclipse/rdf4j/model/NamespaceAware.java @@ -13,7 +13,7 @@ /** * An interface that is used to signify that something is able to provide {@link Namespace} information, in addition to * {@link Statement}s. - * + * * @author Peter Ansell */ @FunctionalInterface @@ -21,7 +21,7 @@ public interface NamespaceAware { /** * Gets the set that contains the assigned namespaces. - * + * * @return A {@link Set} containing the {@link Namespace} objects that are available. */ public Set getNamespaces(); @@ -29,7 +29,7 @@ public interface NamespaceAware { /** * Gets the namespace that is associated with the specified prefix, if any. If multiple namespaces match the given * prefix, the result may not be consistent over successive calls to this method. - * + * * @param prefix A namespace prefix. * @return The namespace name that is associated with the specified prefix, or {@link Optional#empty()} if there is * no such namespace. diff --git a/core/model/src/main/java/org/eclipse/rdf4j/model/Statement.java b/core/model/src/main/java/org/eclipse/rdf4j/model/Statement.java index 04accff7d0b..1828e927ffd 100644 --- a/core/model/src/main/java/org/eclipse/rdf4j/model/Statement.java +++ b/core/model/src/main/java/org/eclipse/rdf4j/model/Statement.java @@ -18,35 +18,35 @@ public interface Statement extends Serializable { /** * Gets the subject of this statement. - * + * * @return The statement's subject. */ public Resource getSubject(); /** * Gets the predicate of this statement. - * + * * @return The statement's predicate. */ public IRI getPredicate(); /** * Gets the object of this statement. - * + * * @return The statement's object. */ public Value getObject(); /** * Gets the context of this statement. - * + * * @return The statement's context, or null in case of the null context or if not applicable. */ public Resource getContext(); /** * Compares a statement object to another object. - * + * * @param other The object to compare this statement to. * @return true if the other object is an instance of {@link Statement} and if their subjects, predicates, * objects and contexts are equal. @@ -56,7 +56,7 @@ public interface Statement extends Serializable { /** * The hash code of a statement. - * + * * @return A hash code for the statement. */ @Override diff --git a/core/model/src/main/java/org/eclipse/rdf4j/model/Triple.java b/core/model/src/main/java/org/eclipse/rdf4j/model/Triple.java new file mode 100644 index 00000000000..4875299e8a9 --- /dev/null +++ b/core/model/src/main/java/org/eclipse/rdf4j/model/Triple.java @@ -0,0 +1,41 @@ +/******************************************************************************* + * Copyright (c) 2020 Eclipse RDF4J contributors. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Distribution License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ +package org.eclipse.rdf4j.model; + +import org.eclipse.rdf4j.common.annotation.Experimental; + +/** + * An RDF* triple. Triples have a subject, predicate and object. Unlike {@link Statement}, a triple never has an + * associated context. + * + * @author Pavel Mihaylov + */ +@Experimental +public interface Triple extends Resource { + + /** + * Gets the subject of this triple. + * + * @return The triple's subject. + */ + Resource getSubject(); + + /** + * Gets the predicate of this triple. + * + * @return The triple's predicate. + */ + IRI getPredicate(); + + /** + * Gets the object of this triple. + * + * @return The triple's object. + */ + Value getObject(); +} diff --git a/core/model/src/main/java/org/eclipse/rdf4j/model/URI.java b/core/model/src/main/java/org/eclipse/rdf4j/model/URI.java index 554c8b071f1..05742624a6d 100644 --- a/core/model/src/main/java/org/eclipse/rdf4j/model/URI.java +++ b/core/model/src/main/java/org/eclipse/rdf4j/model/URI.java @@ -9,7 +9,7 @@ /** * A Uniform Resource Identifier (URI). - * + * * @deprecated since 2.0. Use {@link IRI} instead. * @author Jeen Broekstra * @author Arjohn Kampman @@ -20,7 +20,7 @@ public interface URI extends Resource { /** * Returns the String-representation of this URI. - * + * * @return The String-representation of this URI. */ @Override @@ -29,7 +29,7 @@ public interface URI extends Resource { /** * Gets the namespace part of this URI. The namespace is defined as per the algorithm described in the class * documentation. - * + * * @return The URI's namespace. */ public String getNamespace(); @@ -37,14 +37,14 @@ public interface URI extends Resource { /** * Gets the local name part of this URI. The local name is defined as per the algorithm described in the class * documentation. - * + * * @return The URI's local name. */ public String getLocalName(); /** * Compares a URI object to another object. - * + * * @param o The object to compare this URI to. * @return true if the other object is an instance of {@link URI} and their String-representations are * equal, false otherwise. @@ -54,7 +54,7 @@ public interface URI extends Resource { /** * The hash code of an URI is defined as the hash code of its String-representation: toString().hashCode. - * + * * @return A hash code for the URI. */ @Override diff --git a/core/model/src/main/java/org/eclipse/rdf4j/model/ValueFactory.java b/core/model/src/main/java/org/eclipse/rdf4j/model/ValueFactory.java index f8ed4ed7fe0..d399931c474 100644 --- a/core/model/src/main/java/org/eclipse/rdf4j/model/ValueFactory.java +++ b/core/model/src/main/java/org/eclipse/rdf4j/model/ValueFactory.java @@ -19,7 +19,7 @@ /** * A factory for creating {@link IRI IRIs}, {@link BNode blank nodes}, {@link Literal literals} and {@link Statement * statements} based on the RDF-1.1 Concepts and Abstract Syntax, a W3C Recommendation. - * + * * @author Arjohn Kampman * @see RDF-1.1 Concepts and Abstract Syntax */ @@ -27,7 +27,7 @@ public interface ValueFactory { /** * Creates a new IRI from the supplied string-representation. - * + * * @param iri A string-representation of a IRI. * @return An object representing the IRI. * @throws IlllegalArgumentException If the supplied string does not resolve to a legal (absolute) IRI. @@ -36,7 +36,7 @@ public interface ValueFactory { /** * Creates a new URI from the supplied string-representation. - * + * * @param uri A string-representation of a URI. * @return An object representing the URI. * @throws IlllegalArgumentException If the supplied string does not resolve to a legal (absolute) URI. @@ -52,7 +52,7 @@ public default URI createURI(String uri) { * calling {@link #createIRI(String) createIRI(namespace+localName)}, but allows the ValueFactory to reuse supplied * namespace and local name strings whenever possible. Note that the values returned by {@link IRI#getNamespace()} * and {@link IRI#getLocalName()} are not necessarily the same as the values that are supplied to this method. - * + * * @param namespace The IRI's namespace. * @param localName The IRI's local name. * @throws IllegalArgumentException If the supplied namespace and localname do not resolve to a legal (absolute) @@ -62,7 +62,7 @@ public default URI createURI(String uri) { /** * Creates a new URI from the supplied namespace and local name. - * + * * @param namespace The IRI's namespace. * @param localName The IRI's local name. * @return An object representing the URI. @@ -76,14 +76,14 @@ public default URI createURI(String namespace, String localName) { /** * Creates a new bNode. - * + * * @return An object representing the bNode. */ public BNode createBNode(); /** * Creates a new blank node with the given node identifier. - * + * * @param nodeID The blank node identifier. * @return An object representing the blank node. */ @@ -92,7 +92,7 @@ public default URI createURI(String namespace, String localName) { /** * Creates a new literal with the supplied label. The return value of {@link Literal#getDatatype()} for the returned * object must be {@link XMLSchema#STRING}. - * + * * @param label The literal's label, must not be null. */ public Literal createLiteral(String label); @@ -100,7 +100,7 @@ public default URI createURI(String namespace, String localName) { /** * Creates a new literal with the supplied label and language attribute. The return value of * {@link Literal#getDatatype()} for the returned object must be {@link RDF#LANGSTRING}. - * + * * @param label The literal's label, must not be null. * @param language The literal's language attribute, must not be null. */ @@ -108,7 +108,7 @@ public default URI createURI(String namespace, String localName) { /** * Creates a new literal with the supplied label and datatype. - * + * * @param label The literal's label, must not be null. * @param datatype The literal's datatype. If it is null, the datatype {@link XMLSchema#STRING} will be assigned to * this literal. @@ -117,7 +117,7 @@ public default URI createURI(String namespace, String localName) { /** * Creates a new literal with the supplied label and datatype. - * + * * @param label The literal's label. * @param datatype The literal's datatype. If it is null, the datatype {@link XMLSchema#STRING} will be assigned to * this literal. @@ -130,7 +130,7 @@ public default Literal createLiteral(String label, URI datatype) { /** * Creates a new xsd:boolean-typed literal representing the specified value. - * + * * @param value The value for the literal. * @return An xsd:boolean-typed literal for the specified value. */ @@ -138,7 +138,7 @@ public default Literal createLiteral(String label, URI datatype) { /** * Creates a new xsd:byte-typed literal representing the specified value. - * + * * @param value The value for the literal. * @return An xsd:byte-typed literal for the specified value. */ @@ -146,7 +146,7 @@ public default Literal createLiteral(String label, URI datatype) { /** * Creates a new xsd:short-typed literal representing the specified value. - * + * * @param value The value for the literal. * @return An xsd:short-typed literal for the specified value. */ @@ -154,7 +154,7 @@ public default Literal createLiteral(String label, URI datatype) { /** * Creates a new xsd:int-typed literal representing the specified value. - * + * * @param value The value for the literal. * @return An xsd:int-typed literal for the specified value. */ @@ -162,7 +162,7 @@ public default Literal createLiteral(String label, URI datatype) { /** * Creates a new xsd:long-typed literal representing the specified value. - * + * * @param value The value for the literal. * @return An xsd:long-typed literal for the specified value. */ @@ -170,7 +170,7 @@ public default Literal createLiteral(String label, URI datatype) { /** * Creates a new xsd:float-typed literal representing the specified value. - * + * * @param value The value for the literal. * @return An xsd:float-typed literal for the specified value. */ @@ -178,7 +178,7 @@ public default Literal createLiteral(String label, URI datatype) { /** * Creates a new xsd:double-typed literal representing the specified value. - * + * * @param value The value for the literal. * @return An xsd:double-typed literal for the specified value. */ @@ -199,7 +199,7 @@ public default Literal createLiteral(String label, URI datatype) { /** * Creates a new literal representing the specified calendar that is typed using the appropriate XML Schema * date/time datatype. - * + * * @param calendar The value for the literal. * @return An typed literal for the specified calendar. */ @@ -213,7 +213,7 @@ public default Literal createLiteral(String label, URI datatype) { /** * Creates a new statement with the supplied subject, predicate and object. - * + * * @param subject The statement's subject. * @param predicate The statement's predicate. * @param object The statement's object. @@ -223,7 +223,7 @@ public default Literal createLiteral(String label, URI datatype) { /** * Creates a new statement with the supplied subject, predicate and object. - * + * * @param subject The statement's subject. * @param predicate The statement's predicate. * @param object The statement's object. @@ -237,7 +237,7 @@ public default Statement createStatement(Resource subject, URI predicate, Value /** * Creates a new statement with the supplied subject, predicate and object and associated context. - * + * * @param subject The statement's subject. * @param predicate The statement's predicate. * @param object The statement's object. @@ -248,7 +248,7 @@ public default Statement createStatement(Resource subject, URI predicate, Value /** * Creates a new statement with the supplied subject, predicate and object and associated context. - * + * * @param subject The statement's subject. * @param predicate The statement's predicate. * @param object The statement's object. @@ -259,4 +259,19 @@ public default Statement createStatement(Resource subject, URI predicate, Value public default Statement createStatement(Resource subject, URI predicate, Value object, Resource context) { return createStatement(subject, (IRI) predicate, object, context); } + + /** + * Creates a new RDF* triple with the supplied subject, predicate and object. + * + * @param subject The statement's subject. + * @param predicate The statement's predicate. + * @param object The statement's object. + * @return The created triple. + * @implNote This temporary default method is only supplied as a stop-gap for backward compatibility, but throws an + * {@link UnsupportedOperationException}. Concrete implementations are expected to override. + * @since 3.2.0 + */ + default Triple createTriple(Resource subject, IRI predicate, Value object) { + throw new UnsupportedOperationException(); + } } diff --git a/core/model/src/main/java/org/eclipse/rdf4j/model/datatypes/XMLDatatypeUtil.java b/core/model/src/main/java/org/eclipse/rdf4j/model/datatypes/XMLDatatypeUtil.java index a303db90ea3..7b68d1108b8 100644 --- a/core/model/src/main/java/org/eclipse/rdf4j/model/datatypes/XMLDatatypeUtil.java +++ b/core/model/src/main/java/org/eclipse/rdf4j/model/datatypes/XMLDatatypeUtil.java @@ -28,7 +28,7 @@ /** * Provides methods for handling the standard XML Schema datatypes. - * + * * @author Arjohn Kampman */ public class XMLDatatypeUtil { @@ -69,7 +69,7 @@ public class XMLDatatypeUtil { /** * Checks whether the supplied datatype is a primitive XML Schema datatype. - * + * * @param datatype * @return true if the datatype is a primitive type */ @@ -88,7 +88,7 @@ public static boolean isPrimitiveDatatype(IRI datatype) { /** * Checks whether the supplied datatype is a derived XML Schema datatype. - * + * * @param datatype * @return true if the datatype is a derived type */ @@ -111,7 +111,7 @@ public static boolean isDerivedDatatype(IRI datatype) { /** * Checks whether the supplied datatype is a built-in XML Schema datatype. - * + * * @param datatype * @return true if it is a primitive or derived XML Schema type */ @@ -122,7 +122,7 @@ public static boolean isBuiltInDatatype(IRI datatype) { /** * Checks whether the supplied datatype is a numeric datatype, i.e.if it is equal to xsd:float, xsd:double, * xsd:decimal or one of the datatypes derived from xsd:decimal. - * + * * @param datatype * @return true of it is a decimal or floating point type */ @@ -133,7 +133,7 @@ public static boolean isNumericDatatype(IRI datatype) { /** * Checks whether the supplied datatype is equal to xsd:decimal or one of the built-in datatypes that is derived * from xsd:decimal. - * + * * @param datatype * @return true if it is a decimal datatype */ @@ -144,7 +144,7 @@ public static boolean isDecimalDatatype(IRI datatype) { /** * Checks whether the supplied datatype is equal to xsd:integer or one of the built-in datatypes that is derived * from xsd:integer. - * + * * @param datatype * @return true if it is an integer type */ @@ -159,7 +159,7 @@ public static boolean isIntegerDatatype(IRI datatype) { /** * Checks whether the supplied datatype is equal to xsd:float or xsd:double. - * + * * @param datatype * @return true if it is a floating point type */ @@ -170,7 +170,7 @@ public static boolean isFloatingPointDatatype(IRI datatype) { /** * Checks whether the supplied datatype is equal to xsd:dateTime, xsd:date, xsd:time, xsd:gYearMonth, xsd:gMonthDay, * xsd:gYear, xsd:gMonth or xsd:gDay.These are the primitive datatypes that represent dates and/or times. - * + * * @see XMLGregorianCalendar * @param datatype * @return true if it is a calendar type @@ -199,7 +199,7 @@ public static boolean isDurationDatatype(IRI datatype) { /** * Checks whether the supplied datatype is ordered.The values of an ordered datatype can be compared to each other * using operators like < and >. - * + * * @param datatype * @return true if the datatype is ordered */ @@ -213,7 +213,7 @@ public static boolean isOrderedDatatype(IRI datatype) { /** * Verifies if the supplied lexical value is valid for the given datatype. - * + * * @param value a lexical value * @param datatype an XML Schema datatatype. * @return true if the supplied lexical value is valid, false otherwise. @@ -292,7 +292,7 @@ public static boolean isValidValue(String value, IRI datatype) { /** * Verifies if the supplied lexical value is a valid decimal or not. - * + * * @param value * @return true if valid, false otherwise */ @@ -307,7 +307,7 @@ public static boolean isValidDecimal(String value) { /** * Verifies if the supplied lexical value is a valid integer or not. - * + * * @param value * @return true if valid, false otherwise */ @@ -322,7 +322,7 @@ public static boolean isValidInteger(String value) { /** * Verifies if the supplied lexical value is a valid negative integer or not. - * + * * @param value * @return true if valid, false otherwise */ @@ -337,7 +337,7 @@ public static boolean isValidNegativeInteger(String value) { /** * Verifies if the supplied lexical value is a valid non-positive integer or not. - * + * * @param value * @return true if valid, false otherwise */ @@ -352,7 +352,7 @@ public static boolean isValidNonPositiveInteger(String value) { /** * Verifies if the supplied lexical value is a valid non-negative integer or not. - * + * * @param value * @return true if valid, false otherwise */ @@ -367,7 +367,7 @@ public static boolean isValidNonNegativeInteger(String value) { /** * Verifies if the supplied lexical value is a valid positive integer or not. - * + * * @param value * @return true if valid, false otherwise */ @@ -382,7 +382,7 @@ public static boolean isValidPositiveInteger(String value) { /** * Verifies if the supplied lexical value is a valid long or not. - * + * * @param value * @return true if valid, false otherwise */ @@ -397,7 +397,7 @@ public static boolean isValidLong(String value) { /** * Verifies if the supplied lexical value is a valid integer or not. - * + * * @param value * @return true if valid, false otherwise */ @@ -412,7 +412,7 @@ public static boolean isValidInt(String value) { /** * Verifies if the supplied lexical value is a valid short or not. - * + * * @param value * @return true if valid, false otherwise */ @@ -427,7 +427,7 @@ public static boolean isValidShort(String value) { /** * Verifies if the supplied lexical value is a valid byte or not. - * + * * @param value * @return true if valid, false otherwise */ @@ -442,7 +442,7 @@ public static boolean isValidByte(String value) { /** * Verifies if the supplied lexical value is a valid unsigned long or not. - * + * * @param value * @return true if valid, false otherwise */ @@ -457,7 +457,7 @@ public static boolean isValidUnsignedLong(String value) { /** * Verifies if the supplied lexical value is a valid unsigned int. - * + * * @param value * @return true if valid, false otherwise */ @@ -472,7 +472,7 @@ public static boolean isValidUnsignedInt(String value) { /** * Verifies if the supplied lexical value is a valid unsigned short or not. - * + * * @param value * @return true if valid, false otherwise */ @@ -487,7 +487,7 @@ public static boolean isValidUnsignedShort(String value) { /** * Verifies if the supplied lexical value is a valid unsigned byte or not. - * + * * @param value * @return true if valid, false otherwise */ @@ -502,7 +502,7 @@ public static boolean isValidUnsignedByte(String value) { /** * Verifies if the supplied lexical value is a valid float or not. - * + * * @param value * @return true if valid, false otherwise */ @@ -517,7 +517,7 @@ public static boolean isValidFloat(String value) { /** * Verifies if the supplied lexical value is a valid double or not. - * + * * @param value * @return true if valid, false otherwise */ @@ -532,7 +532,7 @@ public static boolean isValidDouble(String value) { /** * Verifies if the supplied lexical value is a valid boolean or not. - * + * * @param value * @return true if valid, false otherwise */ @@ -547,7 +547,7 @@ public static boolean isValidBoolean(String value) { /** * Verifies if the supplied lexical value is a valid duration. - * + * * @param value * @return true if valid, false otherwise */ @@ -559,7 +559,7 @@ public static boolean isValidDuration(String value) { /** * Verifies if the supplied lexical value is a valid day-time duration ot not. - * + * * @param value * @return true if valid, false otherwise */ @@ -569,7 +569,7 @@ public static boolean isValidDayTimeDuration(String value) { /** * Verifies if the supplied lexical value is a valid year-month duration. - * + * * @param value * @return true if valid, false otherwise */ @@ -579,7 +579,7 @@ public static boolean isValidYearMonthDuration(String value) { /** * Verifies if the supplied lexical value is a valid date-time. - * + * * @param value * @return true if valid, false otherwise */ @@ -595,7 +595,7 @@ public static boolean isValidDateTime(String value) { /** * Verifies if the supplied lexical value is a valid date-timestamp. - * + * * @param value * @return true if valid, false otherwise */ @@ -611,7 +611,7 @@ public static boolean isValidDateTimeStamp(String value) { /** * Determines if the supplied value is a valid xsd:date string. - * + * * @param value * @return true if valid, false otherwise */ @@ -621,7 +621,7 @@ public static boolean isValidDate(String value) { /** * Determines if the supplied value is a valid xsd:time string. - * + * * @param value * @return true if valid, false otherwise */ @@ -631,7 +631,7 @@ public static boolean isValidTime(String value) { /** * Determines if the supplied value is a valid xsd:gDay string. - * + * * @param value * @return true if valid, false otherwise */ @@ -641,7 +641,7 @@ public static boolean isValidGDay(String value) { /** * Determines if the supplied value is a valid xsd:gMonth string. - * + * * @param value * @return true if valid, false otherwise */ @@ -651,7 +651,7 @@ public static boolean isValidGMonth(String value) { /** * Determines if the supplied value is a valid xsd:gMonthDay string. - * + * * @param value * @return true if valid, false otherwise */ @@ -661,7 +661,7 @@ public static boolean isValidGMonthDay(String value) { /** * Determines if the supplied value is a valid xsd:gYear string. - * + * * @param value * @return true if valid, false otherwise */ @@ -671,7 +671,7 @@ public static boolean isValidGYear(String value) { /** * Determines if the supplied value is a valid xsd:gYearMonth string. - * + * * @param value * @return true if valid, false otherwise */ @@ -682,7 +682,7 @@ public static boolean isValidGYearMonth(String value) { /** * Determines if the supplied value is a valid xsd:QName string. Note that this method only checks for syntax errors * in the supplied string itself. It does not validate that the prefix is a declared and in-scope namespace prefix. - * + * * @param value * @return true if valid, false otherwise */ @@ -763,7 +763,7 @@ private static boolean isNameChar(int c) { /** * Determines if the supplied string can be parsed to a valid XMLGregorianCalendar value. - * + * * @param value * @return true if the supplied string is a parsable calendar value, false otherwise. */ @@ -782,7 +782,7 @@ private static boolean isValidCalendarValue(String value) { /** * Normalizes the supplied value according to the normalization rules for the supplied datatype. - * + * * @param value The value to normalize. * @param datatype The value's datatype. * @return The normalized value if there are any (supported) normalization rules for the supplied datatype, or the @@ -839,7 +839,7 @@ public static String normalize(String value, IRI datatype) { * Normalizes a boolean value to its canonical representation. More specifically, the values 1 and * 0 will be normalized to the canonical values true and false, respectively. Supplied * canonical values will remain as is. - * + * * @param value The boolean value to normalize. * @return The normalized value. * @throws IllegalArgumentException If the supplied value is not a legal boolean. @@ -862,7 +862,7 @@ public static String normalizeBoolean(String value) { * Normalizes a decimal to its canonical representation. For example: 120 becomes 120.0, * +.3 becomes 0.3, 00012.45000 becomes 12.45 and -.0 becomes * 0.0. - * + * * @param decimal The decimal to normalize. * @return The canonical representation of decimal. * @throws IllegalArgumentException If one of the supplied strings is not a legal decimal. @@ -964,7 +964,7 @@ public static String normalizeDecimal(String decimal) { /** * Normalizes an integer to its canonical representation. For example: +120 becomes 120 and * 00012 becomes 12. - * + * * @param value The value to normalize. * @return The canonical representation of value. * @throws IllegalArgumentException If the supplied value is not a legal integer. @@ -1124,7 +1124,7 @@ private static String normalizeIntegerValue(String integer, String minValue, Str /** * Normalizes a float to its canonical representation. - * + * * @param value The value to normalize. * @return The canonical representation of value. * @throws IllegalArgumentException If the supplied value is not a legal float. @@ -1135,7 +1135,7 @@ public static String normalizeFloat(String value) { /** * Normalizes a double to its canonical representation. - * + * * @param value The value to normalize. * @return The canonical representation of value. * @throws IllegalArgumentException If the supplied value is not a legal double. @@ -1146,7 +1146,7 @@ public static String normalizeDouble(String value) { /** * Normalizes a floating point number to its canonical representation. - * + * * @param value The value to normalize. * @return The canonical representation of value. * @throws IllegalArgumentException If the supplied value is not a legal floating point number. @@ -1157,7 +1157,7 @@ public static String normalizeFPNumber(String value) { /** * Normalizes a floating point lexical value to its canonical representation. - * + * * @param value The lexical value to normalize. * @param minMantissa A normalized decimal indicating the lowest value that the mantissa may have. * @param maxMantissa A normalized decimal indicating the highest value that the mantissa may have. @@ -1311,7 +1311,7 @@ private static String normalizeFPNumber(String value, String minMantissa, String /** * Normalizes an xsd:dateTime. - * + * * @param value The value to normalize. * @return The normalized value. * @throws IllegalArgumentException If the supplied value is not a legal xsd:dateTime value. @@ -1337,7 +1337,7 @@ public static String normalizeDateTime(String value) { * Replaces all contiguous sequences of #x9 (tab), #xA (line feed) and #xD (carriage return) with a single #x20 * (space) character, and removes any leading and trailing whitespace characters, as specified for whiteSpace facet * collapse. - * + * * @param s * @return new string */ @@ -1403,7 +1403,7 @@ public static int compare(String value1, String value2, IRI datatype) { /** * Compares two decimals to eachother. - * + * * @param dec1 * @param dec2 * @return A negative number if dec1 is smaller than dec2, 0 if they are equal, or @@ -1419,7 +1419,7 @@ public static int compareDecimals(String dec1, String dec2) { /** * Compares two canonical decimals to each other. - * + * * @param dec1 * @param dec2 * @return A negative number if dec1 is smaller than dec2, 0 if they are equal, or @@ -1479,7 +1479,7 @@ public static int compareCanonicalDecimals(String dec1, String dec2) { /** * Compares two integers to each other. - * + * * @param int1 * @param int2 * @return A negative number if int1 is smaller than int2, 0 if they are equal, or @@ -1495,7 +1495,7 @@ public static int compareIntegers(String int1, String int2) { /** * Compares two canonical integers to each other. - * + * * @param int1 * @param int2 * @return A negative number if int1 is smaller than int2, 0 if they are equal, or @@ -1622,7 +1622,7 @@ public static int compareUnsignedBytes(String int1, String int2) { /** * Compares two floats to each other. - * + * * @param float1 * @param float2 * @return A negative number if float1 is smaller than float2, 0 if they are equal, or @@ -1639,7 +1639,7 @@ public static int compareFloats(String float1, String float2) { /** * Compares two canonical floats to each other. - * + * * @param float1 * @param float2 * @return A negative number if float1 is smaller than float2, 0 if they are equal, or @@ -1654,7 +1654,7 @@ public static int compareCanonicalFloats(String float1, String float2) { /** * Compares two doubles to each other. - * + * * @param double1 * @param double2 * @return A negative number if double1 is smaller than double2, 0 if they are equal, or @@ -1671,7 +1671,7 @@ public static int compareDoubles(String double1, String double2) { /** * Compares two canonical doubles to eachother. - * + * * @param double1 * @param double2 * @return A negative number if double1 is smaller than double2, 0 if they are equal, or @@ -1686,7 +1686,7 @@ public static int compareCanonicalDoubles(String double1, String double2) { /** * Compares two floating point numbers to eachother. - * + * * @param fp1 * @param fp2 * @return A negative number if float1 is smaller than float2, 0 if they are equal, or @@ -1703,7 +1703,7 @@ public static int compareFPNumbers(String fp1, String fp2) { /** * Compares two canonical floating point numbers to each other. - * + * * @param float1 * @param float2 * @return A negative number if float1 is smaller than float2, 0 if they are equal, or @@ -1774,7 +1774,7 @@ public static int compareCanonicalFPNumbers(String float1, String float2) { /** * Compares two dateTime objects. Important: The comparison only works if both values have, or both values * don't have specified a valid value for the timezone. - * + * * @param value1 An xsd:dateTime value. * @param value2 An xsd:dateTime value. * @return -1 if value1 is before value2 (i.e. if the dateTime object represented by @@ -1798,7 +1798,7 @@ public static int compareDateTime(String value1, String value2) { /** * Parses the supplied xsd:boolean string and returns its value. - * + * * @param s A string representation of an xsd:boolean value. * @return The boolean value represented by the supplied string argument. * @throws NumberFormatException If the supplied string is not a valid xsd:boolean value. @@ -1809,7 +1809,7 @@ public static boolean parseBoolean(String s) { /** * Parses the supplied xsd:byte string and returns its value. - * + * * @param s A string representation of an xsd:byte value. * @return The byte value represented by the supplied string argument. * @throws NumberFormatException If the supplied string is not a valid xsd:byte value. @@ -1821,7 +1821,7 @@ public static byte parseByte(String s) { /** * Parses the supplied xsd:short string and returns its value. - * + * * @param s A string representation of an xsd:short value. * @return The short value represented by the supplied string argument. * @throws NumberFormatException If the supplied string is not a valid xsd:short value. @@ -1833,7 +1833,7 @@ public static short parseShort(String s) { /** * Parses the supplied xsd:int strings and returns its value. - * + * * @param s A string representation of an xsd:int value. * @return The int value represented by the supplied string argument. * @throws NumberFormatException If the supplied string is not a valid xsd:int value. @@ -1845,7 +1845,7 @@ public static int parseInt(String s) { /** * Parses the supplied xsd:long string and returns its value. - * + * * @param s A string representation of an xsd:long value. * @return The long value represented by the supplied string argument. * @throws NumberFormatException If the supplied string is not a valid xsd:long value. @@ -1857,7 +1857,7 @@ public static long parseLong(String s) { /** * Parses the supplied xsd:float string and returns its value. - * + * * @param s A string representation of an xsd:float value. * @return The float value represented by the supplied string argument. * @throws NumberFormatException If the supplied string is not a valid xsd:float value. @@ -1877,7 +1877,7 @@ public static float parseFloat(String s) { /** * Parses the supplied xsd:double string and returns its value. - * + * * @param s A string representation of an xsd:double value. * @return The double value represented by the supplied string argument. * @throws NumberFormatException If the supplied string is not a valid xsd:double value. @@ -1897,7 +1897,7 @@ public static double parseDouble(String s) { /** * Parses the supplied xsd:integer string and returns its value. - * + * * @param s A string representation of an xsd:integer value. * @return The integer value represented by the supplied string argument. * @throws NumberFormatException If the supplied string is not a valid xsd:integer value. @@ -1909,7 +1909,7 @@ public static BigInteger parseInteger(String s) { /** * Parses the supplied decimal/floating point string and returns its value. - * + * * @param s A string representation of an xsd:decimal or xsd:double value. * @return The decimal/floating point value represented by the supplied string argument. * @throws NumberFormatException If the supplied string is not a valid xsd:decimal or xsd:double value. @@ -1921,7 +1921,7 @@ public static BigDecimal parseDecimal(String s) { /** * Parses the supplied calendar value string and returns its value. - * + * * @param s A string representation of an xsd:dateTime, xsd:time, xsd:date, xsd:gYearMonth, xsd:gMonthDay, * xsd:gYear, xsd:gMonth or xsd:gDay value. * @return The calendar value represented by the supplied string argument. @@ -1933,7 +1933,7 @@ public static XMLGregorianCalendar parseCalendar(String s) { /** * Parses the supplied xsd:duration value string and returns its value. - * + * * @param s A string representation of an xsd:duration value. * @return The {@link Duration} value represented by the supplied string argument. * @throws IllegalArgumentException If the supplied string is not a valid xsd:duration value. @@ -1963,9 +1963,9 @@ private static String trimPlusSign(String s) { /** * Maps a datatype QName from the javax.xml.namespace package to an XML Schema 1.0 URI for the corresponding * datatype. This method recognizes the XML Schema qname mentioned in {@link DatatypeConstants}. - * + * * Note that Java 8 / 11 do not have constants for XML Schema 1.1 datatypes like xsd:dateTimeStamp. - * + * * @param qname One of the XML Schema qnames from {@link DatatypeConstants}. * @return A URI for the specified datatype. * @throws IllegalArgumentException If the supplied qname was not recognized by this method. diff --git a/core/model/src/main/java/org/eclipse/rdf4j/model/datatypes/XMLDateTime.java b/core/model/src/main/java/org/eclipse/rdf4j/model/datatypes/XMLDateTime.java index fc0aa69b295..2fd97008320 100644 --- a/core/model/src/main/java/org/eclipse/rdf4j/model/datatypes/XMLDateTime.java +++ b/core/model/src/main/java/org/eclipse/rdf4j/model/datatypes/XMLDateTime.java @@ -19,7 +19,7 @@ *

* Known deviations from the standard: - the range of years in this implementation is limited to Integer.MIN_VALUE to * Integer.MAX_VALUE for practical reasons. - * + * * @author Arjohn Kampman * @author Jeen Broekstra * @see W3C XML Schema Definition Language (XSD) 1.1 Part 2: Datatypes @@ -102,7 +102,7 @@ public class XMLDateTime implements Cloneable, Comparable { /** * Creates a new XMLDateTime object for the supplied xsd:dateTime string value. - * + * * @param dateTimeString An xsd:dateTime lexical value, for example 1999-05-31T13:20:00-05:00. * @throws IllegalArgumentException if the supplied lexical value does not constitute a valid xsd:dateTime. */ @@ -276,7 +276,7 @@ private void validateFieldValues() { /** * Checks if the supplied month is a month with exactly 30 days. - * + * * @param month the month * @return {@code true} iff the supplied month has exactly 30 days. */ @@ -287,7 +287,7 @@ private boolean is30DayMonth(int month) { /** * Checks if the supplied year is a leap year (one in which February 29 occurs) according to the definition in * the XML Schema XSD definition - * + * * @param year the year. * @return {@code true} if the supplied year is a leap year according to the XSD definition. */ @@ -399,7 +399,7 @@ private String int2string(int iValue, int minDigits) { /** * Returns the xsd:dateTime string-representation of this object. - * + * * @return An xsd:dateTime value, e.g. 1999-05-31T13:20:00-05:00. */ @Override @@ -446,7 +446,7 @@ public String toString() { /** * Compares this DateTime object to another DateTime object. - * + * * @throws ClassCastException If other is not a DateTime object. */ @Override diff --git a/core/model/src/main/java/org/eclipse/rdf4j/model/impl/AbstractModel.java b/core/model/src/main/java/org/eclipse/rdf4j/model/impl/AbstractModel.java index 7b6de428601..2377fcfc590 100644 --- a/core/model/src/main/java/org/eclipse/rdf4j/model/impl/AbstractModel.java +++ b/core/model/src/main/java/org/eclipse/rdf4j/model/impl/AbstractModel.java @@ -49,9 +49,11 @@ public boolean isEmpty() { public boolean containsAll(Collection c) { Iterator e = c.iterator(); try { - while (e.hasNext()) - if (!contains(e.next())) + while (e.hasNext()) { + if (!contains(e.next())) { return false; + } + } return true; } finally { closeIterator(c, e); @@ -64,8 +66,9 @@ public boolean removeAll(Collection c) { if (size() > c.size()) { Iterator i = c.iterator(); try { - while (i.hasNext()) + while (i.hasNext()) { modified |= remove(i.next()); + } } finally { closeIterator(c, i); } @@ -121,8 +124,9 @@ public boolean addAll(Collection c) { try { boolean modified = false; while (e.hasNext()) { - if (add(e.next())) + if (add(e.next())) { modified = true; + } } return modified; } finally { @@ -451,8 +455,9 @@ public boolean removeAll(Collection c) { boolean modified = false; Iterator i = c.iterator(); try { - while (i.hasNext()) + while (i.hasNext()) { modified |= remove(i.next()); + } } finally { closeIterator(c, i); } @@ -491,9 +496,11 @@ public T[] toArray(T[] a) { public boolean containsAll(Collection c) { Iterator e = c.iterator(); try { - while (e.hasNext()) - if (!contains(e.next())) + while (e.hasNext()) { + if (!contains(e.next())) { return false; + } + } return true; } finally { closeIterator(c, e); @@ -506,8 +513,9 @@ public boolean addAll(Collection c) { try { boolean modified = false; while (e.hasNext()) { - if (add(e.next())) + if (add(e.next())) { modified = true; + } } return modified; } finally { @@ -555,7 +563,7 @@ private void closeIterator(Collection c, Iterator e) { /** * Called by aggregate sets when a term has been removed from a term iterator. Exactly one of the last four terms * will be non-empty. - * + * * @param iter The iterator used to navigate the live set (never null) * @param subj the subject term to be removed or null * @param pred the predicate term to be removed or null @@ -567,7 +575,7 @@ public abstract void removeTermIteration(Iterator iter, Resource subj /** * Cleans up any resources used by this iterator. After this call the given iterator should not be used. - * + * * @param iter Iterator to clean up */ protected void closeIterator(Iterator iter) { diff --git a/core/model/src/main/java/org/eclipse/rdf4j/model/impl/AbstractValueFactory.java b/core/model/src/main/java/org/eclipse/rdf4j/model/impl/AbstractValueFactory.java index eb79b6e33ed..01de3c91664 100644 --- a/core/model/src/main/java/org/eclipse/rdf4j/model/impl/AbstractValueFactory.java +++ b/core/model/src/main/java/org/eclipse/rdf4j/model/impl/AbstractValueFactory.java @@ -21,6 +21,7 @@ import org.eclipse.rdf4j.model.Literal; import org.eclipse.rdf4j.model.Resource; import org.eclipse.rdf4j.model.Statement; +import org.eclipse.rdf4j.model.Triple; import org.eclipse.rdf4j.model.Value; import org.eclipse.rdf4j.model.ValueFactory; import org.eclipse.rdf4j.model.datatypes.XMLDatatypeUtil; @@ -30,7 +31,7 @@ * Abstract base class for {@link ValueFactory} implementations. It implements all basic {@link Value} creation methods * by using the default implementations ({@link SimpleBNode}, {@link SimpleIRI}, etc), and type-optimized subclasses * (e.g. {@link BooleanLiteral}, {@link NumericLiteral}) where possible. - * + * * @author Arjohn Kampman * @author Jeen Broekstra */ @@ -126,6 +127,11 @@ public Statement createStatement(Resource subject, IRI predicate, Value object, return new ContextStatement(subject, predicate, object, context); } + @Override + public Triple createTriple(Resource subject, IRI predicate, Value object) { + return new SimpleTriple(subject, predicate, object); + } + /** * Generates a new bnode prefix and resets nextBNodeID to 1 . */ @@ -241,7 +247,7 @@ protected Literal createNumericLiteral(Number number, IRI datatype) { /** * Calls {@link ValueFactory#createLiteral(String, IRI)} with the String-value of the supplied calendar and the * appropriate datatype as parameters. - * + * * @see XMLGregorianCalendar#toXMLFormat() * @see XMLGregorianCalendar#getXMLSchemaType() * @see XMLDatatypeUtil#qnameToURI(javax.xml.namespace.QName) diff --git a/core/model/src/main/java/org/eclipse/rdf4j/model/impl/BooleanLiteral.java b/core/model/src/main/java/org/eclipse/rdf4j/model/impl/BooleanLiteral.java index 324e75500e3..ee5044f3427 100644 --- a/core/model/src/main/java/org/eclipse/rdf4j/model/impl/BooleanLiteral.java +++ b/core/model/src/main/java/org/eclipse/rdf4j/model/impl/BooleanLiteral.java @@ -11,7 +11,7 @@ /** * An extension of {@link SimpleLiteral} that stores a boolean value to avoid parsing. - * + * * @author David Huynh * @author Arjohn Kampman */ diff --git a/core/model/src/main/java/org/eclipse/rdf4j/model/impl/CalendarLiteral.java b/core/model/src/main/java/org/eclipse/rdf4j/model/impl/CalendarLiteral.java index 0062c71fb01..2afaf23c54d 100644 --- a/core/model/src/main/java/org/eclipse/rdf4j/model/impl/CalendarLiteral.java +++ b/core/model/src/main/java/org/eclipse/rdf4j/model/impl/CalendarLiteral.java @@ -13,7 +13,7 @@ /** * An extension of {@link SimpleLiteral} that stores a calendar value to avoid parsing. - * + * * @author David Huynh * @author Arjohn Kampman */ diff --git a/core/model/src/main/java/org/eclipse/rdf4j/model/impl/ContextStatement.java b/core/model/src/main/java/org/eclipse/rdf4j/model/impl/ContextStatement.java index f2f06afb79c..3e49059dfe5 100644 --- a/core/model/src/main/java/org/eclipse/rdf4j/model/impl/ContextStatement.java +++ b/core/model/src/main/java/org/eclipse/rdf4j/model/impl/ContextStatement.java @@ -33,7 +33,7 @@ public class ContextStatement extends SimpleStatement { /** * Creates a new Statement with the supplied subject, predicate and object for the specified associated context. - * + * * @param subject The statement's subject, must not be null. * @param predicate The statement's predicate, must not be null. * @param object The statement's object, must not be null. diff --git a/core/model/src/main/java/org/eclipse/rdf4j/model/impl/DecimalLiteral.java b/core/model/src/main/java/org/eclipse/rdf4j/model/impl/DecimalLiteral.java index 1716d47d44a..6f139e755ed 100644 --- a/core/model/src/main/java/org/eclipse/rdf4j/model/impl/DecimalLiteral.java +++ b/core/model/src/main/java/org/eclipse/rdf4j/model/impl/DecimalLiteral.java @@ -15,7 +15,7 @@ /** * An extension of {@link SimpleLiteral} that stores an integer value using a {@link BigDecimal} object. - * + * * @author Arjohn Kampman */ public class DecimalLiteral extends SimpleLiteral { diff --git a/core/model/src/main/java/org/eclipse/rdf4j/model/impl/DynamicModel.java b/core/model/src/main/java/org/eclipse/rdf4j/model/impl/DynamicModel.java new file mode 100644 index 00000000000..2275af5763c --- /dev/null +++ b/core/model/src/main/java/org/eclipse/rdf4j/model/impl/DynamicModel.java @@ -0,0 +1,383 @@ +/******************************************************************************* + * Copyright (c) 2020 Eclipse RDF4J contributors. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Distribution License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ + +package org.eclipse.rdf4j.model.impl; + +import java.util.Collection; +import java.util.Collections; +import java.util.Iterator; +import java.util.LinkedHashMap; +import java.util.LinkedHashSet; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; +import java.util.Set; + +import org.eclipse.rdf4j.model.IRI; +import org.eclipse.rdf4j.model.Model; +import org.eclipse.rdf4j.model.ModelFactory; +import org.eclipse.rdf4j.model.Namespace; +import org.eclipse.rdf4j.model.Resource; +import org.eclipse.rdf4j.model.Statement; +import org.eclipse.rdf4j.model.Value; +import org.eclipse.rdf4j.model.util.Models; +import org.eclipse.rdf4j.util.iterators.EmptyIterator; +import org.eclipse.rdf4j.util.iterators.SingletonIterator; + +/** + * A LinkedHashModel or a TreeModel achieves fast data access at the cost of higher indexing time. The DynamicModel + * postpones this cost until such access is actually needed. It stores all data in a LinkedHashMap and supports adding, + * retrieving and removing data. The model will upgrade to a full model (provided by the modelFactory) if more complex + * operations are called, for instance removing data according to a pattern (eg. all statements with rdf:type as + * predicate). + * + * DynamicModel is thread safe to the extent that the underlying LinkedHashMap or Model is. The upgrade path is + * protected by the actual upgrade method being synchronized. The LinkedHashMap storage is not removed once upgraded, so + * concurrent reads that have started reading from the LinkedHashMap can continue to read even during an upgrade. We do + * make the LinkedHashMap unmodifiable to reduce the chance of there being a bug. + * + * @author HÃ¥vard Mikkelsen Ottestad + */ +public class DynamicModel implements Model { + + private static final long serialVersionUID = -9162104133818983614L; + + private static final Resource[] NULL_CTX = new Resource[] { null }; + + private Map statements = new LinkedHashMap<>(); + final Set namespaces = new LinkedHashSet<>(); + + volatile private Model model = null; + + private final ModelFactory modelFactory; + + public DynamicModel(ModelFactory modelFactory) { + this.modelFactory = modelFactory; + } + + @Override + public Model unmodifiable() { + upgrade(); + return model.unmodifiable(); + } + + @Override + public Optional getNamespace(String prefix) { + for (Namespace nextNamespace : namespaces) { + if (prefix.equals(nextNamespace.getPrefix())) { + return Optional.of(nextNamespace); + } + } + return Optional.empty(); + } + + @Override + public Set getNamespaces() { + return namespaces; + } + + @Override + public Namespace setNamespace(String prefix, String name) { + removeNamespace(prefix); + Namespace result = new SimpleNamespace(prefix, name); + namespaces.add(result); + return result; + } + + @Override + public void setNamespace(Namespace namespace) { + removeNamespace(namespace.getPrefix()); + namespaces.add(namespace); + } + + @Override + public Optional removeNamespace(String prefix) { + Optional result = getNamespace(prefix); + result.ifPresent(namespaces::remove); + return result; + } + + @Override + public boolean contains(Resource subj, IRI pred, Value obj, Resource... contexts) { + upgrade(); + return model.contains(subj, pred, obj, contexts); + } + + @Override + public boolean add(Resource subj, IRI pred, Value obj, Resource... contexts) { + if (contexts.length == 0) { + contexts = NULL_CTX; + } + + if (model == null) { + boolean added = false; + for (Resource context : contexts) { + Statement statement = SimpleValueFactory.getInstance().createStatement(subj, pred, obj, context); + added = added + | statements.put(statement, statement) == null; + } + return added; + } else { + return model.add(subj, pred, obj, contexts); + } + } + + @Override + public boolean clear(Resource... context) { + upgrade(); + return model.clear(context); + } + + @Override + public boolean remove(Resource subj, IRI pred, Value obj, Resource... contexts) { + if (subj == null || pred == null || obj == null || contexts.length == 0) { + upgrade(); + } + + if (model == null) { + boolean removed = false; + for (Resource context : contexts) { + removed = removed + | statements.remove( + SimpleValueFactory.getInstance().createStatement(subj, pred, obj, context)) != null; + } + return removed; + } else { + return model.remove(subj, pred, obj, contexts); + } + } + + @Override + public Model filter(Resource subj, IRI pred, Value obj, Resource... contexts) { + upgrade(); + return model.filter(subj, pred, obj, contexts); + } + + @Override + public Set subjects() { + upgrade(); + return model.subjects(); + } + + @Override + public Set predicates() { + upgrade(); + return model.predicates(); + } + + @Override + public Set objects() { + upgrade(); + return model.objects(); + } + + @Override + public Set contexts() { + upgrade(); + return model.contexts(); + } + + @Override + public int size() { + if (model == null) { + return statements.size(); + } + return model.size(); + } + + @Override + public boolean isEmpty() { + if (model == null) { + return statements.isEmpty(); + } + return model.isEmpty(); + } + + @Override + public boolean contains(Object o) { + if (model == null) { + return statements.containsKey(o); + } + return model.contains(o); + } + + @Override + public Iterator iterator() { + if (model == null) { + return statements.values().iterator(); + } + + return model.iterator(); + } + + @Override + public Object[] toArray() { + if (model == null) { + return statements.values().toArray(); + } + return model.toArray(); + } + + @Override + public T[] toArray(T[] a) { + if (model == null) { + return statements.values().toArray(a); + } + return model.toArray(a); + } + + @Override + public boolean add(Statement statement) { + Objects.requireNonNull(statement); + if (model == null) { + return statements.put(statement, statement) == null; + } + return model.add(statement); + } + + @Override + public boolean remove(Object o) { + Objects.requireNonNull(o); + if (model == null) { + return statements.remove(o) != null; + } + return model.remove(o); + } + + @Override + public boolean containsAll(Collection c) { + Objects.requireNonNull(c); + if (model == null) { + return statements.keySet().containsAll(c); + } + return model.containsAll(c); + } + + @Override + public boolean addAll(Collection c) { + Objects.requireNonNull(c); + if (model == null) { + return c.stream() + .map(s -> { + Objects.requireNonNull(s); + return statements.put(s, s) == null; + }) + .reduce((a, b) -> a || b) + .orElse(false); + } + return model.addAll(c); + } + + @Override + public boolean retainAll(Collection c) { + if (model == null) { + return statements.keySet().retainAll(c); + } + return model.retainAll(c); + } + + @Override + public boolean removeAll(Collection c) { + if (model == null) { + return c + .stream() + .map(statements::remove) + .map(Objects::nonNull) + .reduce((a, b) -> a || b) + .orElse(false); + } + return model.removeAll(c); + } + + @Override + public void clear() { + if (model == null) { + statements.clear(); + } else { + model.clear(); + } + } + + @Override + public Iterable getStatements(Resource subject, IRI predicate, Value object, Resource... contexts) { + if (model == null && subject != null && predicate != null && object != null && contexts != null + && contexts.length == 1) { + Statement statement = SimpleValueFactory.getInstance() + .createStatement(subject, predicate, object, contexts[0]); + Statement foundStatement = statements.get(statement); + if (foundStatement == null) { + return EmptyIterator::new; + } + return () -> new SingletonIterator<>(foundStatement); + } else if (model == null && subject == null && predicate == null && object == null && contexts != null + && contexts.length == 0) { + return this; + } else { + upgrade(); + return model.getStatements(subject, predicate, object, contexts); + } + } + + private void upgrade() { + if (model == null) { + synchronizedUpgrade(); + } + } + + synchronized private void synchronizedUpgrade() { + if (model == null) { + // make statements unmodifiable first, to increase chance of an early failure if the user is doing + // concurrent write with reads + statements = Collections.unmodifiableMap(statements); + Model tempModel = modelFactory.createEmptyModel(); + tempModel.addAll(statements.values()); + model = tempModel; + } + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + + if (o instanceof Model) { + Model model = (Model) o; + return Models.isomorphic(this, model); + } else if (o instanceof Set) { + if (this.size() != ((Set) o).size()) { + return false; + } + try { + return Models.isomorphic(this, (Iterable) o); + } catch (ClassCastException e) { + return false; + } + } + + return false; + + } + + @Override + public int hashCode() { + if (model != null) { + return model.hashCode(); + } else { + int h = 0; + for (Statement obj : this) { + if (obj != null) { + h += obj.hashCode(); + } + } + return h; + + } + + } +} diff --git a/core/model/src/main/java/org/eclipse/rdf4j/model/impl/DynamicModelFactory.java b/core/model/src/main/java/org/eclipse/rdf4j/model/impl/DynamicModelFactory.java new file mode 100644 index 00000000000..86fc4f3c399 --- /dev/null +++ b/core/model/src/main/java/org/eclipse/rdf4j/model/impl/DynamicModelFactory.java @@ -0,0 +1,23 @@ +/******************************************************************************* + * Copyright (c) 2020 Eclipse RDF4J contributors. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Distribution License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ +package org.eclipse.rdf4j.model.impl; + +import org.eclipse.rdf4j.model.ModelFactory; + +/** + * Creates {@link DynamicModel}. + * + */ +public class DynamicModelFactory implements ModelFactory { + + @Override + public DynamicModel createEmptyModel() { + return new DynamicModel(new LinkedHashModelFactory()); + } + +} diff --git a/core/model/src/main/java/org/eclipse/rdf4j/model/impl/EmptyModel.java b/core/model/src/main/java/org/eclipse/rdf4j/model/impl/EmptyModel.java index a37567b93a1..1cb86e586a4 100644 --- a/core/model/src/main/java/org/eclipse/rdf4j/model/impl/EmptyModel.java +++ b/core/model/src/main/java/org/eclipse/rdf4j/model/impl/EmptyModel.java @@ -21,7 +21,7 @@ /** * Blocks access to the statements of the model, allowing only changes to the model's namespaces. - * + * * @author James Leigh */ public class EmptyModel extends AbstractModel { @@ -97,4 +97,4 @@ public void removeTermIteration(Iterator iter, Resource subj, IRI pre // remove nothing } -} \ No newline at end of file +} diff --git a/core/model/src/main/java/org/eclipse/rdf4j/model/impl/FilteredModel.java b/core/model/src/main/java/org/eclipse/rdf4j/model/impl/FilteredModel.java index 1556987efca..32a45b69834 100644 --- a/core/model/src/main/java/org/eclipse/rdf4j/model/impl/FilteredModel.java +++ b/core/model/src/main/java/org/eclipse/rdf4j/model/impl/FilteredModel.java @@ -189,7 +189,7 @@ public final void removeTermIteration(Iterator iter, Resource s, IRI /** * Called by aggregate sets when a term has been removed from a term iterator. At least one of the last four terms * will be non-empty. - * + * * @param iter The iterator used to navigate the live set (never null) * @param subj the subject term to be removed or null * @param pred the predicate term to be removed or null diff --git a/core/model/src/main/java/org/eclipse/rdf4j/model/impl/IntegerLiteral.java b/core/model/src/main/java/org/eclipse/rdf4j/model/impl/IntegerLiteral.java index 5ef75ae0dc6..be0c91caa74 100644 --- a/core/model/src/main/java/org/eclipse/rdf4j/model/impl/IntegerLiteral.java +++ b/core/model/src/main/java/org/eclipse/rdf4j/model/impl/IntegerLiteral.java @@ -15,7 +15,7 @@ /** * An extension of {@link SimpleLiteral} that stores an integer value using a {@link BigInteger} object. - * + * * @author Arjohn Kampman */ public class IntegerLiteral extends SimpleLiteral { diff --git a/core/model/src/main/java/org/eclipse/rdf4j/model/impl/LinkedHashModelFactory.java b/core/model/src/main/java/org/eclipse/rdf4j/model/impl/LinkedHashModelFactory.java index 4a08b49b622..c1da27f4dc0 100644 --- a/core/model/src/main/java/org/eclipse/rdf4j/model/impl/LinkedHashModelFactory.java +++ b/core/model/src/main/java/org/eclipse/rdf4j/model/impl/LinkedHashModelFactory.java @@ -7,14 +7,18 @@ *******************************************************************************/ package org.eclipse.rdf4j.model.impl; +import java.io.Serializable; + import org.eclipse.rdf4j.model.ModelFactory; /** * Creates {@link LinkedHashModel}. - * + * * @author James Leigh */ -public class LinkedHashModelFactory implements ModelFactory { +public class LinkedHashModelFactory implements ModelFactory, Serializable { + + private static final long serialVersionUID = -9152104133818783614L; @Override public LinkedHashModel createEmptyModel() { diff --git a/core/model/src/main/java/org/eclipse/rdf4j/model/impl/NumericLiteral.java b/core/model/src/main/java/org/eclipse/rdf4j/model/impl/NumericLiteral.java index 17327a90097..58f3f7cd3f3 100644 --- a/core/model/src/main/java/org/eclipse/rdf4j/model/impl/NumericLiteral.java +++ b/core/model/src/main/java/org/eclipse/rdf4j/model/impl/NumericLiteral.java @@ -13,7 +13,7 @@ /** * An extension of {@link SimpleLiteral} that stores a numeric value to avoid parsing. - * + * * @author David Huynh */ public class NumericLiteral extends SimpleLiteral { diff --git a/core/model/src/main/java/org/eclipse/rdf4j/model/impl/SimpleLiteral.java b/core/model/src/main/java/org/eclipse/rdf4j/model/impl/SimpleLiteral.java index 8f4fb11f6b0..8240cead350 100644 --- a/core/model/src/main/java/org/eclipse/rdf4j/model/impl/SimpleLiteral.java +++ b/core/model/src/main/java/org/eclipse/rdf4j/model/impl/SimpleLiteral.java @@ -23,7 +23,7 @@ /** * A simple default implementation of the {@link Literal} interface. - * + * * @author Arjohn Kampman * @author David Huynh */ @@ -63,7 +63,7 @@ protected SimpleLiteral() { /** * Creates a new plain literal with the supplied label. - * + * * @param label The label for the literal, must not be null. */ protected SimpleLiteral(String label) { @@ -73,7 +73,7 @@ protected SimpleLiteral(String label) { /** * Creates a new plain literal with the supplied label and language tag. - * + * * @param label The label for the literal, must not be null. * @param language The language tag for the literal, must not be null and not be empty. */ @@ -84,7 +84,7 @@ protected SimpleLiteral(String label, String language) { /** * Creates a new datatyped literal with the supplied label and datatype. - * + * * @param label The label for the literal, must not be null. * @param datatype The datatype for the literal. */ diff --git a/core/model/src/main/java/org/eclipse/rdf4j/model/impl/SimpleNamespace.java b/core/model/src/main/java/org/eclipse/rdf4j/model/impl/SimpleNamespace.java index 0598575ef92..6fa68a0e300 100644 --- a/core/model/src/main/java/org/eclipse/rdf4j/model/impl/SimpleNamespace.java +++ b/core/model/src/main/java/org/eclipse/rdf4j/model/impl/SimpleNamespace.java @@ -36,7 +36,7 @@ public class SimpleNamespace implements Namespace { /** * Creates a new Namespace object. - * + * * @param prefix The namespace's prefix. * @param name The namespace's name. */ @@ -51,7 +51,7 @@ public SimpleNamespace(String prefix, String name) { /** * Gets the prefix of the namespace. - * + * * @return prefix of the namespace */ @Override @@ -61,7 +61,7 @@ public String getPrefix() { /** * Sets the prefix of the namespace. - * + * * @param prefix The (new) prefix for this namespace. */ public void setPrefix(String prefix) { @@ -70,7 +70,7 @@ public void setPrefix(String prefix) { /** * Gets the name of the namespace. - * + * * @return name of the namespace */ @Override @@ -80,7 +80,7 @@ public String getName() { /** * Sets the name of the namespace. - * + * * @param name The (new) name for this namespace. */ public void setName(String name) { @@ -89,7 +89,7 @@ public void setName(String name) { /** * Returns a string representation of the object. - * + * * @return String representation of the namespace */ @Override diff --git a/core/model/src/main/java/org/eclipse/rdf4j/model/impl/SimpleStatement.java b/core/model/src/main/java/org/eclipse/rdf4j/model/impl/SimpleStatement.java index 51322ebf6a6..34118020fdd 100644 --- a/core/model/src/main/java/org/eclipse/rdf4j/model/impl/SimpleStatement.java +++ b/core/model/src/main/java/org/eclipse/rdf4j/model/impl/SimpleStatement.java @@ -17,7 +17,7 @@ /** * A simple default implementation of the {@link Statement} interface for statements that don't have an associated * context. For statements that do have an associated context, {@link ContextStatement} can be used. - * + * * @see org.eclipse.rdf4j.model.impl.SimpleValueFactory */ public class SimpleStatement implements Statement { @@ -53,7 +53,7 @@ public class SimpleStatement implements Statement { * Note that creating SimpleStatement objects directly via this constructor is not the recommended approach. * Instead, use a {@link org.eclipse.rdf4j.model.ValueFactory ValueFactory} (obtained from your repository or by * using {@link org.eclipse.rdf4j.model.impl.SimpleValueFactory#getInstance()}) to create new Statement objects. - * + * * @param subject The statement's subject, must not be null. * @param predicate The statement's predicate, must not be null. * @param object The statement's object, must not be null. diff --git a/core/model/src/main/java/org/eclipse/rdf4j/model/impl/SimpleTriple.java b/core/model/src/main/java/org/eclipse/rdf4j/model/impl/SimpleTriple.java new file mode 100644 index 00000000000..f2faeb461fc --- /dev/null +++ b/core/model/src/main/java/org/eclipse/rdf4j/model/impl/SimpleTriple.java @@ -0,0 +1,109 @@ +/******************************************************************************* + * Copyright (c) 2020 Eclipse RDF4J contributors. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Distribution License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ +package org.eclipse.rdf4j.model.impl; + +import java.util.Objects; + +import org.eclipse.rdf4j.model.IRI; +import org.eclipse.rdf4j.model.Resource; +import org.eclipse.rdf4j.model.Triple; +import org.eclipse.rdf4j.model.Value; + +/** + * A simple default implementation of the {@link Triple} interface. + * + * @author Pavel Mihaylov + * @see SimpleValueFactory + */ +public class SimpleTriple implements Triple { + + /** + * The triple's subject. + */ + private Resource subject; + + /** + * The triple's predicate. + */ + private IRI predicate; + + /** + * The triple's object. + */ + private Value object; + + /** + * Creates a new Triple with the supplied subject, predicate and object. + *

+ * Note that creating SimpleStatement objects directly via this constructor is not the recommended approach. + * Instead, use an instance of {@link org.eclipse.rdf4j.model.ValueFactory} to create new Triple objects. + * + * @param subject The triple's subject, must not be null. + * @param predicate The triple's predicate, must not be null. + * @param object The triple's object, must not be null. + * @see {@link SimpleValueFactory#createTriple(Resource, IRI, Value) + */ + protected SimpleTriple(Resource subject, IRI predicate, Value object) { + this.subject = Objects.requireNonNull(subject, "subject must not be null"); + this.predicate = Objects.requireNonNull(predicate, "predicate must not be null"); + this.object = Objects.requireNonNull(object, "object must not be null"); + } + + @Override + public Resource getSubject() { + return subject; + } + + @Override + public IRI getPredicate() { + return predicate; + } + + @Override + public Value getObject() { + return object; + } + + @Override + public String stringValue() { + StringBuilder sb = new StringBuilder(256); + + sb.append("<<"); + sb.append(getSubject()); + sb.append(" "); + sb.append(getPredicate()); + sb.append(" "); + sb.append(getObject()); + sb.append(">>"); + + return sb.toString(); + } + + @Override + public String toString() { + return stringValue(); + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o instanceof Triple) { + Triple that = (Triple) o; + return Objects.equals(subject, that.getSubject()) && Objects.equals(predicate, that.getPredicate()) + && Objects.equals(object, that.getObject()); + } + return false; + } + + @Override + public int hashCode() { + return Objects.hash(subject, predicate, object); + } +} diff --git a/core/model/src/main/java/org/eclipse/rdf4j/model/impl/SimpleValueFactory.java b/core/model/src/main/java/org/eclipse/rdf4j/model/impl/SimpleValueFactory.java index a503357b1a6..3e51e499d28 100644 --- a/core/model/src/main/java/org/eclipse/rdf4j/model/impl/SimpleValueFactory.java +++ b/core/model/src/main/java/org/eclipse/rdf4j/model/impl/SimpleValueFactory.java @@ -11,7 +11,7 @@ /** * Default implementation of the {@link ValueFactory} interface. - * + * * @author Arjohn Kampman */ public class SimpleValueFactory extends AbstractValueFactory { @@ -24,7 +24,7 @@ public class SimpleValueFactory extends AbstractValueFactory { /** * Provide a single shared instance of a SimpleValueFactory. - * + * * @return a singleton instance of SimpleValueFactory. */ public static SimpleValueFactory getInstance() { diff --git a/core/model/src/main/java/org/eclipse/rdf4j/model/impl/TreeModelFactory.java b/core/model/src/main/java/org/eclipse/rdf4j/model/impl/TreeModelFactory.java index 5d9be840e71..28c494badf3 100644 --- a/core/model/src/main/java/org/eclipse/rdf4j/model/impl/TreeModelFactory.java +++ b/core/model/src/main/java/org/eclipse/rdf4j/model/impl/TreeModelFactory.java @@ -11,7 +11,7 @@ /** * Creates {@link TreeModel}. - * + * * @author James Leigh */ public class TreeModelFactory implements ModelFactory { diff --git a/core/model/src/main/java/org/eclipse/rdf4j/model/impl/ValidatingValueFactory.java b/core/model/src/main/java/org/eclipse/rdf4j/model/impl/ValidatingValueFactory.java index 4f408144669..abe45595a16 100644 --- a/core/model/src/main/java/org/eclipse/rdf4j/model/impl/ValidatingValueFactory.java +++ b/core/model/src/main/java/org/eclipse/rdf4j/model/impl/ValidatingValueFactory.java @@ -20,6 +20,7 @@ import org.eclipse.rdf4j.model.Literal; import org.eclipse.rdf4j.model.Resource; import org.eclipse.rdf4j.model.Statement; +import org.eclipse.rdf4j.model.Triple; import org.eclipse.rdf4j.model.URI; import org.eclipse.rdf4j.model.Value; import org.eclipse.rdf4j.model.ValueFactory; @@ -222,6 +223,11 @@ public Statement createStatement(Resource subject, URI predicate, Value object, return delegate.createStatement(subject, predicate, object, context); } + @Override + public Triple createTriple(Resource subject, IRI predicate, Value object) { + return delegate.createTriple(subject, predicate, object); + } + private boolean isMember(int[][] set, int cp) { for (int i = 0; i < set.length; i++) { if (set[i][0] <= cp && cp <= set[i][1]) { diff --git a/core/model/src/main/java/org/eclipse/rdf4j/model/impl/ValueFactoryBase.java b/core/model/src/main/java/org/eclipse/rdf4j/model/impl/ValueFactoryBase.java index 684f97dd134..92b9a2af493 100644 --- a/core/model/src/main/java/org/eclipse/rdf4j/model/impl/ValueFactoryBase.java +++ b/core/model/src/main/java/org/eclipse/rdf4j/model/impl/ValueFactoryBase.java @@ -9,7 +9,7 @@ /** * Provided for backward compatility purposes only - * + * * @deprecated since 2.0. Use {@link AbstractValueFactory} instead. * @author Jeen Broekstra */ diff --git a/core/model/src/main/java/org/eclipse/rdf4j/model/package-info.java b/core/model/src/main/java/org/eclipse/rdf4j/model/package-info.java index c1593feba95..5a80f28f496 100644 --- a/core/model/src/main/java/org/eclipse/rdf4j/model/package-info.java +++ b/core/model/src/main/java/org/eclipse/rdf4j/model/package-info.java @@ -3,7 +3,7 @@ *

* The core RDF model interfaces are organized in the following hierarchy: *

- * + * *
  *        Value          Statement       Model
  *       /     \
@@ -23,7 +23,7 @@
  * Literal}, {@link org.eclipse.rdf4j.model.BNode BNode}, {@link org.eclipse.rdf4j.model.Statement Statement}) is done
  * by means of a {@link org.eclipse.rdf4j.model.ValueFactory ValueFactory}.
  * 

- * + * * @see rdf4j model documentation */ -package org.eclipse.rdf4j.model; \ No newline at end of file +package org.eclipse.rdf4j.model; diff --git a/core/model/src/main/java/org/eclipse/rdf4j/model/util/GetStatementOptional.java b/core/model/src/main/java/org/eclipse/rdf4j/model/util/GetStatementOptional.java index 75637293f3d..71cb378d912 100644 --- a/core/model/src/main/java/org/eclipse/rdf4j/model/util/GetStatementOptional.java +++ b/core/model/src/main/java/org/eclipse/rdf4j/model/util/GetStatementOptional.java @@ -16,7 +16,7 @@ /** * Either supplies a statement matching the given pattern, or {@link Optional#empty()} otherwise. - * + * * @author Peter Ansell */ @FunctionalInterface @@ -24,7 +24,7 @@ public interface GetStatementOptional { /** * Either supplies a statement matching the given pattern, or {@link Optional#empty()} otherwise. - * + * * @param subject A {@link Resource} to be used to match to statements. * @param predicate An {@link IRI} to be used to match to statements. * @param object A {@link Value} to be used to match to statements. diff --git a/core/model/src/main/java/org/eclipse/rdf4j/model/util/LexicalValueComparator.java b/core/model/src/main/java/org/eclipse/rdf4j/model/util/LexicalValueComparator.java index 6bfdbd26271..ef7c944aa20 100644 --- a/core/model/src/main/java/org/eclipse/rdf4j/model/util/LexicalValueComparator.java +++ b/core/model/src/main/java/org/eclipse/rdf4j/model/util/LexicalValueComparator.java @@ -15,13 +15,14 @@ import org.eclipse.rdf4j.model.BNode; import org.eclipse.rdf4j.model.IRI; import org.eclipse.rdf4j.model.Literal; +import org.eclipse.rdf4j.model.Triple; import org.eclipse.rdf4j.model.Value; import org.eclipse.rdf4j.model.datatypes.XMLDatatypeUtil; /** * A lexical rdf term Comparator, this class does not compare numerically and is therefore a bit faster than a SPARQL * compliant comparator. - * + * * @author james * @author Arjohn Kampman */ @@ -71,7 +72,20 @@ public int compare(Value o1, Value o2) { } // 4. RDF literals - return compareLiterals((Literal) o1, (Literal) o2); + boolean l1 = o1 instanceof Literal; + boolean l2 = o2 instanceof Literal; + if (l1 && l2) { + return compareLiterals((Literal) o1, (Literal) o2); + } + if (l1) { + return -1; + } + if (l2) { + return 1; + } + + // 5. RDF* triples + return compareTriples((Triple) o1, (Triple) o2); } private int compareBNodes(BNode leftBNode, BNode rightBNode) { @@ -158,4 +172,15 @@ private int compareDatatypes(IRI leftDatatype, IRI rightDatatype) { return compareURIs(leftDatatype, rightDatatype); } } -} \ No newline at end of file + + private int compareTriples(Triple leftTriple, Triple rightTriple) { + int c = compare(leftTriple.getSubject(), rightTriple.getSubject()); + if (c == 0) { + c = compare(leftTriple.getPredicate(), rightTriple.getPredicate()); + if (c == 0) { + c = compare(leftTriple.getObject(), rightTriple.getObject()); + } + } + return c; + } +} diff --git a/core/model/src/main/java/org/eclipse/rdf4j/model/util/LiteralUtilException.java b/core/model/src/main/java/org/eclipse/rdf4j/model/util/LiteralUtilException.java index 9a058023d24..2306094be76 100644 --- a/core/model/src/main/java/org/eclipse/rdf4j/model/util/LiteralUtilException.java +++ b/core/model/src/main/java/org/eclipse/rdf4j/model/util/LiteralUtilException.java @@ -11,7 +11,7 @@ /** * An exception thrown by {@link Literals} when specific conditions are not met. - * + * * @author Peter Ansell */ public class LiteralUtilException extends RDF4JException { diff --git a/core/model/src/main/java/org/eclipse/rdf4j/model/util/Literals.java b/core/model/src/main/java/org/eclipse/rdf4j/model/util/Literals.java index 550a62a9576..2d4d1e8f6ef 100644 --- a/core/model/src/main/java/org/eclipse/rdf4j/model/util/Literals.java +++ b/core/model/src/main/java/org/eclipse/rdf4j/model/util/Literals.java @@ -25,7 +25,7 @@ /** * Various utility methods related to {@link Literal}. - * + * * @author Arjohn Kampman * @author Peter Ansell */ @@ -34,7 +34,7 @@ public class Literals { /** * Gets the label of the supplied literal. The fallback value is returned in case the supplied literal is * null. - * + * * @param l The literal to get the label for. * @param fallback The value to fall back to in case the supplied literal is null. * @return Either the literal's label, or the fallback value. @@ -54,7 +54,7 @@ public static String getLabel(Value v, String fallback) { /** * Gets the byte value of the supplied literal. The fallback value is returned in case {@link Literal#byteValue()} * throws a {@link NumberFormatException}. - * + * * @param l The literal to get the byte value for. * @param fallback The value to fall back to in case no byte value could gotten from the literal. * @return Either the literal's byte value, or the fallback value. @@ -82,7 +82,7 @@ public static byte getByteValue(Value v, byte fallback) { /** * Gets the short value of the supplied literal. The fallback value is returned in case {@link Literal#shortValue()} * throws a {@link NumberFormatException}. - * + * * @param l The literal to get the short value for. * @param fallback The value to fall back to in case no short value could gotten from the literal. * @return Either the literal's short value, or the fallback value. @@ -110,7 +110,7 @@ public static short getShortValue(Value v, short fallback) { /** * Gets the int value of the supplied literal. The fallback value is returned in case {@link Literal#intValue()} * throws a {@link NumberFormatException}. - * + * * @param l The literal to get the int value for. * @param fallback The value to fall back to in case no int value could gotten from the literal. * @return Either the literal's int value, or the fallback value. @@ -138,7 +138,7 @@ public static int getIntValue(Value v, int fallback) { /** * Gets the long value of the supplied literal. The fallback value is returned in case {@link Literal#longValue()} * throws a {@link NumberFormatException}. - * + * * @param l The literal to get the long value for. * @param fallback The value to fall back to in case no long value could gotten from the literal. * @return Either the literal's long value, or the fallback value. @@ -166,7 +166,7 @@ public static long getLongValue(Value v, long fallback) { /** * Gets the integer value of the supplied literal. The fallback value is returned in case * {@link Literal#integerValue()} throws a {@link NumberFormatException}. - * + * * @param l The literal to get the integer value for. * @param fallback The value to fall back to in case no integer value could gotten from the literal. * @return Either the literal's integer value, or the fallback value. @@ -194,7 +194,7 @@ public static BigInteger getIntegerValue(Value v, BigInteger fallback) { /** * Gets the decimal value of the supplied literal. The fallback value is returned in case * {@link Literal#decimalValue()} throws a {@link NumberFormatException}. - * + * * @param l The literal to get the decimal value for. * @param fallback The value to fall back to in case no decimal value could gotten from the literal. * @return Either the literal's decimal value, or the fallback value. @@ -222,7 +222,7 @@ public static BigDecimal getDecimalValue(Value v, BigDecimal fallback) { /** * Gets the float value of the supplied literal. The fallback value is returned in case {@link Literal#floatValue()} * throws a {@link NumberFormatException}. - * + * * @param l The literal to get the float value for. * @param fallback The value to fall back to in case no float value could gotten from the literal. * @return Either the literal's float value, or the fallback value. @@ -250,7 +250,7 @@ public static float getFloatValue(Value v, float fallback) { /** * Gets the double value of the supplied literal. The fallback value is returned in case * {@link Literal#doubleValue()} throws a {@link NumberFormatException}. - * + * * @param l The literal to get the double value for. * @param fallback The value to fall back to in case no double value could gotten from the literal. * @return Either the literal's double value, or the fallback value. @@ -278,7 +278,7 @@ public static double getDoubleValue(Value v, double fallback) { /** * Gets the boolean value of the supplied literal. The fallback value is returned in case * {@link Literal#booleanValue()} throws a {@link NumberFormatException}. - * + * * @param l The literal to get the boolean value for. * @param fallback The value to fall back to in case no boolean value could gotten from the literal. * @return Either the literal's boolean value, or the fallback value. @@ -306,7 +306,7 @@ public static boolean getBooleanValue(Value v, boolean fallback) { /** * Gets the calendar value of the supplied literal. The fallback value is returned in case * {@link Literal#calendarValue()} throws a {@link NumberFormatException}. - * + * * @param l The literal to get the calendar value for. * @param fallback The value to fall back to in case no calendar value could gotten from the literal. * @return Either the literal's calendar value, or the fallback value. @@ -322,7 +322,7 @@ public static XMLGregorianCalendar getCalendarValue(Literal l, XMLGregorianCalen /** * Gets the {@link Duration} value of the supplied literal. The fallback value is returned in case * {@link XMLDatatypeUtil#parseDuration(String)} throws an exception. - * + * * @param l The literal to get the {@link Duration} value for. * @param fallback The value to fall back to in case no Duration value could gotten from the literal. * @return Either the literal's Duration value, or the fallback value. @@ -353,7 +353,7 @@ public static XMLGregorianCalendar getCalendarValue(Value v, XMLGregorianCalenda * representation of the supplied object as the value, and {@link XMLSchema#STRING} as the datatype. Recognized * types are {@link Boolean}, {@link Byte}, {@link Double}, {@link Float}, {@link Integer}, {@link Long}, * {@link Short}, {@link XMLGregorianCalendar } , and {@link Date}. - * + * * @param valueFactory * @param object an object to be converted to a typed literal. * @return a typed literal representation of the supplied object. @@ -373,7 +373,7 @@ public static Literal createLiteral(ValueFactory valueFactory, Object object) { * appropriate XML Schema type. If no mapping is available, the method throws a {@link LiteralUtilException}. * Recognized types are {@link Boolean}, {@link Byte}, {@link Double}, {@link Float}, {@link Integer}, {@link Long}, * {@link Short}, {@link XMLGregorianCalendar } , and {@link Date}. - * + * * @param valueFactory * @param object an object to be converted to a typed literal. * @return a typed literal representation of the supplied object. @@ -391,7 +391,7 @@ public static Literal createLiteralOrFail(ValueFactory valueFactory, Object obje * value, and {@link XMLSchema#STRING} as the datatype. Recognized types are {@link Boolean}, {@link Byte}, * {@link Double}, {@link Float}, {@link Integer}, {@link Long}, {@link Short}, {@link XMLGregorianCalendar } , and * {@link Date}. - * + * * @param valueFactory The {@link ValueFactory} to use when creating the result. * @param object an object to be converted to a typed literal. * @param throwExceptionOnFailure If true throws a {@link LiteralUtilException} when the object is not recognised. @@ -436,7 +436,7 @@ private static Literal createLiteral(ValueFactory valueFactory, Object object, b /** * Helper method for determining whether a literal could be created from an object using a {@link ValueFactory}. - * + * * @param object an object to check for the possibility of being converted to a typed literal. * @return True if a literal could be created from the given object, based solely on its type and the methods * available on the {@link ValueFactory} interface and false otherwise. Returns false if the object is null. @@ -461,7 +461,7 @@ public static boolean canCreateLiteral(Object object) { /** * Helper method to determine whether a literal is a language literal, and not a typed literal. - * + * * @param literal The literal to check * @return True if the literal has a language tag attached to it and false otherwise. */ @@ -472,7 +472,7 @@ public static boolean isLanguageLiteral(Literal literal) { /** * Normalizes the given BCP47 language tag according to the rules * defined by the JDK in the {@link Locale} API. - * + * * @param languageTag An unnormalized, valid, language tag * @return A normalized version of the given language tag * @throws IllformedLocaleException If the given language tag is ill-formed according to the rules specified in diff --git a/core/model/src/main/java/org/eclipse/rdf4j/model/util/ModelBuilder.java b/core/model/src/main/java/org/eclipse/rdf4j/model/util/ModelBuilder.java index edfd312c4bd..3337c90446c 100644 --- a/core/model/src/main/java/org/eclipse/rdf4j/model/util/ModelBuilder.java +++ b/core/model/src/main/java/org/eclipse/rdf4j/model/util/ModelBuilder.java @@ -36,14 +36,14 @@ * a {@link ModelBuilder} return an immutable reference to the current object, allowing method chaining. *

* Usage example: - * + * *

  * 
  *    ModelBuilder builder = new ModelBuilder();
- *    
+ *
  *    // set some namespaces 
  *    builder.setNamespace("ex", "http://example.org/").setNamespace(FOAF.NS);
- *    
+ *
  *    // add a new named graph to the model
  *    builder.namedGraph("ex:graph1")
  *               // add statements about resource ex:john
@@ -51,15 +51,15 @@
  *           	  .add(FOAF.NAME, "John") // add the triple (ex:john, foaf:name "John") to the named graph
  *           	  .add(FOAF.AGE, 42)
  *           	  .add(FOAF.MBOX, "john@example.org");
- *           
+ *
  *     // add a triple to the default graph
  *    builder.defaultGraph().subject("ex:graph1").add(RDF.TYPE, "ex:Graph");
- *    
+ *
  *    // return the Model object
  *    Model m = builder.build();
  * 
  * 
- * + * * @author Jeen Broekstra */ public class ModelBuilder { @@ -86,7 +86,7 @@ public ModelBuilder(Model model) { /** * Set the supplied {@link Namespace} mapping. - * + * * @param ns a {@link Namespace} to add to the model * @return the {@link ModelBuilder} */ @@ -97,7 +97,7 @@ public ModelBuilder setNamespace(Namespace ns) { /** * Set the namespace mapping defined by the supplied prefix and name - * + * * @param prefix prefix of the namespace to add to the model. * @param namespace namespace name to add to the model. * @return the {@link ModelBuilder} @@ -109,7 +109,7 @@ public ModelBuilder setNamespace(String prefix, String namespace) { /** * Set the subject resource about which statements are to be added to the model. - * + * * @param subject the subject resource about which statements are to be added. * @return the {@link ModelBuilder} */ @@ -121,7 +121,7 @@ public ModelBuilder subject(Resource subject) { /** * Set the subject about which statements are to be added to the model, defined by a prefixed name or an IRI * reference. - * + * * @param prefixedNameOrIri the subject resource about which statements are to be added. This can be defined either * as a prefixed name string (e.g. "ex:john"), or as a full IRI (e.g. * "http://example.org/john"). If supplied as a prefixed name, the {@link ModelBuilder} @@ -135,7 +135,7 @@ public ModelBuilder subject(String prefixedNameOrIri) { /** * Set the current graph in which to add new statements to the supplied named graph. This method resets the current * subject. - * + * * @param namedGraph a named graph identifier * @return this {@link ModelBuilder} */ @@ -148,7 +148,7 @@ public ModelBuilder namedGraph(Resource namedGraph) { /** * Set the current graph in which to add new statements to the supplied named graph. This method clears the current * subject. - * + * * @param prefixedNameOrIRI a named graph identifier. This can be defined either as a prefixed name string (e.g. * "ex:john"), or as a full IRI (e.g. "http://example.org/john"). If supplied as a prefixed * name, the {@link ModelBuilder} will need to have a namespace mapping for the prefix. @@ -161,7 +161,7 @@ public ModelBuilder namedGraph(String prefixedNameOrIRI) { /** * Set the current graph in which to add new statements to the default graph. This method clears the current * subject. - * + * * @return this {@link ModelBuilder} */ public ModelBuilder defaultGraph() { @@ -173,7 +173,7 @@ public ModelBuilder defaultGraph() { /** * Add an RDF statement with the given subject, predicate and object to the model, using the current graph (either * named or default). - * + * * @param subject the statement's subject * @param predicate the statement's predicate * @param object the statement's object. If the supplied object is a {@link BNode}, {@link IRI}, or @@ -214,7 +214,7 @@ public ModelBuilder add(Resource subject, IRI predicate, Object object) { /** * Add an RDF statement with the given subject, predicate and object to the model, using the current graph (either * named or default). - * + * * @param subject the statement's subject. This can be defined either as a prefixed name string (e.g. "ex:john"), * or as a full IRI (e.g. "http://example.org/john"). If supplied as a prefixed name, the * {@link ModelBuilder} will need to have a namespace mapping for the prefix. @@ -239,7 +239,7 @@ public ModelBuilder add(String subject, IRI predicate, Object object) { /** * Add an RDF statement with the given subject, predicate and object to the model, using the current graph (either * named or default). - * + * * @param subject the statement's subject. This can be defined either as a prefixed name string (e.g. "ex:john"), * or as a full IRI (e.g. "http://example.org/john"). If supplied as a prefixed name, the * {@link ModelBuilder} will need to have a namespace mapping for the prefix. @@ -266,7 +266,7 @@ public ModelBuilder add(String subject, String predicate, Object object) { /** * Add an RDF statement with the predicate and object to the model, using the current subject and graph (either * named or default). - * + * * @param predicate the statement's predicate. * @param object the statement's object. If the supplied object is a {@link BNode}, {@link IRI}, or * {@link Literal}, the object is used directly. If it is a prefixed name String with a known @@ -290,7 +290,7 @@ public ModelBuilder add(IRI predicate, Object object) { /** * Add an RDF statement with the predicate and object to the model, using the current subject and graph (either * named or default). - * + * * @param predicate the statement's predicate. This can be defined either as a prefixed name string (e.g. * "ex:john"), or as a full IRI (e.g. "http://example.org/john"). If supplied as a prefixed name, * the {@link ModelBuilder} will need to have a namespace mapping for the prefix. @@ -312,7 +312,7 @@ public ModelBuilder add(String predicate, Object object) { /** * Return the created {@link Model} - * + * * @return the {@link Model} */ public Model build() { @@ -321,7 +321,7 @@ public Model build() { /** * Convert the given prefixed name string to an IRI if possible. - * + * * @param prefixedName a prefixed name string, e.g. "rdf:type" * @return the IRI corresponding to the prefixed name, or {@code null} if the supplied string couldn't be converted. */ diff --git a/core/model/src/main/java/org/eclipse/rdf4j/model/util/ModelCollector.java b/core/model/src/main/java/org/eclipse/rdf4j/model/util/ModelCollector.java index 0973c4e0133..740cda090ad 100644 --- a/core/model/src/main/java/org/eclipse/rdf4j/model/util/ModelCollector.java +++ b/core/model/src/main/java/org/eclipse/rdf4j/model/util/ModelCollector.java @@ -18,13 +18,13 @@ import org.eclipse.rdf4j.model.Model; import org.eclipse.rdf4j.model.ModelFactory; import org.eclipse.rdf4j.model.Statement; -import org.eclipse.rdf4j.model.impl.LinkedHashModelFactory; +import org.eclipse.rdf4j.model.impl.DynamicModelFactory; import org.eclipse.rdf4j.model.impl.TreeModelFactory; /** * Collects a stream of Statements into a Model. By default a {@link org.eclipse.rdf4j.model.impl.LinkedHashModel * LinkedHashModel} will be returned. - * + * * @author Bart Hanssens */ public class ModelCollector implements Collector { @@ -34,12 +34,12 @@ public class ModelCollector implements Collector { * Constructor */ public ModelCollector() { - this.factory = new LinkedHashModelFactory(); + this.factory = new DynamicModelFactory(); } /** * Constructor - * + * * @param factory */ public ModelCollector(ModelFactory factory) { @@ -48,7 +48,7 @@ public ModelCollector(ModelFactory factory) { /** * Convenience method to obtain a ModelCollector. - * + * * @return a ModelCollector */ public static ModelCollector toModel() { @@ -57,7 +57,7 @@ public static ModelCollector toModel() { /** * Convenience method to obtain a ModelCollector, which will return a TreeModel. - * + * * @return a ModelCollector */ public static ModelCollector toTreeModel() { diff --git a/core/model/src/main/java/org/eclipse/rdf4j/model/util/ModelException.java b/core/model/src/main/java/org/eclipse/rdf4j/model/util/ModelException.java index b22336f0afd..0c2d10c4227 100644 --- a/core/model/src/main/java/org/eclipse/rdf4j/model/util/ModelException.java +++ b/core/model/src/main/java/org/eclipse/rdf4j/model/util/ModelException.java @@ -13,7 +13,7 @@ /** * An exception thrown by {@link org.eclipse.rdf4j.model.Model Model} and {@link org.eclipse.rdf4j.model.util.Models * Models} when specific conditions are not met. - * + * * @author Arjohn Kampman */ public class ModelException extends RDF4JException { diff --git a/core/model/src/main/java/org/eclipse/rdf4j/model/util/Models.java b/core/model/src/main/java/org/eclipse/rdf4j/model/util/Models.java index b847ea5c4e9..cfcfc237ae3 100644 --- a/core/model/src/main/java/org/eclipse/rdf4j/model/util/Models.java +++ b/core/model/src/main/java/org/eclipse/rdf4j/model/util/Models.java @@ -20,18 +20,26 @@ import java.util.Objects; import java.util.Optional; import java.util.Set; +import java.util.function.Consumer; import java.util.function.Supplier; import java.util.stream.Collectors; import java.util.stream.StreamSupport; +import org.eclipse.rdf4j.common.annotation.Experimental; import org.eclipse.rdf4j.model.BNode; import org.eclipse.rdf4j.model.IRI; import org.eclipse.rdf4j.model.Literal; import org.eclipse.rdf4j.model.Model; +import org.eclipse.rdf4j.model.ModelFactory; import org.eclipse.rdf4j.model.Resource; import org.eclipse.rdf4j.model.Statement; +import org.eclipse.rdf4j.model.Triple; import org.eclipse.rdf4j.model.Value; +import org.eclipse.rdf4j.model.ValueFactory; +import org.eclipse.rdf4j.model.impl.DynamicModelFactory; import org.eclipse.rdf4j.model.impl.LinkedHashModel; +import org.eclipse.rdf4j.model.impl.SimpleValueFactory; +import org.eclipse.rdf4j.model.vocabulary.RDF; /** * Utility functions for working with {@link Model}s and other {@link Statement} collections. @@ -49,44 +57,111 @@ public class Models { protected Models() { } + /** + * Retrieves an object {@link Value} from the supplied statements. If more than one possible object value exists, + * any one value is picked and returned. + * + * @param statements the {@link Statement } {@link Iterable} from which to retrieve an object value. + * @return an object value from the given statement collection, or {@link Optional#empty()} if no such value exists. + * @apiNote this method signature is new in 3.2.0, and is a generalization of {@link #object(Model)}. + */ + public static Optional object(Iterable statements) { + return StreamSupport.stream(statements.spliterator(), false).map(st -> st.getObject()).findAny(); + } + /** * Retrieves an object {@link Value} from the statements in the given model. If more than one possible object value * exists, any one value is picked and returned. * * @param m the model from which to retrieve an object value. * @return an object value from the given model, or {@link Optional#empty()} if no such value exists. + * @apiNote replaced in 3.2.0 with the more generic {@link #object(Iterable)}. This method signature kept for binary + * compatibility. + * */ public static Optional object(Model m) { - return m.stream().map(st -> st.getObject()).findAny(); + return object((Iterable) m); + } + + /** + * Retrieves an object {@link Literal} value from the supplied statements. If more than one possible Literal value + * exists, any one Literal value is picked and returned. + * + * @param statements the {@link Statement} {@link Iterable} from which to retrieve an object Literal value. + * @return an object Literal value from the given model, or {@link Optional#empty()} if no such value exists. + * @apiNote this method signature is new in 3.2.0, and is a generalization of {@link #objectLiteral(Model)}. + */ + public static Optional objectLiteral(Iterable statements) { + return StreamSupport.stream(statements.spliterator(), false) + .map(st -> st.getObject()) + .filter(o -> o instanceof Literal) + .map(l -> (Literal) l) + .findAny(); } /** * Retrieves an object {@link Literal} value from the statements in the given model. If more than one possible * Literal value exists, any one Literal value is picked and returned. * - * @param m the model from which to retrieve an object Literal value. + * @param m the {@link Model} from which to retrieve an object Literal value. * @return an object Literal value from the given model, or {@link Optional#empty()} if no such value exists. + * @apiNote replaced in 3.2.0 with the more generic {@link #objectLiteral(Iterable)}. This method signature kept for + * binary compatibility. */ public static Optional objectLiteral(Model m) { - return m.stream().map(st -> st.getObject()).filter(o -> o instanceof Literal).map(l -> (Literal) l).findAny(); + return objectLiteral((Iterable) m); } /** - * Retrieves all object {@link Literal} values from the statements in the given model. + * Retrieves all object {@link Literal} values from the supplied statements. * - * @param m the model from which to retrieve all object {@link Literal} values. + * @param statements the {@link Statement} {@link Iterable} from which to retrieve all object {@link Literal} + * values. * @return a {@link Set} containing object {@link Literal} values from the given model, which will be empty if no * such value exists. + * @apiNote this method signature is new in 3.2.0, and is a generalization of {@link #objectLiterals(Model)}. * @see Model#objects() */ - public static Set objectLiterals(Model m) { - return m.stream() + public static Set objectLiterals(Iterable statements) { + return StreamSupport.stream(statements.spliterator(), false) .map(st -> st.getObject()) .filter(o -> o instanceof Literal) .map(l -> (Literal) l) .collect(Collectors.toSet()); } + /** + * Retrieves all object {@link Literal} values from the statements in the given model. + * + * @param m the model from which to retrieve all object {@link Literal} values. + * @return a {@link Set} containing object {@link Literal} values from the given model, which will be empty if no + * such value exists. + * @apiNote replaced in 3.2.0 with the more generic {@link #objectLiterals(Iterable)}. This method signature kept + * for binary compatibility. + * + * @see Model#objects() + */ + public static Set objectLiterals(Model m) { + return objectLiterals((Iterable) m); + } + + /** + * Retrieves an object {@link Resource} value from the supplied statements. If more than one possible Resource value + * exists, any one Resource value is picked and returned. + * + * @param statements the {@link Statement} {@link Iterable} from which to retrieve an object Resource value. + * @return an {@link Optional} object Resource value from the given model, which will be {@link Optional#empty() + * empty} if no such value exists. + * @apiNote this method signature is new in 3.2.0, and is a generalization of {@link #objectResource(Model)}. + */ + public static Optional objectResource(Iterable statements) { + return StreamSupport.stream(statements.spliterator(), false) + .map(st -> st.getObject()) + .filter(o -> o instanceof Resource) + .map(r -> (Resource) r) + .findAny(); + } + /** * Retrieves an object {@link Resource} value from the statements in the given model. If more than one possible * Resource value exists, any one Resource value is picked and returned. @@ -94,21 +169,25 @@ public static Set objectLiterals(Model m) { * @param m the model from which to retrieve an object Resource value. * @return an {@link Optional} object Resource value from the given model, which will be {@link Optional#empty() * empty} if no such value exists. + * @apiNote replaced in 3.2.0 with the more generic {@link #objectResource(Iterable)}. This method signature kept + * for binary compatibility. */ public static Optional objectResource(Model m) { - return m.stream().map(st -> st.getObject()).filter(o -> o instanceof Resource).map(r -> (Resource) r).findAny(); + return objectResource((Iterable) m); } /** - * Retrieves all object {@link Resource} values from the statements in the given model. + * Retrieves all object {@link Resource} values from the supplied statements. * - * @param m the model from which to retrieve all object {@link Resource} values. + * @param statements the {@link Statement} {@link Iterable} from which to retrieve all object {@link Resource} + * values. * @return a {@link Set} containing object {@link Resource} values from the given model, which will be empty if no * such value exists. + * @apiNote this method signature is new in 3.2.0, and is a generalization of {@link #objectResources(Model)}. * @see Model#objects() */ - public static Set objectResources(Model m) { - return m.stream() + public static Set objectResources(Iterable statements) { + return StreamSupport.stream(statements.spliterator(), false) .map(st -> st.getObject()) .filter(o -> o instanceof Resource) .map(r -> (Resource) r) @@ -116,33 +195,94 @@ public static Set objectResources(Model m) { } /** - * Retrieves an object {@link IRI} value from the statements in the given model. If more than one possible IRI value - * exists, any one value is picked and returned. + * Retrieves all object {@link Resource} values from the supplied model. + * + * @param m the {@link Model} from which to retrieve all object {@link Resource} values. + * @return a {@link Set} containing object {@link Resource} values from the given model, which will be empty if no + * such value exists. + * @apiNote replaced in 3.2.0 with the more generic {@link #objectResources(Iterable)}. This method signature kept + * for binary compatibility. + * @see Model#objects() + */ + public static Set objectResources(Model m) { + return objectResources((Iterable) m); + } + + /** + * Retrieves an object {@link IRI} value from the supplied statements. If more than one possible IRI value exists, + * any one value is picked and returned. + * + * @param statements the {@link Statement} {@link Iterable} from which to retrieve an object IRI value. + * @return an {@link Optional} object IRI value from the given model, which will be {@link Optional#empty() empty} + * if no such value exists. + * @apiNote this method signature is new in 3.2.0, and is a generalization of {@link #objectIRI(Model)}. + */ + public static Optional objectIRI(Iterable statements) { + return StreamSupport.stream(statements.spliterator(), false) + .map(st -> st.getObject()) + .filter(o -> o instanceof IRI) + .map(r -> (IRI) r) + .findAny(); + } + + /** + * Retrieves an object {@link IRI} value from the supplied statements in the given model. If more than one possible + * IRI value exists, any one value is picked and returned. * * @param m the model from which to retrieve an object IRI value. * @return an {@link Optional} object IRI value from the given model, which will be {@link Optional#empty() empty} * if no such value exists. + * @apiNote replaced in 3.2.0 with the more generic {@link #objectIRI(Iterable)}. This method signature kept for + * binary compatibility. */ public static Optional objectIRI(Model m) { - return m.stream().map(st -> st.getObject()).filter(o -> o instanceof IRI).map(r -> (IRI) r).findAny(); + return objectIRI((Iterable) m); } /** - * Retrieves all object {@link IRI} values from the statements in the given model. + * Retrieves all object {@link IRI} values from the supplied statements. * - * @param m the model from which to retrieve all object IRI values. + * @param statements the {@link Statement} {@link Iterable} from which to retrieve all object IRI values. * @return a {@link Set} containing object IRI values from the given model, which will be empty if no such value * exists. + * @apiNote this method signature is new in 3.2.0, and is a generalization of {@link #objectIRIs(Model)}. * @see Model#objects() */ - public static Set objectIRIs(Model m) { - return m.stream() + public static Set objectIRIs(Iterable statements) { + return StreamSupport.stream(statements.spliterator(), false) .map(st -> st.getObject()) .filter(o -> o instanceof IRI) .map(r -> (IRI) r) .collect(Collectors.toSet()); } + /** + * Retrieves all object {@link IRI} values from the statements in the given model. + * + * @param m the {@link Model} from which to retrieve all object IRI values. + * @return a {@link Set} containing object IRI values from the given model, which will be empty if no such value + * exists. + * @apiNote replaced in 3.2.0 with the more generic {@link #objectIRIs(Iterable)}. This method signature kept for + * binary compatibility. + * @see Model#objects() + */ + public static Set objectIRIs(Model m) { + return objectIRIs((Iterable) m); + } + + /** + * Retrieves an object value as a String from the supplied statements. If more than one possible object value + * exists, any one value is picked and returned. + * + * @param statements the {@link Statement} {@link Iterable} from which to retrieve an object String value. + * @return an {@link Optional} object String value from the given model, which will be {@link Optional#empty() + * empty} if no such value exists. + * @apiNote this method signature is new in 3.2.0, and is a generalization of {@link #objectString(Model)}. + */ + public static Optional objectString(Iterable statements) { + return StreamSupport.stream(statements.spliterator(), false).map(st -> st.getObject().stringValue()).findAny(); + } + /** * Retrieves an object value as a String from the statements in the given model. If more than one possible object * value exists, any one value is picked and returned. @@ -150,9 +290,26 @@ public static Set objectIRIs(Model m) { * @param m the model from which to retrieve an object String value. * @return an {@link Optional} object String value from the given model, which will be {@link Optional#empty() * empty} if no such value exists. + * @apiNote replaced in 3.2.0 with the more generic {@link #objectString(Iterable)}. This method signature kept for + * binary compatibility. */ public static Optional objectString(Model m) { - return m.stream().map(st -> st.getObject().stringValue()).findAny(); + return objectString((Iterable) m); + } + + /** + * Retrieves all object String values from the supplied statements. + * + * @param statements the {@link Statement} {@link Iterable} from which to retrieve all object String values. + * @return a {@link Set} containing object String values from the given model, which will be empty if no such value + * exists. + * @apiNote this method signature is new in 3.2.0, and is a generalization of {@link #objectStrings(Model)}. + * @see Model#objects() + */ + public static Set objectStrings(Iterable statements) { + return StreamSupport.stream(statements.spliterator(), false) + .map(st -> st.getObject().stringValue()) + .collect(Collectors.toSet()); } /** @@ -161,10 +318,25 @@ public static Optional objectString(Model m) { * @param m the model from which to retrieve all object String values. * @return a {@link Set} containing object String values from the given model, which will be empty if no such value * exists. + * @apiNote replaced in 3.2.0 with the more generic {@link #objectStrings(Iterable)}. This method signature kept for + * binary compatibility. * @see Model#objects() */ public static Set objectStrings(Model m) { - return m.stream().map(st -> st.getObject().stringValue()).collect(Collectors.toSet()); + return objectStrings((Iterable) m); + } + + /** + * Retrieves a subject {@link Resource} from the supplied statements. If more than one possible resource value + * exists, any one resource value is picked and returned. + * + * @param statements the {@link Statement} {@link Iterable} from which to retrieve a subject Resource. + * @return an {@link Optional} subject resource from the given model, which will be {@link Optional#empty() empty} + * if no such value exists. + * @apiNote this method signature is new in 3.2.0, and is a generalization of {@link #subject(Model)}. + */ + public static Optional subject(Iterable statements) { + return StreamSupport.stream(statements.spliterator(), false).map(st -> st.getSubject()).findAny(); } /** @@ -174,9 +346,28 @@ public static Set objectStrings(Model m) { * @param m the model from which to retrieve a subject Resource. * @return an {@link Optional} subject resource from the given model, which will be {@link Optional#empty() empty} * if no such value exists. + * @apiNote replaced in 3.2.0 with the more generic {@link #subject(Iterable)}. This method signature kept for + * binary compatibility. */ public static Optional subject(Model m) { - return m.stream().map(st -> st.getSubject()).findAny(); + return subject((Iterable) m); + } + + /** + * Retrieves a subject {@link IRI} from the supplied statements. If more than one possible IRI value exists, any one + * IRI value is picked and returned. + * + * @param statements the {@link Statement} {@link Iterable} from which to retrieve a subject IRI value. + * @return an {@link Optional} subject IRI value from the given model, which will be {@link Optional#empty() empty} + * if no such value exists. + * @apiNote this method signature is new in 3.2.0, and is a generalization of {@link #subjectIRI(Model)}. + */ + public static Optional subjectIRI(Iterable statements) { + return StreamSupport.stream(statements.spliterator(), false) + .map(st -> st.getSubject()) + .filter(s -> s instanceof IRI) + .map(s -> (IRI) s) + .findAny(); } /** @@ -186,9 +377,26 @@ public static Optional subject(Model m) { * @param m the model from which to retrieve a subject IRI value. * @return an {@link Optional} subject IRI value from the given model, which will be {@link Optional#empty() empty} * if no such value exists. + * @apiNote replaced in 3.2.0 with the more generic {@link #subjectIRI(Iterable)}. This method signature kept for + * binary compatibility. */ public static Optional subjectIRI(Model m) { - return m.stream().map(st -> st.getSubject()).filter(s -> s instanceof IRI).map(s -> (IRI) s).findAny(); + return subjectIRI((Iterable) m); + } + + /** + * Retrieves all subject {@link IRI}s from the supplied statements. + * + * @param statements the {@link Statement} {@link Iterable} from which to retrieve a subject IRI value. + * @return a {@link Set} of subject IRI values from the given model. The returned Set may be empty. + * @apiNote this method signature is new in 3.2.0, and is a generalization of {@link #subjectIRIs(Model)}. + */ + public static Set subjectIRIs(Iterable statements) { + return StreamSupport.stream(statements.spliterator(), false) + .map(st -> st.getSubject()) + .filter(o -> o instanceof IRI) + .map(r -> (IRI) r) + .collect(Collectors.toSet()); } /** @@ -196,9 +404,28 @@ public static Optional subjectIRI(Model m) { * * @param m the model from which to retrieve a subject IRI value. * @return a {@link Set} of subject IRI values from the given model. The returned Set may be empty. + * @apiNote replaced in 3.2.0 with the more generic {@link #subjectIRIs(Iterable)}. This method signature kept for + * binary compatibility. */ public static Set subjectIRIs(Model m) { - return m.subjects().stream().filter(s -> s instanceof IRI).map(s -> (IRI) s).collect(Collectors.toSet()); + return subjectIRIs((Iterable) m); + } + + /** + * Retrieves a subject {@link BNode} from the supplied statements. If more than one possible blank node value + * exists, any one blank node value is picked and returned. + * + * @param statements the {@link Statement} {@link Iterable} from which to retrieve a subject BNode value. + * @return an {@link Optional} subject BNode value from the given model, which will be {@link Optional#empty() + * empty} if no such value exists. + * @apiNote this method signature is new in 3.2.0, and is a generalization of {@link #subjectBNode(Model)}. + */ + public static Optional subjectBNode(Iterable statements) { + return StreamSupport.stream(statements.spliterator(), false) + .map(st -> st.getSubject()) + .filter(s -> s instanceof BNode) + .map(s -> (BNode) s) + .findAny(); } /** @@ -208,9 +435,26 @@ public static Set subjectIRIs(Model m) { * @param m the model from which to retrieve a subject BNode value. * @return an {@link Optional} subject BNode value from the given model, which will be {@link Optional#empty() * empty} if no such value exists. + * @apiNote replaced in 3.2.0 with the more generic {@link #subjectBNode(Iterable)}. This method signature kept for + * binary compatibility. */ public static Optional subjectBNode(Model m) { - return m.stream().map(st -> st.getSubject()).filter(s -> s instanceof BNode).map(s -> (BNode) s).findAny(); + return subjectBNode((Iterable) m); + } + + /** + * Retrieves all subject {@link BNode}s from the supplied statements. + * + * @param statements the {@link Statement} {@link Iterable} from which to retrieve a subject IRI value. + * @return a {@link Set} of subject {@link BNode} values from the given model. The returned Set may be empty. + * @apiNote this method signature is new in 3.2.0, and is a generalization of {@link #subjectBNodes(Model)}. + */ + public static Set subjectBNodes(Iterable statements) { + return StreamSupport.stream(statements.spliterator(), false) + .map(st -> st.getSubject()) + .filter(o -> o instanceof BNode) + .map(r -> (BNode) r) + .collect(Collectors.toSet()); } /** @@ -218,9 +462,24 @@ public static Optional subjectBNode(Model m) { * * @param m the model from which to retrieve a subject IRI value. * @return a {@link Set} of subject {@link BNode} values from the given model. The returned Set may be empty. + * @apiNote replaced in 3.2.0 with the more generic {@link #subjectBNodes(Iterable)}. This method signature kept for + * binary compatibility. */ public static Set subjectBNodes(Model m) { - return m.subjects().stream().filter(s -> s instanceof BNode).map(s -> (BNode) s).collect(Collectors.toSet()); + return subjectBNodes((Iterable) m); + } + + /** + * Retrieves a predicate from the supplied statements. If more than one possible predicate value exists, any one + * value is picked and returned. + * + * @param statements the {@link Statement} {@link Iterable} from which to retrieve a predicate value. + * @return an {@link Optional} predicate value from the given model, which will be {@link Optional#empty() empty} if + * no such value exists. + * @apiNote this method signature is new in 3.2.0, and is a generalization of {@link #predicate(Model)}. + */ + public static Optional predicate(Iterable statements) { + return StreamSupport.stream(statements.spliterator(), false).map(st -> st.getPredicate()).findAny(); } /** @@ -230,9 +489,11 @@ public static Set subjectBNodes(Model m) { * @param m the model from which to retrieve a predicate value. * @return an {@link Optional} predicate value from the given model, which will be {@link Optional#empty() empty} if * no such value exists. + * @apiNote replaced in 3.2.0 with the more generic {@link #predicate(Iterable)}. This method signature kept for + * binary compatibility. */ public static Optional predicate(Model m) { - return m.stream().map(st -> st.getPredicate()).findAny(); + return predicate((Iterable) m); } /** @@ -275,7 +536,7 @@ public static Optional getProperty(Model m, Resource subject, IRI propert Objects.requireNonNull(m, "model may not be null"); Objects.requireNonNull(subject, "subject may not be null"); Objects.requireNonNull(property, "property may not be null"); - return object(m.filter(subject, property, null, contexts)); + return object(m.getStatements(subject, property, null, contexts)); } /** @@ -311,7 +572,7 @@ public static Optional getPropertyResource(Model m, Resource subject, Objects.requireNonNull(m, "model may not be null"); Objects.requireNonNull(subject, "subject may not be null"); Objects.requireNonNull(property, "property may not be null"); - return objectResource(m.filter(subject, property, null, contexts)); + return objectResource(m.getStatements(subject, property, null, contexts)); } /** @@ -328,7 +589,7 @@ public static Set getPropertyResources(Model m, Resource subject, IRI Objects.requireNonNull(m, "model may not be null"); Objects.requireNonNull(subject, "subject may not be null"); Objects.requireNonNull(property, "property may not be null"); - return objectResources(m.filter(subject, property, null, contexts)); + return objectResources(m.getStatements(subject, property, null, contexts)); } /** @@ -346,7 +607,7 @@ public static Optional getPropertyIRI(Model m, Resource subject, IRI proper Objects.requireNonNull(m, "model may not be null"); Objects.requireNonNull(subject, "subject may not be null"); Objects.requireNonNull(property, "property may not be null"); - return objectIRI(m.filter(subject, property, null, contexts)); + return objectIRI(m.getStatements(subject, property, null, contexts)); } /** @@ -363,7 +624,7 @@ public static Set getPropertyIRIs(Model m, Resource subject, IRI property, Objects.requireNonNull(m, "model may not be null"); Objects.requireNonNull(subject, "subject may not be null"); Objects.requireNonNull(property, "property may not be null"); - return objectIRIs(m.filter(subject, property, null, contexts)); + return objectIRIs(m.getStatements(subject, property, null, contexts)); } /** @@ -381,7 +642,7 @@ public static Optional getPropertyLiteral(Model m, Resource subject, IR Objects.requireNonNull(m, "model may not be null"); Objects.requireNonNull(subject, "subject may not be null"); Objects.requireNonNull(property, "property may not be null"); - return objectLiteral(m.filter(subject, property, null, contexts)); + return objectLiteral(m.getStatements(subject, property, null, contexts)); } /** @@ -398,7 +659,7 @@ public static Set getPropertyLiterals(Model m, Resource subject, IRI pr Objects.requireNonNull(m, "model may not be null"); Objects.requireNonNull(subject, "subject may not be null"); Objects.requireNonNull(property, "property may not be null"); - return objectLiterals(m.filter(subject, property, null, contexts)); + return objectLiterals(m.getStatements(subject, property, null, contexts)); } /** @@ -416,7 +677,7 @@ public static Optional getPropertyString(Model m, Resource subject, IRI Objects.requireNonNull(m, "model may not be null"); Objects.requireNonNull(subject, "subject may not be null"); Objects.requireNonNull(property, "property may not be null"); - return objectString(m.filter(subject, property, null, contexts)); + return objectString(m.getStatements(subject, property, null, contexts)); } /** @@ -433,7 +694,7 @@ public static Set getPropertyStrings(Model m, Resource subject, IRI prop Objects.requireNonNull(m, "model may not be null"); Objects.requireNonNull(subject, "subject may not be null"); Objects.requireNonNull(property, "property may not be null"); - return objectStrings(m.filter(subject, property, null, contexts)); + return objectStrings(m.getStatements(subject, property, null, contexts)); } /** @@ -507,7 +768,216 @@ public static Model stripContexts(Model model, Resource... contexts) { } else { return st; } - }).collect(Collectors.toCollection(LinkedHashModel::new)); + }).collect(ModelCollector.toModel()); + } + + /** + * Creates a {@link Supplier} of {@link ModelException} objects that be passed to + * {@link Optional#orElseThrow(Supplier)} to generate exceptions as necessary. + * + * @param message The message to be used for the exception + * @return A {@link Supplier} that will create {@link ModelException} objects with the given message. + */ + public static Supplier modelException(String message) { + return () -> new ModelException(message); + } + + /** + * Make a model thread-safe by synchronizing all its methods. Iterators will still not be thread-safe! + * + * @param toSynchronize the model that should be synchronized + * @return Synchronized Model + */ + public static Model synchronizedModel(Model toSynchronize) { + return new SynchronizedModel(toSynchronize); + } + + /** + * Converts the supplied RDF* model to RDF reification statements. The converted statements are sent to the supplied + * consumer function. + *

+ * The supplied value factory is used to create all new statements. + * + * @param vf the {@link ValueFactory} to use for creating statements. + * @param model the {@link Model} to convert. + * @param consumer the {@link Consumer} function for the produced statements. + */ + @Experimental + public static void convertRDFStarToReification(ValueFactory vf, Model model, Consumer consumer) { + model.forEach(st -> Statements.convertRDFStarToReification(vf, st, consumer)); + } + + /** + * Converts the supplied RDF* model to RDF reification statements. The converted statements are sent to the supplied + * consumer function. + * + * @param model the {@link Model} to convert. + * @param consumer the {@link Consumer} function for the produced statements. + */ + @Experimental + public static void convertRDFStarToReification(Model model, Consumer consumer) { + convertRDFStarToReification(SimpleValueFactory.getInstance(), model, consumer); + } + + /** + * Converts the statements in supplied RDF* model to a new RDF model using reificiation. + *

+ * The supplied value factory is used to create all new statements. + * + * @param vf the {@link ValueFactory} to use for creating statements. + * @param model the {@link Model} to convert. + * @return a new {@link Model} with RDF* statements converted to reified triples. + */ + @Experimental + public static Model convertRDFStarToReification(ValueFactory vf, Model model) { + Model reificationModel = new LinkedHashModel(); + convertRDFStarToReification(vf, model, (Consumer) reificationModel::add); + return reificationModel; + } + + /** + * Converts the statements in supplied RDF* model to a new RDF model using reificiation. + *

+ * The supplied value factory is used to create all new statements. + * + * @param vf the {@link ValueFactory} to use for creating statements. + * @param model the {@link Model} to convert. + * @param modelFactory the {@link ModelFactory} used to create the new output {@link Model}. + * @return a new {@link Model} with RDF* statements converted to reified triples. + */ + @Experimental + public static Model convertRDFStarToReification(ValueFactory vf, Model model, ModelFactory modelFactory) { + Model reificationModel = modelFactory.createEmptyModel(); + convertRDFStarToReification(vf, model, (Consumer) reificationModel::add); + return reificationModel; + } + + /** + * Converts the statements in the supplied RDF* model to a new RDF model using reification. + * + * @param model the {@link Model} to convert. + * @return a new {@link Model} with RDF* statements converted to reified triples. + */ + @Experimental + public static Model convertRDFStarToReification(Model model) { + return convertRDFStarToReification(SimpleValueFactory.getInstance(), model); + } + + /** + * Converts the supplied RDF reification model to RDF* statements. The converted statements are sent to the supplied + * consumer function. + *

+ * The supplied value factory is used to create all new statements. + * + * @param vf the {@link ValueFactory} to use for creating statements. + * @param model the {@link Model} to convert. + * @param consumer the {@link Consumer} function for the produced statements. + */ + @Experimental + public static void convertReificationToRDFStar(ValueFactory vf, Model model, Consumer consumer) { + Map convertedStatements = new HashMap<>(); + model.filter(null, RDF.TYPE, RDF.STATEMENT).forEach((s) -> { + Value subject = object(model.filter(s.getSubject(), RDF.SUBJECT, null)).orElse(null); + if (!(subject instanceof IRI) && !(subject instanceof BNode)) { + return; + } + Value predicate = object(model.filter(s.getSubject(), RDF.PREDICATE, null)).orElse(null); + if (!(predicate instanceof IRI)) { + return; + } + Value object = object(model.filter(s.getSubject(), RDF.OBJECT, null)).orElse(null); + if (!(object instanceof Value)) { + return; + } + Triple t = vf.createTriple((Resource) subject, (IRI) predicate, object); + convertedStatements.put(s.getSubject(), t); + }); + + for (Map.Entry e : convertedStatements.entrySet()) { + Triple t = e.getValue(); + Resource subject = convertedStatements.get(t.getSubject()); + Resource object = convertedStatements.get(t.getObject()); + if (subject != null || object != null) { + // Triples within triples, replace them in the map + Triple nt = vf.createTriple(subject != null ? subject : t.getSubject(), t.getPredicate(), + object != null ? object : t.getObject()); + e.setValue(nt); + } + } + + model.forEach((s) -> { + Resource subject = s.getSubject(); + IRI predicate = s.getPredicate(); + Value object = s.getObject(); + Triple subjectTriple = convertedStatements.get(subject); + Triple objectTriple = convertedStatements.get(object); + + if (subjectTriple == null && objectTriple == null) { + // Statement not part of detected reification, add it as is + consumer.accept(s); + } else if (subjectTriple == null || ((!RDF.TYPE.equals(predicate) || !RDF.STATEMENT.equals(object)) + && !RDF.SUBJECT.equals(predicate) && !RDF.PREDICATE.equals(predicate) + && !RDF.OBJECT.equals(predicate))) { + // Statement uses reified data and needs to be converted + Statement ns = vf.createStatement(subjectTriple != null ? subjectTriple : s.getSubject(), + s.getPredicate(), objectTriple != null ? objectTriple : s.getObject(), s.getContext()); + consumer.accept(ns); + } // else: Statement part of reification and needs to be removed (skipped) + }); + } + + /** + * Converts the supplied RDF reification model to RDF* statements. The converted statements are sent to the supplied + * consumer function. + * + * @param model the {@link Model} to convert. + * @param consumer the {@link Consumer} function for the produced statements. + */ + @Experimental + public static void convertReificationToRDFStar(Model model, Consumer consumer) { + convertReificationToRDFStar(SimpleValueFactory.getInstance(), model, consumer); + } + + /** + * Converts the statements in supplied RDF reification model to a new RDF* model. + *

+ * The supplied value factory is used to create all new statements. + * + * @param vf the {@link ValueFactory} to use for creating statements. + * @param model the {@link Model} to convert. + * @param modelFactory the {@link ModelFactory} to use for creating a new Model object for the output. + * @return a new {@link Model} with reification statements converted to RDF* {@link Triple}s. + */ + @Experimental + public static Model convertReificationToRDFStar(ValueFactory vf, Model model, ModelFactory modelFactory) { + Model rdfStarModel = modelFactory.createEmptyModel(); + convertReificationToRDFStar(vf, model, (Consumer) rdfStarModel::add); + return rdfStarModel; + } + + /** + * Converts the statements in supplied RDF reification model to a new RDF* model. + *

+ * The supplied value factory is used to create all new statements. + * + * @param vf the {@link ValueFactory} to use for creating statements. + * @param model the {@link Model} to convert. + * @return a new {@link Model} with reification statements converted to RDF* {@link Triple}s. + */ + @Experimental + public static Model convertReificationToRDFStar(ValueFactory vf, Model model) { + return convertReificationToRDFStar(vf, model, new DynamicModelFactory()); + } + + /** + * Converts the supplied RDF reification model to a new RDF* model. + * + * @param model the {@link Model} to convert. + * @return a new {@link Model} with reification statements converted to RDF* {@link Triple}s. + */ + @Experimental + public static Model convertReificationToRDFStar(Model model) { + return convertReificationToRDFStar(SimpleValueFactory.getInstance(), model); } private static boolean isSubsetInternal(Set model1, Model model2) { @@ -733,24 +1203,4 @@ private static Set toSet(Iterable iterable) { } - /** - * Creates a {@link Supplier} of {@link ModelException} objects that be passed to - * {@link Optional#orElseThrow(Supplier)} to generate exceptions as necessary. - * - * @param message The message to be used for the exception - * @return A {@link Supplier} that will create {@link ModelException} objects with the given message. - */ - public static Supplier modelException(String message) { - return () -> new ModelException(message); - } - - /** - * Make a model thread-safe by synchronizing all its methods. Iterators will still not be thread-safe! - * - * @param toSynchronize the model that should be synchronized - * @return Synchronized Model - */ - public static Model synchronizedModel(Model toSynchronize) { - return new SynchronizedModel(toSynchronize); - } -} \ No newline at end of file +} diff --git a/core/model/src/main/java/org/eclipse/rdf4j/model/util/Namespaces.java b/core/model/src/main/java/org/eclipse/rdf4j/model/util/Namespaces.java index ad3ce64b4b0..27124aeb0f3 100644 --- a/core/model/src/main/java/org/eclipse/rdf4j/model/util/Namespaces.java +++ b/core/model/src/main/java/org/eclipse/rdf4j/model/util/Namespaces.java @@ -23,7 +23,7 @@ /** * A utility class to perform operations on {@link Namespace}s. - * + * * @author Peter Ansell */ public class Namespaces { @@ -31,7 +31,7 @@ public class Namespaces { /** * Converts a set of {@link Namespace}s into a map containing the {@link Namespace#getPrefix()} strings as keys, * with the {@link Namespace#getName()} strings as values in the map for each namespace in the given set. - * + * * @param namespaces The {@link Set} of {@link Namespace}s to transform. * @return A {@link Map} of {@link String} to {@link String} where the key/value combinations are created based on * the prefix and names from {@link Namespace}s in the input set. @@ -50,7 +50,7 @@ public static Map asMap(Set namespaces) { * Wraps the given {@link Set} of {@link Namespace}s as a {@link Map} of prefix to URI mappings, so that it can be * used where a {@link Map} is required by the API.
* NOTE: The Map returned by this method is not synchronized. - * + * * @param namespaces The Set to wrap. * @return A Map of prefix to URI mappings which is backed by the given Set of {@link Namespace}s. */ diff --git a/core/model/src/main/java/org/eclipse/rdf4j/model/util/PatternIterator.java b/core/model/src/main/java/org/eclipse/rdf4j/model/util/PatternIterator.java index b7f2c41b5a8..272e5c70c6c 100644 --- a/core/model/src/main/java/org/eclipse/rdf4j/model/util/PatternIterator.java +++ b/core/model/src/main/java/org/eclipse/rdf4j/model/util/PatternIterator.java @@ -75,15 +75,16 @@ private void findNextElement() { @Override public void remove() { - if (!nextCalled) + if (!nextCalled) { throw new IllegalStateException(); + } filteredIter.remove(); } /** * Tests whether or not the specified statement should be returned by this iterator. All objects from the wrapped * iterator pass through this method in the same order as they are coming from the wrapped iterator. - * + * * @param st The statement to be tested. * @return true if the object should be returned, false otherwise. */ diff --git a/core/model/src/main/java/org/eclipse/rdf4j/model/util/RDFCollections.java b/core/model/src/main/java/org/eclipse/rdf4j/model/util/RDFCollections.java index 430e05be809..6fa6aa22c9f 100644 --- a/core/model/src/main/java/org/eclipse/rdf4j/model/util/RDFCollections.java +++ b/core/model/src/main/java/org/eclipse/rdf4j/model/util/RDFCollections.java @@ -36,7 +36,7 @@ * using the {@link RDF#NIL} node. *

* As an example, a list containing three literal values "A", "B", and "C" looks like this as an RDF Collection: - * + * *

  *   _:n1 -rdf:type--> rdf:List
  *     |
@@ -51,7 +51,7 @@
  *
  * Here, {@code _:n1} is the head resource of the list. Note that in this example it is declared an instance of
  * {@link RDF#LIST}, however this is not required for the collection to be considered well-formed.
- * 
+ *
  * @author Jeen Broekstra
  * @see RDF Schema 1.1 section on Collection
  *      vocabulary.
@@ -62,7 +62,7 @@ public class RDFCollections {
 	 * Converts the supplied {@link Iterable} to an RDF
 	 * Collection, using the supplied {@code head} resource as the starting resource of the RDF Collection. The
 	 * statements making up the new RDF Collection will be added to the supplied statement collection.
-	 * 
+	 *
 	 * @param values   an {@link Iterable} of objects (such as a Java {@link Collection} ), which will be converted to
 	 *                 an RDF Collection. May not be {@code null}. The method attempts to convert each value that is not
 	 *                 already an instance of {@link Value} to a {@link Literal}. This conversion will fail with a
@@ -92,7 +92,7 @@ public static > C asRDF(Iterable values, Reso
 	 * Converts the supplied {@link Iterable} to an RDF
 	 * Collection, using the supplied {@code head} resource as the starting resource of the RDF Collection. The
 	 * statements making up the new RDF Collection will be added to the supplied statement collection.
-	 * 
+	 *
 	 * @param values       an {@link Iterable} of objects (such as a Java {@link Collection} ), which will be converted
 	 *                     to an RDF Collection. May not be {@code null}. The method attempts to convert each value that
 	 *                     is not already an instance of {@link Value} to a {@link Literal}. This conversion will fail
@@ -113,7 +113,7 @@ public static > C asRDF(Iterable values, Reso
 	 * @throws LiteralUtilException if one of the supplied values can not be converted to a Literal.
 	 * @see RDF Schema 1.1 section on Collection
 	 *      vocabulary.
-	 * 
+	 *
 	 * @since 3.0
 	 */
 	public static > C asRDF(Iterable values, Resource head, C sink,
@@ -128,7 +128,7 @@ public static > C asRDF(Iterable values, Reso
 	 * the supplied {@link Model} and {@code head}. This method expects the RDF Collection to be well-formed. If the
 	 * collection is not well-formed the method may return part of the collection, or may throw a
 	 * {@link ModelException}.
-	 * 
+	 *
 	 * @param m          the Model containing the collection to read.
 	 * @param head       the {@link Resource} that represents the list head, that is the start resource of the RDF
 	 *                   Collection to be read. May not be {@code null}.
@@ -154,7 +154,7 @@ public static > C asValues(final Model m, Resource h
 	 * Converts the supplied {@link Iterable} to an RDF
 	 * Collection, using the supplied {@code head} resource as the starting resource of the RDF Collection. The
 	 * statements making up the new RDF Collection will be reported to the supplied {@link Consumer} function.
-	 * 
+	 *
 	 * @param values   an {@link Iterable} of objects (such as a Java {@link Collection} ), which will be converted to
 	 *                 an RDF Collection. May not be {@code null}. The method attempts to convert each value that is not
 	 *                 already an instance of {@link Value} to a {@link Literal}. This conversion will fail with a
@@ -180,7 +180,7 @@ public static void consumeCollection(Iterable values, Resource head, Consumer
 	 * Converts the supplied {@link Iterable} to an RDF
 	 * Collection, using the supplied {@code head} resource as the starting resource of the RDF Collection. The
 	 * statements making up the new RDF Collection will be reported to the supplied {@link Consumer} function.
-	 * 
+	 *
 	 * @param values   an {@link Iterable} of objects (such as a Java {@link Collection} ), which will be converted to
 	 *                 an RDF Collection. May not be {@code null}. The method attempts to convert each value that is not
 	 *                 already an instance of {@link Value} to a {@link Literal}. This conversion will fail with a
@@ -197,7 +197,7 @@ public static void consumeCollection(Iterable values, Resource head, Consumer
 	 * @see RDF Schema 1.1 section on Collection
 	 *      vocabulary.
 	 * @see Literals#createLiteralOrFail(ValueFactory, Object)
-	 * 
+	 *
 	 * @since 3.0
 	 */
 	public static void consumeCollection(Iterable values, Resource head, Consumer consumer,
@@ -231,7 +231,7 @@ public static void consumeCollection(Iterable values, Resource head, Consumer
 	 * collection member {@link Value} to the supplied {@link Consumer} function. This method expects the RDF Collection
 	 * to be well-formed. If the collection is not well-formed the method may report only part of the collection, or may
 	 * throw a {@link ModelException}.
-	 * 
+	 *
 	 * @param m        the Model containing the collection to read.
 	 * @param head     the {@link Resource} that represents the list head, that is the start resource of the RDF
 	 *                 Collection to be read. May not be {@code null}.
@@ -262,7 +262,7 @@ public static void consumeValues(final Model m, Resource head, Consumer c
 	 * Extracts the RDF Collection starting with the
 	 * supplied {@code head} resource from the supplied source {@link Model}. The statements making up the RDF
 	 * Collection will be added to the supplied statement collection, which will also be returned.
-	 * 
+	 *
 	 * @param sourceModel the source model, containing the RDF Collection to be read.
 	 * @param head        the {@link Resource} that represents the list head, that is the start resource of the RDF
 	 *                    Collection to be read. May not be {@code null}. a {@link Collection} of {@link Statement}
@@ -286,7 +286,7 @@ public static > C getCollection(Model sourceMode
 	 * Extracts the RDF Collection starting with
 	 * supplied {@code head} resource from the supplied source {@link Model} and sends the statements that make up the
 	 * collection to the supplied {@link Consumer}.
-	 * 
+	 *
 	 * @param sourceModel the source model, containing the RDF Collection to be read.
 	 * @param head        the {@link Resource} that represents the list head, that is the start resource of the RDF
 	 *                    Collection to be read. May not be {@code null}. a {@link Collection} of {@link Statement}
@@ -309,7 +309,7 @@ public static void extract(Model sourceModel, Resource head, Consumer
 	 * statements that make up the collection to the supplied {@link Consumer} function. This method expects the RDF
 	 * Collection to be well-formed. If the collection is not well-formed the method may report only part of the
 	 * collection, or may throw an exception.
-	 * 
+	 *
 	 * @param statementSupplier  the source of the statements from which the RDF collection is to be read, specified as
 	 *                           a functional interface.
 	 * @param head               the {@link Resource} that represents the list head, that is the start resource of the
diff --git a/core/model/src/main/java/org/eclipse/rdf4j/model/util/Statements.java b/core/model/src/main/java/org/eclipse/rdf4j/model/util/Statements.java
index 14066cf3d68..42029755330 100644
--- a/core/model/src/main/java/org/eclipse/rdf4j/model/util/Statements.java
+++ b/core/model/src/main/java/org/eclipse/rdf4j/model/util/Statements.java
@@ -7,17 +7,23 @@
  *******************************************************************************/
 package org.eclipse.rdf4j.model.util;
 
+import java.nio.charset.StandardCharsets;
+import java.util.Base64;
 import java.util.Collection;
 import java.util.Objects;
 import java.util.function.Consumer;
+import java.util.function.Function;
 
 import org.eclipse.rdf4j.OpenRDFUtil;
+import org.eclipse.rdf4j.common.annotation.Experimental;
 import org.eclipse.rdf4j.model.IRI;
 import org.eclipse.rdf4j.model.Resource;
 import org.eclipse.rdf4j.model.Statement;
+import org.eclipse.rdf4j.model.Triple;
 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;
 
 /**
  * Utility methods for {@link Statement} objects.
@@ -26,11 +32,22 @@
  */
 public class Statements {
 
+	/**
+	 * A {@link Function} that maps {@link Triple} to {@link org.eclipse.rdf4j.model.BNode} consistently. Multiple
+	 * invocations for the same {@link Triple} will return the same {@link org.eclipse.rdf4j.model.BNode}.
+	 *
+	 * The current implementation creates a {@link org.eclipse.rdf4j.model.BNode} by encoding the string representation
+	 * of the {@link Triple} using base64 URL-safe encoding.
+	 */
+	@Experimental
+	public static Function TRIPLE_BNODE_MAPPER = (t) -> SimpleValueFactory.getInstance()
+			.createBNode(Base64.getUrlEncoder().encodeToString(t.stringValue().getBytes(StandardCharsets.UTF_8)));
+
 	/**
 	 * Creates one or more {@link Statement} objects with the given subject, predicate and object, one for each given
 	 * context, and sends each created statement to the supplied {@link Consumer}. If no context is supplied, only a
 	 * single statement (without any assigned context) is created.
-	 * 
+	 *
 	 * @param vf        the {@link ValueFactory} to use for creating statements.
 	 * @param subject   the subject of each statement. May not be null.
 	 * @param predicate the predicate of each statement. May not be null.
@@ -56,7 +73,7 @@ public static void consume(ValueFactory vf, Resource subject, IRI predicate, Val
 	/**
 	 * Creates one or more {@link Statement} objects with the given subject, predicate and object, one for each given
 	 * context. If no context is supplied, only a single statement (without any assigned context) is created.
-	 * 
+	 *
 	 * @param vf         the {@link ValueFactory} to use for creating statements.
 	 * @param subject    the subject of each statement. May not be null.
 	 * @param predicate  the predicate of each statement. May not be null.
@@ -77,10 +94,10 @@ public static > C create(ValueFactory vf, Resour
 	/**
 	 * Strips the context (if any) from the supplied statement and returns a statement with the same subject, predicate
 	 * and object, but with no assigned context.
-	 * 
+	 *
 	 * @param statement the statement to strip the context from
 	 * @return a statement without context
-	 * 
+	 *
 	 * @since 3.1.0
 	 */
 	public static Statement stripContext(Statement statement) {
@@ -90,11 +107,11 @@ public static Statement stripContext(Statement statement) {
 	/**
 	 * Strips the context (if any) from the supplied statement and returns a statement with the same subject, predicate
 	 * and object, but with no assigned context.
-	 * 
+	 *
 	 * @param vf        the {@link ValueFactory} to use for creating a new {@link Statement}.
 	 * @param statement the statement to strip the context from.
 	 * @return a statement without context
-	 * 
+	 *
 	 * @since 3.1.0
 	 */
 	public static Statement stripContext(ValueFactory vf, Statement statement) {
@@ -107,7 +124,7 @@ public static Statement stripContext(ValueFactory vf, Statement statement) {
 	/**
 	 * Checks if the two statements represent the same triple (that is, they have equal subject, predicate, and object).
 	 * Context information is disregarded.
-	 * 
+	 *
 	 * @param st1 the first statement to compare. May not be null.
 	 * @param st2 the second statement to compare. May not be null.
 	 * @return {@code true} iff the subject, predicate and object of {@code st1} and {@code st2} are equal,
@@ -121,4 +138,96 @@ public static boolean isSameTriple(Statement st1, Statement st2) {
 		return st1.getPredicate().equals(st2.getPredicate()) && st1.getSubject().equals(st2.getSubject())
 				&& st1.getObject().equals(st2.getObject());
 	}
+
+	/**
+	 * Converts the supplied RDF* statement to RDF reification statements, and sends the resultant statements to the
+	 * supplied consumer. If the supplied statement is not RDF* it will be sent to the consumer as is.
+	 * 

+ * The statements needed to represent reification will use blank nodes. + * + * @param st the {@link Statement} to convert. + * @param consumer the {@link Consumer} function for the produced statements. + */ + @Experimental + public static void convertRDFStarToReification(Statement st, Consumer consumer) { + convertRDFStarToReification(SimpleValueFactory.getInstance(), st, consumer); + } + + /** + * Converts the supplied RDF* statement to RDF reification statements, and sends the resultant statements to the + * supplied consumer. If the supplied statement is not RDF* it will be sent to the consumer as is. + *

+ * The statements needed to represent reification will use blank nodes. + *

+ * The supplied value factory is used to create all new statements and blank nodes. + * + * @param vf the {@link ValueFactory} to use for creating statements. + * @param st the {@link Statement} to convert. + * @param consumer the {@link Consumer} function for the produced statements. + */ + @Experimental + public static void convertRDFStarToReification(ValueFactory vf, Statement st, Consumer consumer) { + convertRDFStarToReification(vf, TRIPLE_BNODE_MAPPER, st, consumer); + } + + /** + * Converts the supplied RDF* statement to RDF reification statements, and sends the resultant statements to the + * supplied consumer. If the supplied statement is not RDF* it will be sent to the consumer as is. + *

+ * The supplied value factory is used to create all new statements. + *

+ * The supplied mapper function maps a {@link Triple} to a {@link Resource} and is used to create the ID of the RDF + * reification statement corresponding to the converted triple. The function must return the same value for + * identical triples in order to produce consistent results between invocations. See {@link #TRIPLE_BNODE_MAPPER}. + * + * @param vf the {@link ValueFactory} to use for creating statements. + * @param reifiedIdMapper the mapper {@link Function} from {@link Triple} to {@link Resource}. + * @param st the {@link Statement} to convert, + * @param consumer the {@link Consumer} function for the produced statements. + */ + @Experimental + public static void convertRDFStarToReification(ValueFactory vf, Function reifiedIdMapper, + Statement st, Consumer consumer) { + Resource subject = st.getSubject(); + Value object = st.getObject(); + if (subject instanceof Triple || object instanceof Triple) { + if (subject instanceof Triple) { + subject = createReifiedStatement(vf, reifiedIdMapper, (Triple) subject, st.getContext(), consumer); + } + if (object instanceof Triple) { + object = createReifiedStatement(vf, reifiedIdMapper, (Triple) object, st.getContext(), consumer); + } + st = vf.createStatement(subject, st.getPredicate(), object, st.getContext()); + } + consumer.accept(st); + } + + /** + * Converts the supplied RDF* triple to a series of RDF reification statements and sends the statements to the + * supplied consumer. The subject of the created statements is returned. + *

+ * The supplied value factory is used to create all new statements. + *

+ * The supplied mapper function maps a {@link Triple} to a {@link Resource} and is used to create the ID of the RDF + * reification statement corresponding to the converted triple. + * + * @param vf the {@link ValueFactory} to use for creating statements. + * @param reifiedIdMapper the mapper {@link Function} from {@link Triple} to {@link Resource}. + * @param triple the {@link Triple} to convert. + * @param consumer the {@link Consumer} function for the produced statements. + * @return the {@link Resource} that was used as the subject of the created RDF reification statements. + */ + private static Resource createReifiedStatement(ValueFactory vf, Function reifiedIdMapper, + Triple triple, Resource context, Consumer consumer) { + Resource stId = reifiedIdMapper.apply(triple); + Statement reifiedSt = vf.createStatement(stId, RDF.TYPE, RDF.STATEMENT, context); + consumer.accept(reifiedSt); + Statement reifiedStSubject = vf.createStatement(stId, RDF.SUBJECT, triple.getSubject(), context); + convertRDFStarToReification(vf, reifiedIdMapper, reifiedStSubject, consumer); + Statement reifiedStPredicate = vf.createStatement(stId, RDF.PREDICATE, triple.getPredicate(), context); + consumer.accept(reifiedStPredicate); + Statement reifiedStObject = vf.createStatement(stId, RDF.OBJECT, triple.getObject(), context); + convertRDFStarToReification(vf, reifiedIdMapper, reifiedStObject, consumer); + return stId; + } } diff --git a/core/model/src/main/java/org/eclipse/rdf4j/model/util/SynchronizedModel.java b/core/model/src/main/java/org/eclipse/rdf4j/model/util/SynchronizedModel.java index ecdb1bdc35f..d5044dee922 100644 --- a/core/model/src/main/java/org/eclipse/rdf4j/model/util/SynchronizedModel.java +++ b/core/model/src/main/java/org/eclipse/rdf4j/model/util/SynchronizedModel.java @@ -14,7 +14,6 @@ import java.util.Set; import java.util.Spliterator; import java.util.function.Consumer; -import java.util.function.IntFunction; import java.util.function.Predicate; import java.util.stream.Stream; diff --git a/core/model/src/main/java/org/eclipse/rdf4j/model/util/URIUtil.java b/core/model/src/main/java/org/eclipse/rdf4j/model/util/URIUtil.java index 4da3cc21dc4..27eab8aa213 100644 --- a/core/model/src/main/java/org/eclipse/rdf4j/model/util/URIUtil.java +++ b/core/model/src/main/java/org/eclipse/rdf4j/model/util/URIUtil.java @@ -17,7 +17,7 @@ /** * Utility functions for working with {@link URI URIs}. - * + * * @author Arjohn Kampman */ public class URIUtil { @@ -27,14 +27,14 @@ public class URIUtil { * URI component would conflict with the reserved purpose, then the conflicting data must be escaped before forming * the URI. http://www.isi.edu/in-notes/rfc2396.txt section 2.2. */ - private static final Set reserved = new HashSet( + private static final Set reserved = new HashSet<>( Arrays.asList(new Character[] { ';', '/', '?', ':', '@', '&', '=', '+', '$', ',' })); /** * Punctuation mark characters, which are part of the set of unreserved chars and therefore allowed to occur in * unescaped form. See http://www.isi.edu/in-notes/rfc2396.txt */ - private static final Set mark = new HashSet( + private static final Set mark = new HashSet<>( Arrays.asList(new Character[] { '-', '_', '.', '!', '~', '*', '\'', '(', ')' })); /** @@ -54,7 +54,7 @@ public class URIUtil { * Note that the third step should never fail as every legal (non-relative) URI contains at least one ':' character * to seperate the scheme from the rest of the URI. If this fails anyway, the method will throw an * {@link IllegalArgumentException}. - * + * * @param uri A URI string. * @return The index of the first local name character in the URI string. Note that this index does not reference an * actual character if the algorithm determines that there is not local name. In that case, the return index @@ -84,7 +84,7 @@ public static int getLocalNameIndex(String uri) { /** * Checks whether the URI consisting of the specified namespace and local name has been split correctly according to * the URI splitting rules specified in {@link URI}. - * + * * @param namespace The URI's namespace, must not be null. * @param localName The URI's local name, must not be null. * @return true if the specified URI has been correctly split into a namespace and local name, @@ -135,7 +135,7 @@ public static boolean isCorrectURISplit(String namespace, String localName) { *

  • encoding the Unicode string as UTF-8, giving a sequence of octet values. *
  • %-escaping octets that do not correspond to permitted US-ASCII characters. * - * + * * @param uriRef a string representing an RDF URI reference. * @return true iff the supplied string is a syntactically valid RDF URI reference, false * otherwise. @@ -170,7 +170,7 @@ public static boolean isValidURIReference(String uriRef) { /** * Escapes any character that is not either reserved or in the legal range of unreserved characters, according to * RFC 2396. - * + * * @param unescaped a (relative or absolute) uri reference. * @return a (relative or absolute) uri reference with all characters that can not appear as-is in a URI %-escaped. * @see RFC 2396 diff --git a/core/model/src/main/java/org/eclipse/rdf4j/model/util/Vocabularies.java b/core/model/src/main/java/org/eclipse/rdf4j/model/util/Vocabularies.java index c971332b86b..4f1fdb8a978 100644 --- a/core/model/src/main/java/org/eclipse/rdf4j/model/util/Vocabularies.java +++ b/core/model/src/main/java/org/eclipse/rdf4j/model/util/Vocabularies.java @@ -15,7 +15,7 @@ /** * Utility functions for working with vocabularies. - * + * * @author Bart Hanssens */ public class Vocabularies { diff --git a/core/model/src/main/java/org/eclipse/rdf4j/model/vocabulary/DC.java b/core/model/src/main/java/org/eclipse/rdf4j/model/vocabulary/DC.java index 6bb5cd47e69..f89c4481006 100644 --- a/core/model/src/main/java/org/eclipse/rdf4j/model/vocabulary/DC.java +++ b/core/model/src/main/java/org/eclipse/rdf4j/model/vocabulary/DC.java @@ -15,7 +15,7 @@ /** * Vocabulary constants for the Dublin Core Metadata Element Set, version 1.1 - * + * * @see Dublin Core Metadata Element Set, Version 1.1 * @author Jeen Broekstra */ diff --git a/core/model/src/main/java/org/eclipse/rdf4j/model/vocabulary/DCTERMS.java b/core/model/src/main/java/org/eclipse/rdf4j/model/vocabulary/DCTERMS.java index 45260a9caa5..163838e65bc 100644 --- a/core/model/src/main/java/org/eclipse/rdf4j/model/vocabulary/DCTERMS.java +++ b/core/model/src/main/java/org/eclipse/rdf4j/model/vocabulary/DCTERMS.java @@ -15,7 +15,7 @@ /** * Vocabulary constants for the Dublin Core Metadata Initiative Metadata Terms. - * + * * @see DCMI Metadata Terms * @author Peter Ansell */ diff --git a/core/model/src/main/java/org/eclipse/rdf4j/model/vocabulary/FN.java b/core/model/src/main/java/org/eclipse/rdf4j/model/vocabulary/FN.java index 66b40f2b018..1f4d96f1864 100644 --- a/core/model/src/main/java/org/eclipse/rdf4j/model/vocabulary/FN.java +++ b/core/model/src/main/java/org/eclipse/rdf4j/model/vocabulary/FN.java @@ -15,7 +15,7 @@ /** * Defines constants for the standard XPath functions. - * + * * @see XPath functions * @author Jeen Broekstra */ diff --git a/core/model/src/main/java/org/eclipse/rdf4j/model/vocabulary/ORG.java b/core/model/src/main/java/org/eclipse/rdf4j/model/vocabulary/ORG.java index c13302fbf68..c0d02edb71c 100644 --- a/core/model/src/main/java/org/eclipse/rdf4j/model/vocabulary/ORG.java +++ b/core/model/src/main/java/org/eclipse/rdf4j/model/vocabulary/ORG.java @@ -15,9 +15,9 @@ /** * Constants for the W3C Organization Ontology. - * + * * @see Organization Ontology - * + * * @author Bart.Hanssens */ public class ORG { diff --git a/core/model/src/main/java/org/eclipse/rdf4j/model/vocabulary/OWL.java b/core/model/src/main/java/org/eclipse/rdf4j/model/vocabulary/OWL.java index 46f2e3d8b50..f960b6fbc1c 100644 --- a/core/model/src/main/java/org/eclipse/rdf4j/model/vocabulary/OWL.java +++ b/core/model/src/main/java/org/eclipse/rdf4j/model/vocabulary/OWL.java @@ -15,7 +15,7 @@ /** * Constants for OWL / OWL 2 primitives and for the OWL / OWL 2 namespace. - * + * * @see OWL Web Ontology Language Reference * @see OWL 2 Web Ontology Language Document Overview */ @@ -365,4 +365,4 @@ public class OWL { TOPOBJECTPROPERTY = factory.createIRI(OWL.NAMESPACE, "topObjectProperty"); WITHRESTRICTIONS = factory.createIRI(OWL.NAMESPACE, "withRestrictions"); } -} \ No newline at end of file +} diff --git a/core/model/src/main/java/org/eclipse/rdf4j/model/vocabulary/RDF.java b/core/model/src/main/java/org/eclipse/rdf4j/model/vocabulary/RDF.java index c32c2007ac7..2040ca9bc30 100644 --- a/core/model/src/main/java/org/eclipse/rdf4j/model/vocabulary/RDF.java +++ b/core/model/src/main/java/org/eclipse/rdf4j/model/vocabulary/RDF.java @@ -15,7 +15,7 @@ /** * Constants for RDF primitives and for the RDF namespace. - * + * * @see RDF/XML Syntax Specification (Revised) */ public class RDF { diff --git a/core/model/src/main/java/org/eclipse/rdf4j/model/vocabulary/RDF4J.java b/core/model/src/main/java/org/eclipse/rdf4j/model/vocabulary/RDF4J.java index e209c3fcba6..f950921bd2d 100644 --- a/core/model/src/main/java/org/eclipse/rdf4j/model/vocabulary/RDF4J.java +++ b/core/model/src/main/java/org/eclipse/rdf4j/model/vocabulary/RDF4J.java @@ -15,7 +15,7 @@ /** * Defines constants for the RDF4J namespace. These constants include things like implementation-specific named graph * identifiers or properties. - * + * * @author Jeen Broekstra */ public class RDF4J { diff --git a/core/model/src/main/java/org/eclipse/rdf4j/model/vocabulary/RDFS.java b/core/model/src/main/java/org/eclipse/rdf4j/model/vocabulary/RDFS.java index dad36294176..6502fada434 100644 --- a/core/model/src/main/java/org/eclipse/rdf4j/model/vocabulary/RDFS.java +++ b/core/model/src/main/java/org/eclipse/rdf4j/model/vocabulary/RDFS.java @@ -16,7 +16,7 @@ /** * Constants for the RDF Vocabulary Description Language 1.0: RDF Schema * (RDFS) - * + * * @see RDF Vocabulary Description Language 1.0: RDF Schema (RDFS) */ public class RDFS { diff --git a/core/model/src/main/java/org/eclipse/rdf4j/model/vocabulary/SD.java b/core/model/src/main/java/org/eclipse/rdf4j/model/vocabulary/SD.java index 4ae418b9721..b47dc81c946 100644 --- a/core/model/src/main/java/org/eclipse/rdf4j/model/vocabulary/SD.java +++ b/core/model/src/main/java/org/eclipse/rdf4j/model/vocabulary/SD.java @@ -15,7 +15,7 @@ /** * Namespace Sparql-service-description. Prefix: {@code } - * + * * @see SPARQL 1.1 Service Description * @author Peter Ansell */ @@ -44,7 +44,7 @@ public class SD { * An instance of sd:Aggregate represents an aggregate that may be used in a SPARQL aggregate query (for instance in * a HAVING clause or SELECT expression) besides the standard list of supported aggregates COUNT, SUM, MIN, MAX, * AVG, GROUP_CONCAT, and SAMPLE. - * + * * @see Aggregate */ public static final IRI AGGREGATE; @@ -57,7 +57,7 @@ public class SD { * Relates an instance of sd:Service to a description of the graphs which are allowed in the construction of a * dataset either via the SPARQL Protocol, with FROM/FROM NAMED clauses in a query, or with USING/USING NAMED in an * update request, if the service limits the scope of dataset construction. - * + * * @see availableGraphs */ public static final IRI AVAILBLE_GRAPHS; @@ -69,7 +69,7 @@ public class SD { *

    * sd:BasicFederatedQuery, when used as the object of the sd:feature property, indicates that the SPARQL service * supports basic federated query using the SERVICE keyword as defined by SPARQL 1.1 Federation Extensions. - * + * * @see BasicFederatedQuery */ public static final IRI BASIC_FEDERATED_QUERY; @@ -80,7 +80,7 @@ public class SD { * {@code http://www.w3.org/ns/sparql-service-description#Dataset}. *

    * An instance of sd:Dataset represents a RDF Dataset comprised of a default graph and zero or more named graphs. - * + * * @see Dataset */ public static final IRI DATASET; @@ -92,7 +92,7 @@ public class SD { *

    * Relates an instance of sd:Service to a description of the default dataset available when no explicit dataset is * specified in the query, update request or via protocol parameters. - * + * * @see defaultDataset */ public static final IRI DEFAULT_DATASET; @@ -107,7 +107,7 @@ public class SD { * the default dataset of the service. In situations where a different entailment regime applies to a specific graph * in the dataset, the sd:entailmentRegime property should be used to indicate this fact in the description of that * graph. - * + * * @see * defaultEntailmentRegime */ @@ -119,7 +119,7 @@ public class SD { * {@code http://www.w3.org/ns/sparql-service-description#defaultGraph}. *

    * Relates an instance of sd:Dataset to the description of its default graph. - * + * * @see defaultGraph */ public static final IRI DEFAULT_GRAPH; @@ -131,7 +131,7 @@ public class SD { *

    * Relates an instance of sd:Service with a resource representing a supported profile of the default entailment * regime (as declared by sd:defaultEntailmentRegime). - * + * * @see * defaultSupportedEntailmentProfile */ @@ -145,7 +145,7 @@ public class SD { * sd:DereferencesURIs, when used as the object of the sd:feature property, indicates that a SPARQL service will * dereference URIs used in FROM/FROM NAMED and USING/USING NAMED clauses and use the resulting RDF in the dataset * during query evaluation. - * + * * @see DereferencesURIs */ public static final IRI DEREFERENCES_URIS; @@ -158,7 +158,7 @@ public class SD { * sd:EmptyGraphs, when used as the object of the sd:feature property, indicates that the underlying graph store * supports empty graphs. A graph store that supports empty graphs MUST NOT remove graphs that are left empty after * triples are removed from them. - * + * * @see EmptyGraphs */ public static final IRI EMPTY_GRAPHS; @@ -170,7 +170,7 @@ public class SD { *

    * The SPARQL endpoint of an sd:Service that implements the SPARQL Protocol service. The object of the sd:endpoint * property is an IRI. - * + * * @see endpoint */ public static final IRI ENDPOINT; @@ -182,7 +182,7 @@ public class SD { *

    * An instance of sd:EntailmentProfile represents a profile of an entailment regime. An entailment profile MAY * impose restrictions on what constitutes valid RDF with respect to entailment. - * + * * @see EntailmentProfile */ public static final IRI ENTAILMENT_PROFILE; @@ -194,7 +194,7 @@ public class SD { *

    * An instance of sd:EntailmentRegime represents an entailment regime used in basic graph pattern matching (as * described by SPARQL 1.1 Query Language). - * + * * @see EntailmentRegime */ public static final IRI ENTAILMENT_REGIME_CLASS; @@ -206,7 +206,7 @@ public class SD { *

    * Relates a named graph description with a resource representing an entailment regime used for basic graph pattern * matching over that graph. - * + * * @see entailmentRegime */ public static final IRI ENTAILMENT_REGIME_PROPERTY; @@ -219,7 +219,7 @@ public class SD { * Relates an instance of sd:Service to an aggregate that may be used in a SPARQL aggregate query (for instance in a * HAVING clause or SELECT expression) besides the standard list of supported aggregates COUNT, SUM, MIN, MAX, AVG, * GROUP_CONCAT, and SAMPLE - * + * * @see extensionAggregate */ public static final IRI EXTENSION_AGGREGATE; @@ -231,7 +231,7 @@ public class SD { *

    * Relates an instance of sd:Service to a function that may be used in a SPARQL SELECT expression or a FILTER, * HAVING, GROUP BY, ORDER BY, or BIND clause. - * + * * @see extensionFunction */ public static final IRI EXTENSION_FUNCTION; @@ -244,7 +244,7 @@ public class SD { * An instance of sd:Feature represents a feature of a SPARQL service. Specific types of features include functions, * aggregates, languages, and entailment regimes and profiles. This document defines five instances of sd:Feature: * sd:DereferencesURIs, sd:UnionDefaultGraph, sd:RequiresDataset, sd:EmptyGraphs, and sd:BasicFederatedQuery. - * + * * @see Feature */ public static final IRI FEATURE_CLASS; @@ -255,7 +255,7 @@ public class SD { * {@code http://www.w3.org/ns/sparql-service-description#feature}. *

    * Relates an instance of sd:Service with a resource representing a supported feature. - * + * * @see feature */ public static final IRI FEATURE_PROPERTY; @@ -267,7 +267,7 @@ public class SD { *

    * An instance of sd:Function represents a function that may be used in a SPARQL SELECT expression or a FILTER, * HAVING, GROUP BY, ORDER BY, or BIND clause. - * + * * @see Function */ public static final IRI FUNCTION; @@ -278,7 +278,7 @@ public class SD { * {@code http://www.w3.org/ns/sparql-service-description#graph}. *

    * Relates a named graph to its graph description. - * + * * @see graph */ public static final IRI GRAPH_PROPERTY; @@ -289,7 +289,7 @@ public class SD { * {@code http://www.w3.org/ns/sparql-service-description#Graph}. *

    * An instance of sd:Graph represents the description of an RDF graph. - * + * * @see Graph */ public static final IRI GRAPH_CLASS; @@ -301,7 +301,7 @@ public class SD { *

    * An instance of sd:GraphCollection represents a collection of zero or more named graph descriptions. Each named * graph description belonging to an sd:GraphCollection MUST be linked with the sd:namedGraph predicate. - * + * * @see GraphCollection */ public static final IRI GRAPH_COLLECTION; @@ -313,7 +313,7 @@ public class SD { *

    * Relates an instance of sd:Service to a format that is supported for parsing RDF input; for example, via a SPARQL * 1.1 Update LOAD statement, or when URIs are dereferenced in FROM/FROM NAMED/USING/USING NAMED clauses. - * + * * @see inputFormat */ public static final IRI INPUT_FORMAT; @@ -326,7 +326,7 @@ public class SD { * An instance of sd:Language represents one of the SPARQL languages, including specific configurations providing * particular features or extensions. This document defines three instances of sd:Language: sd:SPARQL10Query, * sd:SPARQL11Query, and sd:SPARQL11Update. - * + * * @see Language */ public static final IRI LANGUAGE; @@ -338,7 +338,7 @@ public class SD { *

    * Relates an instance of sd:Service to a resource representing an implemented extension to the SPARQL Query or * Update language. - * + * * @see languageExtension */ public static final IRI LANGUAGE_EXTENSION; @@ -350,7 +350,7 @@ public class SD { *

    * Relates a named graph to the name by which it may be referenced in a FROM/FROM NAMED clause. The object of the * sd:name property is an IRI. - * + * * @see name */ public static final IRI NAME; @@ -363,7 +363,7 @@ public class SD { * Relates an instance of sd:GraphCollection (or its subclass sd:Dataset) to the description of one of its named * graphs. The description of such a named graph MUST include the sd:name property and MAY include the sd:graph * property. - * + * * @see namedGraph */ public static final IRI NAMED_GRAPH_PROPERTY; @@ -375,7 +375,7 @@ public class SD { *

    * An instance of sd:NamedGraph represents a named graph having a name (via sd:name) and an optional graph * description (via sd:graph). - * + * * @see NamedGraph */ public static final IRI NAMED_GRAPH_CLASS; @@ -387,7 +387,7 @@ public class SD { *

    * Relates an instance of sd:Service to a resource representing an implemented feature that extends the SPARQL Query * or Update language and that is accessed by using the named property. - * + * * @see propertyFeature */ public static final IRI PROPERTY_FEATURE; @@ -400,7 +400,7 @@ public class SD { * sd:RequiresDataset, when used as the object of the sd:feature property, indicates that the SPARQL service * requires an explicit dataset declaration (based on either FROM/FROM NAMED clauses in a query, USING/USING NAMED * clauses in an update, or the appropriate SPARQL Protocol parameters). - * + * * @see RequiresDataset */ public static final IRI REQUIRES_DATASET; @@ -411,7 +411,7 @@ public class SD { * {@code http://www.w3.org/ns/sparql-service-description#resultFormat}. *

    * Relates an instance of sd:Service to a format that is supported for serializing query results. - * + * * @see resultFormat */ public static final IRI RESULT_FORMAT; @@ -422,7 +422,7 @@ public class SD { * {@code http://www.w3.org/ns/sparql-service-description#Service}. *

    * An instance of sd:Service represents a SPARQL service made available via the SPARQL Protocol. - * + * * @see Service */ public static final IRI SERVICE; @@ -433,7 +433,7 @@ public class SD { * {@code http://www.w3.org/ns/sparql-service-description#SPARQL10Query}. *

    * sd:SPARQL10Query is an sd:Language representing the SPARQL 1.0 Query language. - * + * * @see SPARQL10Query */ public static final IRI SPARQL_10_QUERY; @@ -444,7 +444,7 @@ public class SD { * {@code http://www.w3.org/ns/sparql-service-description#SPARQL11Query}. *

    * sd:SPARQL11Query is an sd:Language representing the SPARQL 1.1 Query language. - * + * * @see SPARQL11Query */ public static final IRI SPARQL_11_QUERY; @@ -455,7 +455,7 @@ public class SD { * {@code http://www.w3.org/ns/sparql-service-description#SPARQL11Update}. *

    * sd:SPARQLUpdate is an sd:Language representing the SPARQL 1.1 Update language. - * + * * @see SPARQL11Update */ public static final IRI SPARQL_11_UPDATE; @@ -467,7 +467,7 @@ public class SD { *

    * Relates a named graph description with a resource representing a supported profile of the entailment regime (as * declared by sd:entailmentRegime) used for basic graph pattern matching over that graph. - * + * * @see * supportedEntailmentProfile */ @@ -479,7 +479,7 @@ public class SD { * {@code http://www.w3.org/ns/sparql-service-description#supportedLanguage}. *

    * Relates an instance of sd:Service to a SPARQL language (e.g. Query and Update) that it implements. - * + * * @see supportedLanguage */ public static final IRI SUPPORTED_LANGUAGE; @@ -492,7 +492,7 @@ public class SD { * sd:UnionDefaultGraph, when used as the object of the sd:feature property, indicates that the default graph of the * dataset used during query and update evaluation (when an explicit dataset is not specified) is comprised of the * union of all the named graphs in that dataset. - * + * * @see UnionDefaultGraph */ public static final IRI UNION_DEFAULT_GRAPH; diff --git a/core/model/src/main/java/org/eclipse/rdf4j/model/vocabulary/SESAMEQNAME.java b/core/model/src/main/java/org/eclipse/rdf4j/model/vocabulary/SESAMEQNAME.java index 7acf95fa096..5fc1c7627cf 100644 --- a/core/model/src/main/java/org/eclipse/rdf4j/model/vocabulary/SESAMEQNAME.java +++ b/core/model/src/main/java/org/eclipse/rdf4j/model/vocabulary/SESAMEQNAME.java @@ -15,7 +15,7 @@ /** * Defines constants for the Sesame QName schema namespace. - * + * * @author Peter Ansell */ public class SESAMEQNAME { diff --git a/core/model/src/main/java/org/eclipse/rdf4j/model/vocabulary/SKOS.java b/core/model/src/main/java/org/eclipse/rdf4j/model/vocabulary/SKOS.java index 03d508f13c4..83348e3b45a 100644 --- a/core/model/src/main/java/org/eclipse/rdf4j/model/vocabulary/SKOS.java +++ b/core/model/src/main/java/org/eclipse/rdf4j/model/vocabulary/SKOS.java @@ -16,7 +16,7 @@ /** * Vocabulary constants for the Simple Knowledge Organization System * (SKOS). - * + * * @see SKOS Simple Knowledge Organization System Reference * @author Jeen Broekstra */ @@ -41,28 +41,28 @@ public class SKOS { /** * The skos:Concept class - * + * * @see The skos:Concept Class */ public static final IRI CONCEPT; /** * The skos:ConceptScheme class - * + * * @see Concept Schemes */ public static final IRI CONCEPT_SCHEME; /** * The skos:Collection class - * + * * @see Concept Collections */ public static final IRI COLLECTION; /** * The skos:OrderedCollection class - * + * * @see Concept Collections */ public static final IRI ORDERED_COLLECTION; @@ -71,21 +71,21 @@ public class SKOS { /** * The skos:prefLabel lexical label property. - * + * * @see Lexical Labels */ public static final IRI PREF_LABEL; /** * The skos:altLabel lexical label property. - * + * * @see Lexical Labels */ public static final IRI ALT_LABEL; /** * The skos:hiddenLabel lexical label property. - * + * * @see Lexical Labels */ public static final IRI HIDDEN_LABEL; @@ -94,21 +94,21 @@ public class SKOS { /** * The skos:inScheme relation. - * + * * @see Concept Schemes */ public static final IRI IN_SCHEME; /** * The skos:hasTopConcept relation. - * + * * @see Concept Schemes */ public static final IRI HAS_TOP_CONCEPT; /** * The skos:topConceptOf relation. - * + * * @see Concept Schemes */ public static final IRI TOP_CONCEPT_OF; @@ -117,14 +117,14 @@ public class SKOS { /** * The skos:member relation. - * + * * @see Concept Collections */ public static final IRI MEMBER; /** * The skos:memberList relation. - * + * * @see Concept Collections */ public static final IRI MEMBER_LIST; @@ -133,7 +133,7 @@ public class SKOS { /** * The skos:notation property. - * + * * @see Notations */ public static final IRI NOTATION; @@ -142,28 +142,28 @@ public class SKOS { /** * The skos:changeNote property. - * + * * @see Documentation Properties (Note Properties) */ public static final IRI CHANGE_NOTE; /** * The skos:definition property. - * + * * @see Documentation Properties (Note Properties) */ public static final IRI DEFINITION; /** * The skos:editorialNote property. - * + * * @see Documentation Properties (Note Properties) */ public static final IRI EDITORIAL_NOTE; /** * The skos:example property. - * + * * @see Documentation Properties (Note Properties) */ @@ -171,21 +171,21 @@ public class SKOS { /** * The skos:historyNote property. - * + * * @see Documentation Properties (Note Properties) */ public static final IRI HISTORY_NOTE; /** * The skos:note property. - * + * * @see Documentation Properties (Note Properties) */ public static final IRI NOTE; /** * The skos:scopeNote property. - * + * * @see Documentation Properties (Note Properties) */ public static final IRI SCOPE_NOTE; @@ -194,7 +194,7 @@ public class SKOS { /** * The skos:broader relation. - * + * * @see SKOS Simple Knowledge Organization System * Reference - Semantic Relations Section */ @@ -202,7 +202,7 @@ public class SKOS { /** * The skos:broaderTransitive relation. - * + * * @see SKOS Simple Knowledge Organization System * Reference - Semantic Relations Section */ @@ -210,7 +210,7 @@ public class SKOS { /** * The skos:narrower relation. - * + * * @see SKOS Simple Knowledge Organization System * Reference - Semantic Relations Section */ @@ -218,7 +218,7 @@ public class SKOS { /** * The skos:narrowerTransitive relation. - * + * * @see SKOS Simple Knowledge Organization System * Reference - Semantic Relations Section */ @@ -226,7 +226,7 @@ public class SKOS { /** * The skos:related relation. - * + * * @see SKOS Simple Knowledge Organization System * Reference - Semantic Relations Section */ @@ -234,7 +234,7 @@ public class SKOS { /** * The skos:semanticRelation relation. - * + * * @see SKOS Simple Knowledge Organization System * Reference - Semantic Relations Section */ @@ -244,7 +244,7 @@ public class SKOS { /** * The skos:broadMatch relation. - * + * * @see SKOS Simple Knowledge Organization System Reference - * Mapping Properties Section */ @@ -252,7 +252,7 @@ public class SKOS { /** * The skos:closeMatch relation. - * + * * @see SKOS Simple Knowledge Organization System Reference - * Mapping Properties Section */ @@ -260,7 +260,7 @@ public class SKOS { /** * The skos:exactMatch relation. - * + * * @see SKOS Simple Knowledge Organization System Reference - * Mapping Properties Section */ @@ -268,7 +268,7 @@ public class SKOS { /** * The skos:mappingRelation relation. - * + * * @see SKOS Simple Knowledge Organization System Reference - * Mapping Properties Section */ @@ -276,7 +276,7 @@ public class SKOS { /** * The skos:narrowMatch relation. - * + * * @see SKOS Simple Knowledge Organization System Reference - * Mapping Properties Section */ @@ -284,7 +284,7 @@ public class SKOS { /** * The skos:relatedMatch relation. - * + * * @see SKOS Simple Knowledge Organization System Reference - * Mapping Properties Section */ diff --git a/core/model/src/main/java/org/eclipse/rdf4j/model/vocabulary/SKOSXL.java b/core/model/src/main/java/org/eclipse/rdf4j/model/vocabulary/SKOSXL.java index fc64ce20df2..6ebc1a36a1c 100644 --- a/core/model/src/main/java/org/eclipse/rdf4j/model/vocabulary/SKOSXL.java +++ b/core/model/src/main/java/org/eclipse/rdf4j/model/vocabulary/SKOSXL.java @@ -16,7 +16,7 @@ /** * Vocabulary constants for the SKOS eXtension for Labels * (SKOS-XL). - * + * * @see Appendix B of SKOS Simple Knowledge Organization System * Reference * @author Manuel Fiorelli @@ -42,7 +42,7 @@ public class SKOSXL { /** * The skosxl:Label class. - * + * * @see The skosxl:Label Class */ public static final IRI LABEL; @@ -51,7 +51,7 @@ public class SKOSXL { /** * The skosxl:literalForm property. - * + * * @see The skosxl:Label Class */ public static final IRI LITERAL_FORM; @@ -60,21 +60,21 @@ public class SKOSXL { /** * The skosxl:prefLabel property. - * + * * @see Preferred, Alternate and Hidden skosxl:Labels */ public static final IRI PREF_LABEL; /** * The skosxl:altLabel property. - * + * * @see Preferred, Alternate and Hidden skosxl:Labels */ public static final IRI ALT_LABEL; /** * The skosxl:hiddenLabel property. - * + * * @see Preferred, Alternate and Hidden skosxl:Labels */ public static final IRI HIDDEN_LABEL; @@ -83,7 +83,7 @@ public class SKOSXL { /** * The skosxl:labelRelation relation. - * + * * @see Links Between skosxl:Labels */ public static final IRI LABEL_RELATION; diff --git a/core/model/src/main/java/org/eclipse/rdf4j/model/vocabulary/WGS84.java b/core/model/src/main/java/org/eclipse/rdf4j/model/vocabulary/WGS84.java new file mode 100644 index 00000000000..95ec0abc4c0 --- /dev/null +++ b/core/model/src/main/java/org/eclipse/rdf4j/model/vocabulary/WGS84.java @@ -0,0 +1,84 @@ +/******************************************************************************* + * Copyright (c) 2020 Eclipse RDF4J contributors. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Distribution License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ + +package org.eclipse.rdf4j.model.vocabulary; + +import org.eclipse.rdf4j.model.IRI; +import org.eclipse.rdf4j.model.Namespace; +import org.eclipse.rdf4j.model.ValueFactory; +import org.eclipse.rdf4j.model.impl.SimpleNamespace; +import org.eclipse.rdf4j.model.impl.SimpleValueFactory; + +/** + * Constants for the Basic Geo (WGS84 lat/long) Vocabulary. + * + * @author Alessandro Bollini + * @see Basic Geo (WGS84 lat/long) Vocabulary + */ +public class WGS84 { + + /** + * The WGS84 namespace ({@value}). + */ + public static final String NAMESPACE = "http://www.w3.org/2003/01/geo/wgs84_pos#"; + + /** + * Recommended prefix for the RDF Schema namespace ({@value}). + */ + public static final String PREFIX = "wgs84"; + + /** + * An immutable {@link Namespace} constant that represents the WGS84 namespace. + */ + public static final Namespace NS = new SimpleNamespace(PREFIX, NAMESPACE); + + /** The {@code wgs84:SpatialThing} class. */ + public static final IRI SPATIAL_THING; + + /** The {@code wgs84:TemporalThing} class. */ + public static final IRI TEMPORAL_THING; + + /** The {@code wgs84:Event} class. */ + public static final IRI EVENT; + + /** The {@code wgs84:Point} relation. */ + public static final IRI POINT; + + /** The {@code wgs84:location} relation. */ + public static final IRI LOCATION; + + /** The {@code wgs84:lat} relation. */ + public static final IRI LAT; + + /** The {@code wgs84:long} relation. */ + public static final IRI LONG; + + /** The {@code wgs84:alt} relation. */ + public static final IRI ALT; + + /** The {@code wgs84:lat_long} relation. */ + public static final IRI LAT_LONG; + + static { + + final ValueFactory factory = SimpleValueFactory.getInstance(); + + SPATIAL_THING = factory.createIRI(NAMESPACE, "SpatialThing"); + TEMPORAL_THING = factory.createIRI(NAMESPACE, "TemporalThing"); + EVENT = factory.createIRI(NAMESPACE, "Event"); + + POINT = factory.createIRI(NAMESPACE, "Point"); + LOCATION = factory.createIRI(NAMESPACE, "location"); + LAT = factory.createIRI(NAMESPACE, "lat"); + LONG = factory.createIRI(NAMESPACE, "long"); + ALT = factory.createIRI(NAMESPACE, "alt"); + LAT_LONG = factory.createIRI(NAMESPACE, "lat_long"); + + } + +} diff --git a/core/model/src/main/java/org/eclipse/rdf4j/model/vocabulary/XMLSchema.java b/core/model/src/main/java/org/eclipse/rdf4j/model/vocabulary/XMLSchema.java index e616833d6a4..1ed9be4ccb2 100644 --- a/core/model/src/main/java/org/eclipse/rdf4j/model/vocabulary/XMLSchema.java +++ b/core/model/src/main/java/org/eclipse/rdf4j/model/vocabulary/XMLSchema.java @@ -15,7 +15,7 @@ /** * Constants for the standard XML Schema 1.1 datatypes. - * + * * @see XML Schema 1.1 Part 2: Datatypes */ public class XMLSchema { diff --git a/core/model/src/test/java/org/eclipse/rdf4j/model/DynamicModelConcurrentModificationAndUpgradeTest.java b/core/model/src/test/java/org/eclipse/rdf4j/model/DynamicModelConcurrentModificationAndUpgradeTest.java new file mode 100644 index 00000000000..b7df88048c6 --- /dev/null +++ b/core/model/src/test/java/org/eclipse/rdf4j/model/DynamicModelConcurrentModificationAndUpgradeTest.java @@ -0,0 +1,188 @@ +/******************************************************************************* + * Copyright (c) 2020 Eclipse RDF4J contributors. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Distribution License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ + +package org.eclipse.rdf4j.model; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.fail; + +import java.util.Arrays; +import java.util.Collection; +import java.util.Iterator; +import java.util.List; +import java.util.concurrent.CountDownLatch; + +import org.eclipse.rdf4j.model.impl.DynamicModel; +import org.eclipse.rdf4j.model.impl.LinkedHashModelFactory; +import org.eclipse.rdf4j.model.impl.SimpleValueFactory; +import org.eclipse.rdf4j.model.vocabulary.RDF; +import org.eclipse.rdf4j.model.vocabulary.RDFS; +import org.junit.Test; + +public class DynamicModelConcurrentModificationAndUpgradeTest { + + /** + * Add multiple statements while forcing an upgrade to make sure we then get an exception because the underlying + * storage was upgraded + * + * @throws InterruptedException + */ + @Test + public void testConcurrentAddAndUpgrade() throws InterruptedException { + + for (int i = 0; i < 100; i++) { + Exception exception = runTest(); + + if (exception != null) { + assertThat(exception).isInstanceOf(UnsupportedOperationException.class); + return; + } + } + + fail("There should have been an UnsupportedOperationException earlier"); + + } + + private Exception runTest() throws InterruptedException { + SimpleValueFactory vf = SimpleValueFactory.getInstance(); + List statements = Arrays.asList( + vf.createStatement(vf.createBNode(), RDF.TYPE, RDFS.RESOURCE), + vf.createStatement(vf.createBNode(), RDF.TYPE, RDFS.RESOURCE), + vf.createStatement(vf.createBNode(), RDF.TYPE, RDFS.RESOURCE), + vf.createStatement(vf.createBNode(), RDF.TYPE, RDFS.RESOURCE), + vf.createStatement(vf.createBNode(), RDF.TYPE, RDFS.RESOURCE)); + + DynamicModel model = new DynamicModel(new LinkedHashModelFactory()); + + CountDownLatch countDownLatch2 = new CountDownLatch(1); + CountDownLatch countDownLatch1 = new CountDownLatch(1); + + final Exception[] exception = new Exception[1]; + + Runnable addAll = () -> { + try { + model.addAll(new Collection() { + @Override + public int size() { + return statements.size(); + } + + @Override + public boolean isEmpty() { + return statements.isEmpty(); + } + + @Override + public boolean contains(Object o) { + return statements.contains(o); + } + + @Override + public Iterator iterator() { + return new Iterator() { + + final Iterator iterator = statements.iterator(); + + @Override + public boolean hasNext() { + try { + countDownLatch1.countDown(); + countDownLatch2.await(); + } catch (InterruptedException e) { + e.printStackTrace(); + } + Thread.yield(); + return iterator.hasNext(); + } + + @Override + public Statement next() { + try { + countDownLatch2.await(); + } catch (InterruptedException e) { + e.printStackTrace(); + } + Thread.yield(); + return iterator.next(); + } + }; + } + + @Override + public Object[] toArray() { + return statements.toArray(); + } + + @Override + public T[] toArray(T[] a) { + return statements.toArray(a); + } + + @Override + public boolean add(Statement statement) { + return false; + } + + @Override + public boolean remove(Object o) { + return false; + } + + @Override + public boolean containsAll(Collection c) { + return statements.containsAll(c); + } + + @Override + public boolean addAll(Collection c) { + return false; + } + + @Override + public boolean removeAll(Collection c) { + return false; + } + + @Override + public boolean retainAll(Collection c) { + return false; + } + + @Override + public void clear() { + System.out.println(); + } + }); + } catch (Exception e) { + exception[0] = e; + } + }; + + Runnable upgrade = () -> { + try { + countDownLatch1.await(); + } catch (InterruptedException e) { + e.printStackTrace(); + } + model.filter(null, RDF.TYPE, null); + countDownLatch2.countDown(); + }; + + Thread addAllThread = new Thread(addAll); + Thread upgradeThread = new Thread(upgrade); + + addAllThread.start(); + upgradeThread.start(); + + addAllThread.join(); + upgradeThread.join(); + + return exception[0]; + } + +} diff --git a/core/model/src/test/java/org/eclipse/rdf4j/model/ModelCollectionTest.java b/core/model/src/test/java/org/eclipse/rdf4j/model/ModelCollectionTest.java index cb2fb2ed4e0..6d45675214e 100644 --- a/core/model/src/test/java/org/eclipse/rdf4j/model/ModelCollectionTest.java +++ b/core/model/src/test/java/org/eclipse/rdf4j/model/ModelCollectionTest.java @@ -7,6 +7,7 @@ *******************************************************************************/ package org.eclipse.rdf4j.model; +import org.eclipse.rdf4j.model.impl.DynamicModelFactory; import org.eclipse.rdf4j.model.impl.LinkedHashModelFactory; import org.eclipse.rdf4j.model.impl.TreeModelFactory; @@ -20,7 +21,7 @@ /** * Unit tests for {@link Model} implementations to check conformance with Java Collection Framework. - * + * * @author Jeen Broekstra * */ @@ -33,6 +34,7 @@ public Test allTests() { TestSuite suite = new TestSuite("org.eclipse.rdf4j.model.ModelCollectionTest"); suite.addTest(testModelImpl("LinkedHashModel", new LinkedHashModelFactory())); suite.addTest(testModelImpl("TreeModel", new TreeModelFactory())); + suite.addTest(testModelImpl("DynamicModel", new DynamicModelFactory())); return suite; } diff --git a/core/model/src/test/java/org/eclipse/rdf4j/model/TestModelGenerator.java b/core/model/src/test/java/org/eclipse/rdf4j/model/TestModelGenerator.java index 6d608e468e1..8fb51618f85 100644 --- a/core/model/src/test/java/org/eclipse/rdf4j/model/TestModelGenerator.java +++ b/core/model/src/test/java/org/eclipse/rdf4j/model/TestModelGenerator.java @@ -17,7 +17,7 @@ /** * Creates Models, containing sample {@link Statement}s, for use in Java Collection Framework conformance testing. - * + * * @author Jeen Broekstra * @see ModelCollectionTest */ diff --git a/core/model/src/test/java/org/eclipse/rdf4j/model/datatypes/XMLDatatypeUtilTest.java b/core/model/src/test/java/org/eclipse/rdf4j/model/datatypes/XMLDatatypeUtilTest.java index 79782d4b0d2..3b82e69daa3 100644 --- a/core/model/src/test/java/org/eclipse/rdf4j/model/datatypes/XMLDatatypeUtilTest.java +++ b/core/model/src/test/java/org/eclipse/rdf4j/model/datatypes/XMLDatatypeUtilTest.java @@ -17,7 +17,7 @@ /** * Unit tests on {@link org.eclipse.rdf4j.model.datatypes.XMLDatatypeUtil} - * + * * @author Jeen Broekstra */ public class XMLDatatypeUtilTest { diff --git a/core/model/src/test/java/org/eclipse/rdf4j/model/util/LiteralsTest.java b/core/model/src/test/java/org/eclipse/rdf4j/model/util/LiteralsTest.java index 2684fb3bedf..e7f3f1d08d4 100644 --- a/core/model/src/test/java/org/eclipse/rdf4j/model/util/LiteralsTest.java +++ b/core/model/src/test/java/org/eclipse/rdf4j/model/util/LiteralsTest.java @@ -29,7 +29,7 @@ /** * Tests for {@link Literals}. - * + * * @author Peter Ansell */ public class LiteralsTest { diff --git a/core/model/src/test/java/org/eclipse/rdf4j/model/util/ModelsTest.java b/core/model/src/test/java/org/eclipse/rdf4j/model/util/ModelsTest.java index 0e252e1eee4..1f24bef9c42 100644 --- a/core/model/src/test/java/org/eclipse/rdf4j/model/util/ModelsTest.java +++ b/core/model/src/test/java/org/eclipse/rdf4j/model/util/ModelsTest.java @@ -15,16 +15,19 @@ import java.util.Optional; import java.util.Set; +import java.util.function.Consumer; import org.eclipse.rdf4j.model.BNode; import org.eclipse.rdf4j.model.IRI; import org.eclipse.rdf4j.model.Literal; import org.eclipse.rdf4j.model.Model; import org.eclipse.rdf4j.model.Resource; +import org.eclipse.rdf4j.model.Statement; import org.eclipse.rdf4j.model.Value; import org.eclipse.rdf4j.model.ValueFactory; import org.eclipse.rdf4j.model.impl.LinkedHashModel; import org.eclipse.rdf4j.model.impl.SimpleValueFactory; +import org.eclipse.rdf4j.model.impl.TreeModel; import org.eclipse.rdf4j.model.vocabulary.RDF; import org.eclipse.rdf4j.model.vocabulary.RDFS; import org.junit.Assert; @@ -445,4 +448,77 @@ public void testStripContextsSpecificContext() { assertThat(graph2Stripped.size()).isEqualTo(model1.size()); } + @Test + public void testConvertReificationToRDFStar() { + Model reificationModel = RDFStarTestHelper.createRDFReificationModel(); + Model referenceRDFStarModel = RDFStarTestHelper.createRDFStarModel(); + + Model rdfStarModel1 = Models.convertReificationToRDFStar(VF, reificationModel); + assertTrue("RDF reification conversion to RDF* with explicit VF, model-to-model", + Models.isomorphic(rdfStarModel1, referenceRDFStarModel)); + + Model rdfStarModel2 = Models.convertReificationToRDFStar(reificationModel); + assertTrue("RDF reification conversion to RDF* with implicit VF, model-to-model", + Models.isomorphic(rdfStarModel2, referenceRDFStarModel)); + + Model rdfStarModel3 = new TreeModel(); + Models.convertReificationToRDFStar(VF, reificationModel, (Consumer) rdfStarModel3::add); + assertTrue("RDF reification conversion to RDF* with explicit VF, model-to-consumer", + Models.isomorphic(rdfStarModel3, referenceRDFStarModel)); + + Model rdfStarModel4 = new TreeModel(); + Models.convertReificationToRDFStar(reificationModel, rdfStarModel4::add); + assertTrue("RDF reification conversion to RDF* with implicit VF, model-to-consumer", + Models.isomorphic(rdfStarModel4, referenceRDFStarModel)); + } + + @Test + public void testConvertIncompleteReificationToRDFStar() { + // Incomplete RDF reification (missing type, subject, predicate or object) should not add statements + // and should not remove any of the existing incomplete reification statements. + Model incompleteReificationModel = RDFStarTestHelper.createIncompleteRDFReificationModel(); + + Model rdfStarModel1 = Models.convertReificationToRDFStar(VF, incompleteReificationModel); + assertTrue("Incomplete RDF reification conversion to RDF* with explicit VF, model-to-model", + Models.isomorphic(rdfStarModel1, incompleteReificationModel)); + + Model rdfStarModel2 = Models.convertReificationToRDFStar(incompleteReificationModel); + assertTrue("Incomplete RDF reification conversion to RDF* with implicit VF, model-to-model", + Models.isomorphic(rdfStarModel2, incompleteReificationModel)); + + Model rdfStarModel3 = new TreeModel(); + Models.convertReificationToRDFStar(VF, incompleteReificationModel, (Consumer) rdfStarModel3::add); + assertTrue("Incomplete RDF reification conversion to RDF* with explicit VF, model-to-consumer", + Models.isomorphic(rdfStarModel3, incompleteReificationModel)); + + Model rdfStarModel4 = new TreeModel(); + Models.convertReificationToRDFStar(incompleteReificationModel, rdfStarModel4::add); + assertTrue("Incomplete RDF reification conversion to RDF* with implicit VF, model-to-consumer", + Models.isomorphic(rdfStarModel4, incompleteReificationModel)); + } + + @Test + public void testConvertRDFStarToReification() { + Model rdfStarModel = RDFStarTestHelper.createRDFStarModel(); + Model referenceModel = RDFStarTestHelper.createRDFReificationModel(); + + Model reificationModel1 = Models.convertRDFStarToReification(VF, rdfStarModel); + assertTrue("RDF* conversion to reification with explicit VF, model-to-model", + Models.isomorphic(reificationModel1, referenceModel)); + + Model reificationModel2 = Models.convertRDFStarToReification(rdfStarModel); + assertTrue("RDF* conversion to reification with implicit VF, model-to-model", + Models.isomorphic(reificationModel2, referenceModel)); + + Model reificationModel3 = new TreeModel(); + Models.convertRDFStarToReification(VF, rdfStarModel, (Consumer) reificationModel3::add); + assertTrue("RDF* conversion to reification with explicit VF, model-to-consumer", + Models.isomorphic(reificationModel3, referenceModel)); + + Model reificationModel4 = new TreeModel(); + Models.convertRDFStarToReification(rdfStarModel, reificationModel4::add); + assertTrue("RDF* conversion to reification with explicit VF, model-to-consumer", + Models.isomorphic(reificationModel4, referenceModel)); + } + } diff --git a/core/model/src/test/java/org/eclipse/rdf4j/model/util/RDFStarTestHelper.java b/core/model/src/test/java/org/eclipse/rdf4j/model/util/RDFStarTestHelper.java new file mode 100644 index 00000000000..6fe090df11f --- /dev/null +++ b/core/model/src/test/java/org/eclipse/rdf4j/model/util/RDFStarTestHelper.java @@ -0,0 +1,161 @@ +/******************************************************************************* + * Copyright (c) 2020 Eclipse RDF4J contributors. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Distribution License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ +package org.eclipse.rdf4j.model.util; + +import org.eclipse.rdf4j.model.BNode; +import org.eclipse.rdf4j.model.IRI; +import org.eclipse.rdf4j.model.Literal; +import org.eclipse.rdf4j.model.Model; +import org.eclipse.rdf4j.model.ValueFactory; +import org.eclipse.rdf4j.model.impl.LinkedHashModel; +import org.eclipse.rdf4j.model.impl.SimpleValueFactory; +import org.eclipse.rdf4j.model.vocabulary.RDF; + +public class RDFStarTestHelper { + private final static ValueFactory VF = SimpleValueFactory.getInstance(); + + private final static IRI GRAPH_NULL = null; + private final static IRI GRAPH_1 = VF.createIRI("urn:graph1"); + private final static IRI GRAPH_2 = VF.createIRI("urn:graph2"); + private final static IRI IRI_1 = VF.createIRI("urn:a"); + private final static IRI IRI_2 = VF.createIRI("urn:b"); + private final static IRI IRI_3 = VF.createIRI("urn:c"); + private final static IRI IRI_4 = VF.createIRI("urn:d"); + private final static IRI IRI_5 = VF.createIRI("urn:e"); + private final static IRI IRI_6 = VF.createIRI("urn:f"); + private final static Literal LITERAL_1 = VF.createLiteral("literal 1"); + private final static Literal LITERAL_2 = VF.createLiteral("literal 2"); + private final static BNode BNODE_1 = VF.createBNode("bnode1"); + private final static BNode BNODE_2 = VF.createBNode("bnode2"); + + public static Model createRDFStarModel() { + Model rdfStarModel = new LinkedHashModel(); + Statements.create(VF, IRI_1, IRI_2, IRI_3, rdfStarModel, GRAPH_NULL); + // The same triple repeated twice + Statements.create(VF, IRI_1, IRI_2, VF.createTriple(IRI_4, IRI_5, LITERAL_1), rdfStarModel, GRAPH_1); + Statements.create(VF, IRI_1, IRI_3, VF.createTriple(IRI_4, IRI_5, LITERAL_1), rdfStarModel, GRAPH_1); + Statements.create(VF, VF.createTriple(IRI_5, IRI_6, IRI_4), IRI_3, BNODE_1, rdfStarModel, GRAPH_2); + Statements.create(VF, VF.createTriple(VF.createTriple(IRI_1, IRI_2, LITERAL_2), + IRI_3, VF.createTriple(IRI_4, IRI_5, IRI_6)), + IRI_2, VF.createTriple(VF.createTriple(BNODE_2, IRI_3, LITERAL_2), + IRI_4, VF.createTriple(IRI_3, IRI_6, IRI_1)), + rdfStarModel, GRAPH_2); + + return rdfStarModel; + } + + public static Model createRDFReificationModel() { + Model reifiedModel = new LinkedHashModel(); + Statements.create(VF, IRI_1, IRI_2, IRI_3, reifiedModel, GRAPH_NULL); + + // maps iri1 iri2 <> to reification + BNode t1 = VF.createBNode(); + Statements.create(VF, IRI_1, IRI_2, t1, reifiedModel, GRAPH_1); + Statements.create(VF, t1, RDF.TYPE, RDF.STATEMENT, reifiedModel, GRAPH_1); + Statements.create(VF, t1, RDF.SUBJECT, IRI_4, reifiedModel, GRAPH_1); + Statements.create(VF, t1, RDF.PREDICATE, IRI_5, reifiedModel, GRAPH_1); + Statements.create(VF, t1, RDF.OBJECT, LITERAL_1, reifiedModel, GRAPH_1); + + // maps iri1 iri2 <> to reification + // same triple/reification statements as previous entry + Statements.create(VF, IRI_1, IRI_3, t1, reifiedModel, GRAPH_1); + Statements.create(VF, t1, RDF.TYPE, RDF.STATEMENT, reifiedModel, GRAPH_1); + Statements.create(VF, t1, RDF.SUBJECT, IRI_4, reifiedModel, GRAPH_1); + Statements.create(VF, t1, RDF.PREDICATE, IRI_5, reifiedModel, GRAPH_1); + Statements.create(VF, t1, RDF.OBJECT, LITERAL_1, reifiedModel, GRAPH_1); + + // maps <> iri3 _:bnode1 to reification + BNode t2 = VF.createBNode(); + Statements.create(VF, t2, IRI_3, BNODE_1, reifiedModel, GRAPH_2); + Statements.create(VF, t2, RDF.TYPE, RDF.STATEMENT, reifiedModel, GRAPH_2); + Statements.create(VF, t2, RDF.SUBJECT, IRI_5, reifiedModel, GRAPH_2); + Statements.create(VF, t2, RDF.PREDICATE, IRI_6, reifiedModel, GRAPH_2); + Statements.create(VF, t2, RDF.OBJECT, IRI_4, reifiedModel, GRAPH_2); + + // maps a complex nested statement to reification + // t3 + // t5 t6 + // subj: << <> iri3 <> >> + // pred: iri2 + // obj: << <<_:bnode2 iri3 "literal2">> iri4 <> >> + // t7 t8 + // t4 + BNode t3 = VF.createBNode(); + BNode t4 = VF.createBNode(); + BNode t5 = VF.createBNode(); + BNode t6 = VF.createBNode(); + BNode t7 = VF.createBNode(); + BNode t8 = VF.createBNode(); + Statements.create(VF, t3, IRI_2, t4, reifiedModel, GRAPH_2); + Statements.create(VF, t3, RDF.TYPE, RDF.STATEMENT, reifiedModel, GRAPH_2); + Statements.create(VF, t3, RDF.SUBJECT, t5, reifiedModel, GRAPH_2); + Statements.create(VF, t3, RDF.PREDICATE, IRI_3, reifiedModel, GRAPH_2); + Statements.create(VF, t3, RDF.OBJECT, t6, reifiedModel, GRAPH_2); + Statements.create(VF, t5, RDF.TYPE, RDF.STATEMENT, reifiedModel, GRAPH_2); + Statements.create(VF, t5, RDF.SUBJECT, IRI_1, reifiedModel, GRAPH_2); + Statements.create(VF, t5, RDF.PREDICATE, IRI_2, reifiedModel, GRAPH_2); + Statements.create(VF, t5, RDF.OBJECT, LITERAL_2, reifiedModel, GRAPH_2); + Statements.create(VF, t6, RDF.TYPE, RDF.STATEMENT, reifiedModel, GRAPH_2); + Statements.create(VF, t6, RDF.SUBJECT, IRI_4, reifiedModel, GRAPH_2); + Statements.create(VF, t6, RDF.PREDICATE, IRI_5, reifiedModel, GRAPH_2); + Statements.create(VF, t6, RDF.OBJECT, IRI_6, reifiedModel, GRAPH_2); + Statements.create(VF, t4, RDF.TYPE, RDF.STATEMENT, reifiedModel, GRAPH_2); + Statements.create(VF, t4, RDF.SUBJECT, t7, reifiedModel, GRAPH_2); + Statements.create(VF, t4, RDF.PREDICATE, IRI_4, reifiedModel, GRAPH_2); + Statements.create(VF, t4, RDF.OBJECT, t8, reifiedModel, GRAPH_2); + Statements.create(VF, t7, RDF.TYPE, RDF.STATEMENT, reifiedModel, GRAPH_2); + Statements.create(VF, t7, RDF.SUBJECT, BNODE_2, reifiedModel, GRAPH_2); + Statements.create(VF, t7, RDF.PREDICATE, IRI_3, reifiedModel, GRAPH_2); + Statements.create(VF, t7, RDF.OBJECT, LITERAL_2, reifiedModel, GRAPH_2); + Statements.create(VF, t8, RDF.TYPE, RDF.STATEMENT, reifiedModel, GRAPH_2); + Statements.create(VF, t8, RDF.SUBJECT, IRI_3, reifiedModel, GRAPH_2); + Statements.create(VF, t8, RDF.PREDICATE, IRI_6, reifiedModel, GRAPH_2); + Statements.create(VF, t8, RDF.OBJECT, IRI_1, reifiedModel, GRAPH_2); + + return reifiedModel; + } + + public static Model createIncompleteRDFReificationModel() { + Model reifiedModel = new LinkedHashModel(); + Statements.create(VF, IRI_1, IRI_2, IRI_3, reifiedModel, GRAPH_NULL); + + // maps iri1 iri2 <> to reification + BNode t1 = VF.createBNode(); + Statements.create(VF, IRI_1, IRI_2, t1, reifiedModel, GRAPH_1); + // Incomplete reification: missing t1 RDF.TYPE RDF.STATEMENT + Statements.create(VF, t1, RDF.SUBJECT, IRI_4, reifiedModel, GRAPH_1); + Statements.create(VF, t1, RDF.PREDICATE, IRI_5, reifiedModel, GRAPH_1); + Statements.create(VF, t1, RDF.OBJECT, LITERAL_1, reifiedModel, GRAPH_1); + + // maps <> iri3 _:bnode1 to reification + BNode t2 = VF.createBNode(); + Statements.create(VF, t2, IRI_3, BNODE_1, reifiedModel, GRAPH_2); + Statements.create(VF, t2, RDF.TYPE, RDF.STATEMENT, reifiedModel, GRAPH_2); + // Incomplete reification: missing t2 RDF.SUBJECT iri5 + Statements.create(VF, t2, RDF.PREDICATE, IRI_6, reifiedModel, GRAPH_2); + Statements.create(VF, t2, RDF.OBJECT, IRI_4, reifiedModel, GRAPH_2); + + // maps <> iri3 iri6 to reification + BNode t3 = VF.createBNode(); + Statements.create(VF, t3, IRI_3, IRI_6, reifiedModel, GRAPH_2); + Statements.create(VF, t3, RDF.TYPE, RDF.STATEMENT, reifiedModel, GRAPH_2); + Statements.create(VF, t3, RDF.SUBJECT, IRI_1, reifiedModel, GRAPH_2); + // Incomplete reification: missing t3 RDF.PREDICATE iri2 + Statements.create(VF, t3, RDF.OBJECT, IRI_4, reifiedModel, GRAPH_2); + + // maps iri6 iri3 <> to reification + BNode t4 = VF.createBNode(); + Statements.create(VF, IRI_6, IRI_3, t4, reifiedModel, GRAPH_2); + Statements.create(VF, t4, RDF.TYPE, RDF.STATEMENT, reifiedModel, GRAPH_2); + Statements.create(VF, t4, RDF.SUBJECT, IRI_1, reifiedModel, GRAPH_2); + Statements.create(VF, t4, RDF.PREDICATE, IRI_2, reifiedModel, GRAPH_2); + // Incomplete reification: missing t4 RDF.OBJECT "literal2" + + return reifiedModel; + } +} diff --git a/core/model/src/test/java/org/eclipse/rdf4j/model/util/StatementsTest.java b/core/model/src/test/java/org/eclipse/rdf4j/model/util/StatementsTest.java index 67fc89a800a..5de39467b8a 100644 --- a/core/model/src/test/java/org/eclipse/rdf4j/model/util/StatementsTest.java +++ b/core/model/src/test/java/org/eclipse/rdf4j/model/util/StatementsTest.java @@ -8,6 +8,7 @@ package org.eclipse.rdf4j.model.util; import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; @@ -15,7 +16,9 @@ import org.eclipse.rdf4j.model.Model; import org.eclipse.rdf4j.model.Resource; import org.eclipse.rdf4j.model.Statement; +import org.eclipse.rdf4j.model.Triple; import org.eclipse.rdf4j.model.ValueFactory; +import org.eclipse.rdf4j.model.impl.LinkedHashModel; import org.eclipse.rdf4j.model.impl.SimpleValueFactory; import org.eclipse.rdf4j.model.impl.TreeModel; import org.eclipse.rdf4j.model.vocabulary.FOAF; @@ -77,4 +80,37 @@ public void testInvalidInput() { // fall through. } } + + @Test + public void testRDFStarReification() { + Model rdfStarModel = RDFStarTestHelper.createRDFStarModel(); + + Model reifiedModel = RDFStarTestHelper.createRDFReificationModel(); + + Model convertedModel1 = new LinkedHashModel(); + rdfStarModel.forEach((s) -> Statements.convertRDFStarToReification(s, convertedModel1::add)); + assertTrue("RDF* conversion to reification with implicit VF", + Models.isomorphic(reifiedModel, convertedModel1)); + + Model convertedModel2 = new LinkedHashModel(); + rdfStarModel.forEach((s) -> Statements.convertRDFStarToReification(vf, s, convertedModel2::add)); + assertTrue("RDF* conversion to reification with explicit VF", + Models.isomorphic(reifiedModel, convertedModel2)); + + Model convertedModel3 = new LinkedHashModel(); + rdfStarModel.forEach((s) -> Statements.convertRDFStarToReification(vf, (t) -> vf.createBNode(t.stringValue()), + s, convertedModel3::add)); + assertTrue("RDF* conversion to reification with explicit VF and custom BNode mapping", + Models.isomorphic(reifiedModel, convertedModel3)); + } + + @Test + public void testTripleToResourceMapper() { + Triple t1 = vf.createTriple(vf.createIRI("http://example.com/1"), vf.createIRI("http://example.com/2"), + vf.createLiteral("data")); + Triple t2 = vf.createTriple(vf.createIRI("http://example.com/1"), vf.createIRI("http://example.com/2"), + vf.createLiteral("data")); + assertEquals("Identical triples must produce the same blank node", + Statements.TRIPLE_BNODE_MAPPER.apply(t1), Statements.TRIPLE_BNODE_MAPPER.apply(t2)); + } } diff --git a/core/pom.xml b/core/pom.xml index 7af1182c0e1..f27040fa510 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -4,7 +4,7 @@ org.eclipse.rdf4j rdf4j - 3.1.5-SNAPSHOT + 3.2.2-SNAPSHOT rdf4j-core pom diff --git a/core/query/pom.xml b/core/query/pom.xml index cfa92d1b3ec..567a23ea15d 100644 --- a/core/query/pom.xml +++ b/core/query/pom.xml @@ -4,7 +4,7 @@ org.eclipse.rdf4j rdf4j-core - 3.1.5-SNAPSHOT + 3.2.2-SNAPSHOT rdf4j-query RDF4J: Query diff --git a/core/query/src/main/java/org/eclipse/rdf4j/query/Binding.java b/core/query/src/main/java/org/eclipse/rdf4j/query/Binding.java index cdd4103389e..79e6c30705a 100644 --- a/core/query/src/main/java/org/eclipse/rdf4j/query/Binding.java +++ b/core/query/src/main/java/org/eclipse/rdf4j/query/Binding.java @@ -18,40 +18,40 @@ public interface Binding extends Serializable { /** * Gets the name of the binding (e.g. the variable name). - * + * * @return The name of the binding. */ - public String getName(); + String getName(); /** * Gets the value of the binding. The returned value is never equal to null, such a "binding" is considered * to be unbound. - * + * * @return The value of the binding, never null. */ - public Value getValue(); + Value getValue(); /** * Compares a binding object to another object. - * + * * @param o The object to compare this binding to. * @return true if the other object is an instance of {@link Binding} and both their names and values are * equal, false otherwise. */ @Override - public boolean equals(Object o); + boolean equals(Object o); /** * The hash code of a binding is defined as the bit-wise XOR of the hash codes of its name and value: - * + * *

     	 * name.hashCode() ˆ value.hashCode()
     	 * 
    - * + * * . - * + * * @return A hash code for the binding. */ @Override - public int hashCode(); + int hashCode(); } diff --git a/core/query/src/main/java/org/eclipse/rdf4j/query/BindingSet.java b/core/query/src/main/java/org/eclipse/rdf4j/query/BindingSet.java index e68a35ef690..2f247ae2bf8 100644 --- a/core/query/src/main/java/org/eclipse/rdf4j/query/BindingSet.java +++ b/core/query/src/main/java/org/eclipse/rdf4j/query/BindingSet.java @@ -25,60 +25,60 @@ public interface BindingSet extends Iterable, Serializable { * implementation is free to return the bindings in arbitrary order. */ @Override - public Iterator iterator(); + Iterator iterator(); /** * Gets the names of the bindings in this BindingSet. - * + * * @return A set of binding names. */ - public Set getBindingNames(); + Set getBindingNames(); /** * Gets the binding with the specified name from this BindingSet. - * + * * @param bindingName The name of the binding. * @return The binding with the specified name, or null if there is no such binding in this BindingSet. */ - public Binding getBinding(String bindingName); + Binding getBinding(String bindingName); /** * Checks whether this BindingSet has a binding with the specified name. - * + * * @param bindingName The name of the binding. * @return true if this BindingSet has a binding with the specified name, false otherwise. */ - public boolean hasBinding(String bindingName); + boolean hasBinding(String bindingName); /** * Gets the value of the binding with the specified name from this BindingSet. - * + * * @param bindingName The name of the binding. * @return The value of the binding with the specified name, or null if there is no such binding in this * BindingSet. */ - public Value getValue(String bindingName); + Value getValue(String bindingName); /** * Returns the number of bindings in this BindingSet. - * + * * @return The number of bindings in this BindingSet. */ - public int size(); + int size(); /** * Compares a BindingSet object to another object. - * + * * @param o The object to compare this binding to. * @return true if the other object is an instance of {@link BindingSet} and it contains the same set of * bindings (disregarding order), false otherwise. */ @Override - public boolean equals(Object o); + boolean equals(Object o); /** * The hash code of a binding is defined as the bit-wise XOR of the hash codes of its bindings: - * + * *
     	 * int hashCode = 0;
     	 *
    @@ -86,12 +86,12 @@ public interface BindingSet extends Iterable, Serializable {
     	 * 	hashCode ˆ= binding.getName().hashCode() ˆ binding.getValue().hashCode();
     	 * }
     	 * 
    - * + * * Note: the calculated hash code intentionally does not depend on the order in which the bindings are iterated * over. - * + * * @return A hash code for the BindingSet. */ @Override - public int hashCode(); + int hashCode(); } diff --git a/core/query/src/main/java/org/eclipse/rdf4j/query/BooleanQuery.java b/core/query/src/main/java/org/eclipse/rdf4j/query/BooleanQuery.java index 7d181787795..a29fea95d7d 100644 --- a/core/query/src/main/java/org/eclipse/rdf4j/query/BooleanQuery.java +++ b/core/query/src/main/java/org/eclipse/rdf4j/query/BooleanQuery.java @@ -12,5 +12,5 @@ */ public interface BooleanQuery extends Query { - public boolean evaluate() throws QueryEvaluationException; + boolean evaluate() throws QueryEvaluationException; } diff --git a/core/query/src/main/java/org/eclipse/rdf4j/query/BooleanQueryResultHandler.java b/core/query/src/main/java/org/eclipse/rdf4j/query/BooleanQueryResultHandler.java index 81fa41fa946..6e3e9e7aeee 100644 --- a/core/query/src/main/java/org/eclipse/rdf4j/query/BooleanQueryResultHandler.java +++ b/core/query/src/main/java/org/eclipse/rdf4j/query/BooleanQueryResultHandler.java @@ -10,7 +10,7 @@ /** * An interface that indicates that this QueryResultHandler is capable of handling boolean results using the * {@link #handleBoolean(boolean)} method. - * + * * @author Peter Ansell */ public interface BooleanQueryResultHandler extends QueryResultHandler { diff --git a/core/query/src/main/java/org/eclipse/rdf4j/query/BooleanQueryResultHandlerException.java b/core/query/src/main/java/org/eclipse/rdf4j/query/BooleanQueryResultHandlerException.java index 31d1d03193f..40f5a9a2b35 100644 --- a/core/query/src/main/java/org/eclipse/rdf4j/query/BooleanQueryResultHandlerException.java +++ b/core/query/src/main/java/org/eclipse/rdf4j/query/BooleanQueryResultHandlerException.java @@ -9,7 +9,7 @@ /** * An exception that can be thrown by an BooleanQueryResultHandler when it encounters an unrecoverable error. - * + * * @author Peter Ansell */ public class BooleanQueryResultHandlerException extends QueryResultHandlerException { @@ -18,7 +18,7 @@ public class BooleanQueryResultHandlerException extends QueryResultHandlerExcept /** * Creates a new BooleanQueryResultHandlerException. - * + * * @param msg An error message. */ public BooleanQueryResultHandlerException(String msg) { @@ -27,7 +27,7 @@ public BooleanQueryResultHandlerException(String msg) { /** * Creates a new BooleanQueryResultHandlerException wrapping another exception. - * + * * @param cause The cause of the exception. */ public BooleanQueryResultHandlerException(Throwable cause) { @@ -36,7 +36,7 @@ public BooleanQueryResultHandlerException(Throwable cause) { /** * Creates a new BooleanQueryResultHandlerException wrapping another exception. - * + * * @param msg An error message. * @param cause The cause of the exception. */ diff --git a/core/query/src/main/java/org/eclipse/rdf4j/query/Dataset.java b/core/query/src/main/java/org/eclipse/rdf4j/query/Dataset.java index b6424dcaf36..cf62f1fa3d9 100644 --- a/core/query/src/main/java/org/eclipse/rdf4j/query/Dataset.java +++ b/core/query/src/main/java/org/eclipse/rdf4j/query/Dataset.java @@ -16,7 +16,7 @@ * using operations, which is the RDF merge of one or more graphs, a * set of named graphs, and a single update graph for INSERT and DELETE. See * SPARQL Query Language for RDF for more info. - * + * * @author Simon Schenk * @author Arjohn Kampman * @author James Leigh @@ -27,25 +27,25 @@ public interface Dataset { * Gets the default remove graph URIs of this dataset. An empty set indicates the the store's default behaviour * should be used, if not otherwise indicated in the operation. */ - public Set getDefaultRemoveGraphs(); + Set getDefaultRemoveGraphs(); /** * Gets the default insert graph URI of this dataset. An null value indicates that the store's default behaviour * should be used, if not otherwise indicated in the operation. */ - public IRI getDefaultInsertGraph(); + IRI getDefaultInsertGraph(); /** * Gets the default graph URIs of this dataset. An empty default graph set and a non-empty named graph set indicates * that the default graph is an empty graph. However, if both the default graph set and the named graph set are * empty, that indicates that the store's default behaviour should be used. */ - public Set getDefaultGraphs(); + Set getDefaultGraphs(); /** * Gets the named graph URIs of this dataset. An empty named graph set and a non-empty default graph set indicates * that there are no named graphs. However, if both the default graph set and the named graph set are empty, that * indicates that the store's default behaviour should be used. */ - public Set getNamedGraphs(); + Set getNamedGraphs(); } diff --git a/core/query/src/main/java/org/eclipse/rdf4j/query/GraphQuery.java b/core/query/src/main/java/org/eclipse/rdf4j/query/GraphQuery.java index e7574301e0f..b463ac8d3b1 100644 --- a/core/query/src/main/java/org/eclipse/rdf4j/query/GraphQuery.java +++ b/core/query/src/main/java/org/eclipse/rdf4j/query/GraphQuery.java @@ -12,7 +12,7 @@ public interface GraphQuery extends Query { - public GraphQueryResult evaluate() throws QueryEvaluationException; + GraphQueryResult evaluate() throws QueryEvaluationException; - public void evaluate(RDFHandler handler) throws QueryEvaluationException, RDFHandlerException; + void evaluate(RDFHandler handler) throws QueryEvaluationException, RDFHandlerException; } diff --git a/core/query/src/main/java/org/eclipse/rdf4j/query/GraphQueryResult.java b/core/query/src/main/java/org/eclipse/rdf4j/query/GraphQueryResult.java index 3d86678a0c3..c0c66dd612b 100644 --- a/core/query/src/main/java/org/eclipse/rdf4j/query/GraphQueryResult.java +++ b/core/query/src/main/java/org/eclipse/rdf4j/query/GraphQueryResult.java @@ -15,7 +15,7 @@ * A representation of a query result as a sequence of {@link Statement} objects. Each query result consists of zero or * more Statements and additionaly carries information about relevant namespace declarations. Note: take care to always * close a GraphQueryResult after use to free any resources it keeps hold of. - * + * * @author Jeen Broekstra */ public interface GraphQueryResult extends QueryResult { @@ -24,10 +24,10 @@ public interface GraphQueryResult extends QueryResult { * Retrieves relevant namespaces from the query result.
    * The contents of the Map may be modified after it is returned, as the initial return may be performed when the * first RDF Statement is encountered. - * + * * @return a Map<String, String> object containing (prefix, namespace) pairs. * @throws QueryEvaluationException */ - public Map getNamespaces() throws QueryEvaluationException; + Map getNamespaces() throws QueryEvaluationException; } diff --git a/core/query/src/main/java/org/eclipse/rdf4j/query/IncompatibleOperationException.java b/core/query/src/main/java/org/eclipse/rdf4j/query/IncompatibleOperationException.java index 6994c5c3afb..d04d41c46c3 100644 --- a/core/query/src/main/java/org/eclipse/rdf4j/query/IncompatibleOperationException.java +++ b/core/query/src/main/java/org/eclipse/rdf4j/query/IncompatibleOperationException.java @@ -9,13 +9,13 @@ /** * An exception indicating that a string could not be parsed into an operation of the expected type by the parser. - * + * * @author jeen */ public class IncompatibleOperationException extends MalformedQueryException { /** - * + * */ private static final long serialVersionUID = -4926665776729656410L; diff --git a/core/query/src/main/java/org/eclipse/rdf4j/query/MalformedQueryException.java b/core/query/src/main/java/org/eclipse/rdf4j/query/MalformedQueryException.java index d1bc7c3bfa2..12074ad8fe8 100644 --- a/core/query/src/main/java/org/eclipse/rdf4j/query/MalformedQueryException.java +++ b/core/query/src/main/java/org/eclipse/rdf4j/query/MalformedQueryException.java @@ -11,7 +11,7 @@ /** * An exception indicating that a query could not be processed by the query parser, typically due to syntax errors. - * + * * @author jeen * @author Herko ter Horst */ diff --git a/core/query/src/main/java/org/eclipse/rdf4j/query/Operation.java b/core/query/src/main/java/org/eclipse/rdf4j/query/Operation.java index 56f994777b5..448a1c5aaf9 100644 --- a/core/query/src/main/java/org/eclipse/rdf4j/query/Operation.java +++ b/core/query/src/main/java/org/eclipse/rdf4j/query/Operation.java @@ -13,7 +13,7 @@ * An operation (e.g. a query or an update) on a repository that can be formulated in one of the supported query * languages (for example SeRQL or SPARQL). It allows one to predefine bindings in the operation to be able to reuse the * same operation with different bindings. - * + * * @author Jeen */ public interface Operation { @@ -21,75 +21,75 @@ public interface Operation { /** * Binds the specified variable to the supplied value. Any value that was previously bound to the specified value * will be overwritten. - * + * * @param name The name of the variable that should be bound. * @param value The (new) value for the specified variable. */ - public void setBinding(String name, Value value); + void setBinding(String name, Value value); /** * Removes a previously set binding on the supplied variable. Calling this method with an unbound variable name has * no effect. - * + * * @param name The name of the variable from which the binding is to be removed. */ - public void removeBinding(String name); + void removeBinding(String name); /** * Removes all previously set bindings. */ - public void clearBindings(); + void clearBindings(); /** * Retrieves the bindings that have been set on this operation. - * + * * @return A (possibly empty) set of operation variable bindings. * @see #setBinding(String, Value) */ - public BindingSet getBindings(); + BindingSet getBindings(); /** * Specifies the dataset against which to execute an operation, overriding any dataset that is specified in the * operation itself. */ - public void setDataset(Dataset dataset); + void setDataset(Dataset dataset); /** * Gets the dataset that has been set using {@link #setDataset(Dataset)}, if any. */ - public Dataset getDataset(); + Dataset getDataset(); /** * Determine whether evaluation results of this operation should include inferred statements (if any inferred * statements are present in the repository). The default setting is 'true'. - * + * * @param includeInferred indicates whether inferred statements should be included in the result. */ - public void setIncludeInferred(boolean includeInferred); + void setIncludeInferred(boolean includeInferred); /** * Returns whether or not this operation will return inferred statements (if any are present in the repository). - * + * * @return true if inferred statements will be returned, false otherwise. */ - public boolean getIncludeInferred(); + boolean getIncludeInferred(); /** * Specifies the maximum time that an operation is allowed to run. The operation will be interrupted when it exceeds * the time limit. Any consecutive requests to fetch query results will result in {@link QueryInterruptedException}s * or {@link UpdateExecutionException}s (depending on whether the operation is a query or an update). - * - * @param maxExecTime The maximum query time, measured in seconds. A negative or zero value indicates an unlimited - * execution time (which is the default). + * + * @param maxExecutionTimeSeconds The maximum query time, measured in seconds. A negative or zero value indicates an + * unlimited execution time (which is the default). */ - public void setMaxExecutionTime(int maxExecTime); + void setMaxExecutionTime(int maxExecutionTimeSeconds); /** * Returns the maximum operation execution time. - * + * * @return The maximum operation execution time, measured in seconds. * @see #setMaxExecutionTime(int) */ - public int getMaxExecutionTime(); + int getMaxExecutionTime(); } diff --git a/core/query/src/main/java/org/eclipse/rdf4j/query/Query.java b/core/query/src/main/java/org/eclipse/rdf4j/query/Query.java index b38dd33225d..641a390cf4a 100644 --- a/core/query/src/main/java/org/eclipse/rdf4j/query/Query.java +++ b/core/query/src/main/java/org/eclipse/rdf4j/query/Query.java @@ -7,33 +7,97 @@ *******************************************************************************/ package org.eclipse.rdf4j.query; +import org.eclipse.rdf4j.common.annotation.Experimental; +import org.eclipse.rdf4j.model.Statement; +import org.eclipse.rdf4j.query.explanation.Explanation; + /** * A query on a repository that can be formulated in one of the supported query languages (for example SeRQL or SPARQL). * It allows one to predefine bindings in the query to be able to reuse the same query with different bindings. - * + * * @author Arjohn Kampman * @author jeen */ public interface Query extends Operation { + /** + * The different types of queries that RDF4J recognizes: boolean queries, graph queries, and tuple queries. + * + * @since 3.2.0 + */ + enum QueryType { + /** + * Boolean queries (such as the SPARQL ASK query form) return either {@code true} or {@code false} as the + * result. + */ + BOOLEAN, + /** + * Graph queries (such as the SPARQL CONSTRUCT and DESCRIBE query form) return a sequence of RDF + * {@link Statement statements} as the result. + */ + GRAPH, + /** + * Tuple queries (such as the SPARQL SELECT query form) return a sequence of {@link BindingSet sets of variable + * bindings} as the result. + */ + TUPLE + } + /** * Specifies the maximum time that a query is allowed to run. The query will be interrupted when it exceeds the time * limit. Any consecutive requests to fetch query results will result in {@link QueryInterruptedException}s. - * + * * @param maxQueryTime The maximum query time, measured in seconds. A negative or zero value indicates an unlimited * query time (which is the default). * @deprecated since 2.0. Use {@link Operation#setMaxExecutionTime(int)} instead. */ @Deprecated - public void setMaxQueryTime(int maxQueryTime); + void setMaxQueryTime(int maxQueryTime); /** * Returns the maximum query evaluation time. - * + * * @return The maximum query evaluation time, measured in seconds. * @see #setMaxQueryTime(int) * @deprecated since 2.0. Use {@link Operation#getMaxExecutionTime()} instead. */ @Deprecated - public int getMaxQueryTime(); + int getMaxQueryTime(); + + /** + *

    + * Explain how the query will be (or has been) executed/evaluated by returning an explanation of the query plan. + *

    + * + *

    + * This method is useful for understanding why a particular query is slow. The most useful level is Executed, but + * this takes as long as it takes to execute/evaluate the query. + *

    + * + *

    + * When timing a query you should keep in mind that the query performance will vary based on how much the JIT + * compiler has compiled the code (C1 vs C2) and based on what is or isn't cached in memory. If Timed explanations + * are considerably slower than Executed explanations the overhead with timing the query may be large on your system + * and should not be trusted. + *

    + * + *

    + * WARNING: This method is experimental and is subject to change or removal without warning. Same goes for the + * returned explanation. There is currently only partial support for this method in RDF4J and and + * UnsupportedOperationException where support is lacking. + *

    + * + * @param level The explanation level that should be used to create the explanation. Choose between: Unoptimized (as + * parsed without optimizations) , Optimized (as is actually going to be used), Executed (as was + * executed/evaluated, including some real performance metrics), Timed (as was executed/evaluated + * including all real performance metrics). Executed and Timed level can potentially be slow. + * @return The explanation that we generated, which can be viewed in a human readable format with toString(), as + * JSON or as a simplified query plan object structure. + */ + @Experimental + default Explanation explain(Explanation.Level level) { + // with default implementation for backwards compatibility + throw new UnsupportedOperationException(); + } + } diff --git a/core/query/src/main/java/org/eclipse/rdf4j/query/QueryEvaluationException.java b/core/query/src/main/java/org/eclipse/rdf4j/query/QueryEvaluationException.java index f6c84dd4660..b31af12a341 100644 --- a/core/query/src/main/java/org/eclipse/rdf4j/query/QueryEvaluationException.java +++ b/core/query/src/main/java/org/eclipse/rdf4j/query/QueryEvaluationException.java @@ -11,7 +11,7 @@ /** * An exception indicating that the evaluation of a query failed. - * + * * @author Arjohn Kampman */ public class QueryEvaluationException extends RDF4JException { @@ -24,7 +24,7 @@ public QueryEvaluationException() { /** * Creates a new TupleQueryResultHandlerException. - * + * * @param msg An error message. */ public QueryEvaluationException(String msg) { @@ -33,7 +33,7 @@ public QueryEvaluationException(String msg) { /** * Creates a new TupleQueryResultHandlerException wrapping another exception. - * + * * @param cause The cause of the exception. */ public QueryEvaluationException(Throwable cause) { @@ -42,7 +42,7 @@ public QueryEvaluationException(Throwable cause) { /** * Creates a new TupleQueryResultHandlerException wrapping another exception. - * + * * @param msg An error message. * @param cause The cause of the exception. */ diff --git a/core/query/src/main/java/org/eclipse/rdf4j/query/QueryInterruptedException.java b/core/query/src/main/java/org/eclipse/rdf4j/query/QueryInterruptedException.java index 2c32b82a610..60977054bcc 100644 --- a/core/query/src/main/java/org/eclipse/rdf4j/query/QueryInterruptedException.java +++ b/core/query/src/main/java/org/eclipse/rdf4j/query/QueryInterruptedException.java @@ -10,7 +10,7 @@ /** * An exception indicating that the evaluation of a query has been interrupted, for example because it took too long to * complete. - * + * * @author Arjohn Kampman */ public class QueryInterruptedException extends QueryEvaluationException { diff --git a/core/query/src/main/java/org/eclipse/rdf4j/query/QueryLanguage.java b/core/query/src/main/java/org/eclipse/rdf4j/query/QueryLanguage.java index 28466035760..b16b421f11e 100644 --- a/core/query/src/main/java/org/eclipse/rdf4j/query/QueryLanguage.java +++ b/core/query/src/main/java/org/eclipse/rdf4j/query/QueryLanguage.java @@ -25,14 +25,14 @@ public class QueryLanguage { /** * SeRQL (Sesame RDF Query Language) is a Sesame-specific query language for RDF, which predates SPARQL. - * + * * @see The SeRQL user manual */ public static final QueryLanguage SERQL = new QueryLanguage("SeRQL"); /** * SPARQL (Simple Protocol and RDF Query Language) is a W3C Recommendation for querying and updating RDF data. - * + * * @see SPARQL 1.1 Overview */ public static final QueryLanguage SPARQL = new QueryLanguage("SPARQL"); @@ -40,7 +40,7 @@ public class QueryLanguage { /** * SeRQO (Sesame RDF Query Language - Objects) is a Sesame-specific query language using a syntax suited less for * human editing but for easy transfer over the wire. - * + * * @deprecated since 2.0. This language is no longer actively supported. */ @Deprecated @@ -53,7 +53,7 @@ public class QueryLanguage { /** * List of known query languages. */ - private static List QUERY_LANGUAGES = new ArrayList(4); + private static List QUERY_LANGUAGES = new ArrayList<>(4); /*--------------------* * Static initializer * @@ -78,7 +78,7 @@ public static Collection values() { /** * Registers the specified query language. - * + * * @param name The name of the query language, e.g. "SPARQL". */ public static QueryLanguage register(String name) { @@ -96,7 +96,7 @@ public static void register(QueryLanguage ql) { /** * Returns the query language whose name matches the specified name. - * + * * @param qlName A query language name. * @return The query language whose name matches the specified name, or null if there is no such query * language. @@ -126,7 +126,7 @@ public static QueryLanguage valueOf(String qlName) { /** * Creates a new QueryLanguage object. - * + * * @param name The (case-insensitive) name of the query language, e.g. "SPARQL". */ public QueryLanguage(String name) { @@ -141,7 +141,7 @@ public QueryLanguage(String name) { /** * Gets the name of this query language. - * + * * @return A human-readable format name, e.g. "SPARQL". */ public String getName() { diff --git a/core/query/src/main/java/org/eclipse/rdf4j/query/QueryResult.java b/core/query/src/main/java/org/eclipse/rdf4j/query/QueryResult.java index ee869bd378d..bf6134444cd 100644 --- a/core/query/src/main/java/org/eclipse/rdf4j/query/QueryResult.java +++ b/core/query/src/main/java/org/eclipse/rdf4j/query/QueryResult.java @@ -8,10 +8,8 @@ package org.eclipse.rdf4j.query; import java.util.Iterator; -import java.util.stream.Stream; import org.eclipse.rdf4j.common.iteration.CloseableIteration; -import org.eclipse.rdf4j.common.iteration.Iterations; import org.eclipse.rdf4j.common.iterator.CloseableIterationIterator; /** @@ -24,7 +22,7 @@ public interface QueryResult extends CloseableIteration iterator() { - return new CloseableIterationIterator(this); + return new CloseableIterationIterator<>(this); } } diff --git a/core/query/src/main/java/org/eclipse/rdf4j/query/QueryResultHandler.java b/core/query/src/main/java/org/eclipse/rdf4j/query/QueryResultHandler.java index ba9ee1c8694..7f3faa20d11 100644 --- a/core/query/src/main/java/org/eclipse/rdf4j/query/QueryResultHandler.java +++ b/core/query/src/main/java/org/eclipse/rdf4j/query/QueryResultHandler.java @@ -21,14 +21,14 @@ * If both boolean and tuple results are supported but they are not able to to be processed simultaneously, then a * checked exception, either {@link BooleanQueryResultHandlerException} or {@link TupleQueryResultHandlerException}, * will be thrown to indicate this failure when the relevant methods are called. - * + * * @author Peter Ansell */ public interface QueryResultHandler { /** * Handles the specified boolean value. - * + * * @param value The boolean value to handle. * @throws QueryResultHandlerException If there was an error during the handling of this value. This exception may * be thrown if the {@link #startQueryResult(List)}, @@ -46,7 +46,7 @@ public interface QueryResultHandler { * NOTE: If the format does not support links, it must silently ignore a call to this method. *

    * An accumulating handler should accumulate these links. - * + * * @see "link" * @param linkUrls The URLs of the links to handle. * @throws QueryResultHandlerException If there was an error handling the set of link URLs. This error is not thrown @@ -58,7 +58,7 @@ public interface QueryResultHandler { * Indicates the start of a sequence of Solutions. The supplied bindingNames are an indication of the values that * are in the Solutions. For example, a SeRQL query like select X, Y from {X} P {Y} will have binding * names X and Y. - * + * * @param bindingNames An ordered set of binding names. * @throws TupleQueryResultHandlerException If there was an error during the starting of the query result handler. * This exception may be thrown if the {@link #handleBoolean(boolean)} @@ -69,11 +69,11 @@ public interface QueryResultHandler { * methods were called before this method and the handler cannot process * multiple sets of tuple results simultaneously. */ - public void startQueryResult(List bindingNames) throws TupleQueryResultHandlerException; + void startQueryResult(List bindingNames) throws TupleQueryResultHandlerException; /** * Indicates the end of a sequence of solutions. - * + * * @throws TupleQueryResultHandlerException If there was an error during the ending of the query result handler. * This exception may be thrown if the {@link #handleBoolean(boolean)} * method was called before this method and the handler cannot process both @@ -82,11 +82,11 @@ public interface QueryResultHandler { * @throws IllegalStateException If the {@link #endQueryResult()} was previously called for this handler * or {@link #startQueryResult(List)} was NOT called before this method. */ - public void endQueryResult() throws TupleQueryResultHandlerException; + void endQueryResult() throws TupleQueryResultHandlerException; /** * Handles a solution. - * + * * @param bindingSet A single set of tuple results, with binding names bound to values. Each of the binding names in * the solution must have previously been registered with the {@link #startQueryResult(List)} * method. @@ -98,5 +98,5 @@ public interface QueryResultHandler { * @throws IllegalStateException If the {@link #endQueryResult()} method was called before this method or * {@link #startQueryResult(List)} was NOT called before this method. */ - public void handleSolution(BindingSet bindingSet) throws TupleQueryResultHandlerException; + void handleSolution(BindingSet bindingSet) throws TupleQueryResultHandlerException; } diff --git a/core/query/src/main/java/org/eclipse/rdf4j/query/QueryResultHandlerException.java b/core/query/src/main/java/org/eclipse/rdf4j/query/QueryResultHandlerException.java index 036b36af458..57e152c5636 100644 --- a/core/query/src/main/java/org/eclipse/rdf4j/query/QueryResultHandlerException.java +++ b/core/query/src/main/java/org/eclipse/rdf4j/query/QueryResultHandlerException.java @@ -11,7 +11,7 @@ /** * The super class of exceptions originating from {@link QueryResultHandler} implementations. - * + * * @author Peter Ansell */ public class QueryResultHandlerException extends RDF4JException { @@ -20,7 +20,7 @@ public class QueryResultHandlerException extends RDF4JException { /** * Creates a new QueryResultHandlerException. - * + * * @param msg An error message. */ public QueryResultHandlerException(String msg) { @@ -29,7 +29,7 @@ public QueryResultHandlerException(String msg) { /** * Creates a new QueryResultHandlerException wrapping another exception. - * + * * @param t The cause of the exception. */ public QueryResultHandlerException(Throwable t) { @@ -38,7 +38,7 @@ public QueryResultHandlerException(Throwable t) { /** * Creates a new QueryResultHandlerException wrapping another exception. - * + * * @param msg An error message. * @param t The cause of the exception. */ @@ -46,4 +46,4 @@ public QueryResultHandlerException(String msg, Throwable t) { super(msg, t); } -} \ No newline at end of file +} diff --git a/core/query/src/main/java/org/eclipse/rdf4j/query/QueryResults.java b/core/query/src/main/java/org/eclipse/rdf4j/query/QueryResults.java index d66102cab36..9f7690f56f5 100644 --- a/core/query/src/main/java/org/eclipse/rdf4j/query/QueryResults.java +++ b/core/query/src/main/java/org/eclipse/rdf4j/query/QueryResults.java @@ -32,10 +32,11 @@ import org.eclipse.rdf4j.model.IRI; import org.eclipse.rdf4j.model.Literal; import org.eclipse.rdf4j.model.Model; +import org.eclipse.rdf4j.model.ModelFactory; import org.eclipse.rdf4j.model.Statement; import org.eclipse.rdf4j.model.Value; import org.eclipse.rdf4j.model.datatypes.XMLDatatypeUtil; -import org.eclipse.rdf4j.model.impl.LinkedHashModel; +import org.eclipse.rdf4j.model.impl.DynamicModelFactory; import org.eclipse.rdf4j.model.util.Models; import org.eclipse.rdf4j.model.vocabulary.XMLSchema; import org.eclipse.rdf4j.query.impl.BackgroundGraphResult; @@ -66,7 +67,22 @@ public class QueryResults extends Iterations { */ public static Model asModel(CloseableIteration iteration) throws QueryEvaluationException { - Model model = new LinkedHashModel(); + return asModel(iteration, new DynamicModelFactory()); + } + + /** + * Get a {@link Model} containing all elements obtained from the specified query result. + * + * @param iteration the source iteration to get the statements from. This can be a {@link GraphQueryResult}, a + * {@link RepositoryResult<Statement>}, or any other instance of {@link CloseableIteration + * <Statement>} + * @param modelFactory the ModelFactory used to instantiate the model that gets returned. + * @return a {@link Model} containing all statements obtained from the specified source iteration. + */ + public static Model asModel(CloseableIteration iteration, + ModelFactory modelFactory) + throws QueryEvaluationException { + Model model = modelFactory.createEmptyModel(); addAll(iteration, model); return model; } diff --git a/core/query/src/main/java/org/eclipse/rdf4j/query/TupleQuery.java b/core/query/src/main/java/org/eclipse/rdf4j/query/TupleQuery.java index 644cbb20d30..b8725c60b09 100644 --- a/core/query/src/main/java/org/eclipse/rdf4j/query/TupleQuery.java +++ b/core/query/src/main/java/org/eclipse/rdf4j/query/TupleQuery.java @@ -9,8 +9,8 @@ public interface TupleQuery extends Query { - public TupleQueryResult evaluate() throws QueryEvaluationException; + TupleQueryResult evaluate() throws QueryEvaluationException; - public void evaluate(TupleQueryResultHandler handler) + void evaluate(TupleQueryResultHandler handler) throws QueryEvaluationException, TupleQueryResultHandlerException; } diff --git a/core/query/src/main/java/org/eclipse/rdf4j/query/TupleQueryResult.java b/core/query/src/main/java/org/eclipse/rdf4j/query/TupleQueryResult.java index d8a569f90ef..3f50a2297e2 100644 --- a/core/query/src/main/java/org/eclipse/rdf4j/query/TupleQueryResult.java +++ b/core/query/src/main/java/org/eclipse/rdf4j/query/TupleQueryResult.java @@ -13,16 +13,16 @@ * A representation of a variable-binding query result as a sequence of {@link BindingSet} objects. Each query result * consists of zero or more solutions, each of which represents a single query solution as a set of bindings. Note: take * care to always close a TupleQueryResult after use to free any resources it keeps hold of. - * + * * @author jeen */ public interface TupleQueryResult extends QueryResult { /** * Gets the names of the bindings, in order of projection. - * + * * @return The binding names, in order of projection. * @throws QueryEvaluationException */ - public List getBindingNames() throws QueryEvaluationException; + List getBindingNames() throws QueryEvaluationException; } diff --git a/core/query/src/main/java/org/eclipse/rdf4j/query/TupleQueryResultHandlerException.java b/core/query/src/main/java/org/eclipse/rdf4j/query/TupleQueryResultHandlerException.java index 42035b3544b..0344f63509d 100644 --- a/core/query/src/main/java/org/eclipse/rdf4j/query/TupleQueryResultHandlerException.java +++ b/core/query/src/main/java/org/eclipse/rdf4j/query/TupleQueryResultHandlerException.java @@ -18,7 +18,7 @@ public class TupleQueryResultHandlerException extends QueryResultHandlerExceptio /** * Creates a new TupleQueryResultHandlerException. - * + * * @param msg An error message. */ public TupleQueryResultHandlerException(String msg) { @@ -27,7 +27,7 @@ public TupleQueryResultHandlerException(String msg) { /** * Creates a new TupleQueryResultHandlerException wrapping another exception. - * + * * @param cause The cause of the exception. */ public TupleQueryResultHandlerException(Throwable cause) { @@ -36,7 +36,7 @@ public TupleQueryResultHandlerException(Throwable cause) { /** * Creates a new TupleQueryResultHandlerException wrapping another exception. - * + * * @param msg An error message. * @param cause The cause of the exception. */ diff --git a/core/query/src/main/java/org/eclipse/rdf4j/query/UnsupportedQueryLanguageException.java b/core/query/src/main/java/org/eclipse/rdf4j/query/UnsupportedQueryLanguageException.java index 39d7cb2c7d0..9e215f868af 100644 --- a/core/query/src/main/java/org/eclipse/rdf4j/query/UnsupportedQueryLanguageException.java +++ b/core/query/src/main/java/org/eclipse/rdf4j/query/UnsupportedQueryLanguageException.java @@ -17,7 +17,7 @@ public class UnsupportedQueryLanguageException extends RuntimeException { /** * Creates a new UnsupportedRDFormatException. - * + * * @param msg An error message. */ public UnsupportedQueryLanguageException(String msg) { @@ -26,7 +26,7 @@ public UnsupportedQueryLanguageException(String msg) { /** * Creates a new UnsupportedRDFormatException. - * + * * @param cause The cause of the exception. */ public UnsupportedQueryLanguageException(Throwable cause) { @@ -35,7 +35,7 @@ public UnsupportedQueryLanguageException(Throwable cause) { /** * Creates a new UnsupportedRDFormatException wrapping another exception. - * + * * @param msg An error message. * @param cause The cause of the exception. */ diff --git a/core/query/src/main/java/org/eclipse/rdf4j/query/Update.java b/core/query/src/main/java/org/eclipse/rdf4j/query/Update.java index dc0b9e6d46f..d2304682436 100644 --- a/core/query/src/main/java/org/eclipse/rdf4j/query/Update.java +++ b/core/query/src/main/java/org/eclipse/rdf4j/query/Update.java @@ -10,14 +10,14 @@ /** * An update operation on a repository that can be formulated in one of the supported query languages (for example * SPARQL). - * + * * @author Jeen */ public interface Update extends Operation { /** * Execute this update on the repository. - * + * * @throws UpdateExecutionException if the update could not be successfully completed. */ void execute() throws UpdateExecutionException; diff --git a/core/query/src/main/java/org/eclipse/rdf4j/query/UpdateExecutionException.java b/core/query/src/main/java/org/eclipse/rdf4j/query/UpdateExecutionException.java index 997c8e17f83..f91489f8962 100644 --- a/core/query/src/main/java/org/eclipse/rdf4j/query/UpdateExecutionException.java +++ b/core/query/src/main/java/org/eclipse/rdf4j/query/UpdateExecutionException.java @@ -11,13 +11,13 @@ /** * An exception indicating that the execution of an update failed. - * + * * @author Jeen */ public class UpdateExecutionException extends RDF4JException { /** - * + * */ private static final long serialVersionUID = 7969399526232927434L; @@ -27,7 +27,7 @@ public UpdateExecutionException() { /** * Creates a new UpdateExecutionException. - * + * * @param msg An error message. */ public UpdateExecutionException(String msg) { @@ -36,7 +36,7 @@ public UpdateExecutionException(String msg) { /** * Creates a new {@link UpdateExecutionException} wrapping another exception. - * + * * @param cause the cause of the exception */ public UpdateExecutionException(Throwable cause) { @@ -45,7 +45,7 @@ public UpdateExecutionException(Throwable cause) { /** * Creates a new {@link UpdateExecutionException} wrapping another exception. - * + * * @param msg and error message. * @param cause the cause of the exception */ diff --git a/core/query/src/main/java/org/eclipse/rdf4j/query/dawg/DAWGTestResultSetParseException.java b/core/query/src/main/java/org/eclipse/rdf4j/query/dawg/DAWGTestResultSetParseException.java index a7554cbc130..06e32501ed3 100644 --- a/core/query/src/main/java/org/eclipse/rdf4j/query/dawg/DAWGTestResultSetParseException.java +++ b/core/query/src/main/java/org/eclipse/rdf4j/query/dawg/DAWGTestResultSetParseException.java @@ -19,7 +19,7 @@ public class DAWGTestResultSetParseException extends RDF4JException { /** * Creates a new DAWGTestResultSetParseException. - * + * * @param msg An error message. */ public DAWGTestResultSetParseException(String msg) { @@ -28,7 +28,7 @@ public DAWGTestResultSetParseException(String msg) { /** * Creates a new DAWGTestResultSetParseException wrapping another exception. - * + * * @param cause The cause of the exception. */ public DAWGTestResultSetParseException(Throwable cause) { @@ -37,7 +37,7 @@ public DAWGTestResultSetParseException(Throwable cause) { /** * Creates a new DAWGTestResultSetParseException wrapping another exception. - * + * * @param msg An error message. * @param cause The cause of the exception. */ diff --git a/core/query/src/main/java/org/eclipse/rdf4j/query/explanation/Explanation.java b/core/query/src/main/java/org/eclipse/rdf4j/query/explanation/Explanation.java new file mode 100644 index 00000000000..7089be2dc20 --- /dev/null +++ b/core/query/src/main/java/org/eclipse/rdf4j/query/explanation/Explanation.java @@ -0,0 +1,42 @@ +/******************************************************************************* + * Copyright (c) 2020 Eclipse RDF4J contributors. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Distribution License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ +package org.eclipse.rdf4j.query.explanation; + +import org.eclipse.rdf4j.common.annotation.Experimental; + +/** + * This is an experimental feature. The interface may be changed, moved or potentially removed in a future release. + * + * The interface is used to implement query explanations (query plan) + * + * @since 3.2.0 + */ +@Experimental +public interface Explanation { + + /** + * The different levels that the query explanation can be at. + * + * @since 3.2.0 + */ + @Experimental + enum Level { + Unoptimized, // simple parsed + Optimized, // parsed and optimized, which includes cost estimated + Executed, // plan as it was executed, which includes resultSizeActual + Timed, // plan as it was executed, including resultSizeActual and where each node has been timed + } + + // location in maven hierarchy prevents us from using TupleExpr here + // TupleExpr asTupleExpr(); + + GenericPlanNode toGenericPlanNode(); + + String toJson(); + +} diff --git a/core/query/src/main/java/org/eclipse/rdf4j/query/explanation/ExplanationImpl.java b/core/query/src/main/java/org/eclipse/rdf4j/query/explanation/ExplanationImpl.java new file mode 100644 index 00000000000..d3bc83645e6 --- /dev/null +++ b/core/query/src/main/java/org/eclipse/rdf4j/query/explanation/ExplanationImpl.java @@ -0,0 +1,61 @@ +/******************************************************************************* + * Copyright (c) 2020 Eclipse RDF4J contributors. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Distribution License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ +package org.eclipse.rdf4j.query.explanation; + +import org.eclipse.rdf4j.common.annotation.Experimental; + +import com.fasterxml.jackson.annotation.JsonAutoDetect; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.PropertyAccessor; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; + +/** + * This is an experimental feature. It may be changed, moved or potentially removed in a future release. + * + * @since 3.2.0 + */ +@Experimental +public class ExplanationImpl implements Explanation { + + private final GenericPlanNode genericPlanNode; + + public ExplanationImpl(GenericPlanNode genericPlanNode, boolean timedOut) { + this.genericPlanNode = genericPlanNode; + if (timedOut) { + genericPlanNode.setTimedOut(timedOut); + } + } + + ObjectMapper objectMapper = new ObjectMapper(); + + @Override + public GenericPlanNode toGenericPlanNode() { + return genericPlanNode; + } + + @Override + public String toJson() { + try { + // TODO: Consider removing pretty printer + return this.objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.PUBLIC_ONLY) + .setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.NONE) + .setSerializationInclusion(JsonInclude.Include.NON_NULL) + .writerWithDefaultPrettyPrinter() + .writeValueAsString(toGenericPlanNode()); + } catch (JsonProcessingException e) { + throw new RuntimeException(e); + } + } + + @Override + public String toString() { + return toGenericPlanNode().toString(); + } + +} diff --git a/core/query/src/main/java/org/eclipse/rdf4j/query/explanation/GenericPlanNode.java b/core/query/src/main/java/org/eclipse/rdf4j/query/explanation/GenericPlanNode.java new file mode 100644 index 00000000000..90aab4f4b00 --- /dev/null +++ b/core/query/src/main/java/org/eclipse/rdf4j/query/explanation/GenericPlanNode.java @@ -0,0 +1,345 @@ +/******************************************************************************* + * Copyright (c) 2020 Eclipse RDF4J contributors. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Distribution License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ +package org.eclipse.rdf4j.query.explanation; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Objects; +import java.util.stream.Stream; + +import org.eclipse.rdf4j.common.annotation.Experimental; + +/** + * This is an experimental feature. The interface may be changed, moved or potentially removed in a future release. + * + * The interface is used to implement query explanations (query plan) + * + * @since 3.2.0 + */ +@Experimental +public class GenericPlanNode { + + public static final String UNKNOWN = "UNKNOWN"; + + // The name of the node, eg. "Join" or "Join (HashJoinIteration)". + private String type; + + // Retrieving the explanation timed out while the query was executed. + private Boolean timedOut; + + // The cost estimate that the query planner calculated for this node. Value has no meaning outside of this + // explanation and is only used to compare and order the nodes in the query plan. + private Double costEstimate; + + // The number of results that this node was estimated to produce. + private Double resultSizeEstimate; + + // The actual number of results that this node produced while the query was executed. + private Long resultSizeActual; + + // The total time in milliseconds that this node-tree (all children and so on) used while the query was executed. + // selfTimeActual is the amount of time that this node used by itself (eg. totalTimeActual - sum of + // plans[0..n].totalTimeActual) + private Double totalTimeActual; + + // true if this node introduces a new scope + private Boolean newScope; + + // the name of the algorithm used as an annotation to the node type + private String algorithm; + + // Child plans for this node + private List plans = new ArrayList<>(); + + public GenericPlanNode() { + } + + public GenericPlanNode(String type) { + this.type = type; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public List getPlans() { + return plans.isEmpty() ? null : plans; // for simplified json + } + + public void setPlans(List plans) { + this.plans = plans; + } + + public void addPlans(GenericPlanNode... children) { + this.plans.addAll(Arrays.asList(children)); + } + + /** + * The cost estimate that the query planner calculated for this node. Value has no meaning outside of this + * explanation and is only used to compare and order the nodes in the query plan. + * + * @return + */ + public Double getCostEstimate() { + return costEstimate; + } + + public void setCostEstimate(Double costEstimate) { + if (costEstimate >= 0) { + this.costEstimate = costEstimate; + } + } + + /** + * The number of results that this node was estimated to produce. + * + * @return + */ + public Double getResultSizeEstimate() { + return resultSizeEstimate; + } + + public void setResultSizeEstimate(Double resultSizeEstimate) { + if (resultSizeEstimate >= 0) { + this.resultSizeEstimate = resultSizeEstimate; + } + } + + /** + * The actual number of results that this node produced while the query was executed. + * + * @return + */ + public Long getResultSizeActual() { + return resultSizeActual; + } + + public void setResultSizeActual(Long resultSizeActual) { + if (resultSizeActual >= 0) { + this.resultSizeActual = resultSizeActual; + } + } + + /** + * The total time in milliseconds that this node-tree (all children and so on) used while the query was executed. + * + * @return + */ + public Double getTotalTimeActual() { + // Not all nodes have their own totalTimeActual, but it can easily be calculated by looking that the child plans + // (recursively). We need this value to calculate the selfTimeActual. + if (totalTimeActual == null) { + double sum = plans.stream() + .map(GenericPlanNode::getTotalTimeActual) + .filter(Objects::nonNull) + .mapToDouble(d -> d) + .sum(); + + if (sum > 0) { + return sum; + } + } + return totalTimeActual; + } + + public void setTotalTimeActual(Double totalTimeActual) { + if (totalTimeActual >= 0) { + this.totalTimeActual = totalTimeActual; + } + } + + public void setTimedOut(Boolean timedOut) { + this.timedOut = timedOut; + } + + public Boolean getTimedOut() { + return timedOut; + } + + /** + * The time that this node used by itself (eg. totalTimeActual - sum of plans[0..n].totalTimeActual) + * + * @return + */ + public Double getSelfTimeActual() { + + if (totalTimeActual == null) { + return null; + } + + double childTime = plans + .stream() + .map(GenericPlanNode::getTotalTimeActual) + .filter(Objects::nonNull) + .mapToDouble(t -> t) + .sum(); + + return totalTimeActual - childTime; + + } + + /** + * + * @return true if this node introduces a new scope + */ + public Boolean isNewScope() { + return newScope; + } + + public void setNewScope(boolean newScope) { + if (newScope) { + this.newScope = true; + } else { + this.newScope = null; + } + } + + /** + * Join nodes can use various algorithms for joining data. + * + * @return the name of the algorithm. + */ + public String getAlgorithm() { + return algorithm; + } + + public void setAlgorithm(String algorithm) { + this.algorithm = algorithm; + } + + /** + * Human readable string. Do not attempt to parse this. + * + * @return + */ + @Override + public String toString() { + + StringBuilder sb = new StringBuilder(); + + String newLine = System.getProperty("line.separator"); + + if (timedOut != null && timedOut) { + sb.append("Timed out while retrieving explanation! Explanation may be incomplete!").append(newLine); + sb.append("You can change the timeout by setting .setMaxExecutionTime(...) on your query.") + .append(newLine) + .append(newLine); + } + + sb.append(type); + if (newScope != null && newScope) { + sb.append(" (new scope)"); + } + + if (algorithm != null) { + sb.append(" (").append(algorithm).append(")"); + } + appendCostAnnotation(sb); + sb.append(newLine); + plans.forEach(child -> sb.append(Arrays.stream(child.toString().split(newLine)) + .map(c -> " " + c) + .reduce((a, b) -> a + newLine + b) + .orElse("") + newLine)); + + return sb.toString(); + } + + /** + * + * @return Human readable number. Eg. 12.1M for 1212213.4 and UNKNOWN for -1. + */ + static private String toHumanReadableNumber(Double number) { + String humanReadbleString; + if (number == null) { + humanReadbleString = UNKNOWN; + } else if (number == Double.POSITIVE_INFINITY) { + humanReadbleString = "∞"; + } else if (number > 1_000_000) { + humanReadbleString = Math.round(number / 100_000) / 10.0 + "M"; + } else if (number > 1_000) { + humanReadbleString = Math.round(number / 100) / 10.0 + "K"; + } else if (number >= 0) { + humanReadbleString = Math.round(number) + ""; + } else { + humanReadbleString = UNKNOWN; + } + + return humanReadbleString; + } + + /** + * + * @return Human readable number. Eg. 12.1M for 1212213.4 and UNKNOWN for -1. + */ + static private String toHumanReadableNumber(Long number) { + String humanReadbleString; + if (number == null) { + humanReadbleString = UNKNOWN; + } else if (number == Double.POSITIVE_INFINITY) { + humanReadbleString = "∞"; + } else if (number > 1_000_000) { + humanReadbleString = number / 100_000 / 10.0 + "M"; + } else if (number > 1_000) { + humanReadbleString = number / 100 / 10.0 + "K"; + } else if (number >= 0) { + humanReadbleString = number + ""; + } else { + humanReadbleString = UNKNOWN; + } + + return humanReadbleString; + } + + /** + * + * @return Human readable time. + */ + static private String toHumanReadableTime(Double millis) { + String humanReadbleString; + + if (millis == null) { + humanReadbleString = UNKNOWN; + } else if (millis > 1_000) { + humanReadbleString = Math.round(millis / 100) / 10.0 + "s"; + } else if (millis >= 100) { + humanReadbleString = Math.round(millis) + "ms"; + } else if (millis >= 10) { + humanReadbleString = Math.round(millis * 10) / 10.0 + "ms"; + } else if (millis >= 1) { + humanReadbleString = Math.round(millis * 100) / 100.0 + "ms"; + } else if (millis >= 0) { + humanReadbleString = Math.round(millis * 1000) / 1000.0 + "ms"; + } else { + humanReadbleString = UNKNOWN; + } + + return humanReadbleString; + } + + private void appendCostAnnotation(StringBuilder sb) { + String costs = Stream.of( + "costEstimate=" + toHumanReadableNumber(getCostEstimate()), + "resultSizeEstimate=" + toHumanReadableNumber(getResultSizeEstimate()), + "resultSizeActual=" + toHumanReadableNumber(getResultSizeActual()), + "totalTimeActual=" + toHumanReadableTime(getTotalTimeActual()), + "selfTimeActual=" + toHumanReadableTime(getSelfTimeActual())) + .filter(s -> !s.endsWith(UNKNOWN)) // simple but hacky way of removing essentially null values + .reduce((a, b) -> a + ", " + b) + .orElse(""); + + if (!costs.isEmpty()) { + sb.append(" (").append(costs).append(")"); + } + } + +} diff --git a/core/query/src/main/java/org/eclipse/rdf4j/query/impl/AbstractOperation.java b/core/query/src/main/java/org/eclipse/rdf4j/query/impl/AbstractOperation.java index a4cbf31a6a3..7854da1f53c 100644 --- a/core/query/src/main/java/org/eclipse/rdf4j/query/impl/AbstractOperation.java +++ b/core/query/src/main/java/org/eclipse/rdf4j/query/impl/AbstractOperation.java @@ -14,7 +14,7 @@ /** * Abstract super class of all operation types. - * + * * @author Jeen Broekstra */ public abstract class AbstractOperation implements Operation { @@ -29,7 +29,7 @@ public abstract class AbstractOperation implements Operation { protected boolean includeInferred = true; - private int maxExecutionTime = 0; + private int maxExecutionTimeSeconds = 0; /*--------------* * Constructors * @@ -86,12 +86,12 @@ public boolean getIncludeInferred() { } @Override - public void setMaxExecutionTime(int maxExecutionTime) { - this.maxExecutionTime = maxExecutionTime; + public void setMaxExecutionTime(int maxExecutionTimeSeconds) { + this.maxExecutionTimeSeconds = maxExecutionTimeSeconds; } @Override public int getMaxExecutionTime() { - return maxExecutionTime; + return maxExecutionTimeSeconds; } } diff --git a/core/query/src/main/java/org/eclipse/rdf4j/query/impl/AbstractQuery.java b/core/query/src/main/java/org/eclipse/rdf4j/query/impl/AbstractQuery.java index 28497eb04df..b5c94f25611 100644 --- a/core/query/src/main/java/org/eclipse/rdf4j/query/impl/AbstractQuery.java +++ b/core/query/src/main/java/org/eclipse/rdf4j/query/impl/AbstractQuery.java @@ -31,8 +31,8 @@ protected AbstractQuery() { @Deprecated @Override - public void setMaxQueryTime(int maxQueryTime) { - setMaxExecutionTime(maxQueryTime); + public void setMaxQueryTime(int maxQueryTimeSeconds) { + setMaxExecutionTime(maxQueryTimeSeconds); } @@ -41,4 +41,5 @@ public void setMaxQueryTime(int maxQueryTime) { public int getMaxQueryTime() { return getMaxExecutionTime(); } + } diff --git a/core/query/src/main/java/org/eclipse/rdf4j/query/impl/BackgroundGraphResult.java b/core/query/src/main/java/org/eclipse/rdf4j/query/impl/BackgroundGraphResult.java index f88e005fbd6..43c9247a27f 100644 --- a/core/query/src/main/java/org/eclipse/rdf4j/query/impl/BackgroundGraphResult.java +++ b/core/query/src/main/java/org/eclipse/rdf4j/query/impl/BackgroundGraphResult.java @@ -25,7 +25,7 @@ /** * Provides concurrent access to statements as they are being parsed when instances of this class are run as Threads. - * + * * @author James Leigh */ public class BackgroundGraphResult extends IterationWrapper @@ -48,7 +48,7 @@ public class BackgroundGraphResult extends IterationWrapper queue; public BackgroundGraphResult(RDFParser parser, InputStream in, Charset charset, String baseURI) { - this(new QueueCursor(10), parser, in, charset, baseURI); + this(new QueueCursor<>(10), parser, in, charset, baseURI); } public BackgroundGraphResult(QueueCursor queue, RDFParser parser, InputStream in, Charset charset, diff --git a/core/query/src/main/java/org/eclipse/rdf4j/query/impl/EmptyBindingSet.java b/core/query/src/main/java/org/eclipse/rdf4j/query/impl/EmptyBindingSet.java index 5b53de8686c..882f3c73c9a 100644 --- a/core/query/src/main/java/org/eclipse/rdf4j/query/impl/EmptyBindingSet.java +++ b/core/query/src/main/java/org/eclipse/rdf4j/query/impl/EmptyBindingSet.java @@ -18,7 +18,7 @@ /** * An immutable empty BindingSet. - * + * * @author Arjohn Kampman */ public class EmptyBindingSet implements BindingSet { diff --git a/core/query/src/main/java/org/eclipse/rdf4j/query/impl/FallbackDataset.java b/core/query/src/main/java/org/eclipse/rdf4j/query/impl/FallbackDataset.java index 43be28d275a..88d53f90b9f 100644 --- a/core/query/src/main/java/org/eclipse/rdf4j/query/impl/FallbackDataset.java +++ b/core/query/src/main/java/org/eclipse/rdf4j/query/impl/FallbackDataset.java @@ -19,15 +19,17 @@ public class FallbackDataset implements Dataset, Serializable { /** - * + * */ private static final long serialVersionUID = 5866540736738270376L; public static Dataset fallback(Dataset primary, Dataset fallback) { - if (primary == null) + if (primary == null) { return fallback; - if (fallback == null) + } + if (fallback == null) { return primary; + } return new FallbackDataset(primary, fallback); } @@ -45,32 +47,36 @@ private FallbackDataset(Dataset primary, Dataset secondary) { @Override public Set getDefaultGraphs() { Set set = primary.getDefaultGraphs(); - if (set == null || set.isEmpty()) + if (set == null || set.isEmpty()) { return fallback.getDefaultGraphs(); + } return set; } @Override public Set getNamedGraphs() { Set set = primary.getNamedGraphs(); - if (set == null || set.isEmpty()) + if (set == null || set.isEmpty()) { return fallback.getNamedGraphs(); + } return set; } @Override public IRI getDefaultInsertGraph() { IRI graph = primary.getDefaultInsertGraph(); - if (graph == null) + if (graph == null) { return fallback.getDefaultInsertGraph(); + } return graph; } @Override public Set getDefaultRemoveGraphs() { Set set = primary.getDefaultRemoveGraphs(); - if (set == null || set.isEmpty()) + if (set == null || set.isEmpty()) { return fallback.getDefaultRemoveGraphs(); + } return set; } diff --git a/core/query/src/main/java/org/eclipse/rdf4j/query/impl/IteratingGraphQueryResult.java b/core/query/src/main/java/org/eclipse/rdf4j/query/impl/IteratingGraphQueryResult.java index ccc396468e6..0bac2cc0dac 100644 --- a/core/query/src/main/java/org/eclipse/rdf4j/query/impl/IteratingGraphQueryResult.java +++ b/core/query/src/main/java/org/eclipse/rdf4j/query/impl/IteratingGraphQueryResult.java @@ -20,7 +20,7 @@ /** * An iterating implementation of the {@link GraphQueryResult} interface. - * + * * @author Arjohn Kampman * @author Jeen Broekstra */ diff --git a/core/query/src/main/java/org/eclipse/rdf4j/query/impl/IteratingTupleQueryResult.java b/core/query/src/main/java/org/eclipse/rdf4j/query/impl/IteratingTupleQueryResult.java index 59ff27c4b49..a1238310a21 100644 --- a/core/query/src/main/java/org/eclipse/rdf4j/query/impl/IteratingTupleQueryResult.java +++ b/core/query/src/main/java/org/eclipse/rdf4j/query/impl/IteratingTupleQueryResult.java @@ -38,7 +38,7 @@ public class IteratingTupleQueryResult extends IterationWrapperThe supplied list of binding names is assumed * to be constant; care should be taken that the contents of this list doesn't change after supplying it to * this solution. - * + * * @param bindingNames The binding names, in order of projection. */ public IteratingTupleQueryResult(List bindingNames, Iterable bindingSets) { @@ -53,7 +53,7 @@ public IteratingTupleQueryResult(List bindingNames, IteratorThe supplied list of binding names is assumed * to be constant; care should be taken that the contents of this list doesn't change after supplying it to * this solution. - * + * * @param bindingNames The binding names, in order of projection. */ public IteratingTupleQueryResult(List bindingNames, @@ -72,5 +72,4 @@ public IteratingTupleQueryResult(List bindingNames, public List getBindingNames() throws QueryEvaluationException { return bindingNames; } - } diff --git a/core/query/src/main/java/org/eclipse/rdf4j/query/impl/ListBindingSet.java b/core/query/src/main/java/org/eclipse/rdf4j/query/impl/ListBindingSet.java index 25f0952d7ae..11d1a1bc196 100644 --- a/core/query/src/main/java/org/eclipse/rdf4j/query/impl/ListBindingSet.java +++ b/core/query/src/main/java/org/eclipse/rdf4j/query/impl/ListBindingSet.java @@ -20,7 +20,7 @@ /** * A List-based implementation of the {@link BindingSet} interface. - * + * * @author Arjohn Kampman */ public class ListBindingSet extends AbstractBindingSet { @@ -35,7 +35,7 @@ public class ListBindingSet extends AbstractBindingSet { * Creates a new List-based BindingSet containing the supplied bindings. The supplied list of binding names is * assumed to be constant; care should be taken that the contents of this list doesn't change after supplying * it to this solution. The number of supplied values must be equal to the number of the binding names. - * + * * @param names The binding names. * @param values The binding values. */ @@ -47,7 +47,7 @@ public ListBindingSet(List names, Value... values) { * Creates a new List-based BindingSet containing the supplied bindings. The supplied lists are assumed to be * constant; care should be taken that the contents of these lists don't change after supplying them to this * solution. The number of supplied values must be equal to the number of the binding names. - * + * * @param bindingNames The binding names. * @param values The binding values. */ diff --git a/core/query/src/main/java/org/eclipse/rdf4j/query/impl/MapBindingSet.java b/core/query/src/main/java/org/eclipse/rdf4j/query/impl/MapBindingSet.java index 4bf4934e6a5..d441123c0b2 100644 --- a/core/query/src/main/java/org/eclipse/rdf4j/query/impl/MapBindingSet.java +++ b/core/query/src/main/java/org/eclipse/rdf4j/query/impl/MapBindingSet.java @@ -33,7 +33,7 @@ public MapBindingSet() { /** * Creates a new Map-based BindingSet with the specified initial capacity. Bindings can be added to this binding set * using the {@link #addBinding} methods. - * + * * @param capacity The initial capacity of the created BindingSet object. */ public MapBindingSet(int capacity) { @@ -43,7 +43,7 @@ public MapBindingSet(int capacity) { /** * Adds a binding to the binding set. - * + * * @param name The binding's name. * @param value The binding's value. */ @@ -53,7 +53,7 @@ public void addBinding(String name, Value value) { /** * Adds a binding to the binding set. - * + * * @param binding The binding to add to the binding set. */ public void addBinding(Binding binding) { @@ -62,7 +62,7 @@ public void addBinding(Binding binding) { /** * Removes a binding from the binding set. - * + * * @param name The binding's name. */ public void removeBinding(String name) { diff --git a/core/query/src/main/java/org/eclipse/rdf4j/query/impl/MutableTupleQueryResult.java b/core/query/src/main/java/org/eclipse/rdf4j/query/impl/MutableTupleQueryResult.java index 8743f0e860c..87aea2cb613 100644 --- a/core/query/src/main/java/org/eclipse/rdf4j/query/impl/MutableTupleQueryResult.java +++ b/core/query/src/main/java/org/eclipse/rdf4j/query/impl/MutableTupleQueryResult.java @@ -25,7 +25,7 @@ * An implementation of the {@link TupleQueryResult} interface that stores the complete query result in memory. The * query results in a MutableTupleQueryResult can be iterated over multiple times and can also be iterated over in * reverse order. - * + * * @author Arjohn Kampman */ public class MutableTupleQueryResult implements TupleQueryResult, Cloneable { @@ -61,7 +61,7 @@ public MutableTupleQueryResult(Collection bindingN * Creates a query result table with the supplied binding names. The supplied list of binding names is assumed * to be constant; care should be taken that the contents of this list doesn't change after supplying it to * this solution. - * + * * @param bindingNames The binding names, in order of projection. */ public MutableTupleQueryResult(Collection bindingNames, Collection bindingSets) { @@ -161,7 +161,7 @@ public void afterLast() { * {@link #previous}, if any. (If the table contains no binding sets, the new element becomes the sole element on * the table.) The new element is inserted before the implicit cursor: a subsequent call to next() would be * unaffected, and a subsequent call to previous() would return the new binding set. - * + * * @param bindingSet The binding set to insert. */ public void insert(BindingSet bindingSet) { diff --git a/core/query/src/main/java/org/eclipse/rdf4j/query/impl/QueueCursor.java b/core/query/src/main/java/org/eclipse/rdf4j/query/impl/QueueCursor.java index 9d3e42793b9..efcdc3e1cc8 100644 --- a/core/query/src/main/java/org/eclipse/rdf4j/query/impl/QueueCursor.java +++ b/core/query/src/main/java/org/eclipse/rdf4j/query/impl/QueueCursor.java @@ -16,14 +16,14 @@ /** * Makes working with a queue easier by adding the methods {@link #done()} and {@link #toss(Exception)} and * automatically converting the exception into a QueryEvaluationException with an appropriate stack trace. - * + * * @author James Leigh */ public class QueueCursor extends QueueIteration { /** * Creates an QueueCursor with the given (fixed) capacity and default access policy. - * + * * @param capacity the capacity of this queue */ public QueueCursor(int capacity) { @@ -32,7 +32,7 @@ public QueueCursor(int capacity) { /** * Creates an QueueCursor with the given (fixed) capacity and the specified access policy. - * + * * @param capacity the capacity of this queue * @param fair if true then queue accesses for threads blocked on insertion or removal, are processed * in FIFO order; if false the access order is unspecified. @@ -45,7 +45,7 @@ public QueueCursor(int capacity, boolean fair) { * Creates an QueueCursor with the given {@link BlockingQueue} as its backing queue.
    * It may not be threadsafe to modify or access the given {@link BlockingQueue} from other locations. This method * only enables the default {@link ArrayBlockingQueue} to be overridden. - * + * * @param queue A BlockingQueue that is not used in other locations, but will be used as the backing Queue * implementation for this cursor. */ diff --git a/core/query/src/main/java/org/eclipse/rdf4j/query/impl/SimpleBinding.java b/core/query/src/main/java/org/eclipse/rdf4j/query/impl/SimpleBinding.java index a7d460ca3a8..bcb87e578f7 100644 --- a/core/query/src/main/java/org/eclipse/rdf4j/query/impl/SimpleBinding.java +++ b/core/query/src/main/java/org/eclipse/rdf4j/query/impl/SimpleBinding.java @@ -12,7 +12,7 @@ /** * An implementation of the {@link Binding} interface. - * + * * @author Jeen Broekstra */ public class SimpleBinding implements Binding { @@ -25,7 +25,7 @@ public class SimpleBinding implements Binding { /** * Creates a binding object with the supplied name and value. - * + * * @param name The binding's name. * @param value The binding's value. */ diff --git a/core/query/src/main/java/org/eclipse/rdf4j/query/impl/SimpleDataset.java b/core/query/src/main/java/org/eclipse/rdf4j/query/impl/SimpleDataset.java index 49b0e236224..285cce64ff1 100644 --- a/core/query/src/main/java/org/eclipse/rdf4j/query/impl/SimpleDataset.java +++ b/core/query/src/main/java/org/eclipse/rdf4j/query/impl/SimpleDataset.java @@ -17,7 +17,7 @@ /** * A simple implementation of the {@link Dataset} interface. - * + * * @author Arjohn Kampman * @author James Leigh */ @@ -50,7 +50,7 @@ public void addDefaultRemoveGraph(IRI graphURI) { /** * Removes a graph URI from the set of default remove graph URIs. - * + * * @return true if the URI was removed from the set, false if the set did not contain the URI. */ public boolean removeDefaultRemoveGraph(IRI graphURI) { @@ -86,7 +86,7 @@ public void addDefaultGraph(IRI graphURI) { /** * Removes a graph URI from the set of default graph URIs. - * + * * @return true if the URI was removed from the set, false if the set did not contain the URI. */ public boolean removeDefaultGraph(IRI graphURI) { @@ -110,7 +110,7 @@ public void addNamedGraph(IRI graphURI) { /** * Removes a graph URI from the set of named graph URIs. - * + * * @return true if the URI was removed from the set, false if the set did not contain the URI. */ public boolean removeNamedGraph(IRI graphURI) { diff --git a/core/query/src/test/java/org/eclipse/rdf4j/query/BindingSetTest.java b/core/query/src/test/java/org/eclipse/rdf4j/query/BindingSetTest.java index d0ad009873d..9f63b5ebfe5 100644 --- a/core/query/src/test/java/org/eclipse/rdf4j/query/BindingSetTest.java +++ b/core/query/src/test/java/org/eclipse/rdf4j/query/BindingSetTest.java @@ -13,7 +13,7 @@ /** * Unit tests for BindingSet implementations. - * + * * @author jeen */ public abstract class BindingSetTest { @@ -37,7 +37,7 @@ public void testEqualsHashcode() { /** * Creates two equal, but differently ordered, BindingSet objects. - * + * * @return an array of two equal but differently ordered BindingSets. */ protected abstract T[] createTwoEqualReorderedBindingSets(); diff --git a/core/query/src/test/java/org/eclipse/rdf4j/query/impl/ListBindingSetTest.java b/core/query/src/test/java/org/eclipse/rdf4j/query/impl/ListBindingSetTest.java index ddad783bc6f..bb79daf6fed 100644 --- a/core/query/src/test/java/org/eclipse/rdf4j/query/impl/ListBindingSetTest.java +++ b/core/query/src/test/java/org/eclipse/rdf4j/query/impl/ListBindingSetTest.java @@ -15,7 +15,7 @@ /** * Unit tests for {@link ListBindingSet} - * + * * @author Jeen Broekstra */ public class ListBindingSetTest extends BindingSetTest { diff --git a/core/query/src/test/java/org/eclipse/rdf4j/query/impl/MapBindingSetTest.java b/core/query/src/test/java/org/eclipse/rdf4j/query/impl/MapBindingSetTest.java index fda9530c224..5161e343c8c 100644 --- a/core/query/src/test/java/org/eclipse/rdf4j/query/impl/MapBindingSetTest.java +++ b/core/query/src/test/java/org/eclipse/rdf4j/query/impl/MapBindingSetTest.java @@ -12,7 +12,7 @@ /** * Unit tests for {@link MapBindingSet} - * + * * @author Jeen Broekstra */ public class MapBindingSetTest extends BindingSetTest { diff --git a/core/queryalgebra/evaluation/pom.xml b/core/queryalgebra/evaluation/pom.xml index 31cab23f964..f3f7a0040f8 100644 --- a/core/queryalgebra/evaluation/pom.xml +++ b/core/queryalgebra/evaluation/pom.xml @@ -4,7 +4,7 @@ org.eclipse.rdf4j rdf4j-queryalgebra - 3.1.5-SNAPSHOT + 3.2.2-SNAPSHOT rdf4j-queryalgebra-evaluation RDF4J: Query algebra - evaluation diff --git a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/AbstractQueryPreparer.java b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/AbstractQueryPreparer.java index df4c2fce308..e1cffb53cb6 100644 --- a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/AbstractQueryPreparer.java +++ b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/AbstractQueryPreparer.java @@ -34,6 +34,7 @@ import org.eclipse.rdf4j.query.UpdateExecutionException; import org.eclipse.rdf4j.query.algebra.TupleExpr; import org.eclipse.rdf4j.query.algebra.UpdateExpr; +import org.eclipse.rdf4j.query.explanation.Explanation; import org.eclipse.rdf4j.query.impl.IteratingGraphQueryResult; import org.eclipse.rdf4j.query.impl.IteratingTupleQueryResult; import org.eclipse.rdf4j.query.parser.ParsedBooleanQuery; @@ -126,6 +127,11 @@ public boolean evaluate() throws QueryEvaluationException { } } } + + @Override + public Explanation explain(Explanation.Level level) { + throw new UnsupportedOperationException(); + } } class TupleQueryImpl extends AbstractParserQuery implements TupleQuery { @@ -180,6 +186,11 @@ public void evaluate(TupleQueryResultHandler handler) TupleQueryResult queryResult = evaluate(); QueryResults.report(queryResult, handler); } + + @Override + public Explanation explain(Explanation.Level level) { + throw new UnsupportedOperationException(); + } } class GraphQueryImpl extends AbstractParserQuery implements GraphQuery { @@ -284,6 +295,11 @@ public void evaluate(RDFHandler handler) throws QueryEvaluationException, RDFHan GraphQueryResult queryResult = evaluate(); QueryResults.report(queryResult, handler); } + + @Override + public Explanation explain(Explanation.Level level) { + throw new UnsupportedOperationException(); + } } class UpdateImpl extends AbstractParserUpdate { diff --git a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/EvaluationStrategy.java b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/EvaluationStrategy.java index 161bbe12714..b294c5a00f8 100644 --- a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/EvaluationStrategy.java +++ b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/EvaluationStrategy.java @@ -7,6 +7,7 @@ *******************************************************************************/ package org.eclipse.rdf4j.query.algebra.evaluation; +import org.eclipse.rdf4j.common.annotation.Experimental; import org.eclipse.rdf4j.common.iteration.CloseableIteration; import org.eclipse.rdf4j.model.Value; import org.eclipse.rdf4j.query.BindingSet; @@ -21,7 +22,7 @@ /** * Evaluates {@link TupleExpr}s and {@link ValueExpr}s. - * + * * @author Arjohn Kampman * @author James Leigh */ @@ -30,27 +31,27 @@ public interface EvaluationStrategy extends FederatedServiceResolver { /** * Retrieve the {@link FederatedService} registered for serviceUrl. If there is no service registered for * serviceUrl, a new {@link SPARQLFederatedService} is created and registered. - * + * * @param serviceUrl URL of the service. * @return the {@link FederatedService} registered for the serviceUrl. * @throws QueryEvaluationException * @see org.eclipse.rdf4j.query.algebra.evaluation.federation.FederatedServiceResolver#getService(java.lang.String) */ @Override - public FederatedService getService(String serviceUrl) throws QueryEvaluationException; + FederatedService getService(String serviceUrl) throws QueryEvaluationException; /** * Set the {@link QueryOptimizerPipeline} to use for optimizing any incoming queries. - * + * * @param pipeline the {@link QueryOptimizerPipeline}. * @see #optimize(TupleExpr, EvaluationStatistics, BindingSet) * @since 3.0 */ - public void setOptimizerPipeline(QueryOptimizerPipeline pipeline); + void setOptimizerPipeline(QueryOptimizerPipeline pipeline); /** * Execute the {@link QueryOptimizerPipeline} on the given {@link TupleExpr} to optimize its execution plan. - * + * * @param expr the {@link TupleExpr} to optimize. * @param evaluationStatistics the {@link EvaluationStatistics} of the data source, to be used for query planning. * @param bindings a-priori bindings supplied for the query, which can potentially be inlined. @@ -58,45 +59,45 @@ public interface EvaluationStrategy extends FederatedServiceResolver { * @see #setOptimizerPipeline(QueryOptimizerPipeline) * @since 3.0 */ - public TupleExpr optimize(TupleExpr expr, EvaluationStatistics evaluationStatistics, + TupleExpr optimize(TupleExpr expr, EvaluationStatistics evaluationStatistics, BindingSet bindings); /** * Evaluates the tuple expression against the supplied triple source with the specified set of variable bindings as * input. - * + * * @param expr The Service Expression to evaluate * @param serviceUri TODO * @param bindings The variables bindings iterator to use for evaluating the expression, if applicable. * @return A closeable iterator over all of variable binding sets that match the tuple expression. */ - public CloseableIteration evaluate(Service expr, String serviceUri, + CloseableIteration evaluate(Service expr, String serviceUri, CloseableIteration bindings) throws QueryEvaluationException; /** * Evaluates the tuple expression against the supplied triple source with the specified set of variable bindings as * input. - * + * * @param expr The Tuple Expression to evaluate * @param bindings The variables bindings to use for evaluating the expression, if applicable. * @return A closeable iterator over the variable binding sets that match the tuple expression. */ - public CloseableIteration evaluate(TupleExpr expr, BindingSet bindings) + CloseableIteration evaluate(TupleExpr expr, BindingSet bindings) throws QueryEvaluationException; /** * Gets the value of this expression. - * + * * @param expr * @param bindings The variables bindings to use for evaluating the expression, if applicable. * @return The Value that this expression evaluates to, or null if the expression could not be evaluated. */ - public Value evaluate(ValueExpr expr, BindingSet bindings) + Value evaluate(ValueExpr expr, BindingSet bindings) throws ValueExprEvaluationException, QueryEvaluationException; /** * Evaluates the boolean expression on the supplied TripleSource object. - * + * * @param expr * @param bindings The variables bindings to use for evaluating the expression, if applicable. * @return The result of the evaluation. @@ -104,6 +105,28 @@ public Value evaluate(ValueExpr expr, BindingSet bindings) * two incompatible operands. When thrown, the result of the boolean expression * is neither true nor false , but unknown. */ - public boolean isTrue(ValueExpr expr, BindingSet bindings) + boolean isTrue(ValueExpr expr, BindingSet bindings) throws ValueExprEvaluationException, QueryEvaluationException; + + /** + * Enable or disable results size tracking for the query plan. Useful to determine which parts of a query plan + * generated the most data. + * + * @param trackResultSize true to enable tracking. + */ + @Experimental + default void setTrackResultSize(boolean trackResultSize) { + // no-op for backwards compatibility + } + + /** + * Enable or disable time tracking for the query plan. Useful to determine which parts of a query plan take the most + * time to evaluate. + * + * @param trackTime true to enable tracking. + */ + @Experimental + default void setTrackTime(boolean trackTime) { + // no-op for backwards compatibility + } } diff --git a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/EvaluationStrategyFactory.java b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/EvaluationStrategyFactory.java index 85d75b3b6d8..4ba0ddb68ab 100644 --- a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/EvaluationStrategyFactory.java +++ b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/EvaluationStrategyFactory.java @@ -21,7 +21,7 @@ public interface EvaluationStrategyFactory { * Set the number of query solutions the {@link EvaluationStrategy} will keep in main memory before it attempts to * sync to a temporary disk cache. If set to 0, no disk caching will occur. EvaluationStrategies that provide no * disk caching functionality are free to ignore this parameter. - * + * * @param threshold the number of query solutions that the EvaluationStrategy can cache in main memory before * attempting disk sync. */ @@ -36,7 +36,7 @@ public interface EvaluationStrategyFactory { /** * Set a {@link QueryOptimizerPipeline} to be used for query execution planning by the {@link EvaluationStrategy}. - * + * * @param pipeline a {@link QueryOptimizerPipeline} */ void setOptimizerPipeline(QueryOptimizerPipeline pipeline); @@ -44,7 +44,7 @@ public interface EvaluationStrategyFactory { /** * Get the {@link QueryOptimizerPipeline} that this factory will inject into the {@link EvaluationStrategy}, if any. * If no {@link QueryOptimizerPipeline} is defined, the {@link EvaluationStrategy} itself determines the pipeline. - * + * * @return a {@link QueryOptimizerPipeline}, or {@link Optional#empty()} if no pipeline is set on this factory. */ Optional getOptimizerPipeline(); @@ -52,7 +52,7 @@ public interface EvaluationStrategyFactory { /** * Returns the {@link EvaluationStrategy} to use to evaluate queries for the given {@link Dataset} and * {@link TripleSource}. - * + * * @param dataset the DataSet to evaluate queries against. * @param tripleSource the TripleSource to evaluate queries against. * @param evaluationStatistics the store evaluation statistics to use for query optimization. @@ -61,4 +61,24 @@ public interface EvaluationStrategyFactory { EvaluationStrategy createEvaluationStrategy(Dataset dataset, TripleSource tripleSource, EvaluationStatistics evaluationStatistics); + /** + * Returns the status of the result size tracking for the query plan. Useful to determine which parts of a query + * plan generated the most data. + * + * @return true if result size tracking is enabled. + */ + default boolean isTrackResultSize() { + return false; + } + + /** + * Enable or disable results size tracking for the query plan. Useful to determine which parts of a query plan + * generated the most data. + * + * @param trackResultSize true to enable tracking. + */ + default void setTrackResultSize(boolean trackResultSize) { + // no-op for backwards compatibility + } + } diff --git a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/QueryBindingSet.java b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/QueryBindingSet.java index fcf6f429ef9..f15e59239e7 100644 --- a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/QueryBindingSet.java +++ b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/QueryBindingSet.java @@ -59,7 +59,7 @@ public void addAll(BindingSet bindingSet) { /** * Adds a new binding to the binding set. The binding's name must not already be part of this binding set. - * + * * @param binding The binding to add this this BindingSet. */ public void addBinding(Binding binding) { @@ -68,7 +68,7 @@ public void addBinding(Binding binding) { /** * Adds a new binding to the binding set. The binding's name must not already be part of this binding set. - * + * * @param name The binding's name, must not be bound in this binding set already. * @param value The binding's value. */ @@ -152,4 +152,4 @@ public boolean equals(Object other) { return super.equals(other); } } -} \ No newline at end of file +} diff --git a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/QueryContext.java b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/QueryContext.java index 2867da5bd79..9a9894042b1 100644 --- a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/QueryContext.java +++ b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/QueryContext.java @@ -23,7 +23,7 @@ public class QueryContext { private static final String QUERY_PREPARER_ATTRIBUTE = QueryPreparer.class.getName(); - private static final ThreadLocal queryContext = new ThreadLocal(); + private static final ThreadLocal queryContext = new ThreadLocal<>(); public static QueryContext getQueryContext() { return queryContext.get(); diff --git a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/QueryContextInitializer.java b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/QueryContextInitializer.java index 3f8d0009230..aac02b8e6b3 100644 --- a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/QueryContextInitializer.java +++ b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/QueryContextInitializer.java @@ -14,14 +14,14 @@ public interface QueryContextInitializer { /** * Called after a QueryContext has begun. - * + * * @param ctx */ void init(QueryContext ctx); /** * Called before a QueryContext has ended. - * + * * @param ctx */ void destroy(QueryContext ctx); diff --git a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/QueryOptimizer.java b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/QueryOptimizer.java index 0987731683b..e3e2642ce1e 100644 --- a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/QueryOptimizer.java +++ b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/QueryOptimizer.java @@ -13,7 +13,7 @@ /** * Interface used by {@link EvaluationStrategy}s to optimize the {@link TupleExpr} prior to evaluating the query. - * + * * @author James Leigh * @author Arjohn Kampman * @see QueryOptimizerPipeline diff --git a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/QueryOptimizerPipeline.java b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/QueryOptimizerPipeline.java index 5f754bd68d3..1e8a40b6f85 100644 --- a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/QueryOptimizerPipeline.java +++ b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/QueryOptimizerPipeline.java @@ -12,7 +12,7 @@ /** * A pipeline of {@link QueryOptimizer}s that, when executed in order on a {@link TupleExpr}, convert that * {@link TupleExpr} to a more optimal query execution plan. - * + * * @author Jeen Broekstra * */ @@ -20,7 +20,7 @@ public interface QueryOptimizerPipeline { /** * Get the optimizers that make up this pipeline. - * + * * @return an {@link Iterable} of {@link QueryOptimizer}s */ Iterable getOptimizers(); diff --git a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/RDFStarTripleSource.java b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/RDFStarTripleSource.java new file mode 100644 index 00000000000..8a806bd7863 --- /dev/null +++ b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/RDFStarTripleSource.java @@ -0,0 +1,31 @@ +/******************************************************************************* + * Copyright (c) 2020 Eclipse RDF4J contributors. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Distribution License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ +package org.eclipse.rdf4j.query.algebra.evaluation; + +import org.eclipse.rdf4j.common.iteration.CloseableIteration; +import org.eclipse.rdf4j.model.IRI; +import org.eclipse.rdf4j.model.Resource; +import org.eclipse.rdf4j.model.Triple; +import org.eclipse.rdf4j.model.Value; +import org.eclipse.rdf4j.query.QueryEvaluationException; + +public interface RDFStarTripleSource extends TripleSource { + /** + * Gets all Triple nodes that have a specific subject, predicate and/or object. All three parameters may be null to + * indicate wildcards. + * + * @param subj A Resource specifying the triple's subject, or null for a wildcard. + * @param pred A URI specifying the triple's predicate, or null for a wildcard. + * @param obj A Value specifying the triple's object, or null for a wildcard. + * @return An iterator over the relevant triples. + * @throws QueryEvaluationException If the rdf star triple source failed to get the statements. + */ + public CloseableIteration getRdfStarTriples(Resource subj, IRI pred, + Value obj) throws QueryEvaluationException; + +} diff --git a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/TripleSource.java b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/TripleSource.java index db9ee34a00b..36ebacd74ab 100644 --- a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/TripleSource.java +++ b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/TripleSource.java @@ -25,7 +25,7 @@ public interface TripleSource { * Gets all statements that have a specific subject, predicate and/or object. All three parameters may be null to * indicate wildcards. Optionally a (set of) context(s) may be specified in which case the result will be restricted * to statements matching one or more of the specified contexts. - * + * * @param subj A Resource specifying the subject, or null for a wildcard. * @param pred A URI specifying the predicate, or null for a wildcard. * @param obj A Value specifying the object, or null for a wildcard. @@ -39,7 +39,7 @@ public CloseableIteration getStat /** * Gets a ValueFactory object that can be used to create URI-, blank node- and literal objects. - * + * * @return a ValueFactory object for this TripleSource. */ public ValueFactory getValueFactory(); diff --git a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/ValueExprEvaluationException.java b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/ValueExprEvaluationException.java index 32bfa5c1e1d..a2a1e7458c1 100644 --- a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/ValueExprEvaluationException.java +++ b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/ValueExprEvaluationException.java @@ -13,7 +13,7 @@ /** * An exception indicating that a {@link ValueExpr} could not be evaluated due to illegal or incompatible values. When * thrown, the result of the evaluation should be considered to be "unknown". - * + * * @author Arjohn Kampman */ public class ValueExprEvaluationException extends QueryEvaluationException { diff --git a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/federation/FederatedServiceResolverImpl.java b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/federation/FederatedServiceResolverImpl.java index 645344a846c..dd0377f9f4e 100644 --- a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/federation/FederatedServiceResolverImpl.java +++ b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/federation/FederatedServiceResolverImpl.java @@ -13,7 +13,7 @@ *

    * Lookup can be done via the serviceUrl using the method {@link #getService(String)}. If there is no service for the * specified url, a {@link SPARQLFederatedService} is created and registered for future use. - * + * * @author Andreas Schwarte * @author James Leigh * @deprecated since 2.3 use {@link org.eclipse.rdf4j.repository.sparql.federation.SPARQLServiceResolver} diff --git a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/federation/JoinExecutorBase.java b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/federation/JoinExecutorBase.java index 7414c279112..0c5ffdde29c 100644 --- a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/federation/JoinExecutorBase.java +++ b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/federation/JoinExecutorBase.java @@ -17,7 +17,7 @@ * Base class for any join parallel join executor. Note that this class extends {@link LookAheadIteration} and thus any * implementation of this class is applicable for pipelining when used in a different thread (access to shared variables * is synchronized). - * + * * @author Andreas Schwarte * @deprecated since 2.3 use {@link org.eclipse.rdf4j.repository.sparql.federation.JoinExecutorBase} */ diff --git a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/federation/RepositoryFederatedService.java b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/federation/RepositoryFederatedService.java index 1f02c395537..1daab3456c7 100644 --- a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/federation/RepositoryFederatedService.java +++ b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/federation/RepositoryFederatedService.java @@ -11,7 +11,7 @@ /** * Federated Service wrapping the {@link Repository} to communicate with a SPARQL endpoint. - * + * * @author Andreas Schwarte * @deprecated since 2.3 use {@link org.eclipse.rdf4j.repository.sparql.federation.RepositoryFederatedService} */ diff --git a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/federation/SPARQLFederatedService.java b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/federation/SPARQLFederatedService.java index d50bf831cf6..29966a40131 100644 --- a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/federation/SPARQLFederatedService.java +++ b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/federation/SPARQLFederatedService.java @@ -12,7 +12,7 @@ /** * Federated Service wrapping the {@link SPARQLRepository} to communicate with a SPARQL endpoint. - * + * * @author Andreas Schwarte * @deprecated since 2.3 use {@link org.eclipse.rdf4j.repository.sparql.federation.SPARQLFederatedService} */ diff --git a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/federation/ServiceCrossProductIteration.java b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/federation/ServiceCrossProductIteration.java index 6517ea8ac25..0ebef634a71 100644 --- a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/federation/ServiceCrossProductIteration.java +++ b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/federation/ServiceCrossProductIteration.java @@ -19,7 +19,7 @@ * inner iteration. See {@link SPARQLFederatedService}. Example: inputBindings := {b1, b2, ...} resultIteration * := {r1, r2, ...} getNextElement() returns (r1,b1), (r1, b2), ..., (r2, b1), (r2, b2), ... i.e. compute the cross * product per result binding - * + * * @author Andreas Schwarte */ @Deprecated diff --git a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/federation/ServiceJoinConversionIteration.java b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/federation/ServiceJoinConversionIteration.java index 2535e8d664f..043d1a35cf2 100644 --- a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/federation/ServiceJoinConversionIteration.java +++ b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/federation/ServiceJoinConversionIteration.java @@ -16,7 +16,7 @@ /** * Inserts original bindings into the result, uses ?__rowIdx to resolve original bindings. See * {@link ServiceJoinIterator} and {@link SPARQLFederatedService}. - * + * * @author Andreas Schwarte * @deprecated since 2.3 use {@link org.eclipse.rdf4j.repository.sparql.federation.ServiceJoinConversionIteration} */ diff --git a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/federation/ServiceJoinIterator.java b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/federation/ServiceJoinIterator.java index a7a7647c6ce..3840e4ded24 100644 --- a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/federation/ServiceJoinIterator.java +++ b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/federation/ServiceJoinIterator.java @@ -16,7 +16,7 @@ /** * Iterator for efficient SERVICE evaluation (vectored). SERVICE is the right handside argument of this join. - * + * * @author Andreas Schwarte */ public class ServiceJoinIterator extends JoinExecutorBase { @@ -27,7 +27,7 @@ public class ServiceJoinIterator extends JoinExecutorBase { /** * Construct a service join iteration to use vectored evaluation. The constructor automatically starts evaluation. - * + * * @param leftIter * @param service * @param bindings @@ -47,9 +47,9 @@ protected void handleBindings() throws Exception { Var serviceRef = service.getServiceRef(); String serviceUri; - if (serviceRef.hasValue()) + if (serviceRef.hasValue()) { serviceUri = serviceRef.getValue().stringValue(); - else { + } else { // case 2: the service ref is not defined beforehand // => use a fallback to the naive evaluation. // exceptions occurring here must NOT be silenced! diff --git a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/BooleanCast.java b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/BooleanCast.java index 8fd5102aa1a..77d1408a193 100644 --- a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/BooleanCast.java +++ b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/BooleanCast.java @@ -10,7 +10,7 @@ /** * A {@link org.eclipse.rdf4j.query.algebra.evaluation.function.Function} that tries to cast its argument to an * xsd:boolean. - * + * * @author Arjohn Kampman * @deprecated use {@link org.eclipse.rdf4j.query.algebra.evaluation.function.xsd.BooleanCast} instead */ diff --git a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/DateTimeCast.java b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/DateTimeCast.java index ca3d01d56c0..ea193457374 100644 --- a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/DateTimeCast.java +++ b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/DateTimeCast.java @@ -10,7 +10,7 @@ /** * A {@link org.eclipse.rdf4j.query.algebra.evaluation.function.Function} that tries to cast its argument to an * xsd:dateTime. - * + * * @author Arjohn Kampman * @deprecated use {@link org.eclipse.rdf4j.query.algebra.evaluation.function.xsd.DateTimeCast} instead. */ diff --git a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/DecimalCast.java b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/DecimalCast.java index 3cfdf4b7f23..e36ade770f2 100644 --- a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/DecimalCast.java +++ b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/DecimalCast.java @@ -10,7 +10,7 @@ /** * A {@link org.eclipse.rdf4j.query.algebra.evaluation.function.Function} that tries to cast its argument to an * xsd:decimal. - * + * * @author Arjohn Kampman * @deprecated use {@link org.eclipse.rdf4j.query.algebra.evaluation.function.xsd.DecimalCast} instead. */ diff --git a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/DoubleCast.java b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/DoubleCast.java index db59c82c0f6..a2cec8f1a70 100644 --- a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/DoubleCast.java +++ b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/DoubleCast.java @@ -10,7 +10,7 @@ /** * A {@link org.eclipse.rdf4j.query.algebra.evaluation.function.Function} that tries to cast its argument to an * xsd:double. - * + * * @author Arjohn Kampman * @deprecated use {@link org.eclipse.rdf4j.query.algebra.evaluation.function.xsd.DoubleCast} instead. */ diff --git a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/FloatCast.java b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/FloatCast.java index 58fd5046b07..b092d67ffaf 100644 --- a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/FloatCast.java +++ b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/FloatCast.java @@ -10,7 +10,7 @@ /** * A {@link org.eclipse.rdf4j.query.algebra.evaluation.function.Function} that tries to cast its argument to an * xsd:float. - * + * * @author Arjohn Kampman * @deprecated use {@link org.eclipse.rdf4j.query.algebra.evaluation.function.xsd.FloatCast} instead. */ diff --git a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/FunctionRegistry.java b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/FunctionRegistry.java index 250a7a83331..5683e396fb5 100644 --- a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/FunctionRegistry.java +++ b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/FunctionRegistry.java @@ -24,7 +24,7 @@ private static class FunctionRegistryHolder { /** * Gets the default FunctionRegistry. - * + * * @return The default registry. */ public static FunctionRegistry getInstance() { diff --git a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/IntegerCast.java b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/IntegerCast.java index 2b6dd093ed9..f90ecae1005 100644 --- a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/IntegerCast.java +++ b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/IntegerCast.java @@ -10,7 +10,7 @@ /** * A {@link org.eclipse.rdf4j.query.algebra.evaluation.function.Function} that tries to cast its argument to an * xsd:integer . - * + * * @author Arjohn Kampman * @deprecated use {@link org.eclipse.rdf4j.query.algebra.evaluation.function.xsd.IntegerCast} instead */ diff --git a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/StringCast.java b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/StringCast.java index 32dd30cb90e..698cf650bde 100644 --- a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/StringCast.java +++ b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/StringCast.java @@ -10,10 +10,10 @@ /** * A {@link org.eclipse.rdf4j.query.algebra.evaluation.function.Function} that tries to cast its argument to an * xsd:string. - * + * * @author Arjohn Kampman * @deprecated use {@link org.eclipse.rdf4j.query.algebra.evaluation.function.xsd.StringCast} instead */ @Deprecated public class StringCast extends org.eclipse.rdf4j.query.algebra.evaluation.function.xsd.StringCast { -} \ No newline at end of file +} diff --git a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/TupleFunctionRegistry.java b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/TupleFunctionRegistry.java index 213b488234f..729a3f98ceb 100644 --- a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/TupleFunctionRegistry.java +++ b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/TupleFunctionRegistry.java @@ -15,7 +15,7 @@ public class TupleFunctionRegistry extends ServiceRegistrySPARQL Query Language for RDF - * + * * @author Jeen Broekstra */ public class Day implements Function { diff --git a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/datetime/Hours.java b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/datetime/Hours.java index 1ec6b1f47fd..2c61b2dd7aa 100644 --- a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/datetime/Hours.java +++ b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/datetime/Hours.java @@ -23,7 +23,7 @@ /** * The SPARQL built-in {@link Function} HOURS, as defined in * SPARQL Query Language for RDF - * + * * @author Jeen Broekstra */ public class Hours implements Function { diff --git a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/datetime/Minutes.java b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/datetime/Minutes.java index 2d4c5120185..4eab02519e4 100644 --- a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/datetime/Minutes.java +++ b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/datetime/Minutes.java @@ -23,7 +23,7 @@ /** * The SPARQL built-in {@link Function} MINUTES, as defined in * SPARQL Query Language for RDF - * + * * @author Jeen Broekstra */ public class Minutes implements Function { diff --git a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/datetime/Month.java b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/datetime/Month.java index 502d2ebeb01..ea38d544b82 100644 --- a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/datetime/Month.java +++ b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/datetime/Month.java @@ -23,7 +23,7 @@ /** * The SPARQL built-in {@link Function} MONTH, as defined in * SPARQL Query Language for RDF - * + * * @author Jeen Broekstra */ public class Month implements Function { diff --git a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/datetime/Now.java b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/datetime/Now.java index 7e28250cdbb..f550babb2a3 100644 --- a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/datetime/Now.java +++ b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/datetime/Now.java @@ -24,7 +24,7 @@ /** * The SPARQL built-in {@link Function} NOW, as defined in * SPARQL Query Language for RDF - * + * * @author Jeen Broekstra */ public class Now implements Function { diff --git a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/datetime/Seconds.java b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/datetime/Seconds.java index fdd6e0ee209..3f7743b86d2 100644 --- a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/datetime/Seconds.java +++ b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/datetime/Seconds.java @@ -25,7 +25,7 @@ /** * The SPARQL built-in {@link Function} SECONDS, as defined in * SPARQL Query Language for RDF - * + * * @author Jeen Broekstra */ public class Seconds implements Function { diff --git a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/datetime/Timezone.java b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/datetime/Timezone.java index 31f280b642a..5f10111db46 100644 --- a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/datetime/Timezone.java +++ b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/datetime/Timezone.java @@ -23,7 +23,7 @@ /** * The SPARQL built-in {@link Function} TIMEZONE, as defined in * SPARQL Query Language for RDF - * + * * @author Jeen Broekstra */ public class Timezone implements Function { diff --git a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/datetime/Tz.java b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/datetime/Tz.java index e504767250a..6eeddabf407 100644 --- a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/datetime/Tz.java +++ b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/datetime/Tz.java @@ -21,7 +21,7 @@ /** * The SPARQL built-in {@link Function} TZ, as defined in SPARQL * Query Language for RDF - * + * * @author Jeen Broekstra */ public class Tz implements Function { diff --git a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/datetime/Year.java b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/datetime/Year.java index 1b6d8235cc8..a623187e094 100644 --- a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/datetime/Year.java +++ b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/datetime/Year.java @@ -23,7 +23,7 @@ /** * The SPARQL built-in {@link Function} YEAR, as defined in * SPARQL Query Language for RDF - * + * * @author Jeen Broekstra */ public class Year implements Function { diff --git a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/hash/MD5.java b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/hash/MD5.java index 6515d407e82..ffc5212dcb9 100644 --- a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/hash/MD5.java +++ b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/hash/MD5.java @@ -20,7 +20,7 @@ /** * The SPARQL built-in {@link Function} MD5, as defined in * SPARQL Query Language for RDF - * + * * @author Jeen Broekstra */ public class MD5 extends HashFunction { diff --git a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/hash/SHA1.java b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/hash/SHA1.java index 9d9082f7f1c..654b7cb061b 100644 --- a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/hash/SHA1.java +++ b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/hash/SHA1.java @@ -20,7 +20,7 @@ /** * The SPARQL built-in {@link Function} SHA1, as defined in * SPARQL Query Language for RDF - * + * * @author Jeen Broekstra */ public class SHA1 extends HashFunction { diff --git a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/hash/SHA256.java b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/hash/SHA256.java index f5876ac940b..3cb8d1cca40 100644 --- a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/hash/SHA256.java +++ b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/hash/SHA256.java @@ -20,7 +20,7 @@ /** * The SPARQL built-in {@link Function} SHA256, as defined in * SPARQL Query Language for RDF - * + * * @author Jeen Broekstra */ public class SHA256 extends HashFunction { diff --git a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/hash/SHA384.java b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/hash/SHA384.java index f38c9a66bb8..1770fa43949 100644 --- a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/hash/SHA384.java +++ b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/hash/SHA384.java @@ -20,7 +20,7 @@ /** * The SPARQL built-in {@link Function} SHA384, as defined in * SPARQL Query Language for RDF - * + * * @author Jeen Broekstra */ public class SHA384 extends HashFunction { diff --git a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/hash/SHA512.java b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/hash/SHA512.java index 9a0e2074b20..0b591a5843e 100644 --- a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/hash/SHA512.java +++ b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/hash/SHA512.java @@ -20,7 +20,7 @@ /** * The SPARQL built-in {@link Function} SHA512, as defined in * SPARQL Query Language for RDF - * + * * @author Jeen Broekstra */ public class SHA512 extends HashFunction { diff --git a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/numeric/Abs.java b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/numeric/Abs.java index 0b1e4778ad3..3fd164b1eca 100644 --- a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/numeric/Abs.java +++ b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/numeric/Abs.java @@ -21,7 +21,7 @@ /** * The SPARQL built-in {@link Function} ABS, as defined in * SPARQL Query Language for RDF - * + * * @author Jeen Broekstra */ public class Abs implements Function { diff --git a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/numeric/Ceil.java b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/numeric/Ceil.java index 0a8696c3ad1..927a37ea5e2 100644 --- a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/numeric/Ceil.java +++ b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/numeric/Ceil.java @@ -22,7 +22,7 @@ /** * The SPARQL built-in {@link Function} CEIL, as defined in * SPARQL Query Language for RDF - * + * * @author Jeen Broekstra */ public class Ceil implements Function { diff --git a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/numeric/Floor.java b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/numeric/Floor.java index d7ec7c875f4..d5d515c70fc 100644 --- a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/numeric/Floor.java +++ b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/numeric/Floor.java @@ -22,7 +22,7 @@ /** * The SPARQL built-in {@link Function} FLOOR, as defined in * SPARQL Query Language for RDF - * + * * @author Jeen Broekstra */ public class Floor implements Function { diff --git a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/numeric/Rand.java b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/numeric/Rand.java index 84bbeaa2ce8..64c29a7fec6 100644 --- a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/numeric/Rand.java +++ b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/numeric/Rand.java @@ -18,7 +18,7 @@ /** * The SPARQL built-in {@link Function} RAND, as defined in * SPARQL Query Language for RDF - * + * * @author Jeen Broekstra */ public class Rand implements Function { diff --git a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/numeric/Round.java b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/numeric/Round.java index da98f7e7569..40c45f0e821 100644 --- a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/numeric/Round.java +++ b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/numeric/Round.java @@ -22,7 +22,7 @@ /** * The SPARQL built-in {@link Function} ROUND, as defined in * SPARQL Query Language for RDF - * + * * @author Jeen Broekstra */ public class Round implements Function { diff --git a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/rdfterm/STRUUID.java b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/rdfterm/STRUUID.java index 690865f4016..e2856b5d6d4 100644 --- a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/rdfterm/STRUUID.java +++ b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/rdfterm/STRUUID.java @@ -16,7 +16,7 @@ /** * The SPARQL built-in {@link Function} UUID, as defined in * SPARQL Query Language for RDF - * + * * @author Jeen Broekstra */ public class STRUUID implements Function { diff --git a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/rdfterm/StrDt.java b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/rdfterm/StrDt.java index c9ab600251d..50e07e08b55 100644 --- a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/rdfterm/StrDt.java +++ b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/rdfterm/StrDt.java @@ -18,7 +18,7 @@ /** * The SPARQL built-in {@link Function} STRDT, as defined in * SPARQL Query Language for RDF - * + * * @author Jeen Broekstra */ public class StrDt implements Function { diff --git a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/rdfterm/StrLang.java b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/rdfterm/StrLang.java index 9f44ddd17bb..52b440a293a 100644 --- a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/rdfterm/StrLang.java +++ b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/rdfterm/StrLang.java @@ -17,7 +17,7 @@ /** * The SPARQL built-in {@link Function} STRLANG, as defined in * SPARQL Query Language for RDF - * + * * @author Jeen Broekstra */ public class StrLang implements Function { diff --git a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/rdfterm/UUID.java b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/rdfterm/UUID.java index 5c9a800c327..b8e5412cc1d 100644 --- a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/rdfterm/UUID.java +++ b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/rdfterm/UUID.java @@ -16,7 +16,7 @@ /** * The SPARQL built-in {@link Function} UUID, as defined in * SPARQL Query Language for RDF - * + * * @author Jeen Broekstra */ public class UUID implements Function { diff --git a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/string/Concat.java b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/string/Concat.java index 19d8f94622a..4957908e45e 100644 --- a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/string/Concat.java +++ b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/string/Concat.java @@ -19,7 +19,7 @@ /** * The SPARQL built-in {@link Function} CONCAT, as defined in * SPARQL Query Language for RDF - * + * * @author Jeen Broekstra */ public class Concat implements Function { diff --git a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/string/Contains.java b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/string/Contains.java index 4c56c0875af..04e30e48ced 100644 --- a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/string/Contains.java +++ b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/string/Contains.java @@ -19,7 +19,7 @@ /** * The SPARQL built-in {@link Function} CONTAINS, as defined in * SPARQL Query Language for RDF - * + * * @author Jeen Broekstra */ public class Contains implements Function { diff --git a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/string/EncodeForUri.java b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/string/EncodeForUri.java index 97b28329bfc..41109ea2e97 100644 --- a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/string/EncodeForUri.java +++ b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/string/EncodeForUri.java @@ -20,7 +20,7 @@ /** * The SPARQL built-in {@link Function} ENCODE_FOR_URI, as defined in * SPARQL Query Language for RDF - * + * * @author Jeen Broekstra * @author Arjohn Kampman */ diff --git a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/string/LowerCase.java b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/string/LowerCase.java index 92968ec520e..8e1cb2d0451 100644 --- a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/string/LowerCase.java +++ b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/string/LowerCase.java @@ -21,7 +21,7 @@ /** * The SPARQL built-in {@link Function} LCASE, as defined in * SPARQL Query Language for RDF - * + * * @author Jeen Broekstra */ public class LowerCase implements Function { diff --git a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/string/Replace.java b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/string/Replace.java index 45007a25a1c..234c0d1f475 100644 --- a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/string/Replace.java +++ b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/string/Replace.java @@ -22,7 +22,7 @@ /** * The SPARQL built-in {@link Function} REPLACE, as defined in * SPARQL Query Language for RDF. - * + * * @author Jeen Broekstra */ public class Replace implements Function { diff --git a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/string/StrAfter.java b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/string/StrAfter.java index 9926948c8a5..29e739dba50 100644 --- a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/string/StrAfter.java +++ b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/string/StrAfter.java @@ -21,7 +21,7 @@ /** * The SPARQL built-in {@link Function} STRAFTER, as defined in * SPARQL Query Language for RDF. - * + * * @author Jeen Broekstra */ public class StrAfter implements Function { diff --git a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/string/StrBefore.java b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/string/StrBefore.java index 670acc02f76..312c2ce73fa 100644 --- a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/string/StrBefore.java +++ b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/string/StrBefore.java @@ -21,7 +21,7 @@ /** * The SPARQL built-in {@link Function} STRBEFORE, as defined in * SPARQL Query Language for RDF. - * + * * @author Jeen Broekstra */ public class StrBefore implements Function { diff --git a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/string/StrEnds.java b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/string/StrEnds.java index 855840cd4ef..76bc55fd8c9 100644 --- a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/string/StrEnds.java +++ b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/string/StrEnds.java @@ -19,7 +19,7 @@ /** * The SPARQL built-in {@link Function} STRENDS, as defined in * SPARQL Query Language for RDF - * + * * @author Jeen Broekstra */ public class StrEnds implements Function { diff --git a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/string/StrLen.java b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/string/StrLen.java index 2c4443bc625..981431882d1 100644 --- a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/string/StrLen.java +++ b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/string/StrLen.java @@ -19,7 +19,7 @@ /** * The SPARQL built-in {@link Function} STRLEN, as defined in * SPARQL Query Language for RDF - * + * * @author Jeen Broekstra */ public class StrLen implements Function { diff --git a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/string/StrStarts.java b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/string/StrStarts.java index d1fc263d428..83dc96a8684 100644 --- a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/string/StrStarts.java +++ b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/string/StrStarts.java @@ -19,7 +19,7 @@ /** * The SPARQL built-in {@link Function} STRSTARTS, as defined in * SPARQL Query Language for RDF - * + * * @author Jeen Broekstra */ public class StrStarts implements Function { diff --git a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/string/Substring.java b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/string/Substring.java index 6368b450a79..3ee0a460dc6 100644 --- a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/string/Substring.java +++ b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/string/Substring.java @@ -23,7 +23,7 @@ /** * The SPARQL built-in {@link Function} SUBSTR, as defined in * SPARQL Query Language for RDF. - * + * * @author Jeen Broekstra */ public class Substring implements Function { diff --git a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/string/UpperCase.java b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/string/UpperCase.java index abe0180f05d..68ceff2a7e8 100644 --- a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/string/UpperCase.java +++ b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/string/UpperCase.java @@ -21,7 +21,7 @@ /** * The SPARQL built-in {@link Function} UCASE, as defined in * SPARQL Query Language for RDF - * + * * @author Jeen Broekstra */ public class UpperCase implements Function { diff --git a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/triple/IsTripleFunction.java b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/triple/IsTripleFunction.java new file mode 100644 index 00000000000..11d2f962f24 --- /dev/null +++ b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/triple/IsTripleFunction.java @@ -0,0 +1,37 @@ +/******************************************************************************* + * Copyright (c) 2020 Eclipse RDF4J contributors. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Distribution License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ +package org.eclipse.rdf4j.query.algebra.evaluation.function.triple; + +import org.eclipse.rdf4j.model.Triple; +import org.eclipse.rdf4j.model.Value; +import org.eclipse.rdf4j.model.ValueFactory; +import org.eclipse.rdf4j.model.vocabulary.RDF; +import org.eclipse.rdf4j.query.algebra.evaluation.ValueExprEvaluationException; +import org.eclipse.rdf4j.query.algebra.evaluation.function.Function; + +/** + * Function that return "true"^^xsd:boolean if its argument is RDF* Triple otherwise return "false"^^xsd:boolean the + * function's IRI uses RDF namespace to match the other functions in the package + * + * @author damyan.ognyanov + * + */ +public class IsTripleFunction implements Function { + @Override + public String getURI() { + return RDF.NAMESPACE + "isTriple"; + } + + @Override + public Value evaluate(ValueFactory vf, Value... args) throws ValueExprEvaluationException { + if (args.length != 1) { + throw new ValueExprEvaluationException("expect exactly 1 argument"); + } + return vf.createLiteral((args[0] instanceof Triple)); + } +} diff --git a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/triple/StatementFunction.java b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/triple/StatementFunction.java new file mode 100644 index 00000000000..61cd97af282 --- /dev/null +++ b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/triple/StatementFunction.java @@ -0,0 +1,46 @@ +/******************************************************************************* + * Copyright (c) 2020 Eclipse RDF4J contributors. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Distribution License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ +package org.eclipse.rdf4j.query.algebra.evaluation.function.triple; + +import org.eclipse.rdf4j.model.IRI; +import org.eclipse.rdf4j.model.Resource; +import org.eclipse.rdf4j.model.Value; +import org.eclipse.rdf4j.model.ValueFactory; +import org.eclipse.rdf4j.model.vocabulary.RDF; +import org.eclipse.rdf4j.query.algebra.evaluation.ValueExprEvaluationException; +import org.eclipse.rdf4j.query.algebra.evaluation.function.Function; + +/** + * Function constructing RDF* Triple from its 3 arguments reused the IRI of rdf:Statement as name + * + * @author damyan.ognyanov + * + */ +public class StatementFunction implements Function { + @Override + public String getURI() { + return RDF.STATEMENT.toString(); + } + + @Override + public Value evaluate(ValueFactory vf, Value... args) throws ValueExprEvaluationException { + if (args.length != 3) { + throw new ValueExprEvaluationException("expect exactly 3 arguments"); + } + if (!(args[0] instanceof Resource)) { + throw new ValueExprEvaluationException("arg1 must be Resource"); + } + if (!(args[1] instanceof IRI)) { + throw new ValueExprEvaluationException("arg2 must be IRI"); + } + if (!(args[2] instanceof Value)) { + throw new ValueExprEvaluationException("arg3 must be Value"); + } + return vf.createTriple((Resource) args[0], (IRI) args[1], args[2]); + } +} diff --git a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/triple/TripleObjectFunction.java b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/triple/TripleObjectFunction.java new file mode 100644 index 00000000000..f53aaca5127 --- /dev/null +++ b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/triple/TripleObjectFunction.java @@ -0,0 +1,39 @@ +/******************************************************************************* + * Copyright (c) 2020 Eclipse RDF4J contributors. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Distribution License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ +package org.eclipse.rdf4j.query.algebra.evaluation.function.triple; + +import org.eclipse.rdf4j.model.Triple; +import org.eclipse.rdf4j.model.Value; +import org.eclipse.rdf4j.model.ValueFactory; +import org.eclipse.rdf4j.model.vocabulary.RDF; +import org.eclipse.rdf4j.query.algebra.evaluation.ValueExprEvaluationException; +import org.eclipse.rdf4j.query.algebra.evaluation.function.Function; + +/** + * Function returning the object component of RDF* Triple reused the IRI of rdf:object as name + * + * @author damyan.ognyanov + * + */ +public class TripleObjectFunction implements Function { + @Override + public String getURI() { + return RDF.OBJECT.toString(); + } + + @Override + public Value evaluate(ValueFactory vf, Value... args) throws ValueExprEvaluationException { + if (args.length != 1) { + throw new ValueExprEvaluationException("expect exactly 1 argument"); + } + if (!(args[0] instanceof Triple)) { + throw new ValueExprEvaluationException("arg1 must be a Triple"); + } + return ((Triple) args[0]).getObject(); + } +} diff --git a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/triple/TriplePredicateFunction.java b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/triple/TriplePredicateFunction.java new file mode 100644 index 00000000000..a8d1eba070a --- /dev/null +++ b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/triple/TriplePredicateFunction.java @@ -0,0 +1,39 @@ +/******************************************************************************* + * Copyright (c) 2020 Eclipse RDF4J contributors. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Distribution License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ +package org.eclipse.rdf4j.query.algebra.evaluation.function.triple; + +import org.eclipse.rdf4j.model.Triple; +import org.eclipse.rdf4j.model.Value; +import org.eclipse.rdf4j.model.ValueFactory; +import org.eclipse.rdf4j.model.vocabulary.RDF; +import org.eclipse.rdf4j.query.algebra.evaluation.ValueExprEvaluationException; +import org.eclipse.rdf4j.query.algebra.evaluation.function.Function; + +/** + * Function returning the predicate component of RDF* Triple reused the IRI of rdf:predicate as name + * + * @author damyan.ognyanov + * + */ +public class TriplePredicateFunction implements Function { + @Override + public String getURI() { + return RDF.PREDICATE.toString(); + } + + @Override + public Value evaluate(ValueFactory vf, Value... args) throws ValueExprEvaluationException { + if (args.length != 1) { + throw new ValueExprEvaluationException("expect exactly 1 argument"); + } + if (!(args[0] instanceof Triple)) { + throw new ValueExprEvaluationException("arg1 must be a Triple"); + } + return ((Triple) args[0]).getPredicate(); + } +} diff --git a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/triple/TripleSubjectFunction.java b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/triple/TripleSubjectFunction.java new file mode 100644 index 00000000000..e8d2b0606fe --- /dev/null +++ b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/triple/TripleSubjectFunction.java @@ -0,0 +1,39 @@ +/******************************************************************************* + * Copyright (c) 2020 Eclipse RDF4J contributors. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Distribution License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ +package org.eclipse.rdf4j.query.algebra.evaluation.function.triple; + +import org.eclipse.rdf4j.model.Triple; +import org.eclipse.rdf4j.model.Value; +import org.eclipse.rdf4j.model.ValueFactory; +import org.eclipse.rdf4j.model.vocabulary.RDF; +import org.eclipse.rdf4j.query.algebra.evaluation.ValueExprEvaluationException; +import org.eclipse.rdf4j.query.algebra.evaluation.function.Function; + +/** + * Function returning the subject component of RDF* Triple reused the IRI of rdf:subject as name + * + * @author damyan.ognyanov + * + */ +public class TripleSubjectFunction implements Function { + @Override + public String getURI() { + return RDF.SUBJECT.toString(); + } + + @Override + public Value evaluate(ValueFactory vf, Value... args) throws ValueExprEvaluationException { + if (args.length != 1) { + throw new ValueExprEvaluationException("expect exactly 1 argument"); + } + if (!(args[0] instanceof Triple)) { + throw new ValueExprEvaluationException("arg1 must be a Triple"); + } + return ((Triple) args[0]).getSubject(); + } +} diff --git a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/xsd/BooleanCast.java b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/xsd/BooleanCast.java index 1a407717ff9..9baf86e30bc 100644 --- a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/xsd/BooleanCast.java +++ b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/xsd/BooleanCast.java @@ -17,12 +17,11 @@ import org.eclipse.rdf4j.model.datatypes.XMLDatatypeUtil; import org.eclipse.rdf4j.model.vocabulary.XMLSchema; import org.eclipse.rdf4j.query.algebra.evaluation.ValueExprEvaluationException; -import org.eclipse.rdf4j.query.algebra.evaluation.function.Function; /** * A {@link org.eclipse.rdf4j.query.algebra.evaluation.function.Function} that tries to cast its argument to an * xsd:boolean. - * + * * @author Arjohn Kampman * @author Jeen Broekstra */ diff --git a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/xsd/ByteCast.java b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/xsd/ByteCast.java index dc4e1ce2117..11564464dd1 100644 --- a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/xsd/ByteCast.java +++ b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/xsd/ByteCast.java @@ -15,12 +15,11 @@ import org.eclipse.rdf4j.model.ValueFactory; import org.eclipse.rdf4j.model.datatypes.XMLDatatypeUtil; import org.eclipse.rdf4j.model.vocabulary.XMLSchema; -import org.eclipse.rdf4j.query.algebra.evaluation.function.Function; /** * A {@link org.eclipse.rdf4j.query.algebra.evaluation.function.Function} that tries to cast its argument to an * xsd:byte . - * + * * @author Jeen Broekstra * @see XMLSchema#BYTE */ diff --git a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/xsd/CastFunction.java b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/xsd/CastFunction.java index 62825f3d635..419aca302b7 100644 --- a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/xsd/CastFunction.java +++ b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/xsd/CastFunction.java @@ -20,7 +20,7 @@ /** * Abstract superclass for {@link org.eclipse.rdf4j.query.algebra.evaluation.function.Function}s that cast an argument * to an XML Schema datatype. - * + * * @author Jeen Broekstra * @see XMLSchema */ @@ -60,7 +60,7 @@ public Literal evaluate(ValueFactory valueFactory, Value... args) throws ValueEx /** * Convert the supplied value to a literal of the function output datatype. - * + * * @param vf the valueFactory to use * @param v a value that is not a string-typed literal, and not a literal of the same datatype as the function * output datatype. @@ -71,14 +71,14 @@ public Literal evaluate(ValueFactory valueFactory, Value... args) throws ValueEx /** * Get the specific XML Schema datatype which this function returns. - * + * * @return an XML Schema datatype IRI */ protected abstract IRI getXsdDatatype(); /** * Returns a prefixed name representation of the specific datatype that this function returns - * + * * @return a prefixed name, e.g. 'xsd:integer'. */ protected String getXsdName() { @@ -87,7 +87,7 @@ protected String getXsdName() { /** * Verifies that the supplied lexical value is valid for the datatype. - * + * * @param lexicalValue a lexical value * @return true if the lexical value is valid for the datatype, false otherwise. */ @@ -95,7 +95,7 @@ protected String getXsdName() { /** * Creates a {@link ValueExprEvaluationException} that signals a type error. - * + * * @param arg the function argument value. * @param cause root cause throwable. May be null. * @return a {@link ValueExprEvaluationException} with a standardized message and wrapped cause. diff --git a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/xsd/DateTimeCast.java b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/xsd/DateTimeCast.java index 5bdc67ef22d..a206e904a28 100644 --- a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/xsd/DateTimeCast.java +++ b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/xsd/DateTimeCast.java @@ -17,12 +17,11 @@ import org.eclipse.rdf4j.model.datatypes.XMLDatatypeUtil; import org.eclipse.rdf4j.model.vocabulary.XMLSchema; import org.eclipse.rdf4j.query.algebra.evaluation.ValueExprEvaluationException; -import org.eclipse.rdf4j.query.algebra.evaluation.function.Function; /** * A {@link org.eclipse.rdf4j.query.algebra.evaluation.function.Function} that tries to cast its argument to an * xsd:dateTime. - * + * * @author Arjohn Kampman * @author Jeen Broekstra */ diff --git a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/xsd/DecimalCast.java b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/xsd/DecimalCast.java index 81253840b95..9ffba147beb 100644 --- a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/xsd/DecimalCast.java +++ b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/xsd/DecimalCast.java @@ -16,12 +16,11 @@ import org.eclipse.rdf4j.model.datatypes.XMLDatatypeUtil; import org.eclipse.rdf4j.model.vocabulary.XMLSchema; import org.eclipse.rdf4j.query.algebra.evaluation.ValueExprEvaluationException; -import org.eclipse.rdf4j.query.algebra.evaluation.function.Function; /** * A {@link org.eclipse.rdf4j.query.algebra.evaluation.function.Function} that tries to cast its argument to an * xsd:decimal. - * + * * @author Arjohn Kampman * @author Jeen Broekstra */ diff --git a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/xsd/DoubleCast.java b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/xsd/DoubleCast.java index c6d7a8bab06..658ce278b25 100644 --- a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/xsd/DoubleCast.java +++ b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/xsd/DoubleCast.java @@ -18,7 +18,7 @@ /** * A {@link org.eclipse.rdf4j.query.algebra.evaluation.function.Function} that tries to cast its argument to an * xsd:double. - * + * * @author Arjohn Kampman * @author Jeen Broekstra */ diff --git a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/xsd/FloatCast.java b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/xsd/FloatCast.java index 2bce4e41b40..6979197ec74 100644 --- a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/xsd/FloatCast.java +++ b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/xsd/FloatCast.java @@ -18,7 +18,7 @@ /** * A {@link org.eclipse.rdf4j.query.algebra.evaluation.function.Function} that tries to cast its argument to an * xsd:float. - * + * * @author Arjohn Kampman * @author Jeen Broekstra */ diff --git a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/xsd/IntCast.java b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/xsd/IntCast.java index 3f5ab2e501d..fe70b7d7650 100644 --- a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/xsd/IntCast.java +++ b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/xsd/IntCast.java @@ -15,12 +15,11 @@ import org.eclipse.rdf4j.model.ValueFactory; import org.eclipse.rdf4j.model.datatypes.XMLDatatypeUtil; import org.eclipse.rdf4j.model.vocabulary.XMLSchema; -import org.eclipse.rdf4j.query.algebra.evaluation.function.Function; /** * A {@link org.eclipse.rdf4j.query.algebra.evaluation.function.Function} that tries to cast its argument to an * xsd:int . - * + * * @author Jeen Broekstra */ public class IntCast extends IntegerCastFunction { diff --git a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/xsd/IntegerCast.java b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/xsd/IntegerCast.java index 98c8ec78aad..81db02a84dd 100644 --- a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/xsd/IntegerCast.java +++ b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/xsd/IntegerCast.java @@ -15,12 +15,11 @@ import org.eclipse.rdf4j.model.ValueFactory; import org.eclipse.rdf4j.model.datatypes.XMLDatatypeUtil; import org.eclipse.rdf4j.model.vocabulary.XMLSchema; -import org.eclipse.rdf4j.query.algebra.evaluation.function.Function; /** * A {@link org.eclipse.rdf4j.query.algebra.evaluation.function.Function} that tries to cast its argument to an * xsd:integer . - * + * * @author Jeen Broekstra */ public class IntegerCast extends IntegerCastFunction { diff --git a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/xsd/IntegerCastFunction.java b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/xsd/IntegerCastFunction.java index 0324825a0c0..f9c2313e0b8 100644 --- a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/xsd/IntegerCastFunction.java +++ b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/xsd/IntegerCastFunction.java @@ -21,7 +21,7 @@ /** * Abstract superclass for {@link CastFunction}s that cast their arguments to an xsd:integer or one of its derived * types. - * + * * @author Jeen Broekstra */ public abstract class IntegerCastFunction extends CastFunction { @@ -68,7 +68,7 @@ protected Literal convert(ValueFactory valueFactory, Value value) throws ValueEx /** * create a {@link Literal} with the specific datatype for the supplied {@link BigInteger} value. - * + * * @param vf the {@link ValueFactory} to use for creating the {@link Literal} * @param integerValue the integer value to use for creating the {@link Literal} * @return an {@link Optional} literal value, which may be empty if the supplied integerValue can not be @@ -81,7 +81,7 @@ protected abstract Optional createTypedLiteral(ValueFactory vf, BigInte /** * create a {@link Literal} with the specific datatype for the supplied boolean value. - * + * * @param vf the {@link ValueFactory} to use for creating the {@link Literal} * @param booleanValue the boolean value to use for creating the {@link Literal} * @return an {@link Optional} literal value, which may be empty if the supplied boolean value can not be diff --git a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/xsd/LongCast.java b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/xsd/LongCast.java index 8e45b9a2a12..4edddb53afb 100644 --- a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/xsd/LongCast.java +++ b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/xsd/LongCast.java @@ -18,7 +18,7 @@ /** * A {@link IntegerCastFunction} that tries to cast its argument to an xsd:long . - * + * * @author Jeen Broekstra */ public class LongCast extends IntegerCastFunction { diff --git a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/xsd/NegativeIntegerCast.java b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/xsd/NegativeIntegerCast.java index d9ff76071eb..4bd35d89f29 100644 --- a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/xsd/NegativeIntegerCast.java +++ b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/xsd/NegativeIntegerCast.java @@ -15,12 +15,11 @@ import org.eclipse.rdf4j.model.ValueFactory; import org.eclipse.rdf4j.model.datatypes.XMLDatatypeUtil; import org.eclipse.rdf4j.model.vocabulary.XMLSchema; -import org.eclipse.rdf4j.query.algebra.evaluation.function.Function; /** * A {@link org.eclipse.rdf4j.query.algebra.evaluation.function.Function} that tries to cast its argument to an * xsd:negativeInteger . - * + * * @author Jeen Broekstra */ public class NegativeIntegerCast extends IntegerCastFunction { diff --git a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/xsd/NonNegativeIntegerCast.java b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/xsd/NonNegativeIntegerCast.java index e954055bfd3..c8da4c388f1 100644 --- a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/xsd/NonNegativeIntegerCast.java +++ b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/xsd/NonNegativeIntegerCast.java @@ -15,12 +15,11 @@ import org.eclipse.rdf4j.model.ValueFactory; import org.eclipse.rdf4j.model.datatypes.XMLDatatypeUtil; import org.eclipse.rdf4j.model.vocabulary.XMLSchema; -import org.eclipse.rdf4j.query.algebra.evaluation.function.Function; /** * A {@link org.eclipse.rdf4j.query.algebra.evaluation.function.Function} that tries to cast its argument to an * xsd:nonNegativeInteger . - * + * * @author Jeen Broekstra */ public class NonNegativeIntegerCast extends IntegerCastFunction { diff --git a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/xsd/NonPositiveIntegerCast.java b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/xsd/NonPositiveIntegerCast.java index cc7b46134dd..8fd632b8fc4 100644 --- a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/xsd/NonPositiveIntegerCast.java +++ b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/xsd/NonPositiveIntegerCast.java @@ -15,12 +15,11 @@ import org.eclipse.rdf4j.model.ValueFactory; import org.eclipse.rdf4j.model.datatypes.XMLDatatypeUtil; import org.eclipse.rdf4j.model.vocabulary.XMLSchema; -import org.eclipse.rdf4j.query.algebra.evaluation.function.Function; /** * A {@link org.eclipse.rdf4j.query.algebra.evaluation.function.Function} that tries to cast its argument to an * xsd:nonPositiveInteger . - * + * * @author Jeen Broekstra */ public class NonPositiveIntegerCast extends IntegerCastFunction { diff --git a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/xsd/PositiveIntegerCast.java b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/xsd/PositiveIntegerCast.java index 516b61372c8..322585b5502 100644 --- a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/xsd/PositiveIntegerCast.java +++ b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/xsd/PositiveIntegerCast.java @@ -15,12 +15,11 @@ import org.eclipse.rdf4j.model.ValueFactory; import org.eclipse.rdf4j.model.datatypes.XMLDatatypeUtil; import org.eclipse.rdf4j.model.vocabulary.XMLSchema; -import org.eclipse.rdf4j.query.algebra.evaluation.function.Function; /** * A {@link org.eclipse.rdf4j.query.algebra.evaluation.function.Function} that tries to cast its argument to an * xsd:positiveInteger . - * + * * @author Jeen Broekstra */ public class PositiveIntegerCast extends IntegerCastFunction { diff --git a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/xsd/ShortCast.java b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/xsd/ShortCast.java index 558ac20ddc6..b4707b896a3 100644 --- a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/xsd/ShortCast.java +++ b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/xsd/ShortCast.java @@ -15,12 +15,11 @@ import org.eclipse.rdf4j.model.ValueFactory; import org.eclipse.rdf4j.model.datatypes.XMLDatatypeUtil; import org.eclipse.rdf4j.model.vocabulary.XMLSchema; -import org.eclipse.rdf4j.query.algebra.evaluation.function.Function; /** * A {@link org.eclipse.rdf4j.query.algebra.evaluation.function.Function} that tries to cast its argument to an * xsd:short . - * + * * @author Jeen Broekstra */ public class ShortCast extends IntegerCastFunction { diff --git a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/xsd/StringCast.java b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/xsd/StringCast.java index c8394b7a09c..d077ef5078f 100644 --- a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/xsd/StringCast.java +++ b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/xsd/StringCast.java @@ -20,7 +20,7 @@ /** * A {@link org.eclipse.rdf4j.query.algebra.evaluation.function.Function} that tries to cast its argument to an * xsd:string. - * + * * @author Arjohn Kampman * @author Jeen Broekstra */ diff --git a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/xsd/UnsignedByteCast.java b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/xsd/UnsignedByteCast.java index f02e5540ee1..42320791bd9 100644 --- a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/xsd/UnsignedByteCast.java +++ b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/xsd/UnsignedByteCast.java @@ -18,7 +18,7 @@ /** * A {@link IntegerCastFunction} that tries to cast its argument to an xsd:unsignedByte . - * + * * @author Jeen Broekstra */ public class UnsignedByteCast extends IntegerCastFunction { diff --git a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/xsd/UnsignedIntCast.java b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/xsd/UnsignedIntCast.java index 061687d5dcd..ec8fa08c2eb 100644 --- a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/xsd/UnsignedIntCast.java +++ b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/xsd/UnsignedIntCast.java @@ -18,7 +18,7 @@ /** * A {@link IntegerCastFunction} that tries to cast its argument to an xsd:unsignedInt . - * + * * @author Jeen Broekstra */ public class UnsignedIntCast extends IntegerCastFunction { diff --git a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/xsd/UnsignedLongCast.java b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/xsd/UnsignedLongCast.java index 1a89ec02619..54b77774a2d 100644 --- a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/xsd/UnsignedLongCast.java +++ b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/xsd/UnsignedLongCast.java @@ -18,7 +18,7 @@ /** * A {@link IntegerCastFunction} that tries to cast its argument to an xsd:unsignedShort . - * + * * @author Jeen Broekstra */ public class UnsignedLongCast extends IntegerCastFunction { diff --git a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/xsd/UnsignedShortCast.java b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/xsd/UnsignedShortCast.java index 7d6a9b60f4e..62e791f197e 100644 --- a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/xsd/UnsignedShortCast.java +++ b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/xsd/UnsignedShortCast.java @@ -18,7 +18,7 @@ /** * A {@link IntegerCastFunction} that tries to cast its argument to an xsd:unsignedShort . - * + * * @author Jeen Broekstra */ public class UnsignedShortCast extends IntegerCastFunction { diff --git a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/xsd/package-info.java b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/xsd/package-info.java index 5cba8c763ee..20809d5bc7b 100644 --- a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/xsd/package-info.java +++ b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/xsd/package-info.java @@ -1,6 +1,6 @@ /** * Functions for casting values to various XML Schema datatypes - * + * * @see org.eclipse.rdf4j.model.vocabulary.XMLSchema */ -package org.eclipse.rdf4j.query.algebra.evaluation.function.xsd; \ No newline at end of file +package org.eclipse.rdf4j.query.algebra.evaluation.function.xsd; diff --git a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/impl/AbstractEvaluationStrategyFactory.java b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/impl/AbstractEvaluationStrategyFactory.java index 176016d36d9..1e45bfd9c52 100644 --- a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/impl/AbstractEvaluationStrategyFactory.java +++ b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/impl/AbstractEvaluationStrategyFactory.java @@ -14,13 +14,16 @@ /** * Abstract base class for {@link ExtendedEvaluationStrategy}. - * + * * @author Jeen Broekstra */ public abstract class AbstractEvaluationStrategyFactory implements EvaluationStrategyFactory { private long querySolutionCacheThreshold; + // track the results size that each node in the query plan produces during execution + private boolean trackResultSize; + private QueryOptimizerPipeline pipeline; @Override @@ -43,4 +46,13 @@ public Optional getOptimizerPipeline() { return Optional.ofNullable(pipeline); } + @Override + public boolean isTrackResultSize() { + return trackResultSize; + } + + @Override + public void setTrackResultSize(boolean trackResultSize) { + this.trackResultSize = trackResultSize; + } } diff --git a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/impl/BindingAssigner.java b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/impl/BindingAssigner.java index 6c1518a4238..4f252a26b99 100644 --- a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/impl/BindingAssigner.java +++ b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/impl/BindingAssigner.java @@ -17,7 +17,7 @@ /** * Assigns values to variables based on a supplied set of bindings. - * + * * @author Arjohn Kampman */ public class BindingAssigner implements QueryOptimizer { diff --git a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/impl/CompareOptimizer.java b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/impl/CompareOptimizer.java index e38eca350d1..3fffa17f159 100644 --- a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/impl/CompareOptimizer.java +++ b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/impl/CompareOptimizer.java @@ -23,7 +23,7 @@ /** * A query optimizer that replaces {@link Compare} operators with {@link SameTerm}s, if possible. - * + * * @author Arjohn Kampman */ public class CompareOptimizer implements QueryOptimizer { diff --git a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/impl/ConjunctiveConstraintSplitter.java b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/impl/ConjunctiveConstraintSplitter.java index e53893c49be..b40c0680438 100644 --- a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/impl/ConjunctiveConstraintSplitter.java +++ b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/impl/ConjunctiveConstraintSplitter.java @@ -23,7 +23,7 @@ /** * Splits conjunctive constraints into seperate constraints. - * + * * @author Arjohn Kampman */ public class ConjunctiveConstraintSplitter implements QueryOptimizer { diff --git a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/impl/ConstantOptimizer.java b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/impl/ConstantOptimizer.java index 963671ab620..eb11ac451e1 100644 --- a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/impl/ConstantOptimizer.java +++ b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/impl/ConstantOptimizer.java @@ -49,7 +49,7 @@ /** * A query optimizer that optimizes constant value expressions. - * + * * @author James Leigh * @author Arjohn Kampman */ @@ -248,7 +248,7 @@ public void meet(FunctionCall functionCall) { /** * Determines if the provided zero-arg function is a function that should return a constant value for the entire * query execution (e.g NOW()), or if it should generate a new value for every call (e.g. RAND()). - * + * * @param functionCall a zero-arg function call. * @return true iff the provided function returns a constant value for the query execution, false * otherwise. diff --git a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/impl/DisjunctiveConstraintOptimizer.java b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/impl/DisjunctiveConstraintOptimizer.java index 6f80ad10a4c..b68d199336c 100644 --- a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/impl/DisjunctiveConstraintOptimizer.java +++ b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/impl/DisjunctiveConstraintOptimizer.java @@ -23,7 +23,7 @@ * A query optimizer that optimize disjunctive constraints on tuple expressions. Currently, this optimizer {@link Union * unions} a clone of the underlying tuple expression with the original expression for each {@link SameTerm} operator, * moving the SameTerm to the cloned tuple expression. - * + * * @author Arjohn Kampman * @author James Leigh */ diff --git a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/impl/EvaluationStatistics.java b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/impl/EvaluationStatistics.java index 7fcbc238783..c96470e0c71 100644 --- a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/impl/EvaluationStatistics.java +++ b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/impl/EvaluationStatistics.java @@ -20,6 +20,7 @@ import org.eclipse.rdf4j.query.algebra.Service; import org.eclipse.rdf4j.query.algebra.SingletonSet; import org.eclipse.rdf4j.query.algebra.StatementPattern; +import org.eclipse.rdf4j.query.algebra.TripleRef; import org.eclipse.rdf4j.query.algebra.TupleExpr; import org.eclipse.rdf4j.query.algebra.UnaryTupleOperator; import org.eclipse.rdf4j.query.algebra.Var; @@ -28,7 +29,7 @@ /** * Supplies various query model statistics to the query engine/optimizer. - * + * * @author Arjohn Kampman * @author James Leigh */ @@ -129,10 +130,10 @@ public void meet(Service node) { // more than one free variable in a single triple pattern if (count == 1 && node.getServiceVars().size() > 1) { cardinality = 100 + node.getServiceVars().size(); // TODO (should - // be higher - // than other - // simple - // stmts) + // be higher + // than other + // simple + // stmts) } else { // only very selective statements should be better than this // => evaluate service expressions first @@ -146,6 +147,13 @@ public void meet(StatementPattern sp) { cardinality = getCardinality(sp); } + @Override + public void meet(TripleRef tripleRef) { + cardinality = getSubjectCardinality(tripleRef.getSubjectVar()) + * getPredicateCardinality(tripleRef.getPredicateVar()) + * getObjectCardinality(tripleRef.getObjectVar()); + } + protected double getCardinality(StatementPattern sp) { return getSubjectCardinality(sp) * getPredicateCardinality(sp) * getObjectCardinality(sp) * getContextCardinality(sp); @@ -280,5 +288,7 @@ public int getStatementCount() { public void meet(StatementPattern node) throws RuntimeException { count++; } - }; + } + + ; } diff --git a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/impl/ExtendedEvaluationStrategy.java b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/impl/ExtendedEvaluationStrategy.java index 2c0eafbd2f6..a677bd06ac4 100644 --- a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/impl/ExtendedEvaluationStrategy.java +++ b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/impl/ExtendedEvaluationStrategy.java @@ -24,7 +24,7 @@ /** * SPARQL 1.1 extended query evaluation strategy. This strategy adds the use of virtual properties, as well as extended * comparison and mathematical operators to the minimally-conforming {@link StrictEvaluationStrategy}. - * + * * @author Jeen Broekstra */ public class ExtendedEvaluationStrategy extends TupleFunctionEvaluationStrategy { diff --git a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/impl/ExtendedEvaluationStrategyFactory.java b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/impl/ExtendedEvaluationStrategyFactory.java index 67e2dc20226..6adf08fa79e 100644 --- a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/impl/ExtendedEvaluationStrategyFactory.java +++ b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/impl/ExtendedEvaluationStrategyFactory.java @@ -42,4 +42,4 @@ public EvaluationStrategy createEvaluationStrategy(Dataset dataset, TripleSource evaluationStatistics); } -} \ No newline at end of file +} diff --git a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/impl/ExternalSet.java b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/impl/ExternalSet.java index becd874f7be..80232eb26cc 100644 --- a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/impl/ExternalSet.java +++ b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/impl/ExternalSet.java @@ -19,7 +19,7 @@ /** * @author James Leigh - * + * * @deprecated since 3.0. */ @Deprecated diff --git a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/impl/FilterOptimizer.java b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/impl/FilterOptimizer.java index eda957ea4ea..15ec407039c 100644 --- a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/impl/FilterOptimizer.java +++ b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/impl/FilterOptimizer.java @@ -31,7 +31,7 @@ /** * Optimizes a query model by pushing {@link Filter}s as far down in the model tree as possible. - * + * * @author Arjohn Kampman */ public class FilterOptimizer implements QueryOptimizer { diff --git a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/impl/OrderLimitOptimizer.java b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/impl/OrderLimitOptimizer.java index dab5db93878..3383fabd8ee 100644 --- a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/impl/OrderLimitOptimizer.java +++ b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/impl/OrderLimitOptimizer.java @@ -23,7 +23,7 @@ /** * Moves the Order node above the Projection when variables are projected. - * + * * @author James Leigh */ public class OrderLimitOptimizer implements QueryOptimizer { diff --git a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/impl/QueryJoinOptimizer.java b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/impl/QueryJoinOptimizer.java index 93d6d35dd6b..564187e9476 100644 --- a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/impl/QueryJoinOptimizer.java +++ b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/impl/QueryJoinOptimizer.java @@ -56,6 +56,12 @@ public void optimize(TupleExpr tupleExpr, Dataset dataset, BindingSet bindings) tupleExpr.visit(new JoinVisitor()); } + /** + * + * @deprecated This class is protected for historic reasons only, and will be made private in a future major + * release. + */ + @Deprecated protected class JoinVisitor extends AbstractQueryModelVisitor { Set boundVars = new HashSet<>(); @@ -75,6 +81,12 @@ public void meet(LeftJoin leftJoin) { } } + @Override + public void meet(StatementPattern node) throws RuntimeException { + super.meet(node); + node.setResultSizeEstimate(Math.max(statistics.getCardinality(node), node.getResultSizeEstimate())); + } + @Override public void meet(Join node) { @@ -109,7 +121,9 @@ public void meet(Join node) { Map> varsMap = new HashMap<>(); for (TupleExpr tupleExpr : joinArgs) { - cardinalityMap.put(tupleExpr, statistics.getCardinality(tupleExpr)); + double cardinality = statistics.getCardinality(tupleExpr); + tupleExpr.setResultSizeEstimate(Math.max(cardinality, tupleExpr.getResultSizeEstimate())); + cardinalityMap.put(tupleExpr, cardinality); if (tupleExpr instanceof ZeroLengthPath) { varsMap.put(tupleExpr, ((ZeroLengthPath) tupleExpr).getVarList()); } else { @@ -372,30 +386,34 @@ private TupleExpr getNextSubselect(List currentList, List protected TupleExpr selectNextTupleExpr(List expressions, Map cardinalityMap, Map> varsMap, Map varFreqMap, Set boundVars) { TupleExpr result = null; + double lowestCost = Double.POSITIVE_INFINITY; - if (expressions.size() > 1) { - double lowestCardinality = Double.POSITIVE_INFINITY; - for (TupleExpr tupleExpr : expressions) { - // Calculate a score for this tuple expression - double cardinality = getTupleExprCardinality(tupleExpr, cardinalityMap, varsMap, varFreqMap, - boundVars); - - if (cardinality < lowestCardinality || result == null) { - // More specific path expression found - lowestCardinality = cardinality; - result = tupleExpr; - } + for (TupleExpr tupleExpr : expressions) { + // Calculate a score for this tuple expression + double cost = getTupleExprCost(tupleExpr, cardinalityMap, varsMap, varFreqMap, + boundVars); + + if (cost < lowestCost || result == null) { + // More specific path expression found + lowestCost = cost; + result = tupleExpr; } - } else { - result = expressions.get(0); } + result.setCostEstimate(lowestCost); + return result; } + @Deprecated protected double getTupleExprCardinality(TupleExpr tupleExpr, Map cardinalityMap, Map> varsMap, Map varFreqMap, Set boundVars) { - double cardinality = cardinalityMap.get(tupleExpr); + return getTupleExprCost(tupleExpr, cardinalityMap, varsMap, varFreqMap, boundVars); + } + + protected double getTupleExprCost(TupleExpr tupleExpr, Map cardinalityMap, + Map> varsMap, Map varFreqMap, Set boundVars) { + double cost = cardinalityMap.get(tupleExpr); List vars = varsMap.get(tupleExpr); @@ -405,23 +423,23 @@ protected double getTupleExprCardinality(TupleExpr tupleExpr, Map 0) { double exp = (double) unboundVars.size() / nonConstantVarCount; - cardinality = Math.pow(cardinality, exp); + cost = Math.pow(cost, exp); } if (unboundVars.isEmpty()) { // Prefer patterns with more bound vars if (nonConstantVarCount > 0) { - cardinality /= nonConstantVarCount; + cost /= nonConstantVarCount; } } else { // Prefer patterns that bind variables from other tuple expressions int foreignVarFreq = getForeignVarFreq(unboundVars, varFreqMap); if (foreignVarFreq > 0) { - cardinality /= 1 + foreignVarFreq; + cost /= 1 + foreignVarFreq; } } - return cardinality; + return cost; } protected List getConstantVars(Iterable vars) { diff --git a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/impl/QueryModelNormalizer.java b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/impl/QueryModelNormalizer.java index 19948ba00c9..e80be9e31a5 100644 --- a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/impl/QueryModelNormalizer.java +++ b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/impl/QueryModelNormalizer.java @@ -36,7 +36,7 @@ /** * A query optimizer that (partially) normalizes query models to a canonical form. Note: this implementation does not * yet cover all query node types. - * + * * @author Arjohn Kampman */ public class QueryModelNormalizer extends AbstractQueryModelVisitor implements QueryOptimizer { @@ -68,7 +68,7 @@ public void meet(Join join) { Join leftJoin = new Join(union.getLeftArg(), rightArg.clone()); Join rightJoin = new Join(union.getRightArg(), rightArg.clone()); Union newUnion = new Union(leftJoin, rightJoin); - newUnion.setGraphPatternGroup(union.isGraphPatternGroup()); + newUnion.setVariableScopeChange(union.isVariableScopeChange()); join.replaceWith(newUnion); newUnion.visit(this); } else if (rightArg instanceof Union) { @@ -77,7 +77,7 @@ public void meet(Join join) { Join leftJoin = new Join(leftArg.clone(), union.getLeftArg()); Join rightJoin = new Join(leftArg.clone(), union.getRightArg()); Union newUnion = new Union(leftJoin, rightJoin); - newUnion.setGraphPatternGroup(union.isGraphPatternGroup()); + newUnion.setVariableScopeChange(union.isVariableScopeChange()); join.replaceWith(newUnion); newUnion.visit(this); } else if (leftArg instanceof LeftJoin && isWellDesigned(((LeftJoin) leftArg))) { diff --git a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/impl/QueryModelPruner.java b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/impl/QueryModelPruner.java index f1719ffc6b1..a9da5c31521 100644 --- a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/impl/QueryModelPruner.java +++ b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/impl/QueryModelPruner.java @@ -27,7 +27,7 @@ /** * A query optimizer that prunes query model trees by removing superfluous parts and/or by reducing complex parts with * simpler parts. - * + * * @author Arjohn Kampman * @deprecated Replaced by {@link QueryModelNormalizer}. */ @@ -39,7 +39,7 @@ public QueryModelPruner() { /** * Applies generally applicable optimizations: path expressions are sorted from more to less specific. - * + * * @param tupleExpr */ @Override diff --git a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/impl/SameTermFilterOptimizer.java b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/impl/SameTermFilterOptimizer.java index b8171f28d70..b92ec071f31 100644 --- a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/impl/SameTermFilterOptimizer.java +++ b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/impl/SameTermFilterOptimizer.java @@ -34,7 +34,7 @@ * A query optimizer that embeds {@link Filter}s with {@link SameTerm} operators in statement patterns as much as * possible. Operators like sameTerm(X, Y) are processed by renaming X to Y (or vice versa). Operators like sameTerm(X, * ) are processed by assigning the URI to all occurring variables with name X. - * + * * @author Arjohn Kampman * @author James Leigh */ diff --git a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/impl/StandardQueryOptimizerPipeline.java b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/impl/StandardQueryOptimizerPipeline.java index 41c019c34c0..13197f7b514 100644 --- a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/impl/StandardQueryOptimizerPipeline.java +++ b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/impl/StandardQueryOptimizerPipeline.java @@ -16,10 +16,10 @@ import org.eclipse.rdf4j.query.algebra.evaluation.TripleSource; /** - * + * * A standard pipeline with the default {@link QueryOptimizer}s that will be used by {@link StrictEvaluationStrategy} * and its subclasses, unless specifically overridden. - * + * * @author Jeen Broekstra * * @see EvaluationStrategyFactory#setOptimizerPipeline(QueryOptimizerPipeline) @@ -39,7 +39,7 @@ public StandardQueryOptimizerPipeline(EvaluationStrategy strategy, TripleSource /* * (non-Javadoc) - * + * * @see org.eclipse.rdf4j.query.algebra.evaluation.QueryOptimizerPipeline#getOptimizers() */ @Override diff --git a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/impl/StrictEvaluationStrategy.java b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/impl/StrictEvaluationStrategy.java index 55afb198f57..53fd535c640 100644 --- a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/impl/StrictEvaluationStrategy.java +++ b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/impl/StrictEvaluationStrategy.java @@ -13,6 +13,7 @@ import java.util.Objects; import java.util.Set; import java.util.UUID; +import java.util.concurrent.TimeUnit; import java.util.regex.Pattern; import org.eclipse.rdf4j.common.iteration.CloseableIteration; @@ -24,6 +25,7 @@ import org.eclipse.rdf4j.common.iteration.FilterIteration; import org.eclipse.rdf4j.common.iteration.IntersectIteration; import org.eclipse.rdf4j.common.iteration.Iteration; +import org.eclipse.rdf4j.common.iteration.IterationWrapper; import org.eclipse.rdf4j.common.iteration.LimitIteration; import org.eclipse.rdf4j.common.iteration.LookAheadIteration; import org.eclipse.rdf4j.common.iteration.OffsetIteration; @@ -36,6 +38,7 @@ import org.eclipse.rdf4j.model.Literal; import org.eclipse.rdf4j.model.Resource; import org.eclipse.rdf4j.model.Statement; +import org.eclipse.rdf4j.model.Triple; import org.eclipse.rdf4j.model.Value; import org.eclipse.rdf4j.model.datatypes.XMLDatatypeUtil; import org.eclipse.rdf4j.model.impl.BooleanLiteral; @@ -102,17 +105,20 @@ import org.eclipse.rdf4j.query.algebra.StatementPattern; import org.eclipse.rdf4j.query.algebra.StatementPattern.Scope; import org.eclipse.rdf4j.query.algebra.Str; +import org.eclipse.rdf4j.query.algebra.TripleRef; import org.eclipse.rdf4j.query.algebra.TupleExpr; import org.eclipse.rdf4j.query.algebra.UnaryTupleOperator; import org.eclipse.rdf4j.query.algebra.Union; import org.eclipse.rdf4j.query.algebra.ValueConstant; import org.eclipse.rdf4j.query.algebra.ValueExpr; +import org.eclipse.rdf4j.query.algebra.ValueExprTripleRef; import org.eclipse.rdf4j.query.algebra.Var; import org.eclipse.rdf4j.query.algebra.ZeroLengthPath; import org.eclipse.rdf4j.query.algebra.evaluation.EvaluationStrategy; import org.eclipse.rdf4j.query.algebra.evaluation.QueryBindingSet; import org.eclipse.rdf4j.query.algebra.evaluation.QueryOptimizer; import org.eclipse.rdf4j.query.algebra.evaluation.QueryOptimizerPipeline; +import org.eclipse.rdf4j.query.algebra.evaluation.RDFStarTripleSource; import org.eclipse.rdf4j.query.algebra.evaluation.TripleSource; import org.eclipse.rdf4j.query.algebra.evaluation.ValueExprEvaluationException; import org.eclipse.rdf4j.query.algebra.evaluation.federation.FederatedService; @@ -147,10 +153,12 @@ import org.eclipse.rdf4j.query.impl.MapBindingSet; import org.eclipse.rdf4j.util.UUIDable; +import com.google.common.base.Stopwatch; + /** * Minimally-conforming SPARQL 1.1 Query Evaluation strategy, to evaluate one {@link TupleExpr} on the given * {@link TripleSource}, optionally using the given {@link Dataset}. - * + * * @author Jeen Broekstra * @author James Leigh * @author Arjohn Kampman @@ -177,6 +185,12 @@ public class StrictEvaluationStrategy implements EvaluationStrategy, FederatedSe private final long iterationCacheSyncThreshold; + // track the results size that each node in the query plan produces during execution + private boolean trackResultSize; + + // track the exeution time of each node in the plan + private boolean trackTime; + private final UUID uuid; private QueryOptimizerPipeline pipeline; @@ -197,6 +211,13 @@ public StrictEvaluationStrategy(TripleSource tripleSource, Dataset dataset, public StrictEvaluationStrategy(TripleSource tripleSource, Dataset dataset, FederatedServiceResolver serviceResolver, long iterationCacheSyncTreshold, EvaluationStatistics evaluationStatistics) { + this(tripleSource, dataset, serviceResolver, iterationCacheSyncTreshold, evaluationStatistics, false); + + } + + public StrictEvaluationStrategy(TripleSource tripleSource, Dataset dataset, + FederatedServiceResolver serviceResolver, long iterationCacheSyncTreshold, + EvaluationStatistics evaluationStatistics, boolean trackResultSize) { this.tripleSource = tripleSource; this.dataset = dataset; this.serviceResolver = serviceResolver; @@ -204,6 +225,7 @@ public StrictEvaluationStrategy(TripleSource tripleSource, Dataset dataset, this.pipeline = new StandardQueryOptimizerPipeline(this, tripleSource, evaluationStatistics); this.uuid = UUID.randomUUID(); EvaluationStrategies.register(this); + this.trackResultSize = trackResultSize; } /*---------* @@ -231,42 +253,70 @@ public void setOptimizerPipeline(QueryOptimizerPipeline pipeline) { this.pipeline = pipeline; } + /** + * Execute the {@link QueryOptimizerPipeline} on the given {@link TupleExpr} to optimize its execution plan. + * + * @param expr the {@link TupleExpr} to optimize. + * @param evaluationStatistics this param is ignored! + * @param bindings a-priori bindings supplied for the query, which can potentially be inlined. + * @return the optimized {@link TupleExpr}. + * @see #setOptimizerPipeline(QueryOptimizerPipeline) + * @since 3.0 + */ @Override public TupleExpr optimize(TupleExpr expr, EvaluationStatistics evaluationStatistics, BindingSet bindings) { - TupleExpr optimizedExpr = expr; for (QueryOptimizer optimizer : pipeline.getOptimizers()) { - optimizer.optimize(optimizedExpr, dataset, bindings); + optimizer.optimize(expr, dataset, bindings); } - return optimizedExpr; + return expr; } @Override public CloseableIteration evaluate(TupleExpr expr, BindingSet bindings) throws QueryEvaluationException { + + CloseableIteration ret; + if (expr instanceof StatementPattern) { - return evaluate((StatementPattern) expr, bindings); + ret = evaluate((StatementPattern) expr, bindings); } else if (expr instanceof UnaryTupleOperator) { - return evaluate((UnaryTupleOperator) expr, bindings); + ret = evaluate((UnaryTupleOperator) expr, bindings); } else if (expr instanceof BinaryTupleOperator) { - return evaluate((BinaryTupleOperator) expr, bindings); + ret = evaluate((BinaryTupleOperator) expr, bindings); } else if (expr instanceof SingletonSet) { - return evaluate((SingletonSet) expr, bindings); + ret = evaluate((SingletonSet) expr, bindings); } else if (expr instanceof EmptySet) { - return evaluate((EmptySet) expr, bindings); + ret = evaluate((EmptySet) expr, bindings); } else if (expr instanceof ExternalSet) { - return evaluate((ExternalSet) expr, bindings); + ret = evaluate((ExternalSet) expr, bindings); } else if (expr instanceof ZeroLengthPath) { - return evaluate((ZeroLengthPath) expr, bindings); + ret = evaluate((ZeroLengthPath) expr, bindings); } else if (expr instanceof ArbitraryLengthPath) { - return evaluate((ArbitraryLengthPath) expr, bindings); + ret = evaluate((ArbitraryLengthPath) expr, bindings); } else if (expr instanceof BindingSetAssignment) { - return evaluate((BindingSetAssignment) expr, bindings); + ret = evaluate((BindingSetAssignment) expr, bindings); + } else if (expr instanceof TripleRef) { + ret = evaluate((TripleRef) expr, bindings); } else if (expr == null) { throw new IllegalArgumentException("expr must not be null"); } else { throw new QueryEvaluationException("Unsupported tuple expr type: " + expr.getClass()); } + + if (trackTime) { + // set resultsSizeActual to at least be 0 so we can track iterations that don't procude anything + expr.setTotalTimeNanosActual(Math.max(0, expr.getTotalTimeNanosActual())); + ret = new TimedIterator(ret, expr); + } + + if (trackResultSize) { + // set resultsSizeActual to at least be 0 so we can track iterations that don't procude anything + expr.setResultSizeActual(Math.max(0, expr.getResultSizeActual())); + ret = new ResultSizeCountingIterator(ret, expr); + } + + return ret; } public CloseableIteration evaluate(ArbitraryLengthPath alp, @@ -291,13 +341,13 @@ public CloseableIteration evaluate(ZeroLen Value subj = null; try { subj = evaluate(subjectVar, bindings); - } catch (QueryEvaluationException e) { + } catch (QueryEvaluationException ignored) { } Value obj = null; try { obj = evaluate(objVar, bindings); - } catch (QueryEvaluationException e) { + } catch (QueryEvaluationException ignored) { } if (subj != null && obj != null) { @@ -383,28 +433,18 @@ public CloseableIteration evaluate(Service } // otherwise: perform a SELECT query - CloseableIteration result = fs.select(service, freeVars, bindings, + return fs.select(service, freeVars, bindings, baseUri); - return result; - - } catch (QueryEvaluationException e) { - // suppress exceptions if silent - if (service.isSilent()) { - return new SingletonIteration<>(bindings); - } else { - throw e; - } } catch (RuntimeException e) { - // suppress special exceptions (e.g. UndeclaredThrowable with - // wrapped - // QueryEval) if silent + // suppress exceptions if silent if (service.isSilent()) { return new SingletonIteration<>(bindings); } else { throw e; } } + } private Set getBoundVariables(Service service) { @@ -431,12 +471,12 @@ public CloseableIteration evaluate(Describ return new DescribeIteration(iter, this, operator.getBindingNames(), bindings); } - public CloseableIteration evaluate(StatementPattern sp, + public CloseableIteration evaluate(StatementPattern statementPattern, final BindingSet bindings) throws QueryEvaluationException { - final Var subjVar = sp.getSubjectVar(); - final Var predVar = sp.getPredicateVar(); - final Var objVar = sp.getObjectVar(); - final Var conVar = sp.getContextVar(); + final Var subjVar = statementPattern.getSubjectVar(); + final Var predVar = statementPattern.getPredicateVar(); + final Var objVar = statementPattern.getObjectVar(); + final Var conVar = statementPattern.getContextVar(); final Value subjValue = getVarValue(subjVar, bindings); final Value predValue = getVarValue(predVar, bindings); @@ -446,7 +486,7 @@ public CloseableIteration evaluate(Stateme CloseableIteration stIter1 = null; CloseableIteration stIter2 = null; CloseableIteration stIter3 = null; - ConvertingIteration result = null; + ConvertingIteration resultingIterator = null; if (isUnbound(subjVar, bindings) || isUnbound(predVar, bindings) || isUnbound(objVar, bindings) || isUnbound(conVar, bindings)) { @@ -463,7 +503,7 @@ public CloseableIteration evaluate(Stateme boolean emptyGraph = false; if (dataset != null) { - if (sp.getScope() == Scope.DEFAULT_CONTEXTS) { + if (statementPattern.getScope() == Scope.DEFAULT_CONTEXTS) { graphs = dataset.getDefaultGraphs(); emptyGraph = graphs.isEmpty() && !dataset.getNamedGraphs().isEmpty(); } else { @@ -482,8 +522,8 @@ public CloseableIteration evaluate(Stateme } /* * TODO activate this to have an exclusive (rather than inclusive) interpretation of the default - * graph in SPARQL querying. else if (sp.getScope() == Scope.DEFAULT_CONTEXTS ) { contexts = new - * Resource[] { (Resource)null }; } + * graph in SPARQL querying. else if (statementPattern.getScope() == Scope.DEFAULT_CONTEXTS ) { + * contexts = new Resource[] { (Resource)null }; } */ else { contexts = new Resource[0]; @@ -510,7 +550,7 @@ public CloseableIteration evaluate(Stateme stIter1 = tripleSource.getStatements((Resource) subjValue, (IRI) predValue, objValue, contexts); - if (contexts.length == 0 && sp.getScope() == Scope.NAMED_CONTEXTS) { + if (contexts.length == 0 && statementPattern.getScope() == Scope.NAMED_CONTEXTS) { // Named contexts are matched by retrieving all statements from // the store and filtering out the statements that do not have a // context. @@ -574,7 +614,7 @@ protected boolean accept(Statement st) { }; // Return an iterator that converts the statements to var bindings - result = new ConvertingIteration(stIter3) { + resultingIterator = new ConvertingIteration(stIter3) { @Override protected BindingSet convert(Statement st) { @@ -598,12 +638,14 @@ protected BindingSet convert(Statement st) { } }; allGood = true; - return result; + + return resultingIterator; + } finally { if (!allGood) { try { - if (result != null) { - result.close(); + if (resultingIterator != null) { + resultingIterator.close(); } } finally { try { @@ -670,7 +712,7 @@ public CloseableIteration evaluate(UnaryTu // new query, reset shared return value for successive calls of // NOW() this.sharedValueOfNow = null; - return evaluate(((QueryRoot) expr).getArg(), bindings); + return evaluate(expr.getArg(), bindings); } else if (expr instanceof DescribeOperator) { return evaluate((DescribeOperator) expr, bindings); } else if (expr == null) { @@ -701,10 +743,10 @@ protected BindingSet getNextElement() throws QueryEvaluationException { for (String name : assignedBindings.getBindingNames()) { final Value assignedValue = assignedBindings.getValue(name); if (assignedValue != null) { // can be null if set to - // UNDEF - // check that the binding assignment does not - // overwrite - // existing bindings. + // UNDEF + // check that the binding assignment does not + // overwrite + // existing bindings. Value bValue = b.getValue(name); if (bValue == null || assignedValue.equals(bValue)) { if (result == null) { @@ -849,7 +891,7 @@ public CloseableIteration evaluate(Join jo } private boolean isOutOfScopeForLeftArgBindings(TupleExpr expr) { - return (TupleExprs.isGraphPatternGroup(expr) || TupleExprs.containsSubquery(expr)); + return (TupleExprs.isVariableScopeChange(expr) || TupleExprs.containsSubquery(expr)); } public CloseableIteration evaluate(LeftJoin leftJoin, @@ -971,7 +1013,7 @@ public CloseableIteration evaluate(Externa @Override public Value evaluate(ValueExpr expr, BindingSet bindings) - throws ValueExprEvaluationException, QueryEvaluationException { + throws QueryEvaluationException { if (expr instanceof Var) { return evaluate((Var) expr, bindings); } else if (expr instanceof ValueConstant) { @@ -1038,6 +1080,8 @@ public Value evaluate(ValueExpr expr, BindingSet bindings) return evaluate((If) expr, bindings); } else if (expr instanceof ListMemberOperator) { return evaluate((ListMemberOperator) expr, bindings); + } else if (expr instanceof ValueExprTripleRef) { + return evaluate((ValueExprTripleRef) expr, bindings); } else if (expr == null) { throw new IllegalArgumentException("expr must not be null"); } else { @@ -1045,7 +1089,7 @@ public Value evaluate(ValueExpr expr, BindingSet bindings) } } - public Value evaluate(Var var, BindingSet bindings) throws ValueExprEvaluationException, QueryEvaluationException { + public Value evaluate(Var var, BindingSet bindings) throws QueryEvaluationException { Value value = var.getValue(); if (value == null) { @@ -1060,12 +1104,12 @@ public Value evaluate(Var var, BindingSet bindings) throws ValueExprEvaluationEx } public Value evaluate(ValueConstant valueConstant, BindingSet bindings) - throws ValueExprEvaluationException, QueryEvaluationException { + throws QueryEvaluationException { return valueConstant.getValue(); } public Value evaluate(BNodeGenerator node, BindingSet bindings) - throws ValueExprEvaluationException, QueryEvaluationException { + throws QueryEvaluationException { ValueExpr nodeIdExpr = node.getNodeIdExpr(); if (nodeIdExpr != null) { @@ -1090,7 +1134,7 @@ public Value evaluate(Bound node, BindingSet bindings) throws QueryEvaluationExc } } - public Value evaluate(Str node, BindingSet bindings) throws ValueExprEvaluationException, QueryEvaluationException { + public Value evaluate(Str node, BindingSet bindings) throws QueryEvaluationException { Value argValue = evaluate(node.getArg(), bindings); if (argValue instanceof IRI) { @@ -1103,13 +1147,15 @@ public Value evaluate(Str node, BindingSet bindings) throws ValueExprEvaluationE } else { return tripleSource.getValueFactory().createLiteral(literal.getLabel()); } + } else if (argValue instanceof Triple) { + return tripleSource.getValueFactory().createLiteral(argValue.toString()); } else { throw new ValueExprEvaluationException(); } } public Value evaluate(Label node, BindingSet bindings) - throws ValueExprEvaluationException, QueryEvaluationException { + throws QueryEvaluationException { // FIXME: deprecate Label in favour of Str(?) Value argValue = evaluate(node.getArg(), bindings); @@ -1127,7 +1173,7 @@ public Value evaluate(Label node, BindingSet bindings) } public Value evaluate(Lang node, BindingSet bindings) - throws ValueExprEvaluationException, QueryEvaluationException { + throws QueryEvaluationException { Value argValue = evaluate(node.getArg(), bindings); if (argValue instanceof Literal) { @@ -1139,7 +1185,7 @@ public Value evaluate(Lang node, BindingSet bindings) } public Value evaluate(Datatype node, BindingSet bindings) - throws ValueExprEvaluationException, QueryEvaluationException { + throws QueryEvaluationException { Value v = evaluate(node.getArg(), bindings); if (v instanceof Literal) { @@ -1161,7 +1207,7 @@ public Value evaluate(Datatype node, BindingSet bindings) } public Value evaluate(Namespace node, BindingSet bindings) - throws ValueExprEvaluationException, QueryEvaluationException { + throws QueryEvaluationException { Value argValue = evaluate(node.getArg(), bindings); if (argValue instanceof IRI) { @@ -1173,7 +1219,7 @@ public Value evaluate(Namespace node, BindingSet bindings) } public Value evaluate(LocalName node, BindingSet bindings) - throws ValueExprEvaluationException, QueryEvaluationException { + throws QueryEvaluationException { Value argValue = evaluate(node.getArg(), bindings); if (argValue instanceof IRI) { @@ -1186,44 +1232,44 @@ public Value evaluate(LocalName node, BindingSet bindings) /** * Determines whether the operand (a variable) contains a Resource. - * + * * @return true if the operand contains a Resource, false otherwise. */ public Value evaluate(IsResource node, BindingSet bindings) - throws ValueExprEvaluationException, QueryEvaluationException { + throws QueryEvaluationException { Value argValue = evaluate(node.getArg(), bindings); return BooleanLiteral.valueOf(argValue instanceof Resource); } /** * Determines whether the operand (a variable) contains a URI. - * + * * @return true if the operand contains a URI, false otherwise. */ public Value evaluate(IsURI node, BindingSet bindings) - throws ValueExprEvaluationException, QueryEvaluationException { + throws QueryEvaluationException { Value argValue = evaluate(node.getArg(), bindings); return BooleanLiteral.valueOf(argValue instanceof IRI); } /** * Determines whether the operand (a variable) contains a BNode. - * + * * @return true if the operand contains a BNode, false otherwise. */ public Value evaluate(IsBNode node, BindingSet bindings) - throws ValueExprEvaluationException, QueryEvaluationException { + throws QueryEvaluationException { Value argValue = evaluate(node.getArg(), bindings); return BooleanLiteral.valueOf(argValue instanceof BNode); } /** * Determines whether the operand (a variable) contains a Literal. - * + * * @return true if the operand contains a Literal, false otherwise. */ public Value evaluate(IsLiteral node, BindingSet bindings) - throws ValueExprEvaluationException, QueryEvaluationException { + throws QueryEvaluationException { Value argValue = evaluate(node.getArg(), bindings); return BooleanLiteral.valueOf(argValue instanceof Literal); } @@ -1231,11 +1277,11 @@ public Value evaluate(IsLiteral node, BindingSet bindings) /** * Determines whether the operand (a variable) contains a numeric datatyped literal, i.e. a literal with datatype * xsd:float, xsd:double, xsd:decimal, or a derived datatype of xsd:decimal. - * + * * @return true if the operand contains a numeric datatyped literal, false otherwise. */ public Value evaluate(IsNumeric node, BindingSet bindings) - throws ValueExprEvaluationException, QueryEvaluationException { + throws QueryEvaluationException { Value argValue = evaluate(node.getArg(), bindings); if (argValue instanceof Literal) { @@ -1251,15 +1297,14 @@ public Value evaluate(IsNumeric node, BindingSet bindings) /** * Creates a URI from the operand value (a plain literal or a URI). - * + * * @param node represents an invocation of the SPARQL IRI function * @param bindings used to generate the value that the URI is based on * @return a URI generated from the given arguments - * @throws ValueExprEvaluationException * @throws QueryEvaluationException */ public IRI evaluate(IRIFunction node, BindingSet bindings) - throws ValueExprEvaluationException, QueryEvaluationException { + throws QueryEvaluationException { Value argValue = evaluate(node.getArg(), bindings); if (argValue instanceof Literal) { @@ -1279,7 +1324,7 @@ public IRI evaluate(IRIFunction node, BindingSet bindings) throw new ValueExprEvaluationException("not a valid IRI reference: " + uriString); } - IRI result = null; + IRI result; try { result = tripleSource.getValueFactory().createIRI(uriString); @@ -1296,11 +1341,11 @@ public IRI evaluate(IRIFunction node, BindingSet bindings) /** * Determines whether the two operands match according to the regex operator. - * + * * @return true if the operands match according to the regex operator, false otherwise. */ public Value evaluate(Regex node, BindingSet bindings) - throws ValueExprEvaluationException, QueryEvaluationException { + throws QueryEvaluationException { Value arg = evaluate(node.getArg(), bindings); Value parg = evaluate(node.getPatternArg(), bindings); Value farg = null; @@ -1340,6 +1385,9 @@ public Value evaluate(Regex node, BindingSet bindings) case 'u': f |= Pattern.UNICODE_CASE; break; + case 'q': + f |= Pattern.LITERAL; + break; default: throw new ValueExprEvaluationException(flags); } @@ -1353,7 +1401,7 @@ public Value evaluate(Regex node, BindingSet bindings) } public Value evaluate(LangMatches node, BindingSet bindings) - throws ValueExprEvaluationException, QueryEvaluationException { + throws QueryEvaluationException { Value langTagValue = evaluate(node.getLeftArg(), bindings); Value langRangeValue = evaluate(node.getRightArg(), bindings); @@ -1383,16 +1431,16 @@ public Value evaluate(LangMatches node, BindingSet bindings) * Determines whether the two operands match according to the like operator. The operator is defined as * a string comparison with the possible use of an asterisk (*) at the end and/or the start of the second operand to * indicate substring matching. - * + * * @return true if the operands match according to the like operator, false otherwise. */ public Value evaluate(Like node, BindingSet bindings) - throws ValueExprEvaluationException, QueryEvaluationException { + throws QueryEvaluationException { Value val = evaluate(node.getArg(), bindings); String strVal = null; if (val instanceof IRI) { - strVal = ((IRI) val).toString(); + strVal = val.toString(); } else if (val instanceof Literal) { strVal = ((Literal) val).getLabel(); } @@ -1477,7 +1525,7 @@ public Value evaluate(Like node, BindingSet bindings) * Evaluates a function. */ public Value evaluate(FunctionCall node, BindingSet bindings) - throws ValueExprEvaluationException, QueryEvaluationException { + throws QueryEvaluationException { Function function = FunctionRegistry.getInstance() .get(node.getURI()) .orElseThrow(() -> new QueryEvaluationException("Unknown function '" + node.getURI() + "'")); @@ -1501,10 +1549,10 @@ public Value evaluate(FunctionCall node, BindingSet bindings) } - public Value evaluate(And node, BindingSet bindings) throws ValueExprEvaluationException, QueryEvaluationException { + public Value evaluate(And node, BindingSet bindings) throws QueryEvaluationException { try { Value leftValue = evaluate(node.getLeftArg(), bindings); - if (QueryEvaluationUtil.getEffectiveBooleanValue(leftValue) == false) { + if (!QueryEvaluationUtil.getEffectiveBooleanValue(leftValue)) { // Left argument evaluates to false, we don't need to look any // further return BooleanLiteral.FALSE; @@ -1513,7 +1561,7 @@ public Value evaluate(And node, BindingSet bindings) throws ValueExprEvaluationE // Failed to evaluate the left argument. Result is 'false' when // the right argument evaluates to 'false', failure otherwise. Value rightValue = evaluate(node.getRightArg(), bindings); - if (QueryEvaluationUtil.getEffectiveBooleanValue(rightValue) == false) { + if (!QueryEvaluationUtil.getEffectiveBooleanValue(rightValue)) { return BooleanLiteral.FALSE; } else { throw new ValueExprEvaluationException(); @@ -1526,10 +1574,10 @@ public Value evaluate(And node, BindingSet bindings) throws ValueExprEvaluationE return BooleanLiteral.valueOf(QueryEvaluationUtil.getEffectiveBooleanValue(rightValue)); } - public Value evaluate(Or node, BindingSet bindings) throws ValueExprEvaluationException, QueryEvaluationException { + public Value evaluate(Or node, BindingSet bindings) throws QueryEvaluationException { try { Value leftValue = evaluate(node.getLeftArg(), bindings); - if (QueryEvaluationUtil.getEffectiveBooleanValue(leftValue) == true) { + if (QueryEvaluationUtil.getEffectiveBooleanValue(leftValue)) { // Left argument evaluates to true, we don't need to look any // further return BooleanLiteral.TRUE; @@ -1538,7 +1586,7 @@ public Value evaluate(Or node, BindingSet bindings) throws ValueExprEvaluationEx // Failed to evaluate the left argument. Result is 'true' when // the right argument evaluates to 'true', failure otherwise. Value rightValue = evaluate(node.getRightArg(), bindings); - if (QueryEvaluationUtil.getEffectiveBooleanValue(rightValue) == true) { + if (QueryEvaluationUtil.getEffectiveBooleanValue(rightValue)) { return BooleanLiteral.TRUE; } else { throw new ValueExprEvaluationException(); @@ -1551,13 +1599,13 @@ public Value evaluate(Or node, BindingSet bindings) throws ValueExprEvaluationEx return BooleanLiteral.valueOf(QueryEvaluationUtil.getEffectiveBooleanValue(rightValue)); } - public Value evaluate(Not node, BindingSet bindings) throws ValueExprEvaluationException, QueryEvaluationException { + public Value evaluate(Not node, BindingSet bindings) throws QueryEvaluationException { Value argValue = evaluate(node.getArg(), bindings); boolean argBoolean = QueryEvaluationUtil.getEffectiveBooleanValue(argValue); return BooleanLiteral.valueOf(!argBoolean); } - public Value evaluate(Now node, BindingSet bindings) throws ValueExprEvaluationException, QueryEvaluationException { + public Value evaluate(Now node, BindingSet bindings) throws QueryEvaluationException { if (sharedValueOfNow == null) { sharedValueOfNow = node.evaluate(tripleSource.getValueFactory()); } @@ -1565,7 +1613,7 @@ public Value evaluate(Now node, BindingSet bindings) throws ValueExprEvaluationE } public Value evaluate(SameTerm node, BindingSet bindings) - throws ValueExprEvaluationException, QueryEvaluationException { + throws QueryEvaluationException { Value leftVal = evaluate(node.getLeftArg(), bindings); Value rightVal = evaluate(node.getRightArg(), bindings); @@ -1582,10 +1630,7 @@ public Value evaluate(Coalesce node, BindingSet bindings) throws ValueExprEvalua // return first result that does not produce an error on // evaluation. break; - } catch (ValueExprEvaluationException e) { - continue; - } catch (QueryEvaluationException e) { - continue; + } catch (QueryEvaluationException ignored) { } } @@ -1598,7 +1643,7 @@ public Value evaluate(Coalesce node, BindingSet bindings) throws ValueExprEvalua } public Value evaluate(Compare node, BindingSet bindings) - throws ValueExprEvaluationException, QueryEvaluationException { + throws QueryEvaluationException { Value leftVal = evaluate(node.getLeftArg(), bindings); Value rightVal = evaluate(node.getRightArg(), bindings); @@ -1606,7 +1651,7 @@ public Value evaluate(Compare node, BindingSet bindings) } public Value evaluate(MathExpr node, BindingSet bindings) - throws ValueExprEvaluationException, QueryEvaluationException { + throws QueryEvaluationException { // Do the math Value leftVal = evaluate(node.getLeftArg(), bindings); Value rightVal = evaluate(node.getRightArg(), bindings); @@ -1619,7 +1664,7 @@ public Value evaluate(MathExpr node, BindingSet bindings) } public Value evaluate(If node, BindingSet bindings) throws QueryEvaluationException { - Value result = null; + Value result; boolean conditionIsTrue; @@ -1640,7 +1685,7 @@ public Value evaluate(If node, BindingSet bindings) throws QueryEvaluationExcept return result; } - public Value evaluate(In node, BindingSet bindings) throws ValueExprEvaluationException, QueryEvaluationException { + public Value evaluate(In node, BindingSet bindings) throws QueryEvaluationException { Value leftValue = evaluate(node.getArg(), bindings); // Result is false until a match has been found @@ -1650,7 +1695,7 @@ public Value evaluate(In node, BindingSet bindings) throws ValueExprEvaluationEx String bindingName = node.getSubQuery().getBindingNames().iterator().next(); try (CloseableIteration iter = evaluate(node.getSubQuery(), bindings)) { - while (result == false && iter.hasNext()) { + while (!result && iter.hasNext()) { BindingSet bindingSet = iter.next(); Value rightValue = bindingSet.getValue(bindingName); @@ -1663,7 +1708,7 @@ public Value evaluate(In node, BindingSet bindings) throws ValueExprEvaluationEx } public Value evaluate(ListMemberOperator node, BindingSet bindings) - throws ValueExprEvaluationException, QueryEvaluationException { + throws QueryEvaluationException { List args = node.getArguments(); Value leftValue = evaluate(args.get(0), bindings); @@ -1696,7 +1741,7 @@ public Value evaluate(ListMemberOperator node, BindingSet bindings) } public Value evaluate(CompareAny node, BindingSet bindings) - throws ValueExprEvaluationException, QueryEvaluationException { + throws QueryEvaluationException { Value leftValue = evaluate(node.getArg(), bindings); // Result is false until a match has been found @@ -1706,7 +1751,7 @@ public Value evaluate(CompareAny node, BindingSet bindings) String bindingName = node.getSubQuery().getBindingNames().iterator().next(); try (CloseableIteration iter = evaluate(node.getSubQuery(), bindings)) { - while (result == false && iter.hasNext()) { + while (!result && iter.hasNext()) { BindingSet bindingSet = iter.next(); Value rightValue = bindingSet.getValue(bindingName); @@ -1723,7 +1768,7 @@ public Value evaluate(CompareAny node, BindingSet bindings) } public Value evaluate(CompareAll node, BindingSet bindings) - throws ValueExprEvaluationException, QueryEvaluationException { + throws QueryEvaluationException { Value leftValue = evaluate(node.getArg(), bindings); // Result is true until a mismatch has been found @@ -1733,7 +1778,7 @@ public Value evaluate(CompareAll node, BindingSet bindings) String bindingName = node.getSubQuery().getBindingNames().iterator().next(); try (CloseableIteration iter = evaluate(node.getSubQuery(), bindings)) { - while (result == true && iter.hasNext()) { + while (result && iter.hasNext()) { BindingSet bindingSet = iter.next(); Value rightValue = bindingSet.getValue(bindingName); @@ -1751,7 +1796,7 @@ public Value evaluate(CompareAll node, BindingSet bindings) } public Value evaluate(Exists node, BindingSet bindings) - throws ValueExprEvaluationException, QueryEvaluationException { + throws QueryEvaluationException { try (CloseableIteration iter = evaluate(node.getSubQuery(), bindings)) { return BooleanLiteral.valueOf(iter.hasNext()); } @@ -1802,4 +1847,261 @@ protected long getLimit(QueryModelNode node) { return Long.MAX_VALUE; } + public Value evaluate(ValueExprTripleRef node, BindingSet bindings) + throws QueryEvaluationException { + Value subj = evaluate(node.getSubjectVar(), bindings); + if (!(subj instanceof Resource)) { + throw new ValueExprEvaluationException("no subject value"); + } + Value pred = evaluate(node.getPredicateVar(), bindings); + if (!(pred instanceof IRI)) { + throw new ValueExprEvaluationException("no predicate value"); + } + Value obj = evaluate(node.getObjectVar(), bindings); + if (obj == null) { + throw new ValueExprEvaluationException("no object value"); + } + return tripleSource.getValueFactory().createTriple((Resource) subj, (IRI) pred, obj); + + } + + /** + * evaluates a TripleRef node returning bindingsets from the matched Triple nodes in the dataset (or explore + * standard reification) + * + * @param ref to evaluate + * @param bindings with the solutions + * @return iteration over the solutions + */ + public CloseableIteration evaluate(TripleRef ref, BindingSet bindings) { + // Naive implementation that walks over all statements matching (x rdf:type rdf:Statement) + // and filter those that do not match the bindings for subject, predicate and object vars (if bound) + final org.eclipse.rdf4j.query.algebra.Var subjVar = ref.getSubjectVar(); + final org.eclipse.rdf4j.query.algebra.Var predVar = ref.getPredicateVar(); + final org.eclipse.rdf4j.query.algebra.Var objVar = ref.getObjectVar(); + final org.eclipse.rdf4j.query.algebra.Var extVar = ref.getExprVar(); + + final Value subjValue = getVarValue(subjVar, bindings); + final Value predValue = getVarValue(predVar, bindings); + final Value objValue = getVarValue(objVar, bindings); + final Value extValue = getVarValue(extVar, bindings); + + // case1: when we have a binding for extVar we use it in the reified nodes lookup + // case2: in which we have unbound extVar + // in both cases: + // 1. iterate over all statements matching ((* | extValue), rdf:type, rdf:Statement) + // 2. construct a look ahead iteration and filter these solutions that do not match the + // bindings for the subject, predicate and object vars (if these are bound) + // return set of solution where the values of the statements (extVar, rdf:subject/predicate/object, value) + // are bound to the variables of the respective TripleRef variables for subject, predicate, object + // NOTE: if the tripleSource is extended to allow for lookup over asserted Triple values in the underlying sail + // the evaluation of the TripleRef should be suitably forwarded down the sail and filter/construct + // the correct solution out of the results of that call + if (extValue != null && !(extValue instanceof Resource)) { + return new EmptyIteration<>(); + } + + // whether the TripleSouce support access to RDF star + final boolean sourceSupportsRdfStar = tripleSource instanceof RDFStarTripleSource; + + // in case the + if (sourceSupportsRdfStar) { + CloseableIteration sourceIter = ((RDFStarTripleSource) tripleSource) + .getRdfStarTriples((Resource) subjValue, (IRI) predValue, objValue); + + FilterIteration filterIter = new FilterIteration( + sourceIter) { + @Override + protected boolean accept(Triple triple) throws QueryEvaluationException { + if (subjValue != null && !subjValue.equals(triple.getSubject())) { + return false; + } + if (predValue != null && !predValue.equals(triple.getPredicate())) { + return false; + } + if (objValue != null && !objValue.equals(triple.getObject())) { + return false; + } + if (extValue != null && !extValue.equals(triple)) { + return false; + } + return true; + } + }; + + return new ConvertingIteration(filterIter) { + @Override + protected BindingSet convert(Triple triple) throws QueryEvaluationException { + QueryBindingSet result = new QueryBindingSet(bindings); + if (subjValue == null) { + result.addBinding(subjVar.getName(), triple.getSubject()); + } + if (predValue == null) { + result.addBinding(predVar.getName(), triple.getPredicate()); + } + if (objValue == null) { + result.addBinding(objVar.getName(), triple.getObject()); + } + // add the extVar binding if we do not have a value bound. + if (extValue == null) { + result.addBinding(extVar.getName(), triple); + } + return result; + } + }; + } else { + // standard reification iteration + // 1. walk over resources used as subjects of (x rdf:type rdf:Statement) + final CloseableIteration iter = new ConvertingIteration( + tripleSource.getStatements((Resource) extValue, RDF.TYPE, RDF.STATEMENT)) { + + @Override + protected Resource convert(Statement sourceObject) + throws QueryEvaluationException { + return sourceObject.getSubject(); + } + }; + // for each reification node, fetch and check the subject, predicate and object values against + // the expected values from TripleRef pattern and supplied bindings collection + return new LookAheadIteration() { + @Override + protected void handleClose() + throws QueryEvaluationException { + super.handleClose(); + iter.close(); + } + + @Override + protected BindingSet getNextElement() + throws QueryEvaluationException { + while (iter.hasNext()) { + Resource theNode = iter.next(); + QueryBindingSet result = new QueryBindingSet(bindings); + // does it match the subjectValue/subjVar + if (!matchValue(theNode, subjValue, subjVar, result, RDF.SUBJECT)) { + continue; + } + // the predicate, if not, remove the binding that hass been added + // when the subjValue has been checked and its value added to the solution + if (!matchValue(theNode, predValue, predVar, result, RDF.PREDICATE)) { + continue; + } + // check the object, if it do not match + // remove the bindings added for subj and pred + if (!matchValue(theNode, objValue, objVar, result, RDF.OBJECT)) { + continue; + } + // add the extVar binding if we do not have a value bound. + if (extValue == null) { + result.addBinding(extVar.getName(), theNode); + } else if (!extValue.equals(theNode)) { + // the extVar value do not match theNode + continue; + } + return result; + } + return null; + } + + private boolean matchValue(Resource theNode, Value value, Var var, QueryBindingSet result, + IRI predicate) { + try (CloseableIteration valueiter = tripleSource + .getStatements(theNode, predicate, null)) { + while (valueiter.hasNext()) { + Statement valueStatement = valueiter.next(); + if (theNode.equals(valueStatement.getSubject())) { + if (value == null || value.equals(valueStatement.getObject())) { + if (value == null) { + result.addBinding(var.getName(), valueStatement.getObject()); + } + return true; + } + } + } + return false; + } + } + + }; + } // else standard reification iteration + } + + /** + * This class wraps an iterator and increments the "resultSizeActual" of the query model node that the iterator + * represents. This means we can track the number of tuples that have been retrieved from this node. + */ + private static class ResultSizeCountingIterator extends IterationWrapper { + + CloseableIteration iterator; + QueryModelNode queryModelNode; + + public ResultSizeCountingIterator(CloseableIteration iterator, + QueryModelNode queryModelNode) { + super(iterator); + this.iterator = iterator; + this.queryModelNode = queryModelNode; + } + + @Override + public BindingSet next() throws QueryEvaluationException { + queryModelNode.setResultSizeActual(queryModelNode.getResultSizeActual() + 1); + return iterator.next(); + } + + } + + /** + * This class wraps an iterator and tracks the time used to execute next() and hasNext() + */ + private static class TimedIterator extends IterationWrapper { + + CloseableIteration iterator; + QueryModelNode queryModelNode; + + Stopwatch stopwatch = Stopwatch.createUnstarted(); + + public TimedIterator(CloseableIteration iterator, + QueryModelNode queryModelNode) { + super(iterator); + this.iterator = iterator; + this.queryModelNode = queryModelNode; + } + + @Override + public BindingSet next() throws QueryEvaluationException { + stopwatch.start(); + BindingSet next = iterator.next(); + stopwatch.stop(); + return next; + } + + @Override + public boolean hasNext() throws QueryEvaluationException { + stopwatch.start(); + boolean hasNext = super.hasNext(); + stopwatch.stop(); + return hasNext; + } + + @Override + protected void handleClose() throws QueryEvaluationException { + try { + queryModelNode.setTotalTimeNanosActual( + queryModelNode.getTotalTimeNanosActual() + stopwatch.elapsed(TimeUnit.NANOSECONDS)); + } finally { + super.handleClose(); + + } + } + } + + @Override + public void setTrackResultSize(boolean trackResultSize) { + this.trackResultSize = trackResultSize; + } + + @Override + public void setTrackTime(boolean trackTime) { + this.trackTime = trackTime; + } } diff --git a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/impl/StrictEvaluationStrategyFactory.java b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/impl/StrictEvaluationStrategyFactory.java index 3edcc65b9f4..4a5f9f08c9a 100644 --- a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/impl/StrictEvaluationStrategyFactory.java +++ b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/impl/StrictEvaluationStrategyFactory.java @@ -39,9 +39,10 @@ public FederatedServiceResolver getFederatedServiceResolver() { public EvaluationStrategy createEvaluationStrategy(Dataset dataset, TripleSource tripleSource, EvaluationStatistics evaluationStatistics) { StrictEvaluationStrategy strategy = new StrictEvaluationStrategy(tripleSource, dataset, serviceResolver, - getQuerySolutionCacheThreshold(), evaluationStatistics); - getOptimizerPipeline().ifPresent(pipeline -> strategy.setOptimizerPipeline(pipeline)); + getQuerySolutionCacheThreshold(), evaluationStatistics, isTrackResultSize()); + getOptimizerPipeline().ifPresent(strategy::setOptimizerPipeline); + return strategy; } -} \ No newline at end of file +} diff --git a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/iterator/BindingSetHashKey.java b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/iterator/BindingSetHashKey.java index 55f0f531758..baf1ee79020 100644 --- a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/iterator/BindingSetHashKey.java +++ b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/iterator/BindingSetHashKey.java @@ -15,7 +15,7 @@ /** * Compact and efficient representation of a binding set for use as a key in hash maps. - * + * * @author MJAHale */ public class BindingSetHashKey implements Serializable { diff --git a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/iterator/BottomUpJoinIterator.java b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/iterator/BottomUpJoinIterator.java index 23d21689982..8a932928dbf 100644 --- a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/iterator/BottomUpJoinIterator.java +++ b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/iterator/BottomUpJoinIterator.java @@ -26,7 +26,7 @@ /** * Join Iterator that executes a basic bottom-up hash-join algorithm. To be used in cases where interleaved iteration * joining is not appropriate (e.g. when the join arguments are subselects). - * + * * @author jeen * @deprecated replaced by HashJoinIteration */ @@ -226,7 +226,7 @@ protected void add(List leftArgResults, BindingSet b) throws QueryEv /** * Utility methods to make it easier to inserted custom store dependent maps - * + * * @return map */ protected Map> makeMap() { @@ -235,7 +235,7 @@ protected Map> makeMap() { /** * Utility methods to make it easier to inserted custom store dependent list - * + * * @return list */ protected List makeList() { @@ -244,7 +244,7 @@ protected List makeList() { /** * Utility methods to make it easier to inserted custom store dependent list - * + * * @return list */ protected List makeList(List key) { @@ -253,7 +253,7 @@ protected List makeList(List key) { /** * Remove the first (0 index) element from a BindingSet list. - * + * * @param list which is worked on. * @return the removed BindingSet */ diff --git a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/iterator/CollectionIteration.java b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/iterator/CollectionIteration.java index c3805144d56..93aad74d7f3 100644 --- a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/iterator/CollectionIteration.java +++ b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/iterator/CollectionIteration.java @@ -11,7 +11,7 @@ /** * An iteration to access a materialized {@link Collection} of BindingSets. - * + * * @author Andreas Schwarte * @deprecated since 2.3 use {@link org.eclipse.rdf4j.repository.sparql.federation.CollectionIteration} */ diff --git a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/iterator/CrossProductIteration.java b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/iterator/CrossProductIteration.java index 418e380295e..80d93297253 100644 --- a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/iterator/CrossProductIteration.java +++ b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/iterator/CrossProductIteration.java @@ -20,7 +20,7 @@ * Iteration which forms the cross product of a list of materialized input bindings with each result obtained from the * inner iteration. Example: inputBindings := {b1, b2, ...} resultIteration := {r1, r2, ...} getNextElement() * returns (r1,b1), (r1, b2), ..., (r2, b1), (r2, b2), ... i.e. compute the cross product per result binding - * + * * @author Andreas Schwarte */ public class CrossProductIteration extends LookAheadIteration { @@ -45,10 +45,11 @@ protected BindingSet getNextElement() throws QueryEvaluationException { if (currentInputBinding == null) { inputBindingsIterator = inputBindings.iterator(); - if (resultIteration.hasNext()) + if (resultIteration.hasNext()) { currentInputBinding = resultIteration.next(); - else + } else { return null; // no more results + } } if (inputBindingsIterator.hasNext()) { @@ -56,8 +57,9 @@ protected BindingSet getNextElement() throws QueryEvaluationException { QueryBindingSet res = new QueryBindingSet(next.size() + currentInputBinding.size()); res.addAll(next); res.addAll(currentInputBinding); - if (!inputBindingsIterator.hasNext()) + if (!inputBindingsIterator.hasNext()) { currentInputBinding = null; + } return res; } diff --git a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/iterator/DescribeIteration.java b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/iterator/DescribeIteration.java index caa42216f93..ec82a6e6064 100644 --- a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/iterator/DescribeIteration.java +++ b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/iterator/DescribeIteration.java @@ -29,7 +29,7 @@ /** * Iteration that implements a simplified version of Symmetric Concise Bounded Description (omitting reified * statements). - * + * * @author Jeen Broekstra * @see Concise Bounded Description - alternatives */ diff --git a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/iterator/FilterIterator.java b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/iterator/FilterIterator.java index e30804214ef..024f8bef2e6 100644 --- a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/iterator/FilterIterator.java +++ b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/iterator/FilterIterator.java @@ -85,4 +85,5 @@ protected boolean accept(BindingSet bindings) throws QueryEvaluationException { return false; } } + } diff --git a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/iterator/GroupIterator.java b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/iterator/GroupIterator.java index d91350882fd..22706275baf 100644 --- a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/iterator/GroupIterator.java +++ b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/iterator/GroupIterator.java @@ -235,7 +235,7 @@ private Collection buildEntries() throws QueryEvaluationException { /** * A unique key for a set of existing bindings. - * + * * @author David Huynh */ protected class Key implements Serializable { diff --git a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/iterator/HashJoinIteration.java b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/iterator/HashJoinIteration.java index f14d358360c..1bbef2b45cd 100644 --- a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/iterator/HashJoinIteration.java +++ b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/iterator/HashJoinIteration.java @@ -32,7 +32,7 @@ /** * Generic hash join implementation suitable for use by Sail implementations. - * + * * @author MJAHale */ public class HashJoinIteration extends LookAheadIteration { @@ -66,11 +66,13 @@ public class HashJoinIteration extends LookAheadIteration> nextHa /** * Utility methods to make it easier to inserted custom store dependent list - * + * * @return list */ protected Collection makeIterationCache(CloseableIteration iter) { @@ -297,7 +299,7 @@ protected Collection makeIterationCache(CloseableIteration> makeHashTable(int initialSize) { @@ -316,7 +318,7 @@ protected Map> makeHashTable(int initialSize /** * Utility methods to make it easier to inserted custom store dependent list - * + * * @return list */ protected List makeHashValue(int currentMaxListSize) { diff --git a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/iterator/JoinIterator.java b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/iterator/JoinIterator.java index 5ff82b0b371..4daea0eda93 100644 --- a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/iterator/JoinIterator.java +++ b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/iterator/JoinIterator.java @@ -20,11 +20,11 @@ /** * Interleaved join iterator. - * + * * This join iterator produces results by interleaving results from its left argument into its right argument to speed * up bindings and produce fail-fast results. Note that this join strategy is only valid in cases where all bindings * from the left argument can be considered in scope for the right argument. - * + * * @author Jeen Broekstra * */ @@ -54,6 +54,8 @@ public JoinIterator(EvaluationStrategy strategy, Join join, BindingSet bindings) // Initialize with empty iteration so that var is never null rightIter = new EmptyIteration<>(); + + join.setAlgorithm(this); } /*---------* diff --git a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/iterator/LeftJoinIterator.java b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/iterator/LeftJoinIterator.java index 51a48886346..1aa94242c16 100644 --- a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/iterator/LeftJoinIterator.java +++ b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/iterator/LeftJoinIterator.java @@ -54,6 +54,8 @@ public LeftJoinIterator(EvaluationStrategy strategy, LeftJoin join, BindingSet b // Initialize with empty iteration so that var is never null rightIter = new EmptyIteration<>(); + + join.setAlgorithm(this); } /*---------* diff --git a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/iterator/OrderIterator.java b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/iterator/OrderIterator.java index 8133dde601a..98aa89360e2 100644 --- a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/iterator/OrderIterator.java +++ b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/iterator/OrderIterator.java @@ -37,7 +37,7 @@ /** * Sorts the input and optionally applies limit and distinct. - * + * * @author James Leigh * @author Arjohn Kampman */ @@ -360,4 +360,4 @@ protected void handleClose() throws QueryEvaluationException { } } } -} \ No newline at end of file +} diff --git a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/iterator/PathIteration.java b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/iterator/PathIteration.java index 3d42c377b2f..847dc64228d 100644 --- a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/iterator/PathIteration.java +++ b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/iterator/PathIteration.java @@ -32,7 +32,7 @@ public class PathIteration extends LookAheadIteration { /** - * + * */ private final StrictEvaluationStrategy evaluationStrategyImpl; @@ -443,4 +443,4 @@ public Var createAnonVar(String varName) { var.setAnonymous(true); return var; } -} \ No newline at end of file +} diff --git a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/iterator/SilentIteration.java b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/iterator/SilentIteration.java index 776f3017d79..71b9f3341c2 100644 --- a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/iterator/SilentIteration.java +++ b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/iterator/SilentIteration.java @@ -14,9 +14,9 @@ /** * Wrap an inner iteration and suppress exceptions silently - * + * * @author Andreas Schwarte - * + * * @deprecated since 3.1.2. Use {@link org.eclipse.rdf4j.common.iteration.SilentIteration } instead. */ @Deprecated diff --git a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/iterator/ZeroLengthPathIteration.java b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/iterator/ZeroLengthPathIteration.java index 4c6f8b40287..d3710c13bd0 100644 --- a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/iterator/ZeroLengthPathIteration.java +++ b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/iterator/ZeroLengthPathIteration.java @@ -135,7 +135,7 @@ protected BindingSet getNextElement() throws QueryEvaluationException { /** * add param v to the set reportedValues2 - * + * * @param reportedValues2 * @param v * @return true if v added to set and not yet present @@ -169,4 +169,4 @@ public Var createAnonVar(String varName) { var.setAnonymous(true); return var; } -} \ No newline at end of file +} diff --git a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/iterator/package-info.java b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/iterator/package-info.java index 9998e2a481e..12a499cecf5 100644 --- a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/iterator/package-info.java +++ b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/iterator/package-info.java @@ -2,10 +2,10 @@ @InternalUseOnly /** * Implementations of {@link Iteration} relevant to query evaluation. - * + * * @deprecated since 3.0. This feature is for internal use only: its existence, signature or behavior may change without * warning from one release to the next. */ package org.eclipse.rdf4j.query.algebra.evaluation.iterator; -import org.eclipse.rdf4j.common.annotation.InternalUseOnly; \ No newline at end of file +import org.eclipse.rdf4j.common.annotation.InternalUseOnly; diff --git a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/limited/iterator/LimitedSizeDistinctIteration.java b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/limited/iterator/LimitedSizeDistinctIteration.java index 82e0b947b79..df79b723296 100644 --- a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/limited/iterator/LimitedSizeDistinctIteration.java +++ b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/limited/iterator/LimitedSizeDistinctIteration.java @@ -36,8 +36,9 @@ public LimitedSizeDistinctIteration(Iteration maxSize) + if (add && used.incrementAndGet() > maxSize) { throw new QueryEvaluationException("Size limited reached inside query operator."); + } return add; } diff --git a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/limited/iterator/LimitedSizeIntersectIteration.java b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/limited/iterator/LimitedSizeIntersectIteration.java index 9827cff14d4..88ad8c7c2de 100644 --- a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/limited/iterator/LimitedSizeIntersectIteration.java +++ b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/limited/iterator/LimitedSizeIntersectIteration.java @@ -27,7 +27,7 @@ public class LimitedSizeIntersectIteration extends IntersectIterationnot filtered from the results. - * + * * @param arg1 An Iteration containing the first set of elements. * @param arg2 An Iteration containing the second set of elements. * @param used An atomic long used to monitor how many elements are in the set collections. diff --git a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/limited/iterator/LimitedSizeIteratorUtil.java b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/limited/iterator/LimitedSizeIteratorUtil.java index 5686af6a9d6..8ff529fc4d0 100644 --- a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/limited/iterator/LimitedSizeIteratorUtil.java +++ b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/limited/iterator/LimitedSizeIteratorUtil.java @@ -31,8 +31,9 @@ public class LimitedSizeIteratorUtil { public static Set addAll(Iteration arg2, Set includeSet, AtomicLong used, long maxSize) throws QueryEvaluationException { while (arg2.hasNext()) { - if (includeSet.add(arg2.next()) && used.incrementAndGet() > maxSize) + if (includeSet.add(arg2.next()) && used.incrementAndGet() > maxSize) { throw new QueryEvaluationException("Size limited reached inside intersect operator"); + } } return includeSet; } @@ -48,8 +49,9 @@ public static Set addAll(Iteration boolean add(V object, Collection excludeSet, AtomicLong used, long maxSize) throws QueryEvaluationException { boolean add = excludeSet.add(object); - if (add && used.incrementAndGet() > maxSize) + if (add && used.incrementAndGet() > maxSize) { throw new QueryEvaluationException("Size limited reached inside query operator."); + } return add; } } diff --git a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/limited/iterator/LimitedSizeSPARQLMinusIteration.java b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/limited/iterator/LimitedSizeSPARQLMinusIteration.java index da07d42259a..60f98aead41 100644 --- a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/limited/iterator/LimitedSizeSPARQLMinusIteration.java +++ b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/limited/iterator/LimitedSizeSPARQLMinusIteration.java @@ -27,7 +27,7 @@ public class LimitedSizeSPARQLMinusIteration extends SPARQLMinusIterationnot filtered from the results. - * + * * @param leftArg An Iteration containing the main set of elements. * @param rightArg An Iteration containing the set of elements that should be filtered from the main set. * @param * used An atomic long used to monitor how many elements are in the set collections. @@ -42,7 +42,7 @@ public LimitedSizeSPARQLMinusIteration(Iterationnull if no matching EvaluationStrategy can be found. */ @@ -39,7 +39,7 @@ public static final EvaluationStrategy get(UUID key) { /** * Retrieve the registry key for the given EvaluationStrategy - * + * * @param strategy the EvaluationStrategy for which to retrieve the registry key * @return the registry key with which the supplied strategy can be retrieved, or null if the supplied * strategy is not in the registry. @@ -64,7 +64,7 @@ public static final UUID getKey(EvaluationStrategy strategy) { /** * Add a strategy to the registry and returns the registry key. If the strategy is already present, the operation * simply returns the key with which it is currently registered. - * + * * @param strategy the EvaluationStrategy to register * @return the key with which the strategy is registered. */ diff --git a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/util/MathUtil.java b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/util/MathUtil.java index cea3cee856f..4b14dbe49a0 100644 --- a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/util/MathUtil.java +++ b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/util/MathUtil.java @@ -23,7 +23,7 @@ /** * A utility class for evaluation of mathematical expressions on RDF literals. - * + * * @author Jeen Broekstra */ public class MathUtil { @@ -39,7 +39,7 @@ public class MathUtil { /** * Computes the result of applying the supplied math operator on the supplied left and right operand. - * + * * @param leftLit a numeric datatype literal * @param rightLit a numeric datatype literal * @param op a mathematical operator, as definied by MathExpr.MathOp. @@ -172,7 +172,7 @@ public static Literal compute(Literal leftLit, Literal rightLit, MathOp op) thro /** * Returns the decimal expansion scale used in division operations resulting in a decimal value with non-terminating * decimal expansion. By default, this value is set to 24. - * + * * @return The decimal expansion scale. */ public static int getDecimalExpansionScale() { @@ -182,7 +182,7 @@ public static int getDecimalExpansionScale() { /** * Sets the decimal expansion scale used in divisions resulting in a decimal value with non-terminating decimal * expansion. - * + * * @param decimalExpansionScale The decimal expansion scale to set. Note that a mimimum of 18 is required to stay * compliant with the XPath specification of xsd:decimal operations. */ diff --git a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/util/OrderComparator.java b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/util/OrderComparator.java index 3de2a3749b0..a69e2284055 100644 --- a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/util/OrderComparator.java +++ b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/util/OrderComparator.java @@ -31,14 +31,14 @@ * A {@link Comparator} on {@link BindingSet}s that imposes a total ordering by examining supplied {@link Order} * elements (i.e. the elements of an ORDER BY clause), falling back on a custom predictable ordering for BindingSet * elements if no ordering is established on the basis of the Order elements. - * + * * @author James Leigh * @author Jeen Broekstra */ public class OrderComparator implements Comparator, Serializable { /** - * + * */ private static final long serialVersionUID = -7002730491398949902L; diff --git a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/util/QueryEvaluationUtil.java b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/util/QueryEvaluationUtil.java index 6420e2ce088..d713f8e5742 100644 --- a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/util/QueryEvaluationUtil.java +++ b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/util/QueryEvaluationUtil.java @@ -38,7 +38,7 @@ public class QueryEvaluationUtil { * false if the operand value is NaN or is numerically equal to zero; otherwise the EBV is true. *

  • All other arguments, including unbound arguments, produce a type error. * - * + * * @param value Some value. * @return The EBV of value. * @throws ValueExprEvaluationException In case the application of the EBV algorithm results in a type error. @@ -116,7 +116,7 @@ private static boolean valuesEqual(Value leftVal, Value rightVal) { /** * Compares the supplied {@link Literal} arguments using the supplied operator, using strict (minimally-conforming) * SPARQL 1.1 operator behavior. - * + * * @param leftLit the left literal argument of the comparison. * @param rightLit the right literal argument of the comparison. * @param operator the comparison operator to use. @@ -131,7 +131,7 @@ public static boolean compareLiterals(Literal leftLit, Literal rightLit, Compare /** * Compares the supplied {@link Literal} arguments using the supplied operator. - * + * * @param leftLit the left literal argument of the comparison. * @param rightLit the right literal argument of the comparison. * @param operator the comparison operator to use. @@ -343,7 +343,7 @@ && isSupportedDatatype(rightDatatype)) { /** * Checks whether the supplied value is a "plain literal". A "plain literal" is a literal with no datatype and * optionally a language tag. - * + * * @see RDF Literal * Documentation */ @@ -358,7 +358,7 @@ public static boolean isPlainLiteral(Value v) { /** * Checks whether the supplied value is a "simple literal". A "simple literal" is a literal with no language tag nor * datatype. - * + * * @see SPARQL Simple Literal Documentation */ public static boolean isSimpleLiteral(Value v) { @@ -372,7 +372,7 @@ public static boolean isSimpleLiteral(Value v) { /** * Checks whether the supplied literal is a "simple literal". A "simple literal" is a literal with no language tag * and the datatype {@link XMLSchema#STRING}. - * + * * @see SPARQL Simple Literal Documentation */ public static boolean isSimpleLiteral(Literal l) { @@ -382,7 +382,7 @@ public static boolean isSimpleLiteral(Literal l) { /** * Checks whether the supplied literal is a "string literal". A "string literal" is either a simple literal, a plain * literal with language tag, or a literal with datatype xsd:string. - * + * * @see SPARQL Functions on Strings Documentation */ public static boolean isStringLiteral(Value v) { @@ -395,7 +395,7 @@ public static boolean isStringLiteral(Value v) { /** * Checks whether the supplied two literal arguments are 'argument compatible' according to the SPARQL definition. - * + * * @param arg1 the first argument * @param arg2 the second argument * @return true iff the two supplied arguments are argument compatible, false otherwise @@ -424,7 +424,7 @@ public static boolean compatibleArguments(Literal arg1, Literal arg2) { /** * Checks whether the supplied literal is a "string literal". A "string literal" is either a simple literal, a plain * literal with language tag, or a literal with datatype xsd:string. - * + * * @see SPARQL Functions on Strings Documentation */ public static boolean isStringLiteral(Literal l) { diff --git a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/util/QueryOptimizerList.java b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/util/QueryOptimizerList.java index 08fd65ff725..78f94bd4ce1 100644 --- a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/util/QueryOptimizerList.java +++ b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/util/QueryOptimizerList.java @@ -18,7 +18,7 @@ /** * A query optimizer that contains a list of other query optimizers, which are called consecutively when the list's * {@link #optimize(TupleExpr, Dataset, BindingSet)} method is called. - * + * * @author Arjohn Kampman */ public class QueryOptimizerList implements QueryOptimizer { diff --git a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/util/ValueComparator.java b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/util/ValueComparator.java index 67b321aacb9..354449c1ace 100644 --- a/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/util/ValueComparator.java +++ b/core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/util/ValueComparator.java @@ -14,6 +14,7 @@ import org.eclipse.rdf4j.model.BNode; import org.eclipse.rdf4j.model.IRI; import org.eclipse.rdf4j.model.Literal; +import org.eclipse.rdf4j.model.Triple; import org.eclipse.rdf4j.model.Value; import org.eclipse.rdf4j.model.datatypes.XMLDatatypeUtil; import org.eclipse.rdf4j.query.algebra.Compare.CompareOp; @@ -22,7 +23,7 @@ /** * A comparator that compares values according the SPARQL value ordering as specified in * SPARQL Query Language for RDF. - * + * * @author james * @author Arjohn Kampman */ @@ -69,8 +70,21 @@ public int compare(Value o1, Value o2) { return 1; } - // 4. RDF literals - return compareLiterals((Literal) o1, (Literal) o2); + // 4. Literals + boolean l1 = o1 instanceof Literal; + boolean l2 = o2 instanceof Literal; + if (l1 && l2) { + return compareLiterals((Literal) o1, (Literal) o2); + } + if (l1) { + return -1; + } + if (l2) { + return 1; + } + + // 5. RDF* triples + return compareTriples((Triple) o1, (Triple) o2); } private int compareBNodes(BNode leftBNode, BNode rightBNode) { @@ -177,4 +191,15 @@ private int compareDatatypes(IRI leftDatatype, IRI rightDatatype) { return compareURIs(leftDatatype, rightDatatype); } } -} \ No newline at end of file + + private int compareTriples(Triple leftTriple, Triple rightTriple) { + int c = compare(leftTriple.getSubject(), rightTriple.getSubject()); + if (c == 0) { + c = compare(leftTriple.getPredicate(), rightTriple.getPredicate()); + if (c == 0) { + c = compare(leftTriple.getObject(), rightTriple.getObject()); + } + } + return c; + } +} diff --git a/core/queryalgebra/evaluation/src/main/resources/META-INF/services/org.eclipse.rdf4j.query.algebra.evaluation.function.Function b/core/queryalgebra/evaluation/src/main/resources/META-INF/services/org.eclipse.rdf4j.query.algebra.evaluation.function.Function index 02a038ff2b7..bec8f6d9564 100644 --- a/core/queryalgebra/evaluation/src/main/resources/META-INF/services/org.eclipse.rdf4j.query.algebra.evaluation.function.Function +++ b/core/queryalgebra/evaluation/src/main/resources/META-INF/services/org.eclipse.rdf4j.query.algebra.evaluation.function.Function @@ -52,4 +52,9 @@ org.eclipse.rdf4j.query.algebra.evaluation.function.xsd.StringCast org.eclipse.rdf4j.query.algebra.evaluation.function.xsd.UnsignedByteCast org.eclipse.rdf4j.query.algebra.evaluation.function.xsd.UnsignedIntCast org.eclipse.rdf4j.query.algebra.evaluation.function.xsd.UnsignedLongCast -org.eclipse.rdf4j.query.algebra.evaluation.function.xsd.UnsignedShortCast \ No newline at end of file +org.eclipse.rdf4j.query.algebra.evaluation.function.xsd.UnsignedShortCast +org.eclipse.rdf4j.query.algebra.evaluation.function.triple.IsTripleFunction +org.eclipse.rdf4j.query.algebra.evaluation.function.triple.StatementFunction +org.eclipse.rdf4j.query.algebra.evaluation.function.triple.TripleSubjectFunction +org.eclipse.rdf4j.query.algebra.evaluation.function.triple.TriplePredicateFunction +org.eclipse.rdf4j.query.algebra.evaluation.function.triple.TripleObjectFunction \ No newline at end of file diff --git a/core/queryalgebra/evaluation/src/test/java/org/eclipse/rdf4j/query/algebra/evaluation/function/hash/HashLeadingZeroTest.java b/core/queryalgebra/evaluation/src/test/java/org/eclipse/rdf4j/query/algebra/evaluation/function/hash/HashLeadingZeroTest.java index 0b01052d695..03e19efd933 100644 --- a/core/queryalgebra/evaluation/src/test/java/org/eclipse/rdf4j/query/algebra/evaluation/function/hash/HashLeadingZeroTest.java +++ b/core/queryalgebra/evaluation/src/test/java/org/eclipse/rdf4j/query/algebra/evaluation/function/hash/HashLeadingZeroTest.java @@ -16,7 +16,7 @@ public class HashLeadingZeroTest extends HashFunctionTest { /** * Test if hash function adds multiple leading zeros (if needed). Test value and expected result provided by Vassil * Momtchev.. - * + * * @throws java.lang.Exception */ @Before diff --git a/core/queryalgebra/evaluation/src/test/java/org/eclipse/rdf4j/query/algebra/evaluation/function/triple/IsTripleFunctionTest.java b/core/queryalgebra/evaluation/src/test/java/org/eclipse/rdf4j/query/algebra/evaluation/function/triple/IsTripleFunctionTest.java new file mode 100644 index 00000000000..22fc64139b2 --- /dev/null +++ b/core/queryalgebra/evaluation/src/test/java/org/eclipse/rdf4j/query/algebra/evaluation/function/triple/IsTripleFunctionTest.java @@ -0,0 +1,84 @@ +/******************************************************************************* + * Copyright (c) 2020 Eclipse RDF4J contributors. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Distribution License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ +package org.eclipse.rdf4j.query.algebra.evaluation.function.triple; + +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +import org.eclipse.rdf4j.model.IRI; +import org.eclipse.rdf4j.model.Literal; +import org.eclipse.rdf4j.model.Triple; +import org.eclipse.rdf4j.model.Value; +import org.eclipse.rdf4j.model.ValueFactory; +import org.eclipse.rdf4j.model.impl.SimpleValueFactory; +import org.eclipse.rdf4j.query.algebra.evaluation.ValueExprEvaluationException; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +/** + * Test rdf:isTriple(a) function + * + * @author damyan.ognyanov + */ +public class IsTripleFunctionTest { + + private IsTripleFunction function; + + private ValueFactory f = SimpleValueFactory.getInstance(); + + /** + * @throws java.lang.Exception + */ + @Before + public void setUp() throws Exception { + function = new IsTripleFunction(); + } + + /** + * @throws java.lang.Exception + */ + @After + public void tearDown() throws Exception { + } + + @Test + public void testEvaluateWithTriple() { + IRI subj = f.createIRI("urn:a"); + IRI pred = f.createIRI("urn:b"); + IRI obj = f.createIRI("urn:c"); + Triple testValue = f.createTriple(subj, pred, obj); + + Value value = function.evaluate(f, testValue); + assertNotNull(value); + assertTrue("expect Literal", value instanceof Literal); + assertTrue("expect positive result", ((Literal) value).booleanValue()); + value = function.evaluate(f, subj); + assertNotNull(value); + assertTrue("expect Literal", value instanceof Literal); + assertTrue("expect negative result", !((Literal) value).booleanValue()); + } + + @Test(expected = ValueExprEvaluationException.class) + public void testNegativeWrongArguments() { + IRI subj = f.createIRI("urn:a"); + IRI pred = f.createIRI("urn:b"); + IRI obj = f.createIRI("urn:c"); + Triple testValue = f.createTriple(subj, pred, obj); + + function.evaluate(f, testValue, subj); + fail("expect ValueExprEvaluationException"); + } + + @Test(expected = ValueExprEvaluationException.class) + public void testNegativeNoArguments() { + function.evaluate(f); + fail("expect ValueExprEvaluationException"); + } +} diff --git a/core/queryalgebra/evaluation/src/test/java/org/eclipse/rdf4j/query/algebra/evaluation/function/triple/StatementFunctionTest.java b/core/queryalgebra/evaluation/src/test/java/org/eclipse/rdf4j/query/algebra/evaluation/function/triple/StatementFunctionTest.java new file mode 100644 index 00000000000..c2092dbc577 --- /dev/null +++ b/core/queryalgebra/evaluation/src/test/java/org/eclipse/rdf4j/query/algebra/evaluation/function/triple/StatementFunctionTest.java @@ -0,0 +1,239 @@ +/******************************************************************************* + * Copyright (c) 2020 Eclipse RDF4J contributors. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Distribution License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ +package org.eclipse.rdf4j.query.algebra.evaluation.function.triple; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +import org.eclipse.rdf4j.model.BNode; +import org.eclipse.rdf4j.model.IRI; +import org.eclipse.rdf4j.model.Literal; +import org.eclipse.rdf4j.model.Triple; +import org.eclipse.rdf4j.model.Value; +import org.eclipse.rdf4j.model.ValueFactory; +import org.eclipse.rdf4j.model.impl.SimpleValueFactory; +import org.eclipse.rdf4j.query.algebra.evaluation.ValueExprEvaluationException; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +/** + * Test rdf:Statement(a, b, c) function cases covered: subject one of (IRI | BNode | Triple | Literal) predicate one of + * (IRI | Literal) object one of (IRI | BNode | Triple | Literal) + * + * @author damyan.ognyanov + */ +public class StatementFunctionTest { + + private StatementFunction function; + + private ValueFactory f = SimpleValueFactory.getInstance(); + + /** + * @throws java.lang.Exception + */ + @Before + public void setUp() throws Exception { + function = new StatementFunction(); + } + + /** + * @throws java.lang.Exception + */ + @After + public void tearDown() throws Exception { + } + + @Test + public void testEvaluateIRIAndIRI() { + IRI subj = f.createIRI("urn:a"); + IRI pred = f.createIRI("urn:b"); + IRI obj = f.createIRI("urn:c"); + + Value value = function.evaluate(f, subj, pred, obj); + assertNotNull(value); + assertTrue("expect Triple", value instanceof Triple); + Triple other = f.createTriple(subj, pred, obj); + assertEquals("expect to be the same", value, other); + } + + @Test + public void testEvaluateIRIAndBNode() { + IRI subj = f.createIRI("urn:a"); + IRI pred = f.createIRI("urn:b"); + BNode obj = f.createBNode(); + + Value value = function.evaluate(f, subj, pred, obj); + assertNotNull(value); + assertTrue("expect Triple", value instanceof Triple); + Triple other = f.createTriple(subj, pred, obj); + assertEquals("expect to be the same", value, other); + } + + @Test + public void testEvaluateIRIAndLiteral() { + IRI subj = f.createIRI("urn:a"); + IRI pred = f.createIRI("urn:b"); + Literal obj = f.createLiteral(1); + + Value value = function.evaluate(f, subj, pred, obj); + assertNotNull(value); + assertTrue("expect Triple", value instanceof Triple); + Triple other = f.createTriple(subj, pred, obj); + assertEquals("expect to be the same", value, other); + } + + @Test + public void testEvaluateIRIAndTriple() { + IRI subj = f.createIRI("urn:a"); + IRI pred = f.createIRI("urn:b"); + Triple obj = f.createTriple(subj, subj, subj); + + Value value = function.evaluate(f, subj, pred, obj); + assertNotNull(value); + assertTrue("expect Triple", value instanceof Triple); + Triple other = f.createTriple(subj, pred, obj); + assertEquals("expect to be the same", value, other); + } + + @Test + public void testEvaluateBNodeAndIRI() { + BNode subj = f.createBNode(); + IRI pred = f.createIRI("urn:b"); + IRI obj = f.createIRI("urn:c"); + + Value value = function.evaluate(f, subj, pred, obj); + assertNotNull(value); + assertTrue("expect Triple", value instanceof Triple); + Triple other = f.createTriple(subj, pred, obj); + assertEquals("expect to be the same", value, other); + } + + @Test + public void testEvaluateBNodeAndBNode() { + BNode subj = f.createBNode(); + IRI pred = f.createIRI("urn:b"); + BNode obj = f.createBNode(); + + Value value = function.evaluate(f, subj, pred, obj); + assertNotNull(value); + assertTrue("expect Triple", value instanceof Triple); + Triple other = f.createTriple(subj, pred, obj); + assertEquals("expect to be the same", value, other); + } + + @Test + public void testEvaluateBNodeAndLiteral() { + BNode subj = f.createBNode(); + IRI pred = f.createIRI("urn:b"); + Literal obj = f.createLiteral(1); + + Value value = function.evaluate(f, subj, pred, obj); + assertNotNull(value); + assertTrue("expect Triple", value instanceof Triple); + Triple other = f.createTriple(subj, pred, obj); + assertEquals("expect to be the same", value, other); + } + + @Test + public void testEvaluateBNodeAndTriple() { + BNode subj = f.createBNode(); + IRI pred = f.createIRI("urn:b"); + Triple obj = f.createTriple(pred, pred, pred); + + Value value = function.evaluate(f, subj, pred, obj); + assertNotNull(value); + assertTrue("expect Triple", value instanceof Triple); + Triple other = f.createTriple(subj, pred, obj); + assertEquals("expect to be the same", value, other); + } + + @Test + public void testEvaluateTripleAndIRI() { + IRI pred = f.createIRI("urn:b"); + IRI obj = f.createIRI("urn:c"); + Triple subj = f.createTriple(pred, pred, pred); + + Value value = function.evaluate(f, subj, pred, obj); + assertNotNull(value); + assertTrue("expect Triple", value instanceof Triple); + Triple other = f.createTriple(subj, pred, obj); + assertEquals("expect to be the same", value, other); + } + + @Test + public void testEvaluateTripleAndBNode() { + IRI pred = f.createIRI("urn:b"); + BNode obj = f.createBNode(); + Triple subj = f.createTriple(pred, pred, pred); + + Value value = function.evaluate(f, subj, pred, obj); + assertNotNull(value); + assertTrue("expect Triple", value instanceof Triple); + Triple other = f.createTriple(subj, pred, obj); + assertEquals("expect to be the same", value, other); + } + + @Test + public void testEvaluateTripleAndLiteral() { + IRI pred = f.createIRI("urn:b"); + Literal obj = f.createLiteral(1); + Triple subj = f.createTriple(pred, pred, pred); + + Value value = function.evaluate(f, subj, pred, obj); + assertNotNull(value); + assertTrue("expect Triple", value instanceof Triple); + Triple other = f.createTriple(subj, pred, obj); + assertEquals("expect to be the same", value, other); + } + + @Test + public void testEvaluateTripleAndTriple() { + IRI pred = f.createIRI("urn:b"); + Triple obj = f.createTriple(pred, pred, pred); + Triple subj = f.createTriple(pred, pred, pred); + + Value value = function.evaluate(f, subj, pred, obj); + assertNotNull(value); + assertTrue("expect Triple", value instanceof Triple); + Triple other = f.createTriple(subj, pred, obj); + assertEquals("expect to be the same", value, other); + } + + @Test(expected = ValueExprEvaluationException.class) + public void testNegariveWrongNumberOfArguments() { + IRI subj = f.createIRI("urn:a"); + IRI pred = f.createIRI("urn:b"); + IRI obj = f.createIRI("urn:c"); + + function.evaluate(f, subj, pred, obj, null); + fail("should throw ValueExprEvaluationException"); + } + + @Test(expected = ValueExprEvaluationException.class) + public void testNegativeLiteralAsSubject() { + Literal subj = f.createLiteral(1); + IRI pred = f.createIRI("urn:b"); + IRI obj = f.createIRI("urn:c"); + + function.evaluate(f, subj, pred, obj); + fail("should not accept Literal as subject"); + } + + @Test(expected = ValueExprEvaluationException.class) + public void testNegativeLiteralAsPredicate() { + Literal subj = f.createLiteral(1); + IRI pred = f.createIRI("urn:b"); + IRI obj = f.createIRI("urn:c"); + + function.evaluate(f, subj, pred, obj); + fail("should not accept Literal as predicate"); + } +} diff --git a/core/queryalgebra/evaluation/src/test/java/org/eclipse/rdf4j/query/algebra/evaluation/function/triple/TripleObjectFunctionTest.java b/core/queryalgebra/evaluation/src/test/java/org/eclipse/rdf4j/query/algebra/evaluation/function/triple/TripleObjectFunctionTest.java new file mode 100644 index 00000000000..b1a85a5f6e5 --- /dev/null +++ b/core/queryalgebra/evaluation/src/test/java/org/eclipse/rdf4j/query/algebra/evaluation/function/triple/TripleObjectFunctionTest.java @@ -0,0 +1,82 @@ +/******************************************************************************* + * Copyright (c) 2020 Eclipse RDF4J contributors. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Distribution License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ +package org.eclipse.rdf4j.query.algebra.evaluation.function.triple; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +import org.eclipse.rdf4j.model.IRI; +import org.eclipse.rdf4j.model.Triple; +import org.eclipse.rdf4j.model.Value; +import org.eclipse.rdf4j.model.ValueFactory; +import org.eclipse.rdf4j.model.impl.SimpleValueFactory; +import org.eclipse.rdf4j.query.algebra.evaluation.ValueExprEvaluationException; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +/** + * Test rdf:subject(a) function + * + * @author damyan.ognyanov + */ +public class TripleObjectFunctionTest { + + private TripleObjectFunction function; + + private ValueFactory f = SimpleValueFactory.getInstance(); + + /** + * @throws java.lang.Exception + */ + @Before + public void setUp() throws Exception { + function = new TripleObjectFunction(); + } + + /** + * @throws java.lang.Exception + */ + @After + public void tearDown() throws Exception { + } + + @Test + public void testEvaluateWithTriple() { + IRI subj = f.createIRI("urn:a"); + IRI pred = f.createIRI("urn:b"); + IRI obj = f.createIRI("urn:c"); + Triple testValue = f.createTriple(subj, pred, obj); + + Value value = function.evaluate(f, testValue); + assertNotNull(value); + assertTrue("expect IRI", value instanceof IRI); + assertEquals("expect same value", obj, value); + } + + @Test(expected = ValueExprEvaluationException.class) + public void testNegativeWrongArguments() { + IRI subj = f.createIRI("urn:a"); + IRI pred = f.createIRI("urn:b"); + IRI obj = f.createIRI("urn:c"); + Triple testValue = f.createTriple(subj, pred, obj); + + function.evaluate(f, testValue, subj); + fail("expect ValueExprEvaluationException"); + } + + @Test(expected = ValueExprEvaluationException.class) + public void testWrongArguments() { + IRI subj = f.createIRI("urn:a"); + + function.evaluate(f, subj); + fail("expect ValueExprEvaluationException"); + } +} diff --git a/core/queryalgebra/evaluation/src/test/java/org/eclipse/rdf4j/query/algebra/evaluation/function/triple/TriplePredicateFunctionTest.java b/core/queryalgebra/evaluation/src/test/java/org/eclipse/rdf4j/query/algebra/evaluation/function/triple/TriplePredicateFunctionTest.java new file mode 100644 index 00000000000..72fab87e54d --- /dev/null +++ b/core/queryalgebra/evaluation/src/test/java/org/eclipse/rdf4j/query/algebra/evaluation/function/triple/TriplePredicateFunctionTest.java @@ -0,0 +1,82 @@ +/******************************************************************************* + * Copyright (c) 2020 Eclipse RDF4J contributors. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Distribution License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ +package org.eclipse.rdf4j.query.algebra.evaluation.function.triple; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +import org.eclipse.rdf4j.model.IRI; +import org.eclipse.rdf4j.model.Triple; +import org.eclipse.rdf4j.model.Value; +import org.eclipse.rdf4j.model.ValueFactory; +import org.eclipse.rdf4j.model.impl.SimpleValueFactory; +import org.eclipse.rdf4j.query.algebra.evaluation.ValueExprEvaluationException; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +/** + * Test rdf:predicate(a) function + * + * @author damyan.ognyanov + */ +public class TriplePredicateFunctionTest { + + private TriplePredicateFunction function; + + private ValueFactory f = SimpleValueFactory.getInstance(); + + /** + * @throws java.lang.Exception + */ + @Before + public void setUp() throws Exception { + function = new TriplePredicateFunction(); + } + + /** + * @throws java.lang.Exception + */ + @After + public void tearDown() throws Exception { + } + + @Test + public void testEvaluateWithTriple() { + IRI subj = f.createIRI("urn:a"); + IRI pred = f.createIRI("urn:b"); + IRI obj = f.createIRI("urn:c"); + Triple testValue = f.createTriple(subj, pred, obj); + + Value value = function.evaluate(f, testValue); + assertNotNull(value); + assertTrue("expect IRI", value instanceof IRI); + assertEquals("expect same value", pred, value); + } + + @Test(expected = ValueExprEvaluationException.class) + public void testNegativeWrongArguments() { + IRI subj = f.createIRI("urn:a"); + IRI pred = f.createIRI("urn:b"); + IRI obj = f.createIRI("urn:c"); + Triple testValue = f.createTriple(subj, pred, obj); + + function.evaluate(f, testValue, subj); + fail("expect ValueExprEvaluationException"); + } + + @Test(expected = ValueExprEvaluationException.class) + public void testWrongArguments() { + IRI subj = f.createIRI("urn:a"); + + function.evaluate(f, subj); + fail("expect ValueExprEvaluationException"); + } +} diff --git a/core/queryalgebra/evaluation/src/test/java/org/eclipse/rdf4j/query/algebra/evaluation/function/triple/TripleSubjectFunctionTest.java b/core/queryalgebra/evaluation/src/test/java/org/eclipse/rdf4j/query/algebra/evaluation/function/triple/TripleSubjectFunctionTest.java new file mode 100644 index 00000000000..412857c0460 --- /dev/null +++ b/core/queryalgebra/evaluation/src/test/java/org/eclipse/rdf4j/query/algebra/evaluation/function/triple/TripleSubjectFunctionTest.java @@ -0,0 +1,82 @@ +/******************************************************************************* + * Copyright (c) 2020 Eclipse RDF4J contributors. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Distribution License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ +package org.eclipse.rdf4j.query.algebra.evaluation.function.triple; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +import org.eclipse.rdf4j.model.IRI; +import org.eclipse.rdf4j.model.Triple; +import org.eclipse.rdf4j.model.Value; +import org.eclipse.rdf4j.model.ValueFactory; +import org.eclipse.rdf4j.model.impl.SimpleValueFactory; +import org.eclipse.rdf4j.query.algebra.evaluation.ValueExprEvaluationException; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +/** + * Test rdf:subject(a) function + * + * @author damyan.ognyanov + */ +public class TripleSubjectFunctionTest { + + private TripleSubjectFunction function; + + private ValueFactory f = SimpleValueFactory.getInstance(); + + /** + * @throws java.lang.Exception + */ + @Before + public void setUp() throws Exception { + function = new TripleSubjectFunction(); + } + + /** + * @throws java.lang.Exception + */ + @After + public void tearDown() throws Exception { + } + + @Test + public void testEvaluateWithTriple() { + IRI subj = f.createIRI("urn:a"); + IRI pred = f.createIRI("urn:b"); + IRI obj = f.createIRI("urn:c"); + Triple testValue = f.createTriple(subj, pred, obj); + + Value value = function.evaluate(f, testValue); + assertNotNull(value); + assertTrue("expect IRI", value instanceof IRI); + assertEquals("expect same value", subj, value); + } + + @Test(expected = ValueExprEvaluationException.class) + public void testNegativeWrongArguments() { + IRI subj = f.createIRI("urn:a"); + IRI pred = f.createIRI("urn:b"); + IRI obj = f.createIRI("urn:c"); + Triple testValue = f.createTriple(subj, pred, obj); + + function.evaluate(f, testValue, subj); + fail("expect ValueExprEvaluationException"); + } + + @Test(expected = ValueExprEvaluationException.class) + public void testWrongArguments() { + IRI subj = f.createIRI("urn:a"); + + function.evaluate(f, subj); + fail("expect ValueExprEvaluationException"); + } +} diff --git a/core/queryalgebra/evaluation/src/test/java/org/eclipse/rdf4j/query/algebra/evaluation/impl/EvaluationStrategyWithRDFStarTest.java b/core/queryalgebra/evaluation/src/test/java/org/eclipse/rdf4j/query/algebra/evaluation/impl/EvaluationStrategyWithRDFStarTest.java new file mode 100644 index 00000000000..0f9045d2625 --- /dev/null +++ b/core/queryalgebra/evaluation/src/test/java/org/eclipse/rdf4j/query/algebra/evaluation/impl/EvaluationStrategyWithRDFStarTest.java @@ -0,0 +1,355 @@ +/******************************************************************************* + * Copyright (c) 2020 Eclipse RDF4J contributors. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Distribution License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ +package org.eclipse.rdf4j.query.algebra.evaluation.impl; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.Assert.assertTrue; + +import java.util.ArrayList; +import java.util.Iterator; + +import org.eclipse.rdf4j.common.iteration.AbstractCloseableIteration; +import org.eclipse.rdf4j.common.iteration.CloseableIteration; +import org.eclipse.rdf4j.common.iteration.ConvertingIteration; +import org.eclipse.rdf4j.model.IRI; +import org.eclipse.rdf4j.model.Resource; +import org.eclipse.rdf4j.model.Statement; +import org.eclipse.rdf4j.model.Triple; +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.QueryEvaluationException; +import org.eclipse.rdf4j.query.algebra.TripleRef; +import org.eclipse.rdf4j.query.algebra.Var; +import org.eclipse.rdf4j.query.algebra.evaluation.EvaluationStrategy; +import org.eclipse.rdf4j.query.algebra.evaluation.QueryBindingSet; +import org.eclipse.rdf4j.query.algebra.evaluation.RDFStarTripleSource; +import org.eclipse.rdf4j.query.algebra.evaluation.TripleSource; +import org.eclipse.rdf4j.query.impl.EmptyBindingSet; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; +import org.junit.runners.Parameterized.Parameter; +import org.junit.runners.Parameterized.Parameters; + +/** + * The test verifies the evaluation of TripleRef nodes through evaluation strategy that uses a tripleSource implementing + * either {@link TripleSource} or {@link RDFStarTripleSource} interfaces + * + * @author damyan.ognyanov + * + */ +@RunWith(Parameterized.class) +public class EvaluationStrategyWithRDFStarTest { + + @Parameters(name = "RDF*={0}") + public static Object[] params() { + return new Object[] { false, true }; + } + + @Parameter + public boolean bRDFStarData; + + // the triples over which the evaluations is carried + private ArrayList triples = new ArrayList<>(); + + ValueFactory vf = SimpleValueFactory.getInstance(); + + TripleRef tripleRefNode; + + EvaluationStrategy strategy; + + CommonBaseSource baseSource; + + /** + * this class does it all over a collection of triples but do not IMPLEMENT either TripleSource nor + * RDFStarTripleSource The sources for the eval strategies just forward the evaluation to an instance of that + * + * @author damyan.ognyanov + * + */ + class CommonBaseSource { + public CloseableIteration getRdfStarTriples(Resource subj, + IRI pred, Value obj) + throws QueryEvaluationException { + return new AbstractCloseableIteration() { + Iterator iter = triples.iterator(); + + @Override + public boolean hasNext() + throws QueryEvaluationException { + return iter.hasNext(); + } + + @Override + public Triple next() + throws QueryEvaluationException { + return iter.next(); + } + + @Override + public void remove() + throws QueryEvaluationException { + } + }; + } + + public CloseableIteration getStatements(Resource subj, + IRI pred, Value obj, Resource... contexts) + throws QueryEvaluationException { + // handle only arguments with reification vocabulary + // and return iterations accordingly from the same set of Triples + + // handle (*, rdf:type, rdf:Statement) + if (pred != null && pred.equals(RDF.TYPE) && obj != null && obj.equals(RDF.STATEMENT)) { + return new ConvertingIteration( + getRdfStarTriples(null, null, null)) { + @Override + protected Statement convert(Triple sourceObject) + throws QueryEvaluationException { + return vf.createStatement(sourceObject, RDF.TYPE, RDF.STATEMENT); + } + }; + } else if (pred != null && pred.equals(RDF.SUBJECT)) { + // handle (*, rdf:subject, *) + return new ConvertingIteration( + getRdfStarTriples(null, null, null)) { + @Override + protected Statement convert(Triple sourceObject) + throws QueryEvaluationException { + return vf.createStatement(sourceObject, RDF.SUBJECT, sourceObject.getSubject()); + } + }; + } else if (pred != null && pred.equals(RDF.PREDICATE)) { + // handle (*, rdf:predicate, *) + return new ConvertingIteration( + getRdfStarTriples(null, null, null)) { + @Override + protected Statement convert(Triple sourceObject) + throws QueryEvaluationException { + return vf.createStatement(sourceObject, RDF.PREDICATE, sourceObject.getPredicate()); + } + }; + } else if (pred != null && pred.equals(RDF.OBJECT)) { + // handle (*, rdf:object, *) + return new ConvertingIteration( + getRdfStarTriples(null, null, null)) { + @Override + protected Statement convert(Triple sourceObject) + throws QueryEvaluationException { + return vf.createStatement(sourceObject, RDF.OBJECT, sourceObject.getObject()); + } + }; + } + // DO NOT handle anything else + return null; + } + + } + + ; + + @Before + public void setUp() throws Exception { + // prepare data + triples.clear(); + triples.add(vf.createTriple(vf.createIRI("urn:a"), vf.createIRI("urn:p"), vf.createIRI("urn:b"))); + triples.add(vf.createTriple(vf.createIRI("urn:a"), vf.createIRI("urn:q"), vf.createIRI("urn:b:1"))); + triples.add(vf.createTriple(vf.createIRI("urn:a:1"), vf.createIRI("urn:p"), vf.createIRI("urn:b"))); + triples.add(vf.createTriple(vf.createIRI("urn:a:2"), vf.createIRI("urn:q"), vf.createIRI("urn:c"))); + + baseSource = new CommonBaseSource(); + + tripleRefNode = new TripleRef(); + tripleRefNode.setSubjectVar(new Var("s")); + tripleRefNode.setPredicateVar(new Var("p")); + tripleRefNode.setObjectVar(new Var("o")); + tripleRefNode.setExprVar(new Var("extern")); + + strategy = new StrictEvaluationStrategy(createSource(), null); + } + + /** + * parametrized: either {@link RDFStarTripleSource} or {@link TripleSource} + */ + private TripleSource createSource() { + if (bRDFStarData) { + return new RDFStarTripleSource() { + + @Override + public ValueFactory getValueFactory() { + return vf; + } + + @Override + public CloseableIteration getStatements(Resource subj, + IRI pred, Value obj, Resource... contexts) + throws QueryEvaluationException { + return baseSource.getStatements(subj, pred, obj, contexts); + } + + @Override + public CloseableIteration getRdfStarTriples(Resource subj, + IRI pred, Value obj) + throws QueryEvaluationException { + return baseSource.getRdfStarTriples(subj, pred, obj); + } + }; + } else { + return new TripleSource() { + @Override + public ValueFactory getValueFactory() { + return vf; + } + + @Override + public CloseableIteration getStatements(Resource subj, + IRI pred, Value obj, Resource... contexts) + throws QueryEvaluationException { + return baseSource.getStatements(subj, pred, obj, contexts); + } + }; + } + } + + @Test + public void testMatchAllUnbound() { + // case check all unbound + try (CloseableIteration iter = strategy.evaluate(tripleRefNode, + new EmptyBindingSet())) { + ArrayList expected = new ArrayList<>(); + triples.forEach(t -> { + expected.add(fromTriple(t)); + }); + ArrayList received = new ArrayList<>(); + while (iter.hasNext()) { + received.add(iter.next()); + } + assertTrue("all expected must be received", received.containsAll(expected)); + assertTrue("all received must be expected", expected.containsAll(received)); + } + } + + @Test + public void testSubjVarBound() { + try (CloseableIteration iter = strategy.evaluate(tripleRefNode, + createWithVarValue(tripleRefNode.getSubjectVar(), vf.createIRI("urn:a")))) { + ArrayList expected = new ArrayList<>(); + triples.forEach(t -> { + if (t.getSubject().equals(vf.createIRI("urn:a"))) { + expected.add(fromTriple(t)); + } + }); + ArrayList received = new ArrayList<>(); + while (iter.hasNext()) { + received.add(iter.next()); + } + assertTrue("all expected must be received", received.containsAll(expected)); + assertTrue("all received must be expected", expected.containsAll(received)); + } + } + + @Test + public void testPredVarBound() { + try (CloseableIteration iter = strategy.evaluate(tripleRefNode, + createWithVarValue(tripleRefNode.getPredicateVar(), vf.createIRI("urn:p")))) { + + ArrayList expected = new ArrayList<>(); + triples.forEach(t -> { + if (t.getPredicate().equals(vf.createIRI("urn:p"))) { + expected.add(fromTriple(t)); + } + }); + ArrayList received = new ArrayList<>(); + while (iter.hasNext()) { + received.add(iter.next()); + } + assertTrue("all expected must be received", received.containsAll(expected)); + assertTrue("all received must be expected", expected.containsAll(received)); + } + } + + @Test + public void testObjVarBound() { + try (CloseableIteration iter = strategy.evaluate(tripleRefNode, + createWithVarValue(tripleRefNode.getObjectVar(), vf.createIRI("urn:b")))) { + + ArrayList expected = new ArrayList<>(); + triples.forEach(t -> { + if (t.getObject().equals(vf.createIRI("urn:b"))) { + expected.add(fromTriple(t)); + } + }); + ArrayList received = new ArrayList<>(); + while (iter.hasNext()) { + received.add(iter.next()); + } + assertTrue("all expected must be received", received.containsAll(expected)); + assertTrue("all received must be expected", expected.containsAll(received)); + } + } + + @Test + public void testSubjAndObjVarBound() { + QueryBindingSet set = (QueryBindingSet) createWithVarValue(tripleRefNode.getObjectVar(), vf.createIRI("urn:c")); + set.addBinding(tripleRefNode.getSubjectVar().getName(), vf.createIRI("urn:a:2")); + + try (CloseableIteration iter = strategy.evaluate(tripleRefNode, set)) { + + ArrayList expected = new ArrayList<>(); + triples.forEach(t -> { + if (t.getObject().equals(vf.createIRI("urn:c")) && t.getSubject().equals(vf.createIRI("urn:a:2"))) { + expected.add(fromTriple(t)); + } + }); + ArrayList received = new ArrayList<>(); + while (iter.hasNext()) { + received.add(iter.next()); + } + assertTrue("all expected must be received", received.containsAll(expected)); + assertTrue("all received must be expected", expected.containsAll(received)); + } + } + + @Test + public void testExtVarBound() { + Triple triple = triples.get(0); + QueryBindingSet set = (QueryBindingSet) createWithVarValue(tripleRefNode.getExprVar(), triple); + + try (CloseableIteration iter = strategy.evaluate(tripleRefNode, set)) { + + ArrayList expected = new ArrayList<>(); + expected.add(fromTriple(triple)); + ArrayList received = new ArrayList<>(); + while (iter.hasNext()) { + received.add(iter.next()); + } + + assertThat(received).containsAll(expected); + assertThat(expected).containsAll(received); + } + } + + private BindingSet createWithVarValue(Var var, Value value) { + QueryBindingSet ret = new QueryBindingSet(); + ret.addBinding(var.getName(), value); + return ret; + } + + private BindingSet fromTriple(Triple t) { + QueryBindingSet ret = new QueryBindingSet(); + ret.addBinding("extern", t); + ret.addBinding("s", t.getSubject()); + ret.addBinding("p", t.getPredicate()); + ret.addBinding("o", t.getObject()); + return ret; + } +} diff --git a/core/queryalgebra/evaluation/src/test/java/org/eclipse/rdf4j/query/algebra/evaluation/impl/QueryCostEstimatesTest.java b/core/queryalgebra/evaluation/src/test/java/org/eclipse/rdf4j/query/algebra/evaluation/impl/QueryCostEstimatesTest.java new file mode 100644 index 00000000000..e00bfb248a2 --- /dev/null +++ b/core/queryalgebra/evaluation/src/test/java/org/eclipse/rdf4j/query/algebra/evaluation/impl/QueryCostEstimatesTest.java @@ -0,0 +1,65 @@ +/******************************************************************************* + * Copyright (c) 2020 Eclipse RDF4J contributors. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Distribution License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ +package org.eclipse.rdf4j.query.algebra.evaluation.impl; + +import static org.junit.Assert.assertEquals; + +import org.eclipse.rdf4j.RDF4JException; +import org.eclipse.rdf4j.query.algebra.QueryRoot; +import org.eclipse.rdf4j.query.parser.ParsedQuery; +import org.eclipse.rdf4j.query.parser.sparql.SPARQLParser; +import org.junit.Test; + +/** + * Tests that cost estimates are printed as part of the plan + */ +public class QueryCostEstimatesTest { + + @Test + public void testBindingSetAssignmentOptimization() throws RDF4JException { + String query = "prefix ex: " + "select ?s ?p ?o ?x where {" + " ex:s1 ex:pred ?v. " + + " ex:s2 ex:pred 'bah'. {" + " ?s ?p ?o. " + " optional {" + + " values ?x {ex:a ex:b ex:c ex:d ex:e ex:f ex:g}. " + " }" + " }" + "}"; + + SPARQLParser parser = new SPARQLParser(); + ParsedQuery q = parser.parseQuery(query, null); + QueryJoinOptimizer opt = new QueryJoinOptimizer(); + QueryRoot optRoot = new QueryRoot(q.getTupleExpr()); + opt.optimize(optRoot, null, null); + + assertEquals("QueryRoot\n" + + " Projection\n" + + " ProjectionElemList\n" + + " ProjectionElem \"s\"\n" + + " ProjectionElem \"p\"\n" + + " ProjectionElem \"o\"\n" + + " ProjectionElem \"x\"\n" + + " Extension\n" + + " ExtensionElem (x)\n" + + " Var (name=x)\n" + + " Join\n" + + " StatementPattern (costEstimate=1, resultSizeEstimate=1)\n" + + " Var (name=_const_5c6ba46_uri, value=ex:s2, anonymous)\n" + + " Var (name=_const_af00e088_uri, value=ex:pred, anonymous)\n" + + " Var (name=_const_17c09_lit_e2eec718_0, value=\"bah\", anonymous)\n" + + " Join\n" + + " StatementPattern (costEstimate=10, resultSizeEstimate=10)\n" + + " Var (name=_const_5c6ba45_uri, value=ex:s1, anonymous)\n" + + " Var (name=_const_af00e088_uri, value=ex:pred, anonymous)\n" + + " Var (name=v)\n" + + " LeftJoin (new scope) (costEstimate=1000, resultSizeEstimate=1000)\n" + + " StatementPattern (resultSizeEstimate=1000)\n" + + " Var (name=s)\n" + + " Var (name=p)\n" + + " Var (name=o)\n" + + " BindingSetAssignment ([[x=ex:a], [x=ex:b], [x=ex:c], [x=ex:d], [x=ex:e], [x=ex:f], [x=ex:g]])\n", + optRoot.toString()); + + } + +} diff --git a/core/queryalgebra/evaluation/src/test/java/org/eclipse/rdf4j/query/algebra/evaluation/impl/QueryJoinOptimizerTest.java b/core/queryalgebra/evaluation/src/test/java/org/eclipse/rdf4j/query/algebra/evaluation/impl/QueryJoinOptimizerTest.java index 627790b05fe..bf929e377ff 100644 --- a/core/queryalgebra/evaluation/src/test/java/org/eclipse/rdf4j/query/algebra/evaluation/impl/QueryJoinOptimizerTest.java +++ b/core/queryalgebra/evaluation/src/test/java/org/eclipse/rdf4j/query/algebra/evaluation/impl/QueryJoinOptimizerTest.java @@ -31,7 +31,7 @@ /** * Tests to monitor QueryJoinOptimizer behaviour. - * + * * @author Mark */ public class QueryJoinOptimizerTest { diff --git a/core/queryalgebra/evaluation/src/test/java/org/eclipse/rdf4j/query/algebra/evaluation/impl/StrictEvaluationStrategyTest.java b/core/queryalgebra/evaluation/src/test/java/org/eclipse/rdf4j/query/algebra/evaluation/impl/StrictEvaluationStrategyTest.java index a1432370b44..460fb266917 100644 --- a/core/queryalgebra/evaluation/src/test/java/org/eclipse/rdf4j/query/algebra/evaluation/impl/StrictEvaluationStrategyTest.java +++ b/core/queryalgebra/evaluation/src/test/java/org/eclipse/rdf4j/query/algebra/evaluation/impl/StrictEvaluationStrategyTest.java @@ -7,6 +7,7 @@ *******************************************************************************/ package org.eclipse.rdf4j.query.algebra.evaluation.impl; +import static org.assertj.core.api.Assertions.assertThat; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; @@ -15,6 +16,8 @@ import static org.mockito.Mockito.verify; import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; import org.eclipse.rdf4j.common.iteration.CloseableIteration; import org.eclipse.rdf4j.model.ValueFactory; @@ -22,11 +25,12 @@ import org.eclipse.rdf4j.query.BindingSet; import org.eclipse.rdf4j.query.QueryEvaluationException; import org.eclipse.rdf4j.query.QueryLanguage; +import org.eclipse.rdf4j.query.QueryResults; import org.eclipse.rdf4j.query.algebra.TupleExpr; import org.eclipse.rdf4j.query.algebra.evaluation.EvaluationStrategy; import org.eclipse.rdf4j.query.algebra.evaluation.QueryBindingSet; import org.eclipse.rdf4j.query.algebra.evaluation.QueryOptimizer; -import org.eclipse.rdf4j.query.algebra.evaluation.QueryOptimizerPipeline; +import org.eclipse.rdf4j.query.impl.EmptyBindingSet; import org.eclipse.rdf4j.query.parser.ParsedQuery; import org.eclipse.rdf4j.query.parser.QueryParserUtil; import org.junit.Before; @@ -83,4 +87,51 @@ public void testOptimize() throws Exception { verify(optimizer1, times(1)).optimize(expr, null, bindings); verify(optimizer2, times(1)).optimize(expr, null, bindings); } + + @Test + public void testEvaluateRegexFlags() throws Exception { + + String query = "SELECT ?a WHERE { " + + "VALUES ?a { \"foo.bar\" \"foo bar\" } \n" + + "FILTER REGEX(str(?a), \"foo.bar\")}"; + + ParsedQuery pq = QueryParserUtil.parseQuery(QueryLanguage.SPARQL, query, null); + + CloseableIteration result = strategy.evaluate(pq.getTupleExpr(), + new EmptyBindingSet()); + + List bindingSets = QueryResults.asList(result); + assertThat(bindingSets).hasSize(2); + + // match with q flag + query = "SELECT ?a WHERE { " + + "VALUES ?a { \"foo.bar\" \"foo bar\" } \n" + + "FILTER REGEX(str(?a), \"foo.bar\", \"q\")}"; + + pq = QueryParserUtil.parseQuery(QueryLanguage.SPARQL, query, null); + + result = strategy.evaluate(pq.getTupleExpr(), + new EmptyBindingSet()); + + bindingSets = QueryResults.asList(result); + assertThat(bindingSets).hasSize(1); + assertThat(bindingSets.get(0).getValue("a").stringValue()).isEqualTo("foo.bar"); + + // match with i and q flag + query = "SELECT ?a WHERE { " + + "VALUES ?a { \"foo.bar\" \"FOO.BAR\" \"foo bar\" } \n" + + "FILTER REGEX(str(?a), \"foo.bar\", \"iq\")}"; + + pq = QueryParserUtil.parseQuery(QueryLanguage.SPARQL, query, null); + + result = strategy.evaluate(pq.getTupleExpr(), + new EmptyBindingSet()); + + bindingSets = QueryResults.asList(result); + assertThat(bindingSets).hasSize(2); + + List values = bindingSets.stream().map(v -> v.getValue("a").stringValue()).collect(Collectors.toList()); + assertThat(values).containsExactlyInAnyOrder("foo.bar", "FOO.BAR"); + } + } diff --git a/core/queryalgebra/evaluation/src/test/java/org/eclipse/rdf4j/query/algebra/evaluation/iterator/BindingSetSize.java b/core/queryalgebra/evaluation/src/test/java/org/eclipse/rdf4j/query/algebra/evaluation/iterator/BindingSetSize.java index b8a37679466..25e9aeb330e 100644 --- a/core/queryalgebra/evaluation/src/test/java/org/eclipse/rdf4j/query/algebra/evaluation/iterator/BindingSetSize.java +++ b/core/queryalgebra/evaluation/src/test/java/org/eclipse/rdf4j/query/algebra/evaluation/iterator/BindingSetSize.java @@ -59,4 +59,4 @@ public int size() { public String toString() { return getClass().getSimpleName() + "#" + size; } -} \ No newline at end of file +} diff --git a/core/queryalgebra/evaluation/src/test/java/org/eclipse/rdf4j/query/algebra/evaluation/iterator/GroupIteratorTest.java b/core/queryalgebra/evaluation/src/test/java/org/eclipse/rdf4j/query/algebra/evaluation/iterator/GroupIteratorTest.java index 6985f32bdc5..47057e6da31 100644 --- a/core/queryalgebra/evaluation/src/test/java/org/eclipse/rdf4j/query/algebra/evaluation/iterator/GroupIteratorTest.java +++ b/core/queryalgebra/evaluation/src/test/java/org/eclipse/rdf4j/query/algebra/evaluation/iterator/GroupIteratorTest.java @@ -42,12 +42,14 @@ public class GroupIteratorTest { private final EvaluationStrategy evaluator = new StrictEvaluationStrategy(null, null); private final static BindingSetAssignment EMPTY_ASSIGNMENT; + static { EMPTY_ASSIGNMENT = new BindingSetAssignment(); EMPTY_ASSIGNMENT.setBindingSets(Collections.emptyList()); } private final static BindingSetAssignment NONEMPTY_ASSIGNMENT; + static { NONEMPTY_ASSIGNMENT = new BindingSetAssignment(); ArrayList list = new ArrayList<>(); diff --git a/core/queryalgebra/evaluation/src/test/java/org/eclipse/rdf4j/query/algebra/evaluation/iterator/IterationStub.java b/core/queryalgebra/evaluation/src/test/java/org/eclipse/rdf4j/query/algebra/evaluation/iterator/IterationStub.java index b95168f172f..b3edc5b549f 100644 --- a/core/queryalgebra/evaluation/src/test/java/org/eclipse/rdf4j/query/algebra/evaluation/iterator/IterationStub.java +++ b/core/queryalgebra/evaluation/src/test/java/org/eclipse/rdf4j/query/algebra/evaluation/iterator/IterationStub.java @@ -17,7 +17,7 @@ class IterationStub extends CloseableIteratorIteration implements Serializable { /** - * + * */ private static final long serialVersionUID = 1L; @@ -48,4 +48,4 @@ public BindingSet next() throws QueryEvaluationException { public void remove() { removeCount++; } -} \ No newline at end of file +} diff --git a/core/queryalgebra/evaluation/src/test/java/org/eclipse/rdf4j/query/algebra/evaluation/iterator/SizeComparator.java b/core/queryalgebra/evaluation/src/test/java/org/eclipse/rdf4j/query/algebra/evaluation/iterator/SizeComparator.java index e12becca90c..139d79d3786 100644 --- a/core/queryalgebra/evaluation/src/test/java/org/eclipse/rdf4j/query/algebra/evaluation/iterator/SizeComparator.java +++ b/core/queryalgebra/evaluation/src/test/java/org/eclipse/rdf4j/query/algebra/evaluation/iterator/SizeComparator.java @@ -15,7 +15,7 @@ class SizeComparator implements Comparator, Serializable { /** - * + * */ private static final long serialVersionUID = 1L; @@ -23,4 +23,4 @@ class SizeComparator implements Comparator, Serializable { public int compare(BindingSet o1, BindingSet o2) { return Integer.valueOf(o1.size()).compareTo(o2.size()); } -} \ No newline at end of file +} diff --git a/core/queryalgebra/evaluation/src/test/java/org/eclipse/rdf4j/query/algebra/evaluation/iterator/ZeroLengthPathIterationTest.java b/core/queryalgebra/evaluation/src/test/java/org/eclipse/rdf4j/query/algebra/evaluation/iterator/ZeroLengthPathIterationTest.java index 73bc8b99465..acd08a9f246 100644 --- a/core/queryalgebra/evaluation/src/test/java/org/eclipse/rdf4j/query/algebra/evaluation/iterator/ZeroLengthPathIterationTest.java +++ b/core/queryalgebra/evaluation/src/test/java/org/eclipse/rdf4j/query/algebra/evaluation/iterator/ZeroLengthPathIterationTest.java @@ -51,7 +51,7 @@ public void setUp() { @Override public CloseableIteration getStatements(Resource subj, IRI pred, Value obj, Resource... contexts) throws QueryEvaluationException { - return new CloseableIteratorIteration<>(m.filter(subj, pred, obj, contexts).iterator()); + return new CloseableIteratorIteration<>(m.getStatements(subj, pred, obj, contexts).iterator()); } @Override @@ -64,7 +64,7 @@ public ValueFactory getValueFactory() { /** * Verify that evaluation of a {@link ZeroLengthPathIteration} does not discard input bindings. - * + * * @see https://github.com/eclipse/rdf4j/issues/689 */ @Test diff --git a/core/queryalgebra/evaluation/src/test/java/org/eclipse/rdf4j/query/algebra/evaluation/util/QueryEvaluationUtilTest.java b/core/queryalgebra/evaluation/src/test/java/org/eclipse/rdf4j/query/algebra/evaluation/util/QueryEvaluationUtilTest.java index dda31b61754..cd8fc769b73 100644 --- a/core/queryalgebra/evaluation/src/test/java/org/eclipse/rdf4j/query/algebra/evaluation/util/QueryEvaluationUtilTest.java +++ b/core/queryalgebra/evaluation/src/test/java/org/eclipse/rdf4j/query/algebra/evaluation/util/QueryEvaluationUtilTest.java @@ -401,7 +401,7 @@ private void assertCompareException(Literal lit1, Literal lit2, CompareOp op) th /** * Assert that there is an exception as a result of comparing the two literals with the given operator. - * + * * @param lit1 The left literal * @param lit2 The right literal * @param op The operator for the comparison @@ -423,7 +423,7 @@ private void assertCompareFalse(Literal lit1, Literal lit2, CompareOp op) throws /** * Assert that there is no exception as a result of comparing the two literals with the given operator and it * returns false. - * + * * @param lit1 The left literal * @param lit2 The right literal * @param op The operator for the comparison @@ -440,7 +440,7 @@ private void assertCompareTrue(Literal lit1, Literal lit2, CompareOp op) throws /** * Assert that there is no exception as a result of comparing the two literals with the given operator and it * returns true. - * + * * @param lit1 The left literal * @param lit2 The right literal * @param op The operator for the comparison diff --git a/core/queryalgebra/geosparql/pom.xml b/core/queryalgebra/geosparql/pom.xml index 57627e6486b..39820ec3833 100644 --- a/core/queryalgebra/geosparql/pom.xml +++ b/core/queryalgebra/geosparql/pom.xml @@ -4,7 +4,7 @@ org.eclipse.rdf4j rdf4j-queryalgebra - 3.1.5-SNAPSHOT + 3.2.2-SNAPSHOT rdf4j-queryalgebra-geosparql RDF4J: Query algebra - GeoSPARQL diff --git a/core/queryalgebra/geosparql/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/geosparql/DefaultSpatialAlgebra.java b/core/queryalgebra/geosparql/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/geosparql/DefaultSpatialAlgebra.java index 2a65f055013..023e85d009f 100644 --- a/core/queryalgebra/geosparql/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/geosparql/DefaultSpatialAlgebra.java +++ b/core/queryalgebra/geosparql/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/geosparql/DefaultSpatialAlgebra.java @@ -18,7 +18,7 @@ /** * Default implementation of Spatial Algebra for use in situations where JTS support is not available. - * + * * @deprecated use {@link JtsSpatialAlgebra} instead. */ @Deprecated @@ -275,4 +275,4 @@ public boolean ehEquals(Shape s1, Shape s2) { public boolean rcc8eq(Shape s1, Shape s2) { return notSupported(); } -} \ No newline at end of file +} diff --git a/core/queryalgebra/geosparql/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/geosparql/DefaultWktWriter.java b/core/queryalgebra/geosparql/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/geosparql/DefaultWktWriter.java index 43c0143fb78..df23a1c42d3 100644 --- a/core/queryalgebra/geosparql/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/geosparql/DefaultWktWriter.java +++ b/core/queryalgebra/geosparql/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/geosparql/DefaultWktWriter.java @@ -35,4 +35,4 @@ public String toWkt(Shape shape) throws IOException { } return wktWriter.toString(shape); } -} \ No newline at end of file +} diff --git a/core/queryalgebra/geosparql/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/geosparql/FunctionArguments.java b/core/queryalgebra/geosparql/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/geosparql/FunctionArguments.java index ce522b3750c..00ace8ec500 100644 --- a/core/queryalgebra/geosparql/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/geosparql/FunctionArguments.java +++ b/core/queryalgebra/geosparql/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/function/geosparql/FunctionArguments.java @@ -35,7 +35,7 @@ private FunctionArguments() { /** * Get the double value - * + * * @param func function * @param v value * @return double @@ -56,7 +56,7 @@ public static double getDouble(Function func, Value v) throws ValueExprEvaluatio /** * Get the string value - * + * * @param func function * @param v value * @return string @@ -69,7 +69,7 @@ public static String getString(Function func, Value v) throws ValueExprEvaluatio /** * Get the geo shape - * + * * @param func function * @param v value * @param context @@ -88,7 +88,7 @@ public static Shape getShape(Function func, Value v, SpatialContext context) thr /** * Get the geo point - * + * * @param func function * @param v value * @param geoContext @@ -106,7 +106,7 @@ public static Point getPoint(Function func, Value v, SpatialContext geoContext) /** * Get the literal of a specific data type - * + * * @param func function * @param v value * @param expectedDatatype @@ -127,7 +127,7 @@ public static Literal getLiteral(Function func, Value v, IRI expectedDatatype) t /** * Get the UoM IRI of the unit - * + * * @param func function * @param v value * @return UoM IRI @@ -146,7 +146,7 @@ public static IRI getUnits(Function func, Value v) throws ValueExprEvaluationExc /** * Convert degrees to another unit - * + * * @param degs degrees * @param units UoM IRI of the unit to convert to * @return converted value as a double @@ -171,7 +171,7 @@ public static double convertFromDegrees(double degs, IRI units) throws ValueExpr /** * Convert a value to degrees - * + * * @param v value * @param units UoM IRI of the unit * @return degrees as a double diff --git a/core/queryalgebra/geosparql/src/test/java/org/eclipse/rdf4j/query/algebra/evaluation/function/geosparql/DistanceTest.java b/core/queryalgebra/geosparql/src/test/java/org/eclipse/rdf4j/query/algebra/evaluation/function/geosparql/DistanceTest.java index d5fa24d3f0f..b6997e1b720 100644 --- a/core/queryalgebra/geosparql/src/test/java/org/eclipse/rdf4j/query/algebra/evaluation/function/geosparql/DistanceTest.java +++ b/core/queryalgebra/geosparql/src/test/java/org/eclipse/rdf4j/query/algebra/evaluation/function/geosparql/DistanceTest.java @@ -26,7 +26,7 @@ public class DistanceTest { /** * Test distance between two cities, in meters. - * + * * @throws IOException */ @Test @@ -47,7 +47,7 @@ public void testDistanceAmBxl() throws IOException { /** * Test if distance between cities is the same in both directions - * + * * @throws IOException */ @Test diff --git a/core/queryalgebra/geosparql/src/test/java/org/eclipse/rdf4j/query/algebra/evaluation/function/geosparql/EhContainsTest.java b/core/queryalgebra/geosparql/src/test/java/org/eclipse/rdf4j/query/algebra/evaluation/function/geosparql/EhContainsTest.java index ae762556283..12813a34e58 100644 --- a/core/queryalgebra/geosparql/src/test/java/org/eclipse/rdf4j/query/algebra/evaluation/function/geosparql/EhContainsTest.java +++ b/core/queryalgebra/geosparql/src/test/java/org/eclipse/rdf4j/query/algebra/evaluation/function/geosparql/EhContainsTest.java @@ -26,7 +26,7 @@ public class EhContainsTest extends GeometricRelationFunctionTest { /** * Test ehContains. - * + * * @throws IOException */ @Test diff --git a/core/queryalgebra/geosparql/src/test/java/org/eclipse/rdf4j/query/algebra/evaluation/function/geosparql/GeoSPARQLTests.java b/core/queryalgebra/geosparql/src/test/java/org/eclipse/rdf4j/query/algebra/evaluation/function/geosparql/GeoSPARQLTests.java index 75505ff3f3a..67a5febcd30 100644 --- a/core/queryalgebra/geosparql/src/test/java/org/eclipse/rdf4j/query/algebra/evaluation/function/geosparql/GeoSPARQLTests.java +++ b/core/queryalgebra/geosparql/src/test/java/org/eclipse/rdf4j/query/algebra/evaluation/function/geosparql/GeoSPARQLTests.java @@ -30,7 +30,7 @@ /** * Abstract helper class for unit tests - * + * * @author Bart Hanssens */ public class GeoSPARQLTests { @@ -38,7 +38,7 @@ public class GeoSPARQLTests { /** * Get the repository - * + * * @return repository */ public static Repository getRepository() { @@ -50,7 +50,7 @@ public static Repository getRepository() { /** * Get the results of a query, stored as a resource file, as a binding set - * + * * @param name name of the file containing the query * @return binding set * @throws IOException @@ -61,7 +61,7 @@ public static BindingSet getBindingSet(String name) throws IOException { /** * Get multiple resulting binding sets of a query, stored as a resource file - * + * * @param name name of the file containing the query * @return list of binding sets * @throws IOException @@ -72,7 +72,7 @@ public static List getResults(String name) throws IOException { /** * Get the query, stored as a resource file - * + * * @param name name of the file containing the query * @return * @throws IOException diff --git a/core/queryalgebra/geosparql/src/test/java/org/eclipse/rdf4j/query/algebra/evaluation/function/geosparql/SfContainsTest.java b/core/queryalgebra/geosparql/src/test/java/org/eclipse/rdf4j/query/algebra/evaluation/function/geosparql/SfContainsTest.java index 5f3fea1dc54..4f28fd51218 100644 --- a/core/queryalgebra/geosparql/src/test/java/org/eclipse/rdf4j/query/algebra/evaluation/function/geosparql/SfContainsTest.java +++ b/core/queryalgebra/geosparql/src/test/java/org/eclipse/rdf4j/query/algebra/evaluation/function/geosparql/SfContainsTest.java @@ -27,7 +27,7 @@ public class SfContainsTest extends GeometricRelationFunctionTest { /** * Test sfContains. - * + * * @throws IOException */ @Test diff --git a/core/queryalgebra/geosparql/src/test/java/org/eclipse/rdf4j/query/algebra/evaluation/function/geosparql/SfWithinTest.java b/core/queryalgebra/geosparql/src/test/java/org/eclipse/rdf4j/query/algebra/evaluation/function/geosparql/SfWithinTest.java index 6041a16d0c3..14a588514c7 100644 --- a/core/queryalgebra/geosparql/src/test/java/org/eclipse/rdf4j/query/algebra/evaluation/function/geosparql/SfWithinTest.java +++ b/core/queryalgebra/geosparql/src/test/java/org/eclipse/rdf4j/query/algebra/evaluation/function/geosparql/SfWithinTest.java @@ -27,7 +27,7 @@ public class SfWithinTest extends GeometricRelationFunctionTest { /** * Test sfWithin - * + * * @throws IOException */ @Test @@ -48,7 +48,7 @@ public void testDenverSfWithinColorado() throws IOException { /** * Test sf:within - * + * * @throws java.io.IOException */ @Test diff --git a/core/queryalgebra/model/pom.xml b/core/queryalgebra/model/pom.xml index dfb0571a6ee..1af921428ec 100644 --- a/core/queryalgebra/model/pom.xml +++ b/core/queryalgebra/model/pom.xml @@ -4,7 +4,7 @@ org.eclipse.rdf4j rdf4j-queryalgebra - 3.1.5-SNAPSHOT + 3.2.2-SNAPSHOT rdf4j-queryalgebra-model RDF4J: Query algebra - model diff --git a/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/AbstractAggregateOperator.java b/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/AbstractAggregateOperator.java index fe4f66c8983..3a092d73388 100644 --- a/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/AbstractAggregateOperator.java +++ b/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/AbstractAggregateOperator.java @@ -9,7 +9,7 @@ /** * Base class for shared functionality of aggregate operators (e.g. DISTINCT setting) - * + * * @author Jeen Broekstra */ public abstract class AbstractAggregateOperator extends UnaryValueOperator implements AggregateOperator { diff --git a/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/AbstractQueryModelNode.java b/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/AbstractQueryModelNode.java index 77d992c5954..6ad7ecad6bc 100644 --- a/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/AbstractQueryModelNode.java +++ b/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/AbstractQueryModelNode.java @@ -15,7 +15,7 @@ /** * Base implementation of {@link QueryModelNode}. */ -public abstract class AbstractQueryModelNode implements QueryModelNode, GraphPatternGroupable { +public abstract class AbstractQueryModelNode implements QueryModelNode, VariableScopeChange, GraphPatternGroupable { /*-----------* * Variables * @@ -25,7 +25,12 @@ public abstract class AbstractQueryModelNode implements QueryModelNode, GraphPat private QueryModelNode parent; - private boolean isGraphPatternGroup; + private boolean isVariableScopeChange; + + private double resultSizeEstimate = -1; + private long resultSizeActual = -1; + private double costEstimate = -1; + private long totalTimeNanosActual = -1; /*---------* * Methods * @@ -41,24 +46,26 @@ public void setParentNode(QueryModelNode parent) { this.parent = parent; } - /* - * (non-Javadoc) - * - * @see org.eclipse.rdf4j.query.algebra.GraphPatternGroupable#isGraphPatternGroup() - */ @Override + public boolean isVariableScopeChange() { + return isVariableScopeChange; + } + + @Override + public void setVariableScopeChange(boolean isVariableScopeChange) { + this.isVariableScopeChange = isVariableScopeChange; + } + + @Override + @Deprecated public boolean isGraphPatternGroup() { - return isGraphPatternGroup; + return isVariableScopeChange(); } - /* - * (non-Javadoc) - * - * @see org.eclipse.rdf4j.query.algebra.GraphPatternGroupable#setGraphPatternGroup(boolean) - */ @Override + @Deprecated public void setGraphPatternGroup(boolean isGraphPatternGroup) { - this.isGraphPatternGroup = isGraphPatternGroup; + setVariableScopeChange(isGraphPatternGroup); } /** @@ -110,7 +117,7 @@ public String toString() { public AbstractQueryModelNode clone() { try { AbstractQueryModelNode clone = (AbstractQueryModelNode) super.clone(); - clone.setGraphPatternGroup(this.isGraphPatternGroup()); + clone.setVariableScopeChange(this.isVariableScopeChange()); return clone; } catch (CloneNotSupportedException e) { throw new RuntimeException("Query model nodes are required to be cloneable", e); @@ -134,4 +141,65 @@ protected boolean replaceNodeInList(List list, Que protected boolean nullEquals(Object o1, Object o2) { return o1 == o2 || o1 != null && o1.equals(o2); } + + @Override + public double getResultSizeEstimate() { + return resultSizeEstimate; + } + + @Override + public void setResultSizeEstimate(double resultSizeEstimate) { + this.resultSizeEstimate = resultSizeEstimate; + } + + @Override + public long getResultSizeActual() { + return resultSizeActual; + } + + @Override + public void setResultSizeActual(long resultSizeActual) { + this.resultSizeActual = resultSizeActual; + } + + @Override + public double getCostEstimate() { + return costEstimate; + } + + @Override + public void setCostEstimate(double costEstimate) { + this.costEstimate = costEstimate; + } + + @Override + public long getTotalTimeNanosActual() { + return totalTimeNanosActual; + } + + @Override + public void setTotalTimeNanosActual(long totalTimeNanosActual) { + this.totalTimeNanosActual = totalTimeNanosActual; + } + + /** + * + * @return Human readable number. Eg. 12.1M for 1212213.4 and UNKNOWN for -1. + */ + static String toHumanReadbleNumber(double number) { + String humanReadbleString; + if (number == Double.POSITIVE_INFINITY) { + humanReadbleString = "∞"; + } else if (number > 1_000_000) { + humanReadbleString = Math.round(number / 100_000) / 10.0 + "M"; + } else if (number > 1_000) { + humanReadbleString = Math.round(number / 100) / 10.0 + "K"; + } else if (number >= 0) { + humanReadbleString = Math.round(number) + ""; + } else { + humanReadbleString = "UNKNOWN"; + } + + return humanReadbleString; + } } diff --git a/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/Add.java b/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/Add.java index 407b5636f26..163feec3b75 100644 --- a/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/Add.java +++ b/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/Add.java @@ -95,7 +95,7 @@ public void setSourceGraph(ValueConstant graph) { /** * The named graph from which to add. If null, the default graph should be used. - * + * * @return Returns the graph. */ public ValueConstant getSourceGraph() { @@ -126,7 +126,7 @@ public void setDestinationGraph(ValueConstant destinationGraph) { /** * The named graph to which to add. If null, the default graph should be used. - * + * * @return Returns the destinationGraph. */ public ValueConstant getDestinationGraph() { diff --git a/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/AggregateOperator.java b/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/AggregateOperator.java index 4b5ab38c927..4a876db93e2 100644 --- a/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/AggregateOperator.java +++ b/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/AggregateOperator.java @@ -9,7 +9,7 @@ /** * An operator that returns aggregates values. - * + * * @author David Huynh */ public interface AggregateOperator extends ValueExpr { diff --git a/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/Avg.java b/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/Avg.java index 35d5302665b..05d0d62066e 100644 --- a/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/Avg.java +++ b/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/Avg.java @@ -12,7 +12,7 @@ *

    * Note that we introduce AVG as a first-class object into the algebra, despite it being defined as a compound of other * operators (namely, SUM and COUNT). This allows us to more easily optimize evaluation. - * + * * @author Jeen Broekstra */ public class Avg extends AbstractAggregateOperator { diff --git a/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/BinaryTupleOperator.java b/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/BinaryTupleOperator.java index f5f1541d99a..a1a4ec88c5f 100644 --- a/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/BinaryTupleOperator.java +++ b/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/BinaryTupleOperator.java @@ -7,6 +7,11 @@ *******************************************************************************/ package org.eclipse.rdf4j.query.algebra; +import org.eclipse.rdf4j.common.annotation.Experimental; +import org.eclipse.rdf4j.common.iteration.Iteration; +import org.eclipse.rdf4j.query.BindingSet; +import org.eclipse.rdf4j.query.QueryEvaluationException; + /** * An abstract superclass for binary tuple operators which, by definition, has two arguments. */ @@ -26,6 +31,9 @@ public abstract class BinaryTupleOperator extends AbstractQueryModelNode impleme */ protected TupleExpr rightArg; + // the name of the algorithm used to combine leftArg and rightArg + private String algorithmName; + /*--------------* * Constructors * *--------------*/ @@ -35,7 +43,7 @@ protected BinaryTupleOperator() { /** * Creates a new binary tuple operator. - * + * * @param leftArg The operator's left argument, must not be null. * @param rightArg The operator's right argument, must not be null. */ @@ -50,7 +58,7 @@ protected BinaryTupleOperator(TupleExpr leftArg, TupleExpr rightArg) { /** * Gets the left argument of this binary tuple operator. - * + * * @return The operator's left argument. */ public TupleExpr getLeftArg() { @@ -59,7 +67,7 @@ public TupleExpr getLeftArg() { /** * Sets the left argument of this binary tuple operator. - * + * * @param leftArg The (new) left argument for this operator, must not be null. */ public void setLeftArg(TupleExpr leftArg) { @@ -71,7 +79,7 @@ public void setLeftArg(TupleExpr leftArg) { /** * Gets the right argument of this binary tuple operator. - * + * * @return The operator's right argument. */ public TupleExpr getRightArg() { @@ -80,7 +88,7 @@ public TupleExpr getRightArg() { /** * Sets the right argument of this binary tuple operator. - * + * * @param rightArg The (new) right argument for this operator, must not be null. */ public void setRightArg(TupleExpr rightArg) { @@ -129,4 +137,14 @@ public BinaryTupleOperator clone() { clone.setRightArg(getRightArg().clone()); return clone; } + + @Experimental + public void setAlgorithm(Iteration iteration) { + this.algorithmName = iteration.getClass().getSimpleName(); + } + + @Experimental + public String getAlgorithmName() { + return algorithmName; + } } diff --git a/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/BinaryValueOperator.java b/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/BinaryValueOperator.java index 4f8b9b8d7d1..18aea03026e 100644 --- a/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/BinaryValueOperator.java +++ b/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/BinaryValueOperator.java @@ -35,7 +35,7 @@ protected BinaryValueOperator() { /** * Creates a new binary value operator. - * + * * @param leftArg The operator's left argument, must not be null. * @param rightArg The operator's right argument, must not be null. */ @@ -50,7 +50,7 @@ protected BinaryValueOperator(ValueExpr leftArg, ValueExpr rightArg) { /** * Gets the left argument of this binary value operator. - * + * * @return The operator's left argument. */ public ValueExpr getLeftArg() { @@ -59,7 +59,7 @@ public ValueExpr getLeftArg() { /** * Sets the left argument of this binary value operator. - * + * * @param leftArg The (new) left argument for this operator, must not be null. */ public void setLeftArg(ValueExpr leftArg) { @@ -70,7 +70,7 @@ public void setLeftArg(ValueExpr leftArg) { /** * Gets the right argument of this binary value operator. - * + * * @return The operator's right argument. */ public ValueExpr getRightArg() { @@ -79,7 +79,7 @@ public ValueExpr getRightArg() { /** * Sets the right argument of this binary value operator. - * + * * @param rightArg The (new) right argument for this operator, must not be null. */ public void setRightArg(ValueExpr rightArg) { diff --git a/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/BindingSetAssignment.java b/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/BindingSetAssignment.java index a996156a2a6..d58b8a6ba9d 100644 --- a/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/BindingSetAssignment.java +++ b/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/BindingSetAssignment.java @@ -95,10 +95,6 @@ public Iterable getBindingSets() { @Override public String getSignature() { - String signature = super.getSignature(); - - signature += " (" + this.getBindingSets().toString() + ")"; - - return signature; + return super.getSignature() + " (" + this.getBindingSets().toString() + ")"; } } diff --git a/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/Bound.java b/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/Bound.java index be5ac84da01..ca2cb245e32 100644 --- a/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/Bound.java +++ b/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/Bound.java @@ -10,7 +10,7 @@ /** * The BOUND function, as defined in SPARQL Query Language * for RDF; checks if a variable is bound. - * + * * @author Arjohn Kampman */ public class Bound extends AbstractQueryModelNode implements ValueExpr { @@ -41,7 +41,7 @@ public Bound(Var arg) { /** * Gets the argument of this unary value operator. - * + * * @return The operator's argument. */ public Var getArg() { @@ -50,7 +50,7 @@ public Var getArg() { /** * Sets the argument of this unary value operator. - * + * * @param arg The (new) argument for this operator, must not be null. */ public void setArg(Var arg) { diff --git a/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/Copy.java b/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/Copy.java index 0189c571667..94809c6a39f 100644 --- a/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/Copy.java +++ b/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/Copy.java @@ -95,7 +95,7 @@ public void setSourceGraph(ValueConstant graph) { /** * The named graph from which to copy. If null, the default graph should be used. - * + * * @return Returns the graph. */ public ValueConstant getSourceGraph() { @@ -126,7 +126,7 @@ public void setDestinationGraph(ValueConstant destinationGraph) { /** * The named graph to which to copy. If null, the default graph should be used. - * + * * @return Returns the destinationGraph. */ public ValueConstant getDestinationGraph() { diff --git a/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/Datatype.java b/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/Datatype.java index b2137fa3af0..fd8fbb001a5 100644 --- a/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/Datatype.java +++ b/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/Datatype.java @@ -10,7 +10,7 @@ /** * The DATATYPE function, as defined in SPARQL Query * Language for RDF. - * + * * @author Arjohn Kampman */ public class Datatype extends UnaryValueOperator { diff --git a/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/Difference.java b/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/Difference.java index 523ced6b4ea..eb4af981110 100644 --- a/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/Difference.java +++ b/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/Difference.java @@ -24,7 +24,7 @@ public Difference() { /** * Creates a new minus operator that operates on the two specified arguments. - * + * * @param leftArg The left argument of the minus operator. * @param rightArg The right argument of the minus operator. */ diff --git a/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/Distinct.java b/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/Distinct.java index c424071180d..121049ab73a 100644 --- a/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/Distinct.java +++ b/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/Distinct.java @@ -43,4 +43,5 @@ public int hashCode() { public Distinct clone() { return (Distinct) super.clone(); } + } diff --git a/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/Extension.java b/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/Extension.java index 30d23008e00..4b5b394e4f1 100644 --- a/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/Extension.java +++ b/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/Extension.java @@ -133,4 +133,5 @@ public Extension clone() { return clone; } + } diff --git a/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/Filter.java b/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/Filter.java index 21f5610d6c3..3589afc86f8 100644 --- a/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/Filter.java +++ b/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/Filter.java @@ -15,7 +15,7 @@ * The FILTER operator, as defined in SPARQL Query * Language for RDF. The FILTER operator filters specific results from the underlying tuple expression based on a * configurable condition. - * + * * @author Arjohn Kampman */ public class Filter extends UnaryTupleOperator { @@ -104,4 +104,14 @@ public Filter clone() { clone.setCondition(getCondition().clone()); return clone; } + + @Override + public String getSignature() { + StringBuilder sb = new StringBuilder(128); + + sb.append(super.getSignature()); + + return sb.toString(); + } + } diff --git a/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/FunctionCall.java b/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/FunctionCall.java index 8a60be092ef..83610040a61 100644 --- a/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/FunctionCall.java +++ b/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/FunctionCall.java @@ -12,7 +12,7 @@ /** * A call to an (external) function that operates on zero or more arguments. - * + * * @author Arjohn Kampman */ public class FunctionCall extends AbstractQueryModelNode implements ValueExpr { @@ -37,7 +37,7 @@ public FunctionCall() { /** * Creates a new unary value operator. - * + * * @param args The operator's argument, must not be null. */ public FunctionCall(String uri, ValueExpr... args) { diff --git a/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/GraphPatternGroupable.java b/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/GraphPatternGroupable.java index f9d3f9e74aa..6dba41aa4c3 100644 --- a/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/GraphPatternGroupable.java +++ b/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/GraphPatternGroupable.java @@ -8,26 +8,27 @@ package org.eclipse.rdf4j.query.algebra; /** - * {@link QueryModelNode}s that can represent a full graph pattern group. - * - * Although the notion of a graph pattern group is strictly not relevant at the algebra level, it gives an indication to - * evaluation strategy implementations on how they can optimize join patterns wrt variable scope. - * - * @author Jeen Broekstra + * + * @author jeen + * + * @deprecated since 3.2. Use {@link VariableScopeChange} instead. */ +@Deprecated public interface GraphPatternGroupable { /** * indicates if the node represents the root of a graph pattern group. - * + * * @return true iff the node represents the node of a graph pattern group. * */ - public boolean isGraphPatternGroup(); + @Deprecated + boolean isGraphPatternGroup(); /** * Set the value of {@link #isGraphPatternGroup()} to true or false. */ - public void setGraphPatternGroup(boolean isGraphPatternGroup); + @Deprecated + void setGraphPatternGroup(boolean isGraphPatternGroup); } diff --git a/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/Group.java b/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/Group.java index 0becdc95aca..6304631ea63 100644 --- a/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/Group.java +++ b/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/Group.java @@ -19,7 +19,7 @@ /** * A tuple operator that groups tuples that have a specific set of equivalent variable bindings, and that can apply * aggregate functions on the grouped results. - * + * * @author David Huynh * @author Arjohn Kampman */ @@ -167,20 +167,21 @@ public Group clone() { @Override public String getSignature() { - StringBuilder b = new StringBuilder(); - b.append(this.getClass().getSimpleName()); - b.append(" ("); + StringBuilder sb = new StringBuilder(); + sb.append(this.getClass().getSimpleName()); + sb.append(" ("); Set bindingNames = getGroupBindingNames(); int count = 0; for (String name : bindingNames) { - b.append(name); + sb.append(name); count++; if (count < bindingNames.size()) { - b.append(", "); + sb.append(", "); } } - b.append(")"); - return b.toString(); + sb.append(")"); + + return sb.toString(); } } diff --git a/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/GroupConcat.java b/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/GroupConcat.java index 26380ad818f..81ea38f8b0c 100644 --- a/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/GroupConcat.java +++ b/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/GroupConcat.java @@ -9,7 +9,7 @@ /** * The GROUP_CONCAT operator as defined in http://www.w3.org/TR/sparql11-query/#aggregates - * + * * @author Jeen Broekstra */ public class GroupConcat extends AbstractAggregateOperator { diff --git a/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/GroupElem.java b/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/GroupElem.java index a8b9d55d658..311c15e1fa2 100644 --- a/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/GroupElem.java +++ b/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/GroupElem.java @@ -10,7 +10,7 @@ /** * A tuple operator that groups tuples that have a specific set of equivalent variable bindings, and that can apply * aggregate functions on the grouped results. - * + * * @author David Huynh * @author Arjohn Kampman */ diff --git a/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/IRIFunction.java b/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/IRIFunction.java index 6360020c37e..9ba4bd9613d 100644 --- a/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/IRIFunction.java +++ b/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/IRIFunction.java @@ -10,7 +10,7 @@ /** * The IRI function, as defined in SPARQL 1.1 Query Language * for RDF. - * + * * @author Jeen Broekstra */ public class IRIFunction extends UnaryValueOperator { diff --git a/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/If.java b/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/If.java index 59de685133f..1c9e3aa9af3 100644 --- a/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/If.java +++ b/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/If.java @@ -9,7 +9,7 @@ /** * The IF function, as defined in SPARQL 1.1 Query. - * + * * @author Jeen Broekstra */ public class If extends AbstractQueryModelNode implements ValueExpr { @@ -55,7 +55,7 @@ public If(ValueExpr condition, ValueExpr result, ValueExpr alternative) { /** * Gets the argument of this unary value operator. - * + * * @return The operator's argument. */ public ValueExpr getCondition() { @@ -64,7 +64,7 @@ public ValueExpr getCondition() { /** * Sets the condition argument of this unary value operator. - * + * * @param condition The (new) condition argument for this operator, must not be null. */ public void setCondition(ValueExpr condition) { diff --git a/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/Intersection.java b/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/Intersection.java index 1f06e07dc4c..4ec63c43ddb 100644 --- a/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/Intersection.java +++ b/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/Intersection.java @@ -24,7 +24,7 @@ public Intersection() { /** * Creates a new intersection operator that operates on the two specified arguments. - * + * * @param leftArg The left argument of the intersection operator. * @param rightArg The right argument of the intersection operator. */ diff --git a/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/IsNumeric.java b/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/IsNumeric.java index 7d74f545ae6..57554272695 100644 --- a/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/IsNumeric.java +++ b/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/IsNumeric.java @@ -9,7 +9,7 @@ /** * IsNumeric - Boolean operator determining if the supplied expression represents a numeric value. - * + * * @author Jeen */ public class IsNumeric extends UnaryValueOperator { diff --git a/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/Label.java b/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/Label.java index 49097e8a4fd..8caa1801e4c 100644 --- a/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/Label.java +++ b/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/Label.java @@ -9,7 +9,7 @@ /** * The LABEL function, which selects the label of literals. - * + * * @author Arjohn Kampman */ public class Label extends UnaryValueOperator { diff --git a/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/Lang.java b/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/Lang.java index eca83381ab9..b335c1ebe46 100644 --- a/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/Lang.java +++ b/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/Lang.java @@ -10,7 +10,7 @@ /** * The LANG function, as defined in SPARQL Query Language for * RDF. - * + * * @author Arjohn Kampman */ public class Lang extends UnaryValueOperator { diff --git a/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/LeftJoin.java b/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/LeftJoin.java index adb85187097..ddad55c66a7 100644 --- a/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/LeftJoin.java +++ b/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/LeftJoin.java @@ -13,7 +13,7 @@ /** * The LeftJoin operator, as defined in SPARQL Query * Language for RDF. - * + * * @author Arjohn Kampman */ public class LeftJoin extends BinaryTupleOperator { diff --git a/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/ListMemberOperator.java b/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/ListMemberOperator.java index 976e00292ca..ddb5c924db1 100644 --- a/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/ListMemberOperator.java +++ b/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/ListMemberOperator.java @@ -9,7 +9,7 @@ /** * ValueOperator that verifies if the first of its arguments occurs in any of the subsequent arguments. - * + * * @author Jeen Broekstra */ public class ListMemberOperator extends NAryValueOperator { diff --git a/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/LocalName.java b/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/LocalName.java index ac704060cdb..ea85865e40f 100644 --- a/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/LocalName.java +++ b/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/LocalName.java @@ -9,7 +9,7 @@ /** * The LOCAL NAME function, which selects the local name of URIs. - * + * * @author Arjohn Kampman */ public class LocalName extends UnaryValueOperator { diff --git a/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/Move.java b/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/Move.java index 12fd473d5cb..9eb1f3ed8b5 100644 --- a/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/Move.java +++ b/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/Move.java @@ -95,7 +95,7 @@ public void setSourceGraph(ValueConstant graph) { /** * The named graph from which to copy. If null, the default graph should be used. - * + * * @return Returns the graph. */ public ValueConstant getSourceGraph() { @@ -126,7 +126,7 @@ public void setDestinationGraph(ValueConstant destinationGraph) { /** * The named graph to which to copy. If null, the default graph should be used. - * + * * @return Returns the destinationGraph. */ public ValueConstant getDestinationGraph() { diff --git a/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/MultiProjection.java b/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/MultiProjection.java index 94cb67d73e3..89936731586 100644 --- a/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/MultiProjection.java +++ b/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/MultiProjection.java @@ -143,4 +143,5 @@ public MultiProjection clone() { return clone; } + } diff --git a/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/NAryValueOperator.java b/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/NAryValueOperator.java index 6b43312dd44..4d887853e6b 100644 --- a/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/NAryValueOperator.java +++ b/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/NAryValueOperator.java @@ -12,7 +12,7 @@ /** * An abstract superclass for N-ary value operators. - * + * * @author Jeen */ public abstract class NAryValueOperator extends AbstractQueryModelNode implements ValueExpr { @@ -35,7 +35,7 @@ protected NAryValueOperator() { /** * Creates a new N-Ary value operator. - * + * * @param args The operator's list of arguments, must not be null. */ protected NAryValueOperator(List args) { diff --git a/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/Namespace.java b/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/Namespace.java index a8fb9b31784..3418446bd70 100644 --- a/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/Namespace.java +++ b/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/Namespace.java @@ -9,7 +9,7 @@ /** * The NAMESPACE function, which selects the namespace of URIs. - * + * * @author Arjohn Kampman */ public class Namespace extends UnaryValueOperator { diff --git a/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/Order.java b/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/Order.java index a630c1cb04d..db19a400272 100644 --- a/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/Order.java +++ b/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/Order.java @@ -12,7 +12,7 @@ /** * An order operator that can be used to order bindings as specified by a set of value expressions. - * + * * @author Arjohn Kampman */ public class Order extends UnaryTupleOperator { @@ -120,4 +120,5 @@ public Order clone() { return clone; } + } diff --git a/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/OrderElem.java b/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/OrderElem.java index 9b4d0855ee4..ec413254c8a 100644 --- a/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/OrderElem.java +++ b/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/OrderElem.java @@ -17,7 +17,7 @@ public class OrderElem extends AbstractQueryModelNode { *-----------*/ /** - * + * */ private static final long serialVersionUID = -6573481604435459287L; diff --git a/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/Projection.java b/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/Projection.java index 4d8753c68d0..49659a91e1a 100644 --- a/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/Projection.java +++ b/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/Projection.java @@ -132,5 +132,4 @@ public boolean isSubquery() { public void setSubquery(boolean subquery) { this.subquery = subquery; } - } diff --git a/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/QueryModelNode.java b/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/QueryModelNode.java index 79f5a66bec5..2cf7ea4332c 100644 --- a/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/QueryModelNode.java +++ b/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/QueryModelNode.java @@ -9,6 +9,8 @@ import java.io.Serializable; +import org.eclipse.rdf4j.common.annotation.Experimental; + /** * Main interface for all query model nodes. */ @@ -17,72 +19,120 @@ public interface QueryModelNode extends Cloneable, Serializable { /** * Visits this node. The node reports itself to the visitor with the proper runtime type. */ - public void visit(QueryModelVisitor visitor) throws X; + void visit(QueryModelVisitor visitor) throws X; /** * Visits the children of this node. The node calls {@link #visit(QueryModelVisitor)} on all of its child nodes. */ - public void visitChildren(QueryModelVisitor visitor) throws X; + void visitChildren(QueryModelVisitor visitor) throws X; /** * Gets the node's parent. - * + * * @return The parent node, if any. */ - public QueryModelNode getParentNode(); + QueryModelNode getParentNode(); /** * Sets the node's parent. - * + * * @param parent The parent node for this node. */ - public void setParentNode(QueryModelNode parent); + void setParentNode(QueryModelNode parent); /** * Replaces one of the child nodes with a new node. - * + * * @param current The current child node. * @param replacement The new child node. * @throws IllegalArgumentException If current is not one of node's children. * @throws ClassCastException If replacement is of an incompatible type. */ - public void replaceChildNode(QueryModelNode current, QueryModelNode replacement); + void replaceChildNode(QueryModelNode current, QueryModelNode replacement); /** * Substitutes this node with a new node in the query model tree. - * + * * @param replacement The new node. * @throws IllegalStateException If this node does not have a parent node. * @throws ClassCastException If replacement is of an incompatible type. */ - public void replaceWith(QueryModelNode replacement); + void replaceWith(QueryModelNode replacement); /** * Returns true if this query model node and its children are recursively equal to o and its * children. */ @Override - public boolean equals(Object o); + boolean equals(Object o); /** * Returns an indented print of the node tree, starting from this node. */ @Override - public String toString(); + String toString(); /** * Returns the signature of this query model node. Signatures normally include the node's name and any parameters, * but not parent or child nodes. This method is used by {@link #toString()}. - * + * * @return The node's signature, e.g. SLICE (offset=10, limit=10). */ - public String getSignature(); + String getSignature(); /** * Returns a (deep) clone of this query model node. This method recursively clones the entire node tree, starting * from this nodes. - * + * * @return A deep clone of this query model node. */ - public QueryModelNode clone(); + QueryModelNode clone(); + + /** + * Returns the number of tuples that this QueryNode predicts will be outputted. For a StatementPattern this would be + * the estimated cardinality provided by the EvaluationStatistics. For a Join the would be the resulting number of + * joined tuples. + * + * @return rows + */ + @Experimental + default double getResultSizeEstimate() { + return -1; + } + + @Experimental + default void setResultSizeEstimate(double rows) { + // no-op for backwards compatibility + } + + @Experimental + default long getResultSizeActual() { + return -1; + } + + @Experimental + default void setResultSizeActual(long resultSizeActual) { + // no-op for backwards compatibility + } + + @Experimental + default double getCostEstimate() { + return -1; + } + + @Experimental + default void setCostEstimate(double costEstimate) { + // no-op for backwards compatibility + } + + @Experimental + default long getTotalTimeNanosActual() { + return -1; + } + + @Experimental + default void setTotalTimeNanosActual(long totalTime) { + // no-op + } + } diff --git a/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/QueryModelVisitor.java b/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/QueryModelVisitor.java index b969231df66..4ce22f98d8f 100644 --- a/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/QueryModelVisitor.java +++ b/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/QueryModelVisitor.java @@ -170,5 +170,23 @@ public interface QueryModelVisitor { public void meet(ZeroLengthPath node) throws X; + /** + * @implNote This temporary default method is only supplied as a stop-gap for backward compatibility. Concrete + * implementations are expected to override. + * @since 3.2.0 + */ + public default void meet(TripleRef node) throws X { + // no-op + } + + /** + * @implNote This temporary default method is only supplied as a stop-gap for backward compatibility. Concrete + * implementations are expected to override. + * @since 3.2.0 + */ + public default void meet(ValueExprTripleRef node) throws X { + // no-op + } + public void meetOther(QueryModelNode node) throws X; } diff --git a/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/QueryRoot.java b/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/QueryRoot.java index b10eabacbe4..29076f48ad2 100644 --- a/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/QueryRoot.java +++ b/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/QueryRoot.java @@ -11,7 +11,7 @@ * A semantics-less query model node that is used as the root of query model trees. This is a placeholder that * facilitates modifications to query model trees, including the replacement of the actual (semantically relevant) root * node with another root node. - * + * * @author Arjohn Kampman */ public class QueryRoot extends UnaryTupleOperator { diff --git a/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/Reduced.java b/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/Reduced.java index 1c0e9965160..abe49770c2f 100644 --- a/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/Reduced.java +++ b/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/Reduced.java @@ -43,4 +43,5 @@ public int hashCode() { public Reduced clone() { return (Reduced) super.clone(); } + } diff --git a/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/Sample.java b/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/Sample.java index f8f95291a47..18081679dc8 100644 --- a/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/Sample.java +++ b/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/Sample.java @@ -9,7 +9,7 @@ /** * The SAMPLE operator as defined in http://www.w3.org/TR/sparql11-query/#aggregates - * + * * @author Jeen Broekstra */ public class Sample extends AbstractAggregateOperator { diff --git a/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/Service.java b/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/Service.java index 906a3a9a424..723f780bca5 100644 --- a/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/Service.java +++ b/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/Service.java @@ -18,7 +18,7 @@ * The SERVICE keyword as defined in SERVICE * definition. The service expression is evaluated at the specified service URI. If the service reference is a * variable, a value for this variable must be available at evaluation time (e.g. from earlier computations). - * + * * @author Andreas Schwarte */ public class Service extends UnaryTupleOperator { @@ -103,7 +103,7 @@ public void setPrefixDeclarations(Map prefixDeclarations) { /** * The SERVICE expression, either complete or just the expression e.g. "SERVICE { ... }" becomes " ... " - * + * * @param serviceExpressionString the inner expression as SPARQL String representation */ public void setExpressionString(String serviceExpressionString) { @@ -119,7 +119,7 @@ public String getServiceExpressionString() { /** * Returns an ASK query string using no projection vars. - * + * * @return an ASK query string */ public String getAskQueryString() { @@ -129,16 +129,18 @@ public String getAskQueryString() { /** * Returns a SELECT query string using the provided projection vars. The variables are inserted into the * preparedSelectQueryString in the SELECT clause. - * + * * @param projectionVars * @return SELECT query string, utilizing the given projection variables */ public String getSelectQueryString(Set projectionVars) { - if (projectionVars.isEmpty()) + if (projectionVars.isEmpty()) { return preparedSelectQueryString.replace("%PROJECTION_VARS%", "*"); + } StringBuilder sb = new StringBuilder(); - for (String var : projectionVars) + for (String var : projectionVars) { sb.append(" ?").append(var); + } return preparedSelectQueryString.replace("%PROJECTION_VARS%", sb.toString()); } @@ -193,7 +195,7 @@ public Service clone() { /** * Compute the variable names occurring in the service expression using tree traversal, since these are necessary * for building the SPARQL query. - * + * * @return the set of variable names in the given service expression */ private Set computeServiceVars(TupleExpr serviceExpression) { @@ -255,13 +257,14 @@ private void initPreparedQueryString() { /** * Compute the prefix string only once to avoid computation overhead during evaluation. - * + * * @param prefixDeclarations * @return a Prefix String or an empty string if there are no prefixes */ private String computePrefixString(Map prefixDeclarations) { - if (prefixDeclarations == null) + if (prefixDeclarations == null) { return ""; + } StringBuilder sb = new StringBuilder(); for (String prefix : prefixDeclarations.keySet()) { @@ -274,7 +277,7 @@ private String computePrefixString(Map prefixDeclarations) { /** * Parses a service expression to just have the inner expression, e.g. from something like "SERVICE <url> { * ... }" becomes " ... ", also applies {@link String#trim()} to remove leading/tailing space - * + * * @param serviceExpression * @return the inner expression of the given service expression */ @@ -300,4 +303,5 @@ public void setBaseURI(String baseURI) { public String getBaseURI() { return baseURI; } + } diff --git a/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/Slice.java b/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/Slice.java index 4c202d3c683..c1d7ec64f91 100644 --- a/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/Slice.java +++ b/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/Slice.java @@ -11,7 +11,7 @@ * The SLICE operator, as defined in SPARQL Query * Language for RDF. The SLICE operator selects specific results from the underlying tuple expression based on an * offset and limit value (both optional). - * + * * @author Arjohn Kampman */ public class Slice extends UnaryTupleOperator { @@ -56,7 +56,7 @@ public void setOffset(long offset) { /** * Checks whether the row selection has a (valid) offset. - * + * * @return true when offset > 0 */ public boolean hasOffset() { @@ -73,7 +73,7 @@ public void setLimit(long limit) { /** * Checks whether the row selection has a (valid) limit. - * + * * @return true when offset >= 0 */ public boolean hasLimit() { @@ -90,7 +90,7 @@ public String getSignature() { StringBuilder sb = new StringBuilder(256); sb.append(super.getSignature()); - sb.append(" ( "); + sb.append(" ("); if (hasLimit()) { sb.append("limit=").append(getLimit()); @@ -99,7 +99,7 @@ public String getSignature() { sb.append("offset=").append(getOffset()); } - sb.append(" )"); + sb.append(")"); return sb.toString(); } diff --git a/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/StatementPattern.java b/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/StatementPattern.java index b14f79f627f..b667ef8fc44 100644 --- a/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/StatementPattern.java +++ b/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/StatementPattern.java @@ -289,6 +289,7 @@ public StatementPattern clone() { clone.setSubjectVar(getSubjectVar().clone()); clone.setPredicateVar(getPredicateVar().clone()); clone.setObjectVar(getObjectVar().clone()); + clone.setResultSizeEstimate(getResultSizeEstimate()); if (getContextVar() != null) { clone.setContextVar(getContextVar().clone()); @@ -296,4 +297,5 @@ public StatementPattern clone() { return clone; } + } diff --git a/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/Str.java b/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/Str.java index a104d11bd44..5cc665dfee4 100644 --- a/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/Str.java +++ b/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/Str.java @@ -10,7 +10,7 @@ /** * The STR function, as defined in SPARQL Query Language for * RDF; returns the label of literals or the string representation of URIs. - * + * * @author Arjohn Kampman */ public class Str extends UnaryValueOperator { diff --git a/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/Sum.java b/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/Sum.java index 1e86c9c73b7..5619f9cafd7 100644 --- a/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/Sum.java +++ b/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/Sum.java @@ -9,7 +9,7 @@ /** * The SUM operator as defined in http://www.w3.org/TR/sparql11-query/#aggregates - * + * * @author Jeen Broekstra */ public class Sum extends AbstractAggregateOperator { diff --git a/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/TripleRef.java b/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/TripleRef.java new file mode 100644 index 00000000000..71f159a70e3 --- /dev/null +++ b/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/TripleRef.java @@ -0,0 +1,198 @@ +/******************************************************************************* + * Copyright (c) 2020 Eclipse RDF4J contributors. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Distribution License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ +package org.eclipse.rdf4j.query.algebra; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +/** Triple lookup reference. Allow retrieval of RDF* triples **/ +public class TripleRef extends AbstractQueryModelNode implements TupleExpr { + + private org.eclipse.rdf4j.query.algebra.Var exprVar; + private org.eclipse.rdf4j.query.algebra.Var subjectVar; + private org.eclipse.rdf4j.query.algebra.Var predicateVar; + private org.eclipse.rdf4j.query.algebra.Var objectVar; + + public org.eclipse.rdf4j.query.algebra.Var getSubjectVar() { + return subjectVar; + } + + public void setSubjectVar(org.eclipse.rdf4j.query.algebra.Var subject) { + assert subject != null : "subject must not be null"; + subject.setParentNode(this); + subjectVar = subject; + } + + public org.eclipse.rdf4j.query.algebra.Var getPredicateVar() { + return predicateVar; + } + + public void setPredicateVar(org.eclipse.rdf4j.query.algebra.Var predicate) { + assert predicate != null : "predicate must not be null"; + predicate.setParentNode(this); + predicateVar = predicate; + } + + public org.eclipse.rdf4j.query.algebra.Var getObjectVar() { + return objectVar; + } + + public void setObjectVar(org.eclipse.rdf4j.query.algebra.Var object) { + assert object != null : "object must not be null"; + object.setParentNode(this); + objectVar = object; + } + + /** + * Returns the context variable, if available. + */ + public org.eclipse.rdf4j.query.algebra.Var getExprVar() { + return exprVar; + } + + public void setExprVar(org.eclipse.rdf4j.query.algebra.Var context) { + if (context != null) { + context.setParentNode(this); + } + exprVar = context; + } + + @Override + public Set getBindingNames() { + return getAssuredBindingNames(); + } + + @Override + public Set getAssuredBindingNames() { + Set bindingNames = new HashSet<>(8); + + if (subjectVar != null) { + bindingNames.add(subjectVar.getName()); + } + if (predicateVar != null) { + bindingNames.add(predicateVar.getName()); + } + if (objectVar != null) { + bindingNames.add(objectVar.getName()); + } + if (exprVar != null) { + bindingNames.add(exprVar.getName()); + } + + return bindingNames; + } + + public List getVarList() { + return getVars(new ArrayList<>(4)); + } + + /** + * Adds the variables of this statement pattern to the supplied collection. + */ + public > L getVars(L varCollection) { + if (subjectVar != null) { + varCollection.add(subjectVar); + } + if (predicateVar != null) { + varCollection.add(predicateVar); + } + if (objectVar != null) { + varCollection.add(objectVar); + } + if (exprVar != null) { + varCollection.add(exprVar); + } + + return varCollection; + } + + @Override + public void visit(QueryModelVisitor visitor) throws X { + visitor.meet(this); + } + + @Override + public void visitChildren(QueryModelVisitor visitor) throws X { + if (subjectVar != null) { + subjectVar.visit(visitor); + } + if (predicateVar != null) { + predicateVar.visit(visitor); + } + if (objectVar != null) { + objectVar.visit(visitor); + } + if (exprVar != null) { + exprVar.visit(visitor); + } + + super.visitChildren(visitor); + } + + @Override + public void replaceChildNode(QueryModelNode current, QueryModelNode replacement) { + if (subjectVar == current) { + setSubjectVar((org.eclipse.rdf4j.query.algebra.Var) replacement); + } else if (predicateVar == current) { + setPredicateVar((org.eclipse.rdf4j.query.algebra.Var) replacement); + } else if (objectVar == current) { + setObjectVar((org.eclipse.rdf4j.query.algebra.Var) replacement); + } else if (exprVar == current) { + setExprVar((org.eclipse.rdf4j.query.algebra.Var) replacement); + } else { + super.replaceChildNode(current, replacement); + } + } + + @Override + public String getSignature() { + StringBuilder sb = new StringBuilder(128); + + sb.append(super.getSignature()); + + return sb.toString(); + } + + @Override + public boolean equals(Object other) { + if (other instanceof TripleRef) { + TripleRef o = (TripleRef) other; + return subjectVar.equals(o.getSubjectVar()) && predicateVar.equals(o.getPredicateVar()) + && objectVar.equals(o.getObjectVar()); + } + return false; + } + + @Override + public int hashCode() { + int result = subjectVar.hashCode(); + result ^= predicateVar.hashCode(); + result ^= objectVar.hashCode(); + if (exprVar != null) { + result ^= exprVar.hashCode(); + } + return result; + } + + @Override + public TripleRef clone() { + TripleRef clone = (TripleRef) super.clone(); + clone.setSubjectVar(getSubjectVar().clone()); + clone.setPredicateVar(getPredicateVar().clone()); + clone.setObjectVar(getObjectVar().clone()); + + if (getExprVar() != null) { + clone.setExprVar(getExprVar().clone()); + } + + return clone; + } +} diff --git a/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/TupleExpr.java b/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/TupleExpr.java index 71d928d5243..7d1bebd7c1e 100644 --- a/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/TupleExpr.java +++ b/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/TupleExpr.java @@ -16,7 +16,7 @@ public interface TupleExpr extends QueryModelNode { /** * Gets the names of the bindings that are, or can be, returned by this tuple expression when it is evaluated. - * + * * @return A set of binding names. */ public Set getBindingNames(); @@ -24,7 +24,7 @@ public interface TupleExpr extends QueryModelNode { /** * Gets the names of the bindings that are guaranteed to be present in the results produced by this tuple * expression. - * + * * @return A set of binding names. */ public Set getAssuredBindingNames(); diff --git a/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/UnaryTupleOperator.java b/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/UnaryTupleOperator.java index af931b97199..237c079064e 100644 --- a/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/UnaryTupleOperator.java +++ b/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/UnaryTupleOperator.java @@ -32,7 +32,7 @@ protected UnaryTupleOperator() { /** * Creates a new unary tuple operator. - * + * * @param arg The operator's argument, must not be null. */ protected UnaryTupleOperator(TupleExpr arg) { @@ -45,7 +45,7 @@ protected UnaryTupleOperator(TupleExpr arg) { /** * Gets the argument of this unary tuple operator. - * + * * @return The operator's argument. */ public TupleExpr getArg() { @@ -54,7 +54,7 @@ public TupleExpr getArg() { /** * Sets the argument of this unary tuple operator. - * + * * @param arg The (new) argument for this operator, must not be null. */ public void setArg(TupleExpr arg) { @@ -109,4 +109,5 @@ public UnaryTupleOperator clone() { clone.setArg(getArg().clone()); return clone; } + } diff --git a/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/UnaryValueOperator.java b/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/UnaryValueOperator.java index 66b9aefbf3d..1cf9d8eb66c 100644 --- a/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/UnaryValueOperator.java +++ b/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/UnaryValueOperator.java @@ -33,7 +33,7 @@ protected UnaryValueOperator() { /** * Creates a new unary value operator. - * + * * @param arg The operator's argument, must not be null. */ protected UnaryValueOperator(ValueExpr arg) { @@ -46,7 +46,7 @@ protected UnaryValueOperator(ValueExpr arg) { /** * Gets the argument of this unary value operator. - * + * * @return The operator's argument. */ public ValueExpr getArg() { @@ -55,7 +55,7 @@ public ValueExpr getArg() { /** * Sets the argument of this unary value operator. - * + * * @param arg The (new) argument for this operator, must not be null. */ public void setArg(ValueExpr arg) { diff --git a/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/Union.java b/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/Union.java index 9e45ac5462e..837ba4c5111 100644 --- a/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/Union.java +++ b/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/Union.java @@ -24,7 +24,7 @@ public Union() { /** * Creates a new union operator that operates on the two specified arguments. - * + * * @param leftArg The left argument of the union operator. * @param rightArg The right argument of the union operator. */ diff --git a/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/ValueExprTripleRef.java b/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/ValueExprTripleRef.java new file mode 100644 index 00000000000..e9d9d561ad3 --- /dev/null +++ b/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/ValueExprTripleRef.java @@ -0,0 +1,87 @@ +/******************************************************************************* + * Copyright (c) 2020 Eclipse RDF4J contributors. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Distribution License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ +package org.eclipse.rdf4j.query.algebra; + +// reference to a Triple +public class ValueExprTripleRef extends AbstractQueryModelNode implements ValueExpr { + + private String exprVarName; + private org.eclipse.rdf4j.query.algebra.Var subjectVar; + private org.eclipse.rdf4j.query.algebra.Var predicateVar; + private org.eclipse.rdf4j.query.algebra.Var objectVar; + + public ValueExprTripleRef(String extName, + org.eclipse.rdf4j.query.algebra.Var s, + org.eclipse.rdf4j.query.algebra.Var p, + org.eclipse.rdf4j.query.algebra.Var o) { + this.exprVarName = extName; + subjectVar = s; + predicateVar = p; + objectVar = o; + } + + public String getExtVarName() { + return exprVarName; + } + + public org.eclipse.rdf4j.query.algebra.Var getSubjectVar() { + return subjectVar; + } + + public org.eclipse.rdf4j.query.algebra.Var getPredicateVar() { + return predicateVar; + } + + public org.eclipse.rdf4j.query.algebra.Var getObjectVar() { + return objectVar; + } + + @Override + public void visitChildren(QueryModelVisitor visitor) throws X { + if (subjectVar != null) { + subjectVar.visit(visitor); + } + if (predicateVar != null) { + predicateVar.visit(visitor); + } + if (objectVar != null) { + objectVar.visit(visitor); + } + super.visitChildren(visitor); + } + + @Override + public boolean equals(Object other) { + if (other instanceof ValueExprTripleRef) { + ValueExprTripleRef o = (ValueExprTripleRef) other; + return subjectVar.equals(o.getSubjectVar()) && predicateVar.equals(o.getPredicateVar()) + && objectVar.equals(o.getObjectVar()); + } + return false; + } + + @Override + public int hashCode() { + int result = subjectVar.hashCode(); + result ^= predicateVar.hashCode(); + result ^= objectVar.hashCode(); + return result; + } + + @Override + public ValueExprTripleRef clone() { + return new ValueExprTripleRef(exprVarName, subjectVar.clone(), predicateVar.clone(), objectVar.clone()); + } + + @Override + public void visit(QueryModelVisitor visitor) throws X { + visitor.meetOther(this); + // visitChildren(visitor); + } + +} diff --git a/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/VariableScopeChange.java b/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/VariableScopeChange.java new file mode 100644 index 00000000000..d30ecfc64a7 --- /dev/null +++ b/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/VariableScopeChange.java @@ -0,0 +1,30 @@ +/******************************************************************************* + * Copyright (c) 2019 Eclipse RDF4J contributors. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Distribution License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ +package org.eclipse.rdf4j.query.algebra; + +/** + * {@link QueryModelNode}s that can constitute a variable scope change (such as group graph patterns, subselects, etc). + * + * @author Jeen Broekstra + */ +public interface VariableScopeChange { + + /** + * indicates if the node represents a variable scope change. + * + * @return true iff the node represents a variable scope change. + * + */ + public boolean isVariableScopeChange(); + + /** + * Set the value of {@link #isVariableScopeChange()} to true or false. + */ + public void setVariableScopeChange(boolean isVariableScopeChange); + +} diff --git a/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/federation/AbstractFederatedServiceResolver.java b/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/federation/AbstractFederatedServiceResolver.java index 15c5061bff3..6ccd5e02fcf 100644 --- a/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/federation/AbstractFederatedServiceResolver.java +++ b/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/federation/AbstractFederatedServiceResolver.java @@ -17,7 +17,7 @@ * {@link FederatedService}s. *

    * Specific implementation can implement {@link #createService(String)}. - * + * * @author Andreas Schwarte */ public abstract class AbstractFederatedServiceResolver implements FederatedServiceResolver { @@ -29,7 +29,7 @@ public abstract class AbstractFederatedServiceResolver implements FederatedServi /** * Register the specified service to evaluate SERVICE expressions for the given url. - * + * * @param serviceUrl * @param service */ @@ -41,7 +41,7 @@ public void registerService(String serviceUrl, FederatedService service) { /** * Unregister a service registered to serviceURl - * + * * @param serviceUrl */ public void unregisterService(String serviceUrl) { @@ -61,7 +61,7 @@ public void unregisterService(String serviceUrl) { /** * Retrieve the {@link FederatedService} registered for serviceUrl. If there is no service registered for * serviceUrl, a new {@link FederatedService} is created and registered. - * + * * @param serviceUrl locator for the federation service * @return the {@link FederatedService}, created fresh if necessary * @throws RepositoryException @@ -84,7 +84,7 @@ public FederatedService getService(String serviceUrl) throws QueryEvaluationExce /** * Verify if a registered {@link FederatedService} exists for the given serviceUrul. - * + * * @param serviceUrl locator for the federation service. * @return {@code true} iff the FederatedService has been registered, {@code false} otherwise. */ @@ -97,7 +97,7 @@ public boolean hasService(String serviceUrl) { /** * Create a new {@link FederatedService} for the given serviceUrl. This method is invoked, if no * {@link FederatedService} has been created yet for the serviceUrl. - * + * * @param serviceUrl the service IRI * @return a non-null {@link FederatedService} * @throws QueryEvaluationException diff --git a/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/federation/FederatedService.java b/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/federation/FederatedService.java index efbb6cbef0a..461fe2c2d57 100644 --- a/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/federation/FederatedService.java +++ b/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/federation/FederatedService.java @@ -17,7 +17,7 @@ /** * FederatedService to allow for customized evaluation of SERVICE expression. By default * {@link org.eclipse.rdf4j.query.algebra.evaluation.federation.SPARQLFederatedService} is used. - * + * * @author Andreas Schwarte * @author James Leigh * @see org.eclipse.rdf4j.query.algebra.evaluation.federation.SPARQLFederatedService @@ -28,11 +28,11 @@ public interface FederatedService { *

    * Evaluate the provided SPARQL ASK query at this federated service. *

    - * + * *
     	 * Expected behavior: evaluate boolean query using the bindings as constraints
     	 * 
    - * + * * @param service the reference to the service node, contains additional meta information (vars, prefixes) * @param bindings the bindings serving as additional constraints * @param baseUri @@ -48,11 +48,11 @@ public interface FederatedService { *

    * Important: The original bindings need to be inserted into the result. *

    - * + * *
     	 * Expected behavior: evaluate the given SPARQL query using the bindings as constraints
     	 * 
    - * + * * @param service the reference to the service node, contains additional meta information (vars, prefixes) * @param projectionVars The variables with unknown value that should be projected from this evaluation * @param bindings the bindings serving as additional constraints @@ -75,7 +75,7 @@ public CloseableIteration select(Service s * Compare {@link org.eclipse.rdf4j.query.algebra.evaluation.federation.SPARQLFederatedService} for a reference * implementation *

    - * + * * @param service the reference to the service node, contains information to construct the query * @param bindings the bindings serving as additional constraints (for vectored evaluation) * @param baseUri the baseUri @@ -94,14 +94,14 @@ public CloseableIteration evaluate(Service /** * Method to perform any initializations, invoked after construction. - * + * * @throws QueryEvaluationException If there was an exception generated while initializing the service. */ public void initialize() throws QueryEvaluationException; /** * Method to perform any shutDown code, invoked at unregistering. - * + * * @throws QueryEvaluationException If there was an exception generated while shutting down the service. */ public void shutdown() throws QueryEvaluationException; diff --git a/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/federation/FederatedServiceResolver.java b/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/federation/FederatedServiceResolver.java index 37646e98dc6..4f10dafc6a4 100644 --- a/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/federation/FederatedServiceResolver.java +++ b/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/federation/FederatedServiceResolver.java @@ -14,7 +14,7 @@ * evaluate SERVICE expressions for particular service Urls. *

    * Lookup can be done via the serviceUrl using the method {@link #getService(String)}. - * + * * @author Andreas Schwarte * @author James Leigh */ @@ -24,7 +24,7 @@ public interface FederatedServiceResolver { * Retrieve the {@link org.eclipse.rdf4j.query.algebra.evaluation.federation.FederatedService} registered for * serviceUrl. If there is no service registered for serviceUrl, a new * {@link org.eclipse.rdf4j.query.algebra.evaluation.federation.SPARQLFederatedService} is created and registered. - * + * * @param serviceUrl locator for the federation service * @return the {@link org.eclipse.rdf4j.query.algebra.evaluation.federation.FederatedService}, created fresh if * necessary diff --git a/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/federation/FederatedServiceResolverClient.java b/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/federation/FederatedServiceResolverClient.java index 0e3340ee4a8..c579f4ba1d3 100644 --- a/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/federation/FederatedServiceResolverClient.java +++ b/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/federation/FederatedServiceResolverClient.java @@ -10,14 +10,14 @@ /** * Interface used by {@link org.eclipse.rdf4j.sail.config.SailFactory} and * {@link org.eclipse.rdf4j.repository.config.RepositoryFactory} that can make external SERVICE calls. - * + * * @author James Leigh */ public interface FederatedServiceResolverClient { /** * Sets the {@link FederatedServiceResolver} to use for this client. - * + * * @param resolver The resolver to use. */ void setFederatedServiceResolver(FederatedServiceResolver resolver); diff --git a/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/helpers/AbstractQueryModelVisitor.java b/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/helpers/AbstractQueryModelVisitor.java index ca89ac8c7a6..6b518fcb34c 100644 --- a/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/helpers/AbstractQueryModelVisitor.java +++ b/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/helpers/AbstractQueryModelVisitor.java @@ -87,11 +87,13 @@ import org.eclipse.rdf4j.query.algebra.Str; import org.eclipse.rdf4j.query.algebra.SubQueryValueOperator; import org.eclipse.rdf4j.query.algebra.Sum; +import org.eclipse.rdf4j.query.algebra.TripleRef; import org.eclipse.rdf4j.query.algebra.UnaryTupleOperator; import org.eclipse.rdf4j.query.algebra.UnaryValueOperator; import org.eclipse.rdf4j.query.algebra.Union; import org.eclipse.rdf4j.query.algebra.UpdateExpr; import org.eclipse.rdf4j.query.algebra.ValueConstant; +import org.eclipse.rdf4j.query.algebra.ValueExprTripleRef; import org.eclipse.rdf4j.query.algebra.Var; import org.eclipse.rdf4j.query.algebra.ZeroLengthPath; @@ -488,6 +490,16 @@ public void meet(ZeroLengthPath node) throws X { meetNode(node); } + @Override + public void meet(TripleRef node) throws X { + meetNode(node); + } + + @Override + public void meet(ValueExprTripleRef node) throws X { + meetNode(node); + } + @Override public void meetOther(QueryModelNode node) throws X { if (node instanceof UnaryTupleOperator) { @@ -512,7 +524,7 @@ public void meetOther(QueryModelNode node) throws X { /** * Method called by all meet methods with a {@link BinaryTupleOperator} node as argument. Forwards the call * to {@link #meetNode} by default. - * + * * @param node The node that is being visited. */ protected void meetBinaryTupleOperator(BinaryTupleOperator node) throws X { @@ -522,7 +534,7 @@ protected void meetBinaryTupleOperator(BinaryTupleOperator node) throws X { /** * Method called by all meet methods with a {@link BinaryValueOperator} node as argument. Forwards the call * to {@link #meetNode} by default. - * + * * @param node The node that is being visited. */ protected void meetBinaryValueOperator(BinaryValueOperator node) throws X { @@ -532,7 +544,7 @@ protected void meetBinaryValueOperator(BinaryValueOperator node) throws X { /** * Method called by all meet methods with a {@link CompareSubQueryValueOperator} node as argument. Forwards * the call to {@link #meetSubQueryValueOperator} by default. - * + * * @param node The node that is being visited. */ protected void meetCompareSubQueryValueOperator(CompareSubQueryValueOperator node) throws X { @@ -542,7 +554,7 @@ protected void meetCompareSubQueryValueOperator(CompareSubQueryValueOperator nod /** * Method called by all meet methods with a {@link org.eclipse.rdf4j.query.algebra.NAryValueOperator} node * as argument. Forwards the call to {@link #meetNode} by default. - * + * * @param node The node that is being visited. */ protected void meetNAryValueOperator(NAryValueOperator node) throws X { @@ -553,7 +565,7 @@ protected void meetNAryValueOperator(NAryValueOperator node) throws X { * Method called by all of the other meet methods that are not overridden in subclasses. This method can be * overridden in subclasses to define default behaviour when visiting nodes. The default behaviour of this method is * to visit the node's children. - * + * * @param node The node that is being visited. */ protected void meetNode(QueryModelNode node) throws X { @@ -563,7 +575,7 @@ protected void meetNode(QueryModelNode node) throws X { /** * Method called by all meet methods with a {@link SubQueryValueOperator} node as argument. Forwards the * call to {@link #meetNode} by default. - * + * * @param node The node that is being visited. */ protected void meetSubQueryValueOperator(SubQueryValueOperator node) throws X { @@ -573,7 +585,7 @@ protected void meetSubQueryValueOperator(SubQueryValueOperator node) throws X { /** * Method called by all meet methods with a {@link UnaryTupleOperator} node as argument. Forwards the call * to {@link #meetNode} by default. - * + * * @param node The node that is being visited. */ protected void meetUnaryTupleOperator(UnaryTupleOperator node) throws X { @@ -583,7 +595,7 @@ protected void meetUnaryTupleOperator(UnaryTupleOperator node) throws X { /** * Method called by all meet methods with a {@link UnaryValueOperator} node as argument. Forwards the call * to {@link #meetNode} by default. - * + * * @param node The node that is being visited. */ protected void meetUnaryValueOperator(UnaryValueOperator node) throws X { @@ -593,7 +605,7 @@ protected void meetUnaryValueOperator(UnaryValueOperator node) throws X { /** * Method called by all meet methods with a {@link UpdateExpr} node as argument. Forwards the call to * {@link #meetNode} by default. - * + * * @param node The node that is being visited. */ protected void meetUpdateExpr(UpdateExpr node) throws X { diff --git a/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/helpers/QueryModelTreePrinter.java b/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/helpers/QueryModelTreePrinter.java index b252205a8ef..2ebd39380c0 100644 --- a/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/helpers/QueryModelTreePrinter.java +++ b/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/helpers/QueryModelTreePrinter.java @@ -7,7 +7,11 @@ *******************************************************************************/ package org.eclipse.rdf4j.query.algebra.helpers; +import java.util.stream.Stream; + +import org.eclipse.rdf4j.query.algebra.BinaryTupleOperator; import org.eclipse.rdf4j.query.algebra.QueryModelNode; +import org.eclipse.rdf4j.query.algebra.VariableScopeChange; /** * QueryModelVisitor implementation that "prints" a tree representation of a query model. The tree representations is @@ -36,9 +40,9 @@ public static String printTree(QueryModelNode node) { * Variables * *-----------*/ - private String indentString = " "; + private final String indentString = " "; - private StringBuilder buf; + private final StringBuilder sb; private int indentLevel = 0; @@ -47,7 +51,7 @@ public static String printTree(QueryModelNode node) { *--------------*/ public QueryModelTreePrinter() { - buf = new StringBuilder(256); + sb = new StringBuilder(256); } /*---------* @@ -55,17 +59,32 @@ public QueryModelTreePrinter() { *---------*/ public String getTreeString() { - return buf.toString(); + return sb.toString(); } @Override protected void meetNode(QueryModelNode node) { for (int i = 0; i < indentLevel; i++) { - buf.append(indentString); + sb.append(indentString); } - buf.append(node.getSignature()); - buf.append(LINE_SEPARATOR); + sb.append(node.getSignature()); + + if (node instanceof VariableScopeChange) { + if (((VariableScopeChange) node).isVariableScopeChange()) { + sb.append(" (new scope)"); + } + } + + if (node instanceof BinaryTupleOperator) { + String algorithmName = ((BinaryTupleOperator) node).getAlgorithmName(); + if (algorithmName != null) { + sb.append(" (").append(algorithmName).append(")"); + } + } + + appendCostAnnotation(node, sb); + sb.append(LINE_SEPARATOR); indentLevel++; @@ -73,4 +92,63 @@ protected void meetNode(QueryModelNode node) { indentLevel--; } + + /** + * + * @return Human readable number. Eg. 12.1M for 1212213.4 and UNKNOWN for -1. + */ + static String toHumanReadableNumber(double number) { + String humanReadbleString; + if (number == Double.POSITIVE_INFINITY) { + humanReadbleString = "∞"; + } else if (number > 1_000_000) { + humanReadbleString = Math.round(number / 100_000) / 10.0 + "M"; + } else if (number > 1_000) { + humanReadbleString = Math.round(number / 100) / 10.0 + "K"; + } else if (number >= 0) { + humanReadbleString = Math.round(number) + ""; + } else { + humanReadbleString = "UNKNOWN"; + } + + return humanReadbleString; + } + + /** + * + * @return Human readable time. + */ + static String toHumanReadableTime(long nanos) { + String humanReadbleString; + + if (nanos > 1_000_000_000) { + humanReadbleString = nanos / 100_000_000 / 10.0 + "s"; + } else if (nanos > 1_000_000) { + humanReadbleString = nanos / 100_000 / 10.0 + "ms"; + } else if (nanos >= 1000) { + humanReadbleString = nanos / 1000 / 1000.0 + "ms"; + } else if (nanos >= 0) { + humanReadbleString = nanos + "ns"; + } else { + humanReadbleString = "UNKNOWN"; + } + + return humanReadbleString; + } + + private static void appendCostAnnotation(QueryModelNode node, StringBuilder sb) { + String costs = Stream.of( + "costEstimate=" + toHumanReadableNumber(node.getCostEstimate()), + "resultSizeEstimate=" + toHumanReadableNumber(node.getResultSizeEstimate()), + "resultSizeActual=" + toHumanReadableNumber(node.getResultSizeActual()), + "totalTimeActual=" + toHumanReadableTime(node.getTotalTimeNanosActual())) + .filter(s -> !s.endsWith("UNKNOWN")) + .reduce((a, b) -> a + ", " + b) + .orElse(""); + + if (!costs.isEmpty()) { + sb.append(" (").append(costs).append(")"); + } + } + } diff --git a/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/helpers/QueryModelTreeToGenericPlanNode.java b/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/helpers/QueryModelTreeToGenericPlanNode.java new file mode 100644 index 00000000000..085d18d1d23 --- /dev/null +++ b/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/helpers/QueryModelTreeToGenericPlanNode.java @@ -0,0 +1,74 @@ +/******************************************************************************* + * Copyright (c) 2020 Eclipse RDF4J contributors. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Distribution License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ +package org.eclipse.rdf4j.query.algebra.helpers; + +import java.util.ArrayDeque; + +import org.eclipse.rdf4j.common.annotation.Experimental; +import org.eclipse.rdf4j.common.annotation.InternalUseOnly; +import org.eclipse.rdf4j.query.algebra.BinaryTupleOperator; +import org.eclipse.rdf4j.query.algebra.QueryModelNode; +import org.eclipse.rdf4j.query.algebra.VariableScopeChange; +import org.eclipse.rdf4j.query.explanation.GenericPlanNode; + +/** + * Convert TupleExpr (QueryModelNode) to GenericPlanNode for the Query.explain(...) feature. + */ +@Experimental +@InternalUseOnly +public class QueryModelTreeToGenericPlanNode extends AbstractQueryModelVisitor { + + GenericPlanNode top = null; + QueryModelNode topTupleExpr; + ArrayDeque deque = new ArrayDeque<>(); + + public QueryModelTreeToGenericPlanNode(QueryModelNode topTupleExpr) { + this.topTupleExpr = topTupleExpr; + } + + public GenericPlanNode getGenericPlanNode() { + return top; + } + + // node.getParentNode() is not reliable because nodes are reused and parent is not maintained! This is why we use a + // queue to maintain the effective parent stack. + @Override + protected void meetNode(QueryModelNode node) { + GenericPlanNode genericPlanNode = new GenericPlanNode(node.getSignature()); + genericPlanNode.setCostEstimate(node.getCostEstimate()); + genericPlanNode.setResultSizeEstimate(node.getResultSizeEstimate()); + genericPlanNode.setResultSizeActual(node.getResultSizeActual()); + if (node instanceof VariableScopeChange) { + boolean newScope = ((VariableScopeChange) node).isVariableScopeChange(); + genericPlanNode.setNewScope(newScope); + } + + if (node instanceof BinaryTupleOperator) { + String algorithmName = ((BinaryTupleOperator) node).getAlgorithmName(); + genericPlanNode.setAlgorithm(algorithmName); + } + + // convert from nanoseconds to milliseconds + genericPlanNode.setTotalTimeActual(node.getTotalTimeNanosActual() / 1_000_000.0); + + if (node == topTupleExpr) { + top = genericPlanNode; + } + + if (!deque.isEmpty()) { + GenericPlanNode genericParentNode = deque.getLast(); + genericParentNode.addPlans(genericPlanNode); + } + + deque.addLast(genericPlanNode); + super.meetNode(node); + deque.removeLast(); + + } + +} diff --git a/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/helpers/TupleExprs.java b/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/helpers/TupleExprs.java index 202db6a7e96..3d350713ee1 100644 --- a/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/helpers/TupleExprs.java +++ b/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/helpers/TupleExprs.java @@ -24,10 +24,11 @@ import org.eclipse.rdf4j.query.algebra.QueryModelNode; import org.eclipse.rdf4j.query.algebra.TupleExpr; import org.eclipse.rdf4j.query.algebra.Var; +import org.eclipse.rdf4j.query.algebra.VariableScopeChange; /** * Utility methods for {@link TupleExpr} objects. - * + * * @author Jeen Broekstra */ public class TupleExprs { @@ -59,13 +60,30 @@ public static boolean containsSubquery(TupleExpr t) { return false; } + /** + * Verifies if the supplied {@link TupleExpr} represents a variable scope change. + * + * @param expr a {@link TupleExpr} + * @return true if the {@link TupleExpr} implements {@link VariableScopeChange} and has its scope + * change flag set to true, false otherwise. + */ + public static boolean isVariableScopeChange(TupleExpr expr) { + if (expr instanceof VariableScopeChange) { + return ((VariableScopeChange) expr).isVariableScopeChange(); + } + return false; + } + /** * Verifies if the supplied {@link TupleExpr} represents a group graph pattern. - * + * * @param expr a {@link TupleExpr} * @return true if the {@link TupleExpr} is {@link GraphPatternGroupable} and has its graph pattern * group flag set to true, false otherwise. + * + * @deprecated since 3.2. Use {@link #isVariableScopeChange(TupleExpr)} instead. */ + @Deprecated public static boolean isGraphPatternGroup(TupleExpr expr) { if (expr instanceof GraphPatternGroupable) { return ((GraphPatternGroupable) expr).isGraphPatternGroup(); @@ -76,7 +94,7 @@ public static boolean isGraphPatternGroup(TupleExpr expr) { /** * Verifies if the supplied {@link TupleExpr} contains a {@link Projection}. If the supplied TupleExpr is a * {@link Join} or contains a {@link Join}, projections inside that Join's arguments will not be taken into account. - * + * * @param t a tuple expression. * @return true if the TupleExpr contains a projection (outside of a Join), false * otherwise. @@ -103,7 +121,7 @@ public static boolean containsProjection(TupleExpr t) { /** * Returns {@link TupleExpr} children of the given node. - * + * * @param t a tuple expression. * @return a list of TupleExpr children. */ @@ -124,7 +142,7 @@ public void meetNode(QueryModelNode node) { /** * Creates an (anonymous) Var representing a constant value. The variable name will be derived from the actual value * to guarantee uniqueness. - * + * * @param value * @return an (anonymous) Var representing a constant value. */ @@ -168,7 +186,7 @@ public static String getConstVarName(Value value) { /** * Verifies if the supplied expression is a FILTER (NOT) EXISTS operation - * + * * @param expr a tuple expression * @return true if the supplied expression is a FILTER (NOT) EXISTS operation, false otherwise. */ diff --git a/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/package-info.java b/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/package-info.java index e4ad63dc162..602e6f45671 100644 --- a/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/package-info.java +++ b/core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/package-info.java @@ -1,6 +1,6 @@ /** * Abstract Query Algebra model. - * + * * The root of the query algebra hierarchy is {@link org.eclipse.rdf4j.query.algebra.QueryModelNode}. */ -package org.eclipse.rdf4j.query.algebra; \ No newline at end of file +package org.eclipse.rdf4j.query.algebra; diff --git a/core/queryalgebra/model/src/test/java/org/eclipse/rdf4j/query/algebra/AbstractQueryModelNodeTest.java b/core/queryalgebra/model/src/test/java/org/eclipse/rdf4j/query/algebra/AbstractQueryModelNodeTest.java new file mode 100644 index 00000000000..591d05d7512 --- /dev/null +++ b/core/queryalgebra/model/src/test/java/org/eclipse/rdf4j/query/algebra/AbstractQueryModelNodeTest.java @@ -0,0 +1,54 @@ +/******************************************************************************* + * Copyright (c) 2020 Eclipse RDF4J contributors. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Distribution License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ +package org.eclipse.rdf4j.query.algebra; + +import static org.junit.Assert.assertEquals; + +import org.junit.Test; + +public class AbstractQueryModelNodeTest { + + @Test + public void getCardinalityString() { + + { + StatementPattern statementPattern = new StatementPattern(); + String cardinalityString = statementPattern.toHumanReadbleNumber(statementPattern.getResultSizeEstimate()); + assertEquals("UNKNOWN", cardinalityString); + } + + { + StatementPattern statementPattern = new StatementPattern(); + statementPattern.setResultSizeEstimate(1234); + String cardinalityString = statementPattern.toHumanReadbleNumber(statementPattern.getResultSizeEstimate()); + assertEquals("1.2K", cardinalityString); + } + + { + StatementPattern statementPattern = new StatementPattern(); + statementPattern.setResultSizeEstimate(1910000); + String cardinalityString = statementPattern.toHumanReadbleNumber(statementPattern.getResultSizeEstimate()); + assertEquals("1.9M", cardinalityString); + } + + { + StatementPattern statementPattern = new StatementPattern(); + statementPattern.setResultSizeEstimate(1990000); + String cardinalityString = statementPattern.toHumanReadbleNumber(statementPattern.getResultSizeEstimate()); + assertEquals("2.0M", cardinalityString); + } + + { + StatementPattern statementPattern = new StatementPattern(); + statementPattern.setResultSizeEstimate(912000); + String cardinalityString = statementPattern.toHumanReadbleNumber(statementPattern.getResultSizeEstimate()); + assertEquals("912.0K", cardinalityString); + } + + } +} diff --git a/core/queryalgebra/pom.xml b/core/queryalgebra/pom.xml index 3aeac3a1fd4..48031d4bfb7 100644 --- a/core/queryalgebra/pom.xml +++ b/core/queryalgebra/pom.xml @@ -4,7 +4,7 @@ org.eclipse.rdf4j rdf4j-core - 3.1.5-SNAPSHOT + 3.2.2-SNAPSHOT rdf4j-queryalgebra pom diff --git a/core/queryparser/api/pom.xml b/core/queryparser/api/pom.xml index 36a81d91204..7b86c99f35e 100644 --- a/core/queryparser/api/pom.xml +++ b/core/queryparser/api/pom.xml @@ -4,7 +4,7 @@ org.eclipse.rdf4j rdf4j-queryparser - 3.1.5-SNAPSHOT + 3.2.2-SNAPSHOT rdf4j-queryparser-api RDF4J: Query parser - API diff --git a/core/queryparser/api/src/main/java/org/eclipse/rdf4j/query/impl/AbstractParserQuery.java b/core/queryparser/api/src/main/java/org/eclipse/rdf4j/query/impl/AbstractParserQuery.java index 71197f035a1..fa9948577f7 100644 --- a/core/queryparser/api/src/main/java/org/eclipse/rdf4j/query/impl/AbstractParserQuery.java +++ b/core/queryparser/api/src/main/java/org/eclipse/rdf4j/query/impl/AbstractParserQuery.java @@ -23,6 +23,8 @@ public abstract class AbstractParserQuery extends AbstractQuery { private final ParsedQuery parsedQuery; + protected static final int DEFAULT_EXPLANATION_EXECUTION_TIMEOUT = 60; + protected AbstractParserQuery(ParsedQuery parsedQuery) { this.parsedQuery = parsedQuery; } @@ -44,7 +46,7 @@ protected CloseableIteration enf * Gets the "active" dataset for this query. The active dataset is either the dataset that has been specified using * {@link #setDataset(Dataset)} or the dataset that has been specified in the query, where the former takes * precedence over the latter. - * + * * @return The active dataset, or null if there is no dataset. */ public Dataset getActiveDataset() { @@ -73,4 +75,4 @@ protected void throwInterruptedException() throws QueryEvaluationException { throw new QueryInterruptedException("Query evaluation took too long"); } } -} \ No newline at end of file +} diff --git a/core/queryparser/api/src/main/java/org/eclipse/rdf4j/query/impl/AbstractParserUpdate.java b/core/queryparser/api/src/main/java/org/eclipse/rdf4j/query/impl/AbstractParserUpdate.java index 04d2cd60f6a..04314f547fd 100644 --- a/core/queryparser/api/src/main/java/org/eclipse/rdf4j/query/impl/AbstractParserUpdate.java +++ b/core/queryparser/api/src/main/java/org/eclipse/rdf4j/query/impl/AbstractParserUpdate.java @@ -37,7 +37,7 @@ public String toString() { * Determines the active dataset by appropriately merging the pre-set dataset and the dataset defined in the SPARQL * operation itself. If the SPARQL operation contains WITH, USING, or USING NAMED clauses, these should override * whatever is preset. - * + * * @param sparqlDefinedDataset the dataset as defined in the SPARQL update itself. * @return a {@link Dataset} comprised of a merge between the pre-set dataset and the SPARQL-defined dataset. */ diff --git a/core/queryparser/api/src/main/java/org/eclipse/rdf4j/query/parser/ParsedBooleanQuery.java b/core/queryparser/api/src/main/java/org/eclipse/rdf4j/query/parser/ParsedBooleanQuery.java index 5722ae4487c..c51f150927b 100644 --- a/core/queryparser/api/src/main/java/org/eclipse/rdf4j/query/parser/ParsedBooleanQuery.java +++ b/core/queryparser/api/src/main/java/org/eclipse/rdf4j/query/parser/ParsedBooleanQuery.java @@ -11,7 +11,7 @@ /** * A query formulated in the OpenRDF query algebra that produces a boolean value as its result. - * + * * @author Arjohn Kampman */ public class ParsedBooleanQuery extends ParsedQuery { @@ -30,7 +30,7 @@ public ParsedBooleanQuery() { /** * Creates a new boolean query for the supplied tuple expression. - * + * * @param tupleExpr A tuple expression representing the query, formulated in OpenRDF Query Algebra objects. */ public ParsedBooleanQuery(TupleExpr tupleExpr) { @@ -39,7 +39,7 @@ public ParsedBooleanQuery(TupleExpr tupleExpr) { /** * Creates a new boolean query for the supplied tuple expression. - * + * * @param tupleExpr A tuple expression representing the query, formulated in OpenRDF Query Algebra objects. */ public ParsedBooleanQuery(String sourceString, TupleExpr tupleExpr) { diff --git a/core/queryparser/api/src/main/java/org/eclipse/rdf4j/query/parser/ParsedDescribeQuery.java b/core/queryparser/api/src/main/java/org/eclipse/rdf4j/query/parser/ParsedDescribeQuery.java index 0dfcda62987..d19e73586d4 100644 --- a/core/queryparser/api/src/main/java/org/eclipse/rdf4j/query/parser/ParsedDescribeQuery.java +++ b/core/queryparser/api/src/main/java/org/eclipse/rdf4j/query/parser/ParsedDescribeQuery.java @@ -31,7 +31,7 @@ public ParsedDescribeQuery() { /** * Creates a new graph query. To complete this query, a tuple expression needs to be supplied to it using * {@link #setTupleExpr(TupleExpr)}. - * + * * @param namespaces A mapping of namespace prefixes to namespace names representing the namespaces that are used in * the query. */ @@ -41,7 +41,7 @@ public ParsedDescribeQuery(Map namespaces) { /** * Creates a new graph query for the supplied tuple expression. - * + * * @param tupleExpr A tuple expression representing the query, formulated in Sail Query Model objects. */ public ParsedDescribeQuery(TupleExpr tupleExpr) { @@ -50,7 +50,7 @@ public ParsedDescribeQuery(TupleExpr tupleExpr) { /** * Creates a new graph query for the supplied tuple expression. - * + * * @param tupleExpr A tuple expression representing the query, formulated in Sail Query Model objects. */ public ParsedDescribeQuery(String sourceString, TupleExpr tupleExpr) { @@ -59,7 +59,7 @@ public ParsedDescribeQuery(String sourceString, TupleExpr tupleExpr) { /** * Creates a new graph query. - * + * * @param tupleExpr A tuple expression representing the query, formulated in Sail Query Model objects. * @param namespaces A mapping of namespace prefixes to namespace names representing the namespaces that are used in * the query. @@ -70,7 +70,7 @@ public ParsedDescribeQuery(TupleExpr tupleExpr, Map namespaces) /** * Creates a new graph query. - * + * * @param tupleExpr A tuple expression representing the query, formulated in Sail Query Model objects. * @param namespaces A mapping of namespace prefixes to namespace names representing the namespaces that are used in * the query. diff --git a/core/queryparser/api/src/main/java/org/eclipse/rdf4j/query/parser/ParsedGraphQuery.java b/core/queryparser/api/src/main/java/org/eclipse/rdf4j/query/parser/ParsedGraphQuery.java index e105f3a0d00..8b9946619ea 100644 --- a/core/queryparser/api/src/main/java/org/eclipse/rdf4j/query/parser/ParsedGraphQuery.java +++ b/core/queryparser/api/src/main/java/org/eclipse/rdf4j/query/parser/ParsedGraphQuery.java @@ -14,7 +14,7 @@ /** * A query forumalated in the OpenRDF query algebra that produces an RDF graph (a set of statements) as its result. - * + * * @author Arjohn Kampman */ public class ParsedGraphQuery extends ParsedQuery { @@ -40,7 +40,7 @@ public ParsedGraphQuery() { /** * Creates a new graph query. To complete this query, a tuple expression needs to be supplied to it using * {@link #setTupleExpr(TupleExpr)}. - * + * * @param namespaces A mapping of namespace prefixes to namespace names representing the namespaces that are used in * the query. */ @@ -51,7 +51,7 @@ public ParsedGraphQuery(Map namespaces) { /** * Creates a new graph query for the supplied tuple expression. - * + * * @param tupleExpr A tuple expression representing the query, formulated in Sail Query Model objects. */ public ParsedGraphQuery(TupleExpr tupleExpr) { @@ -60,7 +60,7 @@ public ParsedGraphQuery(TupleExpr tupleExpr) { /** * Creates a new graph query for the supplied tuple expression. - * + * * @param tupleExpr A tuple expression representing the query, formulated in Sail Query Model objects. */ public ParsedGraphQuery(String sourceString, TupleExpr tupleExpr) { @@ -69,7 +69,7 @@ public ParsedGraphQuery(String sourceString, TupleExpr tupleExpr) { /** * Creates a new graph query. - * + * * @param tupleExpr A tuple expression representing the query, formulated in Sail Query Model objects. * @param namespaces A mapping of namespace prefixes to namespace names representing the namespaces that are used in * the query. @@ -81,7 +81,7 @@ public ParsedGraphQuery(TupleExpr tupleExpr, Map namespaces) { /** * Creates a new graph query. - * + * * @param tupleExpr A tuple expression representing the query, formulated in Sail Query Model objects. * @param namespaces A mapping of namespace prefixes to namespace names representing the namespaces that are used in * the query. diff --git a/core/queryparser/api/src/main/java/org/eclipse/rdf4j/query/parser/ParsedOperation.java b/core/queryparser/api/src/main/java/org/eclipse/rdf4j/query/parser/ParsedOperation.java index 79e3cb4eeff..d9a24d5a714 100644 --- a/core/queryparser/api/src/main/java/org/eclipse/rdf4j/query/parser/ParsedOperation.java +++ b/core/queryparser/api/src/main/java/org/eclipse/rdf4j/query/parser/ParsedOperation.java @@ -9,7 +9,7 @@ /** * Abstract superclass of all operations that can be formulated in a query language and parsed by the query parser. - * + * * @author Jeen Broekstra */ public abstract class ParsedOperation { diff --git a/core/queryparser/api/src/main/java/org/eclipse/rdf4j/query/parser/ParsedQuery.java b/core/queryparser/api/src/main/java/org/eclipse/rdf4j/query/parser/ParsedQuery.java index 989f3dab306..51ca8463872 100644 --- a/core/queryparser/api/src/main/java/org/eclipse/rdf4j/query/parser/ParsedQuery.java +++ b/core/queryparser/api/src/main/java/org/eclipse/rdf4j/query/parser/ParsedQuery.java @@ -12,7 +12,7 @@ /** * Abstract super class of all query types that a query parser can generate. - * + * * @author Arjohn Kampman */ public abstract class ParsedQuery extends ParsedOperation { @@ -50,7 +50,7 @@ protected ParsedQuery(String sourceString) { /** * Creates a new query object. - * + * * @param tupleExpr The tuple expression underlying this query. */ protected ParsedQuery(String sourceString, TupleExpr tupleExpr) { @@ -60,7 +60,7 @@ protected ParsedQuery(String sourceString, TupleExpr tupleExpr) { /** * Creates a new query object. - * + * * @param tupleExpr The tuple expression underlying this query. */ protected ParsedQuery(TupleExpr tupleExpr) { @@ -69,7 +69,7 @@ protected ParsedQuery(TupleExpr tupleExpr) { /** * Creates a new query object. - * + * * @param tupleExpr The tuple expression underlying this query. */ protected ParsedQuery(TupleExpr tupleExpr, Dataset dataset) { @@ -78,7 +78,7 @@ protected ParsedQuery(TupleExpr tupleExpr, Dataset dataset) { /** * Creates a new query object. - * + * * @param tupleExpr The tuple expression underlying this query. */ protected ParsedQuery(String sourceString, TupleExpr tupleExpr, Dataset dataset) { diff --git a/core/queryparser/api/src/main/java/org/eclipse/rdf4j/query/parser/ParsedTupleQuery.java b/core/queryparser/api/src/main/java/org/eclipse/rdf4j/query/parser/ParsedTupleQuery.java index 2eced1660d3..b756d9cac20 100644 --- a/core/queryparser/api/src/main/java/org/eclipse/rdf4j/query/parser/ParsedTupleQuery.java +++ b/core/queryparser/api/src/main/java/org/eclipse/rdf4j/query/parser/ParsedTupleQuery.java @@ -11,7 +11,7 @@ /** * A query formulated in the OpenRDF query algebra that produces a set of tuples as its result. - * + * * @author Arjohn Kampman */ public class ParsedTupleQuery extends ParsedQuery { @@ -30,7 +30,7 @@ public ParsedTupleQuery() { /** * Creates a new tuple query for the supplied tuple expression. - * + * * @param tupleExpr A tuple expression representing the query, formulated in OpenRDF Query Algebra objects. */ public ParsedTupleQuery(TupleExpr tupleExpr) { @@ -39,7 +39,7 @@ public ParsedTupleQuery(TupleExpr tupleExpr) { /** * Creates a new tuple query for the supplied tuple expression. - * + * * @param tupleExpr A tuple expression representing the query, formulated in OpenRDF Query Algebra objects. */ public ParsedTupleQuery(String sourceString, TupleExpr tupleExpr) { diff --git a/core/queryparser/api/src/main/java/org/eclipse/rdf4j/query/parser/ParsedUpdate.java b/core/queryparser/api/src/main/java/org/eclipse/rdf4j/query/parser/ParsedUpdate.java index 4277ff9f760..731fc38de13 100644 --- a/core/queryparser/api/src/main/java/org/eclipse/rdf4j/query/parser/ParsedUpdate.java +++ b/core/queryparser/api/src/main/java/org/eclipse/rdf4j/query/parser/ParsedUpdate.java @@ -18,7 +18,7 @@ /** * A parsed update sequence formulated in the OpenRDF query algebra. - * + * * @author Jeen Broekstra */ public class ParsedUpdate extends ParsedOperation { @@ -57,7 +57,7 @@ public ParsedUpdate(String sourceString, Map namespaces) { /** * Creates a new update sequence. To complete this update sequence, one or update expressions need to be supplied to * it using {@link #addUpdateExpr(UpdateExpr)}. - * + * * @param namespaces A mapping of namespace prefixes to namespace names representing the namespaces that are used in * the update. */ diff --git a/core/queryparser/api/src/main/java/org/eclipse/rdf4j/query/parser/QueryParserFactory.java b/core/queryparser/api/src/main/java/org/eclipse/rdf4j/query/parser/QueryParserFactory.java index 7ace193669c..e59af11dca4 100644 --- a/core/queryparser/api/src/main/java/org/eclipse/rdf4j/query/parser/QueryParserFactory.java +++ b/core/queryparser/api/src/main/java/org/eclipse/rdf4j/query/parser/QueryParserFactory.java @@ -11,7 +11,7 @@ /** * A QueryParserFactory returns {@link QueryParser}s for a specific query language. - * + * * @author Arjohn Kampman */ public interface QueryParserFactory { diff --git a/core/queryparser/api/src/main/java/org/eclipse/rdf4j/query/parser/QueryParserRegistry.java b/core/queryparser/api/src/main/java/org/eclipse/rdf4j/query/parser/QueryParserRegistry.java index 01c9a2bf36c..4bfc69ec0c3 100644 --- a/core/queryparser/api/src/main/java/org/eclipse/rdf4j/query/parser/QueryParserRegistry.java +++ b/core/queryparser/api/src/main/java/org/eclipse/rdf4j/query/parser/QueryParserRegistry.java @@ -12,7 +12,7 @@ /** * A registry that keeps track of the available {@link QueryParserFactory}s. - * + * * @author Arjohn Kampman */ public class QueryParserRegistry extends ServiceRegistry { @@ -27,7 +27,7 @@ private static class QueryParserRegistryHolder { /** * Gets the default QueryParserRegistry. - * + * * @return The default registry. */ public static QueryParserRegistry getInstance() { @@ -42,4 +42,4 @@ public QueryParserRegistry() { protected QueryLanguage getKey(QueryParserFactory factory) { return factory.getQueryLanguage(); } -} \ No newline at end of file +} diff --git a/core/queryparser/api/src/main/java/org/eclipse/rdf4j/query/parser/QueryParserUtil.java b/core/queryparser/api/src/main/java/org/eclipse/rdf4j/query/parser/QueryParserUtil.java index fdf2eeeb3ce..6701dddd7a2 100644 --- a/core/queryparser/api/src/main/java/org/eclipse/rdf4j/query/parser/QueryParserUtil.java +++ b/core/queryparser/api/src/main/java/org/eclipse/rdf4j/query/parser/QueryParserUtil.java @@ -27,7 +27,7 @@ public static QueryParser createParser(QueryLanguage ql) throws UnsupportedQuery /** * Parses the supplied operation into a query model. - * + * * @param ql The language in which the operation is formulated. * @param operation The operation. * @param baseURI The base URI to resolve any relative URIs that are in the operation against, can be @@ -61,7 +61,7 @@ public static ParsedOperation parseOperation(QueryLanguage ql, String operation, /** * Parses the supplied update operation into a query model. - * + * * @param ql The language in which the update operation is formulated. * @param update The update operation. * @param baseURI The base URI to resolve any relative URIs that are in the operation against, can be null @@ -78,7 +78,7 @@ public static ParsedUpdate parseUpdate(QueryLanguage ql, String update, String b /** * Parses the supplied query into a query model. - * + * * @param ql The language in which the query is formulated. * @param query The query. * @param baseURI The base URI to resolve any relative URIs that are in the query against, can be null if @@ -95,7 +95,7 @@ public static ParsedQuery parseQuery(QueryLanguage ql, String query, String base /** * Parses the supplied query into a query model. - * + * * @param ql The language in which the query is formulated. * @param query The query. * @return The query model for the parsed query. @@ -116,7 +116,7 @@ public static ParsedTupleQuery parseTupleQuery(QueryLanguage ql, String query, S /** * Parses the supplied query into a query model. - * + * * @param ql The language in which the query is formulated. * @param query The query. * @return The query model for the parsed query. @@ -137,7 +137,7 @@ public static ParsedGraphQuery parseGraphQuery(QueryLanguage ql, String query, S /** * Parses the supplied query into a query model. - * + * * @param ql The language in which the query is formulated. * @param query The query. * @return The query model for the parsed query. @@ -159,7 +159,7 @@ public static ParsedBooleanQuery parseBooleanQuery(QueryLanguage ql, String quer /** * Removes SPARQL prefix and base declarations, if any, from the supplied SPARQL query string. The supplied query * string is assumed to be syntactically legal. - * + * * @param queryString a syntactically legal SPARQL query string * @return a substring of queryString, with prefix and base declarations removed. */ diff --git a/core/queryparser/api/src/main/java/org/eclipse/rdf4j/query/parser/QueryPrologLexer.java b/core/queryparser/api/src/main/java/org/eclipse/rdf4j/query/parser/QueryPrologLexer.java index f1aedd7f669..e916f3fd515 100644 --- a/core/queryparser/api/src/main/java/org/eclipse/rdf4j/query/parser/QueryPrologLexer.java +++ b/core/queryparser/api/src/main/java/org/eclipse/rdf4j/query/parser/QueryPrologLexer.java @@ -15,7 +15,7 @@ /** * A simple lexer that tokenizes a syntactically legal input SPARQL query string on prolog items (prefixes, base * declarations, IRIs, comments, and syntactical tokens such as keywords, opening and closing brackets, and hashes). - * + * * @author Jeen Broekstra */ public class QueryPrologLexer { @@ -81,7 +81,7 @@ public String toString() { /** * Tokenizes a syntactically legal input SPARQL query on prolog elements. The last token in the returned list is of * type {@link TokenType#REST_OF_QUERY} and contains the SPARQL query string minus the prolog. - * + * * @param input a syntactically legal SPARQL query string * @return a list with tokens for each prolog element. If the input string is syntactically legal SPARQL, the final * returned token is guaranteed to be of type {@link TokenType#REST_OF_QUERY} and to contain the SPARQL @@ -139,7 +139,7 @@ public static List lex(String input) { * Tokenizes the input string on prolog elements and returns the final Token. If the input string is a syntactically * legal SPARQL query, this Token will be of type {@link TokenType#REST_OF_QUERY} and contain the query string minus * prolog. - * + * * @param input a syntactically legal SPARQL string * @return if the input is syntactically legal SPARQL, a Token containing the query string without prolog. If the * input is not syntactically legal, the method will still exist normally, but no guarantees are made about @@ -193,7 +193,7 @@ public static Token getRestOfQueryToken(String input) { /** * Reads the first comment line from the input, and returns the comment line (including the line break character) * without the leading "#". - * + * * @param input * @param index * @return diff --git a/core/queryparser/api/src/main/java/org/eclipse/rdf4j/query/parser/impl/AbstractParserQuery.java b/core/queryparser/api/src/main/java/org/eclipse/rdf4j/query/parser/impl/AbstractParserQuery.java index 90103a8e8ae..9420baf1a1c 100644 --- a/core/queryparser/api/src/main/java/org/eclipse/rdf4j/query/parser/impl/AbstractParserQuery.java +++ b/core/queryparser/api/src/main/java/org/eclipse/rdf4j/query/parser/impl/AbstractParserQuery.java @@ -46,7 +46,7 @@ protected CloseableIteration enf * Gets the "active" dataset for this query. The active dataset is either the dataset that has been specified using * {@link #setDataset(Dataset)} or the dataset that has been specified in the query, where the former takes * precedence over the latter. - * + * * @return The active dataset, or null if there is no dataset. */ public Dataset getActiveDataset() { @@ -75,4 +75,5 @@ protected void throwInterruptedException() throws QueryEvaluationException { throw new QueryInterruptedException("Query evaluation took too long"); } } + } diff --git a/core/queryparser/api/src/main/java/org/eclipse/rdf4j/query/parser/impl/AbstractParserUpdate.java b/core/queryparser/api/src/main/java/org/eclipse/rdf4j/query/parser/impl/AbstractParserUpdate.java index 5305d1bf5df..9a8bac35a10 100644 --- a/core/queryparser/api/src/main/java/org/eclipse/rdf4j/query/parser/impl/AbstractParserUpdate.java +++ b/core/queryparser/api/src/main/java/org/eclipse/rdf4j/query/parser/impl/AbstractParserUpdate.java @@ -39,7 +39,7 @@ public String toString() { * Determines the active dataset by appropriately merging the pre-set dataset and the dataset defined in the SPARQL * operation itself. If the SPARQL operation contains WITH, USING, or USING NAMED clauses, these should override * whatever is preset. - * + * * @param sparqlDefinedDataset the dataset as defined in the SPARQL update itself. * @return a {@link Dataset} comprised of a merge between the pre-set dataset and the SPARQL-defined dataset. */ diff --git a/core/queryparser/pom.xml b/core/queryparser/pom.xml index 0b56a69a8f9..795d20e2e3a 100644 --- a/core/queryparser/pom.xml +++ b/core/queryparser/pom.xml @@ -4,7 +4,7 @@ org.eclipse.rdf4j rdf4j-core - 3.1.5-SNAPSHOT + 3.2.2-SNAPSHOT rdf4j-queryparser pom diff --git a/core/queryparser/serql/pom.xml b/core/queryparser/serql/pom.xml index 8b1d4543412..3a24b3b0e99 100644 --- a/core/queryparser/serql/pom.xml +++ b/core/queryparser/serql/pom.xml @@ -4,7 +4,7 @@ org.eclipse.rdf4j rdf4j-queryparser - 3.1.5-SNAPSHOT + 3.2.2-SNAPSHOT rdf4j-queryparser-serql RDF4J: Query parser - SeRQL diff --git a/core/queryparser/serql/src/main/java/org/eclipse/rdf4j/query/parser/serql/AbstractASTVisitor.java b/core/queryparser/serql/src/main/java/org/eclipse/rdf4j/query/parser/serql/AbstractASTVisitor.java index 6d7c19a4fa7..88b1121ed3b 100644 --- a/core/queryparser/serql/src/main/java/org/eclipse/rdf4j/query/parser/serql/AbstractASTVisitor.java +++ b/core/queryparser/serql/src/main/java/org/eclipse/rdf4j/query/parser/serql/AbstractASTVisitor.java @@ -77,7 +77,7 @@ import org.eclipse.rdf4j.query.parser.serql.ast.VisitorException; /** - * + * */ public abstract class AbstractASTVisitor implements SyntaxTreeBuilderVisitor { diff --git a/core/queryparser/serql/src/main/java/org/eclipse/rdf4j/query/parser/serql/AnonymousVarGenerator.java b/core/queryparser/serql/src/main/java/org/eclipse/rdf4j/query/parser/serql/AnonymousVarGenerator.java index e5890bee729..5d4e4d3b42d 100644 --- a/core/queryparser/serql/src/main/java/org/eclipse/rdf4j/query/parser/serql/AnonymousVarGenerator.java +++ b/core/queryparser/serql/src/main/java/org/eclipse/rdf4j/query/parser/serql/AnonymousVarGenerator.java @@ -19,7 +19,7 @@ /** * Inserts anonymous variables into the abstract syntax tree at places where such variables are already implicitly * present. - * + * * @deprecated since 3.0. This feature is for internal use only: its existence, signature or behavior may change without * warning from one release to the next. */ diff --git a/core/queryparser/serql/src/main/java/org/eclipse/rdf4j/query/parser/serql/GraphPattern.java b/core/queryparser/serql/src/main/java/org/eclipse/rdf4j/query/parser/serql/GraphPattern.java index e80f7961e4a..4114efe4e28 100644 --- a/core/queryparser/serql/src/main/java/org/eclipse/rdf4j/query/parser/serql/GraphPattern.java +++ b/core/queryparser/serql/src/main/java/org/eclipse/rdf4j/query/parser/serql/GraphPattern.java @@ -155,7 +155,7 @@ public void clear() { /** * Builds a combined tuple expression from the tuple expressions and constraints in this graph pattern. - * + * * @return A tuple expression for this graph pattern. */ public TupleExpr buildTupleExpr() { diff --git a/core/queryparser/serql/src/main/java/org/eclipse/rdf4j/query/parser/serql/NamespaceDeclProcessor.java b/core/queryparser/serql/src/main/java/org/eclipse/rdf4j/query/parser/serql/NamespaceDeclProcessor.java index 1cd7fa132d6..509a7e7e58d 100644 --- a/core/queryparser/serql/src/main/java/org/eclipse/rdf4j/query/parser/serql/NamespaceDeclProcessor.java +++ b/core/queryparser/serql/src/main/java/org/eclipse/rdf4j/query/parser/serql/NamespaceDeclProcessor.java @@ -27,7 +27,7 @@ /** * Processes the namespace declarations in a SeRQL query model. - * + * * @author Arjohn Kampman */ class NamespaceDeclProcessor extends AbstractASTVisitor { @@ -36,7 +36,7 @@ class NamespaceDeclProcessor extends AbstractASTVisitor { * Processes prefix declarations in queries. This method collects all prefixes that are declared in the supplied * query, verifies that prefixes are not redefined and replaces any {@link ASTQName} nodes in the query with * equivalent {@link ASTIRI} nodes. - * + * * @param qc The query that needs to be processed. * @return A map containing the prefixes that are declared in the query (key) and the namespace they map to (value). * @throws MalformedQueryException If the query contains redefined prefixes or qnames that use undefined prefixes. diff --git a/core/queryparser/serql/src/main/java/org/eclipse/rdf4j/query/parser/serql/NullProcessor.java b/core/queryparser/serql/src/main/java/org/eclipse/rdf4j/query/parser/serql/NullProcessor.java index b95b3dd66ad..a62d30e1732 100644 --- a/core/queryparser/serql/src/main/java/org/eclipse/rdf4j/query/parser/serql/NullProcessor.java +++ b/core/queryparser/serql/src/main/java/org/eclipse/rdf4j/query/parser/serql/NullProcessor.java @@ -34,14 +34,14 @@ * Processes {@link ASTNull} nodes in query models. Null's that appear in projections are simply removed as that doesn't * change the semantics. Null's that appear in value comparisons are either replaced with {@link ASTBound} nodes or * constants. - * + * * @author Arjohn Kampman */ class NullProcessor { /** * Processes escape sequences in ASTString objects. - * + * * @param qc The query that needs to be processed. * @throws MalformedQueryException If an invalid escape sequence was found. */ diff --git a/core/queryparser/serql/src/main/java/org/eclipse/rdf4j/query/parser/serql/ProjectionAliasProcessor.java b/core/queryparser/serql/src/main/java/org/eclipse/rdf4j/query/parser/serql/ProjectionAliasProcessor.java index bba5b6232b0..15edd1461d2 100644 --- a/core/queryparser/serql/src/main/java/org/eclipse/rdf4j/query/parser/serql/ProjectionAliasProcessor.java +++ b/core/queryparser/serql/src/main/java/org/eclipse/rdf4j/query/parser/serql/ProjectionAliasProcessor.java @@ -23,7 +23,7 @@ /** * Processes projection aliases, verifying that the specified aliases are unique and generating aliases for the elements * for which no alias has been specified but that do require one. - * + * * @author Arjohn Kampman */ class ProjectionAliasProcessor extends AbstractASTVisitor { diff --git a/core/queryparser/serql/src/main/java/org/eclipse/rdf4j/query/parser/serql/ProjectionProcessor.java b/core/queryparser/serql/src/main/java/org/eclipse/rdf4j/query/parser/serql/ProjectionProcessor.java index 7fa26c22d3d..7cb834f1c4b 100644 --- a/core/queryparser/serql/src/main/java/org/eclipse/rdf4j/query/parser/serql/ProjectionProcessor.java +++ b/core/queryparser/serql/src/main/java/org/eclipse/rdf4j/query/parser/serql/ProjectionProcessor.java @@ -25,7 +25,7 @@ /** * Processes projections. 'Wildcard' projections are made explicit by adding projection elements with the appropriate * variable nodes to them. Explicit projections are checked to see if they don't contain any unbound variables. - * + * * @author Arjohn Kampman */ class ProjectionProcessor extends AbstractASTVisitor { diff --git a/core/queryparser/serql/src/main/java/org/eclipse/rdf4j/query/parser/serql/SeRQLParserFactory.java b/core/queryparser/serql/src/main/java/org/eclipse/rdf4j/query/parser/serql/SeRQLParserFactory.java index 7f7293b570f..777ec47cf01 100644 --- a/core/queryparser/serql/src/main/java/org/eclipse/rdf4j/query/parser/serql/SeRQLParserFactory.java +++ b/core/queryparser/serql/src/main/java/org/eclipse/rdf4j/query/parser/serql/SeRQLParserFactory.java @@ -13,7 +13,7 @@ /** * A {@link QueryParserFactory} for SeRQL parsers - * + * * @author Arjohn Kampman */ public class SeRQLParserFactory implements QueryParserFactory { diff --git a/core/queryparser/serql/src/main/java/org/eclipse/rdf4j/query/parser/serql/SeRQLUtil.java b/core/queryparser/serql/src/main/java/org/eclipse/rdf4j/query/parser/serql/SeRQLUtil.java index af879f5b21e..634ceebc5c6 100644 --- a/core/queryparser/serql/src/main/java/org/eclipse/rdf4j/query/parser/serql/SeRQLUtil.java +++ b/core/queryparser/serql/src/main/java/org/eclipse/rdf4j/query/parser/serql/SeRQLUtil.java @@ -11,7 +11,7 @@ /** * SeRQL-related utility methods. - * + * * @author Arjohn Kampman */ public class SeRQLUtil { @@ -32,7 +32,7 @@ public static String encodeString(String s) { /** * Decodes an encoded SeRQL string. Any \-escape sequences are substituted with their decoded value. - * + * * @param s An encoded SeRQL string. * @return The unencoded string. * @exception IllegalArgumentException If the supplied string is not a correctly encoded SeRQL string. diff --git a/core/queryparser/serql/src/main/java/org/eclipse/rdf4j/query/parser/serql/StringEscapesProcessor.java b/core/queryparser/serql/src/main/java/org/eclipse/rdf4j/query/parser/serql/StringEscapesProcessor.java index 801cd566d3e..76cb9dbd5ee 100644 --- a/core/queryparser/serql/src/main/java/org/eclipse/rdf4j/query/parser/serql/StringEscapesProcessor.java +++ b/core/queryparser/serql/src/main/java/org/eclipse/rdf4j/query/parser/serql/StringEscapesProcessor.java @@ -17,14 +17,14 @@ * Processes escape sequences in strings, replacing the escape sequence with their actual value. Escape sequences for * SPARQL are documented in section A.7 Escape sequences * in strings. - * + * * @author Arjohn Kampman */ class StringEscapesProcessor { /** * Processes escape sequences in ASTString objects. - * + * * @param qc The query that needs to be processed. * @throws MalformedQueryException If an invalid escape sequence was found. */ diff --git a/core/queryparser/serql/src/main/java/org/eclipse/rdf4j/query/parser/serql/ast/ASTEdge.java b/core/queryparser/serql/src/main/java/org/eclipse/rdf4j/query/parser/serql/ast/ASTEdge.java index 549b4119d52..13db48a804a 100644 --- a/core/queryparser/serql/src/main/java/org/eclipse/rdf4j/query/parser/serql/ast/ASTEdge.java +++ b/core/queryparser/serql/src/main/java/org/eclipse/rdf4j/query/parser/serql/ast/ASTEdge.java @@ -24,7 +24,7 @@ public Object jjtAccept(SyntaxTreeBuilderVisitor visitor, Object data) throws Vi /** * Gets the value expression for this edge. - * + * * @return An {@link ASTVar}, {@link ASTURI} or {@link ASTQName} object. */ public ASTValueExpr getValueExpr() { diff --git a/core/queryparser/serql/src/main/java/org/eclipse/rdf4j/query/parser/serql/ast/ASTOptPathExpr.java b/core/queryparser/serql/src/main/java/org/eclipse/rdf4j/query/parser/serql/ast/ASTOptPathExpr.java index eef8e505d3c..ce815b3b315 100644 --- a/core/queryparser/serql/src/main/java/org/eclipse/rdf4j/query/parser/serql/ast/ASTOptPathExpr.java +++ b/core/queryparser/serql/src/main/java/org/eclipse/rdf4j/query/parser/serql/ast/ASTOptPathExpr.java @@ -35,7 +35,7 @@ public boolean hasConstraint() { /** * Returns the where clause on the optional path expression, if present. - * + * * @return The where clause, or null if no where clause was specified. */ public ASTWhere getWhereClause() { diff --git a/core/queryparser/serql/src/main/java/org/eclipse/rdf4j/query/parser/serql/ast/ASTOptPathExprTail.java b/core/queryparser/serql/src/main/java/org/eclipse/rdf4j/query/parser/serql/ast/ASTOptPathExprTail.java index e58ff9171d4..ff76a6d6ded 100644 --- a/core/queryparser/serql/src/main/java/org/eclipse/rdf4j/query/parser/serql/ast/ASTOptPathExprTail.java +++ b/core/queryparser/serql/src/main/java/org/eclipse/rdf4j/query/parser/serql/ast/ASTOptPathExprTail.java @@ -24,7 +24,7 @@ public Object jjtAccept(SyntaxTreeBuilderVisitor visitor, Object data) throws Vi /** * Gets the optional tail part of the path expression. - * + * * @return The optional tail part of the path expression. */ public ASTBasicPathExprTail getOptionalTail() { @@ -37,7 +37,7 @@ public boolean hasWhereClause() { /** * Gets the where-clause that constrains the results of the optional path expression tail, if any. - * + * * @return The where-clause, or null if not available. */ public ASTWhere getWhereClause() { diff --git a/core/queryparser/serql/src/main/java/org/eclipse/rdf4j/query/parser/serql/ast/ASTPathExprTail.java b/core/queryparser/serql/src/main/java/org/eclipse/rdf4j/query/parser/serql/ast/ASTPathExprTail.java index 254808b1afd..cf37a75db0f 100644 --- a/core/queryparser/serql/src/main/java/org/eclipse/rdf4j/query/parser/serql/ast/ASTPathExprTail.java +++ b/core/queryparser/serql/src/main/java/org/eclipse/rdf4j/query/parser/serql/ast/ASTPathExprTail.java @@ -33,7 +33,7 @@ public boolean hasNextTail() { /** * Gets the path epxression tail following this part of the path expression, if any. - * + * * @return The next part of the path expression, or null if this is the last part of the path expression. */ public abstract ASTPathExprTail getNextTail(); diff --git a/core/queryparser/serql/src/main/java/org/eclipse/rdf4j/query/parser/serql/ast/ParseException.java b/core/queryparser/serql/src/main/java/org/eclipse/rdf4j/query/parser/serql/ast/ParseException.java index 2baf6e334dc..b515be20e6d 100644 --- a/core/queryparser/serql/src/main/java/org/eclipse/rdf4j/query/parser/serql/ast/ParseException.java +++ b/core/queryparser/serql/src/main/java/org/eclipse/rdf4j/query/parser/serql/ast/ParseException.java @@ -92,8 +92,9 @@ private static String initialise(Token currentToken, int[][] expectedTokenSequen String retval = "Encountered \""; Token tok = currentToken.next; for (int i = 0; i < maxSize; i++) { - if (i != 0) + if (i != 0) { retval += " "; + } if (tok.kind == 0) { retval += tokenImage[0]; break; diff --git a/core/queryparser/serql/src/main/java/org/eclipse/rdf4j/query/parser/serql/ast/SimpleCharStream.java b/core/queryparser/serql/src/main/java/org/eclipse/rdf4j/query/parser/serql/ast/SimpleCharStream.java index 95581abcf9e..a33232ebf06 100644 --- a/core/queryparser/serql/src/main/java/org/eclipse/rdf4j/query/parser/serql/ast/SimpleCharStream.java +++ b/core/queryparser/serql/src/main/java/org/eclipse/rdf4j/query/parser/serql/ast/SimpleCharStream.java @@ -105,16 +105,18 @@ protected void FillBuff() throws java.io.IOException { if (tokenBegin > 2048) { bufpos = maxNextCharInd = 0; available = tokenBegin; - } else if (tokenBegin < 0) + } else if (tokenBegin < 0) { bufpos = maxNextCharInd = 0; - else + } else { ExpandBuff(false); - } else if (available > tokenBegin) + } + } else if (available > tokenBegin) { available = bufsize; - else if ((tokenBegin - available) < 2048) + } else if ((tokenBegin - available) < 2048) { ExpandBuff(true); - else + } else { available = tokenBegin; + } } int i; @@ -122,14 +124,16 @@ else if ((tokenBegin - available) < 2048) if ((i = inputStream.read(buffer, maxNextCharInd, available - maxNextCharInd)) == -1) { inputStream.close(); throw new java.io.IOException(); - } else + } else { maxNextCharInd += i; + } return; } catch (java.io.IOException e) { --bufpos; backup(0); - if (tokenBegin == -1) + if (tokenBegin == -1) { tokenBegin = bufpos; + } throw e; } } @@ -153,8 +157,9 @@ protected void UpdateLineColumn(char c) { prevCharIsCR = false; if (c == '\n') { prevCharIsLF = true; - } else + } else { line += (column = 1); + } } switch (c) { @@ -181,14 +186,16 @@ public char readChar() throws java.io.IOException { if (inBuf > 0) { --inBuf; - if (++bufpos == bufsize) + if (++bufpos == bufsize) { bufpos = 0; + } return buffer[bufpos]; } - if (++bufpos >= maxNextCharInd) + if (++bufpos >= maxNextCharInd) { FillBuff(); + } char c = buffer[bufpos]; @@ -240,8 +247,9 @@ public int getBeginLine() { public void backup(int amount) { inBuf += amount; - if ((bufpos -= amount) < 0) + if ((bufpos -= amount) < 0) { bufpos += bufsize; + } } /** Constructor. */ @@ -361,19 +369,20 @@ public void ReInit(java.io.InputStream dstream, int startline, int startcolumn) /** Get token literal value. */ public String GetImage() { - if (bufpos >= tokenBegin) + if (bufpos >= tokenBegin) { return new String(buffer, tokenBegin, bufpos - tokenBegin + 1); - else + } else { return new String(buffer, tokenBegin, bufsize - tokenBegin) + new String(buffer, 0, bufpos + 1); + } } /** Get the suffix. */ public char[] GetSuffix(int len) { char[] ret = new char[len]; - if ((bufpos + 1) >= len) + if ((bufpos + 1) >= len) { System.arraycopy(buffer, bufpos - len + 1, ret, 0, len); - else { + } else { System.arraycopy(buffer, bufsize - (len - bufpos - 1), ret, 0, len - bufpos - 1); System.arraycopy(buffer, 0, ret, len - bufpos - 1, bufpos + 1); } @@ -417,10 +426,11 @@ public void adjustBeginLineColumn(int newLine, int newCol) { bufcolumn[j] = newCol + columnDiff; while (i++ < len) { - if (bufline[j = start % bufsize] != bufline[++start % bufsize]) + if (bufline[j = start % bufsize] != bufline[++start % bufsize]) { bufline[j] = newLine++; - else + } else { bufline[j] = newLine; + } } } diff --git a/core/queryparser/serql/src/main/java/org/eclipse/rdf4j/query/parser/serql/ast/SyntaxTreeBuilder.java b/core/queryparser/serql/src/main/java/org/eclipse/rdf4j/query/parser/serql/ast/SyntaxTreeBuilder.java index 3859f313d0e..9c49bf68ce0 100644 --- a/core/queryparser/serql/src/main/java/org/eclipse/rdf4j/query/parser/serql/ast/SyntaxTreeBuilder.java +++ b/core/queryparser/serql/src/main/java/org/eclipse/rdf4j/query/parser/serql/ast/SyntaxTreeBuilder.java @@ -60,8 +60,9 @@ final public ASTQueryContainer QueryContainer() throws ParseException { jjtree.closeNodeScope(jjtn000, true); jjtc000 = false; { - if (true) + if (true) { return jjtn000; + } } } catch (Throwable jjte000) { if (jjtc000) { @@ -72,19 +73,22 @@ final public ASTQueryContainer QueryContainer() throws ParseException { } if (jjte000 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte000; + } } } if (jjte000 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte000; + } } } { - if (true) + if (true) { throw (Error) jjte000; + } } } finally { if (jjtc000) { @@ -134,19 +138,22 @@ final public void NamespaceDecl() throws ParseException { } if (jjte000 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte000; + } } } if (jjte000 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte000; + } } } { - if (true) + if (true) { throw (Error) jjte000; + } } } finally { if (jjtc000) { @@ -221,19 +228,22 @@ final public void TupleQuerySet() throws ParseException { } if (jjte002 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte002; + } } } if (jjte002 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte002; + } } } { - if (true) + if (true) { throw (Error) jjte002; + } } } finally { if (jjtc002) { @@ -257,19 +267,22 @@ final public void TupleQuerySet() throws ParseException { } if (jjte003 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte003; + } } } if (jjte003 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte003; + } } } { - if (true) + if (true) { throw (Error) jjte003; + } } } finally { if (jjtc003) { @@ -338,19 +351,22 @@ final public void GraphQuerySet() throws ParseException { } if (jjte002 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte002; + } } } if (jjte002 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte002; + } } } { - if (true) + if (true) { throw (Error) jjte002; + } } } finally { if (jjtc002) { @@ -374,19 +390,22 @@ final public void GraphQuerySet() throws ParseException { } if (jjte003 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte003; + } } } if (jjte003 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte003; + } } } { - if (true) + if (true) { throw (Error) jjte003; + } } } finally { if (jjtc003) { @@ -488,19 +507,22 @@ final public void SelectQuery() throws ParseException { } if (jjte000 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte000; + } } } if (jjte000 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte000; + } } } { - if (true) + if (true) { throw (Error) jjte000; + } } } finally { if (jjtc000) { @@ -593,19 +615,22 @@ final public void Select() throws ParseException { } if (jjte000 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte000; + } } } if (jjte000 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte000; + } } } { - if (true) + if (true) { throw (Error) jjte000; + } } } finally { if (jjtc000) { @@ -650,19 +675,22 @@ final public void ProjectionElem() throws ParseException { } if (jjte000 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte000; + } } } if (jjte000 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte000; + } } } { - if (true) + if (true) { throw (Error) jjte000; + } } } finally { if (jjtc000) { @@ -719,19 +747,22 @@ final public void ConstructQuery() throws ParseException { } if (jjte000 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte000; + } } } if (jjte000 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte000; + } } } { - if (true) + if (true) { throw (Error) jjte000; + } } } finally { if (jjtc000) { @@ -795,19 +826,22 @@ final public void Construct() throws ParseException { } if (jjte000 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte000; + } } } if (jjte000 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte000; + } } } { - if (true) + if (true) { throw (Error) jjte000; + } } } finally { if (jjtc000) { @@ -850,19 +884,22 @@ final public void QueryBody() throws ParseException { } if (jjte000 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte000; + } } } if (jjte000 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte000; + } } } { - if (true) + if (true) { throw (Error) jjte000; + } } } finally { if (jjtc000) { @@ -897,19 +934,22 @@ final public void From() throws ParseException { } if (jjte000 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte000; + } } } if (jjte000 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte000; + } } } { - if (true) + if (true) { throw (Error) jjte000; + } } } finally { if (jjtc000) { @@ -935,19 +975,22 @@ final public void Where() throws ParseException { } if (jjte000 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte000; + } } } if (jjte000 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte000; + } } } { - if (true) + if (true) { throw (Error) jjte000; + } } } finally { if (jjtc000) { @@ -975,19 +1018,22 @@ final public void OrderBy() throws ParseException { } if (jjte000 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte000; + } } } if (jjte000 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte000; + } } } { - if (true) + if (true) { throw (Error) jjte000; + } } } finally { if (jjtc000) { @@ -1017,19 +1063,22 @@ final public void Limit() throws ParseException { } if (jjte000 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte000; + } } } if (jjte000 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte000; + } } } { - if (true) + if (true) { throw (Error) jjte000; + } } } finally { if (jjtc000) { @@ -1059,19 +1108,22 @@ final public void Offset() throws ParseException { } if (jjte000 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte000; + } } } if (jjte000 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte000; + } } } { - if (true) + if (true) { throw (Error) jjte000; + } } } finally { if (jjtc000) { @@ -1126,19 +1178,22 @@ final public void PathExprList() throws ParseException { } if (jjte001 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte001; + } } } if (jjte001 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte001; + } } } { - if (true) + if (true) { throw (Error) jjte001; + } } } finally { if (jjtc001) { @@ -1171,19 +1226,22 @@ final public void UnionPathExpr() throws ParseException { } if (jjte001 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte001; + } } } if (jjte001 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte001; + } } } { - if (true) + if (true) { throw (Error) jjte001; + } } } finally { if (jjtc001) { @@ -1229,19 +1287,22 @@ final public void BasicPathExpr() throws ParseException { } if (jjte000 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte000; + } } } if (jjte000 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte000; + } } } { - if (true) + if (true) { throw (Error) jjte000; + } } } finally { if (jjtc000) { @@ -1276,19 +1337,22 @@ final public void OptPathExpr() throws ParseException { } if (jjte000 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte000; + } } } if (jjte000 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte000; + } } } { - if (true) + if (true) { throw (Error) jjte000; + } } } finally { if (jjtc000) { @@ -1339,8 +1403,9 @@ final public ASTPathExprTail PathExprTail() throws ParseException { throw new ParseException(); } { - if (true) + if (true) { return result; + } } throw new Error("Missing return statement in function"); } @@ -1368,8 +1433,9 @@ final public ASTPathExprTail BasicPathExprTail() throws ParseException { jjtree.closeNodeScope(jjtn000, true); jjtc000 = false; { - if (true) + if (true) { return jjtn000; + } } } catch (Throwable jjte000) { if (jjtc000) { @@ -1380,19 +1446,22 @@ final public ASTPathExprTail BasicPathExprTail() throws ParseException { } if (jjte000 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte000; + } } } if (jjte000 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte000; + } } } { - if (true) + if (true) { throw (Error) jjte000; + } } } finally { if (jjtc000) { @@ -1430,8 +1499,9 @@ final public ASTPathExprTail OptPathExprTail() throws ParseException { jjtree.closeNodeScope(jjtn000, true); jjtc000 = false; { - if (true) + if (true) { return jjtn000; + } } } catch (Throwable jjte000) { if (jjtc000) { @@ -1442,19 +1512,22 @@ final public ASTPathExprTail OptPathExprTail() throws ParseException { } if (jjte000 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte000; + } } } if (jjte000 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte000; + } } } { - if (true) + if (true) { throw (Error) jjte000; + } } } finally { if (jjtc000) { @@ -1492,19 +1565,22 @@ final public void Edge() throws ParseException { } if (jjte000 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte000; + } } } if (jjte000 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte000; + } } } { - if (true) + if (true) { throw (Error) jjte000; + } } } finally { if (jjtc000) { @@ -1560,19 +1636,22 @@ final public void Node() throws ParseException { } if (jjte000 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte000; + } } } if (jjte000 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte000; + } } } { - if (true) + if (true) { throw (Error) jjte000; + } } } finally { if (jjtc000) { @@ -1619,19 +1698,22 @@ final public void NodeElem() throws ParseException { } if (jjte000 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte000; + } } } if (jjte000 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte000; + } } } { - if (true) + if (true) { throw (Error) jjte000; + } } } finally { if (jjtc000) { @@ -1696,19 +1778,22 @@ final public void ReifiedStat() throws ParseException { } if (jjte000 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte000; + } } } if (jjte000 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte000; + } } } { - if (true) + if (true) { throw (Error) jjte000; + } } } finally { if (jjtc000) { @@ -1770,19 +1855,22 @@ final public void OrderExpr() throws ParseException { } if (jjte000 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte000; + } } } if (jjte000 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte000; + } } } { - if (true) + if (true) { throw (Error) jjte000; + } } } finally { if (jjtc000) { @@ -1822,19 +1910,22 @@ final public void Or() throws ParseException { } if (jjte001 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte001; + } } } if (jjte001 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte001; + } } } { - if (true) + if (true) { throw (Error) jjte001; + } } } finally { if (jjtc001) { @@ -1870,19 +1961,22 @@ final public void And() throws ParseException { } if (jjte001 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte001; + } } } if (jjte001 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte001; + } } } { - if (true) + if (true) { throw (Error) jjte001; + } } } finally { if (jjtc001) { @@ -2006,19 +2100,22 @@ final public void Not() throws ParseException { } if (jjte000 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte000; + } } } if (jjte000 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte000; + } } } { - if (true) + if (true) { throw (Error) jjte000; + } } } finally { if (jjtc000) { @@ -2046,19 +2143,22 @@ final public void Bound() throws ParseException { } if (jjte000 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte000; + } } } if (jjte000 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte000; + } } } { - if (true) + if (true) { throw (Error) jjte000; + } } } finally { if (jjtc000) { @@ -2088,19 +2188,22 @@ final public void SameTerm() throws ParseException { } if (jjte000 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte000; + } } } if (jjte000 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte000; + } } } { - if (true) + if (true) { throw (Error) jjte000; + } } } finally { if (jjtc000) { @@ -2128,19 +2231,22 @@ final public void IsResource() throws ParseException { } if (jjte000 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte000; + } } } if (jjte000 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte000; + } } } { - if (true) + if (true) { throw (Error) jjte000; + } } } finally { if (jjtc000) { @@ -2168,19 +2274,22 @@ final public void IsLiteral() throws ParseException { } if (jjte000 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte000; + } } } if (jjte000 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte000; + } } } { - if (true) + if (true) { throw (Error) jjte000; + } } } finally { if (jjtc000) { @@ -2208,19 +2317,22 @@ final public void IsURI() throws ParseException { } if (jjte000 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte000; + } } } if (jjte000 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte000; + } } } { - if (true) + if (true) { throw (Error) jjte000; + } } } finally { if (jjtc000) { @@ -2248,19 +2360,22 @@ final public void IsBNode() throws ParseException { } if (jjte000 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte000; + } } } if (jjte000 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte000; + } } } { - if (true) + if (true) { throw (Error) jjte000; + } } } finally { if (jjtc000) { @@ -2290,19 +2405,22 @@ final public void LangMatches() throws ParseException { } if (jjte000 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte000; + } } } if (jjte000 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte000; + } } } { - if (true) + if (true) { throw (Error) jjte000; + } } } finally { if (jjtc000) { @@ -2341,19 +2459,22 @@ final public void Regex() throws ParseException { } if (jjte000 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte000; + } } } if (jjte000 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte000; + } } } { - if (true) + if (true) { throw (Error) jjte000; + } } } finally { if (jjtc000) { @@ -2381,19 +2502,22 @@ final public void Exists() throws ParseException { } if (jjte000 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte000; + } } } if (jjte000 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte000; + } } } { - if (true) + if (true) { throw (Error) jjte000; + } } } finally { if (jjtc000) { @@ -2444,19 +2568,22 @@ final public void BooleanValueOp() throws ParseException { } if (jjte001 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte001; + } } } if (jjte001 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte001; + } } } { - if (true) + if (true) { throw (Error) jjte001; + } } } finally { if (jjtc001) { @@ -2543,19 +2670,22 @@ final public void BooleanValueOp() throws ParseException { } if (jjte005 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte005; + } } } if (jjte005 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte005; + } } } { - if (true) + if (true) { throw (Error) jjte005; + } } } finally { if (jjtc005) { @@ -2593,19 +2723,22 @@ final public void BooleanValueOp() throws ParseException { } if (jjte006 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte006; + } } } if (jjte006 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte006; + } } } { - if (true) + if (true) { throw (Error) jjte006; + } } } finally { if (jjtc006) { @@ -2799,19 +2932,22 @@ final public void Datatype() throws ParseException { } if (jjte000 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte000; + } } } if (jjte000 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte000; + } } } { - if (true) + if (true) { throw (Error) jjte000; + } } } finally { if (jjtc000) { @@ -2839,19 +2975,22 @@ final public void Lang() throws ParseException { } if (jjte000 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte000; + } } } if (jjte000 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte000; + } } } { - if (true) + if (true) { throw (Error) jjte000; + } } } finally { if (jjtc000) { @@ -2879,19 +3018,22 @@ final public void Label() throws ParseException { } if (jjte000 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte000; + } } } if (jjte000 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte000; + } } } { - if (true) + if (true) { throw (Error) jjte000; + } } } finally { if (jjtc000) { @@ -2919,19 +3061,22 @@ final public void Namespace() throws ParseException { } if (jjte000 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte000; + } } } if (jjte000 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte000; + } } } { - if (true) + if (true) { throw (Error) jjte000; + } } } finally { if (jjtc000) { @@ -2959,19 +3104,22 @@ final public void LocalName() throws ParseException { } if (jjte000 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte000; + } } } if (jjte000 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte000; + } } } { - if (true) + if (true) { throw (Error) jjte000; + } } } finally { if (jjtc000) { @@ -2999,19 +3147,22 @@ final public void Str() throws ParseException { } if (jjte000 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte000; + } } } if (jjte000 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte000; + } } } { - if (true) + if (true) { throw (Error) jjte000; + } } } finally { if (jjtc000) { @@ -3061,19 +3212,22 @@ final public void FunctionCall() throws ParseException { } if (jjte000 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte000; + } } } if (jjte000 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte000; + } } } { - if (true) + if (true) { throw (Error) jjte000; + } } } finally { if (jjtc000) { @@ -3110,19 +3264,22 @@ final public void ArgList() throws ParseException { } if (jjte000 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte000; + } } } if (jjte000 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte000; + } } } { - if (true) + if (true) { throw (Error) jjte000; + } } } finally { if (jjtc000) { @@ -3413,8 +3570,9 @@ final public int PosInteger() throws ParseException { Token t; t = jj_consume_token(POS_INTEGER); { - if (true) + if (true) { return Integer.parseInt(t.image); + } } throw new Error("Missing return statement in function"); } @@ -3464,20 +3622,23 @@ private boolean jj_3_1() { break; } } - if (jj_scan_token(SELECT)) + if (jj_scan_token(SELECT)) { return true; + } return false; } private boolean jj_3R_14() { - if (jj_3R_16()) + if (jj_3R_16()) { return true; + } return false; } private boolean jj_3_2() { - if (jj_scan_token(UNION)) + if (jj_scan_token(UNION)) { return true; + } Token xsp; while (true) { xsp = jj_scanpos; @@ -3489,29 +3650,34 @@ private boolean jj_3_2() { xsp = jj_scanpos; if (jj_scan_token(19)) { jj_scanpos = xsp; - if (jj_scan_token(15)) + if (jj_scan_token(15)) { return true; + } } return false; } private boolean jj_3R_15() { - if (jj_scan_token(URI)) + if (jj_scan_token(URI)) { return true; + } return false; } private boolean jj_3R_11() { - if (jj_3R_12()) + if (jj_3R_12()) { return true; - if (jj_scan_token(LPAREN)) + } + if (jj_scan_token(LPAREN)) { return true; + } return false; } private boolean jj_3_3() { - if (jj_3R_11()) + if (jj_3R_11()) { return true; + } return false; } @@ -3520,21 +3686,24 @@ private boolean jj_3R_12() { xsp = jj_scanpos; if (jj_3R_13()) { jj_scanpos = xsp; - if (jj_3R_14()) + if (jj_3R_14()) { return true; + } } return false; } private boolean jj_3R_13() { - if (jj_3R_15()) + if (jj_3R_15()) { return true; + } return false; } private boolean jj_3R_16() { - if (jj_scan_token(QNAME)) + if (jj_scan_token(QNAME)) { return true; + } return false; } @@ -3564,6 +3733,7 @@ private boolean jj_3R_16() { static private int[] jj_la1_1; static private int[] jj_la1_2; + static { jj_la1_init_0(); jj_la1_init_1(); @@ -3617,10 +3787,12 @@ public SyntaxTreeBuilder(java.io.InputStream stream, String encoding) { token = new Token(); jj_ntk = -1; jj_gen = 0; - for (int i = 0; i < 69; i++) + for (int i = 0; i < 69; i++) { jj_la1[i] = -1; - for (int i = 0; i < jj_2_rtns.length; i++) + } + for (int i = 0; i < jj_2_rtns.length; i++) { jj_2_rtns[i] = new JJCalls(); + } } /** Reinitialise. */ @@ -3640,10 +3812,12 @@ public void ReInit(java.io.InputStream stream, String encoding) { jj_ntk = -1; jjtree.reset(); jj_gen = 0; - for (int i = 0; i < 69; i++) + for (int i = 0; i < 69; i++) { jj_la1[i] = -1; - for (int i = 0; i < jj_2_rtns.length; i++) + } + for (int i = 0; i < jj_2_rtns.length; i++) { jj_2_rtns[i] = new JJCalls(); + } } /** Constructor. */ @@ -3653,10 +3827,12 @@ public SyntaxTreeBuilder(java.io.Reader stream) { token = new Token(); jj_ntk = -1; jj_gen = 0; - for (int i = 0; i < 69; i++) + for (int i = 0; i < 69; i++) { jj_la1[i] = -1; - for (int i = 0; i < jj_2_rtns.length; i++) + } + for (int i = 0; i < jj_2_rtns.length; i++) { jj_2_rtns[i] = new JJCalls(); + } } /** Reinitialise. */ @@ -3667,10 +3843,12 @@ public void ReInit(java.io.Reader stream) { jj_ntk = -1; jjtree.reset(); jj_gen = 0; - for (int i = 0; i < 69; i++) + for (int i = 0; i < 69; i++) { jj_la1[i] = -1; - for (int i = 0; i < jj_2_rtns.length; i++) + } + for (int i = 0; i < jj_2_rtns.length; i++) { jj_2_rtns[i] = new JJCalls(); + } } /** Constructor with generated Token Manager. */ @@ -3679,10 +3857,12 @@ public SyntaxTreeBuilder(SyntaxTreeBuilderTokenManager tm) { token = new Token(); jj_ntk = -1; jj_gen = 0; - for (int i = 0; i < 69; i++) + for (int i = 0; i < 69; i++) { jj_la1[i] = -1; - for (int i = 0; i < jj_2_rtns.length; i++) + } + for (int i = 0; i < jj_2_rtns.length; i++) { jj_2_rtns[i] = new JJCalls(); + } } /** Reinitialise. */ @@ -3692,18 +3872,21 @@ public void ReInit(SyntaxTreeBuilderTokenManager tm) { jj_ntk = -1; jjtree.reset(); jj_gen = 0; - for (int i = 0; i < 69; i++) + for (int i = 0; i < 69; i++) { jj_la1[i] = -1; - for (int i = 0; i < jj_2_rtns.length; i++) + } + for (int i = 0; i < jj_2_rtns.length; i++) { jj_2_rtns[i] = new JJCalls(); + } } private Token jj_consume_token(int kind) throws ParseException { Token oldToken; - if ((oldToken = token).next != null) + if ((oldToken = token).next != null) { token = token.next; - else + } else { token = token.next = token_source.getNextToken(); + } jj_ntk = -1; if (token.kind == kind) { jj_gen++; @@ -3712,8 +3895,9 @@ private Token jj_consume_token(int kind) throws ParseException { for (int i = 0; i < jj_2_rtns.length; i++) { JJCalls c = jj_2_rtns[i]; while (c != null) { - if (c.gen < jj_gen) + if (c.gen < jj_gen) { c.first = null; + } c = c.next; } } @@ -3748,22 +3932,26 @@ private boolean jj_scan_token(int kind) { i++; tok = tok.next; } - if (tok != null) + if (tok != null) { jj_add_error_token(kind, i); + } } - if (jj_scanpos.kind != kind) + if (jj_scanpos.kind != kind) { return true; - if (jj_la == 0 && jj_scanpos == jj_lastpos) + } + if (jj_la == 0 && jj_scanpos == jj_lastpos) { throw jj_ls; + } return false; } /** Get the next Token. */ final public Token getNextToken() { - if (token.next != null) + if (token.next != null) { token = token.next; - else + } else { token = token.next = token_source.getNextToken(); + } jj_ntk = -1; jj_gen++; return token; @@ -3773,19 +3961,21 @@ final public Token getNextToken() { final public Token getToken(int index) { Token t = token; for (int i = 0; i < index; i++) { - if (t.next != null) + if (t.next != null) { t = t.next; - else + } else { t = t.next = token_source.getNextToken(); + } } return t; } private int jj_ntk() { - if ((jj_nt = token.next) == null) + if ((jj_nt = token.next) == null) { return (jj_ntk = (token.next = token_source.getNextToken()).kind); - else + } else { return (jj_ntk = jj_nt.kind); + } } private java.util.List jj_expentries = new java.util.ArrayList<>(); @@ -3799,8 +3989,9 @@ private int jj_ntk() { private int jj_endpos; private void jj_add_error_token(int kind, int pos) { - if (pos >= 100) + if (pos >= 100) { return; + } if (pos == jj_endpos + 1) { jj_lasttokens[jj_endpos++] = kind; } else if (jj_endpos != 0) { @@ -3820,8 +4011,9 @@ private void jj_add_error_token(int kind, int pos) { break jj_entries_loop; } } - if (pos != 0) + if (pos != 0) { jj_lasttokens[(jj_endpos = pos) - 1] = kind; + } } } diff --git a/core/queryparser/serql/src/main/java/org/eclipse/rdf4j/query/parser/serql/ast/SyntaxTreeBuilderTokenManager.java b/core/queryparser/serql/src/main/java/org/eclipse/rdf4j/query/parser/serql/ast/SyntaxTreeBuilderTokenManager.java index e8e2e3195db..44780e41717 100644 --- a/core/queryparser/serql/src/main/java/org/eclipse/rdf4j/query/parser/serql/ast/SyntaxTreeBuilderTokenManager.java +++ b/core/queryparser/serql/src/main/java/org/eclipse/rdf4j/query/parser/serql/ast/SyntaxTreeBuilderTokenManager.java @@ -28,12 +28,14 @@ private final int jjStopStringLiteralDfa_0(int pos, long active0, long active1) jjmatchedKind = 77; return 114; } - if ((active0 & 0x300L) != 0L) + if ((active0 & 0x300L) != 0L) { return 6; + } return -1; case 1: - if ((active0 & 0x24000101c0000000L) != 0L || (active1 & 0x1L) != 0L) + if ((active0 & 0x24000101c0000000L) != 0L || (active1 & 0x1L) != 0L) { return 114; + } if ((active0 & 0xdbfffefe3fe00000L) != 0L || (active1 & 0x2L) != 0L) { if (jjmatchedPos != 1) { jjmatchedKind = 77; @@ -43,8 +45,9 @@ private final int jjStopStringLiteralDfa_0(int pos, long active0, long active1) } return -1; case 2: - if ((active0 & 0xc00800c100000000L) != 0L) + if ((active0 & 0xc00800c100000000L) != 0L) { return 114; + } if ((active0 & 0x3bf7fe3e7fe00000L) != 0L || (active1 & 0x2L) != 0L) { jjmatchedKind = 77; jjmatchedPos = 2; @@ -52,8 +55,9 @@ private final int jjStopStringLiteralDfa_0(int pos, long active0, long active1) } return -1; case 3: - if ((active0 & 0x21941208000000L) != 0L) + if ((active0 & 0x21941208000000L) != 0L) { return 114; + } if ((active0 & 0x3bd66a2c77e00000L) != 0L || (active1 & 0x2L) != 0L) { if (jjmatchedPos != 3) { jjmatchedKind = 77; @@ -68,12 +72,14 @@ private final int jjStopStringLiteralDfa_0(int pos, long active0, long active1) jjmatchedPos = 4; return 114; } - if ((active0 & 0x1910602460200000L) != 0L) + if ((active0 & 0x1910602460200000L) != 0L) { return 114; + } return -1; case 5: - if ((active0 & 0x80800800000L) != 0L || (active1 & 0x2L) != 0L) + if ((active0 & 0x80800800000L) != 0L || (active1 & 0x2L) != 0L) { return 114; + } if ((active0 & 0x22c7020017400000L) != 0L) { jjmatchedKind = 77; jjmatchedPos = 5; @@ -81,8 +87,9 @@ private final int jjStopStringLiteralDfa_0(int pos, long active0, long active1) } return -1; case 6: - if ((active0 & 0x80000014000000L) != 0L) + if ((active0 & 0x80000014000000L) != 0L) { return 114; + } if ((active0 & 0x2247020003400000L) != 0L) { jjmatchedKind = 77; jjmatchedPos = 6; @@ -90,8 +97,9 @@ private final int jjStopStringLiteralDfa_0(int pos, long active0, long active1) } return -1; case 7: - if ((active0 & 0x2020002000000L) != 0L) + if ((active0 & 0x2020002000000L) != 0L) { return 114; + } if ((active0 & 0x2245000001400000L) != 0L) { jjmatchedKind = 77; jjmatchedPos = 7; @@ -104,12 +112,14 @@ private final int jjStopStringLiteralDfa_0(int pos, long active0, long active1) jjmatchedPos = 8; return 114; } - if ((active0 & 0x2204000001400000L) != 0L) + if ((active0 & 0x2204000001400000L) != 0L) { return 114; + } return -1; case 9: - if ((active0 & 0x40000000000000L) != 0L) + if ((active0 & 0x40000000000000L) != 0L) { return 114; + } if ((active0 & 0x1000000000000L) != 0L) { jjmatchedKind = 77; jjmatchedPos = 9; @@ -223,12 +233,13 @@ private int jjMoveStringLiteralDfa1_0(long active0, long active1) { } switch (curChar) { case 61: - if ((active0 & 0x80L) != 0L) + if ((active0 & 0x80L) != 0L) { return jjStopAtPos(1, 7); - else if ((active0 & 0x200L) != 0L) + } else if ((active0 & 0x200L) != 0L) { return jjStopAtPos(1, 9); - else if ((active0 & 0x400L) != 0L) + } else if ((active0 & 0x400L) != 0L) { return jjStopAtPos(1, 10); + } break; case 65: case 97: @@ -286,8 +297,9 @@ else if ((active0 & 0x400L) != 0L) return jjMoveStringLiteralDfa2_0(active0, 0L, active1, 0x2L); case 89: case 121: - if ((active0 & 0x80000000L) != 0L) + if ((active0 & 0x80000000L) != 0L) { return jjStartNfaWithStates_0(1, 31, 114); + } break; default: break; @@ -296,8 +308,9 @@ else if ((active0 & 0x400L) != 0L) } private int jjMoveStringLiteralDfa2_0(long old0, long active0, long old1, long active1) { - if (((active0 &= old0) | (active1 &= old1)) == 0L) + if (((active0 &= old0) | (active1 &= old1)) == 0L) { return jjStartNfa_0(0, old0, old1); + } try { curChar = input_stream.readChar(); } catch (java.io.IOException e) { @@ -310,13 +323,15 @@ private int jjMoveStringLiteralDfa2_0(long old0, long active0, long old1, long a return jjMoveStringLiteralDfa3_0(active0, 0x80400000000000L, active1, 0L); case 67: case 99: - if ((active0 & 0x100000000L) != 0L) + if ((active0 & 0x100000000L) != 0L) { return jjStartNfaWithStates_0(2, 32, 114); + } return jjMoveStringLiteralDfa3_0(active0, 0x4000000000000L, active1, 0L); case 68: case 100: - if ((active0 & 0x8000000000L) != 0L) + if ((active0 & 0x8000000000L) != 0L) { return jjStartNfaWithStates_0(2, 39, 114); + } return jjMoveStringLiteralDfa3_0(active0, 0x44000000L, active1, 0L); case 69: case 101: @@ -335,8 +350,9 @@ private int jjMoveStringLiteralDfa2_0(long old0, long active0, long old1, long a return jjMoveStringLiteralDfa3_0(active0, 0x40000000000L, active1, 0L); case 76: case 108: - if ((active0 & 0x8000000000000000L) != 0L) + if ((active0 & 0x8000000000000000L) != 0L) { return jjStartNfaWithStates_0(2, 63, 114); + } return jjMoveStringLiteralDfa3_0(active0, 0x220002000800000L, active1, 0L); case 77: case 109: @@ -349,24 +365,27 @@ private int jjMoveStringLiteralDfa2_0(long old0, long active0, long old1, long a return jjMoveStringLiteralDfa3_0(active0, 0x8000000L, active1, 0L); case 82: case 114: - if ((active0 & 0x8000000000000L) != 0L) + if ((active0 & 0x8000000000000L) != 0L) { return jjStartNfaWithStates_0(2, 51, 114); + } return jjMoveStringLiteralDfa3_0(active0, 0x40000000000000L, active1, 0L); case 83: case 115: return jjMoveStringLiteralDfa3_0(active0, 0x100202000000L, active1, 0L); case 84: case 116: - if ((active0 & 0x4000000000L) != 0L) + if ((active0 & 0x4000000000L) != 0L) { return jjStartNfaWithStates_0(2, 38, 114); + } return jjMoveStringLiteralDfa3_0(active0, 0x2002000000000000L, active1, 0L); case 85: case 117: return jjMoveStringLiteralDfa3_0(active0, 0x110001000000000L, active1, 0L); case 89: case 121: - if ((active0 & 0x4000000000000000L) != 0L) + if ((active0 & 0x4000000000000000L) != 0L) { return jjStartNfaWithStates_0(2, 62, 114); + } break; default: break; @@ -375,8 +394,9 @@ private int jjMoveStringLiteralDfa2_0(long old0, long active0, long old1, long a } private int jjMoveStringLiteralDfa3_0(long old0, long active0, long old1, long active1) { - if (((active0 &= old0) | (active1 &= old1)) == 0L) + if (((active0 &= old0) | (active1 &= old1)) == 0L) { return jjStartNfa_0(1, old0, old1); + } try { curChar = input_stream.readChar(); } catch (java.io.IOException e) { @@ -389,17 +409,19 @@ private int jjMoveStringLiteralDfa3_0(long old0, long active0, long old1, long a return jjMoveStringLiteralDfa4_0(active0, 0x6000000000000L, active1, 0L); case 67: case 99: - if ((active0 & 0x200000000L) != 0L) + if ((active0 & 0x200000000L) != 0L) { return jjStartNfaWithStates_0(3, 33, 114); + } break; case 69: case 101: - if ((active0 & 0x1000000000L) != 0L) + if ((active0 & 0x1000000000L) != 0L) { return jjStartNfaWithStates_0(3, 36, 114); - else if ((active0 & 0x40000000000L) != 0L) + } else if ((active0 & 0x40000000000L) != 0L) { return jjStartNfaWithStates_0(3, 42, 114); - else if ((active0 & 0x100000000000L) != 0L) + } else if ((active0 & 0x100000000000L) != 0L) { return jjStartNfaWithStates_0(3, 44, 114); + } return jjMoveStringLiteralDfa4_0(active0, 0x2040620040c00000L, active1, 0L); case 71: case 103: @@ -413,13 +435,15 @@ else if ((active0 & 0x100000000000L) != 0L) return jjMoveStringLiteralDfa4_0(active0, 0x200000400000000L, active1, 0L); case 76: case 108: - if ((active0 & 0x20000000000000L) != 0L) + if ((active0 & 0x20000000000000L) != 0L) { return jjStartNfaWithStates_0(3, 53, 114); + } break; case 77: case 109: - if ((active0 & 0x8000000L) != 0L) + if ((active0 & 0x8000000L) != 0L) { return jjStartNfaWithStates_0(3, 27, 114); + } break; case 78: case 110: @@ -446,8 +470,9 @@ else if ((active0 & 0x100000000000L) != 0L) } private int jjMoveStringLiteralDfa4_0(long old0, long active0, long old1, long active1) { - if (((active0 &= old0) | (active1 &= old1)) == 0L) + if (((active0 &= old0) | (active1 &= old1)) == 0L) { return jjStartNfa_0(2, old0, old1); + } try { curChar = input_stream.readChar(); } catch (java.io.IOException e) { @@ -460,61 +485,71 @@ private int jjMoveStringLiteralDfa4_0(long old0, long active0, long old1, long a return jjMoveStringLiteralDfa5_0(active0, 0x4800000L, active1, 0L); case 68: case 100: - if ((active0 & 0x10000000000000L) != 0L) + if ((active0 & 0x10000000000000L) != 0L) { return jjStartNfaWithStates_0(4, 52, 114); + } break; case 69: case 101: - if ((active0 & 0x20000000L) != 0L) + if ((active0 & 0x20000000L) != 0L) { return jjStartNfaWithStates_0(4, 29, 114); - else if ((active0 & 0x2000000000L) != 0L) + } else if ((active0 & 0x2000000000L) != 0L) { return jjStartNfaWithStates_0(4, 37, 114); + } return jjMoveStringLiteralDfa5_0(active0, 0x810000000L, active1, 0L); case 71: case 103: - if ((active0 & 0x200000L) != 0L) + if ((active0 & 0x200000L) != 0L) { return jjStartNfaWithStates_0(4, 21, 114); + } break; case 73: case 105: - if ((active0 & 0x100000000000000L) != 0L) + if ((active0 & 0x100000000000000L) != 0L) { return jjStartNfaWithStates_0(4, 56, 114); + } return jjMoveStringLiteralDfa5_0(active0, 0x2000000L, active1, 0L); case 76: case 108: - if ((active0 & 0x400000000000L) != 0L) + if ((active0 & 0x400000000000L) != 0L) { return jjStartNfaWithStates_0(4, 46, 114); + } return jjMoveStringLiteralDfa5_0(active0, 0x4000000000000L, active1, 0L); case 77: case 109: return jjMoveStringLiteralDfa5_0(active0, 0x1000000000000L, active1, 0L); case 78: case 110: - if ((active0 & 0x800000000000000L) != 0L) + if ((active0 & 0x800000000000000L) != 0L) { return jjStartNfaWithStates_0(4, 59, 114); + } break; case 79: case 111: return jjMoveStringLiteralDfa5_0(active0, 0x80000000000000L, active1, 0L); case 82: case 114: - if ((active0 & 0x40000000L) != 0L) + if ((active0 & 0x40000000L) != 0L) { return jjStartNfaWithStates_0(4, 30, 114); + } return jjMoveStringLiteralDfa5_0(active0, 0x2000080000000000L, active1, 0L); case 83: case 115: - if ((active0 & 0x1000000000000000L) != 0L) + if ((active0 & 0x1000000000000000L) != 0L) { return jjStartNfaWithStates_0(4, 60, 114); + } return jjMoveStringLiteralDfa5_0(active0, 0x40000000400000L, active1, 0L); case 84: case 116: - if ((active0 & 0x400000000L) != 0L) + if ((active0 & 0x400000000L) != 0L) { return jjStartNfaWithStates_0(4, 34, 114); + } return jjMoveStringLiteralDfa5_0(active0, 0x202020001000000L, active1, 0x2L); case 88: case 120: - if ((active0 & 0x200000000000L) != 0L) + if ((active0 & 0x200000000000L) != 0L) { return jjStartNfaWithStates_0(4, 45, 114); + } break; default: break; @@ -523,8 +558,9 @@ else if ((active0 & 0x2000000000L) != 0L) } private int jjMoveStringLiteralDfa5_0(long old0, long active0, long old1, long active1) { - if (((active0 &= old0) | (active1 &= old1)) == 0L) + if (((active0 &= old0) | (active1 &= old1)) == 0L) { return jjStartNfa_0(3, old0, old1); + } try { curChar = input_stream.readChar(); } catch (java.io.IOException e) { @@ -540,8 +576,9 @@ private int jjMoveStringLiteralDfa5_0(long old0, long active0, long old1, long a return jjMoveStringLiteralDfa6_0(active0, 0x80000000000000L, active1, 0L); case 69: case 101: - if ((active0 & 0x80000000000L) != 0L) + if ((active0 & 0x80000000000L) != 0L) { return jjStartNfaWithStates_0(5, 43, 114); + } return jjMoveStringLiteralDfa6_0(active0, 0x200020004000000L, active1, 0L); case 78: case 110: @@ -557,15 +594,17 @@ private int jjMoveStringLiteralDfa5_0(long old0, long active0, long old1, long a return jjMoveStringLiteralDfa6_0(active0, 0x1000000L, active1, 0L); case 83: case 115: - if ((active1 & 0x2L) != 0L) + if ((active1 & 0x2L) != 0L) { return jjStartNfaWithStates_0(5, 65, 114); + } return jjMoveStringLiteralDfa6_0(active0, 0x2000000000000000L, active1, 0L); case 84: case 116: - if ((active0 & 0x800000L) != 0L) + if ((active0 & 0x800000L) != 0L) { return jjStartNfaWithStates_0(5, 23, 114); - else if ((active0 & 0x800000000L) != 0L) + } else if ((active0 & 0x800000000L) != 0L) { return jjStartNfaWithStates_0(5, 35, 114); + } break; case 88: case 120: @@ -580,8 +619,9 @@ else if ((active0 & 0x800000000L) != 0L) } private int jjMoveStringLiteralDfa6_0(long old0, long active0, long old1, long active1) { - if (((active0 &= old0) | (active1 &= old1)) == 0L) + if (((active0 &= old0) | (active1 &= old1)) == 0L) { return jjStartNfa_0(4, old0, old1); + } try { curChar = input_stream.readChar(); } catch (java.io.IOException e) { @@ -597,13 +637,15 @@ private int jjMoveStringLiteralDfa6_0(long old0, long active0, long old1, long a return jjMoveStringLiteralDfa7_0(active0, 0x2000000L); case 68: case 100: - if ((active0 & 0x4000000L) != 0L) + if ((active0 & 0x4000000L) != 0L) { return jjStartNfaWithStates_0(6, 26, 114); + } break; case 69: case 101: - if ((active0 & 0x80000000000000L) != 0L) + if ((active0 & 0x80000000000000L) != 0L) { return jjStartNfaWithStates_0(6, 55, 114); + } return jjMoveStringLiteralDfa7_0(active0, 0x2000000000000000L); case 80: case 112: @@ -613,8 +655,9 @@ private int jjMoveStringLiteralDfa6_0(long old0, long active0, long old1, long a return jjMoveStringLiteralDfa7_0(active0, 0x200020000000000L); case 84: case 116: - if ((active0 & 0x10000000L) != 0L) + if ((active0 & 0x10000000L) != 0L) { return jjStartNfaWithStates_0(6, 28, 114); + } return jjMoveStringLiteralDfa7_0(active0, 0x1000000000000L); case 85: case 117: @@ -626,8 +669,9 @@ private int jjMoveStringLiteralDfa6_0(long old0, long active0, long old1, long a } private int jjMoveStringLiteralDfa7_0(long old0, long active0) { - if (((active0 &= old0)) == 0L) + if (((active0 &= old0)) == 0L) { return jjStartNfa_0(5, old0, 0L); + } try { curChar = input_stream.readChar(); } catch (java.io.IOException e) { @@ -643,21 +687,24 @@ private int jjMoveStringLiteralDfa7_0(long old0, long active0) { return jjMoveStringLiteralDfa8_0(active0, 0x2001000001400000L); case 69: case 101: - if ((active0 & 0x2000000000000L) != 0L) + if ((active0 & 0x2000000000000L) != 0L) { return jjStartNfaWithStates_0(7, 49, 114); + } break; case 77: case 109: - if ((active0 & 0x20000000000L) != 0L) + if ((active0 & 0x20000000000L) != 0L) { return jjStartNfaWithStates_0(7, 41, 114); + } return jjMoveStringLiteralDfa8_0(active0, 0x4000000000000L); case 82: case 114: return jjMoveStringLiteralDfa8_0(active0, 0x40000000000000L); case 84: case 116: - if ((active0 & 0x2000000L) != 0L) + if ((active0 & 0x2000000L) != 0L) { return jjStartNfaWithStates_0(7, 25, 114); + } break; default: break; @@ -666,8 +713,9 @@ private int jjMoveStringLiteralDfa7_0(long old0, long active0) { } private int jjMoveStringLiteralDfa8_0(long old0, long active0) { - if (((active0 &= old0)) == 0L) + if (((active0 &= old0)) == 0L) { return jjStartNfa_0(6, old0, 0L); + } try { curChar = input_stream.readChar(); } catch (java.io.IOException e) { @@ -680,25 +728,28 @@ private int jjMoveStringLiteralDfa8_0(long old0, long active0) { return jjMoveStringLiteralDfa9_0(active0, 0x40000000000000L); case 69: case 101: - if ((active0 & 0x400000L) != 0L) + if ((active0 & 0x400000L) != 0L) { return jjStartNfaWithStates_0(8, 22, 114); - else if ((active0 & 0x4000000000000L) != 0L) + } else if ((active0 & 0x4000000000000L) != 0L) { return jjStartNfaWithStates_0(8, 50, 114); + } break; case 72: case 104: return jjMoveStringLiteralDfa9_0(active0, 0x1000000000000L); case 76: case 108: - if ((active0 & 0x200000000000000L) != 0L) + if ((active0 & 0x200000000000000L) != 0L) { return jjStartNfaWithStates_0(8, 57, 114); + } break; case 84: case 116: - if ((active0 & 0x1000000L) != 0L) + if ((active0 & 0x1000000L) != 0L) { return jjStartNfaWithStates_0(8, 24, 114); - else if ((active0 & 0x2000000000000000L) != 0L) + } else if ((active0 & 0x2000000000000000L) != 0L) { return jjStartNfaWithStates_0(8, 61, 114); + } break; default: break; @@ -707,8 +758,9 @@ else if ((active0 & 0x2000000000000000L) != 0L) } private int jjMoveStringLiteralDfa9_0(long old0, long active0) { - if (((active0 &= old0)) == 0L) + if (((active0 &= old0)) == 0L) { return jjStartNfa_0(7, old0, 0L); + } try { curChar = input_stream.readChar(); } catch (java.io.IOException e) { @@ -718,8 +770,9 @@ private int jjMoveStringLiteralDfa9_0(long old0, long active0) { switch (curChar) { case 69: case 101: - if ((active0 & 0x40000000000000L) != 0L) + if ((active0 & 0x40000000000000L) != 0L) { return jjStartNfaWithStates_0(9, 54, 114); + } return jjMoveStringLiteralDfa10_0(active0, 0x1000000000000L); default: break; @@ -728,8 +781,9 @@ private int jjMoveStringLiteralDfa9_0(long old0, long active0) { } private int jjMoveStringLiteralDfa10_0(long old0, long active0) { - if (((active0 &= old0)) == 0L) + if (((active0 &= old0)) == 0L) { return jjStartNfa_0(8, old0, 0L); + } try { curChar = input_stream.readChar(); } catch (java.io.IOException e) { @@ -739,8 +793,9 @@ private int jjMoveStringLiteralDfa10_0(long old0, long active0) { switch (curChar) { case 83: case 115: - if ((active0 & 0x1000000000000L) != 0L) + if ((active0 & 0x1000000000000L) != 0L) { return jjStartNfaWithStates_0(10, 48, 114); + } break; default: break; @@ -872,432 +927,538 @@ private int jjMoveNfa_0(int startState, int curPos) { jjstateSet[0] = startState; int kind = 0x7fffffff; for (;;) { - if (++jjround == 0x7fffffff) + if (++jjround == 0x7fffffff) { ReInitRounds(); + } if (curChar < 64) { long l = 1L << curChar; do { switch (jjstateSet[--i]) { case 0: if ((0x3ff000000000000L & l) != 0L) { - if (kind > 78) + if (kind > 78) { kind = 78; + } jjCheckNAddStates(0, 2); - } else if ((0x280000000000L & l) != 0L) + } else if ((0x280000000000L & l) != 0L) { jjCheckNAddTwoStates(20, 21); - else if (curChar == 34) + } else if (curChar == 34) { jjCheckNAddStates(3, 11); - else if (curChar == 46) + } else if (curChar == 46) { jjCheckNAdd(22); - else if (curChar == 60) + } else if (curChar == 60) { jjstateSet[jjnewStateCnt++] = 6; - else if (curChar == 35) { - if (kind > 5) + } else if (curChar == 35) { + if (kind > 5) { kind = 5; + } jjCheckNAddStates(12, 14); } - if (curChar == 45) + if (curChar == 45) { jjCheckNAdd(18); - else if (curChar == 43) + } else if (curChar == 43) { jjCheckNAdd(16); + } break; case 114: if ((0x3ff600000000000L & l) != 0L) { - if (kind > 77) + if (kind > 77) { kind = 77; + } jjCheckNAdd(109); } else if (curChar == 58) { - if (kind > 75) + if (kind > 75) { kind = 75; + } jjCheckNAdd(108); } - if ((0x3ff600000000000L & l) != 0L) + if ((0x3ff600000000000L & l) != 0L) { jjCheckNAddTwoStates(106, 107); + } break; case 1: - if ((0xffffffffffffdbffL & l) == 0L) + if ((0xffffffffffffdbffL & l) == 0L) { break; - if (kind > 5) + } + if (kind > 5) { kind = 5; + } jjCheckNAddStates(12, 14); break; case 2: - if ((0x2400L & l) != 0L && kind > 5) + if ((0x2400L & l) != 0L && kind > 5) { kind = 5; + } break; case 3: - if (curChar == 10 && kind > 5) + if (curChar == 10 && kind > 5) { kind = 5; + } break; case 4: - if (curChar == 13) + if (curChar == 13) { jjstateSet[jjnewStateCnt++] = 3; + } break; case 5: - if (curChar == 60) + if (curChar == 60) { jjstateSet[jjnewStateCnt++] = 6; + } break; case 7: - if ((0x3ff680000000000L & l) != 0L) + if ((0x3ff680000000000L & l) != 0L) { jjAddStates(15, 16); + } break; case 8: - if (curChar == 58) + if (curChar == 58) { jjCheckNAdd(9); + } break; case 9: - if ((0xaffffffa00000000L & l) != 0L) + if ((0xaffffffa00000000L & l) != 0L) { jjCheckNAddTwoStates(9, 10); + } break; case 10: - if (curChar == 62 && kind > 73) + if (curChar == 62 && kind > 73) { kind = 73; + } break; case 11: - if (curChar == 58) + if (curChar == 58) { jjstateSet[jjnewStateCnt++] = 12; + } break; case 13: - if ((0x3ff600000000000L & l) == 0L) + if ((0x3ff600000000000L & l) == 0L) { break; - if (kind > 76) + } + if (kind > 76) { kind = 76; + } jjstateSet[jjnewStateCnt++] = 13; break; case 15: - if (curChar == 43) + if (curChar == 43) { jjCheckNAdd(16); + } break; case 16: - if ((0x3ff000000000000L & l) == 0L) + if ((0x3ff000000000000L & l) == 0L) { break; - if (kind > 78) + } + if (kind > 78) { kind = 78; + } jjCheckNAdd(16); break; case 17: - if (curChar == 45) + if (curChar == 45) { jjCheckNAdd(18); + } break; case 18: - if ((0x3ff000000000000L & l) == 0L) + if ((0x3ff000000000000L & l) == 0L) { break; - if (kind > 79) + } + if (kind > 79) { kind = 79; + } jjCheckNAdd(18); break; case 19: - if ((0x280000000000L & l) != 0L) + if ((0x280000000000L & l) != 0L) { jjCheckNAddTwoStates(20, 21); + } break; case 20: - if ((0x3ff000000000000L & l) != 0L) + if ((0x3ff000000000000L & l) != 0L) { jjCheckNAddTwoStates(20, 21); + } break; case 21: - if (curChar == 46) + if (curChar == 46) { jjCheckNAdd(22); + } break; case 22: - if ((0x3ff000000000000L & l) == 0L) + if ((0x3ff000000000000L & l) == 0L) { break; - if (kind > 80) + } + if (kind > 80) { kind = 80; + } jjCheckNAdd(22); break; case 23: - if (curChar == 34) + if (curChar == 34) { jjCheckNAddStates(3, 11); + } break; case 24: - if ((0xfffffffbffffffffL & l) != 0L) + if ((0xfffffffbffffffffL & l) != 0L) { jjCheckNAddStates(17, 19); + } break; case 25: - if (curChar == 34) + if (curChar == 34) { jjstateSet[jjnewStateCnt++] = 26; + } break; case 28: - if (curChar == 45) + if (curChar == 45) { jjCheckNAdd(29); + } break; case 29: - if ((0x3ff000000000000L & l) == 0L) + if ((0x3ff000000000000L & l) == 0L) { break; - if (kind > 66) + } + if (kind > 66) { kind = 66; + } jjCheckNAddTwoStates(28, 29); break; case 31: - if (curChar == 9) + if (curChar == 9) { jjCheckNAddStates(17, 19); + } break; case 32: - if (curChar == 13) + if (curChar == 13) { jjCheckNAddStates(17, 19); + } break; case 33: - if (curChar == 10) + if (curChar == 10) { jjCheckNAddStates(17, 19); + } break; case 34: - if (curChar == 34) + if (curChar == 34) { jjCheckNAddStates(17, 19); + } break; case 37: - if ((0x3ff000000000000L & l) != 0L) + if ((0x3ff000000000000L & l) != 0L) { jjstateSet[jjnewStateCnt++] = 38; + } break; case 38: - if ((0x3ff000000000000L & l) != 0L) + if ((0x3ff000000000000L & l) != 0L) { jjstateSet[jjnewStateCnt++] = 39; + } break; case 39: - if ((0x3ff000000000000L & l) != 0L) + if ((0x3ff000000000000L & l) != 0L) { jjstateSet[jjnewStateCnt++] = 40; + } break; case 40: - if ((0x3ff000000000000L & l) != 0L) + if ((0x3ff000000000000L & l) != 0L) { jjstateSet[jjnewStateCnt++] = 41; + } break; case 41: - if ((0x3ff000000000000L & l) != 0L) + if ((0x3ff000000000000L & l) != 0L) { jjstateSet[jjnewStateCnt++] = 42; + } break; case 42: - if ((0x3ff000000000000L & l) != 0L) + if ((0x3ff000000000000L & l) != 0L) { jjstateSet[jjnewStateCnt++] = 43; + } break; case 43: case 48: - if ((0x3ff000000000000L & l) != 0L) + if ((0x3ff000000000000L & l) != 0L) { jjCheckNAdd(44); + } break; case 44: - if ((0x3ff000000000000L & l) != 0L) + if ((0x3ff000000000000L & l) != 0L) { jjCheckNAddStates(17, 19); + } break; case 46: - if ((0x3ff000000000000L & l) != 0L) + if ((0x3ff000000000000L & l) != 0L) { jjstateSet[jjnewStateCnt++] = 47; + } break; case 47: - if ((0x3ff000000000000L & l) != 0L) + if ((0x3ff000000000000L & l) != 0L) { jjstateSet[jjnewStateCnt++] = 48; + } break; case 49: - if ((0xfffffffbffffffffL & l) != 0L) + if ((0xfffffffbffffffffL & l) != 0L) { jjCheckNAddStates(20, 22); + } break; case 50: - if (curChar == 34) + if (curChar == 34) { jjstateSet[jjnewStateCnt++] = 64; + } break; case 52: - if (curChar == 60) + if (curChar == 60) { jjstateSet[jjnewStateCnt++] = 53; + } break; case 54: - if ((0x3ff680000000000L & l) != 0L) + if ((0x3ff680000000000L & l) != 0L) { jjAddStates(23, 24); + } break; case 55: - if (curChar == 58) + if (curChar == 58) { jjCheckNAdd(56); + } break; case 56: - if ((0xaffffffa00000000L & l) != 0L) + if ((0xaffffffa00000000L & l) != 0L) { jjCheckNAddTwoStates(56, 57); + } break; case 57: - if (curChar == 62 && kind > 67) + if (curChar == 62 && kind > 67) { kind = 67; + } break; case 59: - if ((0x3ff600000000000L & l) != 0L) + if ((0x3ff600000000000L & l) != 0L) { jjCheckNAddTwoStates(59, 60); + } break; case 60: - if (curChar != 58) + if (curChar != 58) { break; - if (kind > 67) + } + if (kind > 67) { kind = 67; + } jjCheckNAdd(61); break; case 61: - if ((0x3ff600000000000L & l) == 0L) + if ((0x3ff600000000000L & l) == 0L) { break; - if (kind > 67) + } + if (kind > 67) { kind = 67; + } jjCheckNAdd(61); break; case 63: - if ((0x3ff600000000000L & l) != 0L) + if ((0x3ff600000000000L & l) != 0L) { jjCheckNAddTwoStates(63, 60); + } break; case 66: - if (curChar == 9) + if (curChar == 9) { jjCheckNAddStates(20, 22); + } break; case 67: - if (curChar == 13) + if (curChar == 13) { jjCheckNAddStates(20, 22); + } break; case 68: - if (curChar == 10) + if (curChar == 10) { jjCheckNAddStates(20, 22); + } break; case 69: - if (curChar == 34) + if (curChar == 34) { jjCheckNAddStates(20, 22); + } break; case 72: - if ((0x3ff000000000000L & l) != 0L) + if ((0x3ff000000000000L & l) != 0L) { jjstateSet[jjnewStateCnt++] = 73; + } break; case 73: - if ((0x3ff000000000000L & l) != 0L) + if ((0x3ff000000000000L & l) != 0L) { jjstateSet[jjnewStateCnt++] = 74; + } break; case 74: - if ((0x3ff000000000000L & l) != 0L) + if ((0x3ff000000000000L & l) != 0L) { jjstateSet[jjnewStateCnt++] = 75; + } break; case 75: - if ((0x3ff000000000000L & l) != 0L) + if ((0x3ff000000000000L & l) != 0L) { jjstateSet[jjnewStateCnt++] = 76; + } break; case 76: - if ((0x3ff000000000000L & l) != 0L) + if ((0x3ff000000000000L & l) != 0L) { jjstateSet[jjnewStateCnt++] = 77; + } break; case 77: - if ((0x3ff000000000000L & l) != 0L) + if ((0x3ff000000000000L & l) != 0L) { jjstateSet[jjnewStateCnt++] = 78; + } break; case 78: case 83: - if ((0x3ff000000000000L & l) != 0L) + if ((0x3ff000000000000L & l) != 0L) { jjCheckNAdd(79); + } break; case 79: - if ((0x3ff000000000000L & l) != 0L) + if ((0x3ff000000000000L & l) != 0L) { jjCheckNAddStates(20, 22); + } break; case 81: - if ((0x3ff000000000000L & l) != 0L) + if ((0x3ff000000000000L & l) != 0L) { jjstateSet[jjnewStateCnt++] = 82; + } break; case 82: - if ((0x3ff000000000000L & l) != 0L) + if ((0x3ff000000000000L & l) != 0L) { jjstateSet[jjnewStateCnt++] = 83; + } break; case 84: - if ((0xfffffffbffffffffL & l) != 0L) + if ((0xfffffffbffffffffL & l) != 0L) { jjCheckNAddStates(25, 27); + } break; case 85: - if (curChar == 34 && kind > 68) + if (curChar == 34 && kind > 68) { kind = 68; + } break; case 87: - if (curChar == 9) + if (curChar == 9) { jjCheckNAddStates(25, 27); + } break; case 88: - if (curChar == 13) + if (curChar == 13) { jjCheckNAddStates(25, 27); + } break; case 89: - if (curChar == 10) + if (curChar == 10) { jjCheckNAddStates(25, 27); + } break; case 90: - if (curChar == 34) + if (curChar == 34) { jjCheckNAddStates(25, 27); + } break; case 93: - if ((0x3ff000000000000L & l) != 0L) + if ((0x3ff000000000000L & l) != 0L) { jjstateSet[jjnewStateCnt++] = 94; + } break; case 94: - if ((0x3ff000000000000L & l) != 0L) + if ((0x3ff000000000000L & l) != 0L) { jjstateSet[jjnewStateCnt++] = 95; + } break; case 95: - if ((0x3ff000000000000L & l) != 0L) + if ((0x3ff000000000000L & l) != 0L) { jjstateSet[jjnewStateCnt++] = 96; + } break; case 96: - if ((0x3ff000000000000L & l) != 0L) + if ((0x3ff000000000000L & l) != 0L) { jjstateSet[jjnewStateCnt++] = 97; + } break; case 97: - if ((0x3ff000000000000L & l) != 0L) + if ((0x3ff000000000000L & l) != 0L) { jjstateSet[jjnewStateCnt++] = 98; + } break; case 98: - if ((0x3ff000000000000L & l) != 0L) + if ((0x3ff000000000000L & l) != 0L) { jjstateSet[jjnewStateCnt++] = 99; + } break; case 99: case 104: - if ((0x3ff000000000000L & l) != 0L) + if ((0x3ff000000000000L & l) != 0L) { jjCheckNAdd(100); + } break; case 100: - if ((0x3ff000000000000L & l) != 0L) + if ((0x3ff000000000000L & l) != 0L) { jjCheckNAddStates(25, 27); + } break; case 102: - if ((0x3ff000000000000L & l) != 0L) + if ((0x3ff000000000000L & l) != 0L) { jjstateSet[jjnewStateCnt++] = 103; + } break; case 103: - if ((0x3ff000000000000L & l) != 0L) + if ((0x3ff000000000000L & l) != 0L) { jjstateSet[jjnewStateCnt++] = 104; + } break; case 106: - if ((0x3ff600000000000L & l) != 0L) + if ((0x3ff600000000000L & l) != 0L) { jjCheckNAddTwoStates(106, 107); + } break; case 107: - if (curChar != 58) + if (curChar != 58) { break; - if (kind > 75) + } + if (kind > 75) { kind = 75; + } jjCheckNAdd(108); break; case 108: - if ((0x3ff600000000000L & l) == 0L) + if ((0x3ff600000000000L & l) == 0L) { break; - if (kind > 75) + } + if (kind > 75) { kind = 75; + } jjCheckNAdd(108); break; case 109: - if ((0x3ff600000000000L & l) == 0L) + if ((0x3ff600000000000L & l) == 0L) { break; - if (kind > 77) + } + if (kind > 77) { kind = 77; + } jjCheckNAdd(109); break; case 111: - if ((0x3ff600000000000L & l) != 0L) + if ((0x3ff600000000000L & l) != 0L) { jjCheckNAddTwoStates(111, 107); + } break; case 112: - if ((0x3ff600000000000L & l) == 0L) + if ((0x3ff600000000000L & l) == 0L) { break; - if (kind > 77) + } + if (kind > 77) { kind = 77; + } jjstateSet[jjnewStateCnt++] = 112; break; case 113: - if ((0x3ff000000000000L & l) == 0L) + if ((0x3ff000000000000L & l) == 0L) { break; - if (kind > 78) + } + if (kind > 78) { kind = 78; + } jjCheckNAddStates(0, 2); break; default: @@ -1310,328 +1471,410 @@ else if (curChar == 43) switch (jjstateSet[--i]) { case 0: if ((0x7fffffe07fffffeL & l) != 0L) { - if (kind > 77) + if (kind > 77) { kind = 77; + } jjCheckNAddStates(28, 30); - } else if (curChar == 95) + } else if (curChar == 95) { jjCheckNAddTwoStates(111, 112); - if (curChar == 95) + } + if (curChar == 95) { jjstateSet[jjnewStateCnt++] = 11; + } break; case 114: if ((0x7fffffe87fffffeL & l) != 0L) { - if (kind > 77) + if (kind > 77) { kind = 77; + } jjCheckNAdd(109); } - if ((0x7fffffe87fffffeL & l) != 0L) + if ((0x7fffffe87fffffeL & l) != 0L) { jjCheckNAddTwoStates(106, 107); + } break; case 1: - if (kind > 5) + if (kind > 5) { kind = 5; + } jjAddStates(12, 14); break; case 6: case 7: - if ((0x7fffffe07fffffeL & l) != 0L) + if ((0x7fffffe07fffffeL & l) != 0L) { jjCheckNAddTwoStates(7, 8); + } break; case 9: - if ((0xc7fffffeafffffffL & l) != 0L) + if ((0xc7fffffeafffffffL & l) != 0L) { jjAddStates(31, 32); + } break; case 12: case 13: - if ((0x7fffffe87fffffeL & l) == 0L) + if ((0x7fffffe87fffffeL & l) == 0L) { break; - if (kind > 76) + } + if (kind > 76) { kind = 76; + } jjCheckNAdd(13); break; case 14: - if (curChar == 95) + if (curChar == 95) { jjstateSet[jjnewStateCnt++] = 11; + } break; case 24: - if ((0xffffffffefffffffL & l) != 0L) + if ((0xffffffffefffffffL & l) != 0L) { jjCheckNAddStates(17, 19); + } break; case 26: - if (curChar == 64) + if (curChar == 64) { jjCheckNAdd(27); + } break; case 27: - if ((0x7fffffe07fffffeL & l) == 0L) + if ((0x7fffffe07fffffeL & l) == 0L) { break; - if (kind > 66) + } + if (kind > 66) { kind = 66; + } jjCheckNAddTwoStates(27, 28); break; case 29: - if ((0x7fffffe07fffffeL & l) == 0L) + if ((0x7fffffe07fffffeL & l) == 0L) { break; - if (kind > 66) + } + if (kind > 66) { kind = 66; + } jjCheckNAddTwoStates(28, 29); break; case 30: - if (curChar == 92) + if (curChar == 92) { jjAddStates(33, 39); + } break; case 35: - if (curChar == 92) + if (curChar == 92) { jjCheckNAddStates(17, 19); + } break; case 36: - if ((0x20000000200000L & l) != 0L) + if ((0x20000000200000L & l) != 0L) { jjstateSet[jjnewStateCnt++] = 37; + } break; case 37: - if ((0x7e0000007eL & l) != 0L) + if ((0x7e0000007eL & l) != 0L) { jjstateSet[jjnewStateCnt++] = 38; + } break; case 38: - if ((0x7e0000007eL & l) != 0L) + if ((0x7e0000007eL & l) != 0L) { jjstateSet[jjnewStateCnt++] = 39; + } break; case 39: - if ((0x7e0000007eL & l) != 0L) + if ((0x7e0000007eL & l) != 0L) { jjstateSet[jjnewStateCnt++] = 40; + } break; case 40: - if ((0x7e0000007eL & l) != 0L) + if ((0x7e0000007eL & l) != 0L) { jjstateSet[jjnewStateCnt++] = 41; + } break; case 41: - if ((0x7e0000007eL & l) != 0L) + if ((0x7e0000007eL & l) != 0L) { jjstateSet[jjnewStateCnt++] = 42; + } break; case 42: - if ((0x7e0000007eL & l) != 0L) + if ((0x7e0000007eL & l) != 0L) { jjstateSet[jjnewStateCnt++] = 43; + } break; case 43: case 48: - if ((0x7e0000007eL & l) != 0L) + if ((0x7e0000007eL & l) != 0L) { jjCheckNAdd(44); + } break; case 44: - if ((0x7e0000007eL & l) != 0L) + if ((0x7e0000007eL & l) != 0L) { jjCheckNAddStates(17, 19); + } break; case 45: - if ((0x20000000200000L & l) != 0L) + if ((0x20000000200000L & l) != 0L) { jjstateSet[jjnewStateCnt++] = 46; + } break; case 46: - if ((0x7e0000007eL & l) != 0L) + if ((0x7e0000007eL & l) != 0L) { jjstateSet[jjnewStateCnt++] = 47; + } break; case 47: - if ((0x7e0000007eL & l) != 0L) + if ((0x7e0000007eL & l) != 0L) { jjstateSet[jjnewStateCnt++] = 48; + } break; case 49: - if ((0xffffffffefffffffL & l) != 0L) + if ((0xffffffffefffffffL & l) != 0L) { jjCheckNAddStates(20, 22); + } break; case 51: - if (curChar == 94) + if (curChar == 94) { jjAddStates(40, 42); + } break; case 53: case 54: - if ((0x7fffffe07fffffeL & l) != 0L) + if ((0x7fffffe07fffffeL & l) != 0L) { jjCheckNAddTwoStates(54, 55); + } break; case 56: - if ((0xc7fffffeafffffffL & l) != 0L) + if ((0xc7fffffeafffffffL & l) != 0L) { jjAddStates(43, 44); + } break; case 58: - if ((0x7fffffe07fffffeL & l) != 0L) + if ((0x7fffffe07fffffeL & l) != 0L) { jjCheckNAddTwoStates(59, 60); + } break; case 59: - if ((0x7fffffe87fffffeL & l) != 0L) + if ((0x7fffffe87fffffeL & l) != 0L) { jjCheckNAddTwoStates(59, 60); + } break; case 61: - if ((0x7fffffe87fffffeL & l) == 0L) + if ((0x7fffffe87fffffeL & l) == 0L) { break; - if (kind > 67) + } + if (kind > 67) { kind = 67; + } jjstateSet[jjnewStateCnt++] = 61; break; case 62: - if (curChar == 95) + if (curChar == 95) { jjCheckNAdd(63); + } break; case 63: - if ((0x7fffffe87fffffeL & l) != 0L) + if ((0x7fffffe87fffffeL & l) != 0L) { jjCheckNAddTwoStates(63, 60); + } break; case 64: - if (curChar == 94) + if (curChar == 94) { jjstateSet[jjnewStateCnt++] = 51; + } break; case 65: - if (curChar == 92) + if (curChar == 92) { jjAddStates(45, 51); + } break; case 70: - if (curChar == 92) + if (curChar == 92) { jjCheckNAddStates(20, 22); + } break; case 71: - if ((0x20000000200000L & l) != 0L) + if ((0x20000000200000L & l) != 0L) { jjstateSet[jjnewStateCnt++] = 72; + } break; case 72: - if ((0x7e0000007eL & l) != 0L) + if ((0x7e0000007eL & l) != 0L) { jjstateSet[jjnewStateCnt++] = 73; + } break; case 73: - if ((0x7e0000007eL & l) != 0L) + if ((0x7e0000007eL & l) != 0L) { jjstateSet[jjnewStateCnt++] = 74; + } break; case 74: - if ((0x7e0000007eL & l) != 0L) + if ((0x7e0000007eL & l) != 0L) { jjstateSet[jjnewStateCnt++] = 75; + } break; case 75: - if ((0x7e0000007eL & l) != 0L) + if ((0x7e0000007eL & l) != 0L) { jjstateSet[jjnewStateCnt++] = 76; + } break; case 76: - if ((0x7e0000007eL & l) != 0L) + if ((0x7e0000007eL & l) != 0L) { jjstateSet[jjnewStateCnt++] = 77; + } break; case 77: - if ((0x7e0000007eL & l) != 0L) + if ((0x7e0000007eL & l) != 0L) { jjstateSet[jjnewStateCnt++] = 78; + } break; case 78: case 83: - if ((0x7e0000007eL & l) != 0L) + if ((0x7e0000007eL & l) != 0L) { jjCheckNAdd(79); + } break; case 79: - if ((0x7e0000007eL & l) != 0L) + if ((0x7e0000007eL & l) != 0L) { jjCheckNAddStates(20, 22); + } break; case 80: - if ((0x20000000200000L & l) != 0L) + if ((0x20000000200000L & l) != 0L) { jjstateSet[jjnewStateCnt++] = 81; + } break; case 81: - if ((0x7e0000007eL & l) != 0L) + if ((0x7e0000007eL & l) != 0L) { jjstateSet[jjnewStateCnt++] = 82; + } break; case 82: - if ((0x7e0000007eL & l) != 0L) + if ((0x7e0000007eL & l) != 0L) { jjstateSet[jjnewStateCnt++] = 83; + } break; case 84: - if ((0xffffffffefffffffL & l) != 0L) + if ((0xffffffffefffffffL & l) != 0L) { jjCheckNAddStates(25, 27); + } break; case 86: - if (curChar == 92) + if (curChar == 92) { jjAddStates(52, 58); + } break; case 91: - if (curChar == 92) + if (curChar == 92) { jjCheckNAddStates(25, 27); + } break; case 92: - if ((0x20000000200000L & l) != 0L) + if ((0x20000000200000L & l) != 0L) { jjstateSet[jjnewStateCnt++] = 93; + } break; case 93: - if ((0x7e0000007eL & l) != 0L) + if ((0x7e0000007eL & l) != 0L) { jjstateSet[jjnewStateCnt++] = 94; + } break; case 94: - if ((0x7e0000007eL & l) != 0L) + if ((0x7e0000007eL & l) != 0L) { jjstateSet[jjnewStateCnt++] = 95; + } break; case 95: - if ((0x7e0000007eL & l) != 0L) + if ((0x7e0000007eL & l) != 0L) { jjstateSet[jjnewStateCnt++] = 96; + } break; case 96: - if ((0x7e0000007eL & l) != 0L) + if ((0x7e0000007eL & l) != 0L) { jjstateSet[jjnewStateCnt++] = 97; + } break; case 97: - if ((0x7e0000007eL & l) != 0L) + if ((0x7e0000007eL & l) != 0L) { jjstateSet[jjnewStateCnt++] = 98; + } break; case 98: - if ((0x7e0000007eL & l) != 0L) + if ((0x7e0000007eL & l) != 0L) { jjstateSet[jjnewStateCnt++] = 99; + } break; case 99: case 104: - if ((0x7e0000007eL & l) != 0L) + if ((0x7e0000007eL & l) != 0L) { jjCheckNAdd(100); + } break; case 100: - if ((0x7e0000007eL & l) != 0L) + if ((0x7e0000007eL & l) != 0L) { jjCheckNAddStates(25, 27); + } break; case 101: - if ((0x20000000200000L & l) != 0L) + if ((0x20000000200000L & l) != 0L) { jjstateSet[jjnewStateCnt++] = 102; + } break; case 102: - if ((0x7e0000007eL & l) != 0L) + if ((0x7e0000007eL & l) != 0L) { jjstateSet[jjnewStateCnt++] = 103; + } break; case 103: - if ((0x7e0000007eL & l) != 0L) + if ((0x7e0000007eL & l) != 0L) { jjstateSet[jjnewStateCnt++] = 104; + } break; case 105: - if ((0x7fffffe07fffffeL & l) == 0L) + if ((0x7fffffe07fffffeL & l) == 0L) { break; - if (kind > 77) + } + if (kind > 77) { kind = 77; + } jjCheckNAddStates(28, 30); break; case 106: - if ((0x7fffffe87fffffeL & l) != 0L) + if ((0x7fffffe87fffffeL & l) != 0L) { jjCheckNAddTwoStates(106, 107); + } break; case 108: - if ((0x7fffffe87fffffeL & l) == 0L) + if ((0x7fffffe87fffffeL & l) == 0L) { break; - if (kind > 75) + } + if (kind > 75) { kind = 75; + } jjstateSet[jjnewStateCnt++] = 108; break; case 109: - if ((0x7fffffe87fffffeL & l) == 0L) + if ((0x7fffffe87fffffeL & l) == 0L) { break; - if (kind > 77) + } + if (kind > 77) { kind = 77; + } jjCheckNAdd(109); break; case 110: - if (curChar == 95) + if (curChar == 95) { jjCheckNAddTwoStates(111, 112); + } break; case 111: - if ((0x7fffffe87fffffeL & l) != 0L) + if ((0x7fffffe87fffffeL & l) != 0L) { jjCheckNAddTwoStates(111, 107); + } break; case 112: - if ((0x7fffffe87fffffeL & l) == 0L) + if ((0x7fffffe87fffffeL & l) == 0L) { break; - if (kind > 77) + } + if (kind > 77) { kind = 77; + } jjCheckNAdd(112); break; default: @@ -1647,116 +1890,146 @@ else if (curChar == 43) do { switch (jjstateSet[--i]) { case 0: - if (!jjCanMove_2(hiByte, i1, i2, l1, l2)) + if (!jjCanMove_2(hiByte, i1, i2, l1, l2)) { break; - if (kind > 77) + } + if (kind > 77) { kind = 77; + } jjCheckNAddStates(28, 30); break; case 114: - if (jjCanMove_3(hiByte, i1, i2, l1, l2)) + if (jjCanMove_3(hiByte, i1, i2, l1, l2)) { jjCheckNAddTwoStates(106, 107); + } if (jjCanMove_3(hiByte, i1, i2, l1, l2)) { - if (kind > 77) + if (kind > 77) { kind = 77; + } jjCheckNAdd(109); } break; case 1: - if (!jjCanMove_0(hiByte, i1, i2, l1, l2)) + if (!jjCanMove_0(hiByte, i1, i2, l1, l2)) { break; - if (kind > 5) + } + if (kind > 5) { kind = 5; + } jjAddStates(12, 14); break; case 7: - if (jjCanMove_1(hiByte, i1, i2, l1, l2)) + if (jjCanMove_1(hiByte, i1, i2, l1, l2)) { jjAddStates(15, 16); + } break; case 9: - if (jjCanMove_0(hiByte, i1, i2, l1, l2)) + if (jjCanMove_0(hiByte, i1, i2, l1, l2)) { jjAddStates(31, 32); + } break; case 12: - if (!jjCanMove_2(hiByte, i1, i2, l1, l2)) + if (!jjCanMove_2(hiByte, i1, i2, l1, l2)) { break; - if (kind > 76) + } + if (kind > 76) { kind = 76; + } jjCheckNAdd(13); break; case 13: - if (!jjCanMove_3(hiByte, i1, i2, l1, l2)) + if (!jjCanMove_3(hiByte, i1, i2, l1, l2)) { break; - if (kind > 76) + } + if (kind > 76) { kind = 76; + } jjCheckNAdd(13); break; case 24: - if (jjCanMove_0(hiByte, i1, i2, l1, l2)) + if (jjCanMove_0(hiByte, i1, i2, l1, l2)) { jjAddStates(17, 19); + } break; case 49: - if (jjCanMove_0(hiByte, i1, i2, l1, l2)) + if (jjCanMove_0(hiByte, i1, i2, l1, l2)) { jjAddStates(20, 22); + } break; case 54: - if (jjCanMove_1(hiByte, i1, i2, l1, l2)) + if (jjCanMove_1(hiByte, i1, i2, l1, l2)) { jjAddStates(23, 24); + } break; case 56: - if (jjCanMove_0(hiByte, i1, i2, l1, l2)) + if (jjCanMove_0(hiByte, i1, i2, l1, l2)) { jjAddStates(43, 44); + } break; case 58: - if (jjCanMove_2(hiByte, i1, i2, l1, l2)) + if (jjCanMove_2(hiByte, i1, i2, l1, l2)) { jjCheckNAddTwoStates(59, 60); + } break; case 59: - if (jjCanMove_3(hiByte, i1, i2, l1, l2)) + if (jjCanMove_3(hiByte, i1, i2, l1, l2)) { jjCheckNAddTwoStates(59, 60); + } break; case 61: - if (!jjCanMove_3(hiByte, i1, i2, l1, l2)) + if (!jjCanMove_3(hiByte, i1, i2, l1, l2)) { break; - if (kind > 67) + } + if (kind > 67) { kind = 67; + } jjstateSet[jjnewStateCnt++] = 61; break; case 63: - if (jjCanMove_3(hiByte, i1, i2, l1, l2)) + if (jjCanMove_3(hiByte, i1, i2, l1, l2)) { jjCheckNAddTwoStates(63, 60); + } break; case 84: - if (jjCanMove_0(hiByte, i1, i2, l1, l2)) + if (jjCanMove_0(hiByte, i1, i2, l1, l2)) { jjAddStates(25, 27); + } break; case 106: - if (jjCanMove_3(hiByte, i1, i2, l1, l2)) + if (jjCanMove_3(hiByte, i1, i2, l1, l2)) { jjCheckNAddTwoStates(106, 107); + } break; case 108: - if (!jjCanMove_3(hiByte, i1, i2, l1, l2)) + if (!jjCanMove_3(hiByte, i1, i2, l1, l2)) { break; - if (kind > 75) + } + if (kind > 75) { kind = 75; + } jjstateSet[jjnewStateCnt++] = 108; break; case 109: - if (!jjCanMove_3(hiByte, i1, i2, l1, l2)) + if (!jjCanMove_3(hiByte, i1, i2, l1, l2)) { break; - if (kind > 77) + } + if (kind > 77) { kind = 77; + } jjCheckNAdd(109); break; case 111: - if (jjCanMove_3(hiByte, i1, i2, l1, l2)) + if (jjCanMove_3(hiByte, i1, i2, l1, l2)) { jjCheckNAddTwoStates(111, 107); + } break; case 112: - if (!jjCanMove_3(hiByte, i1, i2, l1, l2)) + if (!jjCanMove_3(hiByte, i1, i2, l1, l2)) { break; - if (kind > 77) + } + if (kind > 77) { kind = 77; + } jjstateSet[jjnewStateCnt++] = 112; break; default: @@ -1770,8 +2043,9 @@ else if (curChar == 43) kind = 0x7fffffff; } ++curPos; - if ((i = jjnewStateCnt) == (startsAt = 114 - (jjnewStateCnt = startsAt))) + if ((i = jjnewStateCnt) == (startsAt = 114 - (jjnewStateCnt = startsAt))) { return curPos; + } try { curChar = input_stream.readChar(); } catch (java.io.IOException e) { @@ -1789,8 +2063,9 @@ private static final boolean jjCanMove_0(int hiByte, int i1, int i2, long l1, lo case 0: return ((jjbitVec2[i2] & l2) != 0L); default: - if ((jjbitVec0[i1] & l1) != 0L) + if ((jjbitVec0[i1] & l1) != 0L) { return true; + } return false; } } @@ -1808,11 +2083,13 @@ private static final boolean jjCanMove_1(int hiByte, int i1, int i2, long l1, lo case 15: return ((jjbitVec9[i2] & l2) != 0L); default: - if ((jjbitVec3[i1] & l1) != 0L) - if ((jjbitVec4[i2] & l2) == 0L) + if ((jjbitVec3[i1] & l1) != 0L) { + if ((jjbitVec4[i2] & l2) == 0L) { return false; - else + } else { return true; + } + } return false; } } @@ -1866,8 +2143,9 @@ private static final boolean jjCanMove_2(int hiByte, int i1, int i2, long l1, lo case 215: return ((jjbitVec33[i2] & l2) != 0L); default: - if ((jjbitVec10[i1] & l1) != 0L) + if ((jjbitVec10[i1] & l1) != 0L) { return true; + } return false; } } @@ -1923,8 +2201,9 @@ private static final boolean jjCanMove_3(int hiByte, int i1, int i2, long l1, lo case 215: return ((jjbitVec33[i2] & l2) != 0L); default: - if ((jjbitVec10[i1] & l1) != 0L) + if ((jjbitVec10[i1] & l1) != 0L) { return true; + } return false; } } @@ -1956,8 +2235,9 @@ private static final boolean jjCanMove_3(int hiByte, int i1, int i2, long l1, lo /** Constructor. */ public SyntaxTreeBuilderTokenManager(SimpleCharStream stream) { - if (SimpleCharStream.staticFlag) + if (SimpleCharStream.staticFlag) { throw new Error("ERROR: Cannot use a static CharStream class with a non-static lexical analyzer."); + } input_stream = stream; } @@ -1978,8 +2258,9 @@ public void ReInit(SimpleCharStream stream) { private void ReInitRounds() { int i; jjround = 0x80000001; - for (i = 114; i-- > 0;) + for (i = 114; i-- > 0;) { jjrounds[i] = 0x80000000; + } } /** Reinitialise parser. */ @@ -1990,11 +2271,12 @@ public void ReInit(SimpleCharStream stream, int lexState) { /** Switch to specified lex state. */ public void SwitchTo(int lexState) { - if (lexState >= 1 || lexState < 0) + if (lexState >= 1 || lexState < 0) { throw new TokenMgrError("Error: Ignoring invalid lexical state : " + lexState + ". State unchanged.", TokenMgrError.INVALID_LEXICAL_STATE); - else + } else { curLexState = lexState; + } } protected Token jjFillToken() { @@ -2050,8 +2332,9 @@ public Token getNextToken() { try { input_stream.backup(0); - while (curChar <= 32 && (0x100002600L & (1L << curChar)) != 0L) + while (curChar <= 32 && (0x100002600L & (1L << curChar)) != 0L) { curChar = input_stream.BeginToken(); + } } catch (java.io.IOException e1) { continue EOFLoop; } @@ -2059,8 +2342,9 @@ public Token getNextToken() { jjmatchedPos = 0; curPos = jjMoveStringLiteralDfa0_0(); if (jjmatchedKind != 0x7fffffff) { - if (jjmatchedPos + 1 < curPos) + if (jjmatchedPos + 1 < curPos) { input_stream.backup(curPos - jjmatchedPos - 1); + } if ((jjtoToken[jjmatchedKind >> 6] & (1L << (jjmatchedKind & 077))) != 0L) { matchedToken = jjFillToken(); matchedToken.specialToken = specialToken; @@ -2068,9 +2352,9 @@ public Token getNextToken() { } else { if ((jjtoSpecial[jjmatchedKind >> 6] & (1L << (jjmatchedKind & 077))) != 0L) { matchedToken = jjFillToken(); - if (specialToken == null) + if (specialToken == null) { specialToken = matchedToken; - else { + } else { matchedToken.specialToken = specialToken; specialToken = (specialToken.next = matchedToken); } @@ -2091,8 +2375,9 @@ public Token getNextToken() { if (curChar == '\n' || curChar == '\r') { error_line++; error_column = 0; - } else + } else { error_column++; + } } if (!EOFSeen) { input_stream.backup(1); diff --git a/core/queryparser/sparql/pom.xml b/core/queryparser/sparql/pom.xml index dc6ef2b5120..079bcf86a3f 100644 --- a/core/queryparser/sparql/pom.xml +++ b/core/queryparser/sparql/pom.xml @@ -4,7 +4,7 @@ org.eclipse.rdf4j rdf4j-queryparser - 3.1.5-SNAPSHOT + 3.2.2-SNAPSHOT rdf4j-queryparser-sparql RDF4J: Query parser - SPARQL diff --git a/core/queryparser/sparql/src/main/java/org/eclipse/rdf4j/query/parser/sparql/AbstractASTVisitor.java b/core/queryparser/sparql/src/main/java/org/eclipse/rdf4j/query/parser/sparql/AbstractASTVisitor.java index 05f782cdf5f..1cfa06468ac 100644 --- a/core/queryparser/sparql/src/main/java/org/eclipse/rdf4j/query/parser/sparql/AbstractASTVisitor.java +++ b/core/queryparser/sparql/src/main/java/org/eclipse/rdf4j/query/parser/sparql/AbstractASTVisitor.java @@ -7,11 +7,158 @@ *******************************************************************************/ package org.eclipse.rdf4j.query.parser.sparql; -import org.eclipse.rdf4j.query.parser.sparql.ast.*; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTAbs; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTAdd; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTAnd; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTAskQuery; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTAvg; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTBNodeFunc; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTBaseDecl; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTBasicGraphPattern; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTBind; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTBindingSet; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTBindingValue; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTBindingsClause; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTBlankNode; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTBlankNodePropertyList; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTBound; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTCeil; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTClear; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTCoalesce; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTCollection; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTCompare; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTConcat; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTConstTripleRef; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTConstraint; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTConstruct; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTConstructQuery; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTContains; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTCopy; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTCount; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTCreate; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTDatasetClause; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTDatatype; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTDay; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTDeleteClause; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTDeleteData; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTDeleteWhere; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTDescribe; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTDescribeQuery; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTDrop; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTEncodeForURI; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTExistsFunc; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTFalse; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTFloor; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTFunctionCall; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTGraphGraphPattern; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTGraphOrDefault; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTGraphPatternGroup; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTGraphRefAll; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTGroupClause; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTGroupConcat; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTGroupCondition; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTHavingClause; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTHours; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTIRI; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTIRIFunc; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTIf; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTIn; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTInfix; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTInlineData; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTInsertClause; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTInsertData; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTIsBlank; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTIsIRI; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTIsLiteral; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTIsNumeric; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTLang; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTLangMatches; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTLimit; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTLoad; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTLowerCase; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTMD5; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTMath; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTMax; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTMin; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTMinusGraphPattern; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTMinutes; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTModify; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTMonth; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTMove; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTNot; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTNotExistsFunc; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTNotIn; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTNow; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTNumericLiteral; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTObjectList; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTOffset; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTOptionalGraphPattern; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTOr; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTOrderClause; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTOrderCondition; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTPathAlternative; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTPathElt; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTPathMod; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTPathOneInPropertySet; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTPathSequence; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTPrefixDecl; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTProjectionElem; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTPropertyList; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTPropertyListPath; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTQName; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTQuadsNotTriples; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTQueryContainer; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTRDFLiteral; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTRand; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTRegexExpression; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTReplace; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTRound; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTSHA1; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTSHA224; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTSHA256; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTSHA384; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTSHA512; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTSTRUUID; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTSameTerm; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTSample; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTSeconds; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTSelect; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTSelectQuery; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTServiceGraphPattern; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTStr; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTStrAfter; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTStrBefore; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTStrDt; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTStrEnds; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTStrLang; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTStrLen; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTStrStarts; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTString; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTSubstr; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTSum; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTTimezone; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTTripleRef; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTTriplesSameSubject; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTTriplesSameSubjectPath; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTTrue; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTTz; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTUUID; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTUnionGraphPattern; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTUnparsedQuadDataBlock; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTUpdate; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTUpdateContainer; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTUpdateSequence; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTUpperCase; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTVar; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTWhereClause; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTYear; +import org.eclipse.rdf4j.query.parser.sparql.ast.SimpleNode; +import org.eclipse.rdf4j.query.parser.sparql.ast.SyntaxTreeBuilderVisitor; +import org.eclipse.rdf4j.query.parser.sparql.ast.VisitorException; /** * Base class for visitors of the SPARQL AST. - * + * * @author arjohn */ public abstract class AbstractASTVisitor implements SyntaxTreeBuilderVisitor { @@ -735,4 +882,13 @@ public Object visit(SimpleNode node, Object data) throws VisitorException { return node.childrenAccept(this, data); } + @Override + public Object visit(ASTTripleRef node, Object data) throws VisitorException { + return node.childrenAccept(this, data); + } + + @Override + public Object visit(ASTConstTripleRef node, Object data) throws VisitorException { + return node.childrenAccept(this, data); + } } diff --git a/core/queryparser/sparql/src/main/java/org/eclipse/rdf4j/query/parser/sparql/BaseDeclProcessor.java b/core/queryparser/sparql/src/main/java/org/eclipse/rdf4j/query/parser/sparql/BaseDeclProcessor.java index 7bc6d30d294..56fb338773b 100644 --- a/core/queryparser/sparql/src/main/java/org/eclipse/rdf4j/query/parser/sparql/BaseDeclProcessor.java +++ b/core/queryparser/sparql/src/main/java/org/eclipse/rdf4j/query/parser/sparql/BaseDeclProcessor.java @@ -25,9 +25,9 @@ /** * Resolves relative URIs in a query model using either an external base URI or using the base URI specified in the * query model itself. The former takes precedence over the latter. - * + * * @author Arjohn Kampman - * + * * @deprecated since 3.0. This feature is for internal use only: its existence, signature or behavior may change without * warning from one release to the next. */ @@ -38,7 +38,7 @@ public class BaseDeclProcessor { /** * Resolves relative URIs in the supplied query model using either the specified externalBaseURI or, if * this parameter is null, the base URI specified in the query model itself. - * + * * @param qc The query model to resolve relative URIs in. * @param externalBaseURI The external base URI to use for resolving relative URIs, or null if the base URI * that is specified in the query model should be used. diff --git a/core/queryparser/sparql/src/main/java/org/eclipse/rdf4j/query/parser/sparql/BlankNodeVarProcessor.java b/core/queryparser/sparql/src/main/java/org/eclipse/rdf4j/query/parser/sparql/BlankNodeVarProcessor.java index 3d40b5a8f67..a2a49c1057c 100644 --- a/core/queryparser/sparql/src/main/java/org/eclipse/rdf4j/query/parser/sparql/BlankNodeVarProcessor.java +++ b/core/queryparser/sparql/src/main/java/org/eclipse/rdf4j/query/parser/sparql/BlankNodeVarProcessor.java @@ -26,9 +26,9 @@ /** * Processes blank nodes in the query body, replacing them with variables while retaining scope. - * + * * @author Arjohn Kampman - * + * * @deprecated since 3.0. This feature is for internal use only: its existence, signature or behavior may change without * warning from one release to the next. */ @@ -101,11 +101,13 @@ public Object visit(ASTBlankNode node, Object data) throws VisitorException { } private String findVarName(String bnodeID) throws VisitorException { - if (bnodeID == null) + if (bnodeID == null) { return null; + } String varName = conversionMap.get(bnodeID); - if (varName == null && usedBNodeIDs.contains(bnodeID)) + if (varName == null && usedBNodeIDs.contains(bnodeID)) { throw new VisitorException("BNodeID already used in another scope: " + bnodeID); + } return varName; } diff --git a/core/queryparser/sparql/src/main/java/org/eclipse/rdf4j/query/parser/sparql/ConstructorBuilder.java b/core/queryparser/sparql/src/main/java/org/eclipse/rdf4j/query/parser/sparql/ConstructorBuilder.java index e5014d0435b..96e38f1d002 100644 --- a/core/queryparser/sparql/src/main/java/org/eclipse/rdf4j/query/parser/sparql/ConstructorBuilder.java +++ b/core/queryparser/sparql/src/main/java/org/eclipse/rdf4j/query/parser/sparql/ConstructorBuilder.java @@ -40,7 +40,7 @@ import org.eclipse.rdf4j.query.algebra.helpers.StatementPatternCollector; /** - * + * * @deprecated since 3.0. This feature is for internal use only: its existence, signature or behavior may change without * warning from one release to the next. */ diff --git a/core/queryparser/sparql/src/main/java/org/eclipse/rdf4j/query/parser/sparql/DatasetDeclProcessor.java b/core/queryparser/sparql/src/main/java/org/eclipse/rdf4j/query/parser/sparql/DatasetDeclProcessor.java index 37f6f46be58..bdb8be333d5 100644 --- a/core/queryparser/sparql/src/main/java/org/eclipse/rdf4j/query/parser/sparql/DatasetDeclProcessor.java +++ b/core/queryparser/sparql/src/main/java/org/eclipse/rdf4j/query/parser/sparql/DatasetDeclProcessor.java @@ -23,10 +23,10 @@ /** * Extracts a SPARQL {@link Dataset} from an ASTQueryContainer, if one is contained. - * + * * @author Simon Schenk * @author Arjohn Kampman - * + * * @deprecated since 3.0. This feature is for internal use only: its existence, signature or behavior may change without * warning from one release to the next. */ @@ -35,7 +35,7 @@ public class DatasetDeclProcessor { /** * Extracts a SPARQL {@link Dataset} from an ASTQueryContainer, if one is contained. Returns null otherwise. - * + * * @param qc The query model to resolve relative URIs in. * @throws MalformedQueryException If DatasetClause does not contain a valid URI. */ diff --git a/core/queryparser/sparql/src/main/java/org/eclipse/rdf4j/query/parser/sparql/GraphPattern.java b/core/queryparser/sparql/src/main/java/org/eclipse/rdf4j/query/parser/sparql/GraphPattern.java index f10dc443aba..d80f74421ea 100644 --- a/core/queryparser/sparql/src/main/java/org/eclipse/rdf4j/query/parser/sparql/GraphPattern.java +++ b/core/queryparser/sparql/src/main/java/org/eclipse/rdf4j/query/parser/sparql/GraphPattern.java @@ -27,9 +27,9 @@ /** * A graph pattern consisting of (required and optional) tuple expressions, binding assignments and boolean constraints. - * + * * @author Arjohn Kampman - * + * * @deprecated since 3.0. This feature is for internal use only: its existence, signature or behavior may change without * warning from one release to the next. */ @@ -107,7 +107,7 @@ public List getRequiredTEs() { /** * add the supplied tuple expression as an optional expression, with a list of constraints that hold as conditions. - * + * * @param te a tuple expression * @param constraints a list of constraints that form a condition for the LeftJoin to be formed from the optional * TE. @@ -121,7 +121,7 @@ public void addOptionalTE(TupleExpr te, List constraints) { /** * Retrieves the optional tuple expressions as a list of tuples with the tuple expression as the key and the list of * value expressions as the value. - * + * * @return a list of Map entries. */ public List>> getOptionalTEs() { @@ -157,7 +157,7 @@ public void clear() { /** * Builds a combined tuple expression from the tuple expressions and constraints in this graph pattern. - * + * * @return A tuple expression for this graph pattern. */ public TupleExpr buildTupleExpr() { diff --git a/core/queryparser/sparql/src/main/java/org/eclipse/rdf4j/query/parser/sparql/NegatedPropertySet.java b/core/queryparser/sparql/src/main/java/org/eclipse/rdf4j/query/parser/sparql/NegatedPropertySet.java index caaa276ad85..5941afcb2bf 100644 --- a/core/queryparser/sparql/src/main/java/org/eclipse/rdf4j/query/parser/sparql/NegatedPropertySet.java +++ b/core/queryparser/sparql/src/main/java/org/eclipse/rdf4j/query/parser/sparql/NegatedPropertySet.java @@ -19,9 +19,9 @@ * A negated property set is a SPARQL construction of the form {?X !(uri|^uri) ?Y}. This class is a temporary * representation used by the parser. It is converted by the TupleExprBuilder into a set of joins and filters on regular * statement patterns. - * + * * @author Jeen - * + * * @deprecated since 3.0. This feature is for internal use only: its existence, signature or behavior may change without * warning from one release to the next. */ diff --git a/core/queryparser/sparql/src/main/java/org/eclipse/rdf4j/query/parser/sparql/PrefixDeclProcessor.java b/core/queryparser/sparql/src/main/java/org/eclipse/rdf4j/query/parser/sparql/PrefixDeclProcessor.java index 524eca90469..35cdf7539a0 100644 --- a/core/queryparser/sparql/src/main/java/org/eclipse/rdf4j/query/parser/sparql/PrefixDeclProcessor.java +++ b/core/queryparser/sparql/src/main/java/org/eclipse/rdf4j/query/parser/sparql/PrefixDeclProcessor.java @@ -35,9 +35,9 @@ /** * Processes the prefix declarations in a SPARQL query model. - * + * * @author Arjohn Kampman - * + * * @deprecated since 3.0. This feature is for internal use only: its existence, signature or behavior may change without * warning from one release to the next. */ @@ -49,7 +49,7 @@ public class PrefixDeclProcessor { * Processes prefix declarations in queries. This method collects all prefixes that are declared in the supplied * query, verifies that prefixes are not redefined and replaces any {@link ASTQName} nodes in the query with * equivalent {@link ASTIRI} nodes. - * + * * @param qc The query that needs to be processed. * @return A map containing the prefixes that are declared in the query (key) and the namespace they map to (value). * @throws MalformedQueryException If the query contains redefined prefixes or qnames that use undefined prefixes. diff --git a/core/queryparser/sparql/src/main/java/org/eclipse/rdf4j/query/parser/sparql/PropertySetElem.java b/core/queryparser/sparql/src/main/java/org/eclipse/rdf4j/query/parser/sparql/PropertySetElem.java index 53d454290e0..a1f84c61c69 100644 --- a/core/queryparser/sparql/src/main/java/org/eclipse/rdf4j/query/parser/sparql/PropertySetElem.java +++ b/core/queryparser/sparql/src/main/java/org/eclipse/rdf4j/query/parser/sparql/PropertySetElem.java @@ -11,7 +11,7 @@ /** * @author Jeen - * + * * @deprecated since 3.0. This feature is for internal use only: its existence, signature or behavior may change without * warning from one release to the next. */ diff --git a/core/queryparser/sparql/src/main/java/org/eclipse/rdf4j/query/parser/sparql/SPARQLParserFactory.java b/core/queryparser/sparql/src/main/java/org/eclipse/rdf4j/query/parser/sparql/SPARQLParserFactory.java index 7e555b145bf..5111d4f405c 100644 --- a/core/queryparser/sparql/src/main/java/org/eclipse/rdf4j/query/parser/sparql/SPARQLParserFactory.java +++ b/core/queryparser/sparql/src/main/java/org/eclipse/rdf4j/query/parser/sparql/SPARQLParserFactory.java @@ -13,7 +13,7 @@ /** * A {@link QueryParserFactory} for SPARQL parsers. - * + * * @author Arjohn Kampman */ public class SPARQLParserFactory implements QueryParserFactory { diff --git a/core/queryparser/sparql/src/main/java/org/eclipse/rdf4j/query/parser/sparql/SPARQLUtil.java b/core/queryparser/sparql/src/main/java/org/eclipse/rdf4j/query/parser/sparql/SPARQLUtil.java index a8fb1666d58..65620f3779f 100644 --- a/core/queryparser/sparql/src/main/java/org/eclipse/rdf4j/query/parser/sparql/SPARQLUtil.java +++ b/core/queryparser/sparql/src/main/java/org/eclipse/rdf4j/query/parser/sparql/SPARQLUtil.java @@ -11,7 +11,7 @@ /** * SPARQL-related utility methods. - * + * * @author Arjohn Kampman */ public class SPARQLUtil { @@ -33,7 +33,7 @@ public static String encodeString(String s) { /** * Decodes an encoded SPARQL string. Any \-escape sequences are substituted with their decoded value. - * + * * @param s An encoded SPARQL string. * @return The unencoded string. * @exception IllegalArgumentException If the supplied string is not a correctly encoded SPARQL string. diff --git a/core/queryparser/sparql/src/main/java/org/eclipse/rdf4j/query/parser/sparql/StringEscapesProcessor.java b/core/queryparser/sparql/src/main/java/org/eclipse/rdf4j/query/parser/sparql/StringEscapesProcessor.java index da9e0934a30..7026db93bc0 100644 --- a/core/queryparser/sparql/src/main/java/org/eclipse/rdf4j/query/parser/sparql/StringEscapesProcessor.java +++ b/core/queryparser/sparql/src/main/java/org/eclipse/rdf4j/query/parser/sparql/StringEscapesProcessor.java @@ -17,9 +17,9 @@ * Processes escape sequences in strings, replacing the escape sequence with their actual value. Escape sequences for * SPARQL are documented in section A.7 Escape sequences * in strings. - * + * * @author Arjohn Kampman - * + * * @deprecated since 3.0. This feature is for internal use only: its existence, signature or behavior may change without * warning from one release to the next. */ @@ -29,7 +29,7 @@ public class StringEscapesProcessor { /** * Processes escape sequences in ASTString objects. - * + * * @param qc The query that needs to be processed. * @throws MalformedQueryException If an invalid escape sequence was found. */ diff --git a/core/queryparser/sparql/src/main/java/org/eclipse/rdf4j/query/parser/sparql/TripleRefCollector.java b/core/queryparser/sparql/src/main/java/org/eclipse/rdf4j/query/parser/sparql/TripleRefCollector.java new file mode 100644 index 00000000000..3976b275eac --- /dev/null +++ b/core/queryparser/sparql/src/main/java/org/eclipse/rdf4j/query/parser/sparql/TripleRefCollector.java @@ -0,0 +1,60 @@ +/******************************************************************************* + * Copyright (c) 2020 Eclipse RDF4J contributors. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Distribution License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ +package org.eclipse.rdf4j.query.parser.sparql; + +import java.util.HashMap; +import java.util.Map; + +import org.eclipse.rdf4j.query.algebra.Filter; +import org.eclipse.rdf4j.query.algebra.QueryModelNode; +import org.eclipse.rdf4j.query.algebra.TripleRef; +import org.eclipse.rdf4j.query.algebra.ValueExprTripleRef; +import org.eclipse.rdf4j.query.algebra.helpers.AbstractQueryModelVisitor; + +// constructs a map from variable name to TripleRef or ValueExprTripleRef for processing extensions +public class TripleRefCollector extends AbstractQueryModelVisitor { + + public static Map process(QueryModelNode node) { + TripleRefCollector collector = new TripleRefCollector(); + node.visit(collector); + return collector.getTripleRefs(); + } + + private Map tripleRefs = new HashMap<>(); + + public Map getTripleRefs() { + return tripleRefs; + } + + @Override + public void meet(Filter node) { + // Skip boolean constraints + node.getArg().visit(this); + } + + @Override + public void meet(TripleRef node) { + tripleRefs.put(((TripleRef) node).getExprVar().getName(), (TripleRef) node); + } + + @Override + public void meet(ValueExprTripleRef node) { + tripleRefs.put(((ValueExprTripleRef) node).getExtVarName(), node); + } + + @Override + public void meetOther(QueryModelNode node) { + if (node instanceof TripleRef) { + tripleRefs.put(((TripleRef) node).getExprVar().getName(), (TripleRef) node); + } else if (node instanceof ValueExprTripleRef) { + tripleRefs.put(((ValueExprTripleRef) node).getExtVarName(), node); + } else { + super.meetOther(node); + } + } +} diff --git a/core/queryparser/sparql/src/main/java/org/eclipse/rdf4j/query/parser/sparql/TupleExprBuilder.java b/core/queryparser/sparql/src/main/java/org/eclipse/rdf4j/query/parser/sparql/TupleExprBuilder.java index e130b95cea3..556ff6bf35e 100644 --- a/core/queryparser/sparql/src/main/java/org/eclipse/rdf4j/query/parser/sparql/TupleExprBuilder.java +++ b/core/queryparser/sparql/src/main/java/org/eclipse/rdf4j/query/parser/sparql/TupleExprBuilder.java @@ -21,6 +21,8 @@ import org.eclipse.rdf4j.common.annotation.InternalUseOnly; import org.eclipse.rdf4j.model.IRI; import org.eclipse.rdf4j.model.Literal; +import org.eclipse.rdf4j.model.Resource; +import org.eclipse.rdf4j.model.Triple; import org.eclipse.rdf4j.model.Value; import org.eclipse.rdf4j.model.ValueFactory; import org.eclipse.rdf4j.model.impl.BooleanLiteral; @@ -49,7 +51,6 @@ import org.eclipse.rdf4j.query.algebra.ExtensionElem; import org.eclipse.rdf4j.query.algebra.Filter; import org.eclipse.rdf4j.query.algebra.FunctionCall; -import org.eclipse.rdf4j.query.algebra.GraphPatternGroupable; import org.eclipse.rdf4j.query.algebra.Group; import org.eclipse.rdf4j.query.algebra.GroupConcat; import org.eclipse.rdf4j.query.algebra.GroupElem; @@ -62,7 +63,6 @@ import org.eclipse.rdf4j.query.algebra.Join; import org.eclipse.rdf4j.query.algebra.Lang; import org.eclipse.rdf4j.query.algebra.LangMatches; -import org.eclipse.rdf4j.query.algebra.LeftJoin; import org.eclipse.rdf4j.query.algebra.ListMemberOperator; import org.eclipse.rdf4j.query.algebra.MathExpr; import org.eclipse.rdf4j.query.algebra.Max; @@ -87,17 +87,140 @@ import org.eclipse.rdf4j.query.algebra.StatementPattern.Scope; import org.eclipse.rdf4j.query.algebra.Str; import org.eclipse.rdf4j.query.algebra.Sum; +import org.eclipse.rdf4j.query.algebra.TripleRef; import org.eclipse.rdf4j.query.algebra.TupleExpr; import org.eclipse.rdf4j.query.algebra.Union; import org.eclipse.rdf4j.query.algebra.ValueConstant; import org.eclipse.rdf4j.query.algebra.ValueExpr; +import org.eclipse.rdf4j.query.algebra.ValueExprTripleRef; import org.eclipse.rdf4j.query.algebra.Var; +import org.eclipse.rdf4j.query.algebra.VariableScopeChange; import org.eclipse.rdf4j.query.algebra.ZeroLengthPath; import org.eclipse.rdf4j.query.algebra.helpers.AbstractQueryModelVisitor; import org.eclipse.rdf4j.query.algebra.helpers.StatementPatternCollector; import org.eclipse.rdf4j.query.algebra.helpers.TupleExprs; import org.eclipse.rdf4j.query.impl.ListBindingSet; -import org.eclipse.rdf4j.query.parser.sparql.ast.*; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTAbs; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTAnd; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTAskQuery; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTAvg; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTBNodeFunc; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTBind; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTBindingSet; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTBindingValue; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTBindingsClause; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTBlankNode; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTBlankNodePropertyList; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTBound; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTCeil; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTCoalesce; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTCollection; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTCompare; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTConcat; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTConstTripleRef; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTConstraint; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTConstruct; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTConstructQuery; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTContains; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTCount; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTDatatype; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTDay; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTDescribe; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTDescribeQuery; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTEncodeForURI; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTExistsFunc; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTFalse; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTFloor; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTFunctionCall; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTGraphGraphPattern; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTGraphPatternGroup; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTGroupClause; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTGroupConcat; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTGroupCondition; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTHavingClause; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTHours; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTIRI; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTIRIFunc; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTIf; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTIn; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTInfix; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTInlineData; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTIsBlank; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTIsIRI; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTIsLiteral; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTIsNumeric; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTLang; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTLangMatches; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTLimit; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTLowerCase; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTMD5; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTMath; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTMax; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTMin; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTMinusGraphPattern; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTMinutes; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTMonth; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTNot; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTNotExistsFunc; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTNotIn; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTNow; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTNumericLiteral; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTObjectList; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTOffset; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTOptionalGraphPattern; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTOr; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTOrderClause; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTOrderCondition; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTPathAlternative; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTPathElt; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTPathMod; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTPathOneInPropertySet; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTPathSequence; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTProjectionElem; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTPropertyList; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTPropertyListPath; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTQName; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTQueryContainer; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTRDFLiteral; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTRand; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTRegexExpression; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTReplace; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTRound; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTSHA1; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTSHA224; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTSHA256; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTSHA384; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTSHA512; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTSTRUUID; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTSameTerm; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTSample; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTSeconds; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTSelect; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTSelectQuery; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTServiceGraphPattern; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTStr; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTStrAfter; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTStrBefore; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTStrDt; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTStrEnds; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTStrLang; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTStrLen; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTStrStarts; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTString; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTSubstr; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTSum; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTTimezone; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTTripleRef; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTTrue; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTTz; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTUUID; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTUnionGraphPattern; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTUpperCase; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTVar; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTYear; +import org.eclipse.rdf4j.query.parser.sparql.ast.Node; +import org.eclipse.rdf4j.query.parser.sparql.ast.SimpleNode; +import org.eclipse.rdf4j.query.parser.sparql.ast.VisitorException; /** * @author Arjohn Kampman @@ -113,7 +236,7 @@ public class TupleExprBuilder extends AbstractASTVisitor { * Variables * *-----------*/ - private ValueFactory valueFactory; + protected ValueFactory valueFactory; GraphPattern graphPattern = new GraphPattern(); @@ -141,12 +264,14 @@ public TupleExprBuilder(ValueFactory valueFactory) { * @return a Var for the given valueExpr. * @throws IllegalArgumentException if the supplied ValueExpr is null or of an unexpected type. */ - protected Var mapValueExprToVar(ValueExpr valueExpr) { + protected Var mapValueExprToVar(Object valueExpr) { if (valueExpr instanceof Var) { return (Var) valueExpr; } else if (valueExpr instanceof ValueConstant) { Var v = TupleExprs.createConstVar(((ValueConstant) valueExpr).getValue()); return v; + } else if (valueExpr instanceof TripleRef) { + return ((TripleRef) valueExpr).getExprVar(); } else if (valueExpr == null) { throw new IllegalArgumentException("valueExpr is null"); } else { @@ -179,7 +304,7 @@ protected Value getValueForExpr(ValueExpr valueExpr) { * * @return an anonymous Var with a unique, randomly generated, variable name */ - private Var createAnonVar() { + protected Var createAnonVar() { // dashes ('-') in the generated UUID are replaced with underscores so // the // varname @@ -243,9 +368,11 @@ public TupleExpr visit(ASTSelectQuery node, Object data) throws VisitorException tupleExpr = processHavingClause(havingClause, tupleExpr, group); } - // process bindings clause + // process external VALUES clause final ASTBindingsClause bindingsClause = node.getBindingsClause(); if (bindingsClause != null) { + // values clause should be treated as scoped to the where clause + ((VariableScopeChange) tupleExpr).setVariableScopeChange(false); tupleExpr = new Join((BindingSetAssignment) bindingsClause.jjtAccept(this, null), tupleExpr); } @@ -416,7 +543,10 @@ public TupleExpr visit(ASTSelect node, Object data) throws VisitorException { aliasesInProjection.add(alias); - ValueExpr valueExpr = (ValueExpr) child.jjtAccept(this, null); + ValueExpr valueExpr = castToValueExpr(child.jjtAccept(this, null)); + if (valueExpr == null) { + throw new VisitorException("Either TripleRef or Expression expected in projection."); + } String targetName = alias; String sourceName = alias; @@ -658,6 +788,9 @@ public TupleExpr visit(ASTConstruct node, Object data) throws VisitorException { super.visit(node, null); TupleExpr constructExpr = graphPattern.buildTupleExpr(); + // Retrieve TripleRefs from the head + Map tripleRefs = TripleRefCollector.process(constructExpr); + // Retrieve all StatementPatterns from the construct expression List statementPatterns = StatementPatternCollector.process(constructExpr); @@ -687,6 +820,8 @@ public TupleExpr visit(ASTConstruct node, Object data) throws VisitorException { if (var.hasValue()) { valueExpr = new ValueConstant(var.getValue()); + } else if (tripleRefs.containsKey(var.getName())) { + valueExpr = castToValueExpr(tripleRefs.get(var.getName())); } else { valueExpr = new BNodeGenerator(); } @@ -917,6 +1052,18 @@ public TupleExpr visit(ASTAskQuery node, Object data) throws VisitorException { return tupleExpr; } + protected ValueExpr castToValueExpr(Object node) { + if (node instanceof ValueExpr) { + return (ValueExpr) node; + } + if (node instanceof TripleRef) { + TripleRef t = (TripleRef) node; + return new ValueExprTripleRef(t.getExprVar().getName(), t.getSubjectVar(), t.getPredicateVar(), + t.getObjectVar()); + } + throw new IllegalArgumentException("could not cast " + node.getClass().getName() + " to ValueExpr"); + } + @Override public Group visit(ASTGroupClause node, Object data) throws VisitorException { TupleExpr tupleExpr = (TupleExpr) data; @@ -947,7 +1094,7 @@ public String visit(ASTGroupCondition node, Object data) throws VisitorException } String name = null; - ValueExpr ve = (ValueExpr) node.jjtGetChild(0).jjtAccept(this, data); + ValueExpr ve = castToValueExpr(node.jjtGetChild(0).jjtAccept(this, data)); boolean aliased = false; if (node.jjtGetNumChildren() > 1) { @@ -1028,15 +1175,10 @@ public Object visit(ASTGraphPatternGroup node, Object data) throws VisitorExcept } } - // Filters are scoped to the graph pattern group and do not affect - // bindings external to the group TupleExpr te = graphPattern.buildTupleExpr(); - - // filter conditions and left-joins do not form a new scope despite being parsed as a group graph pattern - if (!(te instanceof Filter || te instanceof LeftJoin)) { - ((GraphPatternGroupable) te).setGraphPatternGroup(true); + if (node.isScopeChange()) { + ((VariableScopeChange) te).setVariableScopeChange(true); } - parentGP.addRequiredTE(te); graphPattern = parentGP; @@ -1116,7 +1258,7 @@ public Object visit(ASTUnionGraphPattern node, Object data) throws VisitorExcept TupleExpr rightArg = graphPattern.buildTupleExpr(); Union union = new Union(leftArg, rightArg); - ((GraphPatternGroupable) union).setGraphPatternGroup(true); + union.setVariableScopeChange(true); parentGP.addRequiredTE(union); graphPattern = parentGP; @@ -1142,12 +1284,11 @@ public Object visit(ASTMinusGraphPattern node, Object data) throws VisitorExcept @Override public Object visit(ASTPropertyList propListNode, Object data) throws VisitorException { - ValueExpr subject = (ValueExpr) data; + Var subjVar = mapValueExprToVar(data); ValueExpr predicate = (ValueExpr) propListNode.getVerb().jjtAccept(this, null); @SuppressWarnings("unchecked") List objectList = (List) propListNode.getObjectList().jjtAccept(this, null); - Var subjVar = mapValueExprToVar(subject); Var predVar = mapValueExprToVar(predicate); for (ValueExpr object : objectList) { @@ -1157,7 +1298,7 @@ public Object visit(ASTPropertyList propListNode, Object data) throws VisitorExc ASTPropertyList nextPropList = propListNode.getNextPropertyList(); if (nextPropList != null) { - nextPropList.jjtAccept(this, subject); + nextPropList.jjtAccept(this, data); } return graphPattern.buildTupleExpr(); @@ -1190,7 +1331,7 @@ public Object visit(ASTPathAlternative pathAltNode, Object data) throws VisitorE } // when using union to execute path expressions, the scope does not not change - union.setGraphPatternGroup(false); + union.setVariableScopeChange(false); parentGP.addRequiredTE(union); graphPattern = parentGP; } else { @@ -1237,8 +1378,10 @@ private boolean checkInverse(Node node) { @Override public Object visit(ASTPathSequence pathSeqNode, Object data) throws VisitorException { - ValueExpr subject = (ValueExpr) data; - Var subjVar = mapValueExprToVar(subject); + // FIXME the entire path sequence processing needs to be separated out and more cleanly implemented, as it is + // currently a very messy operation involving way too many if...else conditions and strange edge case handling. + + Var subjVar = mapValueExprToVar(data); // check if we should invert subject and object. boolean invertSequence = checkInverse(pathSeqNode); @@ -1400,7 +1543,9 @@ public Object visit(ASTPathSequence pathSeqNode, Object data) throws VisitorExce if (invertSequence) { endVar = subjVar; // only swap startVar if it is not an intermediate var for a path sequence of length > 1 - if (!(startVar.isAnonymous() && startVar.getName().startsWith("_anon_"))) { + // or otherwise we'd create a reflexive path (possible in nested expressions) + if (subjVar.equals(startVar) + || !(startVar.isAnonymous() && startVar.getName().startsWith("_anon_"))) { startVar = objVar; } } @@ -1736,7 +1881,7 @@ public void meet(Var var) { @Override public Object visit(ASTPropertyListPath propListNode, Object data) throws VisitorException { - ValueExpr subject = (ValueExpr) data; + Object subject = data; ValueExpr verbPath = (ValueExpr) propListNode.getVerb().jjtAccept(this, data); if (verbPath instanceof Var) { @@ -1770,7 +1915,12 @@ public List visit(ASTObjectList node, Object data) throws VisitorExce List result = new ArrayList<>(childCount); for (int i = 0; i < childCount; i++) { - result.add((ValueExpr) node.jjtGetChild(i).jjtAccept(this, null)); + Object obj = node.jjtGetChild(i).jjtAccept(this, null); + if (obj instanceof ValueExpr) { + result.add((ValueExpr) obj); + } else if (obj instanceof TripleRef) { + result.add(((TripleRef) obj).getExprVar()); + } } return result; @@ -1930,7 +2080,7 @@ public Object visit(ASTFunctionCall node, Object data) throws VisitorException { for (int i = 1; i < node.jjtGetNumChildren(); i++) { Node argNode = node.jjtGetChild(i); - functionCall.addArg((ValueExpr) argNode.jjtAccept(this, null)); + functionCall.addArg(castToValueExpr(argNode.jjtAccept(this, null))); } return functionCall; @@ -1943,7 +2093,7 @@ public FunctionCall visit(ASTEncodeForURI node, Object data) throws VisitorExcep @Override public Object visit(ASTStr node, Object data) throws VisitorException { - ValueExpr arg = (ValueExpr) node.jjtGetChild(0).jjtAccept(this, null); + ValueExpr arg = castToValueExpr(node.jjtGetChild(0).jjtAccept(this, null)); return new Str(arg); } @@ -2417,7 +2567,12 @@ public Object visit(ASTQName node, Object data) throws VisitorException { @Override public Object visit(ASTBind node, Object data) throws VisitorException { // bind expression - ValueExpr ve = (ValueExpr) node.jjtGetChild(0).jjtAccept(this, data); + Object child0 = node.jjtGetChild(0).jjtAccept(this, data); + ValueExpr ve = child0 instanceof ValueExpr ? (ValueExpr) child0 + : (child0 instanceof TripleRef) ? ((TripleRef) child0).getExprVar() : null; + if (ve == null) { + throw new IllegalArgumentException("Unexpected expressin on bind"); + } // name to bind the expression outcome to Node aliasNode = node.jjtGetChild(1); @@ -2524,14 +2679,14 @@ public String visit(ASTString node, Object data) throws VisitorException { public Object visit(ASTCount node, Object data) throws VisitorException { ValueExpr ve = null; if (node.jjtGetNumChildren() > 0) { - ve = (ValueExpr) node.jjtGetChild(0).jjtAccept(this, data); + ve = castToValueExpr(node.jjtGetChild(0).jjtAccept(this, data)); } return new Count(ve, node.isDistinct()); } @Override public Object visit(ASTGroupConcat node, Object data) throws VisitorException { - ValueExpr ve = (ValueExpr) node.jjtGetChild(0).jjtAccept(this, data); + ValueExpr ve = castToValueExpr(node.jjtGetChild(0).jjtAccept(this, data)); GroupConcat gc = new GroupConcat(ve, node.isDistinct()); @@ -2545,28 +2700,28 @@ public Object visit(ASTGroupConcat node, Object data) throws VisitorException { @Override public Object visit(ASTMax node, Object data) throws VisitorException { - ValueExpr ve = (ValueExpr) node.jjtGetChild(0).jjtAccept(this, data); + ValueExpr ve = castToValueExpr(node.jjtGetChild(0).jjtAccept(this, data)); return new Max(ve, node.isDistinct()); } @Override public Object visit(ASTMin node, Object data) throws VisitorException { - ValueExpr ve = (ValueExpr) node.jjtGetChild(0).jjtAccept(this, data); + ValueExpr ve = castToValueExpr(node.jjtGetChild(0).jjtAccept(this, data)); return new Min(ve, node.isDistinct()); } @Override public Object visit(ASTSum node, Object data) throws VisitorException { - ValueExpr ve = (ValueExpr) node.jjtGetChild(0).jjtAccept(this, data); + ValueExpr ve = castToValueExpr(node.jjtGetChild(0).jjtAccept(this, data)); return new Sum(ve, node.isDistinct()); } @Override public Object visit(ASTAvg node, Object data) throws VisitorException { - ValueExpr ve = (ValueExpr) node.jjtGetChild(0).jjtAccept(this, data); + ValueExpr ve = castToValueExpr(node.jjtGetChild(0).jjtAccept(this, data)); return new Avg(ve, node.isDistinct()); } @@ -2686,4 +2841,32 @@ private void meetAggregate(AggregateOperator node) { } } } + + @Override + public TupleExpr visit(ASTTripleRef node, Object data) throws VisitorException { + TripleRef ret = new TripleRef(); + ret.setSubjectVar(mapValueExprToVar(node.getSubj().jjtAccept(this, ret))); + ret.setPredicateVar(mapValueExprToVar(node.getPred().jjtAccept(this, ret))); + ret.setObjectVar(mapValueExprToVar(node.getObj().jjtAccept(this, ret))); + ret.setExprVar(createAnonVar()); + graphPattern.addRequiredTE(ret); + + return ret; + } + + @Override + public ValueConstant visit(ASTConstTripleRef node, Object data) throws VisitorException { + Triple triple; + Resource subject = (Resource) ((ValueConstant) node.getSubj().jjtAccept(this, data)).getValue(); + IRI predicate = (IRI) ((ValueConstant) node.getPred().jjtAccept(this, data)).getValue(); + Value object = ((ValueConstant) node.getObj().jjtAccept(this, data)).getValue(); + try { + triple = valueFactory.createTriple(subject, predicate, object); + } catch (IllegalArgumentException e) { + // invalid URI + throw new VisitorException(e.getMessage()); + } + + return new ValueConstant(triple); + } } diff --git a/core/queryparser/sparql/src/main/java/org/eclipse/rdf4j/query/parser/sparql/UpdateExprBuilder.java b/core/queryparser/sparql/src/main/java/org/eclipse/rdf4j/query/parser/sparql/UpdateExprBuilder.java index 437db63aeef..b412de99327 100644 --- a/core/queryparser/sparql/src/main/java/org/eclipse/rdf4j/query/parser/sparql/UpdateExprBuilder.java +++ b/core/queryparser/sparql/src/main/java/org/eclipse/rdf4j/query/parser/sparql/UpdateExprBuilder.java @@ -9,6 +9,7 @@ import java.util.Collection; import java.util.LinkedHashSet; +import java.util.Map; import java.util.Set; import org.eclipse.rdf4j.common.annotation.InternalUseOnly; @@ -18,12 +19,15 @@ import org.eclipse.rdf4j.query.algebra.Copy; import org.eclipse.rdf4j.query.algebra.Create; import org.eclipse.rdf4j.query.algebra.DeleteData; +import org.eclipse.rdf4j.query.algebra.Extension; +import org.eclipse.rdf4j.query.algebra.ExtensionElem; import org.eclipse.rdf4j.query.algebra.InsertData; import org.eclipse.rdf4j.query.algebra.Load; import org.eclipse.rdf4j.query.algebra.Modify; import org.eclipse.rdf4j.query.algebra.Move; import org.eclipse.rdf4j.query.algebra.StatementPattern; import org.eclipse.rdf4j.query.algebra.StatementPattern.Scope; +import org.eclipse.rdf4j.query.algebra.TripleRef; import org.eclipse.rdf4j.query.algebra.TupleExpr; import org.eclipse.rdf4j.query.algebra.UpdateExpr; import org.eclipse.rdf4j.query.algebra.ValueConstant; @@ -45,6 +49,7 @@ import org.eclipse.rdf4j.query.parser.sparql.ast.ASTModify; import org.eclipse.rdf4j.query.parser.sparql.ast.ASTMove; import org.eclipse.rdf4j.query.parser.sparql.ast.ASTQuadsNotTriples; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTTripleRef; import org.eclipse.rdf4j.query.parser.sparql.ast.ASTUnparsedQuadDataBlock; import org.eclipse.rdf4j.query.parser.sparql.ast.ASTUpdate; import org.eclipse.rdf4j.query.parser.sparql.ast.ASTWhereClause; @@ -54,7 +59,7 @@ * Extension of TupleExprBuilder that builds Update Expressions. * * @author Jeen Broekstra - * + * * @deprecated since 3.0. This feature is for internal use only: its existence, signature or behavior may change without * warning from one release to the next. */ @@ -62,6 +67,8 @@ @InternalUseOnly public class UpdateExprBuilder extends TupleExprBuilder { + TupleExpr where; + /** * @param valueFactory */ @@ -137,10 +144,10 @@ public Modify visit(ASTDeleteWhere node, Object data) throws VisitorException { node.jjtGetChild(i).jjtAccept(this, data); } - TupleExpr whereExpr = graphPattern.buildTupleExpr(); + where = graphPattern.buildTupleExpr(); graphPattern = parentGP; - TupleExpr deleteExpr = whereExpr.clone(); + TupleExpr deleteExpr = where.clone(); // FIXME we should adapt the grammar so we can avoid doing this // post-processing. @@ -152,7 +159,7 @@ public Modify visit(ASTDeleteWhere node, Object data) throws VisitorException { } } - Modify modify = new Modify(deleteExpr, null, whereExpr); + Modify modify = new Modify(deleteExpr, null, where); return modify; } @@ -286,7 +293,7 @@ public Add visit(ASTAdd node, Object data) throws VisitorException { public Modify visit(ASTModify node, Object data) throws VisitorException { ASTWhereClause whereClause = node.getWhereClause(); - TupleExpr where = null; + where = null; if (whereClause != null) { where = (TupleExpr) whereClause.jjtAccept(this, data); } @@ -326,12 +333,17 @@ public TupleExpr visit(ASTDeleteClause node, Object data) throws VisitorExceptio } TupleExpr deleteExpr = graphPattern.buildTupleExpr(); + Map tripleVars = TripleRefCollector.process(where); // FIXME we should adapt the grammar so we can avoid doing this in // post-processing. VarCollector collector = new VarCollector(); deleteExpr.visit(collector); for (Var var : collector.getCollectedVars()) { + // skip vars that are provided by ValueExprTripleRef - added as Extentsion + if (tripleVars.containsKey(var.getName())) { + continue; + } if (var.isAnonymous() && !var.hasValue()) { // blank node in delete pattern, not allowed by SPARQL spec. throw new VisitorException("DELETE clause may not contain blank nodes"); @@ -382,4 +394,18 @@ private Set getProjectionVars(Collection statementPattern return vars; } -} \ No newline at end of file + + @Override + public TupleExpr visit(ASTTripleRef node, Object data) throws VisitorException { + TripleRef ret = new TripleRef(); + ret.setSubjectVar(mapValueExprToVar(node.getSubj().jjtAccept(this, ret))); + ret.setPredicateVar(mapValueExprToVar(node.getPred().jjtAccept(this, ret))); + ret.setObjectVar(mapValueExprToVar(node.getObj().jjtAccept(this, ret))); + ret.setExprVar(createAnonVar()); + Extension ext = new Extension(where); + ext.addElement(new ExtensionElem(castToValueExpr(ret), ret.getExprVar().getName())); + where = ext; + + return ret; + } +} diff --git a/core/queryparser/sparql/src/main/java/org/eclipse/rdf4j/query/parser/sparql/WildcardProjectionProcessor.java b/core/queryparser/sparql/src/main/java/org/eclipse/rdf4j/query/parser/sparql/WildcardProjectionProcessor.java index 0eed8f6c9f0..49308966ce8 100644 --- a/core/queryparser/sparql/src/main/java/org/eclipse/rdf4j/query/parser/sparql/WildcardProjectionProcessor.java +++ b/core/queryparser/sparql/src/main/java/org/eclipse/rdf4j/query/parser/sparql/WildcardProjectionProcessor.java @@ -20,6 +20,7 @@ import org.eclipse.rdf4j.query.parser.sparql.ast.ASTProjectionElem; import org.eclipse.rdf4j.query.parser.sparql.ast.ASTSelect; import org.eclipse.rdf4j.query.parser.sparql.ast.ASTSelectQuery; +import org.eclipse.rdf4j.query.parser.sparql.ast.ASTTripleRef; import org.eclipse.rdf4j.query.parser.sparql.ast.ASTVar; import org.eclipse.rdf4j.query.parser.sparql.ast.ASTWhereClause; import org.eclipse.rdf4j.query.parser.sparql.ast.Node; @@ -28,10 +29,10 @@ /** * Processes 'wildcard' projections, making them explicit by adding the appropriate variable nodes to them. - * + * * @author arjohn * @author Jeen Broekstra - * + * * @deprecated since 3.0. This feature is for internal use only: its existence, signature or behavior may change without * warning from one release to the next. */ @@ -153,6 +154,12 @@ public Object visit(ASTProjectionElem node, Object data) throws VisitorException @Override public Object visit(ASTBind node, Object data) throws VisitorException { // only include the actual alias from a BIND + // exception: in case of ASTTRipleRef include its vars + Node first = node.jjtGetChild(0); + if (first instanceof ASTTripleRef) { + ASTTripleRef triple = (ASTTripleRef) first; + super.visit(triple, data); + } Node aliasNode = node.jjtGetChild(1); String alias = ((ASTVar) aliasNode).getName(); diff --git a/core/queryparser/sparql/src/main/java/org/eclipse/rdf4j/query/parser/sparql/ast/ASTConstTripleRef.java b/core/queryparser/sparql/src/main/java/org/eclipse/rdf4j/query/parser/sparql/ast/ASTConstTripleRef.java new file mode 100644 index 00000000000..d9149725023 --- /dev/null +++ b/core/queryparser/sparql/src/main/java/org/eclipse/rdf4j/query/parser/sparql/ast/ASTConstTripleRef.java @@ -0,0 +1,38 @@ +/******************************************************************************* + * Copyright (c) 2020 Eclipse RDF4J contributors. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Distribution License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ +/* Generated By:JJTree: Do not edit this line. ASTConstTripleRef.java Version 4.3 */ +/* JavaCCOptions:MULTI=true,NODE_USES_PARSER=false,VISITOR=true,TRACK_TOKENS=false,NODE_PREFIX=AST,NODE_EXTENDS=,NODE_FACTORY=,SUPPORT_CLASS_VISIBILITY_PUBLIC=true */ +package org.eclipse.rdf4j.query.parser.sparql.ast; + +public class ASTConstTripleRef extends SimpleNode { + public ASTConstTripleRef(int id) { + super(id); + } + + public ASTConstTripleRef(SyntaxTreeBuilder p, int id) { + super(p, id); + } + + public SimpleNode getSubj() { + return (SimpleNode) jjtGetChild(0); + } + + public SimpleNode getPred() { + return (SimpleNode) jjtGetChild(1); + } + + public SimpleNode getObj() { + return (SimpleNode) jjtGetChild(2); + } + + /** Accept the visitor. **/ + public Object jjtAccept(SyntaxTreeBuilderVisitor visitor, Object data) throws VisitorException { + return visitor.visit(this, data); + } +} +/* JavaCC - OriginalChecksum=552970dece5bf40cd703ad7c31f001e9 (do not edit this line) */ diff --git a/core/queryparser/sparql/src/main/java/org/eclipse/rdf4j/query/parser/sparql/ast/ASTGraphPatternGroup.java b/core/queryparser/sparql/src/main/java/org/eclipse/rdf4j/query/parser/sparql/ast/ASTGraphPatternGroup.java index b7ffed8c74c..5dd77700358 100644 --- a/core/queryparser/sparql/src/main/java/org/eclipse/rdf4j/query/parser/sparql/ast/ASTGraphPatternGroup.java +++ b/core/queryparser/sparql/src/main/java/org/eclipse/rdf4j/query/parser/sparql/ast/ASTGraphPatternGroup.java @@ -23,4 +23,15 @@ public ASTGraphPatternGroup(SyntaxTreeBuilder p, int id) { public Object jjtAccept(SyntaxTreeBuilderVisitor visitor, Object data) throws VisitorException { return visitor.visit(this, data); } + + @Override + public boolean isScopeChange() { + if (!(this.parent instanceof ASTExistsFunc + || this.parent instanceof ASTNotExistsFunc + || this.parent instanceof ASTGraphGraphPattern + || this.parent instanceof ASTWhereClause)) { + return true; + } + return super.isScopeChange(); + } } diff --git a/core/queryparser/sparql/src/main/java/org/eclipse/rdf4j/query/parser/sparql/ast/ASTOperationContainer.java b/core/queryparser/sparql/src/main/java/org/eclipse/rdf4j/query/parser/sparql/ast/ASTOperationContainer.java index e0c4e2d9786..557f669d210 100644 --- a/core/queryparser/sparql/src/main/java/org/eclipse/rdf4j/query/parser/sparql/ast/ASTOperationContainer.java +++ b/core/queryparser/sparql/src/main/java/org/eclipse/rdf4j/query/parser/sparql/ast/ASTOperationContainer.java @@ -11,7 +11,7 @@ /** * Abstract supertype of {@link ASTQueryContainer} and {@link ASTUpdateContainer} - * + * * @author Jeen Broekstra */ public abstract class ASTOperationContainer extends SimpleNode { diff --git a/core/queryparser/sparql/src/main/java/org/eclipse/rdf4j/query/parser/sparql/ast/ASTTripleRef.java b/core/queryparser/sparql/src/main/java/org/eclipse/rdf4j/query/parser/sparql/ast/ASTTripleRef.java new file mode 100644 index 00000000000..a3d71f59923 --- /dev/null +++ b/core/queryparser/sparql/src/main/java/org/eclipse/rdf4j/query/parser/sparql/ast/ASTTripleRef.java @@ -0,0 +1,38 @@ +/******************************************************************************* + * Copyright (c) 2020 Eclipse RDF4J contributors. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Distribution License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ +/* Generated By:JJTree: Do not edit this line. ASTTripleRef.java Version 4.3 */ +/* JavaCCOptions:MULTI=true,NODE_USES_PARSER=false,VISITOR=true,TRACK_TOKENS=false,NODE_PREFIX=AST,NODE_EXTENDS=,NODE_FACTORY=,SUPPORT_CLASS_VISIBILITY_PUBLIC=true */ +package org.eclipse.rdf4j.query.parser.sparql.ast; + +public class ASTTripleRef extends SimpleNode { + public ASTTripleRef(int id) { + super(id); + } + + public ASTTripleRef(SyntaxTreeBuilder p, int id) { + super(p, id); + } + + public SimpleNode getSubj() { + return (SimpleNode) jjtGetChild(0); + } + + public SimpleNode getPred() { + return (SimpleNode) jjtGetChild(1); + } + + public SimpleNode getObj() { + return (SimpleNode) jjtGetChild(2); + } + + /** Accept the visitor. **/ + public Object jjtAccept(SyntaxTreeBuilderVisitor visitor, Object data) throws VisitorException { + return visitor.visit(this, data); + } +} +/* JavaCC - OriginalChecksum=08fd6ee0bffb39a414509301100c9e05 (do not edit this line) */ diff --git a/core/queryparser/sparql/src/main/java/org/eclipse/rdf4j/query/parser/sparql/ast/CharStream.java b/core/queryparser/sparql/src/main/java/org/eclipse/rdf4j/query/parser/sparql/ast/CharStream.java index 16495d4dbf4..a9bd4828ac2 100644 --- a/core/queryparser/sparql/src/main/java/org/eclipse/rdf4j/query/parser/sparql/ast/CharStream.java +++ b/core/queryparser/sparql/src/main/java/org/eclipse/rdf4j/query/parser/sparql/ast/CharStream.java @@ -24,7 +24,7 @@ public interface CharStream { @Deprecated /** * Returns the column position of the character last read. - * + * * @deprecated * @see #getEndColumn */ @@ -33,7 +33,7 @@ public interface CharStream { @Deprecated /** * Returns the line number of the character last read. - * + * * @deprecated * @see #getEndLine */ diff --git a/core/queryparser/sparql/src/main/java/org/eclipse/rdf4j/query/parser/sparql/ast/JJTSyntaxTreeBuilderState.java b/core/queryparser/sparql/src/main/java/org/eclipse/rdf4j/query/parser/sparql/ast/JJTSyntaxTreeBuilderState.java index 8491fca0b13..c56e91da678 100644 --- a/core/queryparser/sparql/src/main/java/org/eclipse/rdf4j/query/parser/sparql/ast/JJTSyntaxTreeBuilderState.java +++ b/core/queryparser/sparql/src/main/java/org/eclipse/rdf4j/query/parser/sparql/ast/JJTSyntaxTreeBuilderState.java @@ -128,4 +128,4 @@ public void closeNodeScope(Node n, boolean condition) { } } } -/* JavaCC - OriginalChecksum=12f3991b214b2e6c8c7298f11228dbc7 (do not edit this line) */ +/* JavaCC - OriginalChecksum=1e5a09b86097bc3480ddaf59d3a653ea (do not edit this line) */ diff --git a/core/queryparser/sparql/src/main/java/org/eclipse/rdf4j/query/parser/sparql/ast/JavaCharStream.java b/core/queryparser/sparql/src/main/java/org/eclipse/rdf4j/query/parser/sparql/ast/JavaCharStream.java index f6473e4c808..7764f8b0692 100644 --- a/core/queryparser/sparql/src/main/java/org/eclipse/rdf4j/query/parser/sparql/ast/JavaCharStream.java +++ b/core/queryparser/sparql/src/main/java/org/eclipse/rdf4j/query/parser/sparql/ast/JavaCharStream.java @@ -137,15 +137,17 @@ protected void ExpandBuff(boolean wrapAround) { protected void FillBuff() throws java.io.IOException { int i; - if (maxNextCharInd == 4096) + if (maxNextCharInd == 4096) { maxNextCharInd = nextCharInd = 0; + } try { if ((i = inputStream.read(nextCharBuf, maxNextCharInd, 4096 - maxNextCharInd)) == -1) { inputStream.close(); throw new java.io.IOException(); - } else + } else { maxNextCharInd += i; + } return; } catch (java.io.IOException e) { if (bufpos != 0) { @@ -160,8 +162,9 @@ protected void FillBuff() throws java.io.IOException { } protected char ReadByte() throws java.io.IOException { - if (++nextCharInd >= maxNextCharInd) + if (++nextCharInd >= maxNextCharInd) { FillBuff(); + } return nextCharBuf[nextCharInd]; } @@ -171,8 +174,9 @@ public char BeginToken() throws java.io.IOException { if (inBuf > 0) { --inBuf; - if (++bufpos == bufsize) + if (++bufpos == bufsize) { bufpos = 0; + } tokenBegin = bufpos; return buffer[bufpos]; @@ -189,14 +193,16 @@ protected void AdjustBuffSize() { if (tokenBegin > 2048) { bufpos = 0; available = tokenBegin; - } else + } else { ExpandBuff(false); - } else if (available > tokenBegin) + } + } else if (available > tokenBegin) { available = bufsize; - else if ((tokenBegin - available) < 2048) + } else if ((tokenBegin - available) < 2048) { ExpandBuff(true); - else + } else { available = tokenBegin; + } } protected void UpdateLineColumn(char c) { @@ -209,8 +215,9 @@ protected void UpdateLineColumn(char c) { prevCharIsCR = false; if (c == '\n') { prevCharIsLF = true; - } else + } else { line += (column = 1); + } } switch (c) { @@ -237,16 +244,18 @@ public char readChar() throws java.io.IOException { if (inBuf > 0) { --inBuf; - if (++bufpos == bufsize) + if (++bufpos == bufsize) { bufpos = 0; + } return buffer[bufpos]; } char c; - if (++bufpos == available) + if (++bufpos == available) { AdjustBuffSize(); + } if ((buffer[bufpos] = c = ReadByte()) == '\\') { UpdateLineColumn(c); @@ -255,16 +264,18 @@ public char readChar() throws java.io.IOException { for (;;) // Read all the backslashes { - if (++bufpos == available) + if (++bufpos == available) { AdjustBuffSize(); + } try { if ((buffer[bufpos] = c = ReadByte()) != '\\') { UpdateLineColumn(c); // found a non-backslash char. if ((c == 'u') && ((backSlashCnt & 1) == 1)) { - if (--bufpos < 0) + if (--bufpos < 0) { bufpos = bufsize - 1; + } break; } @@ -274,8 +285,9 @@ public char readChar() throws java.io.IOException { } } catch (java.io.IOException e) { // We are returning one backslash so we should only backup (count-1) - if (backSlashCnt > 1) + if (backSlashCnt > 1) { backup(backSlashCnt - 1); + } return '\\'; } @@ -286,8 +298,9 @@ public char readChar() throws java.io.IOException { // Here, we have seen an odd number of backslash's followed by a 'u' try { - while ((c = ReadByte()) == 'u') + while ((c = ReadByte()) == 'u') { ++column; + } buffer[bufpos] = c = (char) (hexval(c) << 12 | hexval(ReadByte()) << 8 | hexval(ReadByte()) << 4 | hexval(ReadByte())); @@ -297,9 +310,9 @@ public char readChar() throws java.io.IOException { throw new Error("Invalid escape character at line " + line + " column " + column + "."); } - if (backSlashCnt == 1) + if (backSlashCnt == 1) { return c; - else { + } else { backup(backSlashCnt - 1); return '\\'; } @@ -351,8 +364,9 @@ public int getBeginLine() { public void backup(int amount) { inBuf += amount; - if ((bufpos -= amount) < 0) + if ((bufpos -= amount) < 0) { bufpos += bufsize; + } } /** Constructor. */ @@ -474,19 +488,20 @@ public void ReInit(java.io.InputStream dstream) { /** @return token image as String */ public String GetImage() { - if (bufpos >= tokenBegin) + if (bufpos >= tokenBegin) { return new String(buffer, tokenBegin, bufpos - tokenBegin + 1); - else + } else { return new String(buffer, tokenBegin, bufsize - tokenBegin) + new String(buffer, 0, bufpos + 1); + } } /** @return suffix */ public char[] GetSuffix(int len) { char[] ret = new char[len]; - if ((bufpos + 1) >= len) + if ((bufpos + 1) >= len) { System.arraycopy(buffer, bufpos - len + 1, ret, 0, len); - else { + } else { System.arraycopy(buffer, bufsize - (len - bufpos - 1), ret, 0, len - bufpos - 1); System.arraycopy(buffer, 0, ret, len - bufpos - 1, bufpos + 1); } @@ -531,10 +546,11 @@ public void adjustBeginLineColumn(int newLine, int newCol) { bufcolumn[j] = newCol + columnDiff; while (i++ < len) { - if (bufline[j = start % bufsize] != bufline[++start % bufsize]) + if (bufline[j = start % bufsize] != bufline[++start % bufsize]) { bufline[j] = newLine++; - else + } else { bufline[j] = newLine; + } } } diff --git a/core/queryparser/sparql/src/main/java/org/eclipse/rdf4j/query/parser/sparql/ast/ParseException.java b/core/queryparser/sparql/src/main/java/org/eclipse/rdf4j/query/parser/sparql/ast/ParseException.java index 6f04e2ed761..ac231832810 100644 --- a/core/queryparser/sparql/src/main/java/org/eclipse/rdf4j/query/parser/sparql/ast/ParseException.java +++ b/core/queryparser/sparql/src/main/java/org/eclipse/rdf4j/query/parser/sparql/ast/ParseException.java @@ -93,8 +93,9 @@ private static String initialise(Token currentToken, int[][] expectedTokenSequen String retval = "Encountered \""; Token tok = currentToken.next; for (int i = 0; i < maxSize; i++) { - if (i != 0) + if (i != 0) { retval += " "; + } if (tok.kind == 0) { retval += tokenImage[0]; break; diff --git a/core/queryparser/sparql/src/main/java/org/eclipse/rdf4j/query/parser/sparql/ast/SimpleNode.java b/core/queryparser/sparql/src/main/java/org/eclipse/rdf4j/query/parser/sparql/ast/SimpleNode.java index d12a3f93c59..7addfb7cf0f 100644 --- a/core/queryparser/sparql/src/main/java/org/eclipse/rdf4j/query/parser/sparql/ast/SimpleNode.java +++ b/core/queryparser/sparql/src/main/java/org/eclipse/rdf4j/query/parser/sparql/ast/SimpleNode.java @@ -24,6 +24,8 @@ public class SimpleNode implements Node { protected SyntaxTreeBuilder parser; + private boolean isScopeChange = false; + public SimpleNode(int id) { this.id = id; children = new ArrayList<>(); @@ -83,7 +85,7 @@ public void jjtReplaceChild(Node oldNode, Node newNode) { /** * Replaces this node with the supplied one in the AST. - * + * * @param newNode The replacement node. */ public void jjtReplaceWith(Node newNode) { @@ -107,7 +109,7 @@ public Node jjtGetChild(int i) { /** * Gets the (first) child of this node that is of the specific type. - * + * * @param type The type of the child node that should be returned. * @return The (first) child node of the specified type, or null if no such child node was found. */ @@ -196,4 +198,20 @@ public String dump(String prefix) { throw new RuntimeException("Unexpected I/O error while writing to StringWriter", e); } } + + /** + * Check if this AST node constitutes a variable scope change. + * + * @return the isScopeChange + */ + public boolean isScopeChange() { + return isScopeChange; + } + + /** + * @param isScopeChange the isScopeChange to set + */ + public void setScopeChange(boolean isScopeChange) { + this.isScopeChange = isScopeChange; + } } diff --git a/core/queryparser/sparql/src/main/java/org/eclipse/rdf4j/query/parser/sparql/ast/SyntaxTreeBuilder.java b/core/queryparser/sparql/src/main/java/org/eclipse/rdf4j/query/parser/sparql/ast/SyntaxTreeBuilder.java index a53b5a4d777..d649cbef46d 100644 --- a/core/queryparser/sparql/src/main/java/org/eclipse/rdf4j/query/parser/sparql/ast/SyntaxTreeBuilder.java +++ b/core/queryparser/sparql/src/main/java/org/eclipse/rdf4j/query/parser/sparql/ast/SyntaxTreeBuilder.java @@ -28,7 +28,8 @@ public class SyntaxTreeBuilder * @throws TokenMgrError If the query was syntactically incorrect. * @throws ParseException If the query was syntactically incorrect. */ - public static ASTQueryContainer parseQuery(String query) throws TokenMgrError, ParseException { + public static ASTQueryContainer parseQuery(String query) + throws TokenMgrError, ParseException { SyntaxTreeBuilder stb = new SyntaxTreeBuilder(new UnicodeEscapeStream(new StringReader(query), 1)); // Set size of tab to 1 to force tokenmanager to report correct column @@ -47,7 +48,8 @@ public static ASTQueryContainer parseQuery(String query) throws TokenMgrError, P * @throws TokenMgrError If the update sequence was syntactically incorrect. * @throws ParseException If the update sequence was syntactically incorrect. */ - public static ASTUpdateSequence parseUpdateSequence(String sequence) throws TokenMgrError, ParseException { + public static ASTUpdateSequence parseUpdateSequence(String sequence) + throws TokenMgrError, ParseException { SyntaxTreeBuilder stb = new SyntaxTreeBuilder(new UnicodeEscapeStream(new StringReader(sequence), 1)); // Set size of tab to 1 to force tokenmanager to report correct column @@ -81,12 +83,14 @@ private String readToMatchingBrace() throws ParseException { if (!previousTokenDtSep && !tok.image.equals("^^") && !tok.image.startsWith("@")) { sb.append(" "); } - if (tok.kind == LBRACE) + if (tok.kind == LBRACE) { nesting++; + } if (tok.kind == RBRACE) { nesting--; - if (nesting == 0) + if (nesting == 0) { break; + } } sb.append(tok.image); previousTokenDtSep = tok.image.equals("^^"); @@ -96,7 +100,7 @@ private String readToMatchingBrace() throws ParseException { return sb.toString(); } -// + // // grammar // final public ASTUpdateSequence UpdateSequence() throws ParseException { @@ -119,8 +123,9 @@ final public ASTUpdateSequence UpdateSequence() throws ParseException { jjtree.closeNodeScope(jjtn000, true); jjtc000 = false; { - if (true) + if (true) { return jjtn000; + } } } catch (Throwable jjte000) { if (jjtc000) { @@ -131,19 +136,22 @@ final public ASTUpdateSequence UpdateSequence() throws ParseException { } if (jjte000 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte000; + } } } if (jjte000 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte000; + } } } { - if (true) + if (true) { throw (Error) jjte000; + } } } finally { if (jjtc000) { @@ -180,8 +188,9 @@ final public ASTUpdateContainer UpdateContainer() throws ParseException { jjtree.closeNodeScope(jjtn000, true); jjtc000 = false; { - if (true) + if (true) { return jjtn000; + } } } catch (Throwable jjte000) { if (jjtc000) { @@ -192,19 +201,22 @@ final public ASTUpdateContainer UpdateContainer() throws ParseException { } if (jjte000 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte000; + } } } if (jjte000 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte000; + } } } { - if (true) + if (true) { throw (Error) jjte000; + } } } finally { if (jjtc000) { @@ -226,8 +238,9 @@ final public ASTQueryContainer QueryContainer() throws ParseException { jjtree.closeNodeScope(jjtn000, true); jjtc000 = false; { - if (true) + if (true) { return jjtn000; + } } } catch (Throwable jjte000) { if (jjtc000) { @@ -238,19 +251,22 @@ final public ASTQueryContainer QueryContainer() throws ParseException { } if (jjte000 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte000; + } } } if (jjte000 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte000; + } } } { - if (true) + if (true) { throw (Error) jjte000; + } } } finally { if (jjtc000) { @@ -331,19 +347,22 @@ final public void PrefixDecl() throws ParseException { } if (jjte000 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte000; + } } } if (jjte000 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte000; + } } } { - if (true) + if (true) { throw (Error) jjte000; + } } } finally { if (jjtc000) { @@ -411,19 +430,22 @@ final public void SelectQuery() throws ParseException { } if (jjte000 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte000; + } } } if (jjte000 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte000; + } } } { - if (true) + if (true) { throw (Error) jjte000; + } } } finally { if (jjtc000) { @@ -459,19 +481,22 @@ final public void SubSelect() throws ParseException { } if (jjte000 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte000; + } } } if (jjte000 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte000; + } } } { - if (true) + if (true) { throw (Error) jjte000; + } } } finally { if (jjtc000) { @@ -547,19 +572,22 @@ final public void Select() throws ParseException { } if (jjte000 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte000; + } } } if (jjte000 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte000; + } } } { - if (true) + if (true) { throw (Error) jjte000; + } } } finally { if (jjtc000) { @@ -600,19 +628,22 @@ final public void ProjectionElem() throws ParseException { } if (jjte000 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte000; + } } } if (jjte000 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte000; + } } } { - if (true) + if (true) { throw (Error) jjte000; + } } } finally { if (jjtc000) { @@ -659,19 +690,22 @@ final public void ConstructQuery() throws ParseException { } if (jjte000 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte000; + } } } if (jjte000 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte000; + } } } { - if (true) + if (true) { throw (Error) jjte000; + } } } finally { if (jjtc000) { @@ -701,19 +735,22 @@ final public void Construct() throws ParseException { } if (jjte000 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte000; + } } } if (jjte000 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte000; + } } } { - if (true) + if (true) { throw (Error) jjte000; + } } } finally { if (jjtc000) { @@ -750,6 +787,7 @@ final public void ConstructClause() throws ParseException { case STRING_LITERAL2: case STRING_LITERAL_LONG1: case STRING_LITERAL_LONG2: + case TRIPLE_OPEN: TriplesBlock(); break; default: @@ -805,19 +843,22 @@ final public void DescribeQuery() throws ParseException { } if (jjte000 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte000; + } } } if (jjte000 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte000; + } } } { - if (true) + if (true) { throw (Error) jjte000; + } } } finally { if (jjtc000) { @@ -845,24 +886,41 @@ final public void Describe() throws ParseException { case PNAME_LN: case VAR1: case VAR2: + case TRIPLE_OPEN: label_6: while (true) { - VarOrIRIref(); switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) { case Q_IRI_REF: case PNAME_NS: case PNAME_LN: case VAR1: case VAR2: - ; + VarOrIRIref(); + break; + case TRIPLE_OPEN: + ConstTripleRef(); break; default: jj_la1[19] = jj_gen; + jj_consume_token(-1); + throw new ParseException(); + } + switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) { + case Q_IRI_REF: + case PNAME_NS: + case PNAME_LN: + case VAR1: + case VAR2: + case TRIPLE_OPEN: + ; + break; + default: + jj_la1[20] = jj_gen; break label_6; } } break; default: - jj_la1[20] = jj_gen; + jj_la1[21] = jj_gen; jj_consume_token(-1); throw new ParseException(); } @@ -875,19 +933,22 @@ final public void Describe() throws ParseException { } if (jjte000 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte000; + } } } if (jjte000 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte000; + } } } { - if (true) + if (true) { throw (Error) jjte000; + } } } finally { if (jjtc000) { @@ -909,7 +970,7 @@ final public void AskQuery() throws ParseException { ; break; default: - jj_la1[21] = jj_gen; + jj_la1[22] = jj_gen; break label_7; } DatasetClause(); @@ -922,7 +983,7 @@ final public void AskQuery() throws ParseException { BindingsClause(); break; default: - jj_la1[22] = jj_gen; + jj_la1[23] = jj_gen; ; } } catch (Throwable jjte000) { @@ -934,19 +995,22 @@ final public void AskQuery() throws ParseException { } if (jjte000 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte000; + } } } if (jjte000 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte000; + } } } { - if (true) + if (true) { throw (Error) jjte000; + } } } finally { if (jjtc000) { @@ -973,7 +1037,7 @@ final public void DatasetClause() throws ParseException { jjtn000.setNamed(true); break; default: - jj_la1[23] = jj_gen; + jj_la1[24] = jj_gen; ; } IRIref(); @@ -982,7 +1046,7 @@ final public void DatasetClause() throws ParseException { jj_consume_token(DEFAULT_GRAPH); break; default: - jj_la1[24] = jj_gen; + jj_la1[25] = jj_gen; jj_consume_token(-1); throw new ParseException(); } @@ -995,19 +1059,22 @@ final public void DatasetClause() throws ParseException { } if (jjte000 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte000; + } } } if (jjte000 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte000; + } } } { - if (true) + if (true) { throw (Error) jjte000; + } } } finally { if (jjtc000) { @@ -1027,7 +1094,7 @@ final public void WhereClause() throws ParseException { jj_consume_token(WHERE); break; default: - jj_la1[25] = jj_gen; + jj_la1[26] = jj_gen; ; } GroupGraphPattern(); @@ -1040,19 +1107,22 @@ final public void WhereClause() throws ParseException { } if (jjte000 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte000; + } } } if (jjte000 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte000; + } } } { - if (true) + if (true) { throw (Error) jjte000; + } } } finally { if (jjtc000) { @@ -1081,7 +1151,7 @@ final public void BindingsClause() throws ParseException { ; break; default: - jj_la1[26] = jj_gen; + jj_la1[27] = jj_gen; break label_8; } Var(); @@ -1094,7 +1164,7 @@ final public void BindingsClause() throws ParseException { ; break; default: - jj_la1[27] = jj_gen; + jj_la1[28] = jj_gen; break label_9; } BindingSet(); @@ -1102,7 +1172,7 @@ final public void BindingsClause() throws ParseException { jj_consume_token(RBRACE); break; default: - jj_la1[28] = jj_gen; + jj_la1[29] = jj_gen; jj_consume_token(-1); throw new ParseException(); } @@ -1115,19 +1185,22 @@ final public void BindingsClause() throws ParseException { } if (jjte000 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte000; + } } } if (jjte000 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte000; + } } } { - if (true) + if (true) { throw (Error) jjte000; + } } } finally { if (jjtc000) { @@ -1153,19 +1226,22 @@ final public void InlineData() throws ParseException { } if (jjte000 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte000; + } } } if (jjte000 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte000; + } } } { - if (true) + if (true) { throw (Error) jjte000; + } } } finally { if (jjtc000) { @@ -1185,7 +1261,7 @@ final public void DataBlock() throws ParseException { InlineDataFull(); break; default: - jj_la1[29] = jj_gen; + jj_la1[30] = jj_gen; jj_consume_token(-1); throw new ParseException(); } @@ -1215,10 +1291,11 @@ final public void InlineDataOneVar() throws ParseException { case STRING_LITERAL2: case STRING_LITERAL_LONG1: case STRING_LITERAL_LONG2: + case TRIPLE_OPEN: ; break; default: - jj_la1[30] = jj_gen; + jj_la1[31] = jj_gen; break label_10; } SimpleBindingSet(); @@ -1240,7 +1317,7 @@ final public void InlineDataFull() throws ParseException { ; break; default: - jj_la1[31] = jj_gen; + jj_la1[32] = jj_gen; break label_11; } Var(); @@ -1248,7 +1325,7 @@ final public void InlineDataFull() throws ParseException { jj_consume_token(RPAREN); break; default: - jj_la1[32] = jj_gen; + jj_la1[33] = jj_gen; jj_consume_token(-1); throw new ParseException(); } @@ -1260,7 +1337,7 @@ final public void InlineDataFull() throws ParseException { ; break; default: - jj_la1[33] = jj_gen; + jj_la1[34] = jj_gen; break label_12; } BindingSet(); @@ -1284,19 +1361,22 @@ final public void SimpleBindingSet() throws ParseException { } if (jjte000 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte000; + } } } if (jjte000 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte000; + } } } { - if (true) + if (true) { throw (Error) jjte000; + } } } finally { if (jjtc000) { @@ -1335,10 +1415,11 @@ final public void BindingSet() throws ParseException { case STRING_LITERAL2: case STRING_LITERAL_LONG1: case STRING_LITERAL_LONG2: + case TRIPLE_OPEN: ; break; default: - jj_la1[34] = jj_gen; + jj_la1[35] = jj_gen; break label_13; } BindingValue(); @@ -1349,7 +1430,7 @@ final public void BindingSet() throws ParseException { jj_consume_token(NIL); break; default: - jj_la1[35] = jj_gen; + jj_la1[36] = jj_gen; jj_consume_token(-1); throw new ParseException(); } @@ -1362,19 +1443,22 @@ final public void BindingSet() throws ParseException { } if (jjte000 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte000; + } } } if (jjte000 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte000; + } } } { - if (true) + if (true) { throw (Error) jjte000; + } } } finally { if (jjtc000) { @@ -1419,8 +1503,11 @@ final public void BindingValue() throws ParseException { case UNDEF: jj_consume_token(UNDEF); break; + case TRIPLE_OPEN: + ConstTripleRef(); + break; default: - jj_la1[36] = jj_gen; + jj_la1[37] = jj_gen; jj_consume_token(-1); throw new ParseException(); } @@ -1433,19 +1520,22 @@ final public void BindingValue() throws ParseException { } if (jjte000 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte000; + } } } if (jjte000 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte000; + } } } { - if (true) + if (true) { throw (Error) jjte000; + } } } finally { if (jjtc000) { @@ -1460,7 +1550,7 @@ final public void SolutionModifier() throws ParseException { GroupClause(); break; default: - jj_la1[37] = jj_gen; + jj_la1[38] = jj_gen; ; } switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) { @@ -1468,7 +1558,7 @@ final public void SolutionModifier() throws ParseException { HavingClause(); break; default: - jj_la1[38] = jj_gen; + jj_la1[39] = jj_gen; ; } switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) { @@ -1476,7 +1566,7 @@ final public void SolutionModifier() throws ParseException { OrderClause(); break; default: - jj_la1[39] = jj_gen; + jj_la1[40] = jj_gen; ; } switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) { @@ -1485,7 +1575,7 @@ final public void SolutionModifier() throws ParseException { LimitOffsetClauses(); break; default: - jj_la1[40] = jj_gen; + jj_la1[41] = jj_gen; ; } } @@ -1563,7 +1653,7 @@ final public void GroupClause() throws ParseException { ; break; default: - jj_la1[41] = jj_gen; + jj_la1[42] = jj_gen; break label_14; } } @@ -1576,19 +1666,22 @@ final public void GroupClause() throws ParseException { } if (jjte000 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte000; + } } } if (jjte000 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte000; + } } } { - if (true) + if (true) { throw (Error) jjte000; + } } } finally { if (jjtc000) { @@ -1672,7 +1765,7 @@ final public void OrderClause() throws ParseException { ; break; default: - jj_la1[42] = jj_gen; + jj_la1[43] = jj_gen; break label_15; } } @@ -1685,19 +1778,22 @@ final public void OrderClause() throws ParseException { } if (jjte000 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte000; + } } } if (jjte000 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte000; + } } } { - if (true) + if (true) { throw (Error) jjte000; + } } } finally { if (jjtc000) { @@ -1782,7 +1878,7 @@ final public void GroupCondition() throws ParseException { Var(); break; default: - jj_la1[43] = jj_gen; + jj_la1[44] = jj_gen; ; } jj_consume_token(RPAREN); @@ -1792,7 +1888,7 @@ final public void GroupCondition() throws ParseException { Var(); break; default: - jj_la1[44] = jj_gen; + jj_la1[45] = jj_gen; jj_consume_token(-1); throw new ParseException(); } @@ -1805,19 +1901,22 @@ final public void GroupCondition() throws ParseException { } if (jjte000 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte000; + } } } if (jjte000 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte000; + } } } { - if (true) + if (true) { throw (Error) jjte000; + } } } finally { if (jjtc000) { @@ -1843,19 +1942,22 @@ final public void HavingClause() throws ParseException { } if (jjte000 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte000; + } } } if (jjte000 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte000; + } } } { - if (true) + if (true) { throw (Error) jjte000; + } } } finally { if (jjtc000) { @@ -1886,13 +1988,13 @@ final public void OrderCondition() throws ParseException { jjtn000.setAscending(false); break; default: - jj_la1[45] = jj_gen; + jj_la1[46] = jj_gen; jj_consume_token(-1); throw new ParseException(); } break; default: - jj_la1[46] = jj_gen; + jj_la1[47] = jj_gen; ; } BrackettedExpression(); @@ -1962,7 +2064,7 @@ final public void OrderCondition() throws ParseException { Var(); break; default: - jj_la1[47] = jj_gen; + jj_la1[48] = jj_gen; jj_consume_token(-1); throw new ParseException(); } @@ -1975,19 +2077,22 @@ final public void OrderCondition() throws ParseException { } if (jjte000 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte000; + } } } if (jjte000 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte000; + } } } { - if (true) + if (true) { throw (Error) jjte000; + } } } finally { if (jjtc000) { @@ -2005,7 +2110,7 @@ final public void LimitOffsetClauses() throws ParseException { Offset(); break; default: - jj_la1[48] = jj_gen; + jj_la1[49] = jj_gen; ; } break; @@ -2016,12 +2121,12 @@ final public void LimitOffsetClauses() throws ParseException { Limit(); break; default: - jj_la1[49] = jj_gen; + jj_la1[50] = jj_gen; ; } break; default: - jj_la1[50] = jj_gen; + jj_la1[51] = jj_gen; jj_consume_token(-1); throw new ParseException(); } @@ -2078,15 +2183,16 @@ final public Token GroupGraphPattern() throws ParseException { SubSelect(); break; default: - jj_la1[51] = jj_gen; + jj_la1[52] = jj_gen; GraphPattern(); } endOfPatternToken = jj_consume_token(RBRACE); jjtree.closeNodeScope(jjtn000, true); jjtc000 = false; { - if (true) + if (true) { return endOfPatternToken; + } } } catch (Throwable jjte000) { if (jjtc000) { @@ -2097,19 +2203,22 @@ final public Token GroupGraphPattern() throws ParseException { } if (jjte000 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte000; + } } } if (jjte000 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte000; + } } } { - if (true) + if (true) { throw (Error) jjte000; + } } } finally { if (jjtc000) { @@ -2148,10 +2257,11 @@ final public void GraphPattern() throws ParseException { case STRING_LITERAL2: case STRING_LITERAL_LONG1: case STRING_LITERAL_LONG2: + case TRIPLE_OPEN: BasicGraphPattern(); break; default: - jj_la1[52] = jj_gen; + jj_la1[53] = jj_gen; ; } switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) { @@ -2167,13 +2277,13 @@ final public void GraphPattern() throws ParseException { jj_consume_token(DOT); break; default: - jj_la1[53] = jj_gen; + jj_la1[54] = jj_gen; ; } GraphPattern(); break; default: - jj_la1[54] = jj_gen; + jj_la1[55] = jj_gen; ; } } @@ -2210,6 +2320,7 @@ final public void BasicGraphPattern() throws ParseException { case STRING_LITERAL2: case STRING_LITERAL_LONG1: case STRING_LITERAL_LONG2: + case TRIPLE_OPEN: TriplesBlock(); label_16: while (true) { switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) { @@ -2218,7 +2329,7 @@ final public void BasicGraphPattern() throws ParseException { ; break; default: - jj_la1[55] = jj_gen; + jj_la1[56] = jj_gen; break label_16; } FilterOrBind(); @@ -2227,7 +2338,7 @@ final public void BasicGraphPattern() throws ParseException { jj_consume_token(DOT); break; default: - jj_la1[56] = jj_gen; + jj_la1[57] = jj_gen; ; } switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) { @@ -2256,10 +2367,11 @@ final public void BasicGraphPattern() throws ParseException { case STRING_LITERAL2: case STRING_LITERAL_LONG1: case STRING_LITERAL_LONG2: + case TRIPLE_OPEN: TriplesBlock(); break; default: - jj_la1[57] = jj_gen; + jj_la1[58] = jj_gen; ; } } @@ -2273,7 +2385,7 @@ final public void BasicGraphPattern() throws ParseException { jj_consume_token(DOT); break; default: - jj_la1[58] = jj_gen; + jj_la1[59] = jj_gen; ; } switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) { @@ -2302,10 +2414,11 @@ final public void BasicGraphPattern() throws ParseException { case STRING_LITERAL2: case STRING_LITERAL_LONG1: case STRING_LITERAL_LONG2: + case TRIPLE_OPEN: TriplesBlock(); break; default: - jj_la1[59] = jj_gen; + jj_la1[60] = jj_gen; ; } switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) { @@ -2314,13 +2427,13 @@ final public void BasicGraphPattern() throws ParseException { ; break; default: - jj_la1[60] = jj_gen; + jj_la1[61] = jj_gen; break label_17; } } break; default: - jj_la1[61] = jj_gen; + jj_la1[62] = jj_gen; jj_consume_token(-1); throw new ParseException(); } @@ -2333,19 +2446,22 @@ final public void BasicGraphPattern() throws ParseException { } if (jjte000 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte000; + } } } if (jjte000 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte000; + } } } { - if (true) + if (true) { throw (Error) jjte000; + } } } finally { if (jjtc000) { @@ -2363,7 +2479,7 @@ final public void FilterOrBind() throws ParseException { Bind(); break; default: - jj_la1[62] = jj_gen; + jj_la1[63] = jj_gen; jj_consume_token(-1); throw new ParseException(); } @@ -2385,7 +2501,7 @@ final public void TriplesBlock() throws ParseException { jj_consume_token(DOT); break; default: - jj_la1[63] = jj_gen; + jj_la1[64] = jj_gen; ; } } @@ -2406,7 +2522,7 @@ final public void TriplesTemplate() throws ParseException { jj_consume_token(DOT); break; default: - jj_la1[64] = jj_gen; + jj_la1[65] = jj_gen; ; } } @@ -2432,7 +2548,7 @@ final public void GraphPatternNotTriples() throws ParseException { InlineData(); break; default: - jj_la1[65] = jj_gen; + jj_la1[66] = jj_gen; jj_consume_token(-1); throw new ParseException(); } @@ -2451,7 +2567,7 @@ final public void OptionalGraphPattern() throws ParseException { SubSelect(); break; default: - jj_la1[66] = jj_gen; + jj_la1[67] = jj_gen; GraphPattern(); } jj_consume_token(RBRACE); @@ -2464,19 +2580,22 @@ final public void OptionalGraphPattern() throws ParseException { } if (jjte000 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte000; + } } } if (jjte000 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte000; + } } } { - if (true) + if (true) { throw (Error) jjte000; + } } } finally { if (jjtc000) { @@ -2503,19 +2622,22 @@ final public void GraphGraphPattern() throws ParseException { } if (jjte000 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte000; + } } } if (jjte000 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte000; + } } } { - if (true) + if (true) { throw (Error) jjte000; + } } } finally { if (jjtc000) { @@ -2543,19 +2665,22 @@ final public void GroupOrUnionGraphPattern() throws ParseException { } if (jjte001 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte001; + } } } if (jjte001 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte001; + } } } { - if (true) + if (true) { throw (Error) jjte001; + } } } finally { if (jjtc001) { @@ -2564,7 +2689,7 @@ final public void GroupOrUnionGraphPattern() throws ParseException { } break; default: - jj_la1[67] = jj_gen; + jj_la1[68] = jj_gen; ; } } @@ -2586,19 +2711,22 @@ final public void MinusGraphPattern() throws ParseException { } if (jjte000 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte000; + } } } if (jjte000 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte000; + } } } { - if (true) + if (true) { throw (Error) jjte000; + } } } finally { if (jjtc000) { @@ -2623,7 +2751,7 @@ final public void ServiceGraphPattern() throws ParseException { jjtn000.setSilent(true); break; default: - jj_la1[68] = jj_gen; + jj_la1[69] = jj_gen; ; } VarOrIRIref(); @@ -2641,19 +2769,22 @@ final public void ServiceGraphPattern() throws ParseException { } if (jjte000 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte000; + } } } if (jjte000 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte000; + } } } { - if (true) + if (true) { throw (Error) jjte000; + } } } finally { if (jjtc000) { @@ -2738,7 +2869,7 @@ final public void Constraint() throws ParseException { FunctionCall(); break; default: - jj_la1[69] = jj_gen; + jj_la1[70] = jj_gen; jj_consume_token(-1); throw new ParseException(); } @@ -2751,19 +2882,22 @@ final public void Constraint() throws ParseException { } if (jjte000 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte000; + } } } if (jjte000 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte000; + } } } { - if (true) + if (true) { throw (Error) jjte000; + } } } finally { if (jjtc000) { @@ -2789,19 +2923,22 @@ final public void FunctionCall() throws ParseException { } if (jjte000 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte000; + } } } if (jjte000 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte000; + } } } { - if (true) + if (true) { throw (Error) jjte000; + } } } finally { if (jjtc000) { @@ -2824,7 +2961,7 @@ final public void ArgList() throws ParseException { ; break; default: - jj_la1[70] = jj_gen; + jj_la1[71] = jj_gen; break label_20; } jj_consume_token(COMMA); @@ -2833,7 +2970,7 @@ final public void ArgList() throws ParseException { jj_consume_token(RPAREN); break; default: - jj_la1[71] = jj_gen; + jj_la1[72] = jj_gen; jj_consume_token(-1); throw new ParseException(); } @@ -2869,6 +3006,7 @@ final public void TriplesSameSubject() throws ParseException { case STRING_LITERAL2: case STRING_LITERAL_LONG1: case STRING_LITERAL_LONG2: + case TRIPLE_OPEN: VarOrTerm(); PropertyList(); break; @@ -2885,12 +3023,12 @@ final public void TriplesSameSubject() throws ParseException { PropertyList(); break; default: - jj_la1[72] = jj_gen; + jj_la1[73] = jj_gen; ; } break; default: - jj_la1[73] = jj_gen; + jj_la1[74] = jj_gen; jj_consume_token(-1); throw new ParseException(); } @@ -2903,19 +3041,22 @@ final public void TriplesSameSubject() throws ParseException { } if (jjte000 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte000; + } } } if (jjte000 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte000; + } } } { - if (true) + if (true) { throw (Error) jjte000; + } } } finally { if (jjtc000) { @@ -2945,12 +3086,12 @@ final public void PropertyList() throws ParseException { PropertyList(); break; default: - jj_la1[74] = jj_gen; + jj_la1[75] = jj_gen; ; } break; default: - jj_la1[75] = jj_gen; + jj_la1[76] = jj_gen; ; } } catch (Throwable jjte000) { @@ -2962,19 +3103,22 @@ final public void PropertyList() throws ParseException { } if (jjte000 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte000; + } } } if (jjte000 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte000; + } } } { - if (true) + if (true) { throw (Error) jjte000; + } } } finally { if (jjtc000) { @@ -2996,7 +3140,7 @@ final public void ObjectList() throws ParseException { ; break; default: - jj_la1[76] = jj_gen; + jj_la1[77] = jj_gen; break label_21; } jj_consume_token(COMMA); @@ -3011,19 +3155,22 @@ final public void ObjectList() throws ParseException { } if (jjte000 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte000; + } } } if (jjte000 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte000; + } } } { - if (true) + if (true) { throw (Error) jjte000; + } } } finally { if (jjtc000) { @@ -3062,6 +3209,7 @@ final public void TriplesSameSubjectPath() throws ParseException { case STRING_LITERAL2: case STRING_LITERAL_LONG1: case STRING_LITERAL_LONG2: + case TRIPLE_OPEN: VarOrTerm(); PropertyListPath(); break; @@ -3081,12 +3229,12 @@ final public void TriplesSameSubjectPath() throws ParseException { PropertyListPath(); break; default: - jj_la1[77] = jj_gen; + jj_la1[78] = jj_gen; ; } break; default: - jj_la1[78] = jj_gen; + jj_la1[79] = jj_gen; jj_consume_token(-1); throw new ParseException(); } @@ -3099,19 +3247,22 @@ final public void TriplesSameSubjectPath() throws ParseException { } if (jjte000 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte000; + } } } if (jjte000 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte000; + } } } { - if (true) + if (true) { throw (Error) jjte000; + } } } finally { if (jjtc000) { @@ -3141,7 +3292,7 @@ final public void PropertyListPath() throws ParseException { VerbSimple(); break; default: - jj_la1[79] = jj_gen; + jj_la1[80] = jj_gen; jj_consume_token(-1); throw new ParseException(); } @@ -3162,12 +3313,12 @@ final public void PropertyListPath() throws ParseException { PropertyListPath(); break; default: - jj_la1[80] = jj_gen; + jj_la1[81] = jj_gen; ; } break; default: - jj_la1[81] = jj_gen; + jj_la1[82] = jj_gen; ; } } catch (Throwable jjte000) { @@ -3179,19 +3330,22 @@ final public void PropertyListPath() throws ParseException { } if (jjte000 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte000; + } } } if (jjte000 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte000; + } } } { - if (true) + if (true) { throw (Error) jjte000; + } } } finally { if (jjtc000) { @@ -3213,7 +3367,7 @@ final public void ObjectListPath() throws ParseException { ; break; default: - jj_la1[82] = jj_gen; + jj_la1[83] = jj_gen; break label_22; } jj_consume_token(COMMA); @@ -3228,19 +3382,22 @@ final public void ObjectListPath() throws ParseException { } if (jjte000 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte000; + } } } if (jjte000 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte000; + } } } { - if (true) + if (true) { throw (Error) jjte000; + } } } finally { if (jjtc000) { @@ -3270,7 +3427,7 @@ final public void PathAlternative() throws ParseException { ; break; default: - jj_la1[83] = jj_gen; + jj_la1[84] = jj_gen; break label_23; } jj_consume_token(PIPE); @@ -3285,19 +3442,22 @@ final public void PathAlternative() throws ParseException { } if (jjte000 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte000; + } } } if (jjte000 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte000; + } } } { - if (true) + if (true) { throw (Error) jjte000; + } } } finally { if (jjtc000) { @@ -3319,7 +3479,7 @@ final public void PathSequence() throws ParseException { ; break; default: - jj_la1[84] = jj_gen; + jj_la1[85] = jj_gen; break label_24; } jj_consume_token(SLASH); @@ -3334,19 +3494,22 @@ final public void PathSequence() throws ParseException { } if (jjte000 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte000; + } } } if (jjte000 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte000; + } } } { - if (true) + if (true) { throw (Error) jjte000; + } } } finally { if (jjtc000) { @@ -3367,7 +3530,7 @@ final public void PathElt() throws ParseException { jjtn000.setInverse(true); break; default: - jj_la1[85] = jj_gen; + jj_la1[86] = jj_gen; ; } PathPrimary(); @@ -3378,7 +3541,7 @@ final public void PathElt() throws ParseException { PathMod(); break; default: - jj_la1[86] = jj_gen; + jj_la1[87] = jj_gen; ; } } catch (Throwable jjte000) { @@ -3390,19 +3553,22 @@ final public void PathElt() throws ParseException { } if (jjte000 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte000; + } } } if (jjte000 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte000; + } } } { - if (true) + if (true) { throw (Error) jjte000; + } } } finally { if (jjtc000) { @@ -3443,7 +3609,7 @@ final public void PathPrimary() throws ParseException { jj_consume_token(RPAREN); break; default: - jj_la1[87] = jj_gen; + jj_la1[88] = jj_gen; jj_consume_token(-1); throw new ParseException(); } @@ -3473,7 +3639,7 @@ final public void PathNegatedPropertySet() throws ParseException { ; break; default: - jj_la1[88] = jj_gen; + jj_la1[89] = jj_gen; break label_25; } jj_consume_token(PIPE); @@ -3481,13 +3647,13 @@ final public void PathNegatedPropertySet() throws ParseException { } break; default: - jj_la1[89] = jj_gen; + jj_la1[90] = jj_gen; ; } jj_consume_token(RPAREN); break; default: - jj_la1[90] = jj_gen; + jj_la1[91] = jj_gen; jj_consume_token(-1); throw new ParseException(); } @@ -3545,13 +3711,13 @@ final public void PathOneInPropertySet() throws ParseException { } break; default: - jj_la1[91] = jj_gen; + jj_la1[92] = jj_gen; jj_consume_token(-1); throw new ParseException(); } break; default: - jj_la1[92] = jj_gen; + jj_la1[93] = jj_gen; jj_consume_token(-1); throw new ParseException(); } @@ -3564,19 +3730,22 @@ final public void PathOneInPropertySet() throws ParseException { } if (jjte000 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte000; + } } } if (jjte000 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte000; + } } } { - if (true) + if (true) { throw (Error) jjte000; + } } } finally { if (jjtc000) { @@ -3616,7 +3785,7 @@ final public void PathMod() throws ParseException { jjtn000.setUpperBound(Long.MAX_VALUE); break; default: - jj_la1[93] = jj_gen; + jj_la1[94] = jj_gen; jj_consume_token(-1); throw new ParseException(); } @@ -3664,7 +3833,7 @@ final public void Verb() throws ParseException { } break; default: - jj_la1[94] = jj_gen; + jj_la1[95] = jj_gen; jj_consume_token(-1); throw new ParseException(); } @@ -3679,7 +3848,7 @@ final public void TriplesNode() throws ParseException { BlankNodePropertyList(); break; default: - jj_la1[95] = jj_gen; + jj_la1[96] = jj_gen; jj_consume_token(-1); throw new ParseException(); } @@ -3694,7 +3863,7 @@ final public void TriplesNodePath() throws ParseException { BlankNodePropertyListPath(); break; default: - jj_la1[96] = jj_gen; + jj_la1[97] = jj_gen; jj_consume_token(-1); throw new ParseException(); } @@ -3718,19 +3887,22 @@ final public void BlankNodePropertyList() throws ParseException { } if (jjte000 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte000; + } } } if (jjte000 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte000; + } } } { - if (true) + if (true) { throw (Error) jjte000; + } } } finally { if (jjtc000) { @@ -3757,19 +3929,22 @@ final public void BlankNodePropertyListPath() throws ParseException { } if (jjte000 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte000; + } } } if (jjte000 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte000; + } } } { - if (true) + if (true) { throw (Error) jjte000; + } } } finally { if (jjtc000) { @@ -3813,10 +3988,11 @@ final public void Collection() throws ParseException { case STRING_LITERAL2: case STRING_LITERAL_LONG1: case STRING_LITERAL_LONG2: + case TRIPLE_OPEN: ; break; default: - jj_la1[97] = jj_gen; + jj_la1[98] = jj_gen; break label_26; } } @@ -3830,19 +4006,22 @@ final public void Collection() throws ParseException { } if (jjte000 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte000; + } } } if (jjte000 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte000; + } } } { - if (true) + if (true) { throw (Error) jjte000; + } } } finally { if (jjtc000) { @@ -3886,10 +4065,11 @@ final public void CollectionPath() throws ParseException { case STRING_LITERAL2: case STRING_LITERAL_LONG1: case STRING_LITERAL_LONG2: + case TRIPLE_OPEN: ; break; default: - jj_la1[98] = jj_gen; + jj_la1[99] = jj_gen; break label_27; } } @@ -3903,19 +4083,22 @@ final public void CollectionPath() throws ParseException { } if (jjte000 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte000; + } } } if (jjte000 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte000; + } } } { - if (true) + if (true) { throw (Error) jjte000; + } } } finally { if (jjtc000) { @@ -3949,6 +4132,7 @@ final public void GraphNode() throws ParseException { case STRING_LITERAL2: case STRING_LITERAL_LONG1: case STRING_LITERAL_LONG2: + case TRIPLE_OPEN: VarOrTerm(); break; case LPAREN: @@ -3956,7 +4140,7 @@ final public void GraphNode() throws ParseException { TriplesNode(); break; default: - jj_la1[99] = jj_gen; + jj_la1[100] = jj_gen; jj_consume_token(-1); throw new ParseException(); } @@ -3987,6 +4171,7 @@ final public void GraphNodePath() throws ParseException { case STRING_LITERAL2: case STRING_LITERAL_LONG1: case STRING_LITERAL_LONG2: + case TRIPLE_OPEN: VarOrTerm(); break; case LPAREN: @@ -3994,7 +4179,7 @@ final public void GraphNodePath() throws ParseException { TriplesNodePath(); break; default: - jj_la1[100] = jj_gen; + jj_la1[101] = jj_gen; jj_consume_token(-1); throw new ParseException(); } @@ -4027,10 +4212,11 @@ final public void VarOrTerm() throws ParseException { case STRING_LITERAL2: case STRING_LITERAL_LONG1: case STRING_LITERAL_LONG2: + case TRIPLE_OPEN: GraphTerm(); break; default: - jj_la1[101] = jj_gen; + jj_la1[102] = jj_gen; jj_consume_token(-1); throw new ParseException(); } @@ -4048,7 +4234,7 @@ final public void VarOrIRIref() throws ParseException { IRIref(); break; default: - jj_la1[102] = jj_gen; + jj_la1[103] = jj_gen; jj_consume_token(-1); throw new ParseException(); } @@ -4069,7 +4255,7 @@ final public void Var() throws ParseException { t = jj_consume_token(VAR2); break; default: - jj_la1[103] = jj_gen; + jj_la1[104] = jj_gen; jj_consume_token(-1); throw new ParseException(); } @@ -4131,49 +4317,364 @@ final public void GraphTerm() throws ParseException { } } break; + case TRIPLE_OPEN: + TripleRef(); + break; default: - jj_la1[104] = jj_gen; + jj_la1[105] = jj_gen; jj_consume_token(-1); throw new ParseException(); } } - final public void Expression() throws ParseException { - ConditionalOrExpression(); - } - - final public void ConditionalOrExpression() throws ParseException { - ConditionalAndExpression(); - switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) { - case OR: - jj_consume_token(OR); - ASTOr jjtn001 = new ASTOr(JJTOR); - boolean jjtc001 = true; - jjtree.openNodeScope(jjtn001); - try { - ConditionalOrExpression(); - } catch (Throwable jjte001) { - if (jjtc001) { - jjtree.clearNodeScope(jjtn001); - jjtc001 = false; - } else { - jjtree.popNode(); - } - if (jjte001 instanceof RuntimeException) { - { - if (true) - throw (RuntimeException) jjte001; - } - } - if (jjte001 instanceof ParseException) { + final public void TripleRef() throws ParseException { + /* @bgen(jjtree) TripleRef */ + ASTTripleRef jjtn000 = new ASTTripleRef(JJTTRIPLEREF); + boolean jjtc000 = true; + jjtree.openNodeScope(jjtn000); + try { + jj_consume_token(TRIPLE_OPEN); + switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) { + case NIL: + case ANON: + case TRUE: + case FALSE: + case Q_IRI_REF: + case PNAME_NS: + case PNAME_LN: + case BLANK_NODE_LABEL: + case INTEGER: + case INTEGER_POSITIVE: + case INTEGER_NEGATIVE: + case DECIMAL: + case DECIMAL_POSITIVE: + case DECIMAL_NEGATIVE: + case DOUBLE: + case DOUBLE_POSITIVE: + case DOUBLE_NEGATIVE: + case STRING_LITERAL1: + case STRING_LITERAL2: + case STRING_LITERAL_LONG1: + case STRING_LITERAL_LONG2: + case TRIPLE_OPEN: + GraphTerm(); + break; + case VAR1: + case VAR2: + Var(); + break; + default: + jj_la1[106] = jj_gen; + jj_consume_token(-1); + throw new ParseException(); + } + switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) { + case Q_IRI_REF: + case PNAME_NS: + case PNAME_LN: + IRIref(); + break; + case VAR1: + case VAR2: + Var(); + break; + default: + jj_la1[107] = jj_gen; + jj_consume_token(-1); + throw new ParseException(); + } + switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) { + case NIL: + case ANON: + case TRUE: + case FALSE: + case Q_IRI_REF: + case PNAME_NS: + case PNAME_LN: + case BLANK_NODE_LABEL: + case INTEGER: + case INTEGER_POSITIVE: + case INTEGER_NEGATIVE: + case DECIMAL: + case DECIMAL_POSITIVE: + case DECIMAL_NEGATIVE: + case DOUBLE: + case DOUBLE_POSITIVE: + case DOUBLE_NEGATIVE: + case STRING_LITERAL1: + case STRING_LITERAL2: + case STRING_LITERAL_LONG1: + case STRING_LITERAL_LONG2: + case TRIPLE_OPEN: + GraphTerm(); + break; + case VAR1: + case VAR2: + Var(); + break; + default: + jj_la1[108] = jj_gen; + jj_consume_token(-1); + throw new ParseException(); + } + jj_consume_token(TRIPLE_CLOSE); + } catch (Throwable jjte000) { + if (jjtc000) { + jjtree.clearNodeScope(jjtn000); + jjtc000 = false; + } else { + jjtree.popNode(); + } + if (jjte000 instanceof RuntimeException) { + { + if (true) { + throw (RuntimeException) jjte000; + } + } + } + if (jjte000 instanceof ParseException) { + { + if (true) { + throw (ParseException) jjte000; + } + } + } + { + if (true) { + throw (Error) jjte000; + } + } + } finally { + if (jjtc000) { + jjtree.closeNodeScope(jjtn000, true); + } + } + } + + final public void ConstTripleRef() throws ParseException { + /* @bgen(jjtree) ConstTripleRef */ + ASTConstTripleRef jjtn000 = new ASTConstTripleRef(JJTCONSTTRIPLEREF); + boolean jjtc000 = true; + jjtree.openNodeScope(jjtn000); + try { + jj_consume_token(TRIPLE_OPEN); + switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) { + case TRIPLE_OPEN: + ConstTripleRef(); + break; + case Q_IRI_REF: + case PNAME_NS: + case PNAME_LN: + IRIref(); + break; + default: + jj_la1[109] = jj_gen; + jj_consume_token(-1); + throw new ParseException(); + } + IRIref(); + switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) { + case TRIPLE_OPEN: + ConstTripleRef(); + break; + case Q_IRI_REF: + case PNAME_NS: + case PNAME_LN: + IRIref(); + break; + case INTEGER: + case INTEGER_POSITIVE: + case INTEGER_NEGATIVE: + case DECIMAL: + case DECIMAL_POSITIVE: + case DECIMAL_NEGATIVE: + case DOUBLE: + case DOUBLE_POSITIVE: + case DOUBLE_NEGATIVE: + NumericLiteral(); + break; + case STRING_LITERAL1: + case STRING_LITERAL2: + case STRING_LITERAL_LONG1: + case STRING_LITERAL_LONG2: + RDFLiteral(); + break; + case TRUE: + case FALSE: + BooleanLiteral(); + break; + default: + jj_la1[110] = jj_gen; + jj_consume_token(-1); + throw new ParseException(); + } + jj_consume_token(TRIPLE_CLOSE); + } catch (Throwable jjte000) { + if (jjtc000) { + jjtree.clearNodeScope(jjtn000); + jjtc000 = false; + } else { + jjtree.popNode(); + } + if (jjte000 instanceof RuntimeException) { + { + if (true) { + throw (RuntimeException) jjte000; + } + } + } + if (jjte000 instanceof ParseException) { + { + if (true) { + throw (ParseException) jjte000; + } + } + } + { + if (true) { + throw (Error) jjte000; + } + } + } finally { + if (jjtc000) { + jjtree.closeNodeScope(jjtn000, true); + } + } + } + + final public void Expression() throws ParseException { + switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) { + case TRIPLE_OPEN: + TripleRef(); + break; + case LPAREN: + case NOT: + case PLUS: + case MINUS: + case EXISTS: + case NOT_EXISTS: + case STR: + case LANG: + case LANGMATCHES: + case DATATYPE: + case BOUND: + case SAMETERM: + case IS_IRI: + case IS_BLANK: + case IS_LITERAL: + case IS_NUMERIC: + case COALESCE: + case BNODE: + case STRDT: + case STRLANG: + case UUID: + case STRUUID: + case IRI: + case IF: + case COUNT: + case SUM: + case MIN: + case MAX: + case AVG: + case SAMPLE: + case GROUP_CONCAT: + case REGEX: + case TRUE: + case FALSE: + case STRLEN: + case SUBSTR: + case STR_STARTS: + case STR_ENDS: + case STR_BEFORE: + case STR_AFTER: + case REPLACE: + case UCASE: + case LCASE: + case CONCAT: + case CONTAINS: + case ENCODE_FOR_URI: + case RAND: + case ABS: + case CEIL: + case FLOOR: + case ROUND: + case NOW: + case YEAR: + case MONTH: + case DAY: + case HOURS: + case MINUTES: + case SECONDS: + case TIMEZONE: + case TZ: + case MD5: + case SHA1: + case SHA224: + case SHA256: + case SHA384: + case SHA512: + case Q_IRI_REF: + case PNAME_NS: + case PNAME_LN: + case VAR1: + case VAR2: + case INTEGER: + case INTEGER_POSITIVE: + case INTEGER_NEGATIVE: + case DECIMAL: + case DECIMAL_POSITIVE: + case DECIMAL_NEGATIVE: + case DOUBLE: + case DOUBLE_POSITIVE: + case DOUBLE_NEGATIVE: + case STRING_LITERAL1: + case STRING_LITERAL2: + case STRING_LITERAL_LONG1: + case STRING_LITERAL_LONG2: + ConditionalOrExpression(); + break; + default: + jj_la1[111] = jj_gen; + jj_consume_token(-1); + throw new ParseException(); + } + } + + final public void ConditionalOrExpression() throws ParseException { + ConditionalAndExpression(); + switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) { + case OR: + jj_consume_token(OR); + ASTOr jjtn001 = new ASTOr(JJTOR); + boolean jjtc001 = true; + jjtree.openNodeScope(jjtn001); + try { + ConditionalOrExpression(); + } catch (Throwable jjte001) { + if (jjtc001) { + jjtree.clearNodeScope(jjtn001); + jjtc001 = false; + } else { + jjtree.popNode(); + } + if (jjte001 instanceof RuntimeException) { { - if (true) + if (true) { + throw (RuntimeException) jjte001; + } + } + } + if (jjte001 instanceof ParseException) { + { + if (true) { throw (ParseException) jjte001; + } } } { - if (true) + if (true) { throw (Error) jjte001; + } } } finally { if (jjtc001) { @@ -4182,7 +4683,7 @@ final public void ConditionalOrExpression() throws ParseException { } break; default: - jj_la1[105] = jj_gen; + jj_la1[112] = jj_gen; ; } } @@ -4206,19 +4707,22 @@ final public void ConditionalAndExpression() throws ParseException { } if (jjte001 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte001; + } } } if (jjte001 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte001; + } } } { - if (true) + if (true) { throw (Error) jjte001; + } } } finally { if (jjtc001) { @@ -4227,7 +4731,7 @@ final public void ConditionalAndExpression() throws ParseException { } break; default: - jj_la1[106] = jj_gen; + jj_la1[113] = jj_gen; ; } } @@ -4359,19 +4863,22 @@ final public void RelationalExpression() throws ParseException { } if (jjte007 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte007; + } } } if (jjte007 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte007; + } } } { - if (true) + if (true) { throw (Error) jjte007; + } } } finally { if (jjtc007) { @@ -4394,19 +4901,22 @@ final public void RelationalExpression() throws ParseException { } if (jjte008 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte008; + } } } if (jjte008 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte008; + } } } { - if (true) + if (true) { throw (Error) jjte008; + } } } finally { if (jjtc008) { @@ -4415,13 +4925,13 @@ final public void RelationalExpression() throws ParseException { } break; default: - jj_la1[107] = jj_gen; + jj_la1[114] = jj_gen; jj_consume_token(-1); throw new ParseException(); } break; default: - jj_la1[108] = jj_gen; + jj_la1[115] = jj_gen; ; } } @@ -4445,7 +4955,7 @@ final public void AdditiveExpression() throws ParseException { ; break; default: - jj_la1[109] = jj_gen; + jj_la1[116] = jj_gen; break label_28; } switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) { @@ -4516,7 +5026,7 @@ final public void AdditiveExpression() throws ParseException { } break; default: - jj_la1[110] = jj_gen; + jj_la1[117] = jj_gen; jj_consume_token(-1); throw new ParseException(); } @@ -4532,7 +5042,7 @@ final public void MultiplicativeExpression() throws ParseException { ; break; default: - jj_la1[111] = jj_gen; + jj_la1[118] = jj_gen; break label_29; } switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) { @@ -4569,7 +5079,7 @@ final public void MultiplicativeExpression() throws ParseException { } break; default: - jj_la1[112] = jj_gen; + jj_la1[119] = jj_gen; jj_consume_token(-1); throw new ParseException(); } @@ -4594,19 +5104,22 @@ final public void UnaryExpression() throws ParseException { } if (jjte001 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte001; + } } } if (jjte001 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte001; + } } } { - if (true) + if (true) { throw (Error) jjte001; + } } } finally { if (jjtc001) { @@ -4701,7 +5214,7 @@ final public void UnaryExpression() throws ParseException { jj_consume_token(PLUS); break; default: - jj_la1[113] = jj_gen; + jj_la1[120] = jj_gen; ; } PrimaryExpression(); @@ -4723,7 +5236,7 @@ final public void UnaryExpression() throws ParseException { } break; default: - jj_la1[114] = jj_gen; + jj_la1[121] = jj_gen; jj_consume_token(-1); throw new ParseException(); } @@ -4808,7 +5321,7 @@ final public void PrimaryExpression() throws ParseException { BuiltInCall(); break; default: - jj_la1[115] = jj_gen; + jj_la1[122] = jj_gen; if (jj_2_4(2)) { FunctionCall(); } else { @@ -4853,7 +5366,7 @@ final public void PrimaryExpression() throws ParseException { Aggregate(); break; default: - jj_la1[116] = jj_gen; + jj_la1[123] = jj_gen; jj_consume_token(-1); throw new ParseException(); } @@ -4885,7 +5398,7 @@ final public void Aggregate() throws ParseException { GroupConcat(); break; default: - jj_la1[117] = jj_gen; + jj_la1[124] = jj_gen; jj_consume_token(-1); throw new ParseException(); } @@ -4905,7 +5418,7 @@ final public void Count() throws ParseException { jjtn000.setDistinct(true); break; default: - jj_la1[118] = jj_gen; + jj_la1[125] = jj_gen; ; } switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) { @@ -4997,10 +5510,11 @@ final public void Count() throws ParseException { case STRING_LITERAL2: case STRING_LITERAL_LONG1: case STRING_LITERAL_LONG2: + case TRIPLE_OPEN: Expression(); break; default: - jj_la1[119] = jj_gen; + jj_la1[126] = jj_gen; jj_consume_token(-1); throw new ParseException(); } @@ -5014,19 +5528,22 @@ final public void Count() throws ParseException { } if (jjte000 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte000; + } } } if (jjte000 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte000; + } } } { - if (true) + if (true) { throw (Error) jjte000; + } } } finally { if (jjtc000) { @@ -5049,7 +5566,7 @@ final public void Sum() throws ParseException { jjtn000.setDistinct(true); break; default: - jj_la1[120] = jj_gen; + jj_la1[127] = jj_gen; ; } Expression(); @@ -5063,19 +5580,22 @@ final public void Sum() throws ParseException { } if (jjte000 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte000; + } } } if (jjte000 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte000; + } } } { - if (true) + if (true) { throw (Error) jjte000; + } } } finally { if (jjtc000) { @@ -5098,7 +5618,7 @@ final public void Min() throws ParseException { jjtn000.setDistinct(true); break; default: - jj_la1[121] = jj_gen; + jj_la1[128] = jj_gen; ; } Expression(); @@ -5112,19 +5632,22 @@ final public void Min() throws ParseException { } if (jjte000 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte000; + } } } if (jjte000 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte000; + } } } { - if (true) + if (true) { throw (Error) jjte000; + } } } finally { if (jjtc000) { @@ -5147,7 +5670,7 @@ final public void Max() throws ParseException { jjtn000.setDistinct(true); break; default: - jj_la1[122] = jj_gen; + jj_la1[129] = jj_gen; ; } Expression(); @@ -5161,19 +5684,22 @@ final public void Max() throws ParseException { } if (jjte000 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte000; + } } } if (jjte000 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte000; + } } } { - if (true) + if (true) { throw (Error) jjte000; + } } } finally { if (jjtc000) { @@ -5196,7 +5722,7 @@ final public void Avg() throws ParseException { jjtn000.setDistinct(true); break; default: - jj_la1[123] = jj_gen; + jj_la1[130] = jj_gen; ; } Expression(); @@ -5210,19 +5736,22 @@ final public void Avg() throws ParseException { } if (jjte000 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte000; + } } } if (jjte000 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte000; + } } } { - if (true) + if (true) { throw (Error) jjte000; + } } } finally { if (jjtc000) { @@ -5245,7 +5774,7 @@ final public void Sample() throws ParseException { jjtn000.setDistinct(true); break; default: - jj_la1[124] = jj_gen; + jj_la1[131] = jj_gen; ; } Expression(); @@ -5259,19 +5788,22 @@ final public void Sample() throws ParseException { } if (jjte000 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte000; + } } } if (jjte000 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte000; + } } } { - if (true) + if (true) { throw (Error) jjte000; + } } } finally { if (jjtc000) { @@ -5294,7 +5826,7 @@ final public void GroupConcat() throws ParseException { jjtn000.setDistinct(true); break; default: - jj_la1[125] = jj_gen; + jj_la1[132] = jj_gen; ; } Expression(); @@ -5306,7 +5838,7 @@ final public void GroupConcat() throws ParseException { Expression(); break; default: - jj_la1[126] = jj_gen; + jj_la1[133] = jj_gen; ; } jj_consume_token(RPAREN); @@ -5319,19 +5851,22 @@ final public void GroupConcat() throws ParseException { } if (jjte000 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte000; + } } } if (jjte000 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte000; + } } } { - if (true) + if (true) { throw (Error) jjte000; + } } } finally { if (jjtc000) { @@ -5424,7 +5959,7 @@ final public void BuiltInCall() throws ParseException { HashFunction(); break; default: - jj_la1[127] = jj_gen; + jj_la1[134] = jj_gen; jj_consume_token(-1); throw new ParseException(); } @@ -5475,7 +6010,7 @@ final public void StringFunction() throws ParseException { RegexExpression(); break; default: - jj_la1[128] = jj_gen; + jj_la1[135] = jj_gen; jj_consume_token(-1); throw new ParseException(); } @@ -5499,7 +6034,7 @@ final public void NumericFunction() throws ParseException { Round(); break; default: - jj_la1[129] = jj_gen; + jj_la1[136] = jj_gen; jj_consume_token(-1); throw new ParseException(); } @@ -5547,7 +6082,7 @@ final public void RDFTermFunction() throws ParseException { STRUUID(); break; default: - jj_la1[130] = jj_gen; + jj_la1[137] = jj_gen; jj_consume_token(-1); throw new ParseException(); } @@ -5583,7 +6118,7 @@ final public void DateTimeFunction() throws ParseException { Tz(); break; default: - jj_la1[131] = jj_gen; + jj_la1[138] = jj_gen; jj_consume_token(-1); throw new ParseException(); } @@ -5610,7 +6145,7 @@ final public void HashFunction() throws ParseException { SHA512(); break; default: - jj_la1[132] = jj_gen; + jj_la1[139] = jj_gen; jj_consume_token(-1); throw new ParseException(); } @@ -5635,19 +6170,22 @@ final public void MD5() throws ParseException { } if (jjte000 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte000; + } } } if (jjte000 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte000; + } } } { - if (true) + if (true) { throw (Error) jjte000; + } } } finally { if (jjtc000) { @@ -5675,19 +6213,22 @@ final public void SHA1() throws ParseException { } if (jjte000 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte000; + } } } if (jjte000 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte000; + } } } { - if (true) + if (true) { throw (Error) jjte000; + } } } finally { if (jjtc000) { @@ -5715,19 +6256,22 @@ final public void SHA224() throws ParseException { } if (jjte000 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte000; + } } } if (jjte000 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte000; + } } } { - if (true) + if (true) { throw (Error) jjte000; + } } } finally { if (jjtc000) { @@ -5755,19 +6299,22 @@ final public void SHA256() throws ParseException { } if (jjte000 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte000; + } } } if (jjte000 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte000; + } } } { - if (true) + if (true) { throw (Error) jjte000; + } } } finally { if (jjtc000) { @@ -5795,19 +6342,22 @@ final public void SHA384() throws ParseException { } if (jjte000 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte000; + } } } if (jjte000 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte000; + } } } { - if (true) + if (true) { throw (Error) jjte000; + } } } finally { if (jjtc000) { @@ -5835,19 +6385,22 @@ final public void SHA512() throws ParseException { } if (jjte000 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte000; + } } } if (jjte000 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte000; + } } } { - if (true) + if (true) { throw (Error) jjte000; + } } } finally { if (jjtc000) { @@ -5890,19 +6443,22 @@ final public void Year() throws ParseException { } if (jjte000 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte000; + } } } if (jjte000 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte000; + } } } { - if (true) + if (true) { throw (Error) jjte000; + } } } finally { if (jjtc000) { @@ -5930,19 +6486,22 @@ final public void Month() throws ParseException { } if (jjte000 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte000; + } } } if (jjte000 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte000; + } } } { - if (true) + if (true) { throw (Error) jjte000; + } } } finally { if (jjtc000) { @@ -5970,19 +6529,22 @@ final public void Day() throws ParseException { } if (jjte000 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte000; + } } } if (jjte000 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte000; + } } } { - if (true) + if (true) { throw (Error) jjte000; + } } } finally { if (jjtc000) { @@ -6010,19 +6572,22 @@ final public void Hours() throws ParseException { } if (jjte000 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte000; + } } } if (jjte000 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte000; + } } } { - if (true) + if (true) { throw (Error) jjte000; + } } } finally { if (jjtc000) { @@ -6050,19 +6615,22 @@ final public void Minutes() throws ParseException { } if (jjte000 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte000; + } } } if (jjte000 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte000; + } } } { - if (true) + if (true) { throw (Error) jjte000; + } } } finally { if (jjtc000) { @@ -6090,19 +6658,22 @@ final public void Seconds() throws ParseException { } if (jjte000 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte000; + } } } if (jjte000 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte000; + } } } { - if (true) + if (true) { throw (Error) jjte000; + } } } finally { if (jjtc000) { @@ -6130,19 +6701,22 @@ final public void Timezone() throws ParseException { } if (jjte000 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte000; + } } } if (jjte000 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte000; + } } } { - if (true) + if (true) { throw (Error) jjte000; + } } } finally { if (jjtc000) { @@ -6170,19 +6744,22 @@ final public void Tz() throws ParseException { } if (jjte000 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte000; + } } } if (jjte000 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte000; + } } } { - if (true) + if (true) { throw (Error) jjte000; + } } } finally { if (jjtc000) { @@ -6225,19 +6802,22 @@ final public void Abs() throws ParseException { } if (jjte000 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte000; + } } } if (jjte000 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte000; + } } } { - if (true) + if (true) { throw (Error) jjte000; + } } } finally { if (jjtc000) { @@ -6265,19 +6845,22 @@ final public void Ceil() throws ParseException { } if (jjte000 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte000; + } } } if (jjte000 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte000; + } } } { - if (true) + if (true) { throw (Error) jjte000; + } } } finally { if (jjtc000) { @@ -6305,19 +6888,22 @@ final public void Floor() throws ParseException { } if (jjte000 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte000; + } } } if (jjte000 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte000; + } } } { - if (true) + if (true) { throw (Error) jjte000; + } } } finally { if (jjtc000) { @@ -6345,19 +6931,22 @@ final public void Round() throws ParseException { } if (jjte000 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte000; + } } } if (jjte000 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte000; + } } } { - if (true) + if (true) { throw (Error) jjte000; + } } } finally { if (jjtc000) { @@ -6383,7 +6972,7 @@ final public void Substr() throws ParseException { Expression(); break; default: - jj_la1[133] = jj_gen; + jj_la1[140] = jj_gen; ; } jj_consume_token(RPAREN); @@ -6396,19 +6985,22 @@ final public void Substr() throws ParseException { } if (jjte000 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte000; + } } } if (jjte000 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte000; + } } } { - if (true) + if (true) { throw (Error) jjte000; + } } } finally { if (jjtc000) { @@ -6436,19 +7028,22 @@ final public void StrLen() throws ParseException { } if (jjte000 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte000; + } } } if (jjte000 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte000; + } } } { - if (true) + if (true) { throw (Error) jjte000; + } } } finally { if (jjtc000) { @@ -6476,19 +7071,22 @@ final public void UpperCase() throws ParseException { } if (jjte000 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte000; + } } } if (jjte000 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte000; + } } } { - if (true) + if (true) { throw (Error) jjte000; + } } } finally { if (jjtc000) { @@ -6516,19 +7114,22 @@ final public void LowerCase() throws ParseException { } if (jjte000 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte000; + } } } if (jjte000 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte000; + } } } { - if (true) + if (true) { throw (Error) jjte000; + } } } finally { if (jjtc000) { @@ -6558,19 +7159,22 @@ final public void StrStarts() throws ParseException { } if (jjte000 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte000; + } } } if (jjte000 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte000; + } } } { - if (true) + if (true) { throw (Error) jjte000; + } } } finally { if (jjtc000) { @@ -6600,19 +7204,22 @@ final public void StrEnds() throws ParseException { } if (jjte000 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte000; + } } } if (jjte000 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte000; + } } } { - if (true) + if (true) { throw (Error) jjte000; + } } } finally { if (jjtc000) { @@ -6642,19 +7249,22 @@ final public void StrBefore() throws ParseException { } if (jjte000 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte000; + } } } if (jjte000 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte000; + } } } { - if (true) + if (true) { throw (Error) jjte000; + } } } finally { if (jjtc000) { @@ -6684,19 +7294,22 @@ final public void StrAfter() throws ParseException { } if (jjte000 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte000; + } } } if (jjte000 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte000; + } } } { - if (true) + if (true) { throw (Error) jjte000; + } } } finally { if (jjtc000) { @@ -6724,7 +7337,7 @@ final public void Replace() throws ParseException { Expression(); break; default: - jj_la1[134] = jj_gen; + jj_la1[141] = jj_gen; ; } jj_consume_token(RPAREN); @@ -6737,19 +7350,22 @@ final public void Replace() throws ParseException { } if (jjte000 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte000; + } } } if (jjte000 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte000; + } } } { - if (true) + if (true) { throw (Error) jjte000; + } } } finally { if (jjtc000) { @@ -6775,19 +7391,22 @@ final public void Concat() throws ParseException { } if (jjte000 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte000; + } } } if (jjte000 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte000; + } } } { - if (true) + if (true) { throw (Error) jjte000; + } } } finally { if (jjtc000) { @@ -6817,19 +7436,22 @@ final public void Contains() throws ParseException { } if (jjte000 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte000; + } } } if (jjte000 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte000; + } } } { - if (true) + if (true) { throw (Error) jjte000; + } } } finally { if (jjtc000) { @@ -6857,19 +7479,22 @@ final public void EncodeForURI() throws ParseException { } if (jjte000 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte000; + } } } if (jjte000 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte000; + } } } { - if (true) + if (true) { throw (Error) jjte000; + } } } finally { if (jjtc000) { @@ -6901,19 +7526,22 @@ final public void If() throws ParseException { } if (jjte000 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte000; + } } } if (jjte000 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte000; + } } } { - if (true) + if (true) { throw (Error) jjte000; + } } } finally { if (jjtc000) { @@ -6939,19 +7567,22 @@ final public void In() throws ParseException { } if (jjte000 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte000; + } } } if (jjte000 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte000; + } } } { - if (true) + if (true) { throw (Error) jjte000; + } } } finally { if (jjtc000) { @@ -6977,19 +7608,22 @@ final public void NotIn() throws ParseException { } if (jjte000 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte000; + } } } if (jjte000 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte000; + } } } { - if (true) + if (true) { throw (Error) jjte000; + } } } finally { if (jjtc000) { @@ -7013,7 +7647,7 @@ final public void Coalesce() throws ParseException { ; break; default: - jj_la1[135] = jj_gen; + jj_la1[142] = jj_gen; break label_30; } jj_consume_token(COMMA); @@ -7029,19 +7663,22 @@ final public void Coalesce() throws ParseException { } if (jjte000 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte000; + } } } if (jjte000 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte000; + } } } { - if (true) + if (true) { throw (Error) jjte000; + } } } finally { if (jjtc000) { @@ -7069,19 +7706,22 @@ final public void Str() throws ParseException { } if (jjte000 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte000; + } } } if (jjte000 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte000; + } } } { - if (true) + if (true) { throw (Error) jjte000; + } } } finally { if (jjtc000) { @@ -7109,19 +7749,22 @@ final public void Lang() throws ParseException { } if (jjte000 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte000; + } } } if (jjte000 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte000; + } } } { - if (true) + if (true) { throw (Error) jjte000; + } } } finally { if (jjtc000) { @@ -7151,19 +7794,22 @@ final public void LangMatches() throws ParseException { } if (jjte000 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte000; + } } } if (jjte000 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte000; + } } } { - if (true) + if (true) { throw (Error) jjte000; + } } } finally { if (jjtc000) { @@ -7191,19 +7837,22 @@ final public void Datatype() throws ParseException { } if (jjte000 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte000; + } } } if (jjte000 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte000; + } } } { - if (true) + if (true) { throw (Error) jjte000; + } } } finally { if (jjtc000) { @@ -7231,19 +7880,22 @@ final public void Bound() throws ParseException { } if (jjte000 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte000; + } } } if (jjte000 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte000; + } } } { - if (true) + if (true) { throw (Error) jjte000; + } } } finally { if (jjtc000) { @@ -7273,19 +7925,22 @@ final public void SameTerm() throws ParseException { } if (jjte000 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte000; + } } } if (jjte000 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte000; + } } } { - if (true) + if (true) { throw (Error) jjte000; + } } } finally { if (jjtc000) { @@ -7313,19 +7968,22 @@ final public void IsIRI() throws ParseException { } if (jjte000 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte000; + } } } if (jjte000 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte000; + } } } { - if (true) + if (true) { throw (Error) jjte000; + } } } finally { if (jjtc000) { @@ -7353,19 +8011,22 @@ final public void IsBlank() throws ParseException { } if (jjte000 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte000; + } } } if (jjte000 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte000; + } } } { - if (true) + if (true) { throw (Error) jjte000; + } } } finally { if (jjtc000) { @@ -7393,19 +8054,22 @@ final public void IsLiteral() throws ParseException { } if (jjte000 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte000; + } } } if (jjte000 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte000; + } } } { - if (true) + if (true) { throw (Error) jjte000; + } } } finally { if (jjtc000) { @@ -7433,19 +8097,22 @@ final public void IsNumeric() throws ParseException { } if (jjte000 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte000; + } } } if (jjte000 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte000; + } } } { - if (true) + if (true) { throw (Error) jjte000; + } } } finally { if (jjtc000) { @@ -7471,7 +8138,7 @@ final public void BNodeFunc() throws ParseException { jj_consume_token(RPAREN); break; default: - jj_la1[136] = jj_gen; + jj_la1[143] = jj_gen; jj_consume_token(-1); throw new ParseException(); } @@ -7484,19 +8151,22 @@ final public void BNodeFunc() throws ParseException { } if (jjte000 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte000; + } } } if (jjte000 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte000; + } } } { - if (true) + if (true) { throw (Error) jjte000; + } } } finally { if (jjtc000) { @@ -7524,19 +8194,22 @@ final public void IRIFunc() throws ParseException { } if (jjte000 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte000; + } } } if (jjte000 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte000; + } } } { - if (true) + if (true) { throw (Error) jjte000; + } } } finally { if (jjtc000) { @@ -7566,19 +8239,22 @@ final public void StrDt() throws ParseException { } if (jjte000 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte000; + } } } if (jjte000 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte000; + } } } { - if (true) + if (true) { throw (Error) jjte000; + } } } finally { if (jjtc000) { @@ -7608,19 +8284,22 @@ final public void StrLang() throws ParseException { } if (jjte000 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte000; + } } } if (jjte000 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte000; + } } } { - if (true) + if (true) { throw (Error) jjte000; + } } } finally { if (jjtc000) { @@ -7680,19 +8359,22 @@ final public void Bind() throws ParseException { } if (jjte000 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte000; + } } } if (jjte000 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte000; + } } } { - if (true) + if (true) { throw (Error) jjte000; + } } } finally { if (jjtc000) { @@ -7718,7 +8400,7 @@ final public void RegexExpression() throws ParseException { Expression(); break; default: - jj_la1[137] = jj_gen; + jj_la1[144] = jj_gen; ; } jj_consume_token(RPAREN); @@ -7731,19 +8413,22 @@ final public void RegexExpression() throws ParseException { } if (jjte000 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte000; + } } } if (jjte000 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte000; + } } } { - if (true) + if (true) { throw (Error) jjte000; + } } } finally { if (jjtc000) { @@ -7769,19 +8454,22 @@ final public void ExistsFunc() throws ParseException { } if (jjte000 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte000; + } } } if (jjte000 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte000; + } } } { - if (true) + if (true) { throw (Error) jjte000; + } } } finally { if (jjtc000) { @@ -7807,19 +8495,22 @@ final public void NotExistsFunc() throws ParseException { } if (jjte000 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte000; + } } } if (jjte000 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte000; + } } } { - if (true) + if (true) { throw (Error) jjte000; + } } } finally { if (jjtc000) { @@ -7849,13 +8540,13 @@ final public void RDFLiteral() throws ParseException { IRIref(); break; default: - jj_la1[138] = jj_gen; + jj_la1[145] = jj_gen; jj_consume_token(-1); throw new ParseException(); } break; default: - jj_la1[139] = jj_gen; + jj_la1[146] = jj_gen; ; } } catch (Throwable jjte000) { @@ -7867,19 +8558,22 @@ final public void RDFLiteral() throws ParseException { } if (jjte000 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte000; + } } } if (jjte000 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte000; + } } } { - if (true) + if (true) { throw (Error) jjte000; + } } } finally { if (jjtc000) { @@ -7906,7 +8600,7 @@ final public void NumericLiteral() throws ParseException { NumericLiteralNegative(); break; default: - jj_la1[140] = jj_gen; + jj_la1[147] = jj_gen; jj_consume_token(-1); throw new ParseException(); } @@ -7934,7 +8628,7 @@ final public void NumericLiteralUnsigned() throws ParseException { datatype = XMLSchema.DOUBLE; break; default: - jj_la1[141] = jj_gen; + jj_la1[148] = jj_gen; jj_consume_token(-1); throw new ParseException(); } @@ -7971,7 +8665,7 @@ final public void NumericLiteralPositive() throws ParseException { datatype = XMLSchema.DOUBLE; break; default: - jj_la1[142] = jj_gen; + jj_la1[149] = jj_gen; jj_consume_token(-1); throw new ParseException(); } @@ -8008,7 +8702,7 @@ final public void NumericLiteralNegative() throws ParseException { datatype = XMLSchema.DOUBLE; break; default: - jj_la1[143] = jj_gen; + jj_la1[150] = jj_gen; jj_consume_token(-1); throw new ParseException(); } @@ -8050,7 +8744,7 @@ final public void BooleanLiteral() throws ParseException { } break; default: - jj_la1[144] = jj_gen; + jj_la1[151] = jj_gen; jj_consume_token(-1); throw new ParseException(); } @@ -8074,7 +8768,7 @@ final public void String() throws ParseException { t = jj_consume_token(STRING_LITERAL2); break; default: - jj_la1[145] = jj_gen; + jj_la1[152] = jj_gen; jj_consume_token(-1); throw new ParseException(); } @@ -8092,7 +8786,7 @@ final public void String() throws ParseException { t = jj_consume_token(STRING_LITERAL_LONG2); break; default: - jj_la1[146] = jj_gen; + jj_la1[153] = jj_gen; jj_consume_token(-1); throw new ParseException(); } @@ -8101,7 +8795,7 @@ final public void String() throws ParseException { jjtn000.setValue(_trimString(t.image, 3)); break; default: - jj_la1[147] = jj_gen; + jj_la1[154] = jj_gen; jj_consume_token(-1); throw new ParseException(); } @@ -8122,7 +8816,7 @@ final public void IRIref() throws ParseException { PrefixedName(); break; default: - jj_la1[148] = jj_gen; + jj_la1[155] = jj_gen; jj_consume_token(-1); throw new ParseException(); } @@ -8143,7 +8837,7 @@ final public void PrefixedName() throws ParseException { t = jj_consume_token(PNAME_NS); break; default: - jj_la1[149] = jj_gen; + jj_la1[156] = jj_gen; jj_consume_token(-1); throw new ParseException(); } @@ -8175,7 +8869,7 @@ final public void BlankNode() throws ParseException { jj_consume_token(ANON); break; default: - jj_la1[150] = jj_gen; + jj_la1[157] = jj_gen; jj_consume_token(-1); throw new ParseException(); } @@ -8204,7 +8898,7 @@ final public void IRI() throws ParseException { } } -/// SPARQL 1.1 Update productions + /// SPARQL 1.1 Update productions final public void GraphRefAll() throws ParseException { /* @bgen(jjtree) GraphRefAll */ ASTGraphRefAll jjtn000 = new ASTGraphRefAll(JJTGRAPHREFALL); @@ -8231,7 +8925,7 @@ final public void GraphRefAll() throws ParseException { jj_consume_token(ALL); break; default: - jj_la1[151] = jj_gen; + jj_la1[158] = jj_gen; jj_consume_token(-1); throw new ParseException(); } @@ -8244,19 +8938,22 @@ final public void GraphRefAll() throws ParseException { } if (jjte000 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte000; + } } } if (jjte000 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte000; + } } } { - if (true) + if (true) { throw (Error) jjte000; + } } } finally { if (jjtc000) { @@ -8284,13 +8981,13 @@ final public void GraphOrDefault() throws ParseException { jj_consume_token(GRAPH); break; default: - jj_la1[152] = jj_gen; + jj_la1[159] = jj_gen; ; } IRIref(); break; default: - jj_la1[153] = jj_gen; + jj_la1[160] = jj_gen; jj_consume_token(-1); throw new ParseException(); } @@ -8303,19 +9000,22 @@ final public void GraphOrDefault() throws ParseException { } if (jjte000 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte000; + } } } if (jjte000 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte000; + } } } { - if (true) + if (true) { throw (Error) jjte000; + } } } finally { if (jjtc000) { @@ -8378,10 +9078,11 @@ final public void Quads() throws ParseException { case STRING_LITERAL2: case STRING_LITERAL_LONG1: case STRING_LITERAL_LONG2: + case TRIPLE_OPEN: TriplesTemplate(); break; default: - jj_la1[154] = jj_gen; + jj_la1[161] = jj_gen; ; } label_31: while (true) { @@ -8390,7 +9091,7 @@ final public void Quads() throws ParseException { ; break; default: - jj_la1[155] = jj_gen; + jj_la1[162] = jj_gen; break label_31; } QuadsNotTriples(); @@ -8399,7 +9100,7 @@ final public void Quads() throws ParseException { jj_consume_token(DOT); break; default: - jj_la1[156] = jj_gen; + jj_la1[163] = jj_gen; ; } switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) { @@ -8428,10 +9129,11 @@ final public void Quads() throws ParseException { case STRING_LITERAL2: case STRING_LITERAL_LONG1: case STRING_LITERAL_LONG2: + case TRIPLE_OPEN: TriplesTemplate(); break; default: - jj_la1[157] = jj_gen; + jj_la1[164] = jj_gen; ; } } @@ -8472,10 +9174,11 @@ final public void QuadsNotTriples() throws ParseException { case STRING_LITERAL2: case STRING_LITERAL_LONG1: case STRING_LITERAL_LONG2: + case TRIPLE_OPEN: TriplesTemplate(); break; default: - jj_la1[158] = jj_gen; + jj_la1[165] = jj_gen; ; } jj_consume_token(RBRACE); @@ -8488,19 +9191,22 @@ final public void QuadsNotTriples() throws ParseException { } if (jjte000 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte000; + } } } if (jjte000 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte000; + } } } { - if (true) + if (true) { throw (Error) jjte000; + } } } finally { if (jjtc000) { @@ -8533,7 +9239,7 @@ final public void Update() throws ParseException { Create(); break; default: - jj_la1[159] = jj_gen; + jj_la1[166] = jj_gen; if (jj_2_5(2)) { InsertData(); } else if (jj_2_6(2)) { @@ -8548,7 +9254,7 @@ final public void Update() throws ParseException { Modify(); break; default: - jj_la1[160] = jj_gen; + jj_la1[167] = jj_gen; jj_consume_token(-1); throw new ParseException(); } @@ -8569,7 +9275,7 @@ final public void Load() throws ParseException { jjtn000.setSilent(true); break; default: - jj_la1[161] = jj_gen; + jj_la1[168] = jj_gen; ; } IRIref(); @@ -8579,7 +9285,7 @@ final public void Load() throws ParseException { GraphRef(); break; default: - jj_la1[162] = jj_gen; + jj_la1[169] = jj_gen; ; } } catch (Throwable jjte000) { @@ -8591,19 +9297,22 @@ final public void Load() throws ParseException { } if (jjte000 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte000; + } } } if (jjte000 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte000; + } } } { - if (true) + if (true) { throw (Error) jjte000; + } } } finally { if (jjtc000) { @@ -8625,7 +9334,7 @@ final public void Clear() throws ParseException { jjtn000.setSilent(true); break; default: - jj_la1[163] = jj_gen; + jj_la1[170] = jj_gen; ; } GraphRefAll(); @@ -8638,19 +9347,22 @@ final public void Clear() throws ParseException { } if (jjte000 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte000; + } } } if (jjte000 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte000; + } } } { - if (true) + if (true) { throw (Error) jjte000; + } } } finally { if (jjtc000) { @@ -8672,7 +9384,7 @@ final public void Drop() throws ParseException { jjtn000.setSilent(true); break; default: - jj_la1[164] = jj_gen; + jj_la1[171] = jj_gen; ; } GraphRefAll(); @@ -8685,19 +9397,22 @@ final public void Drop() throws ParseException { } if (jjte000 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte000; + } } } if (jjte000 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte000; + } } } { - if (true) + if (true) { throw (Error) jjte000; + } } } finally { if (jjtc000) { @@ -8719,7 +9434,7 @@ final public void Add() throws ParseException { jjtn000.setSilent(true); break; default: - jj_la1[165] = jj_gen; + jj_la1[172] = jj_gen; ; } GraphOrDefault(); @@ -8734,19 +9449,22 @@ final public void Add() throws ParseException { } if (jjte000 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte000; + } } } if (jjte000 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte000; + } } } { - if (true) + if (true) { throw (Error) jjte000; + } } } finally { if (jjtc000) { @@ -8768,7 +9486,7 @@ final public void Move() throws ParseException { jjtn000.setSilent(true); break; default: - jj_la1[166] = jj_gen; + jj_la1[173] = jj_gen; ; } GraphOrDefault(); @@ -8783,19 +9501,22 @@ final public void Move() throws ParseException { } if (jjte000 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte000; + } } } if (jjte000 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte000; + } } } { - if (true) + if (true) { throw (Error) jjte000; + } } } finally { if (jjtc000) { @@ -8817,7 +9538,7 @@ final public void Copy() throws ParseException { jjtn000.setSilent(true); break; default: - jj_la1[167] = jj_gen; + jj_la1[174] = jj_gen; ; } GraphOrDefault(); @@ -8832,19 +9553,22 @@ final public void Copy() throws ParseException { } if (jjte000 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte000; + } } } if (jjte000 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte000; + } } } { - if (true) + if (true) { throw (Error) jjte000; + } } } finally { if (jjtc000) { @@ -8866,7 +9590,7 @@ final public void Create() throws ParseException { jjtn000.setSilent(true); break; default: - jj_la1[168] = jj_gen; + jj_la1[175] = jj_gen; ; } GraphRef(); @@ -8879,19 +9603,22 @@ final public void Create() throws ParseException { } if (jjte000 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte000; + } } } if (jjte000 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte000; + } } } { - if (true) + if (true) { throw (Error) jjte000; + } } } finally { if (jjtc000) { @@ -8918,19 +9645,22 @@ final public void InsertData() throws ParseException { } if (jjte000 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte000; + } } } if (jjte000 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte000; + } } } { - if (true) + if (true) { throw (Error) jjte000; + } } } finally { if (jjtc000) { @@ -8957,19 +9687,22 @@ final public void DeleteData() throws ParseException { } if (jjte000 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte000; + } } } if (jjte000 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte000; + } } } { - if (true) + if (true) { throw (Error) jjte000; + } } } finally { if (jjtc000) { @@ -8996,19 +9729,22 @@ final public void DeleteWhere() throws ParseException { } if (jjte000 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte000; + } } } if (jjte000 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte000; + } } } { - if (true) + if (true) { throw (Error) jjte000; + } } } finally { if (jjtc000) { @@ -9034,19 +9770,22 @@ final public void DeleteClause() throws ParseException { } if (jjte000 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte000; + } } } if (jjte000 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte000; + } } } { - if (true) + if (true) { throw (Error) jjte000; + } } } finally { if (jjtc000) { @@ -9072,19 +9811,22 @@ final public void InsertClause() throws ParseException { } if (jjte000 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte000; + } } } if (jjte000 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte000; + } } } { - if (true) + if (true) { throw (Error) jjte000; + } } } finally { if (jjtc000) { @@ -9106,7 +9848,7 @@ final public void UsingClause() throws ParseException { jjtn000.setNamed(true); break; default: - jj_la1[169] = jj_gen; + jj_la1[176] = jj_gen; ; } IRIref(); @@ -9119,19 +9861,22 @@ final public void UsingClause() throws ParseException { } if (jjte000 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte000; + } } } if (jjte000 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte000; + } } } { - if (true) + if (true) { throw (Error) jjte000; + } } } finally { if (jjtc000) { @@ -9157,19 +9902,22 @@ final public void WithClause() throws ParseException { } if (jjte000 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte000; + } } } if (jjte000 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte000; + } } } { - if (true) + if (true) { throw (Error) jjte000; + } } } finally { if (jjtc000) { @@ -9198,19 +9946,22 @@ final public void ModifyWhereClause() throws ParseException { } if (jjte000 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte000; + } } } if (jjte000 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte000; + } } } { - if (true) + if (true) { throw (Error) jjte000; + } } } finally { if (jjtc000) { @@ -9230,7 +9981,7 @@ final public void Modify() throws ParseException { WithClause(); break; default: - jj_la1[170] = jj_gen; + jj_la1[177] = jj_gen; ; } switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) { @@ -9241,7 +9992,7 @@ final public void Modify() throws ParseException { InsertClause(); break; default: - jj_la1[171] = jj_gen; + jj_la1[178] = jj_gen; ; } break; @@ -9249,7 +10000,7 @@ final public void Modify() throws ParseException { InsertClause(); break; default: - jj_la1[172] = jj_gen; + jj_la1[179] = jj_gen; jj_consume_token(-1); throw new ParseException(); } @@ -9259,7 +10010,7 @@ final public void Modify() throws ParseException { ; break; default: - jj_la1[173] = jj_gen; + jj_la1[180] = jj_gen; break label_32; } UsingClause(); @@ -9274,19 +10025,22 @@ final public void Modify() throws ParseException { } if (jjte000 instanceof RuntimeException) { { - if (true) + if (true) { throw (RuntimeException) jjte000; + } } } if (jjte000 instanceof ParseException) { { - if (true) + if (true) { throw (ParseException) jjte000; + } } } { - if (true) + if (true) { throw (Error) jjte000; + } } } finally { if (jjtc000) { @@ -9379,403 +10133,388 @@ private boolean jj_2_7(int xla) { } } - private boolean jj_3R_67() { - if (jj_scan_token(LBRACK)) + private boolean jj_3R_85() { + if (jj_scan_token(FALSE)) { return true; - return false; - } - - private boolean jj_3R_61() { - Token xsp; - xsp = jj_scanpos; - if (jj_scan_token(147)) { - jj_scanpos = xsp; - if (jj_scan_token(146)) - return true; } return false; } - private boolean jj_3R_57() { - if (jj_3R_65()) - return true; - return false; - } - - private boolean jj_3R_52() { - if (jj_3R_61()) - return true; - return false; - } - - private boolean jj_3R_56() { - if (jj_3R_64()) - return true; - return false; - } - - private boolean jj_3R_49() { + private boolean jj_3R_77() { Token xsp; xsp = jj_scanpos; - if (jj_3R_56()) { + if (jj_3R_84()) { jj_scanpos = xsp; - if (jj_3R_57()) + if (jj_3R_85()) { return true; + } } return false; } - private boolean jj_3R_51() { - if (jj_3R_60()) + private boolean jj_3R_84() { + if (jj_scan_token(TRUE)) { return true; - return false; - } - - private boolean jj_3R_45() { - Token xsp; - xsp = jj_scanpos; - if (jj_3R_51()) { - jj_scanpos = xsp; - if (jj_3R_52()) - return true; } return false; } - private boolean jj_3R_59() { - if (jj_3R_67()) - return true; - return false; - } - - private boolean jj_3R_58() { - if (jj_3R_66()) + private boolean jj_3R_57() { + if (jj_3R_65()) { return true; - return false; - } - - private boolean jj_3R_50() { - Token xsp; - xsp = jj_scanpos; - if (jj_3R_58()) { - jj_scanpos = xsp; - if (jj_3R_59()) - return true; } return false; } - private boolean jj_3R_86() { - Token xsp; - xsp = jj_scanpos; - if (jj_scan_token(167)) { - jj_scanpos = xsp; - if (jj_scan_token(168)) - return true; + private boolean jj_3R_100() { + if (jj_scan_token(DOUBLE_NEGATIVE)) { + return true; } return false; } - private boolean jj_3R_78() { - Token xsp; - xsp = jj_scanpos; - if (jj_3R_85()) { - jj_scanpos = xsp; - if (jj_3R_86()) - return true; + private boolean jj_3R_56() { + if (jj_3R_64()) { + return true; } return false; } - private boolean jj_3R_85() { + private boolean jj_3R_49() { Token xsp; xsp = jj_scanpos; - if (jj_scan_token(165)) { + if (jj_3R_56()) { jj_scanpos = xsp; - if (jj_scan_token(166)) + if (jj_3R_57()) { return true; + } } return false; } - private boolean jj_3_4() { - if (jj_3R_36()) - return true; - return false; - } - - private boolean jj_3R_83() { - if (jj_scan_token(FALSE)) + private boolean jj_3R_99() { + if (jj_scan_token(DECIMAL_NEGATIVE)) { return true; - return false; - } - - private boolean jj_3R_76() { - Token xsp; - xsp = jj_scanpos; - if (jj_3R_82()) { - jj_scanpos = xsp; - if (jj_3R_83()) - return true; } return false; } - private boolean jj_3R_82() { - if (jj_scan_token(TRUE)) - return true; - return false; - } - private boolean jj_3R_98() { - if (jj_scan_token(DOUBLE_NEGATIVE)) - return true; - return false; - } - - private boolean jj_3R_97() { - if (jj_scan_token(DECIMAL_NEGATIVE)) + if (jj_scan_token(INTEGER_NEGATIVE)) { return true; + } return false; } - private boolean jj_3R_96() { - if (jj_scan_token(INTEGER_NEGATIVE)) + private boolean jj_3R_59() { + if (jj_3R_67()) { return true; + } return false; } - private boolean jj_3_3() { - if (jj_scan_token(DOT)) - return true; - if (jj_3R_35()) + private boolean jj_3R_58() { + if (jj_3R_66()) { return true; + } return false; } - private boolean jj_3_2() { - if (jj_scan_token(DOT)) - return true; - if (jj_3R_34()) - return true; + private boolean jj_3R_50() { + Token xsp; + xsp = jj_scanpos; + if (jj_3R_58()) { + jj_scanpos = xsp; + if (jj_3R_59()) { + return true; + } + } return false; } - private boolean jj_3R_89() { + private boolean jj_3R_91() { Token xsp; xsp = jj_scanpos; - if (jj_3R_96()) { + if (jj_3R_98()) { jj_scanpos = xsp; - if (jj_3R_97()) { + if (jj_3R_99()) { jj_scanpos = xsp; - if (jj_3R_98()) + if (jj_3R_100()) { return true; + } } } return false; } - private boolean jj_3R_95() { - if (jj_scan_token(DOUBLE_POSITIVE)) + private boolean jj_3R_97() { + if (jj_scan_token(DOUBLE_POSITIVE)) { return true; + } return false; } - private boolean jj_3R_94() { - if (jj_scan_token(DECIMAL_POSITIVE)) + private boolean jj_3R_96() { + if (jj_scan_token(DECIMAL_POSITIVE)) { return true; + } return false; } - private boolean jj_3R_93() { - if (jj_scan_token(INTEGER_POSITIVE)) + private boolean jj_3R_95() { + if (jj_scan_token(INTEGER_POSITIVE)) { return true; + } return false; } - private boolean jj_3R_88() { + private boolean jj_3R_90() { Token xsp; xsp = jj_scanpos; - if (jj_3R_93()) { + if (jj_3R_95()) { jj_scanpos = xsp; - if (jj_3R_94()) { + if (jj_3R_96()) { jj_scanpos = xsp; - if (jj_3R_95()) + if (jj_3R_97()) { return true; + } } } return false; } private boolean jj_3R_39() { - if (jj_scan_token(DELETE)) + if (jj_scan_token(DELETE)) { return true; - if (jj_scan_token(WHERE)) + } + if (jj_scan_token(WHERE)) { return true; + } return false; } - private boolean jj_3R_92() { - if (jj_scan_token(DOUBLE)) + private boolean jj_3_3() { + if (jj_scan_token(DOT)) { + return true; + } + if (jj_3R_35()) { return true; + } return false; } - private boolean jj_3R_91() { - if (jj_scan_token(DECIMAL)) + private boolean jj_3R_94() { + if (jj_scan_token(DOUBLE)) { return true; + } return false; } - private boolean jj_3R_90() { - if (jj_scan_token(INTEGER)) + private boolean jj_3_2() { + if (jj_scan_token(DOT)) { + return true; + } + if (jj_3R_34()) { return true; + } return false; } - private boolean jj_3R_38() { - if (jj_scan_token(DELETE)) + private boolean jj_3R_93() { + if (jj_scan_token(DECIMAL)) { return true; - if (jj_scan_token(DATA)) + } + return false; + } + + private boolean jj_3R_92() { + if (jj_scan_token(INTEGER)) { return true; + } return false; } - private boolean jj_3R_47() { - if (jj_3R_34()) + private boolean jj_3R_38() { + if (jj_scan_token(DELETE)) { + return true; + } + if (jj_scan_token(DATA)) { return true; + } return false; } private boolean jj_3R_37() { - if (jj_scan_token(INSERT)) + if (jj_scan_token(INSERT)) { return true; - if (jj_scan_token(DATA)) + } + if (jj_scan_token(DATA)) { return true; + } return false; } - private boolean jj_3R_81() { - if (jj_3R_89()) + private boolean jj_3R_83() { + if (jj_3R_91()) { return true; + } return false; } - private boolean jj_3R_80() { - if (jj_3R_88()) + private boolean jj_3R_82() { + if (jj_3R_90()) { return true; + } return false; } - private boolean jj_3R_87() { + private boolean jj_3R_89() { Token xsp; xsp = jj_scanpos; - if (jj_3R_90()) { + if (jj_3R_92()) { jj_scanpos = xsp; - if (jj_3R_91()) { + if (jj_3R_93()) { jj_scanpos = xsp; - if (jj_3R_92()) + if (jj_3R_94()) { return true; + } } } return false; } - private boolean jj_3R_79() { - if (jj_3R_87()) - return true; - return false; - } - - private boolean jj_3R_40() { - if (jj_3R_47()) + private boolean jj_3R_81() { + if (jj_3R_89()) { return true; + } return false; } - private boolean jj_3R_75() { + private boolean jj_3R_76() { Token xsp; xsp = jj_scanpos; - if (jj_3R_79()) { + if (jj_3R_81()) { jj_scanpos = xsp; - if (jj_3R_80()) { + if (jj_3R_82()) { jj_scanpos = xsp; - if (jj_3R_81()) + if (jj_3R_83()) { return true; + } } } return false; } + private boolean jj_3R_47() { + if (jj_3R_34()) { + return true; + } + return false; + } + + private boolean jj_3R_75() { + if (jj_3R_80()) { + return true; + } + return false; + } + + private boolean jj_3R_40() { + if (jj_3R_47()) { + return true; + } + return false; + } + private boolean jj_3_1() { - if (jj_3R_33()) + if (jj_3R_33()) { + return true; + } + return false; + } + + private boolean jj_3_7() { + if (jj_3R_39()) { return true; + } return false; } private boolean jj_3R_33() { - if (jj_scan_token(LBRACE)) + if (jj_scan_token(LBRACE)) { return true; + } Token xsp; xsp = jj_scanpos; - if (jj_3R_40()) + if (jj_3R_40()) { jj_scanpos = xsp; - if (jj_scan_token(RBRACE)) + } + if (jj_scan_token(RBRACE)) { return true; + } return false; } - private boolean jj_3R_74() { - if (jj_3R_78()) + private boolean jj_3_6() { + if (jj_3R_38()) { return true; + } return false; } - private boolean jj_3_7() { - if (jj_3R_39()) + private boolean jj_3_5() { + if (jj_3R_37()) { return true; + } return false; } - private boolean jj_3_6() { - if (jj_3R_38()) + private boolean jj_3R_79() { + if (jj_scan_token(TRIPLE_OPEN)) { return true; + } return false; } - private boolean jj_3R_73() { - if (jj_scan_token(NIL)) + private boolean jj_3R_74() { + if (jj_3R_79()) { return true; + } return false; } - private boolean jj_3_5() { - if (jj_3R_37()) + private boolean jj_3R_73() { + if (jj_scan_token(NIL)) { return true; + } return false; } private boolean jj_3R_72() { - if (jj_3R_77()) + if (jj_3R_78()) { return true; + } return false; } private boolean jj_3R_71() { - if (jj_3R_76()) + if (jj_3R_77()) { return true; + } return false; } private boolean jj_3R_70() { - if (jj_3R_75()) + if (jj_3R_76()) { return true; + } return false; } private boolean jj_3R_69() { - if (jj_3R_74()) + if (jj_3R_75()) { return true; + } return false; } @@ -9792,8 +10531,12 @@ private boolean jj_3R_63() { jj_scanpos = xsp; if (jj_3R_72()) { jj_scanpos = xsp; - if (jj_3R_73()) - return true; + if (jj_3R_73()) { + jj_scanpos = xsp; + if (jj_3R_74()) { + return true; + } + } } } } @@ -9803,8 +10546,9 @@ private boolean jj_3R_63() { } private boolean jj_3R_68() { - if (jj_3R_45()) + if (jj_3R_45()) { return true; + } return false; } @@ -9813,15 +10557,17 @@ private boolean jj_3R_62() { xsp = jj_scanpos; if (jj_scan_token(149)) { jj_scanpos = xsp; - if (jj_scan_token(150)) + if (jj_scan_token(150)) { return true; + } } return false; } private boolean jj_3R_42() { - if (jj_3R_49()) + if (jj_3R_49()) { return true; + } return false; } @@ -9830,27 +10576,31 @@ private boolean jj_3R_34() { xsp = jj_scanpos; if (jj_3R_41()) { jj_scanpos = xsp; - if (jj_3R_42()) + if (jj_3R_42()) { return true; + } } return false; } private boolean jj_3R_41() { - if (jj_3R_48()) + if (jj_3R_48()) { return true; + } return false; } private boolean jj_3R_55() { - if (jj_3R_63()) + if (jj_3R_63()) { return true; + } return false; } private boolean jj_3R_54() { - if (jj_3R_62()) + if (jj_3R_62()) { return true; + } return false; } @@ -9859,21 +10609,31 @@ private boolean jj_3R_48() { xsp = jj_scanpos; if (jj_3R_54()) { jj_scanpos = xsp; - if (jj_3R_55()) + if (jj_3R_55()) { return true; + } + } + return false; + } + + private boolean jj_3R_60() { + if (jj_scan_token(Q_IRI_REF)) { + return true; } return false; } private boolean jj_3R_44() { - if (jj_3R_50()) + if (jj_3R_50()) { return true; + } return false; } private boolean jj_3R_43() { - if (jj_3R_48()) + if (jj_3R_48()) { return true; + } return false; } @@ -9882,15 +10642,36 @@ private boolean jj_3R_35() { xsp = jj_scanpos; if (jj_3R_43()) { jj_scanpos = xsp; - if (jj_3R_44()) + if (jj_3R_44()) { + return true; + } + } + return false; + } + + private boolean jj_3R_78() { + Token xsp; + xsp = jj_scanpos; + if (jj_3R_86()) { + jj_scanpos = xsp; + if (jj_scan_token(31)) { return true; + } + } + return false; + } + + private boolean jj_3R_86() { + if (jj_scan_token(BLANK_NODE_LABEL)) { + return true; } return false; } private boolean jj_3R_53() { - if (jj_scan_token(LPAREN)) + if (jj_scan_token(LPAREN)) { return true; + } return false; } @@ -9899,58 +10680,129 @@ private boolean jj_3R_46() { xsp = jj_scanpos; if (jj_scan_token(30)) { jj_scanpos = xsp; - if (jj_3R_53()) + if (jj_3R_53()) { + return true; + } + } + return false; + } + + private boolean jj_3R_61() { + Token xsp; + xsp = jj_scanpos; + if (jj_scan_token(147)) { + jj_scanpos = xsp; + if (jj_scan_token(146)) { return true; + } } return false; } private boolean jj_3R_64() { - if (jj_scan_token(LPAREN)) + if (jj_scan_token(LPAREN)) { return true; + } return false; } private boolean jj_3R_36() { - if (jj_3R_45()) + if (jj_3R_45()) { return true; - if (jj_3R_46()) + } + if (jj_3R_46()) { return true; + } return false; } - private boolean jj_3R_60() { - if (jj_scan_token(Q_IRI_REF)) + private boolean jj_3R_52() { + if (jj_3R_61()) { + return true; + } + return false; + } + + private boolean jj_3R_51() { + if (jj_3R_60()) { return true; + } + return false; + } + + private boolean jj_3R_45() { + Token xsp; + xsp = jj_scanpos; + if (jj_3R_51()) { + jj_scanpos = xsp; + if (jj_3R_52()) { + return true; + } + } return false; } private boolean jj_3R_66() { - if (jj_scan_token(LPAREN)) + if (jj_scan_token(LPAREN)) { return true; + } return false; } private boolean jj_3R_65() { - if (jj_scan_token(LBRACK)) + if (jj_scan_token(LBRACK)) { return true; + } return false; } - private boolean jj_3R_77() { + private boolean jj_3R_88() { Token xsp; xsp = jj_scanpos; - if (jj_3R_84()) { + if (jj_scan_token(167)) { jj_scanpos = xsp; - if (jj_scan_token(31)) + if (jj_scan_token(168)) { return true; + } } return false; } - private boolean jj_3R_84() { - if (jj_scan_token(BLANK_NODE_LABEL)) + private boolean jj_3R_80() { + Token xsp; + xsp = jj_scanpos; + if (jj_3R_87()) { + jj_scanpos = xsp; + if (jj_3R_88()) { + return true; + } + } + return false; + } + + private boolean jj_3R_87() { + Token xsp; + xsp = jj_scanpos; + if (jj_scan_token(165)) { + jj_scanpos = xsp; + if (jj_scan_token(166)) { + return true; + } + } + return false; + } + + private boolean jj_3_4() { + if (jj_3R_36()) { + return true; + } + return false; + } + + private boolean jj_3R_67() { + if (jj_scan_token(LBRACK)) { return true; + } return false; } @@ -9964,13 +10816,14 @@ private boolean jj_3R_84() { private Token jj_scanpos, jj_lastpos; private int jj_la; private int jj_gen; - final private int[] jj_la1 = new int[174]; + final private int[] jj_la1 = new int[181]; static private int[] jj_la1_0; static private int[] jj_la1_1; static private int[] jj_la1_2; static private int[] jj_la1_3; static private int[] jj_la1_4; static private int[] jj_la1_5; + static { jj_la1_init_0(); jj_la1_init_1(); @@ -9982,89 +10835,93 @@ private boolean jj_3R_84() { private static void jj_la1_init_0() { jj_la1_0 = new int[] { 0x400, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, 0x1000010, 0x10, 0x0, 0x0, - 0xc0000110, 0x0, 0x40, 0x0, 0x0, 0x1000000, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x40000010, 0x0, 0x40000010, - 0x0, 0x0, 0x40000010, 0x40000010, 0x0, 0x40000010, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, 0x10, 0x0, 0x10, 0x0, - 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0xc0000110, 0x1000, 0x40, 0x0, 0x1000, 0xc0000110, 0x1000, 0xc0000110, - 0x0, 0xc0000110, 0x0, 0x1000, 0x1000, 0x40, 0x0, 0x0, 0x0, 0x10, 0x800, 0x40000010, 0x0, 0xc0000110, - 0x0, 0x400, 0x800, 0x10080010, 0xc0000110, 0x10080010, 0x10080010, 0x400, 0x800, 0x8000000, 0x4000000, - 0x10000000, 0x3400000, 0x80010, 0x8000000, 0x10000000, 0x10000010, 0x0, 0x10000000, 0x3400000, 0x0, - 0x110, 0x110, 0xc0000110, 0xc0000110, 0xc0000110, 0xc0000110, 0xc0000000, 0x0, 0x0, 0xc0000000, - 0x100000, 0x200000, 0x7e000, 0x7e000, 0xc00000, 0xc00000, 0x5000000, 0x5000000, 0x400000, 0xc80010, - 0x10, 0x0, 0x0, 0x0, 0x1c80010, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x400, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x800, 0x800, 0x800, 0x40000010, 0x800, 0x20000000, 0x20000000, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x80000000, 0x0, 0x0, 0x0, 0xc0000110, 0x0, 0x1000, 0xc0000110, 0xc0000110, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, }; + 0xc0000110, 0x0, 0x40, 0x0, 0x0, 0x0, 0x1000000, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x40000010, 0x0, + 0x40000010, 0x0, 0x0, 0x40000010, 0x40000010, 0x0, 0x40000010, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, 0x10, 0x0, + 0x10, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0xc0000110, 0x1000, 0x40, 0x0, 0x1000, 0xc0000110, 0x1000, + 0xc0000110, 0x0, 0xc0000110, 0x0, 0x1000, 0x1000, 0x40, 0x0, 0x0, 0x0, 0x10, 0x800, 0x40000010, 0x0, + 0xc0000110, 0x0, 0x400, 0x800, 0x10080010, 0xc0000110, 0x10080010, 0x10080010, 0x400, 0x800, 0x8000000, + 0x4000000, 0x10000000, 0x3400000, 0x80010, 0x8000000, 0x10000000, 0x10000010, 0x0, 0x10000000, + 0x3400000, 0x0, 0x110, 0x110, 0xc0000110, 0xc0000110, 0xc0000110, 0xc0000110, 0xc0000000, 0x0, 0x0, + 0xc0000000, 0xc0000000, 0x0, 0xc0000000, 0x0, 0x0, 0xc80010, 0x100000, 0x200000, 0x7e000, 0x7e000, + 0xc00000, 0xc00000, 0x5000000, 0x5000000, 0x400000, 0xc80010, 0x10, 0x0, 0x0, 0x0, 0x1c80010, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x400, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x800, 0x800, 0x800, 0x40000010, 0x800, + 0x20000000, 0x20000000, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x80000000, 0x0, 0x0, 0x0, + 0xc0000110, 0x0, 0x1000, 0xc0000110, 0xc0000110, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, }; } private static void jj_la1_init_1() { jj_la1_1 = new int[] { 0x0, 0x0, 0x6, 0x6, 0x78, 0x400, 0x0, 0x0, 0x180, 0x180, 0x0, 0x0, 0x0, 0x400, 0x0, 0x0, - 0x400, 0x1000, 0x0, 0x0, 0x0, 0x400, 0x0, 0x800, 0x800, 0x1000, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4000, 0x2000000, 0x2000, 0xc0000, 0xfc000000, 0xfc030000, 0x200, 0xfc000000, 0x30000, - 0x30000, 0xfc030000, 0x80000, 0x40000, 0xc0000, 0x8, 0x1000000, 0x0, 0xb00000, 0x1000000, 0x0, 0x0, 0x0, - 0x0, 0x1000000, 0x1000000, 0x1000000, 0x0, 0x0, 0xb00000, 0x8, 0x400000, 0x0, 0xfc000000, 0x0, 0x0, 0x1, - 0x0, 0x1, 0x0, 0x0, 0x1, 0x0, 0x1, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x1, 0x1, 0x1, 0x1, 0x0, - 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xfc000000, 0xfc000000, 0x0, 0x0, 0x80, 0xfc000000, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x0, 0xfc000000, - 0x40000000, 0x0, 0xb0000000, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x200800, 0x200000, 0x200000, 0x0, 0x200000, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x800, 0x0, 0x0, 0x0, 0x0, }; + 0x400, 0x1000, 0x0, 0x0, 0x0, 0x0, 0x400, 0x0, 0x800, 0x800, 0x1000, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4000, 0x2000000, 0x2000, 0xc0000, 0xfc000000, 0xfc030000, 0x200, 0xfc000000, + 0x30000, 0x30000, 0xfc030000, 0x80000, 0x40000, 0xc0000, 0x8, 0x1000000, 0x0, 0xb00000, 0x1000000, 0x0, + 0x0, 0x0, 0x0, 0x1000000, 0x1000000, 0x1000000, 0x0, 0x0, 0xb00000, 0x8, 0x400000, 0x0, 0xfc000000, 0x0, + 0x0, 0x1, 0x0, 0x1, 0x0, 0x0, 0x1, 0x0, 0x1, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x1, 0x1, 0x1, + 0x1, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfc000000, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfc000000, 0xfc000000, 0x0, 0x0, 0x80, 0xfc000000, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x0, 0xfc000000, 0x40000000, 0x0, 0xb0000000, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x200800, 0x200000, 0x200000, + 0x0, 0x200000, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x800, 0x0, 0x0, 0x0, + 0x0, }; } private static void jj_la1_init_2() { jj_la1_2 = new int[] { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x60000000, 0x60000000, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x60000000, 0x6000000, 0x0, 0x0, 0x60000000, 0x0, 0x0, 0x0, 0x60000000, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x60000000, 0x6000000, 0x0, 0x0, 0x60000000, 0x0, 0x0, 0x0, 0x0, 0x60000000, 0x0, 0x0, 0x0, 0x0, 0x0, 0x60000000, 0x0, 0x86000000, 0x0, 0x0, 0x0, 0x86000000, 0x0, 0x86000000, 0x0, 0x0, 0x0, 0x0, 0x1003fff, 0x1003fff, 0x0, 0x1003fff, 0x0, 0x0, 0x1003fff, 0x0, 0x0, 0x0, 0x0, 0xe000000, 0x0, 0x50000000, 0x8000000, 0x0, 0x6000000, 0x0, 0x6000000, 0x8000000, 0xe000000, 0x8000000, 0x0, 0x0, 0x50000000, 0x0, 0x0, 0x0, 0x1003fff, 0x0, 0x0, 0x0, 0x6000000, 0x0, 0x0, 0x0, 0x0, 0x6000000, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6000000, 0x6000000, 0x6000000, - 0x6000000, 0x6000000, 0x0, 0x0, 0x6000000, 0x0, 0x0, 0xc000, 0xc000, 0x0, 0x0, 0x0, 0x0, 0x0, 0x77f3fff, - 0x1003fff, 0x67f0000, 0x7f0000, 0x0, 0x77f3fff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1003fff, 0x1000000, - 0x0, 0x1fbc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6000000, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6000000, 0x0, 0x0, 0x6000000, 0x6000000, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, }; + 0x6000000, 0x6000000, 0x0, 0x0, 0x6000000, 0x6000000, 0x0, 0x6000000, 0x0, 0x6000000, 0x77f3fff, 0x0, + 0x0, 0xc000, 0xc000, 0x0, 0x0, 0x0, 0x0, 0x0, 0x77f3fff, 0x1003fff, 0x67f0000, 0x7f0000, 0x0, 0x77f3fff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1003fff, 0x1000000, 0x0, 0x1fbc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6000000, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6000000, 0x0, + 0x0, 0x6000000, 0x6000000, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, }; } private static void jj_la1_init_3() { jj_la1_3 = new int[] { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xffffffff, 0xffffffff, 0x0, 0xffffffff, 0x0, 0x0, 0xffffffff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xffffffff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xffffffff, 0xffffffff, 0x0, 0xffffffff, 0x0, 0x0, 0xffffffff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xffffffff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xffffffff, 0xffffffff, 0x0, 0x0, 0x0, 0xffffffff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xffffffff, 0xfff, - 0x1f000, 0x0, 0x3fe0000, 0xfc000000, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xffffffff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xffffffff, 0xffffffff, 0x0, 0x0, 0x0, 0xffffffff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xffffffff, 0xfff, 0x1f000, 0x0, 0x3fe0000, 0xfc000000, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, }; + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, }; } private static void jj_la1_init_4() { jj_la1_4 = new int[] { 0x0, 0x6ff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x600000, 0x600000, 0x600000, 0x0, - 0x0, 0x7f7e0000, 0x0, 0x0, 0x0, 0x6e0000, 0x6e0000, 0x0, 0x0, 0x0, 0xe1000, 0x0, 0x600000, 0x0, 0x0, - 0x600000, 0x7f0e0000, 0x600000, 0x0, 0x0, 0x7f0e0000, 0x0, 0x7f0e0000, 0x0, 0x0, 0x0, 0x0, 0x6e0000, - 0x6e0000, 0x0, 0x6e0000, 0x0, 0x0, 0x6e0000, 0x0, 0x0, 0x0, 0x0, 0x7f7e0000, 0x0, 0x0, 0x0, 0x0, - 0x7f7e0000, 0x0, 0x7f7e0000, 0x0, 0x7f7e0000, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x800, 0xe0000, 0x0, 0x0, - 0x6e0000, 0x7f7e0000, 0x6e0000, 0x0, 0x0, 0x6e0000, 0x7f7e0000, 0x6e0000, 0x6e0000, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xe0000, 0x0, 0xe0000, 0xe0000, 0xe0000, 0xe0000, 0x0, 0x6e0000, 0x0, 0x0, 0x7f7e0000, - 0x7f7e0000, 0x7f7e0000, 0x7f7e0000, 0x7f7e0000, 0x6e0000, 0x600000, 0x7f1e0000, 0x0, 0x0, 0x0, 0x0, - 0x36000000, 0x36000000, 0x0, 0x0, 0x0, 0x7f6e0000, 0x0, 0x7f6e0000, 0x0, 0x0, 0x7f6e0000, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x800000, 0x800000, - 0x7f000000, 0x49000000, 0x12000000, 0x24000000, 0x0, 0x0, 0x0, 0x0, 0xe0000, 0xc0000, 0x100000, 0x3000, - 0x0, 0xe1000, 0x7f7e0000, 0x0, 0x0, 0x7f7e0000, 0x7f7e0000, 0x7f, 0x680, 0x800, 0x4000, 0x800, 0x800, - 0x800, 0x800, 0x800, 0x800, 0x0, 0x400, 0x80, 0x280, 0x10000, }; + 0x0, 0x7f7e0000, 0x0, 0x0, 0x0, 0x6e0000, 0x6e0000, 0x6e0000, 0x0, 0x0, 0x0, 0xe1000, 0x0, 0x600000, + 0x0, 0x0, 0x600000, 0x7f0e0000, 0x600000, 0x0, 0x0, 0x7f0e0000, 0x0, 0x7f0e0000, 0x0, 0x0, 0x0, 0x0, + 0x6e0000, 0x6e0000, 0x0, 0x6e0000, 0x0, 0x0, 0x6e0000, 0x0, 0x0, 0x0, 0x0, 0x7f7e0000, 0x0, 0x0, 0x0, + 0x0, 0x7f7e0000, 0x0, 0x7f7e0000, 0x0, 0x7f7e0000, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x800, 0xe0000, 0x0, + 0x0, 0x6e0000, 0x7f7e0000, 0x6e0000, 0x0, 0x0, 0x6e0000, 0x7f7e0000, 0x6e0000, 0x6e0000, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe0000, 0x0, 0xe0000, 0xe0000, 0xe0000, 0xe0000, 0x0, 0x6e0000, 0x0, 0x0, 0x7f7e0000, + 0x7f7e0000, 0x7f7e0000, 0x7f7e0000, 0x7f7e0000, 0x6e0000, 0x600000, 0x7f1e0000, 0x7f7e0000, 0x6e0000, + 0x7f7e0000, 0xe0000, 0x7f0e0000, 0x7f6e0000, 0x0, 0x0, 0x0, 0x0, 0x36000000, 0x36000000, 0x0, 0x0, 0x0, + 0x7f6e0000, 0x0, 0x7f6e0000, 0x0, 0x0, 0x7f6e0000, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x800000, 0x800000, 0x7f000000, 0x49000000, 0x12000000, + 0x24000000, 0x0, 0x0, 0x0, 0x0, 0xe0000, 0xc0000, 0x100000, 0x3000, 0x0, 0xe1000, 0x7f7e0000, 0x0, 0x0, + 0x7f7e0000, 0x7f7e0000, 0x7f, 0x680, 0x800, 0x4000, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x0, + 0x400, 0x80, 0x280, 0x10000, }; } private static void jj_la1_init_5() { - jj_la1_5 = new int[] { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f8, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f8, 0x0, 0x0, 0x0, 0x1f8, 0x0, - 0x1f8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f8, 0x0, 0x0, 0x0, - 0x0, 0x1f8, 0x0, 0x1f8, 0x0, 0x1f8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f8, 0x0, - 0x0, 0x0, 0x0, 0x1f8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1f8, 0x1f8, 0x1f8, 0x1f8, 0x1f8, 0x0, 0x0, 0x1f8, 0x0, 0x0, 0x0, 0x0, 0x18, 0x18, 0x0, 0x0, - 0x0, 0x1f8, 0x0, 0x1f8, 0x0, 0x0, 0x1f8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x18, 0x0, 0x8, 0x10, 0x0, 0x60, 0x180, 0x1e0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1f8, 0x0, 0x0, 0x1f8, 0x1f8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, }; + jj_la1_5 = new int[] { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x80001f8, + 0x0, 0x0, 0x0, 0x8000000, 0x8000000, 0x8000000, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x80001f8, + 0x0, 0x0, 0x0, 0x80001f8, 0x0, 0x80001f8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x80001f8, 0x0, 0x0, 0x0, 0x0, 0x80001f8, 0x0, 0x80001f8, 0x0, 0x80001f8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x80001f8, 0x0, 0x0, 0x0, 0x0, 0x80001f8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x80001f8, 0x80001f8, 0x80001f8, + 0x80001f8, 0x80001f8, 0x0, 0x0, 0x80001f8, 0x80001f8, 0x0, 0x80001f8, 0x8000000, 0x80001f8, 0x80001f8, + 0x0, 0x0, 0x0, 0x0, 0x18, 0x18, 0x0, 0x0, 0x0, 0x1f8, 0x0, 0x1f8, 0x0, 0x0, 0x80001f8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x18, 0x0, 0x8, + 0x10, 0x0, 0x60, 0x180, 0x1e0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x80001f8, 0x0, 0x0, 0x80001f8, 0x80001f8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, }; } final private JJCalls[] jj_2_rtns = new JJCalls[7]; @@ -10077,10 +10934,12 @@ public SyntaxTreeBuilder(CharStream stream) { token = new Token(); jj_ntk = -1; jj_gen = 0; - for (int i = 0; i < 174; i++) + for (int i = 0; i < 181; i++) { jj_la1[i] = -1; - for (int i = 0; i < jj_2_rtns.length; i++) + } + for (int i = 0; i < jj_2_rtns.length; i++) { jj_2_rtns[i] = new JJCalls(); + } } /** Reinitialise. */ @@ -10090,10 +10949,12 @@ public void ReInit(CharStream stream) { jj_ntk = -1; jjtree.reset(); jj_gen = 0; - for (int i = 0; i < 174; i++) + for (int i = 0; i < 181; i++) { jj_la1[i] = -1; - for (int i = 0; i < jj_2_rtns.length; i++) + } + for (int i = 0; i < jj_2_rtns.length; i++) { jj_2_rtns[i] = new JJCalls(); + } } /** Constructor with generated Token Manager. */ @@ -10102,10 +10963,12 @@ public SyntaxTreeBuilder(SyntaxTreeBuilderTokenManager tm) { token = new Token(); jj_ntk = -1; jj_gen = 0; - for (int i = 0; i < 174; i++) + for (int i = 0; i < 181; i++) { jj_la1[i] = -1; - for (int i = 0; i < jj_2_rtns.length; i++) + } + for (int i = 0; i < jj_2_rtns.length; i++) { jj_2_rtns[i] = new JJCalls(); + } } /** Reinitialise. */ @@ -10115,18 +10978,21 @@ public void ReInit(SyntaxTreeBuilderTokenManager tm) { jj_ntk = -1; jjtree.reset(); jj_gen = 0; - for (int i = 0; i < 174; i++) + for (int i = 0; i < 181; i++) { jj_la1[i] = -1; - for (int i = 0; i < jj_2_rtns.length; i++) + } + for (int i = 0; i < jj_2_rtns.length; i++) { jj_2_rtns[i] = new JJCalls(); + } } private Token jj_consume_token(int kind) throws ParseException { Token oldToken; - if ((oldToken = token).next != null) + if ((oldToken = token).next != null) { token = token.next; - else + } else { token = token.next = token_source.getNextToken(); + } jj_ntk = -1; if (token.kind == kind) { jj_gen++; @@ -10135,8 +11001,9 @@ private Token jj_consume_token(int kind) throws ParseException { for (int i = 0; i < jj_2_rtns.length; i++) { JJCalls c = jj_2_rtns[i]; while (c != null) { - if (c.gen < jj_gen) + if (c.gen < jj_gen) { c.first = null; + } c = c.next; } } @@ -10171,22 +11038,26 @@ private boolean jj_scan_token(int kind) { i++; tok = tok.next; } - if (tok != null) + if (tok != null) { jj_add_error_token(kind, i); + } } - if (jj_scanpos.kind != kind) + if (jj_scanpos.kind != kind) { return true; - if (jj_la == 0 && jj_scanpos == jj_lastpos) + } + if (jj_la == 0 && jj_scanpos == jj_lastpos) { throw jj_ls; + } return false; } /** Get the next Token. */ final public Token getNextToken() { - if (token.next != null) + if (token.next != null) { token = token.next; - else + } else { token = token.next = token_source.getNextToken(); + } jj_ntk = -1; jj_gen++; return token; @@ -10196,19 +11067,21 @@ final public Token getNextToken() { final public Token getToken(int index) { Token t = token; for (int i = 0; i < index; i++) { - if (t.next != null) + if (t.next != null) { t = t.next; - else + } else { t = t.next = token_source.getNextToken(); + } } return t; } private int jj_ntk() { - if ((jj_nt = token.next) == null) + if ((jj_nt = token.next) == null) { return (jj_ntk = (token.next = token_source.getNextToken()).kind); - else + } else { return (jj_ntk = jj_nt.kind); + } } private java.util.List jj_expentries = new java.util.ArrayList<>(); @@ -10218,8 +11091,9 @@ private int jj_ntk() { private int jj_endpos; private void jj_add_error_token(int kind, int pos) { - if (pos >= 100) + if (pos >= 100) { return; + } if (pos == jj_endpos + 1) { jj_lasttokens[jj_endpos++] = kind; } else if (jj_endpos != 0) { @@ -10227,37 +11101,33 @@ private void jj_add_error_token(int kind, int pos) { for (int i = 0; i < jj_endpos; i++) { jj_expentry[i] = jj_lasttokens[i]; } - boolean exists = false; - for (java.util.Iterator it = jj_expentries.iterator(); it.hasNext();) { - exists = true; + jj_entries_loop: for (java.util.Iterator it = jj_expentries.iterator(); it.hasNext();) { int[] oldentry = (int[]) (it.next()); if (oldentry.length == jj_expentry.length) { for (int i = 0; i < jj_expentry.length; i++) { if (oldentry[i] != jj_expentry[i]) { - exists = false; - break; + continue jj_entries_loop; } } - if (exists) - break; + jj_expentries.add(jj_expentry); + break jj_entries_loop; } } - if (!exists) - jj_expentries.add(jj_expentry); - if (pos != 0) + if (pos != 0) { jj_lasttokens[(jj_endpos = pos) - 1] = kind; + } } } /** Generate ParseException. */ public ParseException generateParseException() { jj_expentries.clear(); - boolean[] la1tokens = new boolean[187]; + boolean[] la1tokens = new boolean[189]; if (jj_kind >= 0) { la1tokens[jj_kind] = true; jj_kind = -1; } - for (int i = 0; i < 174; i++) { + for (int i = 0; i < 181; i++) { if (jj_la1[i] == jj_gen) { for (int j = 0; j < 32; j++) { if ((jj_la1_0[i] & (1 << j)) != 0) { @@ -10281,7 +11151,7 @@ public ParseException generateParseException() { } } } - for (int i = 0; i < 187; i++) { + for (int i = 0; i < 189; i++) { if (la1tokens[i]) { jj_expentry = new int[1]; jj_expentry[0] = i; diff --git a/core/queryparser/sparql/src/main/java/org/eclipse/rdf4j/query/parser/sparql/ast/SyntaxTreeBuilderConstants.java b/core/queryparser/sparql/src/main/java/org/eclipse/rdf4j/query/parser/sparql/ast/SyntaxTreeBuilderConstants.java index b8fe91e16ba..d1567bc5be6 100644 --- a/core/queryparser/sparql/src/main/java/org/eclipse/rdf4j/query/parser/sparql/ast/SyntaxTreeBuilderConstants.java +++ b/core/queryparser/sparql/src/main/java/org/eclipse/rdf4j/query/parser/sparql/ast/SyntaxTreeBuilderConstants.java @@ -387,35 +387,205 @@ public interface SyntaxTreeBuilderConstants { int PN_LOCAL_ESC = 185; /** RegularExpression Id. */ int VARNAME = 186; + /** RegularExpression Id. */ + int TRIPLE_OPEN = 187; + /** RegularExpression Id. */ + int TRIPLE_CLOSE = 188; /** Lexical state. */ int DEFAULT = 0; /** Literal token values. */ - String[] tokenImage = { "", "", "", "", "\"(\"", "\")\"", "\"{\"", - "\"}\"", "\"[\"", "\"]\"", "\";\"", "\",\"", "\".\"", "\"=\"", "\"!=\"", "\">\"", "\"<\"", "\"<=\"", - "\">=\"", "\"!\"", "\"||\"", "\"&&\"", "\"+\"", "\"-\"", "\"*\"", "\"?\"", "\"/\"", "\"|\"", "\"^\"", - "\"^^\"", "", "", "\"a\"", "\"base\"", "\"prefix\"", "\"select\"", "\"construct\"", - "\"describe\"", "\"ask\"", "\"distinct\"", "\"reduced\"", "\"as\"", "\"from\"", "\"named\"", "\"where\"", - "\"order\"", "\"group\"", "\"by\"", "\"asc\"", "\"desc\"", "\"limit\"", "\"offset\"", "\"optional\"", - "\"graph\"", "\"union\"", "\"minus\"", "\"filter\"", "\"having\"", "\"exists\"", "\"not exists\"", - "\"str\"", "\"lang\"", "\"langmatches\"", "\"datatype\"", "\"bound\"", "\"sameTerm\"", "", - "\"isBlank\"", "\"isLiteral\"", "\"isNumeric\"", "\"coalesce\"", "\"bnode\"", "\"strdt\"", "\"strlang\"", - "\"uuid\"", "\"struuid\"", "", "\"if\"", "\"in\"", "\"not in\"", "\"count\"", "\"sum\"", "\"min\"", - "\"max\"", "\"avg\"", "\"sample\"", "\"group_concat\"", "\"separator\"", "\"regex\"", "\"true\"", - "\"false\"", "\"bind\"", "\"service\"", "\"bindings\"", "\"values\"", "\"UNDEF\"", "\"strlen\"", - "\"substr\"", "\"strStarts\"", "\"strEnds\"", "\"strBefore\"", "\"strAfter\"", "\"replace\"", "\"ucase\"", - "\"lcase\"", "\"concat\"", "\"contains\"", "\"encode_for_URI\"", "\"rand\"", "\"abs\"", "\"ceil\"", - "\"floor\"", "\"round\"", "\"now\"", "\"year\"", "\"month\"", "\"day\"", "\"hours\"", "\"minutes\"", - "\"seconds\"", "\"timezone\"", "\"tz\"", "\"md5\"", "\"sha1\"", "\"sha224\"", "\"sha256\"", "\"sha384\"", - "\"sha512\"", "\"load\"", "\"clear\"", "\"drop\"", "\"add\"", "\"move\"", "\"copy\"", "\"create\"", - "\"insert\"", "\"data\"", "\"delete\"", "\"with\"", "\"silent\"", "\"default\"", "\"all\"", "\"into\"", - "\"to\"", "\"using\"", "", "", "", "", "", "", - "", "", "", "", "", "", - "", "", "", "", "", "", "", - "", "", "", "", - "", "", "", "", "", - "", "", "", "", "", "", "", "", - "", "", "", "", "", "", }; + String[] tokenImage = { + "", + "", + "", + "", + "\"(\"", + "\")\"", + "\"{\"", + "\"}\"", + "\"[\"", + "\"]\"", + "\";\"", + "\",\"", + "\".\"", + "\"=\"", + "\"!=\"", + "\">\"", + "\"<\"", + "\"<=\"", + "\">=\"", + "\"!\"", + "\"||\"", + "\"&&\"", + "\"+\"", + "\"-\"", + "\"*\"", + "\"?\"", + "\"/\"", + "\"|\"", + "\"^\"", + "\"^^\"", + "", + "", + "\"a\"", + "\"base\"", + "\"prefix\"", + "\"select\"", + "\"construct\"", + "\"describe\"", + "\"ask\"", + "\"distinct\"", + "\"reduced\"", + "\"as\"", + "\"from\"", + "\"named\"", + "\"where\"", + "\"order\"", + "\"group\"", + "\"by\"", + "\"asc\"", + "\"desc\"", + "\"limit\"", + "\"offset\"", + "\"optional\"", + "\"graph\"", + "\"union\"", + "\"minus\"", + "\"filter\"", + "\"having\"", + "\"exists\"", + "\"not exists\"", + "\"str\"", + "\"lang\"", + "\"langmatches\"", + "\"datatype\"", + "\"bound\"", + "\"sameTerm\"", + "", + "\"isBlank\"", + "\"isLiteral\"", + "\"isNumeric\"", + "\"coalesce\"", + "\"bnode\"", + "\"strdt\"", + "\"strlang\"", + "\"uuid\"", + "\"struuid\"", + "", + "\"if\"", + "\"in\"", + "\"not in\"", + "\"count\"", + "\"sum\"", + "\"min\"", + "\"max\"", + "\"avg\"", + "\"sample\"", + "\"group_concat\"", + "\"separator\"", + "\"regex\"", + "\"true\"", + "\"false\"", + "\"bind\"", + "\"service\"", + "\"bindings\"", + "\"values\"", + "\"UNDEF\"", + "\"strlen\"", + "\"substr\"", + "\"strStarts\"", + "\"strEnds\"", + "\"strBefore\"", + "\"strAfter\"", + "\"replace\"", + "\"ucase\"", + "\"lcase\"", + "\"concat\"", + "\"contains\"", + "\"encode_for_URI\"", + "\"rand\"", + "\"abs\"", + "\"ceil\"", + "\"floor\"", + "\"round\"", + "\"now\"", + "\"year\"", + "\"month\"", + "\"day\"", + "\"hours\"", + "\"minutes\"", + "\"seconds\"", + "\"timezone\"", + "\"tz\"", + "\"md5\"", + "\"sha1\"", + "\"sha224\"", + "\"sha256\"", + "\"sha384\"", + "\"sha512\"", + "\"load\"", + "\"clear\"", + "\"drop\"", + "\"add\"", + "\"move\"", + "\"copy\"", + "\"create\"", + "\"insert\"", + "\"data\"", + "\"delete\"", + "\"with\"", + "\"silent\"", + "\"default\"", + "\"all\"", + "\"into\"", + "\"to\"", + "\"using\"", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "\"<<\"", + "\">>\"", + }; } diff --git a/core/queryparser/sparql/src/main/java/org/eclipse/rdf4j/query/parser/sparql/ast/SyntaxTreeBuilderTokenManager.java b/core/queryparser/sparql/src/main/java/org/eclipse/rdf4j/query/parser/sparql/ast/SyntaxTreeBuilderTokenManager.java index 47fb1d1d72d..2aab70d57c8 100644 --- a/core/queryparser/sparql/src/main/java/org/eclipse/rdf4j/query/parser/sparql/ast/SyntaxTreeBuilderTokenManager.java +++ b/core/queryparser/sparql/src/main/java/org/eclipse/rdf4j/query/parser/sparql/ast/SyntaxTreeBuilderTokenManager.java @@ -61,13 +61,13 @@ private int jjMoveStringLiteralDfa0_0() { return jjMoveNfa_0(0, 0); case 60: jjmatchedKind = 16; - return jjMoveStringLiteralDfa1_0(0x20000L, 0x0L, 0x0L); + return jjMoveStringLiteralDfa1_0(0x20000L, 0x0L, 0x800000000000000L); case 61: jjmatchedKind = 13; return jjMoveNfa_0(0, 0); case 62: jjmatchedKind = 15; - return jjMoveStringLiteralDfa1_0(0x40000L, 0x0L, 0x0L); + return jjMoveStringLiteralDfa1_0(0x40000L, 0x0L, 0x1000000000000000L); case 63: jjmatchedKind = 25; return jjMoveNfa_0(0, 0); @@ -192,6 +192,12 @@ private int jjMoveStringLiteralDfa1_0(long active0, long active1, long active2) jjmatchedPos = 1; } break; + case 60: + if ((active2 & 0x800000000000000L) != 0L) { + jjmatchedKind = 187; + jjmatchedPos = 1; + } + break; case 61: if ((active0 & 0x4000L) != 0L) { jjmatchedKind = 14; @@ -204,6 +210,12 @@ private int jjMoveStringLiteralDfa1_0(long active0, long active1, long active2) jjmatchedPos = 1; } break; + case 62: + if ((active2 & 0x1000000000000000L) != 0L) { + jjmatchedKind = 188; + jjmatchedPos = 1; + } + break; case 65: return jjMoveStringLiteralDfa2_0(active0, 0xe200080200000000L, active1, 0x10100044280002L, active2, 0x100L); case 66: @@ -351,8 +363,9 @@ private int jjMoveStringLiteralDfa1_0(long active0, long active1, long active2) } private int jjMoveStringLiteralDfa2_0(long old0, long active0, long old1, long active1, long old2, long active2) { - if (((active0 &= old0) | (active1 &= old1) | (active2 &= old2)) == 0L) + if (((active0 &= old0) | (active1 &= old1) | (active2 &= old2)) == 0L) { return jjMoveNfa_0(0, 1); + } try { curChar = input_stream.readChar(); } catch (java.io.IOException e) { @@ -556,8 +569,9 @@ private int jjMoveStringLiteralDfa2_0(long old0, long active0, long old1, long a } private int jjMoveStringLiteralDfa3_0(long old0, long active0, long old1, long active1, long old2, long active2) { - if (((active0 &= old0) | (active1 &= old1) | (active2 &= old2)) == 0L) + if (((active0 &= old0) | (active1 &= old1) | (active2 &= old2)) == 0L) { return jjMoveNfa_0(0, 2); + } try { curChar = input_stream.readChar(); } catch (java.io.IOException e) { @@ -791,8 +805,9 @@ private int jjMoveStringLiteralDfa3_0(long old0, long active0, long old1, long a } private int jjMoveStringLiteralDfa4_0(long old0, long active0, long old1, long active1, long old2, long active2) { - if (((active0 &= old0) | (active1 &= old1) | (active2 &= old2)) == 0L) + if (((active0 &= old0) | (active1 &= old1) | (active2 &= old2)) == 0L) { return jjMoveNfa_0(0, 3); + } try { curChar = input_stream.readChar(); } catch (java.io.IOException e) { @@ -1050,8 +1065,9 @@ private int jjMoveStringLiteralDfa4_0(long old0, long active0, long old1, long a } private int jjMoveStringLiteralDfa5_0(long old0, long active0, long old1, long active1, long old2, long active2) { - if (((active0 &= old0) | (active1 &= old1) | (active2 &= old2)) == 0L) + if (((active0 &= old0) | (active1 &= old1) | (active2 &= old2)) == 0L) { return jjMoveNfa_0(0, 4); + } try { curChar = input_stream.readChar(); } catch (java.io.IOException e) { @@ -1258,8 +1274,9 @@ private int jjMoveStringLiteralDfa5_0(long old0, long active0, long old1, long a } private int jjMoveStringLiteralDfa6_0(long old0, long active0, long old1, long active1, long old2, long active2) { - if (((active0 &= old0) | (active1 &= old1) | (active2 &= old2)) == 0L) + if (((active0 &= old0) | (active1 &= old1) | (active2 &= old2)) == 0L) { return jjMoveNfa_0(0, 5); + } try { curChar = input_stream.readChar(); } catch (java.io.IOException e) { @@ -1407,8 +1424,9 @@ private int jjMoveStringLiteralDfa6_0(long old0, long active0, long old1, long a } private int jjMoveStringLiteralDfa7_0(long old0, long active0, long old1, long active1, long old2, long active2) { - if (((active0 &= old0) | (active1 &= old1) | (active2 &= old2)) == 0L) + if (((active0 &= old0) | (active1 &= old1) | (active2 &= old2)) == 0L) { return jjMoveNfa_0(0, 6); + } try { curChar = input_stream.readChar(); } catch (java.io.IOException e) { @@ -1538,8 +1556,9 @@ private int jjMoveStringLiteralDfa7_0(long old0, long active0, long old1, long a } private int jjMoveStringLiteralDfa8_0(long old0, long active0, long old1, long active1) { - if (((active0 &= old0) | (active1 &= old1)) == 0L) + if (((active0 &= old0) | (active1 &= old1)) == 0L) { return jjMoveNfa_0(0, 7); + } try { curChar = input_stream.readChar(); } catch (java.io.IOException e) { @@ -1637,8 +1656,9 @@ private int jjMoveStringLiteralDfa8_0(long old0, long active0, long old1, long a } private int jjMoveStringLiteralDfa9_0(long old0, long active0, long old1, long active1) { - if (((active0 &= old0) | (active1 &= old1)) == 0L) + if (((active0 &= old0) | (active1 &= old1)) == 0L) { return jjMoveNfa_0(0, 8); + } try { curChar = input_stream.readChar(); } catch (java.io.IOException e) { @@ -1676,8 +1696,9 @@ private int jjMoveStringLiteralDfa9_0(long old0, long active0, long old1, long a } private int jjMoveStringLiteralDfa10_0(long old0, long active0, long old1, long active1) { - if (((active0 &= old0) | (active1 &= old1)) == 0L) + if (((active0 &= old0) | (active1 &= old1)) == 0L) { return jjMoveNfa_0(0, 9); + } try { curChar = input_stream.readChar(); } catch (java.io.IOException e) { @@ -1709,8 +1730,9 @@ private int jjMoveStringLiteralDfa10_0(long old0, long active0, long old1, long } private int jjMoveStringLiteralDfa11_0(long old0, long active0, long old1, long active1) { - if (((active0 &= old0) | (active1 &= old1)) == 0L) + if (((active0 &= old0) | (active1 &= old1)) == 0L) { return jjMoveNfa_0(0, 10); + } try { curChar = input_stream.readChar(); } catch (java.io.IOException e) { @@ -1740,8 +1762,9 @@ private int jjMoveStringLiteralDfa11_0(long old0, long active0, long old1, long } private int jjMoveStringLiteralDfa12_0(long old1, long active1) { - if (((active1 &= old1)) == 0L) + if (((active1 &= old1)) == 0L) { return jjMoveNfa_0(0, 11); + } try { curChar = input_stream.readChar(); } catch (java.io.IOException e) { @@ -1759,8 +1782,9 @@ private int jjMoveStringLiteralDfa12_0(long old1, long active1) { } private int jjMoveStringLiteralDfa13_0(long old1, long active1) { - if (((active1 &= old1)) == 0L) + if (((active1 &= old1)) == 0L) { return jjMoveNfa_0(0, 12); + } try { curChar = input_stream.readChar(); } catch (java.io.IOException e) { @@ -1785,25 +1809,45 @@ private int jjMoveStringLiteralDfa13_0(long old1, long active1) { return jjMoveNfa_0(0, 13); } - static final long[] jjbitVec0 = { 0xfffffffffffffffeL, 0xffffffffffffffffL, 0xffffffffffffffffL, - 0xffffffffffffffffL }; - static final long[] jjbitVec2 = { 0x0L, 0x0L, 0xffffffffffffffffL, 0xffffffffffffffffL }; - static final long[] jjbitVec3 = { 0xfffe7000fffffff6L, 0xffffffffffffffffL, 0xffffffffffffffffL, - 0x5e00000000ffffffL }; - static final long[] jjbitVec4 = { 0x0L, 0x0L, 0x0L, 0xff7fffffff7fffffL }; - static final long[] jjbitVec5 = { 0x0L, 0xbfff000000000000L, 0xffffffffffffffffL, 0xffffffffffffffffL }; - static final long[] jjbitVec6 = { 0x3000L, 0xffff000000000000L, 0xffffffffffffffffL, 0xffffffffffffffffL }; - static final long[] jjbitVec7 = { 0xffffffffffffffffL, 0xffffffffffffffffL, 0xffffL, 0x0L }; - static final long[] jjbitVec8 = { 0xffffffffffffffffL, 0xffffffffffffffffL, 0xffffffffffffffffL, 0xffffffffffffL }; - static final long[] jjbitVec9 = { 0xffffffffffffffffL, 0xffffffffffffffffL, 0xffffffffffffffffL, - 0xffff00000000ffffL }; - static final long[] jjbitVec10 = { 0xffffffffffffffffL, 0xffffffffffffffffL, 0xffffffffffffffffL, - 0x3fffffffffffffffL }; - static final long[] jjbitVec11 = { 0x0L, 0x0L, 0x80000000000000L, 0xff7fffffff7fffffL }; - static final long[] jjbitVec12 = { 0xffffffffffffffffL, 0xbfffffffffffffffL, 0xffffffffffffffffL, - 0xffffffffffffffffL }; - static final long[] jjbitVec13 = { 0x8000000000003000L, 0xffff000000000001L, 0xffffffffffffffffL, - 0xffffffffffffffffL }; + static final long[] jjbitVec0 = { + 0xfffffffffffffffeL, 0xffffffffffffffffL, 0xffffffffffffffffL, 0xffffffffffffffffL + }; + static final long[] jjbitVec2 = { + 0x0L, 0x0L, 0xffffffffffffffffL, 0xffffffffffffffffL + }; + static final long[] jjbitVec3 = { + 0xfffe7000fffffff6L, 0xffffffffffffffffL, 0xffffffffffffffffL, 0x5e00000000ffffffL + }; + static final long[] jjbitVec4 = { + 0x0L, 0x0L, 0x0L, 0xff7fffffff7fffffL + }; + static final long[] jjbitVec5 = { + 0x0L, 0xbfff000000000000L, 0xffffffffffffffffL, 0xffffffffffffffffL + }; + static final long[] jjbitVec6 = { + 0x3000L, 0xffff000000000000L, 0xffffffffffffffffL, 0xffffffffffffffffL + }; + static final long[] jjbitVec7 = { + 0xffffffffffffffffL, 0xffffffffffffffffL, 0xffffL, 0x0L + }; + static final long[] jjbitVec8 = { + 0xffffffffffffffffL, 0xffffffffffffffffL, 0xffffffffffffffffL, 0xffffffffffffL + }; + static final long[] jjbitVec9 = { + 0xffffffffffffffffL, 0xffffffffffffffffL, 0xffffffffffffffffL, 0xffff00000000ffffL + }; + static final long[] jjbitVec10 = { + 0xffffffffffffffffL, 0xffffffffffffffffL, 0xffffffffffffffffL, 0x3fffffffffffffffL + }; + static final long[] jjbitVec11 = { + 0x0L, 0x0L, 0x80000000000000L, 0xff7fffffff7fffffL + }; + static final long[] jjbitVec12 = { + 0xffffffffffffffffL, 0xbfffffffffffffffL, 0xffffffffffffffffL, 0xffffffffffffffffL + }; + static final long[] jjbitVec13 = { + 0x8000000000003000L, 0xffff000000000001L, 0xffffffffffffffffL, 0xffffffffffffffffL + }; private int jjMoveNfa_0(int startState, int curPos) { int strKind = jjmatchedKind; @@ -1822,14 +1866,1286 @@ private int jjMoveNfa_0(int startState, int curPos) { jjstateSet[0] = startState; int kind = 0x7fffffff; for (;;) { - if (++jjround == 0x7fffffff) + if (++jjround == 0x7fffffff) { ReInitRounds(); + } if (curChar < 64) { - kind = jjMoveNfa_0_curCharLessThan64(startsAt, i, kind); + long l = 1L << curChar; + do { + switch (jjstateSet[--i]) { + case 0: + if ((0x3ff000000000000L & l) != 0L) { + if (kind > 152) { + kind = 152; + } + jjCheckNAddStates(0, 6); + } else if ((0x100003600L & l) != 0L) { + if (kind > 2) { + kind = 2; + } + } else if (curChar == 46) { + jjCheckNAddTwoStates(99, 153); + } else if (curChar == 45) { + jjCheckNAddStates(7, 11); + } else if (curChar == 43) { + jjCheckNAddStates(12, 16); + } else if (curChar == 58) { + if (kind > 146) { + kind = 146; + } + jjCheckNAddStates(17, 19); + } else if (curChar == 34) { + jjstateSet[jjnewStateCnt++] = 60; + } else if (curChar == 39) { + jjstateSet[jjnewStateCnt++] = 49; + } else if (curChar == 36) { + jjstateSet[jjnewStateCnt++] = 24; + } else if (curChar == 60) { + jjCheckNAddTwoStates(13, 14); + } else if (curChar == 40) { + jjCheckNAddTwoStates(4, 5); + } else if (curChar == 35) { + if (kind > 3) { + kind = 3; + } + jjCheckNAdd(2); + } else if (curChar == 63) { + jjstateSet[jjnewStateCnt++] = 21; + } + if (curChar == 34) { + jjCheckNAddStates(20, 22); + } else if (curChar == 39) { + jjCheckNAddStates(23, 25); + } + break; + case 1: + if (curChar != 35) { + break; + } + if (kind > 3) { + kind = 3; + } + jjCheckNAdd(2); + break; + case 2: + if ((0xffffffffffffdbffL & l) == 0L) { + break; + } + if (kind > 3) { + kind = 3; + } + jjCheckNAdd(2); + break; + case 3: + if (curChar == 40) { + jjCheckNAddTwoStates(4, 5); + } + break; + case 4: + if ((0x100003600L & l) != 0L) { + jjCheckNAddTwoStates(4, 5); + } + break; + case 5: + if (curChar == 41 && kind > 30) { + kind = 30; + } + break; + case 7: + if ((0x100003600L & l) != 0L) { + jjAddStates(26, 27); + } + break; + case 12: + if (curChar == 60) { + jjCheckNAddTwoStates(13, 14); + } + break; + case 13: + if ((0xaffffffa00000000L & l) != 0L) { + jjCheckNAddTwoStates(13, 14); + } + break; + case 14: + if (curChar == 62 && kind > 145) { + kind = 145; + } + break; + case 15: + if (curChar == 58) { + jjstateSet[jjnewStateCnt++] = 16; + } + break; + case 16: + if ((0x3ff000000000000L & l) == 0L) { + break; + } + if (kind > 148) { + kind = 148; + } + jjCheckNAddTwoStates(17, 18); + break; + case 17: + if ((0x3ff600000000000L & l) != 0L) { + jjCheckNAddTwoStates(17, 18); + } + break; + case 18: + if ((0x3ff200000000000L & l) != 0L && kind > 148) { + kind = 148; + } + break; + case 20: + if (curChar == 63) { + jjstateSet[jjnewStateCnt++] = 21; + } + break; + case 21: + case 22: + if ((0x3ff000000000000L & l) == 0L) { + break; + } + if (kind > 149) { + kind = 149; + } + jjCheckNAdd(22); + break; + case 23: + if (curChar == 36) { + jjstateSet[jjnewStateCnt++] = 24; + } + break; + case 24: + case 25: + if ((0x3ff000000000000L & l) == 0L) { + break; + } + if (kind > 150) { + kind = 150; + } + jjCheckNAdd(25); + break; + case 28: + if (curChar == 45) { + jjCheckNAdd(29); + } + break; + case 29: + if ((0x3ff000000000000L & l) == 0L) { + break; + } + if (kind > 151) { + kind = 151; + } + jjCheckNAddTwoStates(28, 29); + break; + case 30: + if (curChar == 39) { + jjCheckNAddStates(23, 25); + } + break; + case 31: + if ((0xffffff7fffffdbffL & l) != 0L) { + jjCheckNAddStates(23, 25); + } + break; + case 33: + if ((0x8400000000L & l) != 0L) { + jjCheckNAddStates(23, 25); + } + break; + case 34: + if (curChar == 39 && kind > 165) { + kind = 165; + } + break; + case 35: + if (curChar == 34) { + jjCheckNAddStates(20, 22); + } + break; + case 36: + if ((0xfffffffbffffdbffL & l) != 0L) { + jjCheckNAddStates(20, 22); + } + break; + case 38: + if ((0x8400000000L & l) != 0L) { + jjCheckNAddStates(20, 22); + } + break; + case 39: + if (curChar == 34 && kind > 166) { + kind = 166; + } + break; + case 40: + if (curChar == 39) { + jjCheckNAddStates(28, 31); + } + break; + case 41: + case 46: + if (curChar == 39) { + jjCheckNAddTwoStates(42, 43); + } + break; + case 42: + if ((0xffffff7fffffffffL & l) != 0L) { + jjCheckNAddStates(28, 31); + } + break; + case 44: + if ((0x8400000000L & l) != 0L) { + jjCheckNAddStates(28, 31); + } + break; + case 45: + if (curChar == 39) { + jjAddStates(32, 33); + } + break; + case 47: + if (curChar == 39 && kind > 167) { + kind = 167; + } + break; + case 48: + if (curChar == 39) { + jjstateSet[jjnewStateCnt++] = 47; + } + break; + case 49: + if (curChar == 39) { + jjstateSet[jjnewStateCnt++] = 40; + } + break; + case 50: + if (curChar == 39) { + jjstateSet[jjnewStateCnt++] = 49; + } + break; + case 51: + if (curChar == 34) { + jjCheckNAddStates(34, 37); + } + break; + case 52: + case 57: + if (curChar == 34) { + jjCheckNAddTwoStates(53, 54); + } + break; + case 53: + if ((0xfffffffbffffffffL & l) != 0L) { + jjCheckNAddStates(34, 37); + } + break; + case 55: + if ((0x8400000000L & l) != 0L) { + jjCheckNAddStates(34, 37); + } + break; + case 56: + if (curChar == 34) { + jjAddStates(38, 39); + } + break; + case 58: + if (curChar == 34 && kind > 168) { + kind = 168; + } + break; + case 59: + if (curChar == 34) { + jjstateSet[jjnewStateCnt++] = 58; + } + break; + case 60: + if (curChar == 34) { + jjstateSet[jjnewStateCnt++] = 51; + } + break; + case 61: + if (curChar == 34) { + jjstateSet[jjnewStateCnt++] = 60; + } + break; + case 72: + if ((0x3ff600000000000L & l) != 0L) { + jjAddStates(40, 41); + } + break; + case 73: + if ((0x3ff200000000000L & l) != 0L) { + jjstateSet[jjnewStateCnt++] = 74; + } + break; + case 74: + if (curChar == 58 && kind > 146) { + kind = 146; + } + break; + case 75: + if ((0x3ff600000000000L & l) != 0L) { + jjAddStates(42, 43); + } + break; + case 76: + if ((0x3ff200000000000L & l) != 0L) { + jjstateSet[jjnewStateCnt++] = 77; + } + break; + case 77: + if (curChar == 58) { + jjCheckNAddStates(17, 19); + } + break; + case 78: + if ((0x7ff000000000000L & l) == 0L) { + break; + } + if (kind > 147) { + kind = 147; + } + jjCheckNAddStates(44, 47); + break; + case 79: + if ((0x7ff600000000000L & l) != 0L) { + jjCheckNAddStates(44, 47); + } + break; + case 80: + if ((0x7ff200000000000L & l) != 0L && kind > 147) { + kind = 147; + } + break; + case 82: + if ((0xa800ff7e00000000L & l) != 0L) { + jjCheckNAddStates(44, 47); + } + break; + case 83: + if (curChar == 37) { + jjAddStates(48, 49); + } + break; + case 84: + if ((0x3ff000000000000L & l) != 0L) { + jjstateSet[jjnewStateCnt++] = 85; + } + break; + case 85: + if ((0x3ff000000000000L & l) != 0L) { + jjCheckNAddStates(44, 47); + } + break; + case 86: + if ((0x3ff000000000000L & l) != 0L) { + jjstateSet[jjnewStateCnt++] = 87; + } + break; + case 87: + if ((0x3ff000000000000L & l) != 0L && kind > 147) { + kind = 147; + } + break; + case 88: + if ((0xa800ff7e00000000L & l) != 0L && kind > 147) { + kind = 147; + } + break; + case 90: + if ((0xa800ff7e00000000L & l) == 0L) { + break; + } + if (kind > 147) { + kind = 147; + } + jjCheckNAddStates(44, 47); + break; + case 91: + if (curChar == 37) { + jjstateSet[jjnewStateCnt++] = 92; + } + break; + case 92: + if ((0x3ff000000000000L & l) != 0L) { + jjstateSet[jjnewStateCnt++] = 93; + } + break; + case 93: + if ((0x3ff000000000000L & l) == 0L) { + break; + } + if (kind > 147) { + kind = 147; + } + jjCheckNAddStates(44, 47); + break; + case 94: + if (curChar != 58) { + break; + } + if (kind > 146) { + kind = 146; + } + jjCheckNAddStates(17, 19); + break; + case 95: + if ((0x3ff000000000000L & l) == 0L) { + break; + } + if (kind > 152) { + kind = 152; + } + jjCheckNAddStates(0, 6); + break; + case 96: + if ((0x3ff000000000000L & l) == 0L) { + break; + } + if (kind > 152) { + kind = 152; + } + jjCheckNAdd(96); + break; + case 97: + if ((0x3ff000000000000L & l) != 0L) { + jjCheckNAddTwoStates(97, 98); + } + break; + case 98: + if (curChar == 46) { + jjCheckNAdd(99); + } + break; + case 99: + if ((0x3ff000000000000L & l) == 0L) { + break; + } + if (kind > 155) { + kind = 155; + } + jjCheckNAdd(99); + break; + case 100: + if ((0x3ff000000000000L & l) != 0L) { + jjCheckNAddTwoStates(100, 101); + } + break; + case 101: + if (curChar == 46) { + jjCheckNAddTwoStates(102, 103); + } + break; + case 102: + if ((0x3ff000000000000L & l) != 0L) { + jjCheckNAddTwoStates(102, 103); + } + break; + case 104: + if ((0x280000000000L & l) != 0L) { + jjCheckNAdd(105); + } + break; + case 105: + if ((0x3ff000000000000L & l) == 0L) { + break; + } + if (kind > 158) { + kind = 158; + } + jjCheckNAdd(105); + break; + case 106: + if ((0x3ff000000000000L & l) != 0L) { + jjCheckNAddTwoStates(106, 107); + } + break; + case 108: + if ((0x280000000000L & l) != 0L) { + jjCheckNAdd(109); + } + break; + case 109: + if ((0x3ff000000000000L & l) == 0L) { + break; + } + if (kind > 158) { + kind = 158; + } + jjCheckNAdd(109); + break; + case 110: + if (curChar == 43) { + jjCheckNAddStates(12, 16); + } + break; + case 111: + if ((0x3ff000000000000L & l) == 0L) { + break; + } + if (kind > 153) { + kind = 153; + } + jjCheckNAdd(111); + break; + case 112: + if ((0x3ff000000000000L & l) != 0L) { + jjCheckNAddTwoStates(112, 113); + } + break; + case 113: + if (curChar == 46) { + jjCheckNAdd(114); + } + break; + case 114: + if ((0x3ff000000000000L & l) == 0L) { + break; + } + if (kind > 156) { + kind = 156; + } + jjCheckNAdd(114); + break; + case 115: + if (curChar == 46) { + jjCheckNAdd(116); + } + break; + case 116: + if ((0x3ff000000000000L & l) != 0L) { + jjCheckNAddTwoStates(116, 117); + } + break; + case 118: + if ((0x280000000000L & l) != 0L) { + jjCheckNAdd(119); + } + break; + case 119: + if ((0x3ff000000000000L & l) == 0L) { + break; + } + if (kind > 163) { + kind = 163; + } + jjCheckNAdd(119); + break; + case 120: + if ((0x3ff000000000000L & l) != 0L) { + jjCheckNAddStates(50, 53); + } + break; + case 121: + if ((0x3ff000000000000L & l) != 0L) { + jjCheckNAddTwoStates(121, 122); + } + break; + case 122: + if (curChar == 46) { + jjCheckNAddTwoStates(123, 124); + } + break; + case 123: + if ((0x3ff000000000000L & l) != 0L) { + jjCheckNAddTwoStates(123, 124); + } + break; + case 125: + if ((0x280000000000L & l) != 0L) { + jjCheckNAdd(126); + } + break; + case 126: + if ((0x3ff000000000000L & l) == 0L) { + break; + } + if (kind > 163) { + kind = 163; + } + jjCheckNAdd(126); + break; + case 127: + if ((0x3ff000000000000L & l) != 0L) { + jjCheckNAddTwoStates(127, 128); + } + break; + case 129: + if ((0x280000000000L & l) != 0L) { + jjCheckNAdd(130); + } + break; + case 130: + if ((0x3ff000000000000L & l) == 0L) { + break; + } + if (kind > 163) { + kind = 163; + } + jjCheckNAdd(130); + break; + case 131: + if (curChar == 45) { + jjCheckNAddStates(7, 11); + } + break; + case 132: + if ((0x3ff000000000000L & l) == 0L) { + break; + } + if (kind > 154) { + kind = 154; + } + jjCheckNAdd(132); + break; + case 133: + if ((0x3ff000000000000L & l) != 0L) { + jjCheckNAddTwoStates(133, 134); + } + break; + case 134: + if (curChar == 46) { + jjCheckNAdd(135); + } + break; + case 135: + if ((0x3ff000000000000L & l) == 0L) { + break; + } + if (kind > 157) { + kind = 157; + } + jjCheckNAdd(135); + break; + case 136: + if (curChar == 46) { + jjCheckNAdd(137); + } + break; + case 137: + if ((0x3ff000000000000L & l) != 0L) { + jjCheckNAddTwoStates(137, 138); + } + break; + case 139: + if ((0x280000000000L & l) != 0L) { + jjCheckNAdd(140); + } + break; + case 140: + if ((0x3ff000000000000L & l) == 0L) { + break; + } + if (kind > 164) { + kind = 164; + } + jjCheckNAdd(140); + break; + case 141: + if ((0x3ff000000000000L & l) != 0L) { + jjCheckNAddStates(54, 57); + } + break; + case 142: + if ((0x3ff000000000000L & l) != 0L) { + jjCheckNAddTwoStates(142, 143); + } + break; + case 143: + if (curChar == 46) { + jjCheckNAddTwoStates(144, 145); + } + break; + case 144: + if ((0x3ff000000000000L & l) != 0L) { + jjCheckNAddTwoStates(144, 145); + } + break; + case 146: + if ((0x280000000000L & l) != 0L) { + jjCheckNAdd(147); + } + break; + case 147: + if ((0x3ff000000000000L & l) == 0L) { + break; + } + if (kind > 164) { + kind = 164; + } + jjCheckNAdd(147); + break; + case 148: + if ((0x3ff000000000000L & l) != 0L) { + jjCheckNAddTwoStates(148, 149); + } + break; + case 150: + if ((0x280000000000L & l) != 0L) { + jjCheckNAdd(151); + } + break; + case 151: + if ((0x3ff000000000000L & l) == 0L) { + break; + } + if (kind > 164) { + kind = 164; + } + jjCheckNAdd(151); + break; + case 152: + if (curChar == 46) { + jjCheckNAddTwoStates(99, 153); + } + break; + case 153: + if ((0x3ff000000000000L & l) != 0L) { + jjCheckNAddTwoStates(153, 154); + } + break; + case 155: + if ((0x280000000000L & l) != 0L) { + jjCheckNAdd(156); + } + break; + case 156: + if ((0x3ff000000000000L & l) == 0L) { + break; + } + if (kind > 158) { + kind = 158; + } + jjCheckNAdd(156); + break; + default: + break; + } + } while (i != startsAt); } else if (curChar < 128) { - kind = jjMoveNfa_0_curCharLessThan128(startsAt, i, kind); + long l = 1L << (curChar & 077); + do { + switch (jjstateSet[--i]) { + case 0: + if ((0x7fffffe07fffffeL & l) != 0L) { + jjCheckNAddStates(58, 63); + } else if (curChar == 64) { + jjCheckNAdd(27); + } else if (curChar == 95) { + jjstateSet[jjnewStateCnt++] = 15; + } else if (curChar == 91) { + jjAddStates(26, 27); + } + if ((0x20000000200L & l) != 0L) { + jjAddStates(64, 66); + } else if ((0x20000000200000L & l) != 0L) { + jjstateSet[jjnewStateCnt++] = 10; + } + break; + case 2: + if (kind > 3) { + kind = 3; + } + jjstateSet[jjnewStateCnt++] = 2; + break; + case 6: + if (curChar == 91) { + jjAddStates(26, 27); + } + break; + case 8: + if (curChar == 93 && kind > 31) { + kind = 31; + } + break; + case 9: + if ((0x20000000200L & l) != 0L && kind > 76) { + kind = 76; + } + break; + case 10: + case 70: + if ((0x4000000040000L & l) != 0L) { + jjCheckNAdd(9); + } + break; + case 11: + if ((0x20000000200000L & l) != 0L) { + jjstateSet[jjnewStateCnt++] = 10; + } + break; + case 13: + if ((0xc7fffffeafffffffL & l) != 0L) { + jjAddStates(67, 68); + } + break; + case 16: + if ((0x7fffffe87fffffeL & l) == 0L) { + break; + } + if (kind > 148) { + kind = 148; + } + jjCheckNAddTwoStates(17, 18); + break; + case 17: + if ((0x7fffffe87fffffeL & l) != 0L) { + jjCheckNAddTwoStates(17, 18); + } + break; + case 18: + if ((0x7fffffe87fffffeL & l) != 0L && kind > 148) { + kind = 148; + } + break; + case 19: + if (curChar == 95) { + jjstateSet[jjnewStateCnt++] = 15; + } + break; + case 21: + case 22: + if ((0x7fffffe87fffffeL & l) == 0L) { + break; + } + if (kind > 149) { + kind = 149; + } + jjCheckNAdd(22); + break; + case 24: + case 25: + if ((0x7fffffe87fffffeL & l) == 0L) { + break; + } + if (kind > 150) { + kind = 150; + } + jjCheckNAdd(25); + break; + case 26: + if (curChar == 64) { + jjCheckNAdd(27); + } + break; + case 27: + if ((0x7fffffe07fffffeL & l) == 0L) { + break; + } + if (kind > 151) { + kind = 151; + } + jjCheckNAddTwoStates(27, 28); + break; + case 29: + if ((0x7fffffe07fffffeL & l) == 0L) { + break; + } + if (kind > 151) { + kind = 151; + } + jjCheckNAddTwoStates(28, 29); + break; + case 31: + if ((0xffffffffefffffffL & l) != 0L) { + jjCheckNAddStates(23, 25); + } + break; + case 32: + if (curChar == 92) { + jjstateSet[jjnewStateCnt++] = 33; + } + break; + case 33: + if ((0x14404410000000L & l) != 0L) { + jjCheckNAddStates(23, 25); + } + break; + case 36: + if ((0xffffffffefffffffL & l) != 0L) { + jjCheckNAddStates(20, 22); + } + break; + case 37: + if (curChar == 92) { + jjstateSet[jjnewStateCnt++] = 38; + } + break; + case 38: + if ((0x14404410000000L & l) != 0L) { + jjCheckNAddStates(20, 22); + } + break; + case 42: + if ((0xffffffffefffffffL & l) != 0L) { + jjCheckNAddStates(28, 31); + } + break; + case 43: + if (curChar == 92) { + jjstateSet[jjnewStateCnt++] = 44; + } + break; + case 44: + if ((0x14404410000000L & l) != 0L) { + jjCheckNAddStates(28, 31); + } + break; + case 53: + if ((0xffffffffefffffffL & l) != 0L) { + jjCheckNAddStates(34, 37); + } + break; + case 54: + if (curChar == 92) { + jjstateSet[jjnewStateCnt++] = 55; + } + break; + case 55: + if ((0x14404410000000L & l) != 0L) { + jjCheckNAddStates(34, 37); + } + break; + case 62: + if ((0x20000000200L & l) != 0L) { + jjAddStates(64, 66); + } + break; + case 63: + if ((0x20000000200L & l) != 0L && kind > 66) { + kind = 66; + } + break; + case 64: + case 67: + if ((0x4000000040000L & l) != 0L) { + jjCheckNAdd(63); + } + break; + case 65: + if ((0x20000000200L & l) != 0L) { + jjstateSet[jjnewStateCnt++] = 64; + } + break; + case 66: + if ((0x8000000080000L & l) != 0L) { + jjstateSet[jjnewStateCnt++] = 65; + } + break; + case 68: + if ((0x20000000200000L & l) != 0L) { + jjstateSet[jjnewStateCnt++] = 67; + } + break; + case 69: + if ((0x8000000080000L & l) != 0L) { + jjstateSet[jjnewStateCnt++] = 68; + } + break; + case 71: + if ((0x7fffffe07fffffeL & l) != 0L) { + jjCheckNAddStates(58, 63); + } + break; + case 72: + if ((0x7fffffe87fffffeL & l) != 0L) { + jjCheckNAddTwoStates(72, 73); + } + break; + case 73: + if ((0x7fffffe87fffffeL & l) != 0L) { + jjCheckNAdd(74); + } + break; + case 75: + if ((0x7fffffe87fffffeL & l) != 0L) { + jjCheckNAddTwoStates(75, 76); + } + break; + case 76: + if ((0x7fffffe87fffffeL & l) != 0L) { + jjCheckNAdd(77); + } + break; + case 78: + if ((0x7fffffe87fffffeL & l) == 0L) { + break; + } + if (kind > 147) { + kind = 147; + } + jjCheckNAddStates(44, 47); + break; + case 79: + if ((0x7fffffe87fffffeL & l) != 0L) { + jjCheckNAddStates(44, 47); + } + break; + case 80: + if ((0x7fffffe87fffffeL & l) != 0L && kind > 147) { + kind = 147; + } + break; + case 81: + if (curChar == 92) { + jjAddStates(69, 70); + } + break; + case 82: + if ((0x4000000080000001L & l) != 0L) { + jjCheckNAddStates(44, 47); + } + break; + case 84: + if ((0x7e0000007eL & l) != 0L) { + jjstateSet[jjnewStateCnt++] = 85; + } + break; + case 85: + if ((0x7e0000007eL & l) != 0L) { + jjCheckNAddStates(44, 47); + } + break; + case 86: + if ((0x7e0000007eL & l) != 0L) { + jjstateSet[jjnewStateCnt++] = 87; + } + break; + case 87: + if ((0x7e0000007eL & l) != 0L && kind > 147) { + kind = 147; + } + break; + case 88: + if ((0x4000000080000001L & l) != 0L && kind > 147) { + kind = 147; + } + break; + case 89: + if (curChar == 92) { + jjstateSet[jjnewStateCnt++] = 90; + } + break; + case 90: + if ((0x4000000080000001L & l) == 0L) { + break; + } + if (kind > 147) { + kind = 147; + } + jjCheckNAddStates(44, 47); + break; + case 92: + if ((0x7e0000007eL & l) != 0L) { + jjstateSet[jjnewStateCnt++] = 93; + } + break; + case 93: + if ((0x7e0000007eL & l) == 0L) { + break; + } + if (kind > 147) { + kind = 147; + } + jjCheckNAddStates(44, 47); + break; + case 103: + if ((0x2000000020L & l) != 0L) { + jjAddStates(71, 72); + } + break; + case 107: + if ((0x2000000020L & l) != 0L) { + jjAddStates(73, 74); + } + break; + case 117: + if ((0x2000000020L & l) != 0L) { + jjAddStates(75, 76); + } + break; + case 124: + if ((0x2000000020L & l) != 0L) { + jjAddStates(77, 78); + } + break; + case 128: + if ((0x2000000020L & l) != 0L) { + jjAddStates(79, 80); + } + break; + case 138: + if ((0x2000000020L & l) != 0L) { + jjAddStates(81, 82); + } + break; + case 145: + if ((0x2000000020L & l) != 0L) { + jjAddStates(83, 84); + } + break; + case 149: + if ((0x2000000020L & l) != 0L) { + jjAddStates(85, 86); + } + break; + case 154: + if ((0x2000000020L & l) != 0L) { + jjAddStates(87, 88); + } + break; + default: + break; + } + } while (i != startsAt); } else { - kind = jjMoveNfa_0_curCharOther(startsAt, i, kind); + int hiByte = (int) (curChar >> 8); + int i1 = hiByte >> 6; + long l1 = 1L << (hiByte & 077); + int i2 = (curChar & 0xff) >> 6; + long l2 = 1L << (curChar & 077); + do { + switch (jjstateSet[--i]) { + case 0: + if (jjCanMove_1(hiByte, i1, i2, l1, l2)) { + jjCheckNAddStates(58, 63); + } + break; + case 2: + if (!jjCanMove_0(hiByte, i1, i2, l1, l2)) { + break; + } + if (kind > 3) { + kind = 3; + } + jjstateSet[jjnewStateCnt++] = 2; + break; + case 13: + if (jjCanMove_0(hiByte, i1, i2, l1, l2)) { + jjAddStates(67, 68); + } + break; + case 16: + if (!jjCanMove_1(hiByte, i1, i2, l1, l2)) { + break; + } + if (kind > 148) { + kind = 148; + } + jjCheckNAddTwoStates(17, 18); + break; + case 17: + if (jjCanMove_2(hiByte, i1, i2, l1, l2)) { + jjCheckNAddTwoStates(17, 18); + } + break; + case 18: + if (jjCanMove_2(hiByte, i1, i2, l1, l2) && kind > 148) { + kind = 148; + } + break; + case 21: + if (!jjCanMove_1(hiByte, i1, i2, l1, l2)) { + break; + } + if (kind > 149) { + kind = 149; + } + jjCheckNAdd(22); + break; + case 22: + if (!jjCanMove_2(hiByte, i1, i2, l1, l2)) { + break; + } + if (kind > 149) { + kind = 149; + } + jjCheckNAdd(22); + break; + case 24: + if (!jjCanMove_1(hiByte, i1, i2, l1, l2)) { + break; + } + if (kind > 150) { + kind = 150; + } + jjCheckNAdd(25); + break; + case 25: + if (!jjCanMove_2(hiByte, i1, i2, l1, l2)) { + break; + } + if (kind > 150) { + kind = 150; + } + jjCheckNAdd(25); + break; + case 31: + if (jjCanMove_0(hiByte, i1, i2, l1, l2)) { + jjAddStates(23, 25); + } + break; + case 36: + if (jjCanMove_0(hiByte, i1, i2, l1, l2)) { + jjAddStates(20, 22); + } + break; + case 42: + if (jjCanMove_0(hiByte, i1, i2, l1, l2)) { + jjAddStates(28, 31); + } + break; + case 53: + if (jjCanMove_0(hiByte, i1, i2, l1, l2)) { + jjAddStates(34, 37); + } + break; + case 72: + if (jjCanMove_2(hiByte, i1, i2, l1, l2)) { + jjCheckNAddTwoStates(72, 73); + } + break; + case 73: + if (jjCanMove_2(hiByte, i1, i2, l1, l2)) { + jjCheckNAdd(74); + } + break; + case 75: + if (jjCanMove_2(hiByte, i1, i2, l1, l2)) { + jjCheckNAddTwoStates(75, 76); + } + break; + case 76: + if (jjCanMove_2(hiByte, i1, i2, l1, l2)) { + jjCheckNAdd(77); + } + break; + case 78: + if (!jjCanMove_1(hiByte, i1, i2, l1, l2)) { + break; + } + if (kind > 147) { + kind = 147; + } + jjCheckNAddStates(44, 47); + break; + case 79: + if (jjCanMove_2(hiByte, i1, i2, l1, l2)) { + jjCheckNAddStates(44, 47); + } + break; + case 80: + if (jjCanMove_2(hiByte, i1, i2, l1, l2) && kind > 147) { + kind = 147; + } + break; + default: + break; + } + } while (i != startsAt); } if (kind != 0x7fffffff) { jjmatchedKind = kind; @@ -1837,1082 +3153,58 @@ private int jjMoveNfa_0(int startState, int curPos) { kind = 0x7fffffff; } ++curPos; - if ((i = jjnewStateCnt) == (startsAt = 157 - (jjnewStateCnt = startsAt))) + if ((i = jjnewStateCnt) == (startsAt = 157 - (jjnewStateCnt = startsAt))) { break; + } try { curChar = input_stream.readChar(); } catch (java.io.IOException e) { break; } } - if (jjmatchedPos > strPos) + if (jjmatchedPos > strPos) { return curPos; + } int toRet = Math.max(curPos, seenUpto); - if (curPos < toRet) - for (i = toRet - Math.min(curPos, seenUpto); i-- > 0;) + if (curPos < toRet) { + for (i = toRet - Math.min(curPos, seenUpto); i-- > 0;) { try { curChar = input_stream.readChar(); } catch (java.io.IOException e) { throw new Error("Internal Error : Please send a bug report."); } + } + } if (jjmatchedPos < strPos) { jjmatchedKind = strKind; jjmatchedPos = strPos; - } else if (jjmatchedPos == strPos && jjmatchedKind > strKind) + } else if (jjmatchedPos == strPos && jjmatchedKind > strKind) { jjmatchedKind = strKind; + } return toRet; } - private int jjMoveNfa_0_curCharLessThan64(int startsAt, int i, int kind) { - long l = 1L << curChar; - do { - switch (jjstateSet[--i]) { - case 0: - if ((0x3ff000000000000L & l) != 0L) { - if (kind > 152) - kind = 152; - jjCheckNAddStates(0, 6); - } else if ((0x100003600L & l) != 0L) { - if (kind > 2) - kind = 2; - } else if (curChar == 46) - jjCheckNAddTwoStates(99, 153); - else if (curChar == 45) - jjCheckNAddStates(7, 11); - else if (curChar == 43) - jjCheckNAddStates(12, 16); - else if (curChar == 58) { - if (kind > 146) - kind = 146; - jjCheckNAddStates(17, 19); - } else if (curChar == 34) - jjstateSet[jjnewStateCnt++] = 60; - else if (curChar == 39) - jjstateSet[jjnewStateCnt++] = 49; - else if (curChar == 36) - jjstateSet[jjnewStateCnt++] = 24; - else if (curChar == 60) - jjCheckNAddTwoStates(13, 14); - else if (curChar == 40) - jjCheckNAddTwoStates(4, 5); - else if (curChar == 35) { - if (kind > 3) - kind = 3; - jjCheckNAdd(2); - } else if (curChar == 63) - jjstateSet[jjnewStateCnt++] = 21; - if (curChar == 34) - jjCheckNAddStates(20, 22); - else if (curChar == 39) - jjCheckNAddStates(23, 25); - break; - case 1: - if (curChar != 35) - break; - if (kind > 3) - kind = 3; - jjCheckNAdd(2); - break; - case 2: - if ((0xffffffffffffdbffL & l) == 0L) - break; - if (kind > 3) - kind = 3; - jjCheckNAdd(2); - break; - case 3: - if (curChar == 40) - jjCheckNAddTwoStates(4, 5); - break; - case 4: - if ((0x100003600L & l) != 0L) - jjCheckNAddTwoStates(4, 5); - break; - case 5: - if (curChar == 41 && kind > 30) - kind = 30; - break; - case 7: - if ((0x100003600L & l) != 0L) - jjAddStates(26, 27); - break; - case 12: - if (curChar == 60) - jjCheckNAddTwoStates(13, 14); - break; - case 13: - if ((0xaffffffa00000000L & l) != 0L) - jjCheckNAddTwoStates(13, 14); - break; - case 14: - if (curChar == 62 && kind > 145) - kind = 145; - break; - case 15: - if (curChar == 58) - jjstateSet[jjnewStateCnt++] = 16; - break; - case 16: - if ((0x3ff000000000000L & l) == 0L) - break; - if (kind > 148) - kind = 148; - jjCheckNAddTwoStates(17, 18); - break; - case 17: - if ((0x3ff600000000000L & l) != 0L) - jjCheckNAddTwoStates(17, 18); - break; - case 18: - if ((0x3ff200000000000L & l) != 0L && kind > 148) - kind = 148; - break; - case 20: - if (curChar == 63) - jjstateSet[jjnewStateCnt++] = 21; - break; - case 21: - case 22: - if ((0x3ff000000000000L & l) == 0L) - break; - if (kind > 149) - kind = 149; - jjCheckNAdd(22); - break; - case 23: - if (curChar == 36) - jjstateSet[jjnewStateCnt++] = 24; - break; - case 24: - case 25: - if ((0x3ff000000000000L & l) == 0L) - break; - if (kind > 150) - kind = 150; - jjCheckNAdd(25); - break; - case 28: - if (curChar == 45) - jjCheckNAdd(29); - break; - case 29: - if ((0x3ff000000000000L & l) == 0L) - break; - if (kind > 151) - kind = 151; - jjCheckNAddTwoStates(28, 29); - break; - case 30: - if (curChar == 39) - jjCheckNAddStates(23, 25); - break; - case 31: - if ((0xffffff7fffffdbffL & l) != 0L) - jjCheckNAddStates(23, 25); - break; - case 33: - if ((0x8400000000L & l) != 0L) - jjCheckNAddStates(23, 25); - break; - case 34: - if (curChar == 39 && kind > 165) - kind = 165; - break; - case 35: - if (curChar == 34) - jjCheckNAddStates(20, 22); - break; - case 36: - if ((0xfffffffbffffdbffL & l) != 0L) - jjCheckNAddStates(20, 22); - break; - case 38: - if ((0x8400000000L & l) != 0L) - jjCheckNAddStates(20, 22); - break; - case 39: - if (curChar == 34 && kind > 166) - kind = 166; - break; - case 40: - if (curChar == 39) - jjCheckNAddStates(28, 31); - break; - case 41: - case 46: - if (curChar == 39) - jjCheckNAddTwoStates(42, 43); - break; - case 42: - if ((0xffffff7fffffffffL & l) != 0L) - jjCheckNAddStates(28, 31); - break; - case 44: - if ((0x8400000000L & l) != 0L) - jjCheckNAddStates(28, 31); - break; - case 45: - if (curChar == 39) - jjAddStates(32, 33); - break; - case 47: - if (curChar == 39 && kind > 167) - kind = 167; - break; - case 48: - if (curChar == 39) - jjstateSet[jjnewStateCnt++] = 47; - break; - case 49: - if (curChar == 39) - jjstateSet[jjnewStateCnt++] = 40; - break; - case 50: - if (curChar == 39) - jjstateSet[jjnewStateCnt++] = 49; - break; - case 51: - if (curChar == 34) - jjCheckNAddStates(34, 37); - break; - case 52: - case 57: - if (curChar == 34) - jjCheckNAddTwoStates(53, 54); - break; - case 53: - if ((0xfffffffbffffffffL & l) != 0L) - jjCheckNAddStates(34, 37); - break; - case 55: - if ((0x8400000000L & l) != 0L) - jjCheckNAddStates(34, 37); - break; - case 56: - if (curChar == 34) - jjAddStates(38, 39); - break; - case 58: - if (curChar == 34 && kind > 168) - kind = 168; - break; - case 59: - if (curChar == 34) - jjstateSet[jjnewStateCnt++] = 58; - break; - case 60: - if (curChar == 34) - jjstateSet[jjnewStateCnt++] = 51; - break; - case 61: - if (curChar == 34) - jjstateSet[jjnewStateCnt++] = 60; - break; - case 72: - if ((0x3ff600000000000L & l) != 0L) - jjAddStates(40, 41); - break; - case 73: - if ((0x3ff200000000000L & l) != 0L) - jjstateSet[jjnewStateCnt++] = 74; - break; - case 74: - if (curChar == 58 && kind > 146) - kind = 146; - break; - case 75: - if ((0x3ff600000000000L & l) != 0L) - jjAddStates(42, 43); - break; - case 76: - if ((0x3ff200000000000L & l) != 0L) - jjstateSet[jjnewStateCnt++] = 77; - break; - case 77: - if (curChar == 58) - jjCheckNAddStates(17, 19); - break; - case 78: - if ((0x7ff000000000000L & l) == 0L) - break; - if (kind > 147) - kind = 147; - jjCheckNAddStates(44, 47); - break; - case 79: - if ((0x7ff600000000000L & l) != 0L) - jjCheckNAddStates(44, 47); - break; - case 80: - if ((0x7ff200000000000L & l) != 0L && kind > 147) - kind = 147; - break; - case 82: - if ((0xa800ff7e00000000L & l) != 0L) - jjCheckNAddStates(44, 47); - break; - case 83: - if (curChar == 37) - jjAddStates(48, 49); - break; - case 84: - if ((0x3ff000000000000L & l) != 0L) - jjstateSet[jjnewStateCnt++] = 85; - break; - case 85: - if ((0x3ff000000000000L & l) != 0L) - jjCheckNAddStates(44, 47); - break; - case 86: - if ((0x3ff000000000000L & l) != 0L) - jjstateSet[jjnewStateCnt++] = 87; - break; - case 87: - if ((0x3ff000000000000L & l) != 0L && kind > 147) - kind = 147; - break; - case 88: - if ((0xa800ff7e00000000L & l) != 0L && kind > 147) - kind = 147; - break; - case 90: - if ((0xa800ff7e00000000L & l) == 0L) - break; - if (kind > 147) - kind = 147; - jjCheckNAddStates(44, 47); - break; - case 91: - if (curChar == 37) - jjstateSet[jjnewStateCnt++] = 92; - break; - case 92: - if ((0x3ff000000000000L & l) != 0L) - jjstateSet[jjnewStateCnt++] = 93; - break; - case 93: - if ((0x3ff000000000000L & l) == 0L) - break; - if (kind > 147) - kind = 147; - jjCheckNAddStates(44, 47); - break; - case 94: - if (curChar != 58) - break; - if (kind > 146) - kind = 146; - jjCheckNAddStates(17, 19); - break; - case 95: - if ((0x3ff000000000000L & l) == 0L) - break; - if (kind > 152) - kind = 152; - jjCheckNAddStates(0, 6); - break; - case 96: - if ((0x3ff000000000000L & l) == 0L) - break; - if (kind > 152) - kind = 152; - jjCheckNAdd(96); - break; - case 97: - if ((0x3ff000000000000L & l) != 0L) - jjCheckNAddTwoStates(97, 98); - break; - case 98: - if (curChar == 46) - jjCheckNAdd(99); - break; - case 99: - if ((0x3ff000000000000L & l) == 0L) - break; - if (kind > 155) - kind = 155; - jjCheckNAdd(99); - break; - case 100: - if ((0x3ff000000000000L & l) != 0L) - jjCheckNAddTwoStates(100, 101); - break; - case 101: - if (curChar == 46) - jjCheckNAddTwoStates(102, 103); - break; - case 102: - if ((0x3ff000000000000L & l) != 0L) - jjCheckNAddTwoStates(102, 103); - break; - case 104: - if ((0x280000000000L & l) != 0L) - jjCheckNAdd(105); - break; - case 105: - if ((0x3ff000000000000L & l) == 0L) - break; - if (kind > 158) - kind = 158; - jjCheckNAdd(105); - break; - case 106: - if ((0x3ff000000000000L & l) != 0L) - jjCheckNAddTwoStates(106, 107); - break; - case 108: - if ((0x280000000000L & l) != 0L) - jjCheckNAdd(109); - break; - case 109: - if ((0x3ff000000000000L & l) == 0L) - break; - if (kind > 158) - kind = 158; - jjCheckNAdd(109); - break; - case 110: - if (curChar == 43) - jjCheckNAddStates(12, 16); - break; - case 111: - if ((0x3ff000000000000L & l) == 0L) - break; - if (kind > 153) - kind = 153; - jjCheckNAdd(111); - break; - case 112: - if ((0x3ff000000000000L & l) != 0L) - jjCheckNAddTwoStates(112, 113); - break; - case 113: - if (curChar == 46) - jjCheckNAdd(114); - break; - case 114: - if ((0x3ff000000000000L & l) == 0L) - break; - if (kind > 156) - kind = 156; - jjCheckNAdd(114); - break; - case 115: - if (curChar == 46) - jjCheckNAdd(116); - break; - case 116: - if ((0x3ff000000000000L & l) != 0L) - jjCheckNAddTwoStates(116, 117); - break; - case 118: - if ((0x280000000000L & l) != 0L) - jjCheckNAdd(119); - break; - case 119: - if ((0x3ff000000000000L & l) == 0L) - break; - if (kind > 163) - kind = 163; - jjCheckNAdd(119); - break; - case 120: - if ((0x3ff000000000000L & l) != 0L) - jjCheckNAddStates(50, 53); - break; - case 121: - if ((0x3ff000000000000L & l) != 0L) - jjCheckNAddTwoStates(121, 122); - break; - case 122: - if (curChar == 46) - jjCheckNAddTwoStates(123, 124); - break; - case 123: - if ((0x3ff000000000000L & l) != 0L) - jjCheckNAddTwoStates(123, 124); - break; - case 125: - if ((0x280000000000L & l) != 0L) - jjCheckNAdd(126); - break; - case 126: - if ((0x3ff000000000000L & l) == 0L) - break; - if (kind > 163) - kind = 163; - jjCheckNAdd(126); - break; - case 127: - if ((0x3ff000000000000L & l) != 0L) - jjCheckNAddTwoStates(127, 128); - break; - case 129: - if ((0x280000000000L & l) != 0L) - jjCheckNAdd(130); - break; - case 130: - if ((0x3ff000000000000L & l) == 0L) - break; - if (kind > 163) - kind = 163; - jjCheckNAdd(130); - break; - case 131: - if (curChar == 45) - jjCheckNAddStates(7, 11); - break; - case 132: - if ((0x3ff000000000000L & l) == 0L) - break; - if (kind > 154) - kind = 154; - jjCheckNAdd(132); - break; - case 133: - if ((0x3ff000000000000L & l) != 0L) - jjCheckNAddTwoStates(133, 134); - break; - case 134: - if (curChar == 46) - jjCheckNAdd(135); - break; - case 135: - if ((0x3ff000000000000L & l) == 0L) - break; - if (kind > 157) - kind = 157; - jjCheckNAdd(135); - break; - case 136: - if (curChar == 46) - jjCheckNAdd(137); - break; - case 137: - if ((0x3ff000000000000L & l) != 0L) - jjCheckNAddTwoStates(137, 138); - break; - case 139: - if ((0x280000000000L & l) != 0L) - jjCheckNAdd(140); - break; - case 140: - if ((0x3ff000000000000L & l) == 0L) - break; - if (kind > 164) - kind = 164; - jjCheckNAdd(140); - break; - case 141: - if ((0x3ff000000000000L & l) != 0L) - jjCheckNAddStates(54, 57); - break; - case 142: - if ((0x3ff000000000000L & l) != 0L) - jjCheckNAddTwoStates(142, 143); - break; - case 143: - if (curChar == 46) - jjCheckNAddTwoStates(144, 145); - break; - case 144: - if ((0x3ff000000000000L & l) != 0L) - jjCheckNAddTwoStates(144, 145); - break; - case 146: - if ((0x280000000000L & l) != 0L) - jjCheckNAdd(147); - break; - case 147: - if ((0x3ff000000000000L & l) == 0L) - break; - if (kind > 164) - kind = 164; - jjCheckNAdd(147); - break; - case 148: - if ((0x3ff000000000000L & l) != 0L) - jjCheckNAddTwoStates(148, 149); - break; - case 150: - if ((0x280000000000L & l) != 0L) - jjCheckNAdd(151); - break; - case 151: - if ((0x3ff000000000000L & l) == 0L) - break; - if (kind > 164) - kind = 164; - jjCheckNAdd(151); - break; - case 152: - if (curChar == 46) - jjCheckNAddTwoStates(99, 153); - break; - case 153: - if ((0x3ff000000000000L & l) != 0L) - jjCheckNAddTwoStates(153, 154); - break; - case 155: - if ((0x280000000000L & l) != 0L) - jjCheckNAdd(156); - break; - case 156: - if ((0x3ff000000000000L & l) == 0L) - break; - if (kind > 158) - kind = 158; - jjCheckNAdd(156); - break; - default: - break; - } - } while (i != startsAt); - return kind; - } - - private int jjMoveNfa_0_curCharLessThan128(int startsAt, int i, int kind) { - long l = 1L << (curChar & 077); - do { - switch (jjstateSet[--i]) { - case 0: - if ((0x7fffffe07fffffeL & l) != 0L) - jjCheckNAddStates(58, 63); - else if (curChar == 64) - jjCheckNAdd(27); - else if (curChar == 95) - jjstateSet[jjnewStateCnt++] = 15; - else if (curChar == 91) - jjAddStates(26, 27); - if ((0x20000000200L & l) != 0L) - jjAddStates(64, 66); - else if ((0x20000000200000L & l) != 0L) - jjstateSet[jjnewStateCnt++] = 10; - break; - case 2: - if (kind > 3) - kind = 3; - jjstateSet[jjnewStateCnt++] = 2; - break; - case 6: - if (curChar == 91) - jjAddStates(26, 27); - break; - case 8: - if (curChar == 93 && kind > 31) - kind = 31; - break; - case 9: - if ((0x20000000200L & l) != 0L && kind > 76) - kind = 76; - break; - case 10: - case 70: - if ((0x4000000040000L & l) != 0L) - jjCheckNAdd(9); - break; - case 11: - if ((0x20000000200000L & l) != 0L) - jjstateSet[jjnewStateCnt++] = 10; - break; - case 13: - if ((0xc7fffffeafffffffL & l) != 0L) - jjAddStates(67, 68); - break; - case 16: - if ((0x7fffffe87fffffeL & l) == 0L) - break; - if (kind > 148) - kind = 148; - jjCheckNAddTwoStates(17, 18); - break; - case 17: - if ((0x7fffffe87fffffeL & l) != 0L) - jjCheckNAddTwoStates(17, 18); - break; - case 18: - if ((0x7fffffe87fffffeL & l) != 0L && kind > 148) - kind = 148; - break; - case 19: - if (curChar == 95) - jjstateSet[jjnewStateCnt++] = 15; - break; - case 21: - case 22: - if ((0x7fffffe87fffffeL & l) == 0L) - break; - if (kind > 149) - kind = 149; - jjCheckNAdd(22); - break; - case 24: - case 25: - if ((0x7fffffe87fffffeL & l) == 0L) - break; - if (kind > 150) - kind = 150; - jjCheckNAdd(25); - break; - case 26: - if (curChar == 64) - jjCheckNAdd(27); - break; - case 27: - if ((0x7fffffe07fffffeL & l) == 0L) - break; - if (kind > 151) - kind = 151; - jjCheckNAddTwoStates(27, 28); - break; - case 29: - if ((0x7fffffe07fffffeL & l) == 0L) - break; - if (kind > 151) - kind = 151; - jjCheckNAddTwoStates(28, 29); - break; - case 31: - if ((0xffffffffefffffffL & l) != 0L) - jjCheckNAddStates(23, 25); - break; - case 32: - if (curChar == 92) - jjstateSet[jjnewStateCnt++] = 33; - break; - case 33: - if ((0x14404410000000L & l) != 0L) - jjCheckNAddStates(23, 25); - break; - case 36: - if ((0xffffffffefffffffL & l) != 0L) - jjCheckNAddStates(20, 22); - break; - case 37: - if (curChar == 92) - jjstateSet[jjnewStateCnt++] = 38; - break; - case 38: - if ((0x14404410000000L & l) != 0L) - jjCheckNAddStates(20, 22); - break; - case 42: - if ((0xffffffffefffffffL & l) != 0L) - jjCheckNAddStates(28, 31); - break; - case 43: - if (curChar == 92) - jjstateSet[jjnewStateCnt++] = 44; - break; - case 44: - if ((0x14404410000000L & l) != 0L) - jjCheckNAddStates(28, 31); - break; - case 53: - if ((0xffffffffefffffffL & l) != 0L) - jjCheckNAddStates(34, 37); - break; - case 54: - if (curChar == 92) - jjstateSet[jjnewStateCnt++] = 55; - break; - case 55: - if ((0x14404410000000L & l) != 0L) - jjCheckNAddStates(34, 37); - break; - case 62: - if ((0x20000000200L & l) != 0L) - jjAddStates(64, 66); - break; - case 63: - if ((0x20000000200L & l) != 0L && kind > 66) - kind = 66; - break; - case 64: - case 67: - if ((0x4000000040000L & l) != 0L) - jjCheckNAdd(63); - break; - case 65: - if ((0x20000000200L & l) != 0L) - jjstateSet[jjnewStateCnt++] = 64; - break; - case 66: - if ((0x8000000080000L & l) != 0L) - jjstateSet[jjnewStateCnt++] = 65; - break; - case 68: - if ((0x20000000200000L & l) != 0L) - jjstateSet[jjnewStateCnt++] = 67; - break; - case 69: - if ((0x8000000080000L & l) != 0L) - jjstateSet[jjnewStateCnt++] = 68; - break; - case 71: - if ((0x7fffffe07fffffeL & l) != 0L) - jjCheckNAddStates(58, 63); - break; - case 72: - if ((0x7fffffe87fffffeL & l) != 0L) - jjCheckNAddTwoStates(72, 73); - break; - case 73: - if ((0x7fffffe87fffffeL & l) != 0L) - jjCheckNAdd(74); - break; - case 75: - if ((0x7fffffe87fffffeL & l) != 0L) - jjCheckNAddTwoStates(75, 76); - break; - case 76: - if ((0x7fffffe87fffffeL & l) != 0L) - jjCheckNAdd(77); - break; - case 78: - if ((0x7fffffe87fffffeL & l) == 0L) - break; - if (kind > 147) - kind = 147; - jjCheckNAddStates(44, 47); - break; - case 79: - if ((0x7fffffe87fffffeL & l) != 0L) - jjCheckNAddStates(44, 47); - break; - case 80: - if ((0x7fffffe87fffffeL & l) != 0L && kind > 147) - kind = 147; - break; - case 81: - if (curChar == 92) - jjAddStates(69, 70); - break; - case 82: - if ((0x4000000080000001L & l) != 0L) - jjCheckNAddStates(44, 47); - break; - case 84: - if ((0x7e0000007eL & l) != 0L) - jjstateSet[jjnewStateCnt++] = 85; - break; - case 85: - if ((0x7e0000007eL & l) != 0L) - jjCheckNAddStates(44, 47); - break; - case 86: - if ((0x7e0000007eL & l) != 0L) - jjstateSet[jjnewStateCnt++] = 87; - break; - case 87: - if ((0x7e0000007eL & l) != 0L && kind > 147) - kind = 147; - break; - case 88: - if ((0x4000000080000001L & l) != 0L && kind > 147) - kind = 147; - break; - case 89: - if (curChar == 92) - jjstateSet[jjnewStateCnt++] = 90; - break; - case 90: - if ((0x4000000080000001L & l) == 0L) - break; - if (kind > 147) - kind = 147; - jjCheckNAddStates(44, 47); - break; - case 92: - if ((0x7e0000007eL & l) != 0L) - jjstateSet[jjnewStateCnt++] = 93; - break; - case 93: - if ((0x7e0000007eL & l) == 0L) - break; - if (kind > 147) - kind = 147; - jjCheckNAddStates(44, 47); - break; - case 103: - if ((0x2000000020L & l) != 0L) - jjAddStates(71, 72); - break; - case 107: - if ((0x2000000020L & l) != 0L) - jjAddStates(73, 74); - break; - case 117: - if ((0x2000000020L & l) != 0L) - jjAddStates(75, 76); - break; - case 124: - if ((0x2000000020L & l) != 0L) - jjAddStates(77, 78); - break; - case 128: - if ((0x2000000020L & l) != 0L) - jjAddStates(79, 80); - break; - case 138: - if ((0x2000000020L & l) != 0L) - jjAddStates(81, 82); - break; - case 145: - if ((0x2000000020L & l) != 0L) - jjAddStates(83, 84); - break; - case 149: - if ((0x2000000020L & l) != 0L) - jjAddStates(85, 86); - break; - case 154: - if ((0x2000000020L & l) != 0L) - jjAddStates(87, 88); - break; - default: - break; - } - } while (i != startsAt); - return kind; - } - - private int jjMoveNfa_0_curCharOther(int startsAt, int i, int kind) { - int hiByte = (int) (curChar >> 8); - int i1 = hiByte >> 6; - long l1 = 1L << (hiByte & 077); - int i2 = (curChar & 0xff) >> 6; - long l2 = 1L << (curChar & 077); - do { - switch (jjstateSet[--i]) { - case 0: - if (jjCanMove_1(hiByte, i1, i2, l1, l2)) - jjCheckNAddStates(58, 63); - break; - case 2: - if (!jjCanMove_0(hiByte, i1, i2, l1, l2)) - break; - if (kind > 3) - kind = 3; - jjstateSet[jjnewStateCnt++] = 2; - break; - case 13: - if (jjCanMove_0(hiByte, i1, i2, l1, l2)) - jjAddStates(67, 68); - break; - case 16: - if (!jjCanMove_1(hiByte, i1, i2, l1, l2)) - break; - if (kind > 148) - kind = 148; - jjCheckNAddTwoStates(17, 18); - break; - case 17: - if (jjCanMove_2(hiByte, i1, i2, l1, l2)) - jjCheckNAddTwoStates(17, 18); - break; - case 18: - if (jjCanMove_2(hiByte, i1, i2, l1, l2) && kind > 148) - kind = 148; - break; - case 21: - if (!jjCanMove_1(hiByte, i1, i2, l1, l2)) - break; - if (kind > 149) - kind = 149; - jjCheckNAdd(22); - break; - case 22: - if (!jjCanMove_2(hiByte, i1, i2, l1, l2)) - break; - if (kind > 149) - kind = 149; - jjCheckNAdd(22); - break; - case 24: - if (!jjCanMove_1(hiByte, i1, i2, l1, l2)) - break; - if (kind > 150) - kind = 150; - jjCheckNAdd(25); - break; - case 25: - if (!jjCanMove_2(hiByte, i1, i2, l1, l2)) - break; - if (kind > 150) - kind = 150; - jjCheckNAdd(25); - break; - case 31: - if (jjCanMove_0(hiByte, i1, i2, l1, l2)) - jjAddStates(23, 25); - break; - case 36: - if (jjCanMove_0(hiByte, i1, i2, l1, l2)) - jjAddStates(20, 22); - break; - case 42: - if (jjCanMove_0(hiByte, i1, i2, l1, l2)) - jjAddStates(28, 31); - break; - case 53: - if (jjCanMove_0(hiByte, i1, i2, l1, l2)) - jjAddStates(34, 37); - break; - case 72: - if (jjCanMove_2(hiByte, i1, i2, l1, l2)) - jjCheckNAddTwoStates(72, 73); - break; - case 73: - if (jjCanMove_2(hiByte, i1, i2, l1, l2)) - jjCheckNAdd(74); - break; - case 75: - if (jjCanMove_2(hiByte, i1, i2, l1, l2)) - jjCheckNAddTwoStates(75, 76); - break; - case 76: - if (jjCanMove_2(hiByte, i1, i2, l1, l2)) - jjCheckNAdd(77); - break; - case 78: - if (!jjCanMove_1(hiByte, i1, i2, l1, l2)) - break; - if (kind > 147) - kind = 147; - jjCheckNAddStates(44, 47); - break; - case 79: - if (jjCanMove_2(hiByte, i1, i2, l1, l2)) - jjCheckNAddStates(44, 47); - break; - case 80: - if (jjCanMove_2(hiByte, i1, i2, l1, l2) && kind > 147) - kind = 147; - break; - default: - break; - } - } while (i != startsAt); - return kind; - } - - static final int[] jjnextStates = { 96, 97, 98, 100, 101, 106, 107, 132, 133, 134, 136, 141, 111, 112, 113, 115, - 120, 78, 89, 91, 36, 37, 39, 31, 32, 34, 7, 8, 41, 42, 43, 45, 46, 48, 52, 53, 54, 56, 57, 59, 72, 73, 75, - 76, 79, 80, 81, 83, 84, 86, 121, 122, 127, 128, 142, 143, 148, 149, 72, 73, 74, 75, 76, 77, 66, 69, 70, 13, - 14, 82, 88, 104, 105, 108, 109, 118, 119, 125, 126, 129, 130, 139, 140, 146, 147, 150, 151, 155, 156, }; + static final int[] jjnextStates = { + 96, 97, 98, 100, 101, 106, 107, 132, 133, 134, 136, 141, 111, 112, 113, 115, + 120, 78, 89, 91, 36, 37, 39, 31, 32, 34, 7, 8, 41, 42, 43, 45, + 46, 48, 52, 53, 54, 56, 57, 59, 72, 73, 75, 76, 79, 80, 81, 83, + 84, 86, 121, 122, 127, 128, 142, 143, 148, 149, 72, 73, 74, 75, 76, 77, + 66, 69, 70, 13, 14, 82, 88, 104, 105, 108, 109, 118, 119, 125, 126, 129, + 130, 139, 140, 146, 147, 150, 151, 155, 156, + }; private static final boolean jjCanMove_0(int hiByte, int i1, int i2, long l1, long l2) { switch (hiByte) { case 0: return ((jjbitVec2[i2] & l2) != 0L); default: - if ((jjbitVec0[i1] & l1) != 0L) + if ((jjbitVec0[i1] & l1) != 0L) { return true; + } return false; } } @@ -2936,8 +3228,9 @@ private static final boolean jjCanMove_1(int hiByte, int i1, int i2, long l1, lo case 255: return ((jjbitVec10[i2] & l2) != 0L); default: - if ((jjbitVec3[i1] & l1) != 0L) + if ((jjbitVec3[i1] & l1) != 0L) { return true; + } return false; } } @@ -2961,31 +3254,44 @@ private static final boolean jjCanMove_2(int hiByte, int i1, int i2, long l1, lo case 255: return ((jjbitVec10[i2] & l2) != 0L); default: - if ((jjbitVec3[i1] & l1) != 0L) + if ((jjbitVec3[i1] & l1) != 0L) { return true; + } return false; } } /** Token literal values. */ - public static final String[] jjstrLiteralImages = { "", null, null, null, "\50", "\51", "\173", "\175", "\133", - "\135", "\73", "\54", "\56", "\75", "\41\75", "\76", "\74", "\74\75", "\76\75", "\41", "\174\174", "\46\46", - "\53", "\55", "\52", "\77", "\57", "\174", "\136", "\136\136", null, null, "\141", null, null, null, null, - null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, - null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, - null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, - null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, - null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, - null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, - null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, - null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, - null, null, null, null, null, null, }; + public static final String[] jjstrLiteralImages = { + "", null, null, null, "\50", "\51", "\173", "\175", "\133", "\135", "\73", + "\54", "\56", "\75", "\41\75", "\76", "\74", "\74\75", "\76\75", "\41", "\174\174", + "\46\46", "\53", "\55", "\52", "\77", "\57", "\174", "\136", "\136\136", null, null, + "\141", null, null, null, null, null, null, null, null, null, null, null, null, null, + null, null, null, null, null, null, null, null, null, null, null, null, null, null, + null, null, null, null, null, null, null, null, null, null, null, null, null, null, + null, null, null, null, null, null, null, null, null, null, null, null, null, null, + null, null, null, null, null, null, null, null, null, null, null, null, null, null, + null, null, null, null, null, null, null, null, null, null, null, null, null, null, + null, null, null, null, null, null, null, null, null, null, null, null, null, null, + null, null, null, null, null, null, null, null, null, null, null, null, null, null, + null, null, null, null, null, null, null, null, null, null, null, null, null, null, + null, null, null, null, null, null, null, null, null, null, null, null, null, null, + null, null, null, null, null, null, null, null, null, null, null, null, null, null, + null, "\74\74", "\76\76", }; /** Lexer state names. */ - public static final String[] lexStateNames = { "DEFAULT", }; - static final long[] jjtoToken = { 0xfffffffffffffff1L, 0xffffffffffffffffL, 0x1f87fffffffL, }; - static final long[] jjtoSkip = { 0xcL, 0x0L, 0x0L, }; - static final long[] jjtoSpecial = { 0x8L, 0x0L, 0x0L, }; + public static final String[] lexStateNames = { + "DEFAULT", + }; + static final long[] jjtoToken = { + 0xfffffffffffffff1L, 0xffffffffffffffffL, 0x180001f87fffffffL, + }; + static final long[] jjtoSkip = { + 0xcL, 0x0L, 0x0L, + }; + static final long[] jjtoSpecial = { + 0x8L, 0x0L, 0x0L, + }; protected CharStream input_stream; private final int[] jjrounds = new int[157]; private final int[] jjstateSet = new int[314]; @@ -3013,8 +3319,9 @@ public void ReInit(CharStream stream) { private void ReInitRounds() { int i; jjround = 0x80000001; - for (i = 157; i-- > 0;) + for (i = 157; i-- > 0;) { jjrounds[i] = 0x80000000; + } } /** Reinitialise parser. */ @@ -3025,11 +3332,12 @@ public void ReInit(CharStream stream, int lexState) { /** Switch to specified lex state. */ public void SwitchTo(int lexState) { - if (lexState >= 1 || lexState < 0) + if (lexState >= 1 || lexState < 0) { throw new TokenMgrError("Error: Ignoring invalid lexical state : " + lexState + ". State unchanged.", TokenMgrError.INVALID_LEXICAL_STATE); - else + } else { curLexState = lexState; + } } protected Token jjFillToken() { @@ -3082,8 +3390,9 @@ public Token getNextToken() { jjmatchedPos = 0; curPos = jjMoveStringLiteralDfa0_0(); if (jjmatchedKind != 0x7fffffff) { - if (jjmatchedPos + 1 < curPos) + if (jjmatchedPos + 1 < curPos) { input_stream.backup(curPos - jjmatchedPos - 1); + } if ((jjtoToken[jjmatchedKind >> 6] & (1L << (jjmatchedKind & 077))) != 0L) { matchedToken = jjFillToken(); matchedToken.specialToken = specialToken; @@ -3091,9 +3400,9 @@ public Token getNextToken() { } else { if ((jjtoSpecial[jjmatchedKind >> 6] & (1L << (jjmatchedKind & 077))) != 0L) { matchedToken = jjFillToken(); - if (specialToken == null) + if (specialToken == null) { specialToken = matchedToken; - else { + } else { matchedToken.specialToken = specialToken; specialToken = (specialToken.next = matchedToken); } @@ -3114,8 +3423,9 @@ public Token getNextToken() { if (curChar == '\n' || curChar == '\r') { error_line++; error_column = 0; - } else + } else { error_column++; + } } if (!EOFSeen) { input_stream.backup(1); diff --git a/core/queryparser/sparql/src/main/java/org/eclipse/rdf4j/query/parser/sparql/ast/SyntaxTreeBuilderTreeConstants.java b/core/queryparser/sparql/src/main/java/org/eclipse/rdf4j/query/parser/sparql/ast/SyntaxTreeBuilderTreeConstants.java index 636305b105e..a42c6821018 100644 --- a/core/queryparser/sparql/src/main/java/org/eclipse/rdf4j/query/parser/sparql/ast/SyntaxTreeBuilderTreeConstants.java +++ b/core/queryparser/sparql/src/main/java/org/eclipse/rdf4j/query/parser/sparql/ast/SyntaxTreeBuilderTreeConstants.java @@ -59,117 +59,248 @@ public interface SyntaxTreeBuilderTreeConstants { public int JJTBLANKNODEPROPERTYLIST = 47; public int JJTCOLLECTION = 48; public int JJTVAR = 49; - public int JJTOR = 50; - public int JJTAND = 51; - public int JJTCOMPARE = 52; - public int JJTINFIX = 53; - public int JJTMATH = 54; - public int JJTNOT = 55; - public int JJTNUMERICLITERAL = 56; - public int JJTCOUNT = 57; - public int JJTSUM = 58; - public int JJTMIN = 59; - public int JJTMAX = 60; - public int JJTAVG = 61; - public int JJTSAMPLE = 62; - public int JJTGROUPCONCAT = 63; - public int JJTMD5 = 64; - public int JJTSHA1 = 65; - public int JJTSHA224 = 66; - public int JJTSHA256 = 67; - public int JJTSHA384 = 68; - public int JJTSHA512 = 69; - public int JJTNOW = 70; - public int JJTYEAR = 71; - public int JJTMONTH = 72; - public int JJTDAY = 73; - public int JJTHOURS = 74; - public int JJTMINUTES = 75; - public int JJTSECONDS = 76; - public int JJTTIMEZONE = 77; - public int JJTTZ = 78; - public int JJTRAND = 79; - public int JJTABS = 80; - public int JJTCEIL = 81; - public int JJTFLOOR = 82; - public int JJTROUND = 83; - public int JJTSUBSTR = 84; - public int JJTSTRLEN = 85; - public int JJTUPPERCASE = 86; - public int JJTLOWERCASE = 87; - public int JJTSTRSTARTS = 88; - public int JJTSTRENDS = 89; - public int JJTSTRBEFORE = 90; - public int JJTSTRAFTER = 91; - public int JJTREPLACE = 92; - public int JJTCONCAT = 93; - public int JJTCONTAINS = 94; - public int JJTENCODEFORURI = 95; - public int JJTIF = 96; - public int JJTIN = 97; - public int JJTNOTIN = 98; - public int JJTCOALESCE = 99; - public int JJTSTR = 100; - public int JJTLANG = 101; - public int JJTLANGMATCHES = 102; - public int JJTDATATYPE = 103; - public int JJTBOUND = 104; - public int JJTSAMETERM = 105; - public int JJTISIRI = 106; - public int JJTISBLANK = 107; - public int JJTISLITERAL = 108; - public int JJTISNUMERIC = 109; - public int JJTBNODEFUNC = 110; - public int JJTIRIFUNC = 111; - public int JJTSTRDT = 112; - public int JJTSTRLANG = 113; - public int JJTUUID = 114; - public int JJTSTRUUID = 115; - public int JJTBIND = 116; - public int JJTREGEXEXPRESSION = 117; - public int JJTEXISTSFUNC = 118; - public int JJTNOTEXISTSFUNC = 119; - public int JJTRDFLITERAL = 120; - public int JJTTRUE = 121; - public int JJTFALSE = 122; - public int JJTSTRING = 123; - public int JJTQNAME = 124; - public int JJTBLANKNODE = 125; - public int JJTGRAPHREFALL = 126; - public int JJTGRAPHORDEFAULT = 127; - public int JJTUNPARSEDQUADDATABLOCK = 128; - public int JJTQUADSNOTTRIPLES = 129; - public int JJTLOAD = 130; - public int JJTCLEAR = 131; - public int JJTDROP = 132; - public int JJTADD = 133; - public int JJTMOVE = 134; - public int JJTCOPY = 135; - public int JJTCREATE = 136; - public int JJTINSERTDATA = 137; - public int JJTDELETEDATA = 138; - public int JJTDELETEWHERE = 139; - public int JJTDELETECLAUSE = 140; - public int JJTINSERTCLAUSE = 141; - public int JJTMODIFY = 142; + public int JJTTRIPLEREF = 50; + public int JJTCONSTTRIPLEREF = 51; + public int JJTOR = 52; + public int JJTAND = 53; + public int JJTCOMPARE = 54; + public int JJTINFIX = 55; + public int JJTMATH = 56; + public int JJTNOT = 57; + public int JJTNUMERICLITERAL = 58; + public int JJTCOUNT = 59; + public int JJTSUM = 60; + public int JJTMIN = 61; + public int JJTMAX = 62; + public int JJTAVG = 63; + public int JJTSAMPLE = 64; + public int JJTGROUPCONCAT = 65; + public int JJTMD5 = 66; + public int JJTSHA1 = 67; + public int JJTSHA224 = 68; + public int JJTSHA256 = 69; + public int JJTSHA384 = 70; + public int JJTSHA512 = 71; + public int JJTNOW = 72; + public int JJTYEAR = 73; + public int JJTMONTH = 74; + public int JJTDAY = 75; + public int JJTHOURS = 76; + public int JJTMINUTES = 77; + public int JJTSECONDS = 78; + public int JJTTIMEZONE = 79; + public int JJTTZ = 80; + public int JJTRAND = 81; + public int JJTABS = 82; + public int JJTCEIL = 83; + public int JJTFLOOR = 84; + public int JJTROUND = 85; + public int JJTSUBSTR = 86; + public int JJTSTRLEN = 87; + public int JJTUPPERCASE = 88; + public int JJTLOWERCASE = 89; + public int JJTSTRSTARTS = 90; + public int JJTSTRENDS = 91; + public int JJTSTRBEFORE = 92; + public int JJTSTRAFTER = 93; + public int JJTREPLACE = 94; + public int JJTCONCAT = 95; + public int JJTCONTAINS = 96; + public int JJTENCODEFORURI = 97; + public int JJTIF = 98; + public int JJTIN = 99; + public int JJTNOTIN = 100; + public int JJTCOALESCE = 101; + public int JJTSTR = 102; + public int JJTLANG = 103; + public int JJTLANGMATCHES = 104; + public int JJTDATATYPE = 105; + public int JJTBOUND = 106; + public int JJTSAMETERM = 107; + public int JJTISIRI = 108; + public int JJTISBLANK = 109; + public int JJTISLITERAL = 110; + public int JJTISNUMERIC = 111; + public int JJTBNODEFUNC = 112; + public int JJTIRIFUNC = 113; + public int JJTSTRDT = 114; + public int JJTSTRLANG = 115; + public int JJTUUID = 116; + public int JJTSTRUUID = 117; + public int JJTBIND = 118; + public int JJTREGEXEXPRESSION = 119; + public int JJTEXISTSFUNC = 120; + public int JJTNOTEXISTSFUNC = 121; + public int JJTRDFLITERAL = 122; + public int JJTTRUE = 123; + public int JJTFALSE = 124; + public int JJTSTRING = 125; + public int JJTQNAME = 126; + public int JJTBLANKNODE = 127; + public int JJTGRAPHREFALL = 128; + public int JJTGRAPHORDEFAULT = 129; + public int JJTUNPARSEDQUADDATABLOCK = 130; + public int JJTQUADSNOTTRIPLES = 131; + public int JJTLOAD = 132; + public int JJTCLEAR = 133; + public int JJTDROP = 134; + public int JJTADD = 135; + public int JJTMOVE = 136; + public int JJTCOPY = 137; + public int JJTCREATE = 138; + public int JJTINSERTDATA = 139; + public int JJTDELETEDATA = 140; + public int JJTDELETEWHERE = 141; + public int JJTDELETECLAUSE = 142; + public int JJTINSERTCLAUSE = 143; + public int JJTMODIFY = 144; - public String[] jjtNodeName = { "UpdateSequence", "UpdateContainer", "QueryContainer", "void", "BaseDecl", - "PrefixDecl", "SelectQuery", "Select", "ProjectionElem", "ConstructQuery", "Construct", "DescribeQuery", - "Describe", "AskQuery", "DatasetClause", "WhereClause", "BindingsClause", "InlineData", "BindingSet", - "BindingValue", "GroupClause", "OrderClause", "GroupCondition", "HavingClause", "OrderCondition", "Limit", - "Offset", "GraphPatternGroup", "BasicGraphPattern", "OptionalGraphPattern", "GraphGraphPattern", - "UnionGraphPattern", "MinusGraphPattern", "ServiceGraphPattern", "Constraint", "FunctionCall", - "TriplesSameSubject", "PropertyList", "ObjectList", "TriplesSameSubjectPath", "PropertyListPath", - "PathAlternative", "PathSequence", "PathElt", "IRI", "PathOneInPropertySet", "PathMod", - "BlankNodePropertyList", "Collection", "Var", "Or", "And", "Compare", "Infix", "Math", "Not", - "NumericLiteral", "Count", "Sum", "Min", "Max", "Avg", "Sample", "GroupConcat", "MD5", "SHA1", "SHA224", - "SHA256", "SHA384", "SHA512", "Now", "Year", "Month", "Day", "Hours", "Minutes", "Seconds", "Timezone", - "Tz", "Rand", "Abs", "Ceil", "Floor", "Round", "Substr", "StrLen", "UpperCase", "LowerCase", "StrStarts", - "StrEnds", "StrBefore", "StrAfter", "Replace", "Concat", "Contains", "EncodeForURI", "If", "In", "NotIn", - "Coalesce", "Str", "Lang", "LangMatches", "Datatype", "Bound", "SameTerm", "IsIRI", "IsBlank", "IsLiteral", - "IsNumeric", "BNodeFunc", "IRIFunc", "StrDt", "StrLang", "UUID", "STRUUID", "Bind", "RegexExpression", - "ExistsFunc", "NotExistsFunc", "RDFLiteral", "True", "False", "String", "QName", "BlankNode", "GraphRefAll", - "GraphOrDefault", "UnparsedQuadDataBlock", "QuadsNotTriples", "Load", "Clear", "Drop", "Add", "Move", - "Copy", "Create", "InsertData", "DeleteData", "DeleteWhere", "DeleteClause", "InsertClause", "Modify", }; + public String[] jjtNodeName = { + "UpdateSequence", + "UpdateContainer", + "QueryContainer", + "void", + "BaseDecl", + "PrefixDecl", + "SelectQuery", + "Select", + "ProjectionElem", + "ConstructQuery", + "Construct", + "DescribeQuery", + "Describe", + "AskQuery", + "DatasetClause", + "WhereClause", + "BindingsClause", + "InlineData", + "BindingSet", + "BindingValue", + "GroupClause", + "OrderClause", + "GroupCondition", + "HavingClause", + "OrderCondition", + "Limit", + "Offset", + "GraphPatternGroup", + "BasicGraphPattern", + "OptionalGraphPattern", + "GraphGraphPattern", + "UnionGraphPattern", + "MinusGraphPattern", + "ServiceGraphPattern", + "Constraint", + "FunctionCall", + "TriplesSameSubject", + "PropertyList", + "ObjectList", + "TriplesSameSubjectPath", + "PropertyListPath", + "PathAlternative", + "PathSequence", + "PathElt", + "IRI", + "PathOneInPropertySet", + "PathMod", + "BlankNodePropertyList", + "Collection", + "Var", + "TripleRef", + "ConstTripleRef", + "Or", + "And", + "Compare", + "Infix", + "Math", + "Not", + "NumericLiteral", + "Count", + "Sum", + "Min", + "Max", + "Avg", + "Sample", + "GroupConcat", + "MD5", + "SHA1", + "SHA224", + "SHA256", + "SHA384", + "SHA512", + "Now", + "Year", + "Month", + "Day", + "Hours", + "Minutes", + "Seconds", + "Timezone", + "Tz", + "Rand", + "Abs", + "Ceil", + "Floor", + "Round", + "Substr", + "StrLen", + "UpperCase", + "LowerCase", + "StrStarts", + "StrEnds", + "StrBefore", + "StrAfter", + "Replace", + "Concat", + "Contains", + "EncodeForURI", + "If", + "In", + "NotIn", + "Coalesce", + "Str", + "Lang", + "LangMatches", + "Datatype", + "Bound", + "SameTerm", + "IsIRI", + "IsBlank", + "IsLiteral", + "IsNumeric", + "BNodeFunc", + "IRIFunc", + "StrDt", + "StrLang", + "UUID", + "STRUUID", + "Bind", + "RegexExpression", + "ExistsFunc", + "NotExistsFunc", + "RDFLiteral", + "True", + "False", + "String", + "QName", + "BlankNode", + "GraphRefAll", + "GraphOrDefault", + "UnparsedQuadDataBlock", + "QuadsNotTriples", + "Load", + "Clear", + "Drop", + "Add", + "Move", + "Copy", + "Create", + "InsertData", + "DeleteData", + "DeleteWhere", + "DeleteClause", + "InsertClause", + "Modify", + }; } -/* JavaCC - OriginalChecksum=2287dd1b17bf4cc92caa09c3b3f30603 (do not edit this line) */ +/* JavaCC - OriginalChecksum=755adc5716b4a4060ac0325ac00e1de4 (do not edit this line) */ diff --git a/core/queryparser/sparql/src/main/java/org/eclipse/rdf4j/query/parser/sparql/ast/SyntaxTreeBuilderVisitor.java b/core/queryparser/sparql/src/main/java/org/eclipse/rdf4j/query/parser/sparql/ast/SyntaxTreeBuilderVisitor.java index 95ca50f02a5..ca02d44f298 100644 --- a/core/queryparser/sparql/src/main/java/org/eclipse/rdf4j/query/parser/sparql/ast/SyntaxTreeBuilderVisitor.java +++ b/core/queryparser/sparql/src/main/java/org/eclipse/rdf4j/query/parser/sparql/ast/SyntaxTreeBuilderVisitor.java @@ -109,6 +109,10 @@ public interface SyntaxTreeBuilderVisitor { public Object visit(ASTVar node, Object data) throws VisitorException; + public Object visit(ASTTripleRef node, Object data) throws VisitorException; + + public Object visit(ASTConstTripleRef node, Object data) throws VisitorException; + public Object visit(ASTOr node, Object data) throws VisitorException; public Object visit(ASTAnd node, Object data) throws VisitorException; @@ -295,4 +299,4 @@ public interface SyntaxTreeBuilderVisitor { public Object visit(ASTModify node, Object data) throws VisitorException; } -/* JavaCC - OriginalChecksum=ce20a677da5935e1dd2cd58bf6c23cec (do not edit this line) */ +/* JavaCC - OriginalChecksum=865433011adbeec824a2b1ac0499fdd1 (do not edit this line) */ diff --git a/core/queryparser/sparql/src/main/java/org/eclipse/rdf4j/query/parser/sparql/ast/UnicodeEscapeStream.java b/core/queryparser/sparql/src/main/java/org/eclipse/rdf4j/query/parser/sparql/ast/UnicodeEscapeStream.java index 433a6a6d2f5..aaa8c1d402e 100644 --- a/core/queryparser/sparql/src/main/java/org/eclipse/rdf4j/query/parser/sparql/ast/UnicodeEscapeStream.java +++ b/core/queryparser/sparql/src/main/java/org/eclipse/rdf4j/query/parser/sparql/ast/UnicodeEscapeStream.java @@ -22,16 +22,18 @@ public char readChar() throws IOException { if (inBuf > 0) { --inBuf; - if (++bufpos == bufsize) + if (++bufpos == bufsize) { bufpos = 0; + } return buffer[bufpos]; } char c; - if (++bufpos == available) + if (++bufpos == available) { AdjustBuffSize(); + } if ((buffer[bufpos] = c = ReadByte()) == '\\') { UpdateLineColumn(c); @@ -40,16 +42,18 @@ public char readChar() throws IOException { for (;;) // Read all the backslashes { - if (++bufpos == available) + if (++bufpos == available) { AdjustBuffSize(); + } try { if ((buffer[bufpos] = c = ReadByte()) != '\\') { UpdateLineColumn(c); // found a non-backslash char. if ((c == 'u' || c == 'U') && ((backSlashCnt & 1) == 1)) { - if (--bufpos < 0) + if (--bufpos < 0) { bufpos = bufsize - 1; + } break; } @@ -59,8 +63,9 @@ public char readChar() throws IOException { } } catch (java.io.IOException e) { // We are returning one backslash so we should only backup (count-1) - if (backSlashCnt > 1) + if (backSlashCnt > 1) { backup(backSlashCnt - 1); + } return '\\'; } @@ -82,8 +87,9 @@ public char readChar() throws IOException { char[] chrs = Character.toChars(cp); // length of 1 or 2 buffer[bufpos] = c = chrs[0]; if (chrs.length > 1) { - if (++bufpos == available) + if (++bufpos == available) { AdjustBuffSize(); + } buffer[bufpos] = chrs[1]; UpdateLineColumn(c); backup(1); @@ -94,9 +100,9 @@ public char readChar() throws IOException { throw new Error("Invalid escape character at line " + line + " column " + column + ".", e); } - if (backSlashCnt == 1) + if (backSlashCnt == 1) { return c; - else { + } else { backup(backSlashCnt - 1); return '\\'; } diff --git a/core/queryparser/sparql/src/main/java/org/eclipse/rdf4j/query/parser/sparql/ast/package-info.java b/core/queryparser/sparql/src/main/java/org/eclipse/rdf4j/query/parser/sparql/ast/package-info.java index ce0341e46c6..5fd1f90d692 100644 --- a/core/queryparser/sparql/src/main/java/org/eclipse/rdf4j/query/parser/sparql/ast/package-info.java +++ b/core/queryparser/sparql/src/main/java/org/eclipse/rdf4j/query/parser/sparql/ast/package-info.java @@ -1,5 +1,5 @@ /** * SPARQL 1.1 Abstract Syntax Tree (AST) parser. - * + * */ package org.eclipse.rdf4j.query.parser.sparql.ast; diff --git a/core/queryparser/sparql/src/main/java/org/eclipse/rdf4j/query/parser/sparql/ast/sparql.jjt b/core/queryparser/sparql/src/main/java/org/eclipse/rdf4j/query/parser/sparql/ast/sparql.jjt index 37c134dd0fd..7211c3dbff4 100644 --- a/core/queryparser/sparql/src/main/java/org/eclipse/rdf4j/query/parser/sparql/ast/sparql.jjt +++ b/core/queryparser/sparql/src/main/java/org/eclipse/rdf4j/query/parser/sparql/ast/sparql.jjt @@ -347,6 +347,8 @@ TOKEN: | <#PERCENT: "%" > | <#PN_LOCAL_ESC: "\\" [ "_", "~", ".", "-", "!", "$", "&", "\"", "(", ")", "*", "+", ",", ";", "=", "/", "?", "#", "@", "%" ]> | <#VARNAME: ( | ) ()*> +| +| >"> } // @@ -491,7 +493,7 @@ void Describe() : ( { jjtThis.setWildcard(true); } | - ( VarOrIRIref() )+ + ( VarOrIRIref() | ConstTripleRef())+ ) } @@ -575,6 +577,7 @@ void BindingValue() : | NumericLiteral() | BooleanLiteral() | +| ConstTripleRef() } void SolutionModifier() #void : @@ -1017,12 +1020,34 @@ void GraphTerm() #void : BlankNode() | {jjtThis.setValue(RDF.NIL.toString());} #IRI +| + TripleRef() +} + +void TripleRef() : +{} +{ + + (GraphTerm() | Var()) + (IRIref() | Var()) + (GraphTerm() | Var()) + +} + +void ConstTripleRef() : +{} +{ + + (ConstTripleRef() | IRIref()) + IRIref() + (ConstTripleRef() | IRIref() | NumericLiteral() | RDFLiteral() |BooleanLiteral() ) + } void Expression() #void : {} { - ConditionalOrExpression() + TripleRef() | ConditionalOrExpression() } void ConditionalOrExpression() #void : diff --git a/core/queryparser/sparql/src/main/java/org/eclipse/rdf4j/query/parser/sparql/package-info.java b/core/queryparser/sparql/src/main/java/org/eclipse/rdf4j/query/parser/sparql/package-info.java index 0c6051ce470..6ae70c50071 100644 --- a/core/queryparser/sparql/src/main/java/org/eclipse/rdf4j/query/parser/sparql/package-info.java +++ b/core/queryparser/sparql/src/main/java/org/eclipse/rdf4j/query/parser/sparql/package-info.java @@ -1,8 +1,8 @@ /** * The rdf4j SPARQL 1.1 parser. - * + * * This parser produces an algebra model of the query/update string using {@link org.eclipse.rdf4j.queryalgebra.model}. - * + * * @see SPARQL 1.1 Query * @see SPARQL 1.1 Update * @see SPARQL 1.1 Federated Query diff --git a/core/queryparser/sparql/src/test/java/org/eclipse/rdf4j/query/parser/sparql/SPARQLParseBenchmark.java b/core/queryparser/sparql/src/test/java/org/eclipse/rdf4j/query/parser/sparql/SPARQLParseBenchmark.java index b754b282807..02b0d683cbe 100644 --- a/core/queryparser/sparql/src/test/java/org/eclipse/rdf4j/query/parser/sparql/SPARQLParseBenchmark.java +++ b/core/queryparser/sparql/src/test/java/org/eclipse/rdf4j/query/parser/sparql/SPARQLParseBenchmark.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 201 Eclipse RDF4J contributors. + * Copyright (c) 2019 Eclipse RDF4J contributors. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Distribution License v1.0 * which accompanies this distribution, and is available at diff --git a/core/queryparser/sparql/src/test/java/org/eclipse/rdf4j/query/parser/sparql/SPARQLParserTest.java b/core/queryparser/sparql/src/test/java/org/eclipse/rdf4j/query/parser/sparql/SPARQLParserTest.java index fce261e8429..d7cc75a3e3c 100644 --- a/core/queryparser/sparql/src/test/java/org/eclipse/rdf4j/query/parser/sparql/SPARQLParserTest.java +++ b/core/queryparser/sparql/src/test/java/org/eclipse/rdf4j/query/parser/sparql/SPARQLParserTest.java @@ -7,6 +7,7 @@ *******************************************************************************/ package org.eclipse.rdf4j.query.parser.sparql; +import static org.assertj.core.api.Assertions.assertThat; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotEquals; @@ -335,4 +336,33 @@ public void testWildCardPathPushNegation2() { } + @Test + public void testWildCardPathComplexSubjectHandling() { + + String query = "PREFIX : \n ASK { ?a (:comment/^(:subClassOf|(:type/:label))/:type)* ?b } "; + + ParsedQuery parsedQuery = parser.parseQuery(query, null); + TupleExpr tupleExpr = parsedQuery.getTupleExpr(); + + Slice slice = (Slice) tupleExpr; + + ArbitraryLengthPath path = (ArbitraryLengthPath) slice.getArg(); + Var pathStart = path.getSubjectVar(); + Var pathEnd = path.getObjectVar(); + + assertThat(pathStart.getName()).isEqualTo("a"); + assertThat(pathEnd.getName()).isEqualTo("b"); + + Join pathSequence = (Join) path.getPathExpression(); + Join innerJoin = (Join) pathSequence.getLeftArg(); + Var commentObjectVar = ((StatementPattern) innerJoin.getLeftArg()).getObjectVar(); + + Union union = (Union) innerJoin.getRightArg(); + Var subClassOfSubjectVar = ((StatementPattern) union.getLeftArg()).getSubjectVar(); + assertThat(subClassOfSubjectVar).isNotEqualTo(commentObjectVar); + + Var subClassOfObjectVar = ((StatementPattern) union.getLeftArg()).getObjectVar(); + + assertThat(subClassOfObjectVar).isEqualTo(commentObjectVar); + } } diff --git a/core/queryparser/sparql/src/test/java/org/eclipse/rdf4j/query/parser/sparql/TestServiceUpdateExprBuilder.java b/core/queryparser/sparql/src/test/java/org/eclipse/rdf4j/query/parser/sparql/TestServiceUpdateExprBuilder.java index b6b55594855..529b5083c7a 100644 --- a/core/queryparser/sparql/src/test/java/org/eclipse/rdf4j/query/parser/sparql/TestServiceUpdateExprBuilder.java +++ b/core/queryparser/sparql/src/test/java/org/eclipse/rdf4j/query/parser/sparql/TestServiceUpdateExprBuilder.java @@ -8,7 +8,6 @@ package org.eclipse.rdf4j.query.parser.sparql; import org.eclipse.rdf4j.query.algebra.Service; -import org.eclipse.rdf4j.query.parser.ParsedUpdate; import org.junit.Test; public class TestServiceUpdateExprBuilder { diff --git a/core/queryparser/sparql/src/test/java/org/eclipse/rdf4j/query/parser/sparql/TestSparqlStarParser.java b/core/queryparser/sparql/src/test/java/org/eclipse/rdf4j/query/parser/sparql/TestSparqlStarParser.java new file mode 100644 index 00000000000..8bea8a0994a --- /dev/null +++ b/core/queryparser/sparql/src/test/java/org/eclipse/rdf4j/query/parser/sparql/TestSparqlStarParser.java @@ -0,0 +1,863 @@ +/******************************************************************************* + * Copyright (c) 2020 Eclipse RDF4J contributors. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Distribution License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ +package org.eclipse.rdf4j.query.parser.sparql; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; + +import java.util.ArrayList; +import java.util.List; + +import org.eclipse.rdf4j.model.IRI; +import org.eclipse.rdf4j.model.Literal; +import org.eclipse.rdf4j.model.Triple; +import org.eclipse.rdf4j.model.Value; +import org.eclipse.rdf4j.query.algebra.BindingSetAssignment; +import org.eclipse.rdf4j.query.algebra.Count; +import org.eclipse.rdf4j.query.algebra.Exists; +import org.eclipse.rdf4j.query.algebra.Extension; +import org.eclipse.rdf4j.query.algebra.ExtensionElem; +import org.eclipse.rdf4j.query.algebra.Filter; +import org.eclipse.rdf4j.query.algebra.Group; +import org.eclipse.rdf4j.query.algebra.Join; +import org.eclipse.rdf4j.query.algebra.Modify; +import org.eclipse.rdf4j.query.algebra.Projection; +import org.eclipse.rdf4j.query.algebra.ProjectionElem; +import org.eclipse.rdf4j.query.algebra.Reduced; +import org.eclipse.rdf4j.query.algebra.StatementPattern; +import org.eclipse.rdf4j.query.algebra.Str; +import org.eclipse.rdf4j.query.algebra.TripleRef; +import org.eclipse.rdf4j.query.algebra.UpdateExpr; +import org.eclipse.rdf4j.query.algebra.ValueConstant; +import org.eclipse.rdf4j.query.algebra.ValueExprTripleRef; +import org.eclipse.rdf4j.query.algebra.Var; +import org.eclipse.rdf4j.query.parser.ParsedQuery; +import org.eclipse.rdf4j.query.parser.ParsedUpdate; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +/** + * @author damyan.ognyanov + */ +public class TestSparqlStarParser { + private SPARQLParser parser; + + /** + * @throws java.lang.Exception + */ + @Before + public void setUp() throws Exception { + parser = new SPARQLParser(); + } + + /** + * @throws java.lang.Exception + */ + @After + public void tearDown() throws Exception { + parser = null; + } + + /*- + * expected TupleExpr like: + * Projection + * ProjectionElemList + * ProjectionElem "ref" + * Extension + * ExtensionElem (ref) + * ValueExprTripleRef + * Var (name=_const_6a63478_uri, value=urn:A, anonymous) + * Var (name=_const_6a63479_uri, value=urn:B, anonymous) + * Var (name=_const_31_lit_5fc8fb17_0, value="1"^^, anonymous) + * SingletonSet + * + * @throws Exception + */ + @Test + public void testUseInProjection() throws Exception { + String simpleSparqlQuery = "SELECT (<< 1>> as ?ref) WHERE {}"; + + ParsedQuery q = parser.parseQuery(simpleSparqlQuery, null); + + assertNotNull(q); + assertTrue("expect projection", q.getTupleExpr() instanceof Projection); + Projection proj = (Projection) q.getTupleExpr(); + + assertTrue("expect extension", proj.getArg() instanceof Extension); + Extension ext = (Extension) proj.getArg(); + + assertTrue("single extention elemrnt", ext.getElements().size() == 1); + ExtensionElem elem = ext.getElements().get(0); + + assertEquals("name should match", elem.getName(), "ref"); + assertTrue("expect ValueExprTripleRef", elem.getExpr() instanceof ValueExprTripleRef); + ValueExprTripleRef ref = (ValueExprTripleRef) elem.getExpr(); + + assertTrue("expect not null subject", ref.getSubjectVar().getValue() != null); + assertTrue("expect IRI subject", ref.getSubjectVar().getValue() instanceof IRI); + assertEquals("subject should match", ref.getSubjectVar().getValue().toString(), "urn:A"); + + assertTrue("expect not null predicate", ref.getPredicateVar().getValue() != null); + assertTrue("expect IRI predicate", ref.getPredicateVar().getValue() instanceof IRI); + assertEquals("predicate should match", ref.getPredicateVar().getValue().toString(), "urn:B"); + + assertTrue("expect not null object", ref.getObjectVar().getValue() != null); + assertTrue("expect Literal object", ref.getObjectVar().getValue() instanceof Literal); + assertEquals("object should match", ((Literal) ref.getObjectVar().getValue()).intValue(), 1); + } + + /*- + * Expected tupleExpr like: + * Projection + * ProjectionElemList + * ProjectionElem "ref" + * Extension + * ExtensionElem (ref) + * Var (name=ref) + * BindingSetAssignment ([[ref=<>>]]) + * @throws Exception + */ + @Test + public void testUseInValues() throws Exception { + String simpleSparqlQuery = "SELECT ?ref WHERE { values ?ref {<< 1>>} }"; + + ParsedQuery q = parser.parseQuery(simpleSparqlQuery, null); + + assertNotNull(q); + assertTrue("expect projection", q.getTupleExpr() instanceof Projection); + Projection proj = (Projection) q.getTupleExpr(); + + assertTrue("expect extension", proj.getArg() instanceof Extension); + Extension ext = (Extension) proj.getArg(); + + assertTrue("single extention elemrnt", ext.getElements().size() == 1); + ExtensionElem elem = ext.getElements().get(0); + + assertEquals("name should match", elem.getName(), "ref"); + assertTrue("expect Var in extention element", elem.getExpr() instanceof Var); + assertEquals("names should match", elem.getName(), ((Var) elem.getExpr()).getName()); + + assertTrue("expect BindingSetAssignment as arg", ext.getArg() instanceof BindingSetAssignment); + BindingSetAssignment values = (BindingSetAssignment) ext.getArg(); + boolean oneValue[] = new boolean[] { false }; + values.getBindingSets().forEach(bs -> { + Value v = bs.getValue("ref"); + assertTrue("expect binding for ref", v != null); + assertTrue("expect Triple ", v instanceof Triple); + Triple triple = (Triple) v; + assertTrue("subject should be IRI", triple.getSubject() instanceof IRI); + assertEquals("subject should match", "urn:A", triple.getSubject().toString()); + + assertTrue("predicate should be IRI", triple.getPredicate() instanceof IRI); + assertEquals("predicate should match", "urn:B", triple.getPredicate().toString()); + + assertTrue("object should be Literal", triple.getObject() instanceof Literal); + assertEquals("object should match", 1, ((Literal) triple.getObject()).intValue()); + + assertTrue("expect one value", oneValue[0] == false); + oneValue[0] = true; + }); + assertTrue("expect one value", oneValue[0]); + } + + /*- + * expected TupleExpr like: + * Projection + * ProjectionElemList + * ProjectionElem "ref" + * Extension + * ExtensionElem (ref) + * Var (name=ref) + * Extension + * ExtensionElem (ref) + * Var (name=_anon_ee568c3a_eff4_4b69_a4f4_080503da7375, anonymous) + * TripleRef + * Var (name=_const_6a63478_uri, value=urn:A, anonymous) + * Var (name=_const_6a63479_uri, value=urn:B, anonymous) + * Var (name=_const_31_lit_5fc8fb17_0, value="1"^^, anonymous) + * Var (name=_anon_ee568c3a_eff4_4b69_a4f4_080503da7375, anonymous) + * @throws Exception + */ + @Test + public void testUseInBind() throws Exception { + String simpleSparqlQuery = "SELECT ?ref WHERE { bind(<< 1>> as ?ref)}"; + + ParsedQuery q = parser.parseQuery(simpleSparqlQuery, null); + + assertNotNull(q); + assertTrue("expect projection", q.getTupleExpr() instanceof Projection); + Projection proj = (Projection) q.getTupleExpr(); + + assertTrue("expect extension", proj.getArg() instanceof Extension); + Extension ext = (Extension) proj.getArg(); + assertTrue("single extention elemrnt", ext.getElements().size() == 1); + ExtensionElem elem = ext.getElements().get(0); + + assertEquals("name should match", elem.getName(), "ref"); + assertTrue("expect Var in extention element", elem.getExpr() instanceof Var); + assertEquals("names should match", elem.getName(), ((Var) elem.getExpr()).getName()); + + assertTrue("expect extension", ext.getArg() instanceof Extension); + ext = (Extension) ext.getArg(); + assertTrue("single extention elemrnt", ext.getElements().size() == 1); + elem = ext.getElements().get(0); + + assertEquals("name should match", elem.getName(), "ref"); + assertTrue("expect Var in extention element", elem.getExpr() instanceof Var); + String anonVar = ((Var) elem.getExpr()).getName(); + + assertTrue("expect TripleRef", ext.getArg() instanceof TripleRef); + TripleRef triple = (TripleRef) ext.getArg(); + + assertEquals("ext var should match", anonVar, triple.getExprVar().getName()); + assertEquals("subj var should match", "urn:A", triple.getSubjectVar().getValue().toString()); + assertEquals("pred var should match", "urn:B", triple.getPredicateVar().getValue().toString()); + assertTrue("obj var value should be Literal", triple.getObjectVar().getValue() instanceof Literal); + assertEquals("obj var should match", 1, ((Literal) triple.getObjectVar().getValue()).intValue()); + } + + /*- + * expected TupleExpr like: + * Projection + * ProjectionElemList + * ProjectionElem "s" + * ProjectionElem "p" + * ProjectionElem "o" + * ProjectionElem "ref" + * Extension + * ExtensionElem (ref) + * Var (name=ref) + * Extension + * ExtensionElem (ref) + * Var (name=_anon_ee568c3a_eff4_4b69_a4f4_080503da7375, anonymous) + * TripleRef + * Var (name=s) + * Var (name=p) + * Var (name=o) + * Var (name=_anon_ee568c3a_eff4_4b69_a4f4_080503da7375, anonymous) + * + * @throws Exception + */ + @Test + public void testUseInBindWithVars() throws Exception { + String simpleSparqlQuery = "SELECT * WHERE { bind(<> as ?ref)}"; + + ParsedQuery q = parser.parseQuery(simpleSparqlQuery, null); + + assertNotNull(q); + assertTrue("expect projection", q.getTupleExpr() instanceof Projection); + Projection proj = (Projection) q.getTupleExpr(); + List list = proj.getProjectionElemList().getElements(); + final ArrayList listNames = new ArrayList<>(); + list.forEach(el -> { + listNames.add(el.getTargetName()); + }); + assertEquals("expect all bindings", 4, list.size()); + assertTrue("expect s", listNames.contains("s")); + assertTrue("expect p", listNames.contains("p")); + assertTrue("expect o", listNames.contains("o")); + assertTrue("expect ref", listNames.contains("ref")); + + assertTrue("expect extension", proj.getArg() instanceof Extension); + Extension ext = (Extension) proj.getArg(); + assertTrue("single extention elemrnt", ext.getElements().size() == 1); + ExtensionElem elem = ext.getElements().get(0); + + assertEquals("name should match", elem.getName(), "ref"); + assertTrue("expect Var in extention element", elem.getExpr() instanceof Var); + assertEquals("names should match", elem.getName(), ((Var) elem.getExpr()).getName()); + + assertTrue("expect extension", ext.getArg() instanceof Extension); + ext = (Extension) ext.getArg(); + assertTrue("single extention elemrnt", ext.getElements().size() == 1); + elem = ext.getElements().get(0); + + assertEquals("name should match", elem.getName(), "ref"); + assertTrue("expect Var in extention element", elem.getExpr() instanceof Var); + String anonVar = ((Var) elem.getExpr()).getName(); + + assertTrue("expect TripleRef", ext.getArg() instanceof TripleRef); + TripleRef triple = (TripleRef) ext.getArg(); + + assertEquals("ext var should match", anonVar, triple.getExprVar().getName()); + + assertEquals("subj var name should match", "s", triple.getSubjectVar().getName()); + assertEquals("pred var name should match", "p", triple.getPredicateVar().getName()); + assertEquals("obj var name should match", "o", triple.getObjectVar().getName()); + } + + /*- + * expected TupleExpr: + * Projection + * ProjectionElemList + * ProjectionElem "s" + * ProjectionElem "p" + * ProjectionElem "o" + * ProjectionElem "val" + * Join + * TripleRef + * Var (name=s) + * Var (name=p) + * Var (name=o) + * Var (name=_anon_cfd79a47_981d_4305_b106_91e59657a639, anonymous) + * StatementPattern + * Var (name=_anon_cfd79a47_981d_4305_b106_91e59657a639, anonymous) + * Var (name=_const_c78aefcc_uri, value=urn:pred, anonymous) + * Var (name=val) + * @throws Exception + */ + @Test + public void testUseInStatementPatternWithVars() throws Exception { + String simpleSparqlQuery = "SELECT * WHERE { <> ?val}"; + + ParsedQuery q = parser.parseQuery(simpleSparqlQuery, null); + + assertNotNull(q); + assertTrue("expect projection", q.getTupleExpr() instanceof Projection); + Projection proj = (Projection) q.getTupleExpr(); + List list = proj.getProjectionElemList().getElements(); + final ArrayList listNames = new ArrayList<>(); + list.forEach(el -> { + listNames.add(el.getTargetName()); + }); + assertEquals("expect all bindings", 4, list.size()); + assertTrue("expect s", listNames.contains("s")); + assertTrue("expect p", listNames.contains("p")); + assertTrue("expect o", listNames.contains("o")); + assertTrue("expect val", listNames.contains("val")); + + assertTrue("expect Join", proj.getArg() instanceof Join); + Join join = (Join) proj.getArg(); + + assertTrue("expect right arg of Join be StatementPattern", join.getRightArg() instanceof StatementPattern); + StatementPattern pattern = (StatementPattern) join.getRightArg(); + String anonVar = pattern.getSubjectVar().getName(); + assertEquals("statement pattern predVar value", "urn:pred", pattern.getPredicateVar().getValue().toString()); + assertEquals("statement pattern obj var name", "val", pattern.getObjectVar().getName()); + + assertTrue("expect left arg of Join be TripleRef", join.getLeftArg() instanceof TripleRef); + TripleRef triple = (TripleRef) join.getLeftArg(); + + assertEquals("ext var should match", anonVar, triple.getExprVar().getName()); + + assertEquals("subj var name should match", "s", triple.getSubjectVar().getName()); + assertEquals("pred var name should match", "p", triple.getPredicateVar().getName()); + assertEquals("obj var name should match", "o", triple.getObjectVar().getName()); + } + + /*- + * expected TupleExpr: + * Projection + * ProjectionElemList + * ProjectionElem "s" + * ProjectionElem "p" + * ProjectionElem "o" + * ProjectionElem "q" + * ProjectionElem "r" + * ProjectionElem "val" + * Join + * Join + * TripleRef + * Var (name=s) + * Var (name=p) + * Var (name=o) + * Var (name=_anon_4bafbbc3_1614_4f8b_9f0a_9f6f874ce212, anonymous) + * TripleRef + * Var (name=_anon_4bafbbc3_1614_4f8b_9f0a_9f6f874ce212, anonymous) + * Var (name=q) + * Var (name=r) + * Var (name=_anon_85390287_6cf9_4eff_9ebd_c9442c805a11, anonymous) + * StatementPattern + * Var (name=_anon_85390287_6cf9_4eff_9ebd_c9442c805a11, anonymous) + * Var (name=_const_c78aee8a_uri, value=urn:pred, anonymous) + * Var (name=val) + * @throws Exception + */ + @Test + public void testUseNestedInStatementPatternWithVars() throws Exception { + String simpleSparqlQuery = "SELECT * WHERE { <<<> ?q ?r>> ?val}"; + + ParsedQuery q = parser.parseQuery(simpleSparqlQuery, null); + + assertNotNull(q); + assertTrue("expect projection", q.getTupleExpr() instanceof Projection); + Projection proj = (Projection) q.getTupleExpr(); + List list = proj.getProjectionElemList().getElements(); + final ArrayList listNames = new ArrayList<>(); + list.forEach(el -> { + listNames.add(el.getTargetName()); + }); + assertEquals("expect all bindings", 6, list.size()); + assertTrue("expect s", listNames.contains("s")); + assertTrue("expect p", listNames.contains("p")); + assertTrue("expect o", listNames.contains("o")); + assertTrue("expect q", listNames.contains("q")); + assertTrue("expect r", listNames.contains("r")); + assertTrue("expect val", listNames.contains("val")); + + assertTrue("expect Join", proj.getArg() instanceof Join); + Join join = (Join) proj.getArg(); + + assertTrue("expect right arg of Join be StatementPattern", join.getRightArg() instanceof StatementPattern); + StatementPattern pattern = (StatementPattern) join.getRightArg(); + String anonVar = pattern.getSubjectVar().getName(); + assertEquals("statement pattern predVar value", "urn:pred", pattern.getPredicateVar().getValue().toString()); + assertEquals("statement pattern obj var name", "val", pattern.getObjectVar().getName()); + + assertTrue("expect left arg of first Join be Join", join.getLeftArg() instanceof Join); + Join join2 = (Join) join.getLeftArg(); + + assertTrue("expect left arg of second Join be TripleRef", join2.getLeftArg() instanceof TripleRef); + TripleRef tripleLeft = (TripleRef) join2.getLeftArg(); + assertEquals("subj var name should match", "s", tripleLeft.getSubjectVar().getName()); + assertEquals("pred var name should match", "p", tripleLeft.getPredicateVar().getName()); + assertEquals("obj var name should match", "o", tripleLeft.getObjectVar().getName()); + String anonVarLeftTripleRef = tripleLeft.getExprVar().getName(); + + assertTrue("expect right arg of second Join be TripleRef", join2.getRightArg() instanceof TripleRef); + TripleRef triple = (TripleRef) join2.getRightArg(); + + assertEquals("subj var name should match anon", anonVarLeftTripleRef, triple.getSubjectVar().getName()); + assertEquals("pred var name should match", "q", triple.getPredicateVar().getName()); + assertEquals("obj var name should match", "r", triple.getObjectVar().getName()); + + assertEquals("ext var should match", anonVar, triple.getExprVar().getName()); + } + + /*- + * expected TupleExpr like: + * Reduced + * Projection + * ProjectionElemList + * ProjectionElem "_anon_c3c3c545_1cf9_4323_a1b8_10fba089a8eb" AS "subject" + * ProjectionElem "_const_c78aee8a_uri" AS "predicate" + * ProjectionElem "_const_2a1fd228_uri" AS "object" + * Extension + * ExtensionElem (_anon_c3c3c545_1cf9_4323_a1b8_10fba089a8eb) + * ValueExprTripleRef + * Var (name=s) + * Var (name=p) + * Var (name=o) + * ExtensionElem (_const_c78aee8a_uri) + * ValueConstant (value=urn:pred) + * ExtensionElem (_const_2a1fd228_uri) + * ValueConstant (value=urn:value) + * StatementPattern + * Var (name=s) + * Var (name=p) + * Var (name=o) + * @throws Exception + */ + @Test + public void testUseInConstructFromStatementPattern() throws Exception { + String simpleSparqlQuery = "CONSTRUCT {<> } WHERE {?s ?p ?o}"; + + ParsedQuery q = parser.parseQuery(simpleSparqlQuery, null); + + assertNotNull(q); + assertTrue("expect Reduced", q.getTupleExpr() instanceof Reduced); + assertTrue("expect projection", ((Reduced) q.getTupleExpr()).getArg() instanceof Projection); + Projection proj = (Projection) ((Reduced) q.getTupleExpr()).getArg(); + + List list = proj.getProjectionElemList().getElements(); + final ArrayList listTargetNames = new ArrayList<>(); + list.forEach(el -> { + listTargetNames.add(el.getTargetName()); + }); + assertEquals("expect all bindings", 3, list.size()); + assertTrue("expect target subject", listTargetNames.contains("subject")); + assertTrue("expect target predicate", listTargetNames.contains("predicate")); + assertTrue("expect target oobject", listTargetNames.contains("object")); + + final ArrayList listSourceNames = new ArrayList<>(); + list.forEach(el -> { + listSourceNames.add(el.getSourceName()); + }); + + assertTrue("expect extension", proj.getArg() instanceof Extension); + Extension ext = (Extension) proj.getArg(); + assertTrue("three extention elements", ext.getElements().size() == 3); + ExtensionElem elem = ext.getElements().get(0); + + assertEquals("anon name should match first", elem.getName(), listSourceNames.get(0)); + + assertTrue("expect ValueExprTripleRef in extention element", elem.getExpr() instanceof ValueExprTripleRef); + ValueExprTripleRef ref = (ValueExprTripleRef) elem.getExpr(); + assertEquals("subject var name", "s", ref.getSubjectVar().getName()); + assertEquals("predicate var name", "p", ref.getPredicateVar().getName()); + assertEquals("object var name", "o", ref.getObjectVar().getName()); + + elem = ext.getElements().get(1); + assertEquals("names should match", elem.getName(), listSourceNames.get(1)); + assertEquals("value should match", "urn:pred", ((ValueConstant) elem.getExpr()).getValue().toString()); + + elem = ext.getElements().get(2); + assertEquals("names should match", elem.getName(), listSourceNames.get(2)); + assertEquals("value should match", "urn:value", ((ValueConstant) elem.getExpr()).getValue().toString()); + + assertTrue("expect StatementPattern", ext.getArg() instanceof StatementPattern); + StatementPattern pattern = (StatementPattern) ext.getArg(); + + assertEquals("subj var name should match", "s", pattern.getSubjectVar().getName()); + assertEquals("pred var name should match", "p", pattern.getPredicateVar().getName()); + assertEquals("obj var name should match", "o", pattern.getObjectVar().getName()); + } + + /*- + * Expected UpdateExpression: + * Modify + * DeleteExpr: + * null + * InsertExpr: + * StatementPattern + * Var (name=_anon_e1b1cef8_f308_4217_886f_101bf31f3834, anonymous) + * Var (name=_const_c78aee8a_uri, value=urn:pred, anonymous) + * Var (name=_const_2a1fd228_uri, value=urn:value, anonymous) + * + * WhereExpr: + * Extension + * ExtensionElem (_anon_e1b1cef8_f308_4217_886f_101bf31f3834) + * ValueExprTripleRef + * Var (name=s) + * Var (name=p) + * Var (name=o) + * StatementPattern + * Var (name=s) + * Var (name=p) + * Var (name=o) + * + * @throws Exception + */ + @Test + public void testUseInInsertFromStatementPattern() throws Exception { + String simpleSparqlQuery = "Insert {<> } WHERE {?s ?p ?o}"; + + ParsedUpdate q = parser.parseUpdate(simpleSparqlQuery, null); + + assertNotNull(q); + assertTrue("expect single UpdateExpr", q.getUpdateExprs().size() == 1); + UpdateExpr updateExpr = q.getUpdateExprs().get(0); + assertTrue("expect Modify UpdateExpr", updateExpr instanceof Modify); + Modify modify = (Modify) updateExpr; + assertTrue("expect no DELETE", modify.getDeleteExpr() == null); + + assertTrue("expect INSERT", modify.getInsertExpr() != null); + assertTrue("expect INSERT as statamentPattern", modify.getInsertExpr() instanceof StatementPattern); + StatementPattern insert = (StatementPattern) modify.getInsertExpr(); + String anonVar = insert.getSubjectVar().getName(); + assertEquals("expect predicate", "urn:pred", insert.getPredicateVar().getValue().toString()); + assertEquals("expect object", "urn:value", insert.getObjectVar().getValue().toString()); + + assertTrue("expect WHERE", modify.getWhereExpr() != null); + assertTrue("expect WHERE as extension", modify.getWhereExpr() instanceof Extension); + + Extension where = (Extension) modify.getWhereExpr(); + + Extension ext = (Extension) where; + assertTrue("one extention element", ext.getElements().size() == 1); + ExtensionElem elem = ext.getElements().get(0); + + assertEquals("anon name should match first", elem.getName(), anonVar); + + assertTrue("expect ValueExprTripleRef in extention element", elem.getExpr() instanceof ValueExprTripleRef); + ValueExprTripleRef ref = (ValueExprTripleRef) elem.getExpr(); + assertEquals("subject var name", "s", ref.getSubjectVar().getName()); + assertEquals("predicate var name", "p", ref.getPredicateVar().getName()); + assertEquals("object var name", "o", ref.getObjectVar().getName()); + + assertTrue("expect StatementPattern as extension argument", ext.getArg() instanceof StatementPattern); + StatementPattern pattern = (StatementPattern) ext.getArg(); + assertEquals("subject var name should match", pattern.getSubjectVar().getName(), ref.getSubjectVar().getName()); + assertEquals("predicate var name should match", pattern.getPredicateVar().getName(), + ref.getPredicateVar().getName()); + assertEquals("object var name should match", pattern.getObjectVar().getName(), ref.getObjectVar().getName()); + + } + + /*- + * Expected UpdateExpression: + * Modify + * InsertExpr: + * null + * DeleteExpr: + * StatementPattern + * Var (name=_anon_e1b1cef8_f308_4217_886f_101bf31f3834, anonymous) + * Var (name=_const_c78aee8a_uri, value=urn:pred, anonymous) + * Var (name=_const_2a1fd228_uri, value=urn:value, anonymous) + * + * WhereExpr: + * Extension + * ExtensionElem (_anon_e1b1cef8_f308_4217_886f_101bf31f3834) + * ValueExprTripleRef + * Var (name=s) + * Var (name=p) + * Var (name=o) + * StatementPattern + * Var (name=s) + * Var (name=p) + * Var (name=o) + * + * @throws Exception + */ + @Test + public void testUseInDeleteFromStatementPattern() throws Exception { + String simpleSparqlQuery = "DELETE {<> } WHERE {?s ?p ?o}"; + + ParsedUpdate q = parser.parseUpdate(simpleSparqlQuery, null); + + assertNotNull(q); + assertTrue("expect single UpdateExpr", q.getUpdateExprs().size() == 1); + UpdateExpr updateExpr = q.getUpdateExprs().get(0); + assertTrue("expect Modify UpdateExpr", updateExpr instanceof Modify); + Modify modify = (Modify) updateExpr; + assertTrue("expect no INSERT", modify.getInsertExpr() == null); + + assertTrue("expect DELETE", modify.getDeleteExpr() != null); + assertTrue("expect DETELE as statamentPattern", modify.getDeleteExpr() instanceof StatementPattern); + StatementPattern insert = (StatementPattern) modify.getDeleteExpr(); + String anonVar = insert.getSubjectVar().getName(); + assertEquals("expect predicate", "urn:pred", insert.getPredicateVar().getValue().toString()); + assertEquals("expect object", "urn:value", insert.getObjectVar().getValue().toString()); + + assertTrue("expect WHERE", modify.getWhereExpr() != null); + assertTrue("expect WHERE as extension", modify.getWhereExpr() instanceof Extension); + + Extension where = (Extension) modify.getWhereExpr(); + + Extension ext = (Extension) where; + assertTrue("one extention element", ext.getElements().size() == 1); + ExtensionElem elem = ext.getElements().get(0); + + assertEquals("anon name should match first", elem.getName(), anonVar); + + assertTrue("expect ValueExprTripleRef in extention element", elem.getExpr() instanceof ValueExprTripleRef); + ValueExprTripleRef ref = (ValueExprTripleRef) elem.getExpr(); + assertEquals("subject var name", "s", ref.getSubjectVar().getName()); + assertEquals("predicate var name", "p", ref.getPredicateVar().getName()); + assertEquals("object var name", "o", ref.getObjectVar().getName()); + + assertTrue("expect StatementPattern as extension argument", ext.getArg() instanceof StatementPattern); + StatementPattern pattern = (StatementPattern) ext.getArg(); + assertEquals("subject var name should match", pattern.getSubjectVar().getName(), ref.getSubjectVar().getName()); + assertEquals("predicate var name should match", pattern.getPredicateVar().getName(), + ref.getPredicateVar().getName()); + assertEquals("object var name should match", pattern.getObjectVar().getName(), ref.getObjectVar().getName()); + + } + + /*- + * expected TupleExpr: + * Projection + * ProjectionElemList + * ProjectionElem "ref" + * ProjectionElem "count" + * Extension + * ExtensionElem (ref) + * Var (name=ref) + * ExtensionElem (count) + * Count (Distinct) + * Var (name=p) + * Group (ref) + * Extension + * ExtensionElem (ref) + * Var (name=_anon_3ddeacea_c54c_4db0_bb6e_2f699772e5f8, anonymous) + * TripleRef + * Var (name=s) + * Var (name=p) + * Var (name=o) + * Var (name=_anon_3ddeacea_c54c_4db0_bb6e_2f699772e5f8, anonymous) + * GroupElem + * Count (Distinct) + * Var (name=p) * @throws Exception + * + * @throws Exception + */ + @Test + public void testUseInGroupByFromBindWithVars() throws Exception { + String simpleSparqlQuery = "SELECT ?ref (count( distinct ?p) as ?count) WHERE { bind(<> as ?ref)} group by ?ref"; + + ParsedQuery q = parser.parseQuery(simpleSparqlQuery, null); + + assertNotNull(q); + assertTrue("expect projection", q.getTupleExpr() instanceof Projection); + Projection proj = (Projection) q.getTupleExpr(); + List list = proj.getProjectionElemList().getElements(); + final ArrayList listNames = new ArrayList<>(); + list.forEach(el -> { + listNames.add(el.getTargetName()); + }); + assertEquals("expect all bindings", 2, list.size()); + assertTrue("expect ref", listNames.contains("ref")); + assertTrue("expect count", listNames.contains("count")); + + assertTrue("expect extension", proj.getArg() instanceof Extension); + Extension ext = (Extension) proj.getArg(); + assertTrue("two extention elements", ext.getElements().size() == 2); + ExtensionElem elem = ext.getElements().get(0); + + assertEquals("name should match", elem.getName(), "ref"); + assertTrue("expect Var in extention element", elem.getExpr() instanceof Var); + assertEquals("names should match", elem.getName(), ((Var) elem.getExpr()).getName()); + + elem = ext.getElements().get(1); + assertEquals("name should match", elem.getName(), "count"); + assertTrue("expect Count in extention element", elem.getExpr() instanceof Count); + Count count = (Count) elem.getExpr(); + assertTrue("expect count distinct", count.isDistinct()); + assertTrue("expect count over var", count.getArg() instanceof Var); + assertEquals("expect count var p", "p", ((Var) count.getArg()).getName()); + + assertTrue("expect Group", ext.getArg() instanceof Group); + Group group = (Group) ext.getArg(); + assertTrue("expect group bindings", group.getGroupBindingNames().size() == 1); + assertTrue("expect group over ref", group.getGroupBindingNames().contains("ref")); + + assertTrue("expect Extension", group.getArg() instanceof Extension); + ext = (Extension) group.getArg(); + + assertTrue("single extention elemrnt", ext.getElements().size() == 1); + elem = ext.getElements().get(0); + + assertEquals("name should match", elem.getName(), "ref"); + assertTrue("expect Var in extention element", elem.getExpr() instanceof Var); + String anonVar = ((Var) elem.getExpr()).getName(); + + assertTrue("expect TripleRef", ext.getArg() instanceof TripleRef); + TripleRef triple = (TripleRef) ext.getArg(); + + assertEquals("ext var should match", anonVar, triple.getExprVar().getName()); + + assertEquals("subj var name should match", "s", triple.getSubjectVar().getName()); + assertEquals("pred var name should match", "p", triple.getPredicateVar().getName()); + assertEquals("obj var name should match", "o", triple.getObjectVar().getName()); + } + + /*- + * Expected TupleExpr: + * Projection + * ProjectionElemList + * ProjectionElem "s" + * ProjectionElem "p" + * ProjectionElem "o" + * Filter + * Exists + * Join + * TripleRef + * Var (name=s) + * Var (name=p) + * Var (name=_const_2a1fd228_uri, value=urn:value, anonymous) + * Var (name=_anon_7e45283d_63d5_4fe7_81cd_cebdae504d5f, anonymous) + * StatementPattern + * Var (name=_anon_7e45283d_63d5_4fe7_81cd_cebdae504d5f, anonymous) + * Var (name=_const_c78aee8a_uri, value=urn:pred, anonymous) + * Var (name=q) + * StatementPattern + * Var (name=s) + * Var (name=p) + * Var (name=o) + * @throws Exception + */ + @Test + public void testUseInExists() throws Exception { + String simpleSparqlQuery = "SELECT * WHERE { ?s ?p ?o . filter exists {<>> ?q}} "; + + ParsedQuery q = parser.parseQuery(simpleSparqlQuery, null); + + assertNotNull(q); + assertTrue("expect projection", q.getTupleExpr() instanceof Projection); + Projection proj = (Projection) q.getTupleExpr(); + List list = proj.getProjectionElemList().getElements(); + final ArrayList listNames = new ArrayList<>(); + list.forEach(el -> { + listNames.add(el.getTargetName()); + }); + assertEquals("expect all bindings", 3, list.size()); + assertTrue("expect s", listNames.contains("s")); + assertTrue("expect p", listNames.contains("p")); + assertTrue("expect o", listNames.contains("o")); + + assertTrue("expect Filter", proj.getArg() instanceof Filter); + Filter filter = (Filter) proj.getArg(); + + assertTrue("expect Exists", filter.getCondition() instanceof Exists); + Exists exists = (Exists) filter.getCondition(); + + assertTrue("expect join", exists.getSubQuery() instanceof Join); + Join join = (Join) exists.getSubQuery(); + + assertTrue("expect join left arg as TripleRef", join.getLeftArg() instanceof TripleRef); + TripleRef ref = (TripleRef) join.getLeftArg(); + assertEquals("expect subj var", "s", ref.getSubjectVar().getName()); + assertEquals("expect pred var", "p", ref.getPredicateVar().getName()); + assertEquals("expect obj value", "urn:value", ref.getObjectVar().getValue().toString()); + + assertTrue("expect join right arg as StatementPattern", join.getRightArg() instanceof StatementPattern); + StatementPattern pattern = (StatementPattern) join.getRightArg(); + assertEquals("expect same var names", ref.getExprVar().getName(), pattern.getSubjectVar().getName()); + assertEquals("expect pred var value", "urn:pred", pattern.getPredicateVar().getValue().toString()); + assertEquals("expect obj var name", "q", pattern.getObjectVar().getName()); + + assertTrue("expect fiter argument as statement pattern", filter.getArg() instanceof StatementPattern); + pattern = (StatementPattern) filter.getArg(); + + assertEquals("subj var name should match", "s", pattern.getSubjectVar().getName()); + assertEquals("pred var name should match", "p", pattern.getPredicateVar().getName()); + assertEquals("obj var name should match", "o", pattern.getObjectVar().getName()); + } + + /*- + * Expected TupleExpr: + * Projection + * ProjectionElemList + * ProjectionElem "str" + * Extension + * ExtensionElem (str) + * Str + * ValueExprTripleRef + * Var (name=_const_6a63498_uri, value=urn:a, anonymous) + * Var (name=_const_6a63499_uri, value=urn:b, anonymous) + * Var (name=_const_6a6349a_uri, value=urn:c, anonymous) + * SingletonSet + * @throws Exception + */ + @Test + public void testUseInSTR() throws Exception { + String simpleSparqlQuery = "SELECT (str(<< >>) as ?str) WHERE { } "; + + ParsedQuery q = parser.parseQuery(simpleSparqlQuery, null); + + assertNotNull(q); + assertTrue("expect projection", q.getTupleExpr() instanceof Projection); + Projection proj = (Projection) q.getTupleExpr(); + List list = proj.getProjectionElemList().getElements(); + final ArrayList listNames = new ArrayList<>(); + list.forEach(el -> { + listNames.add(el.getTargetName()); + }); + assertEquals("expect one binding", 1, list.size()); + assertTrue("expect str", listNames.contains("str")); + + assertTrue("expect Extension", proj.getArg() instanceof Extension); + Extension ext = (Extension) proj.getArg(); + + assertTrue("one extention element", ext.getElements().size() == 1); + ExtensionElem elem = ext.getElements().get(0); + + assertEquals("name should match", "str", elem.getName()); + assertTrue("expect Str in extention element", elem.getExpr() instanceof Str); + + assertTrue("expect ValueExprTripleRef in extention element", + ((Str) elem.getExpr()).getArg() instanceof ValueExprTripleRef); + ValueExprTripleRef ref = (ValueExprTripleRef) ((Str) elem.getExpr()).getArg(); + assertEquals("subject var value", "urn:a", ref.getSubjectVar().getValue().toString()); + assertEquals("predicate var name", "urn:b", ref.getPredicateVar().getValue().toString()); + assertEquals("object var name", "urn:c", ref.getObjectVar().getValue().toString()); + } +} diff --git a/core/queryrender/pom.xml b/core/queryrender/pom.xml index c936aee6384..aa50bac43a7 100644 --- a/core/queryrender/pom.xml +++ b/core/queryrender/pom.xml @@ -4,7 +4,7 @@ org.eclipse.rdf4j rdf4j-core - 3.1.5-SNAPSHOT + 3.2.2-SNAPSHOT rdf4j-queryrender RDF4J: Query Rendering diff --git a/core/queryrender/src/main/java/org/eclipse/rdf4j/queryrender/BaseTupleExprRenderer.java b/core/queryrender/src/main/java/org/eclipse/rdf4j/queryrender/BaseTupleExprRenderer.java index 33c18c8972f..1061f24c337 100644 --- a/core/queryrender/src/main/java/org/eclipse/rdf4j/queryrender/BaseTupleExprRenderer.java +++ b/core/queryrender/src/main/java/org/eclipse/rdf4j/queryrender/BaseTupleExprRenderer.java @@ -32,7 +32,7 @@ *

    * Base class for rendering RDF4J query API objects into strings. *

    - * + * * @author Michael Grove */ public abstract class BaseTupleExprRenderer extends AbstractQueryModelVisitor { @@ -114,7 +114,7 @@ public long getOffset() { /** * Render the ParsedQuery as a query string - * + * * @param theQuery the parsed query to render * @return the query object rendered in the serql syntax * @throws Exception if there is an error while rendering @@ -125,7 +125,7 @@ public String render(ParsedQuery theQuery) throws Exception { /** * Render the TupleExpr as a query or query fragment depending on what kind of TupleExpr it is - * + * * @param theExpr the expression to render * @return the TupleExpr rendered in the serql syntax * @throws Exception if there is an error while rendering @@ -134,7 +134,7 @@ public String render(ParsedQuery theQuery) throws Exception { /** * Render the given ValueExpr - * + * * @param theExpr the expr to render * @return the rendered expression * @throws Exception if there is an error while rendering @@ -144,7 +144,7 @@ public String render(ParsedQuery theQuery) throws Exception { /** * Turn a ProjectionElemList for a construct query projection (three elements aliased as 'subject', 'predicate' and * 'object' in that order) into a StatementPattern. - * + * * @param theList the elem list to render * @return the elem list for a construct projection as a statement pattern * @throws Exception if there is an exception while rendering @@ -168,7 +168,7 @@ public StatementPattern toStatementPattern(ProjectionElemList theList) throws Ex /** * Scrub any illegal characters out of the variable name - * + * * @param theName the potential variable name * @return the name scrubbed of any illegal characters */ @@ -178,7 +178,7 @@ public static String scrubVarName(String theName) { /** * Return the {@link ValueExpr} as a {@link Value} if possible. - * + * * @param theValue the ValueExpr to convert * @return the expression as a Value, or null if it cannot be converted * @throws Exception if there is an error converting to a Value @@ -200,7 +200,7 @@ private Value asValue(ValueExpr theValue) throws Exception { /** * Returns whether or not the results of scanning the query model indicates that this represents a select query - * + * * @return true if its a select query, false if its a construct query */ protected boolean isSelect() { @@ -218,7 +218,7 @@ protected boolean isSelect() { /** * Return whether or not this projection looks like an spo binding for a construct query - * + * * @param theList the projection element list to inspect * @return true if it has the format of a spo construct projection element, false otherwise */ diff --git a/core/queryrender/src/main/java/org/eclipse/rdf4j/queryrender/QueryRenderer.java b/core/queryrender/src/main/java/org/eclipse/rdf4j/queryrender/QueryRenderer.java index 33458d7d616..3b13771ac08 100644 --- a/core/queryrender/src/main/java/org/eclipse/rdf4j/queryrender/QueryRenderer.java +++ b/core/queryrender/src/main/java/org/eclipse/rdf4j/queryrender/QueryRenderer.java @@ -14,21 +14,21 @@ *

    * Interface for RDF4J-based query renderers *

    - * + * * @author Michael Grove */ public interface QueryRenderer { /** * Return the language this QueryRenderer will render queries in. - * + * * @return the query language */ public QueryLanguage getLanguage(); /** * Render the query object to a string in the language supported by this renderer - * + * * @param theQuery the query to render * @return the rendered query * @throws Exception if there is an error while rendering diff --git a/core/queryrender/src/main/java/org/eclipse/rdf4j/queryrender/RenderUtils.java b/core/queryrender/src/main/java/org/eclipse/rdf4j/queryrender/RenderUtils.java index bf62c334c21..05947d629cf 100644 --- a/core/queryrender/src/main/java/org/eclipse/rdf4j/queryrender/RenderUtils.java +++ b/core/queryrender/src/main/java/org/eclipse/rdf4j/queryrender/RenderUtils.java @@ -18,7 +18,7 @@ /** * Utility methods for rendering (parts of) SeRQL and SPARQL query strings. - * + * * @author Michael Grove */ public final class RenderUtils { @@ -31,7 +31,7 @@ private RenderUtils() { /** * Return the query string rendering of the {@link org.eclipse.rdf4j.model.Value} - * + * * @param theValue the value to render * @return the value rendered in its query string representation * @deprecated Use {@link #toSPARQL(Value)} instead. @@ -43,7 +43,7 @@ public static String getSPARQLQueryString(Value theValue) { /** * Return the SPARQL query string rendering of the {@link org.eclipse.rdf4j.model.Value} - * + * * @param theValue the value to render * @return the value rendered in its SPARQL query string representation */ @@ -55,7 +55,7 @@ public static String toSPARQL(Value theValue) { /** * Append the SPARQL query string rendering of the {@link org.eclipse.rdf4j.model.Value} to the supplied * {@link StringBuilder}. - * + * * @param value the value to render * @param builder the {@link StringBuilder} to append to * @return the original {@link StringBuilder} with the value appended. @@ -83,7 +83,7 @@ public static StringBuilder toSPARQL(Value value, StringBuilder builder) { /** * Return the query string rendering of the {@link Value} - * + * * @param theValue the value to render * @return the value rendered in its query string representation * @deprecated Use {{@link #toSeRQL(Value)} instead. @@ -95,7 +95,7 @@ public static String getSerqlQueryString(Value theValue) { /** * Return the query string rendering of the {@link Value} - * + * * @param theValue the value to render * @return the value rendered in its query string representation */ @@ -126,7 +126,7 @@ public static String toSeRQL(Value theValue) { * Properly escape out any special characters in the query string. Replaces unescaped double quotes with \" and * replaces slashes '\' which are not a valid escape sequence such as \t or \n with a double slash '\\' so they are * unescaped correctly by a SPARQL parser. - * + * * @param theString the query string to escape chars in * @return the escaped query string */ diff --git a/core/queryrender/src/main/java/org/eclipse/rdf4j/queryrender/builder/AbstractQueryBuilder.java b/core/queryrender/src/main/java/org/eclipse/rdf4j/queryrender/builder/AbstractQueryBuilder.java index 59d6f46b08e..3e8aca39ad3 100644 --- a/core/queryrender/src/main/java/org/eclipse/rdf4j/queryrender/builder/AbstractQueryBuilder.java +++ b/core/queryrender/src/main/java/org/eclipse/rdf4j/queryrender/builder/AbstractQueryBuilder.java @@ -48,7 +48,7 @@ *

    * Base implementation of a QueryBuilder. *

    - * + * * @author Michael Grove * @deprecated use {@link org.eclipse.rdf4j.sparqlbuilder.core.SparqlBuilder} instead. */ diff --git a/core/queryrender/src/main/java/org/eclipse/rdf4j/queryrender/builder/BasicGroup.java b/core/queryrender/src/main/java/org/eclipse/rdf4j/queryrender/builder/BasicGroup.java index 9cd137c538a..33802e63f37 100644 --- a/core/queryrender/src/main/java/org/eclipse/rdf4j/queryrender/builder/BasicGroup.java +++ b/core/queryrender/src/main/java/org/eclipse/rdf4j/queryrender/builder/BasicGroup.java @@ -28,7 +28,7 @@ *

    * Internal class for representing a group within a query. *

    - * + * * @author Michael Grove * @deprecated use {@link org.eclipse.rdf4j.sparqlbuilder.core.SparqlBuilder} instead. */ @@ -45,7 +45,7 @@ public class BasicGroup implements Group { /** * Create a new BasicGroup - * + * * @param theOptional whether or not the patterns and filters in this group are optional */ public BasicGroup(final boolean theOptional) { @@ -76,7 +76,7 @@ public void addChild(Group theGroup) { /** * Remove a child from this group - * + * * @param theGroup the child to remove */ public void removeChild(Group theGroup) { @@ -85,7 +85,7 @@ public void removeChild(Group theGroup) { /** * Add a Filter to this group - * + * * @param theExpr the value filter to add */ public void addFilter(ValueExpr theExpr) { diff --git a/core/queryrender/src/main/java/org/eclipse/rdf4j/queryrender/builder/FilterBuilder.java b/core/queryrender/src/main/java/org/eclipse/rdf4j/queryrender/builder/FilterBuilder.java index 21274dd9197..b449cb0b45c 100644 --- a/core/queryrender/src/main/java/org/eclipse/rdf4j/queryrender/builder/FilterBuilder.java +++ b/core/queryrender/src/main/java/org/eclipse/rdf4j/queryrender/builder/FilterBuilder.java @@ -25,7 +25,7 @@ *

    * Builder class for creating a filter expression in a query. *

    - * + * * @author Michael Grove * @deprecated use {@link org.eclipse.rdf4j.sparqlbuilder.core.SparqlBuilder} instead. */ diff --git a/core/queryrender/src/main/java/org/eclipse/rdf4j/queryrender/builder/Group.java b/core/queryrender/src/main/java/org/eclipse/rdf4j/queryrender/builder/Group.java index 977e0373caf..e2a4ac9301e 100644 --- a/core/queryrender/src/main/java/org/eclipse/rdf4j/queryrender/builder/Group.java +++ b/core/queryrender/src/main/java/org/eclipse/rdf4j/queryrender/builder/Group.java @@ -11,7 +11,7 @@ *

    * Abstract representation of a group of atoms in a query *

    - * + * * @author Michael Grove * @deprecated use {@link org.eclipse.rdf4j.sparqlbuilder.core.SparqlBuilder} instead. */ diff --git a/core/queryrender/src/main/java/org/eclipse/rdf4j/queryrender/builder/GroupBuilder.java b/core/queryrender/src/main/java/org/eclipse/rdf4j/queryrender/builder/GroupBuilder.java index 8947f467051..eca01d9433b 100644 --- a/core/queryrender/src/main/java/org/eclipse/rdf4j/queryrender/builder/GroupBuilder.java +++ b/core/queryrender/src/main/java/org/eclipse/rdf4j/queryrender/builder/GroupBuilder.java @@ -23,7 +23,7 @@ *

    * Builder for creating a grouped set of query atoms and filters in a query. *

    - * + * * @author Michael Grove * @deprecated use {@link org.eclipse.rdf4j.sparqlbuilder.core.SparqlBuilder} instead. */ diff --git a/core/queryrender/src/main/java/org/eclipse/rdf4j/queryrender/builder/QueryBuilder.java b/core/queryrender/src/main/java/org/eclipse/rdf4j/queryrender/builder/QueryBuilder.java index f2f446edc0e..532980b14c5 100644 --- a/core/queryrender/src/main/java/org/eclipse/rdf4j/queryrender/builder/QueryBuilder.java +++ b/core/queryrender/src/main/java/org/eclipse/rdf4j/queryrender/builder/QueryBuilder.java @@ -16,7 +16,7 @@ * Interface for a QueryBuilder which provides a simple fluent API for constructing Sesame query object * programmatically. *

    - * + * * @author Michael Grove * @deprecated use {@link org.eclipse.rdf4j.sparqlbuilder.core.SparqlBuilder} instead. */ @@ -25,14 +25,14 @@ public interface QueryBuilder extends SupportsGroups { /** * Return the query constructed by this query builder - * + * * @return the query */ public T query(); /** * Specify an offset for the query - * + * * @param theOffset the new offset * @return this query builder */ @@ -40,7 +40,7 @@ public interface QueryBuilder extends SupportsGroups { /** * Specify a limit for the query - * + * * @param theLimit the new limit for the query * @return this query builder */ @@ -48,14 +48,14 @@ public interface QueryBuilder extends SupportsGroups { /** * Create an option sub-group - * + * * @return the new group */ public GroupBuilder> optional(); /** * Create a new sub-group of the query - * + * * @return the new group */ public GroupBuilder> group(); @@ -67,21 +67,21 @@ public interface QueryBuilder extends SupportsGroups { /** * Specify that this query should use the "distinct" keyword - * + * * @return this query builder */ public QueryBuilder distinct(); /** * Specify that this query should use the "reduced" keyword - * + * * @return this query builder */ public QueryBuilder reduced(); /** * Add projection variables to the query - * + * * @param theNames the names of the variables to add to the projection * @return this query builder */ @@ -89,7 +89,7 @@ public interface QueryBuilder extends SupportsGroups { /** * Add a from clause to this query - * + * * @param theURI the from URI * @return this query builder */ @@ -97,7 +97,7 @@ public interface QueryBuilder extends SupportsGroups { /** * Add a 'from named' clause to this query - * + * * @param theURI the graph URI * @return this query builder */ @@ -105,7 +105,7 @@ public interface QueryBuilder extends SupportsGroups { /** * Specify ORDER BY clause with ASC modifier by default - * + * * @param theNames the names of the variables to apply the ordering * @return this query builder */ @@ -113,7 +113,7 @@ public interface QueryBuilder extends SupportsGroups { /** * Specify ORDER BY clause with ASC modifier - * + * * @param theNames the names of the variables to apply the ordering * @return this query builder */ @@ -121,7 +121,7 @@ public interface QueryBuilder extends SupportsGroups { /** * Specify ORDER BY clause with DESC modifier - * + * * @param theNames the names of the variables to apply the ordering * @return this query builder */ diff --git a/core/queryrender/src/main/java/org/eclipse/rdf4j/queryrender/builder/QueryBuilderFactory.java b/core/queryrender/src/main/java/org/eclipse/rdf4j/queryrender/builder/QueryBuilderFactory.java index 5d032de4d7e..b19fa7eeaf4 100644 --- a/core/queryrender/src/main/java/org/eclipse/rdf4j/queryrender/builder/QueryBuilderFactory.java +++ b/core/queryrender/src/main/java/org/eclipse/rdf4j/queryrender/builder/QueryBuilderFactory.java @@ -20,7 +20,7 @@ *

    * Factory class for obtaining instances of {@link QueryBuilder} objects for the various types of queries. *

    - * + * * @author Michael Grove * @deprecated use {@link org.eclipse.rdf4j.sparqlbuilder.core.SparqlBuilder} instead. */ @@ -29,7 +29,7 @@ public class QueryBuilderFactory { /** * Create a QueryBuilder for creating a select query - * + * * @return a select QueryBuilder */ public static QueryBuilder ask() { @@ -38,7 +38,7 @@ public static QueryBuilder ask() { /** * Create a QueryBuilder for creating a select query - * + * * @return a select QueryBuilder */ public static QueryBuilder select() { @@ -47,7 +47,7 @@ public static QueryBuilder select() { /** * Create a QueryBuilder for creating a select query - * + * * @param theProjectionVars the list of elements in the projection of the query * @return a select query builder */ @@ -60,7 +60,7 @@ public static QueryBuilder select(String... theProjectionVars) /** * Create a QueryBuilder for building a construct query - * + * * @return a construct QueryBuilder */ public static QueryBuilder construct() { @@ -69,7 +69,7 @@ public static QueryBuilder construct() { /** * Create a QueryBuilder for creating a describe query - * + * * @param theValues the specific bound URI values to be described * @return a describe query builder */ @@ -79,7 +79,7 @@ public static QueryBuilder describe(Resource... theValues) { /** * Create a QueryBuilder for creating a describe query - * + * * @param theVars the variables to be described * @param theValues the specific bound URI values to be described * @return a describe query builder diff --git a/core/queryrender/src/main/java/org/eclipse/rdf4j/queryrender/builder/SupportsExpr.java b/core/queryrender/src/main/java/org/eclipse/rdf4j/queryrender/builder/SupportsExpr.java index 097b0fd1013..79e10e99321 100644 --- a/core/queryrender/src/main/java/org/eclipse/rdf4j/queryrender/builder/SupportsExpr.java +++ b/core/queryrender/src/main/java/org/eclipse/rdf4j/queryrender/builder/SupportsExpr.java @@ -13,7 +13,7 @@ *

    * Interface for something that supports the ability to turn itself into a Sesame TupleExpr. *

    - * + * * @author Michael Grove * @deprecated use {@link org.eclipse.rdf4j.sparqlbuilder.core.SparqlBuilder} instead. */ diff --git a/core/queryrender/src/main/java/org/eclipse/rdf4j/queryrender/builder/SupportsGroups.java b/core/queryrender/src/main/java/org/eclipse/rdf4j/queryrender/builder/SupportsGroups.java index d082b5220ea..e2b6139850e 100644 --- a/core/queryrender/src/main/java/org/eclipse/rdf4j/queryrender/builder/SupportsGroups.java +++ b/core/queryrender/src/main/java/org/eclipse/rdf4j/queryrender/builder/SupportsGroups.java @@ -11,7 +11,7 @@ *

    * Interface for anything that supports having a collection of groups or sub-groups. *

    - * + * * @author Michael Grove * @deprecated use {@link org.eclipse.rdf4j.sparqlbuilder.core.SparqlBuilder} instead. */ @@ -20,7 +20,7 @@ public interface SupportsGroups { /** * Add this group from the query - * + * * @param theGroup the group to add * @return this builder */ @@ -28,7 +28,7 @@ public interface SupportsGroups { /** * Remove this group from the query - * + * * @param theGroup the group to remove * @return this builder */ diff --git a/core/queryrender/src/main/java/org/eclipse/rdf4j/queryrender/builder/UnionBuilder.java b/core/queryrender/src/main/java/org/eclipse/rdf4j/queryrender/builder/UnionBuilder.java index 31289463f3c..556a3f7ccef 100644 --- a/core/queryrender/src/main/java/org/eclipse/rdf4j/queryrender/builder/UnionBuilder.java +++ b/core/queryrender/src/main/java/org/eclipse/rdf4j/queryrender/builder/UnionBuilder.java @@ -15,7 +15,7 @@ *

    * Builder class for creating Unioned groups *

    - * + * * @author Michael Grove * @deprecated use {@link org.eclipse.rdf4j.sparqlbuilder.core.SparqlBuilder} instead. */ @@ -44,7 +44,7 @@ public UnionBuilder(final GroupBuilder theParent) { /** * Return a builder for creating the left operand of the union - * + * * @return builder for left operand */ public GroupBuilder> left() { @@ -53,7 +53,7 @@ public GroupBuilder> left() { /** * Return a builder for creating the right operand of the union - * + * * @return builder for right operand */ public GroupBuilder> right() { @@ -62,7 +62,7 @@ public GroupBuilder> right() { /** * Close this union and return it's parent group builder. - * + * * @return the parent builder */ public GroupBuilder closeUnion() { diff --git a/core/queryrender/src/main/java/org/eclipse/rdf4j/queryrender/builder/ValueExprFactory.java b/core/queryrender/src/main/java/org/eclipse/rdf4j/queryrender/builder/ValueExprFactory.java index 521e6149d14..eeddd4ae5c4 100644 --- a/core/queryrender/src/main/java/org/eclipse/rdf4j/queryrender/builder/ValueExprFactory.java +++ b/core/queryrender/src/main/java/org/eclipse/rdf4j/queryrender/builder/ValueExprFactory.java @@ -24,7 +24,7 @@ *

    * Collection of utility methods for building the various ValueExpr objects in the RDF4J query API. *

    - * + * * @author Michael Grove * @deprecated use {@link org.eclipse.rdf4j.sparqlbuilder.core.SparqlBuilder} instead. */ diff --git a/core/queryrender/src/main/java/org/eclipse/rdf4j/queryrender/builder/package-info.java b/core/queryrender/src/main/java/org/eclipse/rdf4j/queryrender/builder/package-info.java index 57f03eeaf00..dae888c18ba 100644 --- a/core/queryrender/src/main/java/org/eclipse/rdf4j/queryrender/builder/package-info.java +++ b/core/queryrender/src/main/java/org/eclipse/rdf4j/queryrender/builder/package-info.java @@ -7,8 +7,8 @@ *******************************************************************************/ /** * This package is deprecated. Use the new rdf4j-sparqlbuilder module for query building instead. - * + * * @see org.eclipse.rdf4j.sparqlbuilder */ @Deprecated -package org.eclipse.rdf4j.queryrender.builder; \ No newline at end of file +package org.eclipse.rdf4j.queryrender.builder; diff --git a/core/queryrender/src/main/java/org/eclipse/rdf4j/queryrender/serql/SeRQLQueryRenderer.java b/core/queryrender/src/main/java/org/eclipse/rdf4j/queryrender/serql/SeRQLQueryRenderer.java index e3ac2bbe39f..7b65c8c4753 100644 --- a/core/queryrender/src/main/java/org/eclipse/rdf4j/queryrender/serql/SeRQLQueryRenderer.java +++ b/core/queryrender/src/main/java/org/eclipse/rdf4j/queryrender/serql/SeRQLQueryRenderer.java @@ -16,7 +16,7 @@ * Implementation of the {@link QueryRenderer} interface which renders * {@link org.eclipse.rdf4j.query.parser.ParsedQuery} objects as strings in SeRQL syntax *

    - * + * * @author Michael Grove */ public class SeRQLQueryRenderer implements QueryRenderer { diff --git a/core/queryrender/src/main/java/org/eclipse/rdf4j/queryrender/serql/SerqlTupleExprRenderer.java b/core/queryrender/src/main/java/org/eclipse/rdf4j/queryrender/serql/SerqlTupleExprRenderer.java index 6d57ccb721a..6393b9b9a92 100644 --- a/core/queryrender/src/main/java/org/eclipse/rdf4j/queryrender/serql/SerqlTupleExprRenderer.java +++ b/core/queryrender/src/main/java/org/eclipse/rdf4j/queryrender/serql/SerqlTupleExprRenderer.java @@ -29,7 +29,7 @@ *

    * Renders a {@link TupleExpr} into SeRQL Syntax *

    - * + * * @author Michael Grove */ class SerqlTupleExprRenderer extends BaseTupleExprRenderer { @@ -190,7 +190,7 @@ public String render(TupleExpr theExpr) throws Exception { /** * Renders the tuple expression as a query string. It creates a new SerqlTupleExprRenderer rather than reusing this * one. - * + * * @param theExpr the expr to render * @return the rendered expression * @throws Exception if there is an error while rendering @@ -244,7 +244,7 @@ public void meet(Intersection theOp) throws Exception { /** * Render a StatementPattern - * + * * @param thePattern the pattern to render * @return the rendered pattern * @throws Exception if there is an error while rendering diff --git a/core/queryrender/src/main/java/org/eclipse/rdf4j/queryrender/serql/SerqlValueExprRenderer.java b/core/queryrender/src/main/java/org/eclipse/rdf4j/queryrender/serql/SerqlValueExprRenderer.java index 592105b78c7..dcae16ea35d 100644 --- a/core/queryrender/src/main/java/org/eclipse/rdf4j/queryrender/serql/SerqlValueExprRenderer.java +++ b/core/queryrender/src/main/java/org/eclipse/rdf4j/queryrender/serql/SerqlValueExprRenderer.java @@ -49,7 +49,7 @@ *

    * Renders a {@link ValueExpr} into SeRQL syntax. *

    - * + * * @author Michael Grove */ class SerqlValueExprRenderer extends AbstractQueryModelVisitor { @@ -68,7 +68,7 @@ public void reset() { /** * Return the rendering of the ValueExpr object - * + * * @param theExpr the expression to render * @return the rendering * @throws Exception if there is an error while rendering diff --git a/core/queryrender/src/main/java/org/eclipse/rdf4j/queryrender/sparql/ContextCollector.java b/core/queryrender/src/main/java/org/eclipse/rdf4j/queryrender/sparql/ContextCollector.java index 30c3e3d25af..738239e9cfc 100644 --- a/core/queryrender/src/main/java/org/eclipse/rdf4j/queryrender/sparql/ContextCollector.java +++ b/core/queryrender/src/main/java/org/eclipse/rdf4j/queryrender/sparql/ContextCollector.java @@ -27,7 +27,7 @@ * algebra. The context for a node is set on the highest node in the tree. That is, everything below it shares the same * context. *

    - * + * * @author Blazej Bulka */ public class ContextCollector extends AbstractQueryModelVisitor { diff --git a/core/queryrender/src/main/java/org/eclipse/rdf4j/queryrender/sparql/SPARQLQueryRenderer.java b/core/queryrender/src/main/java/org/eclipse/rdf4j/queryrender/sparql/SPARQLQueryRenderer.java index 669907c8c62..dcec6cb7faa 100644 --- a/core/queryrender/src/main/java/org/eclipse/rdf4j/queryrender/sparql/SPARQLQueryRenderer.java +++ b/core/queryrender/src/main/java/org/eclipse/rdf4j/queryrender/sparql/SPARQLQueryRenderer.java @@ -22,7 +22,7 @@ *

    * Implementation of the {@link QueryRenderer} interface which renders queries into the SPARQL syntax. *

    - * + * * @author Michael Grove */ public class SPARQLQueryRenderer implements QueryRenderer { diff --git a/core/queryrender/src/main/java/org/eclipse/rdf4j/queryrender/sparql/SparqlTupleExprRenderer.java b/core/queryrender/src/main/java/org/eclipse/rdf4j/queryrender/sparql/SparqlTupleExprRenderer.java index 725fb243c50..d7dfcd0e8a6 100644 --- a/core/queryrender/src/main/java/org/eclipse/rdf4j/queryrender/sparql/SparqlTupleExprRenderer.java +++ b/core/queryrender/src/main/java/org/eclipse/rdf4j/queryrender/sparql/SparqlTupleExprRenderer.java @@ -28,7 +28,7 @@ *

    * Extends the BaseTupleExprRenderer to provide support for rendering tuple expressions as SPARQL queries. *

    - * + * * @author Michael Grove */ public final class SparqlTupleExprRenderer extends BaseTupleExprRenderer { @@ -156,7 +156,7 @@ public void meet(LeftJoin theJoin) throws Exception { /** * Renders the tuple expression as a query string. It creates a new SparqlTupleExprRenderer rather than reusing this * one. - * + * * @param theExpr the expr to render * @return the rendered expression * @throws Exception if there is an error while rendering diff --git a/core/queryrender/src/main/java/org/eclipse/rdf4j/queryrender/sparql/SparqlValueExprRenderer.java b/core/queryrender/src/main/java/org/eclipse/rdf4j/queryrender/sparql/SparqlValueExprRenderer.java index 69c76a43acc..003cb54b98e 100644 --- a/core/queryrender/src/main/java/org/eclipse/rdf4j/queryrender/sparql/SparqlValueExprRenderer.java +++ b/core/queryrender/src/main/java/org/eclipse/rdf4j/queryrender/sparql/SparqlValueExprRenderer.java @@ -50,7 +50,7 @@ *

    * Renders a {@link ValueExpr} into SPARQL syntax. *

    - * + * * @author Michael Grove */ final class SparqlValueExprRenderer extends AbstractQueryModelVisitor { @@ -69,7 +69,7 @@ public void reset() { /** * Return the rendering of the ValueExpr object - * + * * @param theExpr the expression to render * @return the rendering * @throws Exception if there is an error while rendering @@ -160,7 +160,7 @@ public void meet(In theOp) throws Exception { /** * Renders the tuple expression as a query string. - * + * * @param theExpr the expr to render * @return the rendered expression * @throws Exception if there is an error while rendering diff --git a/core/queryresultio/api/pom.xml b/core/queryresultio/api/pom.xml index 49b9aa71952..c53916aac87 100644 --- a/core/queryresultio/api/pom.xml +++ b/core/queryresultio/api/pom.xml @@ -4,7 +4,7 @@ org.eclipse.rdf4j rdf4j-queryresultio - 3.1.5-SNAPSHOT + 3.2.2-SNAPSHOT rdf4j-queryresultio-api RDF4J: Query result IO - API diff --git a/core/queryresultio/api/src/main/java/org/eclipse/rdf4j/query/resultio/AbstractQueryResultParser.java b/core/queryresultio/api/src/main/java/org/eclipse/rdf4j/query/resultio/AbstractQueryResultParser.java index 200ec79cbf7..58e32e01a4d 100644 --- a/core/queryresultio/api/src/main/java/org/eclipse/rdf4j/query/resultio/AbstractQueryResultParser.java +++ b/core/queryresultio/api/src/main/java/org/eclipse/rdf4j/query/resultio/AbstractQueryResultParser.java @@ -17,6 +17,7 @@ import org.eclipse.rdf4j.rio.ParseLocationListener; import org.eclipse.rdf4j.rio.ParserConfig; import org.eclipse.rdf4j.rio.RioSetting; +import org.eclipse.rdf4j.rio.helpers.BasicParserSettings; /** * Base class for {@link QueryResultParser}s offering common functionality for query result parsers. @@ -84,6 +85,9 @@ public QueryResultParser setValueFactory(ValueFactory valueFactory) { @Override public QueryResultParser setQueryResultHandler(QueryResultHandler handler) { + if (getParserConfig().get(BasicParserSettings.PROCESS_ENCODED_RDF_STAR)) { + handler = new RDFStarDecodingQueryResultHandler(handler); + } this.handler = handler; return this; } diff --git a/core/queryresultio/api/src/main/java/org/eclipse/rdf4j/query/resultio/AbstractQueryResultWriter.java b/core/queryresultio/api/src/main/java/org/eclipse/rdf4j/query/resultio/AbstractQueryResultWriter.java index 4b576629a04..136f3639cf6 100644 --- a/core/queryresultio/api/src/main/java/org/eclipse/rdf4j/query/resultio/AbstractQueryResultWriter.java +++ b/core/queryresultio/api/src/main/java/org/eclipse/rdf4j/query/resultio/AbstractQueryResultWriter.java @@ -7,26 +7,46 @@ *******************************************************************************/ package org.eclipse.rdf4j.query.resultio; +import java.io.OutputStream; import java.util.Collection; import java.util.Collections; +import java.util.List; +import java.util.Optional; +import org.eclipse.rdf4j.query.BindingSet; +import org.eclipse.rdf4j.query.TupleQueryResultHandlerException; import org.eclipse.rdf4j.rio.RioSetting; import org.eclipse.rdf4j.rio.WriterConfig; import org.eclipse.rdf4j.rio.helpers.BasicWriterSettings; +import org.eclipse.rdf4j.rio.helpers.RDFStarUtil; /** * Base class for {@link QueryResultWriter}s offering common functionality for query result writers. - * + * * @author Peter Ansell */ public abstract class AbstractQueryResultWriter implements QueryResultWriter { private WriterConfig writerConfig = new WriterConfig(); + private final OutputStream outputStream; + + private boolean encodeRDFStar; /** * Default constructor. + * */ protected AbstractQueryResultWriter() { + this(null); + } + + protected AbstractQueryResultWriter(OutputStream out) { + this.outputStream = out; + } + + @Override + public Optional getOutputStream() { + return Optional.ofNullable(outputStream); } @Override @@ -44,6 +64,38 @@ public Collection> getSupportedSettings() { return Collections.emptyList(); } + @Override + public void startQueryResult(List bindingNames) throws TupleQueryResultHandlerException { + // Formats without native RDF* support obey the ENCODE_RDF_STAR setting and may encode RDF* triples to IRIs + encodeRDFStar = this instanceof TupleQueryResultWriter + && !((TupleQueryResultWriter) this).getTupleQueryResultFormat().supportsRDFStar() + && getWriterConfig().get(BasicWriterSettings.ENCODE_RDF_STAR); + } + + @Override + public void handleSolution(BindingSet bindingSet) throws TupleQueryResultHandlerException { + if (encodeRDFStar) { + handleSolutionImpl(new ValueMappingBindingSet(bindingSet, RDFStarUtil::toRDFEncodedValue)); + } else { + handleSolutionImpl(bindingSet); + } + } + + /** + * Extending classes must implement this method instead of overriding {@link #handleSolution(BindingSet)} in order + * to benefit from automatic handling of RDF* encoding. + * + * @param bindings the solution to handle + * @throws TupleQueryResultHandlerException + * + * @implNote this temporary implementation throws an {@link UnsupportedOperationException} and is only provided for + * backward compatility. + * @since 3.2.0 + */ + protected void handleSolutionImpl(BindingSet bindings) throws TupleQueryResultHandlerException { + throw new UnsupportedOperationException(); + } + protected boolean xsdStringToPlainLiteral() { return getWriterConfig().get(BasicWriterSettings.XSD_STRING_TO_PLAIN_LITERAL); } diff --git a/core/queryresultio/api/src/main/java/org/eclipse/rdf4j/query/resultio/BasicQueryWriterSettings.java b/core/queryresultio/api/src/main/java/org/eclipse/rdf4j/query/resultio/BasicQueryWriterSettings.java index 348761e3331..73576e7dc8e 100644 --- a/core/queryresultio/api/src/main/java/org/eclipse/rdf4j/query/resultio/BasicQueryWriterSettings.java +++ b/core/queryresultio/api/src/main/java/org/eclipse/rdf4j/query/resultio/BasicQueryWriterSettings.java @@ -12,7 +12,7 @@ /** * {@link RioSetting} constants to use with {@link QueryResultWriter}s. - * + * * @author Peter Ansell */ public class BasicQueryWriterSettings { @@ -23,7 +23,7 @@ public class BasicQueryWriterSettings { *

    * Defaults to false. */ - public final static RioSetting ADD_SESAME_QNAME = new RioSettingImpl( + public final static RioSetting ADD_SESAME_QNAME = new RioSettingImpl<>( "org.eclipse.rdf4j.query.resultio.addsesameqname", "Add Sesame QName", false); /** @@ -32,7 +32,7 @@ public class BasicQueryWriterSettings { *

    * Defaults to "sesamecallback". */ - public static final RioSetting JSONP_CALLBACK = new RioSettingImpl( + public static final RioSetting JSONP_CALLBACK = new RioSettingImpl<>( "org.eclipse.rdf4j.query.resultio.jsonpcallback", "JSONP callback function", "sesamecallback"); /** diff --git a/core/queryresultio/api/src/main/java/org/eclipse/rdf4j/query/resultio/BooleanQueryResultFormat.java b/core/queryresultio/api/src/main/java/org/eclipse/rdf4j/query/resultio/BooleanQueryResultFormat.java index 3dcf8880177..192d5dedb66 100644 --- a/core/queryresultio/api/src/main/java/org/eclipse/rdf4j/query/resultio/BooleanQueryResultFormat.java +++ b/core/queryresultio/api/src/main/java/org/eclipse/rdf4j/query/resultio/BooleanQueryResultFormat.java @@ -18,7 +18,7 @@ * Represents the concept of a boolean query result serialization format. Boolean query result formats are identified by * a {@link #getName() name} and can have one or more associated MIME types, zero or more associated file extensions and * can specify a (default) character encoding. - * + * * @author Arjohn Kampman */ public class BooleanQueryResultFormat extends QueryResultFormat { @@ -38,8 +38,11 @@ public class BooleanQueryResultFormat extends QueryResultFormat { * SPARQL Query Results JSON Format. */ public static final BooleanQueryResultFormat JSON = new BooleanQueryResultFormat("SPARQL/JSON", - Arrays.asList("application/sparql-results+json", "application/json"), StandardCharsets.UTF_8, - Arrays.asList("srj", "json"), SPARQL_RESULTS_JSON_URI); + // Note: The MIME type for SPARQL* JSON is handled by this format in order to handle BooleanQueryResult + // when SPARQL* JSON is requested. + Arrays.asList("application/sparql-results+json", "application/json", + "application/x-sparqlstar-results+json"), + StandardCharsets.UTF_8, Arrays.asList("srj", "json"), SPARQL_RESULTS_JSON_URI); /** * Plain text encoding using values "true" and "false" (case-insensitive). @@ -53,7 +56,7 @@ public class BooleanQueryResultFormat extends QueryResultFormat { /** * Creates a new BooleanQueryResultFormat object. - * + * * @param name The name of the format, e.g. "SPARQL/XML". * @param mimeType The MIME type of the format, e.g. application/sparql-results+xml for the SPARQL/XML * format. @@ -65,7 +68,7 @@ public BooleanQueryResultFormat(String name, String mimeType, String fileExt) { /** * Creates a new BooleanQueryResultFormat object. - * + * * @param name The name of the format, e.g. "SPARQL/XML". * @param mimeType The MIME type of the format, e.g. application/sparql-results+xml for the SPARQL/XML * format. @@ -78,7 +81,7 @@ public BooleanQueryResultFormat(String name, String mimeType, Charset charset, S /** * Creates a new BooleanQueryResultFormat object. - * + * * @param name The name of the format, e.g. "SPARQL/XML". * @param mimeTypes The MIME types of the format, e.g. application/sparql-results+xml for the * SPARQL/XML format. The first item in the list is interpreted as the default MIME type for @@ -94,7 +97,7 @@ public BooleanQueryResultFormat(String name, Collection mimeTypes, Chars /** * Creates a new BooleanQueryResultFormat object. - * + * * @param name The name of the format, e.g. "SPARQL/XML". * @param mimeTypes The MIME types of the format, e.g. application/sparql-results+xml for the * SPARQL/XML format. The first item in the list is interpreted as the default MIME type for diff --git a/core/queryresultio/api/src/main/java/org/eclipse/rdf4j/query/resultio/BooleanQueryResultParser.java b/core/queryresultio/api/src/main/java/org/eclipse/rdf4j/query/resultio/BooleanQueryResultParser.java index 0f164224acb..32f14225de6 100644 --- a/core/queryresultio/api/src/main/java/org/eclipse/rdf4j/query/resultio/BooleanQueryResultParser.java +++ b/core/queryresultio/api/src/main/java/org/eclipse/rdf4j/query/resultio/BooleanQueryResultParser.java @@ -12,7 +12,7 @@ /** * A general interface for boolean query result parsers. - * + * * @author Arjohn Kampman */ public interface BooleanQueryResultParser extends QueryResultParser { @@ -24,7 +24,7 @@ public interface BooleanQueryResultParser extends QueryResultParser { /** * Parses the data from the supplied InputStream. - * + * * @param in The InputStream from which to read the data. * @throws IOException If an I/O error occurred while data was read from the InputStream. * @throws QueryResultParseException If the parser has encountered an unrecoverable parse error. diff --git a/core/queryresultio/api/src/main/java/org/eclipse/rdf4j/query/resultio/BooleanQueryResultParserFactory.java b/core/queryresultio/api/src/main/java/org/eclipse/rdf4j/query/resultio/BooleanQueryResultParserFactory.java index 2f66581fbd5..5a7cc3374d3 100644 --- a/core/queryresultio/api/src/main/java/org/eclipse/rdf4j/query/resultio/BooleanQueryResultParserFactory.java +++ b/core/queryresultio/api/src/main/java/org/eclipse/rdf4j/query/resultio/BooleanQueryResultParserFactory.java @@ -9,7 +9,7 @@ /** * Returns {@link BooleanQueryResultParser}s for a specific boolean query result format. - * + * * @author Arjohn Kampman */ public interface BooleanQueryResultParserFactory { diff --git a/core/queryresultio/api/src/main/java/org/eclipse/rdf4j/query/resultio/BooleanQueryResultParserRegistry.java b/core/queryresultio/api/src/main/java/org/eclipse/rdf4j/query/resultio/BooleanQueryResultParserRegistry.java index b144e0dae26..5093e75752f 100644 --- a/core/queryresultio/api/src/main/java/org/eclipse/rdf4j/query/resultio/BooleanQueryResultParserRegistry.java +++ b/core/queryresultio/api/src/main/java/org/eclipse/rdf4j/query/resultio/BooleanQueryResultParserRegistry.java @@ -11,7 +11,7 @@ /** * A registry that keeps track of the available {@link BooleanQueryResultParserFactory}s. - * + * * @author Arjohn Kampman */ public class BooleanQueryResultParserRegistry @@ -27,7 +27,7 @@ private static class BooleanQueryResultParserRegistryHolder { /** * Gets the default BooleanQueryResultParserRegistry. - * + * * @return The default registry. */ public static BooleanQueryResultParserRegistry getInstance() { diff --git a/core/queryresultio/api/src/main/java/org/eclipse/rdf4j/query/resultio/BooleanQueryResultWriter.java b/core/queryresultio/api/src/main/java/org/eclipse/rdf4j/query/resultio/BooleanQueryResultWriter.java index afc36878668..e2653fd07c8 100644 --- a/core/queryresultio/api/src/main/java/org/eclipse/rdf4j/query/resultio/BooleanQueryResultWriter.java +++ b/core/queryresultio/api/src/main/java/org/eclipse/rdf4j/query/resultio/BooleanQueryResultWriter.java @@ -13,14 +13,14 @@ /** * The interface of objects that writer query results in a specific query result format. - * + * * @author Arjohn Kampman */ public interface BooleanQueryResultWriter extends QueryResultWriter, BooleanQueryResultHandler { /** * Writes the specified boolean value. - * + * * @deprecated Use {@link #handleBoolean(boolean)} instead. */ void write(boolean value) throws IOException; diff --git a/core/queryresultio/api/src/main/java/org/eclipse/rdf4j/query/resultio/BooleanQueryResultWriterFactory.java b/core/queryresultio/api/src/main/java/org/eclipse/rdf4j/query/resultio/BooleanQueryResultWriterFactory.java index a85e7c3c485..79ff4cae9ad 100644 --- a/core/queryresultio/api/src/main/java/org/eclipse/rdf4j/query/resultio/BooleanQueryResultWriterFactory.java +++ b/core/queryresultio/api/src/main/java/org/eclipse/rdf4j/query/resultio/BooleanQueryResultWriterFactory.java @@ -11,7 +11,7 @@ /** * Returns {@link BooleanQueryResultWriter}s for a specific boolean query result format. - * + * * @author Arjohn Kampman */ public interface BooleanQueryResultWriterFactory { @@ -23,7 +23,7 @@ public interface BooleanQueryResultWriterFactory { /** * Returns a {@link BooleanQueryResultWriter} instance that will write to the supplied output stream. - * + * * @param out The OutputStream to write the result to. */ BooleanQueryResultWriter getWriter(OutputStream out); diff --git a/core/queryresultio/api/src/main/java/org/eclipse/rdf4j/query/resultio/BooleanQueryResultWriterRegistry.java b/core/queryresultio/api/src/main/java/org/eclipse/rdf4j/query/resultio/BooleanQueryResultWriterRegistry.java index d62a1e7e16c..30ebe5ab6db 100644 --- a/core/queryresultio/api/src/main/java/org/eclipse/rdf4j/query/resultio/BooleanQueryResultWriterRegistry.java +++ b/core/queryresultio/api/src/main/java/org/eclipse/rdf4j/query/resultio/BooleanQueryResultWriterRegistry.java @@ -11,7 +11,7 @@ /** * A registry that keeps track of the available {@link BooleanQueryResultWriterFactory}s. - * + * * @author Arjohn Kampman */ public class BooleanQueryResultWriterRegistry @@ -27,7 +27,7 @@ private static class BooleanQueryResultWriterRegistryHolder { /** * Gets the default BooleanQueryResultWriterRegistry. - * + * * @return The default registry. */ public static BooleanQueryResultWriterRegistry getInstance() { diff --git a/core/queryresultio/api/src/main/java/org/eclipse/rdf4j/query/resultio/QueryResultFormat.java b/core/queryresultio/api/src/main/java/org/eclipse/rdf4j/query/resultio/QueryResultFormat.java index 7f15a99b1b0..56601e1d5af 100644 --- a/core/queryresultio/api/src/main/java/org/eclipse/rdf4j/query/resultio/QueryResultFormat.java +++ b/core/queryresultio/api/src/main/java/org/eclipse/rdf4j/query/resultio/QueryResultFormat.java @@ -17,7 +17,7 @@ /** * The base class of all file formats that represent the results of queries. Currently this includes tuple and boolean * queries. - * + * * @author Peter Ansell */ public class QueryResultFormat extends FileFormat { @@ -48,7 +48,7 @@ public class QueryResultFormat extends FileFormat { /** * A standard URI published by the W3C or another standards body to uniquely denote this format. - * + * * @see Unique URIs for File Formats */ private IRI standardURI; @@ -120,4 +120,4 @@ public boolean hasStandardURI() { public IRI getStandardURI() { return standardURI; } -} \ No newline at end of file +} diff --git a/core/queryresultio/api/src/main/java/org/eclipse/rdf4j/query/resultio/QueryResultIO.java b/core/queryresultio/api/src/main/java/org/eclipse/rdf4j/query/resultio/QueryResultIO.java index 339a59a426a..3ff542741b1 100644 --- a/core/queryresultio/api/src/main/java/org/eclipse/rdf4j/query/resultio/QueryResultIO.java +++ b/core/queryresultio/api/src/main/java/org/eclipse/rdf4j/query/resultio/QueryResultIO.java @@ -35,14 +35,14 @@ /** * Class offering utility methods related to query results. - * + * * @author Arjohn Kampman */ public class QueryResultIO { /** * Tries to match a MIME type against the list of tuple query result formats that can be parsed. - * + * * @param mimeType A MIME type, e.g. "application/sparql-results+xml". * @return An RDFFormat object if a match was found, or {@link Optional#empty()} otherwise. */ @@ -52,7 +52,7 @@ public static Optional getParserFormatForMIMEType(String mime /** * Tries to match the extension of a file name against the list of RDF formats that can be parsed. - * + * * @param fileName A file name. * @return An TupleQueryResultFormat object if a match was found, or {@link Optional#empty()} otherwise. */ @@ -62,7 +62,7 @@ public static Optional getParserFormatForFileName(String file /** * Tries to match a MIME type against the list of tuple query result formats that can be written. - * + * * @param mimeType A MIME type, e.g. "application/sparql-results+xml". * @return An TupleQueryResultFormat object if a match was found, or {@link Optional#empty()} otherwise. */ @@ -72,7 +72,7 @@ public static Optional getWriterFormatForMIMEType(String mime /** * Tries to match the extension of a file name against the list of RDF formats that can be written. - * + * * @param fileName A file name. * @return An TupleQueryResultFormat object if a match was found, or {@link Optional#empty()} otherwise. */ @@ -82,7 +82,7 @@ public static Optional getWriterFormatForFileName(String file /** * Tries to match a MIME type against the list of boolean query result formats that can be parsed. - * + * * @param mimeType A MIME type, e.g. "application/sparql-results+xml". * @return An RDFFormat object if a match was found, or {@link Optional#empty()} otherwise. */ @@ -92,7 +92,7 @@ public static Optional getBooleanParserFormatForMIMEType(Stri /** * Tries to match the extension of a file name against the list of RDF formats that can be parsed. - * + * * @param fileName A file name. * @return An BooleanQueryResultFormat object if a match was found, or {@link Optional#empty()} otherwise. */ @@ -102,7 +102,7 @@ public static Optional getBooleanParserFormatForFileName(Stri /** * Tries to match a MIME type against the list of boolean query result formats that can be written. - * + * * @param mimeType A MIME type, e.g. "application/sparql-results+xml". * @return An BooleanQueryResultFormat object if a match was found, or {@link Optional#empty()} otherwise. */ @@ -112,7 +112,7 @@ public static Optional getBooleanWriterFormatForMIMEType(Stri /** * Tries to match the extension of a file name against the list of RDF formats that can be written. - * + * * @param fileName A file name. * @return An BooleanQueryResultFormat object if a match was found, or {@link Optional#empty()} otherwise. */ @@ -124,7 +124,7 @@ public static Optional getBooleanWriterFormatForFileName(Stri * Convenience methods for creating TupleQueryResultParser objects. This method uses the registry returned by * {@link TupleQueryResultParserRegistry#getInstance()} to get a factory for the specified format and uses this * factory to create the appropriate parser. - * + * * @return A TupleQueryResultParser matching the given format. * @throws UnsupportedQueryResultFormatException If no parser is available for the specified tuple query result * format. @@ -142,7 +142,7 @@ public static TupleQueryResultParser createTupleParser(QueryResultFormat format) /** * Convenience methods for creating TupleQueryResultParser objects that use the specified ValueFactory to create RDF * model objects. - * + * * @param format * @param valueFactory * @return A TupleQueryResultParser matching the given format. @@ -161,7 +161,7 @@ public static TupleQueryResultParser createTupleParser(QueryResultFormat format, * Convenience methods for creating TupleQueryResultWriter objects.This method uses the registry returned by * {@link TupleQueryResultWriterRegistry#getInstance()} to get a factory for the specified format and uses this * factory to create the appropriate writer. - * + * * @param format * @param out * @return A TupleQueryResultWriter matching the given format. @@ -182,7 +182,7 @@ public static TupleQueryResultWriter createTupleWriter(QueryResultFormat format, * Convenience methods for creating BooleanQueryResultParser objects.This method uses the registry returned by * {@link BooleanQueryResultParserRegistry#getInstance()} to get a factory for the specified format and uses this * factory to create the appropriate parser. - * + * * @param format * @return A BooleanQueryResultParser matching the given format. * @throws UnsupportedQueryResultFormatException If no parser is available for the specified boolean query result @@ -202,7 +202,7 @@ public static BooleanQueryResultParser createBooleanParser(QueryResultFormat for * Convenience methods for creating BooleanQueryResultWriter objects.This method uses the registry returned by * {@link BooleanQueryResultWriterRegistry#getInstance()} to get a factory for the specified format and uses this * factory to create the appropriate writer. - * + * * @param format * @param out * @return A BooleanQueryResultWriter matching the given format. @@ -223,7 +223,7 @@ public static BooleanQueryResultWriter createBooleanWriter(QueryResultFormat for * Convenience methods for creating QueryResultWriter objects.This method uses the registry returned by * {@link TupleQueryResultWriterRegistry#getInstance()} to get a factory for the specified format and uses this * factory to create the appropriate writer. - * + * * @param format * @param out * @return A QueryResultWriter matching the given format. @@ -255,7 +255,7 @@ public static QueryResultWriter createWriter(QueryResultFormat format, OutputStr /** * Parses a query result document, reporting the parsed solutions to the supplied TupleQueryResultHandler. - * + * * @param in An InputStream to read the query result document from. * @param format The query result format of the document to parse. Supported formats are * {@link TupleQueryResultFormat#SPARQL} and {@link TupleQueryResultFormat#BINARY}. @@ -287,7 +287,7 @@ public static void parseTuple(InputStream in, QueryResultFormat format, TupleQue /** * Parses a query result document and returns it as a TupleQueryResult object. - * + * * @param in An InputStream to read the query result document from. * @param format The query result format of the document to parse. Supported formats are * {@link TupleQueryResultFormat#SPARQL} and {@link TupleQueryResultFormat#BINARY}. @@ -308,7 +308,7 @@ public static TupleQueryResult parseTuple(InputStream in, QueryResultFormat form * thread in the background.
    * IMPORTANT: As this method may spawn a new thread in the background, it is vitally important that the * TupleQueryResult be closed consistently when it is no longer required, to prevent resource leaks. - * + * * @param in An InputStream to read the query result document from. * @param format The query result format of the document to parse. Supported formats are * {@link TupleQueryResultFormat#SPARQL} and {@link TupleQueryResultFormat#BINARY}. @@ -362,7 +362,7 @@ private static TupleQueryResult parseTupleInternal(InputStream in, QueryResultFo /** * Parses a boolean query result document and returns the parsed value. - * + * * @param in An InputStream to read the query result document from. * @param format The file format of the document to parse. * @return A boolean representing the result of parsing the given InputStream. @@ -391,7 +391,7 @@ public static boolean parseBoolean(InputStream in, QueryResultFormat format) /** * Writes a query result document in a specific query result format to an output stream. - * + * * @param tqr The query result to write. * @param format The file format of the document to write. * @param out An OutputStream to write the document to. @@ -421,7 +421,7 @@ public static void writeTuple(TupleQueryResult tqr, QueryResultFormat format, Ou /** * Writes a boolean query result document in a specific boolean query result format to an output stream. - * + * * @param value The value to write. * @param format The file format of the document to write. * @param out An OutputStream to write the document to. @@ -439,7 +439,7 @@ public static void writeBoolean(boolean value, QueryResultFormat format, OutputS /** * Writes a graph query result document in a specific RDF format to an output stream. - * + * * @param gqr The query result to write. * @param format The file format of the document to write. * @param out An OutputStream to write the document to. diff --git a/core/queryresultio/api/src/main/java/org/eclipse/rdf4j/query/resultio/QueryResultParseException.java b/core/queryresultio/api/src/main/java/org/eclipse/rdf4j/query/resultio/QueryResultParseException.java index 09847aadc2c..3b0efa06fb1 100644 --- a/core/queryresultio/api/src/main/java/org/eclipse/rdf4j/query/resultio/QueryResultParseException.java +++ b/core/queryresultio/api/src/main/java/org/eclipse/rdf4j/query/resultio/QueryResultParseException.java @@ -12,7 +12,7 @@ /** * A parse exception that can be thrown by a query result parser when it encounters an error from which it cannot or * doesn't want to recover. - * + * * @author Arjohn Kampman */ public class QueryResultParseException extends RDF4JException { @@ -37,7 +37,7 @@ public class QueryResultParseException extends RDF4JException { /** * Creates a new QueryResultParseException. - * + * * @param msg An error message. */ public QueryResultParseException(String msg) { @@ -46,7 +46,7 @@ public QueryResultParseException(String msg) { /** * Creates a new QueryResultParseException wrapping another exception. - * + * * @param msg An error message. * @param t The source exception. */ @@ -56,7 +56,7 @@ public QueryResultParseException(String msg, Throwable t) { /** * Creates a new QueryResultParseException. - * + * * @param msg An error message. * @param lineNo A line number associated with the message. * @param columnNo A column number associated with the message. @@ -70,7 +70,7 @@ public QueryResultParseException(String msg, long lineNo, long columnNo) { /** * Creates a new QueryResultParseException wrapping another exception. The QueryResultParseException will inherit * its message from the supplied source exception. - * + * * @param t The source exception. */ public QueryResultParseException(Throwable t) { @@ -80,7 +80,7 @@ public QueryResultParseException(Throwable t) { /** * Creates a new QueryResultParseException wrapping another exception. The QueryResultParseException will inherit * its message from the supplied source exception. - * + * * @param t The source exception. * @param lineNo A line number associated with the message. * @param columnNo A column number associated with the message. @@ -93,7 +93,7 @@ public QueryResultParseException(Throwable t, long lineNo, long columnNo) { /** * Creates a new QueryResultParseException wrapping another exception. - * + * * @param msg An error message. * @param t The source exception. * @param lineNo A line number associated with the message. @@ -111,7 +111,7 @@ public QueryResultParseException(String msg, Throwable t, long lineNo, long colu /** * Gets the line number associated with this parse exception. - * + * * @return A line number, or -1 if no line number is available or applicable. */ public long getLineNumber() { @@ -120,7 +120,7 @@ public long getLineNumber() { /** * Gets the column number associated with this parse exception. - * + * * @return A column number, or -1 if no column number is available or applicable. */ public long getColumnNumber() { diff --git a/core/queryresultio/api/src/main/java/org/eclipse/rdf4j/query/resultio/QueryResultParser.java b/core/queryresultio/api/src/main/java/org/eclipse/rdf4j/query/resultio/QueryResultParser.java index caeff8b5cf5..875ddcb03df 100644 --- a/core/queryresultio/api/src/main/java/org/eclipse/rdf4j/query/resultio/QueryResultParser.java +++ b/core/queryresultio/api/src/main/java/org/eclipse/rdf4j/query/resultio/QueryResultParser.java @@ -21,14 +21,14 @@ /** * Base interface for parsers of query results in both boolean and tuple forms. - * + * * @author Peter Ansell */ public interface QueryResultParser { /** * Gets the query result format that this parser can parse. - * + * * @return The {@link QueryResultFormat} supported by this parser. */ QueryResultFormat getQueryResultFormat(); @@ -36,21 +36,21 @@ public interface QueryResultParser { /** * Sets the {@link QueryResultHandler} to be used when parsing query results using * {@link #parseQueryResult(InputStream)}. - * + * * @param handler The {@link QueryResultHandler} to use for handling results. */ QueryResultParser setQueryResultHandler(QueryResultHandler handler); /** * Sets the ValueFactory that the parser will use to create Value objects for the parsed query result. - * + * * @param valueFactory The value factory that the parser should use. */ QueryResultParser setValueFactory(ValueFactory valueFactory); /** * Sets the ParseErrorListener that will be notified of any errors that this parser finds during parsing. - * + * * @param el The ParseErrorListener that will be notified of errors or warnings. * @return Either a copy of this parser, if it is immutable, or this object, to allow chaining of method calls. */ @@ -58,7 +58,7 @@ public interface QueryResultParser { /** * Sets the ParseLocationListener that will be notified of the parser's progress during the parse process. - * + * * @param ll The ParseLocationListener that will be notified of the parser's progress. * @return Either a copy of this parser, if it is immutable, or this object, to allow chaining of method calls. */ @@ -67,7 +67,7 @@ public interface QueryResultParser { /** * Parse the query results out of the given {@link InputStream} into the handler setup using * {@link #setQueryResultHandler(QueryResultHandler)}. - * + * * @param in The {@link InputStream} to parse the results from. * @throws IOException If there is an exception from the InputStream. * @throws QueryResultParseException If the query results are not parsable by this parser. @@ -78,14 +78,14 @@ public interface QueryResultParser { /** * Sets all supplied parser configuration options. - * + * * @param config a parser configuration object. */ QueryResultParser setParserConfig(ParserConfig config); /** * Retrieves the current parser configuration as a single object. - * + * * @return a parser configuration object representing the current configuration of the parser. */ ParserConfig getParserConfig(); @@ -97,7 +97,7 @@ public interface QueryResultParser { /** * Set a setting on the parser, and return this parser object to allow chaining. - * + * * @param setting The setting to change. * @param value The value to change. * @return Either a copy of this parser, if it is immutable, or this object, to allow chaining of method calls. diff --git a/core/queryresultio/api/src/main/java/org/eclipse/rdf4j/query/resultio/QueryResultWriter.java b/core/queryresultio/api/src/main/java/org/eclipse/rdf4j/query/resultio/QueryResultWriter.java index a27aae606f4..3701cad74c2 100644 --- a/core/queryresultio/api/src/main/java/org/eclipse/rdf4j/query/resultio/QueryResultWriter.java +++ b/core/queryresultio/api/src/main/java/org/eclipse/rdf4j/query/resultio/QueryResultWriter.java @@ -7,8 +7,12 @@ *******************************************************************************/ package org.eclipse.rdf4j.query.resultio; +import java.io.OutputStream; import java.util.Collection; +import java.util.Optional; +import org.eclipse.rdf4j.common.annotation.Experimental; +import org.eclipse.rdf4j.common.annotation.InternalUseOnly; import org.eclipse.rdf4j.query.QueryResultHandler; import org.eclipse.rdf4j.query.QueryResultHandlerException; import org.eclipse.rdf4j.rio.RioSetting; @@ -16,7 +20,7 @@ /** * The base interface for writers of query results sets and boolean results. - * + * * @author Peter Ansell */ public interface QueryResultWriter extends QueryResultHandler { @@ -26,12 +30,28 @@ public interface QueryResultWriter extends QueryResultHandler { */ QueryResultFormat getQueryResultFormat(); + /** + * Gets the {@link OutputStream} this writer writes to, if it uses one. + * + * @return an optional OutputStream + * @implNote This temporary default method is only supplied for backward compatibility. Concrete implementations are + * expected to override. + * @apiNote This method is currently considered experimental / for internal use only, and is likely to change in a + * future release without guarantees for backward compatibility. Use at your own risk. + * @since 3.2.0 + */ + @InternalUseOnly + @Experimental + default Optional getOutputStream() { + return Optional.empty(); + } + /** * Handles a namespace prefix declaration. If this is called, it should be called before {@link #startDocument()} to * ensure that it has a document wide effect. *

    * NOTE: If the format does not support namespaces, it must silently ignore calls to this method. - * + * * @param prefix The prefix to use for the namespace * @param uri The full URI that is to be represented by the prefix. * @throws QueryResultHandlerException @@ -40,7 +60,7 @@ public interface QueryResultWriter extends QueryResultHandler { /** * Indicates the start of the document. - * + * * @throws QueryResultHandlerException If there was an error starting the writing of the results. */ void startDocument() throws QueryResultHandlerException; @@ -50,7 +70,7 @@ public interface QueryResultWriter extends QueryResultHandler { * {@link #startHeader}. *

    * NOTE: If the format does not support stylesheets, it must silently ignore calls to this method. - * + * * @param stylesheetUrl The URL of the stylesheet to be used to style the results. * @throws QueryResultHandlerException If there was an error handling the stylesheet. This error is not thrown in * cases where stylesheets are not supported. @@ -59,7 +79,7 @@ public interface QueryResultWriter extends QueryResultHandler { /** * Indicates the start of the header. - * + * * @see SPARQL Query Results XML Format * documentation for head element. * @throws QueryResultHandlerException If there was an error writing the start of the header. @@ -69,21 +89,21 @@ public interface QueryResultWriter extends QueryResultHandler { /** * Indicates the end of the header. This must be called after {@link #startHeader} and before any calls to * {@link #handleSolution}. - * + * * @throws QueryResultHandlerException If there was an error writing the end of the header. */ void endHeader() throws QueryResultHandlerException; /** * Sets all supplied writer configuration options. - * + * * @param config a writer configuration object. */ public void setWriterConfig(WriterConfig config); /** * Retrieves the current writer configuration as a single object. - * + * * @return a writer configuration object representing the current configuration of the writer. */ public WriterConfig getWriterConfig(); diff --git a/core/queryresultio/api/src/main/java/org/eclipse/rdf4j/query/resultio/RDFStarDecodingQueryResultHandler.java b/core/queryresultio/api/src/main/java/org/eclipse/rdf4j/query/resultio/RDFStarDecodingQueryResultHandler.java new file mode 100644 index 00000000000..1d52a8c04ba --- /dev/null +++ b/core/queryresultio/api/src/main/java/org/eclipse/rdf4j/query/resultio/RDFStarDecodingQueryResultHandler.java @@ -0,0 +1,57 @@ +/******************************************************************************* + * Copyright (c) 2020 Eclipse RDF4J contributors. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Distribution License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ +package org.eclipse.rdf4j.query.resultio; + +import java.util.List; + +import org.eclipse.rdf4j.query.BindingSet; +import org.eclipse.rdf4j.query.BooleanQueryResultHandler; +import org.eclipse.rdf4j.query.QueryResultHandler; +import org.eclipse.rdf4j.query.QueryResultHandlerException; +import org.eclipse.rdf4j.query.TupleQueryResultHandler; +import org.eclipse.rdf4j.query.TupleQueryResultHandlerException; +import org.eclipse.rdf4j.rio.helpers.RDFStarUtil; + +/** + * A {@link QueryResultHandler} that delegates all results to another handler and processes RDF* triples encoded as + * special IRIs back to RDF* triple values. + * + * @author Pavel Mihaylov + */ +class RDFStarDecodingQueryResultHandler implements TupleQueryResultHandler, BooleanQueryResultHandler { + private QueryResultHandler delegate; + + RDFStarDecodingQueryResultHandler(QueryResultHandler delegate) { + this.delegate = delegate; + } + + @Override + public void handleBoolean(boolean value) throws QueryResultHandlerException { + delegate.handleBoolean(value); + } + + @Override + public void handleLinks(List linkUrls) throws QueryResultHandlerException { + delegate.handleLinks(linkUrls); + } + + @Override + public void startQueryResult(List bindingNames) throws TupleQueryResultHandlerException { + delegate.startQueryResult(bindingNames); + } + + @Override + public void endQueryResult() throws TupleQueryResultHandlerException { + delegate.endQueryResult(); + } + + @Override + public void handleSolution(BindingSet bindingSet) throws TupleQueryResultHandlerException { + delegate.handleSolution(new ValueMappingBindingSet(bindingSet, RDFStarUtil::fromRDFEncodedValue)); + } +} diff --git a/core/queryresultio/api/src/main/java/org/eclipse/rdf4j/query/resultio/TupleQueryResultFormat.java b/core/queryresultio/api/src/main/java/org/eclipse/rdf4j/query/resultio/TupleQueryResultFormat.java index 1901efd63d9..96cc768e313 100644 --- a/core/queryresultio/api/src/main/java/org/eclipse/rdf4j/query/resultio/TupleQueryResultFormat.java +++ b/core/queryresultio/api/src/main/java/org/eclipse/rdf4j/query/resultio/TupleQueryResultFormat.java @@ -18,7 +18,7 @@ * Represents the concept of an tuple query result serialization format. Tuple query result formats are identified by a * {@link #getName() name} and can have one or more associated MIME types, zero or more associated file extensions and * can specify a (default) character encoding. - * + * * @author Arjohn Kampman */ public class TupleQueryResultFormat extends QueryResultFormat { @@ -27,38 +27,71 @@ public class TupleQueryResultFormat extends QueryResultFormat { * Constants * *-----------*/ + /** + * Indicates that RDF* triples can be serialized natively for this format. + */ + private static final boolean SUPPORTS_RDF_STAR = true; + + /** + * Indicates that RDF* triples will NOT be serialized natively for this format. + */ + private static final boolean NO_RDF_STAR = false; + /** * SPARQL Query Results XML Format. */ public static final TupleQueryResultFormat SPARQL = new TupleQueryResultFormat("SPARQL/XML", Arrays.asList("application/sparql-results+xml", "application/xml"), StandardCharsets.UTF_8, - Arrays.asList("srx", "xml"), SPARQL_RESULTS_XML_URI); + Arrays.asList("srx", "xml"), SPARQL_RESULTS_XML_URI, NO_RDF_STAR); /** * Binary RDF results table format. */ public static final TupleQueryResultFormat BINARY = new TupleQueryResultFormat("BINARY", - "application/x-binary-rdf-results-table", null, "brt"); + "application/x-binary-rdf-results-table", null, "brt", SUPPORTS_RDF_STAR); /** * SPARQL Query Results JSON Format. */ public static final TupleQueryResultFormat JSON = new TupleQueryResultFormat("SPARQL/JSON", Arrays.asList("application/sparql-results+json", "application/json"), StandardCharsets.UTF_8, - Arrays.asList("srj", "json"), SPARQL_RESULTS_JSON_URI); + Arrays.asList("srj", "json"), SPARQL_RESULTS_JSON_URI, NO_RDF_STAR); + + /** + * SPARQL* Query Results JSON Format (like SPARQL JSON but with RDF* support). + */ + public static final TupleQueryResultFormat JSON_STAR = new TupleQueryResultFormat("SPARQL/JSON*", + Arrays.asList("application/x-sparqlstar-results+json"), StandardCharsets.UTF_8, + Arrays.asList("srjs"), null, SUPPORTS_RDF_STAR); /** * SPARQL Query Result CSV Format. */ public static final TupleQueryResultFormat CSV = new TupleQueryResultFormat("SPARQL/CSV", Arrays.asList("text/csv"), - StandardCharsets.UTF_8, Arrays.asList("csv"), SPARQL_RESULTS_CSV_URI); + StandardCharsets.UTF_8, Arrays.asList("csv"), SPARQL_RESULTS_CSV_URI, NO_RDF_STAR); /** * SPARQL Query Result TSV Format. */ public static final TupleQueryResultFormat TSV = new TupleQueryResultFormat("SPARQL/TSV", Arrays.asList("text/tab-separated-values"), StandardCharsets.UTF_8, Arrays.asList("tsv"), - SPARQL_RESULTS_TSV_URI); + SPARQL_RESULTS_TSV_URI, NO_RDF_STAR); + + /** + * SPARQL* Query Results TSV Format (like SPARQL TSV but with RDF* support). + */ + public static final TupleQueryResultFormat TSV_STAR = new TupleQueryResultFormat("SPARQL*/TSV", + Arrays.asList("text/x-tab-separated-values-star", "application/x-sparqlstar-results+tsv"), + StandardCharsets.UTF_8, Arrays.asList("tsvs"), null, SUPPORTS_RDF_STAR); + + /*-----------* + * Variables * + *-----------*/ + + /** + * Flag indicating whether the TupleQueryResultFormat can encode RDF* triples natively. + */ + private final boolean supportsRDFStar; /*--------------* * Constructors * @@ -66,19 +99,34 @@ public class TupleQueryResultFormat extends QueryResultFormat { /** * Creates a new TupleQueryResultFormat object. - * + * * @param name The name of the format, e.g. "SPARQL/XML". * @param mimeType The MIME type of the format, e.g. application/sparql-results+xml for the SPARQL/XML * format. * @param fileExt The (default) file extension for the format, e.g. srx for SPARQL/XML. */ public TupleQueryResultFormat(String name, String mimeType, String fileExt) { - this(name, mimeType, null, fileExt); + this(name, mimeType, null, fileExt, NO_RDF_STAR); + } + + /** + * Creates a new TupleQueryResultFormat object. + * + * @param name The name of the format, e.g. "SPARQL/XML". + * @param mimeType The MIME type of the format, e.g. application/sparql-results+xml for the + * SPARQL/XML format. + * @param fileExt The (default) file extension for the format, e.g. srx for SPARQL/XML. + * @param supportsRDFStar True if the TupleQueryResultFormat supports the encoding of RDF* triples natively + * and false otherwise. + * @since 3.2.0 + */ + public TupleQueryResultFormat(String name, String mimeType, String fileExt, boolean supportsRDFStar) { + this(name, mimeType, null, fileExt, supportsRDFStar); } /** * Creates a new TupleQueryResultFormat object. - * + * * @param name The name of the format, e.g. "SPARQL/XML". * @param mimeType The MIME type of the format, e.g. application/sparql-results+xml for the SPARQL/XML * format. @@ -86,12 +134,30 @@ public TupleQueryResultFormat(String name, String mimeType, String fileExt) { * @param fileExt The (default) file extension for the format, e.g. srx for SPARQL/XML. */ public TupleQueryResultFormat(String name, String mimeType, Charset charset, String fileExt) { + this(name, mimeType, charset, fileExt, NO_RDF_STAR); + } + + /** + * Creates a new TupleQueryResultFormat object. + * + * @param name The name of the format, e.g. "SPARQL/XML". + * @param mimeType The MIME type of the format, e.g. application/sparql-results+xml for the + * SPARQL/XML format. + * @param charset The default character encoding of the format. Specify null if not applicable. + * @param fileExt The (default) file extension for the format, e.g. srx for SPARQL/XML. + * @param supportsRDFStar True if the TupleQueryResultFormat supports the encoding of RDF* triples natively + * and false otherwise. + * @since 3.2.0 + */ + public TupleQueryResultFormat(String name, String mimeType, Charset charset, String fileExt, + boolean supportsRDFStar) { super(name, mimeType, charset, fileExt); + this.supportsRDFStar = supportsRDFStar; } /** * Creates a new TupleQueryResultFormat object. - * + * * @param name The name of the format, e.g. "SPARQL/XML". * @param mimeTypes The MIME types of the format, e.g. application/sparql-results+xml for the * SPARQL/XML format. The first item in the list is interpreted as the default MIME type for @@ -102,12 +168,32 @@ public TupleQueryResultFormat(String name, String mimeType, Charset charset, Str */ public TupleQueryResultFormat(String name, Collection mimeTypes, Charset charset, Collection fileExtensions) { + this(name, mimeTypes, charset, fileExtensions, NO_RDF_STAR); + } + + /** + * Creates a new TupleQueryResultFormat object. + * + * @param name The name of the format, e.g. "SPARQL/XML". + * @param mimeTypes The MIME types of the format, e.g. application/sparql-results+xml for the + * SPARQL/XML format. The first item in the list is interpreted as the default MIME type for + * the format. + * @param charset The default character encoding of the format. Specify null if not applicable. + * @param fileExtensions The format's file extensions, e.g. srx for SPARQL/XML files. The first item in + * the list is interpreted as the default file extension for the format. + * @param supportsRDFStar True if the TupleQueryResultFormat supports the encoding of RDF* triples natively + * and false otherwise. + * @since 3.2.0 + */ + public TupleQueryResultFormat(String name, Collection mimeTypes, Charset charset, + Collection fileExtensions, boolean supportsRDFStar) { super(name, mimeTypes, charset, fileExtensions); + this.supportsRDFStar = supportsRDFStar; } /** * Creates a new TupleQueryResultFormat object. - * + * * @param name The name of the format, e.g. "SPARQL/XML". * @param mimeTypes The MIME types of the format, e.g. application/sparql-results+xml for the * SPARQL/XML format. The first item in the list is interpreted as the default MIME type for @@ -117,9 +203,45 @@ public TupleQueryResultFormat(String name, Collection mimeTypes, Charset * list is interpreted as the default file extension for the format. * @param standardURI The standard URI that has been assigned to this format by a standards organisation or null * if it does not currently have a standard URI. + * @since 3.2.0 */ public TupleQueryResultFormat(String name, Collection mimeTypes, Charset charset, Collection fileExtensions, IRI standardURI) { + this(name, mimeTypes, charset, fileExtensions, standardURI, NO_RDF_STAR); + } + + /** + * Creates a new TupleQueryResultFormat object. + * + * @param name The name of the format, e.g. "SPARQL/XML". + * @param mimeTypes The MIME types of the format, e.g. application/sparql-results+xml for the + * SPARQL/XML format. The first item in the list is interpreted as the default MIME type for + * the format. + * @param charset The default character encoding of the format. Specify null if not applicable. + * @param fileExtensions The format's file extensions, e.g. srx for SPARQL/XML files. The first item in + * the list is interpreted as the default file extension for the format. + * @param standardURI The standard URI that has been assigned to this format by a standards organisation or null + * if it does not currently have a standard URI. + * @param supportsRDFStar True if the TupleQueryResultFormat supports the encoding of RDF* triples natively + * and false otherwise. + * @since 3.2.0 + */ + public TupleQueryResultFormat(String name, Collection mimeTypes, Charset charset, + Collection fileExtensions, IRI standardURI, boolean supportsRDFStar) { super(name, mimeTypes, charset, fileExtensions, standardURI); + this.supportsRDFStar = supportsRDFStar; + } + + /*---------* + * Methods * + *---------*/ + + /** + * Return true if the TupleQueryResultFormat supports the encoding of RDF* triples natively. + * + * @since 3.2.0 + */ + public boolean supportsRDFStar() { + return supportsRDFStar; } } diff --git a/core/queryresultio/api/src/main/java/org/eclipse/rdf4j/query/resultio/TupleQueryResultParser.java b/core/queryresultio/api/src/main/java/org/eclipse/rdf4j/query/resultio/TupleQueryResultParser.java index c1cb5833d9d..ad002d5c4c3 100644 --- a/core/queryresultio/api/src/main/java/org/eclipse/rdf4j/query/resultio/TupleQueryResultParser.java +++ b/core/queryresultio/api/src/main/java/org/eclipse/rdf4j/query/resultio/TupleQueryResultParser.java @@ -25,7 +25,7 @@ public interface TupleQueryResultParser extends QueryResultParser { /** * Sets the TupleQueryResultHandler that will handle the parsed query result data. - * + * * @deprecated Use {@link #setQueryResultHandler(org.eclipse.rdf4j.query.QueryResultHandler)} instead. */ @Deprecated @@ -33,7 +33,7 @@ public interface TupleQueryResultParser extends QueryResultParser { /** * Parses the data from the supplied InputStream. - * + * * @param in The InputStream from which to read the data. * @throws IOException If an I/O error occurred while data was read from the InputStream. * @throws QueryResultParseException If the parser has encountered an unrecoverable parse error. diff --git a/core/queryresultio/api/src/main/java/org/eclipse/rdf4j/query/resultio/TupleQueryResultParserFactory.java b/core/queryresultio/api/src/main/java/org/eclipse/rdf4j/query/resultio/TupleQueryResultParserFactory.java index 1522c967fa8..0c46496f231 100644 --- a/core/queryresultio/api/src/main/java/org/eclipse/rdf4j/query/resultio/TupleQueryResultParserFactory.java +++ b/core/queryresultio/api/src/main/java/org/eclipse/rdf4j/query/resultio/TupleQueryResultParserFactory.java @@ -9,7 +9,7 @@ /** * A TupleQueryResultParserFactory returns {@link TupleQueryResultParser}s for a specific tuple query result format. - * + * * @author Arjohn Kampman */ public interface TupleQueryResultParserFactory { diff --git a/core/queryresultio/api/src/main/java/org/eclipse/rdf4j/query/resultio/TupleQueryResultParserRegistry.java b/core/queryresultio/api/src/main/java/org/eclipse/rdf4j/query/resultio/TupleQueryResultParserRegistry.java index f5f69120be8..a614fdb98d9 100644 --- a/core/queryresultio/api/src/main/java/org/eclipse/rdf4j/query/resultio/TupleQueryResultParserRegistry.java +++ b/core/queryresultio/api/src/main/java/org/eclipse/rdf4j/query/resultio/TupleQueryResultParserRegistry.java @@ -11,7 +11,7 @@ /** * A registry that keeps track of the available {@link TupleQueryResultParserFactory}s. - * + * * @author Arjohn Kampman */ public class TupleQueryResultParserRegistry @@ -27,7 +27,7 @@ private static class TupleQueryResultParserRegistryHolder { /** * Gets the default TupleQueryResultParserRegistry. - * + * * @return The default registry. */ public static TupleQueryResultParserRegistry getInstance() { diff --git a/core/queryresultio/api/src/main/java/org/eclipse/rdf4j/query/resultio/TupleQueryResultWriterFactory.java b/core/queryresultio/api/src/main/java/org/eclipse/rdf4j/query/resultio/TupleQueryResultWriterFactory.java index b544b7e8ed8..f99a62e88be 100644 --- a/core/queryresultio/api/src/main/java/org/eclipse/rdf4j/query/resultio/TupleQueryResultWriterFactory.java +++ b/core/queryresultio/api/src/main/java/org/eclipse/rdf4j/query/resultio/TupleQueryResultWriterFactory.java @@ -11,7 +11,7 @@ /** * Returns {@link TupleQueryResultWriter}s for a specific tuple query result format. - * + * * @author Arjohn Kampman */ public interface TupleQueryResultWriterFactory { @@ -23,7 +23,7 @@ public interface TupleQueryResultWriterFactory { /** * Returns a TupleQueryResultWriter instance that will write to the supplied output stream. - * + * * @param out The OutputStream to write the result to. */ TupleQueryResultWriter getWriter(OutputStream out); diff --git a/core/queryresultio/api/src/main/java/org/eclipse/rdf4j/query/resultio/TupleQueryResultWriterRegistry.java b/core/queryresultio/api/src/main/java/org/eclipse/rdf4j/query/resultio/TupleQueryResultWriterRegistry.java index 5fd07b93750..5b8d63934fd 100644 --- a/core/queryresultio/api/src/main/java/org/eclipse/rdf4j/query/resultio/TupleQueryResultWriterRegistry.java +++ b/core/queryresultio/api/src/main/java/org/eclipse/rdf4j/query/resultio/TupleQueryResultWriterRegistry.java @@ -11,7 +11,7 @@ /** * A registry that keeps track of the available {@link TupleQueryResultWriterFactory}s. - * + * * @author Arjohn Kampman */ public class TupleQueryResultWriterRegistry @@ -27,7 +27,7 @@ private static class TupleQueryResultWriterRegistryHolder { /** * Gets the default TupleQueryResultWriterRegistry. - * + * * @return The default registry. */ public static TupleQueryResultWriterRegistry getInstance() { diff --git a/core/queryresultio/api/src/main/java/org/eclipse/rdf4j/query/resultio/UnsupportedQueryResultFormatException.java b/core/queryresultio/api/src/main/java/org/eclipse/rdf4j/query/resultio/UnsupportedQueryResultFormatException.java index e6811723ac8..e07713d8d19 100644 --- a/core/queryresultio/api/src/main/java/org/eclipse/rdf4j/query/resultio/UnsupportedQueryResultFormatException.java +++ b/core/queryresultio/api/src/main/java/org/eclipse/rdf4j/query/resultio/UnsupportedQueryResultFormatException.java @@ -16,7 +16,7 @@ public class UnsupportedQueryResultFormatException extends RuntimeException { /** * Creates a new UnsupportedRDFormatException. - * + * * @param msg An error message. */ public UnsupportedQueryResultFormatException(String msg) { @@ -25,7 +25,7 @@ public UnsupportedQueryResultFormatException(String msg) { /** * Creates a new UnsupportedRDFormatException. - * + * * @param cause The cause of the exception. */ public UnsupportedQueryResultFormatException(Throwable cause) { @@ -34,7 +34,7 @@ public UnsupportedQueryResultFormatException(Throwable cause) { /** * Creates a new UnsupportedRDFormatException wrapping another exception. - * + * * @param msg An error message. * @param cause The cause of the exception. */ diff --git a/core/queryresultio/api/src/main/java/org/eclipse/rdf4j/query/resultio/ValueMappingBindingSet.java b/core/queryresultio/api/src/main/java/org/eclipse/rdf4j/query/resultio/ValueMappingBindingSet.java new file mode 100644 index 00000000000..4a33464f6c6 --- /dev/null +++ b/core/queryresultio/api/src/main/java/org/eclipse/rdf4j/query/resultio/ValueMappingBindingSet.java @@ -0,0 +1,93 @@ +/******************************************************************************* + * Copyright (c) 2020 Eclipse RDF4J contributors. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Distribution License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ +package org.eclipse.rdf4j.query.resultio; + +import java.util.Iterator; +import java.util.Set; +import java.util.function.Function; + +import org.eclipse.rdf4j.model.Value; +import org.eclipse.rdf4j.query.AbstractBindingSet; +import org.eclipse.rdf4j.query.Binding; +import org.eclipse.rdf4j.query.BindingSet; + +/** + * A {@link BindingSet} that provides a mechanism to map values by using a custom {@link Function}. + * + * @author Pavel Mihaylov + */ +class ValueMappingBindingSet extends AbstractBindingSet { + private BindingSet delegate; + private Function mapper; + + ValueMappingBindingSet(BindingSet delegate, Function mapper) { + this.delegate = delegate; + this.mapper = mapper; + } + + @Override + public Iterator iterator() { + return new Iterator() { + Iterator idelegate = delegate.iterator(); + + @Override + public boolean hasNext() { + return idelegate.hasNext(); + } + + @Override + public Binding next() { + return mapBinding(idelegate.next()); + } + }; + } + + @Override + public Set getBindingNames() { + return delegate.getBindingNames(); + } + + @Override + public Binding getBinding(String bindingName) { + return delegate.getBinding(bindingName); + } + + @Override + public boolean hasBinding(String bindingName) { + return delegate.hasBinding(bindingName); + } + + @Override + public Value getValue(String bindingName) { + return mapper.apply(delegate.getValue(bindingName)); + } + + @Override + public int size() { + return delegate.size(); + } + + private Binding mapBinding(Binding binding) { + return new Binding() { + @Override + public String getName() { + return binding.getName(); + } + + @Override + public Value getValue() { + return mapper.apply(binding.getValue()); + } + + @Override + public String toString() { + return getName() + "=" + getValue().toString(); + } + }; + } +} diff --git a/core/queryresultio/api/src/main/java/org/eclipse/rdf4j/query/resultio/helpers/BackgroundTupleResult.java b/core/queryresultio/api/src/main/java/org/eclipse/rdf4j/query/resultio/helpers/BackgroundTupleResult.java index 4671468c572..5f70addf980 100644 --- a/core/queryresultio/api/src/main/java/org/eclipse/rdf4j/query/resultio/helpers/BackgroundTupleResult.java +++ b/core/queryresultio/api/src/main/java/org/eclipse/rdf4j/query/resultio/helpers/BackgroundTupleResult.java @@ -24,7 +24,7 @@ /** * Provides concurrent access to tuple results as they are being parsed. - * + * * @author James Leigh */ public class BackgroundTupleResult extends IteratingTupleQueryResult implements Runnable, TupleQueryResultHandler { @@ -42,7 +42,7 @@ public class BackgroundTupleResult extends IteratingTupleQueryResult implements private final CountDownLatch finishedParsing = new CountDownLatch(1); public BackgroundTupleResult(TupleQueryResultParser parser, InputStream in) { - this(new QueueCursor(10), parser, in); + this(new QueueCursor<>(10), parser, in); } public BackgroundTupleResult(QueueCursor queue, TupleQueryResultParser parser, InputStream in) { diff --git a/core/queryresultio/api/src/main/java/org/eclipse/rdf4j/query/resultio/helpers/QueryResultCollector.java b/core/queryresultio/api/src/main/java/org/eclipse/rdf4j/query/resultio/helpers/QueryResultCollector.java index 3eb9be64977..710a64560f1 100644 --- a/core/queryresultio/api/src/main/java/org/eclipse/rdf4j/query/resultio/helpers/QueryResultCollector.java +++ b/core/queryresultio/api/src/main/java/org/eclipse/rdf4j/query/resultio/helpers/QueryResultCollector.java @@ -23,7 +23,7 @@ * Boolean or Tuple results simultaneously. *

    * The {@link List}s that are returned by this interface are immutable. - * + * * @author Peter Ansell */ public class QueryResultCollector implements QueryResultHandler, TupleQueryResultHandler, BooleanQueryResultHandler { @@ -78,7 +78,7 @@ public void handleLinks(List linkUrls) throws QueryResultHandlerExceptio /** * Determines whether {@link #handleBoolean(boolean)} was called for this collector. - * + * * @return True if there was a boolean handled by this collector. */ public boolean getHandledBoolean() { @@ -91,7 +91,7 @@ public boolean getHandledBoolean() { *

    * If {@link #getHandledBoolean()} returns false this method throws a {@link QueryResultHandlerException} indicating * that a response could not be provided. - * + * * @return The boolean value that was collected. * @throws QueryResultHandlerException If there was no boolean value collected. */ @@ -106,7 +106,7 @@ public boolean getBoolean() throws QueryResultHandlerException { /** * Determines whether {@link #endQueryResult()} was called after the last calls to {@link #startQueryResult(List)} * and optionally calls to {@link #handleSolution(BindingSet)}. - * + * * @return True if there was a call to {@link #endQueryResult()} after the last calls to * {@link #startQueryResult(List)} and {@link #handleSolution(BindingSet)}. */ @@ -116,7 +116,7 @@ public boolean getHandledTuple() { /** * Returns a collection of binding names collected. - * + * * @return An immutable list of {@link String}s that were collected as the binding names. * @throws QueryResultHandlerException If the tuple results set was not successfully collected, as signalled by a * call to {@link #endQueryResult()}. diff --git a/core/queryresultio/binary/pom.xml b/core/queryresultio/binary/pom.xml index 51c43c063ae..6559f7ff594 100644 --- a/core/queryresultio/binary/pom.xml +++ b/core/queryresultio/binary/pom.xml @@ -4,7 +4,7 @@ org.eclipse.rdf4j rdf4j-queryresultio - 3.1.5-SNAPSHOT + 3.2.2-SNAPSHOT rdf4j-queryresultio-binary RDF4J: Query result IO - binary diff --git a/core/queryresultio/binary/src/main/java/org/eclipse/rdf4j/query/resultio/binary/BinaryQueryResultConstants.java b/core/queryresultio/binary/src/main/java/org/eclipse/rdf4j/query/resultio/binary/BinaryQueryResultConstants.java index 6ee0235c37d..5d209a7d8ef 100644 --- a/core/queryresultio/binary/src/main/java/org/eclipse/rdf4j/query/resultio/binary/BinaryQueryResultConstants.java +++ b/core/queryresultio/binary/src/main/java/org/eclipse/rdf4j/query/resultio/binary/BinaryQueryResultConstants.java @@ -60,6 +60,8 @@ * label. Following this label is either a QNAME or URI record for the literal's datatype. *

  • EMPTY_ROW (byte value: 9):
    * This indicates a row with zero values. + *
  • TRIPLE (byte value: 10):
    + * This indicates an RDF* triple value. It is followed by the subject, predicate and object values of the triple. *
  • ERROR (byte value: 126):
    * This record indicates a error. The type of error is indicates by the byte directly following the record type marker: * 1 for a malformed query error, 2 for a query evaluation error. The error type byte is followed by @@ -68,7 +70,7 @@ * This is a special record that indicates the end of the results table and consists of nothing more than the record * type marker. Any data following this record should be ignored. * - * + * * @author Arjohn Kampman */ public interface BinaryQueryResultConstants { @@ -104,6 +106,8 @@ public interface BinaryQueryResultConstants { public static final int EMPTY_ROW_RECORD_MARKER = 9; + public static final int TRIPLE_RECORD_MARKER = 10; + public static final int ERROR_RECORD_MARKER = 126; public static final int TABLE_END_RECORD_MARKER = 127; diff --git a/core/queryresultio/binary/src/main/java/org/eclipse/rdf4j/query/resultio/binary/BinaryQueryResultParser.java b/core/queryresultio/binary/src/main/java/org/eclipse/rdf4j/query/resultio/binary/BinaryQueryResultParser.java index cb7ae96056e..aafe2c72f07 100644 --- a/core/queryresultio/binary/src/main/java/org/eclipse/rdf4j/query/resultio/binary/BinaryQueryResultParser.java +++ b/core/queryresultio/binary/src/main/java/org/eclipse/rdf4j/query/resultio/binary/BinaryQueryResultParser.java @@ -22,6 +22,7 @@ import static org.eclipse.rdf4j.query.resultio.binary.BinaryQueryResultConstants.QUERY_EVALUATION_ERROR; import static org.eclipse.rdf4j.query.resultio.binary.BinaryQueryResultConstants.REPEAT_RECORD_MARKER; import static org.eclipse.rdf4j.query.resultio.binary.BinaryQueryResultConstants.TABLE_END_RECORD_MARKER; +import static org.eclipse.rdf4j.query.resultio.binary.BinaryQueryResultConstants.TRIPLE_RECORD_MARKER; import static org.eclipse.rdf4j.query.resultio.binary.BinaryQueryResultConstants.URI_RECORD_MARKER; import java.io.DataInputStream; @@ -41,6 +42,8 @@ import org.eclipse.rdf4j.model.BNode; import org.eclipse.rdf4j.model.IRI; import org.eclipse.rdf4j.model.Literal; +import org.eclipse.rdf4j.model.Resource; +import org.eclipse.rdf4j.model.Triple; import org.eclipse.rdf4j.model.Value; import org.eclipse.rdf4j.model.ValueFactory; import org.eclipse.rdf4j.model.impl.SimpleValueFactory; @@ -178,6 +181,9 @@ public synchronized void parse(InputStream in) case DATATYPE_LITERAL_RECORD_MARKER: value = readLiteral(recordTypeMarker); break; + case TRIPLE_RECORD_MARKER: + value = readTriple(); + break; default: throw new IOException("Unkown record type: " + recordTypeMarker); } @@ -312,4 +318,44 @@ private String readStringV2() throws IOException { return charBuf.toString(); } + + private Triple readTriple() throws IOException { + Value subject = readDirectValue(); + if (!(subject instanceof Resource)) { + throw new IOException("Unexpected value type: " + subject); + } + + Value predicate = readDirectValue(); + if (!(predicate instanceof IRI)) { + throw new IOException("Unexpected value type: " + predicate); + } + + Value object = readDirectValue(); + + return valueFactory.createTriple((Resource) subject, (IRI) predicate, object); + } + + private Value readDirectValue() throws IOException { + int recordTypeMarker = this.in.readByte(); + + switch (recordTypeMarker) { + case NAMESPACE_RECORD_MARKER: + processNamespace(); + return readDirectValue(); + case QNAME_RECORD_MARKER: + return readQName(); + case URI_RECORD_MARKER: + return readURI(); + case BNODE_RECORD_MARKER: + return readBnode(); + case PLAIN_LITERAL_RECORD_MARKER: + case LANG_LITERAL_RECORD_MARKER: + case DATATYPE_LITERAL_RECORD_MARKER: + return readLiteral(recordTypeMarker); + case TRIPLE_RECORD_MARKER: + return readTriple(); + default: + throw new IOException("Unexpected record type: " + recordTypeMarker); + } + } } diff --git a/core/queryresultio/binary/src/main/java/org/eclipse/rdf4j/query/resultio/binary/BinaryQueryResultParserFactory.java b/core/queryresultio/binary/src/main/java/org/eclipse/rdf4j/query/resultio/binary/BinaryQueryResultParserFactory.java index 43c80439980..89518fa1d64 100644 --- a/core/queryresultio/binary/src/main/java/org/eclipse/rdf4j/query/resultio/binary/BinaryQueryResultParserFactory.java +++ b/core/queryresultio/binary/src/main/java/org/eclipse/rdf4j/query/resultio/binary/BinaryQueryResultParserFactory.java @@ -13,7 +13,7 @@ /** * A {@link TupleQueryResultParserFactory} for binary tuple query result parsers. - * + * * @author Arjohn Kampman */ public class BinaryQueryResultParserFactory implements TupleQueryResultParserFactory { diff --git a/core/queryresultio/binary/src/main/java/org/eclipse/rdf4j/query/resultio/binary/BinaryQueryResultWriter.java b/core/queryresultio/binary/src/main/java/org/eclipse/rdf4j/query/resultio/binary/BinaryQueryResultWriter.java index 707a9803fa0..6d3f6c4ea93 100644 --- a/core/queryresultio/binary/src/main/java/org/eclipse/rdf4j/query/resultio/binary/BinaryQueryResultWriter.java +++ b/core/queryresultio/binary/src/main/java/org/eclipse/rdf4j/query/resultio/binary/BinaryQueryResultWriter.java @@ -22,6 +22,7 @@ import static org.eclipse.rdf4j.query.resultio.binary.BinaryQueryResultConstants.QUERY_EVALUATION_ERROR; import static org.eclipse.rdf4j.query.resultio.binary.BinaryQueryResultConstants.REPEAT_RECORD_MARKER; import static org.eclipse.rdf4j.query.resultio.binary.BinaryQueryResultConstants.TABLE_END_RECORD_MARKER; +import static org.eclipse.rdf4j.query.resultio.binary.BinaryQueryResultConstants.TRIPLE_RECORD_MARKER; import java.io.DataOutputStream; import java.io.IOException; @@ -39,6 +40,7 @@ import org.eclipse.rdf4j.model.BNode; import org.eclipse.rdf4j.model.IRI; import org.eclipse.rdf4j.model.Literal; +import org.eclipse.rdf4j.model.Triple; import org.eclipse.rdf4j.model.Value; import org.eclipse.rdf4j.model.util.Literals; import org.eclipse.rdf4j.query.BindingSet; @@ -51,7 +53,7 @@ /** * Writer for the binary tuple result format. The format is explained in {@link BinaryQueryResultConstants}. - * + * * @author Arjohn Kampman */ public class BinaryQueryResultWriter extends AbstractQueryResultWriter implements TupleQueryResultWriter { @@ -88,6 +90,7 @@ public class BinaryQueryResultWriter extends AbstractQueryResultWriter implement *--------------*/ public BinaryQueryResultWriter(OutputStream out) { + super(out); this.out = new DataOutputStream(out); } @@ -118,6 +121,8 @@ public void startDocument() throws TupleQueryResultHandlerException { @Override public void startQueryResult(List bindingNames) throws TupleQueryResultHandlerException { + super.startQueryResult(bindingNames); + tupleVariablesFound = true; if (!documentStarted) { @@ -158,7 +163,7 @@ public void endQueryResult() throws TupleQueryResultHandlerException { } @Override - public void handleSolution(BindingSet bindingSet) throws TupleQueryResultHandlerException { + protected void handleSolutionImpl(BindingSet bindingSet) throws TupleQueryResultHandlerException { if (!tupleVariablesFound) { throw new IllegalStateException("Must call startQueryResult before handleSolution"); } @@ -174,14 +179,8 @@ public void handleSolution(BindingSet bindingSet) throws TupleQueryResultHandler writeNull(); } else if (value.equals(previousBindings.getValue(bindingName))) { writeRepeat(); - } else if (value instanceof IRI) { - writeQName((IRI) value); - } else if (value instanceof BNode) { - writeBNode((BNode) value); - } else if (value instanceof Literal) { - writeLiteral((Literal) value); } else { - throw new TupleQueryResultHandlerException("Unknown Value object type: " + value.getClass()); + writeValue(value); } } @@ -200,6 +199,20 @@ private void writeRepeat() throws IOException { out.writeByte(REPEAT_RECORD_MARKER); } + private void writeValue(Value value) throws IOException { + if (value instanceof IRI) { + writeQName((IRI) value); + } else if (value instanceof BNode) { + writeBNode((BNode) value); + } else if (value instanceof Literal) { + writeLiteral((Literal) value); + } else if (value instanceof Triple) { + writeTriple((Triple) value); + } else { + throw new TupleQueryResultHandlerException("Unknown Value object type: " + value.getClass()); + } + } + private void writeEmptyRow() throws IOException { out.writeByte(EMPTY_ROW_RECORD_MARKER); } @@ -259,9 +272,16 @@ private void writeLiteral(Literal literal) throws IOException { } } + private void writeTriple(Triple triple) throws IOException { + out.writeByte(TRIPLE_RECORD_MARKER); + writeValue(triple.getSubject()); + writeValue(triple.getPredicate()); + writeValue(triple.getObject()); + } + /** * Writes an error msg to the stream. - * + * * @param errType The error type. * @param msg The error message. * @throws IOException When the error could not be written to the stream. diff --git a/core/queryresultio/binary/src/main/java/org/eclipse/rdf4j/query/resultio/binary/BinaryQueryResultWriterFactory.java b/core/queryresultio/binary/src/main/java/org/eclipse/rdf4j/query/resultio/binary/BinaryQueryResultWriterFactory.java index 72af4c25ec0..b3e5abeedd5 100644 --- a/core/queryresultio/binary/src/main/java/org/eclipse/rdf4j/query/resultio/binary/BinaryQueryResultWriterFactory.java +++ b/core/queryresultio/binary/src/main/java/org/eclipse/rdf4j/query/resultio/binary/BinaryQueryResultWriterFactory.java @@ -15,7 +15,7 @@ /** * A {@link TupleQueryResultWriterFactory} for writers of binary query results. - * + * * @author Arjohn Kampman */ public class BinaryQueryResultWriterFactory implements TupleQueryResultWriterFactory { diff --git a/core/queryresultio/binary/src/main/java/org/eclipse/rdf4j/query/resultio/binary/QueryErrorType.java b/core/queryresultio/binary/src/main/java/org/eclipse/rdf4j/query/resultio/binary/QueryErrorType.java index 1443ef60198..dfee1ac101e 100644 --- a/core/queryresultio/binary/src/main/java/org/eclipse/rdf4j/query/resultio/binary/QueryErrorType.java +++ b/core/queryresultio/binary/src/main/java/org/eclipse/rdf4j/query/resultio/binary/QueryErrorType.java @@ -9,7 +9,7 @@ /** * A type-safe enumeration for query error types. - * + * * @author Arjohn Kampman */ public enum QueryErrorType { diff --git a/core/queryresultio/pom.xml b/core/queryresultio/pom.xml index be2e456c651..f68b6a77ca2 100644 --- a/core/queryresultio/pom.xml +++ b/core/queryresultio/pom.xml @@ -4,7 +4,7 @@ org.eclipse.rdf4j rdf4j-core - 3.1.5-SNAPSHOT + 3.2.2-SNAPSHOT rdf4j-queryresultio pom diff --git a/core/queryresultio/sparqljson/pom.xml b/core/queryresultio/sparqljson/pom.xml index 1c9a112ee96..d908c9e5aee 100644 --- a/core/queryresultio/sparqljson/pom.xml +++ b/core/queryresultio/sparqljson/pom.xml @@ -4,7 +4,7 @@ org.eclipse.rdf4j rdf4j-queryresultio - 3.1.5-SNAPSHOT + 3.2.2-SNAPSHOT rdf4j-queryresultio-sparqljson RDF4J: Query result IO - SPARQL/JSON diff --git a/core/queryresultio/sparqljson/src/main/java/org/eclipse/rdf4j/query/resultio/sparqljson/AbstractSPARQLJSONParser.java b/core/queryresultio/sparqljson/src/main/java/org/eclipse/rdf4j/query/resultio/sparqljson/AbstractSPARQLJSONParser.java index a4c5eac3dc6..0f2207d543e 100644 --- a/core/queryresultio/sparqljson/src/main/java/org/eclipse/rdf4j/query/resultio/sparqljson/AbstractSPARQLJSONParser.java +++ b/core/queryresultio/sparqljson/src/main/java/org/eclipse/rdf4j/query/resultio/sparqljson/AbstractSPARQLJSONParser.java @@ -15,6 +15,7 @@ import java.util.List; import java.util.Set; +import org.eclipse.rdf4j.model.Triple; import org.eclipse.rdf4j.model.Value; import org.eclipse.rdf4j.model.ValueFactory; import org.eclipse.rdf4j.query.BindingSet; @@ -229,48 +230,7 @@ protected boolean parseQueryResultInternal(InputStream in, boolean attemptParseB final String bindingStr = jp.getCurrentName(); - if (jp.nextToken() != JsonToken.START_OBJECT) { - throw new QueryResultParseException("Did not find object for binding value", - jp.getCurrentLocation().getLineNr(), - jp.getCurrentLocation().getColumnNr()); - } - - String lang = null; - String type = null; - String datatype = null; - String value = null; - - while (jp.nextToken() != JsonToken.END_OBJECT) { - - if (jp.getCurrentToken() != JsonToken.FIELD_NAME) { - throw new QueryResultParseException( - "Did not find value attribute under " + bindingStr + " field", - jp.getCurrentLocation().getLineNr(), - jp.getCurrentLocation().getColumnNr()); - } - String fieldName = jp.getCurrentName(); - - // move to the value token - jp.nextToken(); - - // set the appropriate state variable - if (TYPE.equals(fieldName)) { - type = jp.getText(); - } else if (XMLLANG.equals(fieldName)) { - lang = jp.getText(); - } else if (DATATYPE.equals(fieldName)) { - datatype = jp.getText(); - } else if (VALUE.equals(fieldName)) { - value = jp.getText(); - } else { - throw new QueryResultParseException("Unexpected field name: " + fieldName, - jp.getCurrentLocation().getLineNr(), - jp.getCurrentLocation().getColumnNr()); - - } - } - - nextBindingSet.addBinding(bindingStr, parseValue(type, value, lang, datatype)); + nextBindingSet.addBinding(bindingStr, parseValue(jp, bindingStr)); } // parsing of solution finished, report result return to // bindings state @@ -346,6 +306,69 @@ else if (jp.getCurrentName().equals(DISTINCT) || jp.getCurrentName().equals(ORDE return result; } + protected Value parseValue(JsonParser jp, String bindingStr) throws IOException { + if (jp.nextToken() != JsonToken.START_OBJECT) { + throw new QueryResultParseException("Did not find object for binding value", + jp.getCurrentLocation().getLineNr(), + jp.getCurrentLocation().getColumnNr()); + } + + String lang = null; + String type = null; + String datatype = null; + String value = null; + + Triple triple = null; + + while (jp.nextToken() != JsonToken.END_OBJECT) { + if (jp.getCurrentToken() != JsonToken.FIELD_NAME) { + throw new QueryResultParseException( + "Did not find value attribute under " + bindingStr + " field", + jp.getCurrentLocation().getLineNr(), + jp.getCurrentLocation().getColumnNr()); + } + String fieldName = jp.getCurrentName(); + + // move to the value token + jp.nextToken(); + + // set the appropriate state variable + if (TYPE.equals(fieldName)) { + type = jp.getText(); + } else if (XMLLANG.equals(fieldName)) { + lang = jp.getText(); + } else if (DATATYPE.equals(fieldName)) { + datatype = jp.getText(); + } else if (VALUE.equals(fieldName)) { + if (jp.getCurrentToken() == JsonToken.START_OBJECT) { + triple = parseTripleValue(jp, fieldName); + } else { + value = jp.getText(); + } + } else { + throw new QueryResultParseException("Unexpected field name: " + fieldName, + jp.getCurrentLocation().getLineNr(), + jp.getCurrentLocation().getColumnNr()); + + } + } + + if (triple != null && checkTripleType(jp, type)) { + return triple; + } + + return parseValue(type, value, lang, datatype); + } + + protected Triple parseTripleValue(JsonParser jp, String fieldName) throws IOException { + throw new QueryResultParseException("Unexpected object as value", jp.getCurrentLocation().getLineNr(), + jp.getCurrentLocation().getColumnNr()); + } + + protected boolean checkTripleType(JsonParser jp, String type) { + throw new IllegalStateException(); + } + /** * Parse a value out of the elements for a binding. * diff --git a/core/queryresultio/sparqljson/src/main/java/org/eclipse/rdf4j/query/resultio/sparqljson/AbstractSPARQLJSONWriter.java b/core/queryresultio/sparqljson/src/main/java/org/eclipse/rdf4j/query/resultio/sparqljson/AbstractSPARQLJSONWriter.java index 0dff920a070..398f16cbbe7 100644 --- a/core/queryresultio/sparqljson/src/main/java/org/eclipse/rdf4j/query/resultio/sparqljson/AbstractSPARQLJSONWriter.java +++ b/core/queryresultio/sparqljson/src/main/java/org/eclipse/rdf4j/query/resultio/sparqljson/AbstractSPARQLJSONWriter.java @@ -75,9 +75,10 @@ abstract class AbstractSPARQLJSONWriter extends AbstractQueryResultWriter implem protected boolean linksFound = false; - private final JsonGenerator jg; + protected final JsonGenerator jg; protected AbstractSPARQLJSONWriter(OutputStream out) { + super(out); try { jg = JSON_FACTORY.createGenerator(new OutputStreamWriter(out, StandardCharsets.UTF_8)); } catch (IOException e) { @@ -107,6 +108,8 @@ public void endHeader() throws QueryResultHandlerException { @Override public void startQueryResult(List columnHeaders) throws TupleQueryResultHandlerException { + super.startQueryResult(columnHeaders); + try { if (!documentOpen) { startDocument(); @@ -128,7 +131,7 @@ public void startQueryResult(List columnHeaders) throws TupleQueryResult } @Override - public void handleSolution(BindingSet bindingSet) throws TupleQueryResultHandlerException { + protected void handleSolutionImpl(BindingSet bindingSet) throws TupleQueryResultHandlerException { try { if (!documentOpen) { startDocument(); diff --git a/core/queryresultio/sparqljson/src/main/java/org/eclipse/rdf4j/query/resultio/sparqljson/SPARQLBooleanJSONParser.java b/core/queryresultio/sparqljson/src/main/java/org/eclipse/rdf4j/query/resultio/sparqljson/SPARQLBooleanJSONParser.java index 33482c64d80..1344824bdd9 100644 --- a/core/queryresultio/sparqljson/src/main/java/org/eclipse/rdf4j/query/resultio/sparqljson/SPARQLBooleanJSONParser.java +++ b/core/queryresultio/sparqljson/src/main/java/org/eclipse/rdf4j/query/resultio/sparqljson/SPARQLBooleanJSONParser.java @@ -19,7 +19,7 @@ /** * Parser for SPARQL-1.1 JSON Results Format documents - * + * * @see SPARQL 1.1 Query Results JSON Format * @author Peter Ansell */ @@ -34,7 +34,7 @@ public SPARQLBooleanJSONParser() { /** * Construct a parser with a specific {@link ValueFactory}. - * + * * @param valueFactory The factory to use to create values. */ public SPARQLBooleanJSONParser(ValueFactory valueFactory) { diff --git a/core/queryresultio/sparqljson/src/main/java/org/eclipse/rdf4j/query/resultio/sparqljson/SPARQLBooleanJSONParserFactory.java b/core/queryresultio/sparqljson/src/main/java/org/eclipse/rdf4j/query/resultio/sparqljson/SPARQLBooleanJSONParserFactory.java index 2ebb0545cc3..73b345e9bf5 100644 --- a/core/queryresultio/sparqljson/src/main/java/org/eclipse/rdf4j/query/resultio/sparqljson/SPARQLBooleanJSONParserFactory.java +++ b/core/queryresultio/sparqljson/src/main/java/org/eclipse/rdf4j/query/resultio/sparqljson/SPARQLBooleanJSONParserFactory.java @@ -14,7 +14,7 @@ /** * A {@link TupleQueryResultParserFactory} for parsers of SPARQL-1.1 JSON Boolean Query Results. - * + * * @author Peter Ansell */ public class SPARQLBooleanJSONParserFactory implements BooleanQueryResultParserFactory { diff --git a/core/queryresultio/sparqljson/src/main/java/org/eclipse/rdf4j/query/resultio/sparqljson/SPARQLBooleanJSONWriterFactory.java b/core/queryresultio/sparqljson/src/main/java/org/eclipse/rdf4j/query/resultio/sparqljson/SPARQLBooleanJSONWriterFactory.java index 897191f5f7a..c9745a0f79d 100644 --- a/core/queryresultio/sparqljson/src/main/java/org/eclipse/rdf4j/query/resultio/sparqljson/SPARQLBooleanJSONWriterFactory.java +++ b/core/queryresultio/sparqljson/src/main/java/org/eclipse/rdf4j/query/resultio/sparqljson/SPARQLBooleanJSONWriterFactory.java @@ -15,7 +15,7 @@ /** * A {@link BooleanQueryResultWriterFactory} for writers of SPARQL/JSON query boolean results. - * + * * @author Peter Ansell */ public class SPARQLBooleanJSONWriterFactory implements BooleanQueryResultWriterFactory { diff --git a/core/queryresultio/sparqljson/src/main/java/org/eclipse/rdf4j/query/resultio/sparqljson/SPARQLResultsJSONParser.java b/core/queryresultio/sparqljson/src/main/java/org/eclipse/rdf4j/query/resultio/sparqljson/SPARQLResultsJSONParser.java index 526ea092969..e2c05db27a0 100644 --- a/core/queryresultio/sparqljson/src/main/java/org/eclipse/rdf4j/query/resultio/sparqljson/SPARQLResultsJSONParser.java +++ b/core/queryresultio/sparqljson/src/main/java/org/eclipse/rdf4j/query/resultio/sparqljson/SPARQLResultsJSONParser.java @@ -21,7 +21,7 @@ /** * Parser for SPARQL-1.1 JSON Results Format documents - * + * * @see SPARQL 1.1 Query Results JSON Format * @author Peter Ansell */ @@ -36,7 +36,7 @@ public SPARQLResultsJSONParser() { /** * Construct a parser with a specific {@link ValueFactory}. - * + * * @param valueFactory The factory to use to create values. */ public SPARQLResultsJSONParser(ValueFactory valueFactory) { diff --git a/core/queryresultio/sparqljson/src/main/java/org/eclipse/rdf4j/query/resultio/sparqljson/SPARQLResultsJSONParserFactory.java b/core/queryresultio/sparqljson/src/main/java/org/eclipse/rdf4j/query/resultio/sparqljson/SPARQLResultsJSONParserFactory.java index 6498e62d63e..5157b38255b 100644 --- a/core/queryresultio/sparqljson/src/main/java/org/eclipse/rdf4j/query/resultio/sparqljson/SPARQLResultsJSONParserFactory.java +++ b/core/queryresultio/sparqljson/src/main/java/org/eclipse/rdf4j/query/resultio/sparqljson/SPARQLResultsJSONParserFactory.java @@ -13,7 +13,7 @@ /** * A {@link TupleQueryResultParserFactory} for parsers of SPARQL-1.1 JSON Tuple Query Results. - * + * * @author Peter Ansell */ public class SPARQLResultsJSONParserFactory implements TupleQueryResultParserFactory { diff --git a/core/queryresultio/sparqljson/src/main/java/org/eclipse/rdf4j/query/resultio/sparqljson/SPARQLResultsJSONWriter.java b/core/queryresultio/sparqljson/src/main/java/org/eclipse/rdf4j/query/resultio/sparqljson/SPARQLResultsJSONWriter.java index a14dfbcb528..57cdf3ac5ec 100644 --- a/core/queryresultio/sparqljson/src/main/java/org/eclipse/rdf4j/query/resultio/sparqljson/SPARQLResultsJSONWriter.java +++ b/core/queryresultio/sparqljson/src/main/java/org/eclipse/rdf4j/query/resultio/sparqljson/SPARQLResultsJSONWriter.java @@ -31,7 +31,7 @@ public SPARQLResultsJSONWriter(OutputStream out) { *---------*/ @Override - public final TupleQueryResultFormat getTupleQueryResultFormat() { + public TupleQueryResultFormat getTupleQueryResultFormat() { return TupleQueryResultFormat.JSON; } diff --git a/core/queryresultio/sparqljson/src/main/java/org/eclipse/rdf4j/query/resultio/sparqljson/SPARQLResultsJSONWriterFactory.java b/core/queryresultio/sparqljson/src/main/java/org/eclipse/rdf4j/query/resultio/sparqljson/SPARQLResultsJSONWriterFactory.java index 3cf07fe9a41..b3a119e86c7 100644 --- a/core/queryresultio/sparqljson/src/main/java/org/eclipse/rdf4j/query/resultio/sparqljson/SPARQLResultsJSONWriterFactory.java +++ b/core/queryresultio/sparqljson/src/main/java/org/eclipse/rdf4j/query/resultio/sparqljson/SPARQLResultsJSONWriterFactory.java @@ -15,7 +15,7 @@ /** * A {@link TupleQueryResultWriterFactory} for writers of SPARQL/JSON query results. - * + * * @author Arjohn Kampman */ public class SPARQLResultsJSONWriterFactory implements TupleQueryResultWriterFactory { diff --git a/core/queryresultio/sparqljson/src/main/java/org/eclipse/rdf4j/query/resultio/sparqlstarjson/SPARQLStarResultsJSONConstants.java b/core/queryresultio/sparqljson/src/main/java/org/eclipse/rdf4j/query/resultio/sparqlstarjson/SPARQLStarResultsJSONConstants.java new file mode 100644 index 00000000000..2495b869533 --- /dev/null +++ b/core/queryresultio/sparqljson/src/main/java/org/eclipse/rdf4j/query/resultio/sparqlstarjson/SPARQLStarResultsJSONConstants.java @@ -0,0 +1,73 @@ +/******************************************************************************* + * Copyright (c) 2020 Eclipse RDF4J contributors. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Distribution License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ +package org.eclipse.rdf4j.query.resultio.sparqlstarjson; + +import org.eclipse.rdf4j.query.resultio.TupleQueryResultFormat; + +/** + * Constants for the SPARQL* JSON format. The format is handles {@link org.eclipse.rdf4j.query.TupleQueryResult} only. + * For Boolean results, the SPARQL JSON format is used. + *

    + * The format introduces a new type, triple, whose value is an object consisting of three elements: + * + *

      + *
    • s - the triple's subject
    • + *
    • p - the triple's predicate
    • + *
    • o - the triple's object
    • + *
    + *

    + * Each of the three elements s, p and o is another object identical in structure to the value for each binding. + *

    + * For example: + *

    + * + *

    + * 	"b" : {
    + * 		"type" : "triple",
    + * 		"value" : {
    + * 			"s" : {
    + * 				"type" : "uri",
    + * 				"value" : "urn:a"
    + *            },
    + * 			"p" : {
    + * 				"type" : "uri",
    + * 				"value" : "http://www.w3.org/1999/02/22-rdf-syntax-ns#type"
    + *        },
    + * 			"o" : {
    + * 				"type" : "uri",
    + * 				"value" : "urn:b"
    + *        }
    + *        }
    + *  }
    + * 
    + * + * @author Pavel Mihaylov + */ +final class SPARQLStarResultsJSONConstants { + static TupleQueryResultFormat QUERY_RESULT_FORMAT = TupleQueryResultFormat.JSON_STAR; + + /** + * Type string for serialized {@link org.eclipse.rdf4j.model.Triple} value. + */ + static final String TRIPLE = "triple"; + + /** + * Key name of the JSON object for the triple's subject. + */ + static final String SUBJECT = "s"; + + /** + * Key name of the JSON object for the triple's predicate. + */ + static final String PREDICATE = "p"; + + /** + * Key name of the JSON object for the triple's object. + */ + static final String OBJECT = "o"; +} diff --git a/core/queryresultio/sparqljson/src/main/java/org/eclipse/rdf4j/query/resultio/sparqlstarjson/SPARQLStarResultsJSONParser.java b/core/queryresultio/sparqljson/src/main/java/org/eclipse/rdf4j/query/resultio/sparqlstarjson/SPARQLStarResultsJSONParser.java new file mode 100644 index 00000000000..c55a3cf3284 --- /dev/null +++ b/core/queryresultio/sparqljson/src/main/java/org/eclipse/rdf4j/query/resultio/sparqlstarjson/SPARQLStarResultsJSONParser.java @@ -0,0 +1,101 @@ +/******************************************************************************* + * Copyright (c) 2020 Eclipse RDF4J contributors. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Distribution License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ +package org.eclipse.rdf4j.query.resultio.sparqlstarjson; + +import static org.eclipse.rdf4j.query.resultio.sparqlstarjson.SPARQLStarResultsJSONConstants.OBJECT; +import static org.eclipse.rdf4j.query.resultio.sparqlstarjson.SPARQLStarResultsJSONConstants.PREDICATE; +import static org.eclipse.rdf4j.query.resultio.sparqlstarjson.SPARQLStarResultsJSONConstants.QUERY_RESULT_FORMAT; +import static org.eclipse.rdf4j.query.resultio.sparqlstarjson.SPARQLStarResultsJSONConstants.SUBJECT; +import static org.eclipse.rdf4j.query.resultio.sparqlstarjson.SPARQLStarResultsJSONConstants.TRIPLE; + +import java.io.IOException; + +import org.eclipse.rdf4j.model.IRI; +import org.eclipse.rdf4j.model.Resource; +import org.eclipse.rdf4j.model.Triple; +import org.eclipse.rdf4j.model.Value; +import org.eclipse.rdf4j.model.ValueFactory; +import org.eclipse.rdf4j.query.resultio.QueryResultParseException; +import org.eclipse.rdf4j.query.resultio.TupleQueryResultFormat; +import org.eclipse.rdf4j.query.resultio.sparqljson.SPARQLResultsJSONParser; + +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.core.JsonToken; + +/** + * Parser for SPARQL* JSON results. This is equivalent to the SPARQL JSON parser with the addition of support for RDF* + * triples. See {@link SPARQLStarResultsJSONConstants} for a description of the RDF* extension. + * + * @author Pavel Mihaylov + */ +public class SPARQLStarResultsJSONParser extends SPARQLResultsJSONParser { + /** + * Default constructor. + */ + public SPARQLStarResultsJSONParser() { + super(); + } + + /** + * Constructs a parser with the supplied {@link ValueFactory}. + * + * @param valueFactory The factory to use to create values. + */ + public SPARQLStarResultsJSONParser(ValueFactory valueFactory) { + super(valueFactory); + } + + @Override + public TupleQueryResultFormat getTupleQueryResultFormat() { + return QUERY_RESULT_FORMAT; + } + + @Override + protected Triple parseTripleValue(JsonParser jp, String fieldName) throws IOException { + Value subject = null, predicate = null, object = null; + + while (jp.nextToken() != JsonToken.END_OBJECT) { + if (jp.getCurrentToken() != JsonToken.FIELD_NAME) { + throw new QueryResultParseException("Did not find triple attribute in triple value", + jp.getCurrentLocation().getLineNr(), + jp.getCurrentLocation().getColumnNr()); + } + String posName = jp.getCurrentName(); + if (SUBJECT.equals(posName)) { + subject = parseValue(jp, fieldName + ":" + posName); + } else if (PREDICATE.equals(posName)) { + predicate = parseValue(jp, fieldName + ":" + posName); + } else if (OBJECT.equals(posName)) { + object = parseValue(jp, fieldName + ":" + posName); + } else { + throw new QueryResultParseException("Unexpected field name in triple value: " + posName, + jp.getCurrentLocation().getLineNr(), + jp.getCurrentLocation().getColumnNr()); + } + } + + if (subject instanceof Resource && predicate instanceof IRI && object != null) { + return valueFactory.createTriple((Resource) subject, (IRI) predicate, object); + } else { + throw new QueryResultParseException("Incomplete or invalid triple value", + jp.getCurrentLocation().getLineNr(), + jp.getCurrentLocation().getColumnNr()); + } + } + + @Override + protected boolean checkTripleType(JsonParser jp, String type) { + if (!TRIPLE.equals(type)) { + throw new QueryResultParseException("Found a triple value but unexpected type: " + type, + jp.getCurrentLocation().getLineNr(), + jp.getCurrentLocation().getColumnNr()); + } + + return true; + } +} diff --git a/core/queryresultio/sparqljson/src/main/java/org/eclipse/rdf4j/query/resultio/sparqlstarjson/SPARQLStarResultsJSONParserFactory.java b/core/queryresultio/sparqljson/src/main/java/org/eclipse/rdf4j/query/resultio/sparqlstarjson/SPARQLStarResultsJSONParserFactory.java new file mode 100644 index 00000000000..eb0f3dfb524 --- /dev/null +++ b/core/queryresultio/sparqljson/src/main/java/org/eclipse/rdf4j/query/resultio/sparqlstarjson/SPARQLStarResultsJSONParserFactory.java @@ -0,0 +1,35 @@ +/******************************************************************************* + * Copyright (c) 2020 Eclipse RDF4J contributors. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Distribution License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ +package org.eclipse.rdf4j.query.resultio.sparqlstarjson; + +import org.eclipse.rdf4j.query.resultio.TupleQueryResultFormat; +import org.eclipse.rdf4j.query.resultio.TupleQueryResultParser; +import org.eclipse.rdf4j.query.resultio.TupleQueryResultParserFactory; + +/** + * {@link TupleQueryResultParserFactory} for creating instances of {@link SPARQLStarResultsJSONParser}. + * + * @author Pavel Mihaylov + */ +public class SPARQLStarResultsJSONParserFactory implements TupleQueryResultParserFactory { + /** + * Returns {@link TupleQueryResultFormat#JSON_STAR}. + */ + @Override + public TupleQueryResultFormat getTupleQueryResultFormat() { + return SPARQLStarResultsJSONConstants.QUERY_RESULT_FORMAT; + } + + /** + * Returns a new instance of {@link SPARQLStarResultsJSONParser}. + */ + @Override + public TupleQueryResultParser getParser() { + return new SPARQLStarResultsJSONParser(); + } +} diff --git a/core/queryresultio/sparqljson/src/main/java/org/eclipse/rdf4j/query/resultio/sparqlstarjson/SPARQLStarResultsJSONWriter.java b/core/queryresultio/sparqljson/src/main/java/org/eclipse/rdf4j/query/resultio/sparqlstarjson/SPARQLStarResultsJSONWriter.java new file mode 100644 index 00000000000..ce2beff6c15 --- /dev/null +++ b/core/queryresultio/sparqljson/src/main/java/org/eclipse/rdf4j/query/resultio/sparqlstarjson/SPARQLStarResultsJSONWriter.java @@ -0,0 +1,73 @@ +/******************************************************************************* + * Copyright (c) 2020 Eclipse RDF4J contributors. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Distribution License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ +package org.eclipse.rdf4j.query.resultio.sparqlstarjson; + +import static org.eclipse.rdf4j.query.resultio.sparqlstarjson.SPARQLStarResultsJSONConstants.OBJECT; +import static org.eclipse.rdf4j.query.resultio.sparqlstarjson.SPARQLStarResultsJSONConstants.PREDICATE; +import static org.eclipse.rdf4j.query.resultio.sparqlstarjson.SPARQLStarResultsJSONConstants.QUERY_RESULT_FORMAT; +import static org.eclipse.rdf4j.query.resultio.sparqlstarjson.SPARQLStarResultsJSONConstants.SUBJECT; +import static org.eclipse.rdf4j.query.resultio.sparqlstarjson.SPARQLStarResultsJSONConstants.TRIPLE; + +import java.io.IOException; +import java.io.OutputStream; + +import org.eclipse.rdf4j.model.Triple; +import org.eclipse.rdf4j.model.Value; +import org.eclipse.rdf4j.query.QueryResultHandlerException; +import org.eclipse.rdf4j.query.resultio.TupleQueryResultFormat; +import org.eclipse.rdf4j.query.resultio.TupleQueryResultWriter; +import org.eclipse.rdf4j.query.resultio.sparqljson.AbstractSPARQLJSONParser; +import org.eclipse.rdf4j.query.resultio.sparqljson.SPARQLResultsJSONWriter; + +/** + * Writer for SPARQL* JSON results. This is equivalent to the SPARQL JSON writer with the addition of support for RDF* + * triples. See {@link SPARQLStarResultsJSONConstants} for a description of the RDF* extension. + * + * @author Pavel Mihaylov + */ +public class SPARQLStarResultsJSONWriter extends SPARQLResultsJSONWriter implements TupleQueryResultWriter { + public SPARQLStarResultsJSONWriter(OutputStream out) { + super(out); + } + + @Override + public TupleQueryResultFormat getTupleQueryResultFormat() { + return QUERY_RESULT_FORMAT; + } + + @Override + public TupleQueryResultFormat getQueryResultFormat() { + return getTupleQueryResultFormat(); + } + + @Override + protected void writeValue(Value value) throws IOException, QueryResultHandlerException { + if (value instanceof Triple) { + jg.writeStartObject(); + + jg.writeStringField(AbstractSPARQLJSONParser.TYPE, TRIPLE); + + jg.writeObjectFieldStart(AbstractSPARQLJSONParser.VALUE); + + jg.writeFieldName(SUBJECT); + writeValue(((Triple) value).getSubject()); + + jg.writeFieldName(PREDICATE); + writeValue(((Triple) value).getPredicate()); + + jg.writeFieldName(OBJECT); + writeValue(((Triple) value).getObject()); + + jg.writeEndObject(); + + jg.writeEndObject(); + } else { + super.writeValue(value); + } + } +} diff --git a/core/queryresultio/sparqljson/src/main/java/org/eclipse/rdf4j/query/resultio/sparqlstarjson/SPARQLStarResultsJSONWriterFactory.java b/core/queryresultio/sparqljson/src/main/java/org/eclipse/rdf4j/query/resultio/sparqlstarjson/SPARQLStarResultsJSONWriterFactory.java new file mode 100644 index 00000000000..f033da4203f --- /dev/null +++ b/core/queryresultio/sparqljson/src/main/java/org/eclipse/rdf4j/query/resultio/sparqlstarjson/SPARQLStarResultsJSONWriterFactory.java @@ -0,0 +1,37 @@ +/******************************************************************************* + * Copyright (c) 2020 Eclipse RDF4J contributors. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Distribution License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ +package org.eclipse.rdf4j.query.resultio.sparqlstarjson; + +import java.io.OutputStream; + +import org.eclipse.rdf4j.query.resultio.TupleQueryResultFormat; +import org.eclipse.rdf4j.query.resultio.TupleQueryResultWriter; +import org.eclipse.rdf4j.query.resultio.TupleQueryResultWriterFactory; + +/** + * {@link TupleQueryResultWriterFactory} for creating instances of {@link SPARQLStarResultsJSONWriter}. + * + * @author Pavel Mihaylov + */ +public class SPARQLStarResultsJSONWriterFactory implements TupleQueryResultWriterFactory { + /** + * Returns {@link TupleQueryResultFormat#JSON_STAR}. + */ + @Override + public TupleQueryResultFormat getTupleQueryResultFormat() { + return SPARQLStarResultsJSONConstants.QUERY_RESULT_FORMAT; + } + + /** + * Returns a new instance of {@link SPARQLStarResultsJSONWriter}. + */ + @Override + public TupleQueryResultWriter getWriter(OutputStream out) { + return new SPARQLStarResultsJSONWriter(out); + } +} diff --git a/core/queryresultio/sparqljson/src/main/resources/META-INF/services/org.eclipse.rdf4j.query.resultio.TupleQueryResultParserFactory b/core/queryresultio/sparqljson/src/main/resources/META-INF/services/org.eclipse.rdf4j.query.resultio.TupleQueryResultParserFactory index be685bb81d8..74e68841704 100644 --- a/core/queryresultio/sparqljson/src/main/resources/META-INF/services/org.eclipse.rdf4j.query.resultio.TupleQueryResultParserFactory +++ b/core/queryresultio/sparqljson/src/main/resources/META-INF/services/org.eclipse.rdf4j.query.resultio.TupleQueryResultParserFactory @@ -1 +1,2 @@ org.eclipse.rdf4j.query.resultio.sparqljson.SPARQLResultsJSONParserFactory +org.eclipse.rdf4j.query.resultio.sparqlstarjson.SPARQLStarResultsJSONParserFactory diff --git a/core/queryresultio/sparqljson/src/main/resources/META-INF/services/org.eclipse.rdf4j.query.resultio.TupleQueryResultWriterFactory b/core/queryresultio/sparqljson/src/main/resources/META-INF/services/org.eclipse.rdf4j.query.resultio.TupleQueryResultWriterFactory index cc2de8424ed..22e81bf8afa 100644 --- a/core/queryresultio/sparqljson/src/main/resources/META-INF/services/org.eclipse.rdf4j.query.resultio.TupleQueryResultWriterFactory +++ b/core/queryresultio/sparqljson/src/main/resources/META-INF/services/org.eclipse.rdf4j.query.resultio.TupleQueryResultWriterFactory @@ -1 +1,2 @@ org.eclipse.rdf4j.query.resultio.sparqljson.SPARQLResultsJSONWriterFactory +org.eclipse.rdf4j.query.resultio.sparqlstarjson.SPARQLStarResultsJSONWriterFactory diff --git a/core/queryresultio/sparqljson/src/test/java/org/eclipse/rdf4j/query/resultio/sparqljson/SPARQLJSONBooleanTest.java b/core/queryresultio/sparqljson/src/test/java/org/eclipse/rdf4j/query/resultio/sparqljson/SPARQLJSONBooleanTest.java index 401eca30966..09a88b603d5 100644 --- a/core/queryresultio/sparqljson/src/test/java/org/eclipse/rdf4j/query/resultio/sparqljson/SPARQLJSONBooleanTest.java +++ b/core/queryresultio/sparqljson/src/test/java/org/eclipse/rdf4j/query/resultio/sparqljson/SPARQLJSONBooleanTest.java @@ -7,7 +7,8 @@ *******************************************************************************/ package org.eclipse.rdf4j.query.resultio.sparqljson; -import static org.junit.Assert.*; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; import org.eclipse.rdf4j.model.impl.SimpleValueFactory; import org.eclipse.rdf4j.query.resultio.AbstractQueryResultIOBooleanTest; diff --git a/core/queryresultio/sparqljson/src/test/java/org/eclipse/rdf4j/query/resultio/sparqljson/SPARQLJSONParserCustomTest.java b/core/queryresultio/sparqljson/src/test/java/org/eclipse/rdf4j/query/resultio/sparqljson/SPARQLJSONParserCustomTest.java index cd5c8907598..f429ca428b7 100644 --- a/core/queryresultio/sparqljson/src/test/java/org/eclipse/rdf4j/query/resultio/sparqljson/SPARQLJSONParserCustomTest.java +++ b/core/queryresultio/sparqljson/src/test/java/org/eclipse/rdf4j/query/resultio/sparqljson/SPARQLJSONParserCustomTest.java @@ -7,7 +7,11 @@ *******************************************************************************/ package org.eclipse.rdf4j.query.resultio.sparqljson; -import static org.junit.Assert.*; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; import java.io.ByteArrayInputStream; import java.io.InputStream; @@ -35,7 +39,7 @@ /** * Custom (non-manifest) tests for SPARQL/JSON parser. - * + * * @author Peter Ansell */ public class SPARQLJSONParserCustomTest { diff --git a/core/queryresultio/sparqljson/src/test/java/org/eclipse/rdf4j/query/resultio/sparqljson/SPARQLJSONTupleBackgroundTest.java b/core/queryresultio/sparqljson/src/test/java/org/eclipse/rdf4j/query/resultio/sparqljson/SPARQLJSONTupleBackgroundTest.java index bcb59bbf5f4..6e9cff0d49b 100644 --- a/core/queryresultio/sparqljson/src/test/java/org/eclipse/rdf4j/query/resultio/sparqljson/SPARQLJSONTupleBackgroundTest.java +++ b/core/queryresultio/sparqljson/src/test/java/org/eclipse/rdf4j/query/resultio/sparqljson/SPARQLJSONTupleBackgroundTest.java @@ -7,7 +7,12 @@ *******************************************************************************/ package org.eclipse.rdf4j.query.resultio.sparqljson; -import static org.junit.Assert.*; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; import java.io.IOException; import java.io.InputStream; diff --git a/core/queryresultio/sparqljson/src/test/java/org/eclipse/rdf4j/query/resultio/sparqljson/SPARQLJSONTupleTest.java b/core/queryresultio/sparqljson/src/test/java/org/eclipse/rdf4j/query/resultio/sparqljson/SPARQLJSONTupleTest.java index f36a94bee72..b0217bd6e6c 100644 --- a/core/queryresultio/sparqljson/src/test/java/org/eclipse/rdf4j/query/resultio/sparqljson/SPARQLJSONTupleTest.java +++ b/core/queryresultio/sparqljson/src/test/java/org/eclipse/rdf4j/query/resultio/sparqljson/SPARQLJSONTupleTest.java @@ -7,7 +7,12 @@ *******************************************************************************/ package org.eclipse.rdf4j.query.resultio.sparqljson; -import static org.junit.Assert.*; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; import java.io.InputStream; diff --git a/core/queryresultio/sparqljson/src/test/java/org/eclipse/rdf4j/query/resultio/sparqlstarjson/SPARQLStarJSONTupleBackgroundTest.java b/core/queryresultio/sparqljson/src/test/java/org/eclipse/rdf4j/query/resultio/sparqlstarjson/SPARQLStarJSONTupleBackgroundTest.java new file mode 100644 index 00000000000..92d3ae4aa41 --- /dev/null +++ b/core/queryresultio/sparqljson/src/test/java/org/eclipse/rdf4j/query/resultio/sparqlstarjson/SPARQLStarJSONTupleBackgroundTest.java @@ -0,0 +1,46 @@ +/******************************************************************************* + * Copyright (c) 2020 Eclipse RDF4J contributors. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Distribution License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ +package org.eclipse.rdf4j.query.resultio.sparqlstarjson; + +import java.io.IOException; +import java.io.InputStream; + +import org.eclipse.rdf4j.query.TupleQueryResult; +import org.eclipse.rdf4j.query.TupleQueryResultHandlerException; +import org.eclipse.rdf4j.query.resultio.AbstractQueryResultIOTupleTest; +import org.eclipse.rdf4j.query.resultio.BooleanQueryResultFormat; +import org.eclipse.rdf4j.query.resultio.QueryResultIO; +import org.eclipse.rdf4j.query.resultio.QueryResultParseException; +import org.eclipse.rdf4j.query.resultio.TupleQueryResultFormat; +import org.eclipse.rdf4j.query.resultio.UnsupportedQueryResultFormatException; + +/** + * @author Pavel Mihaylov + */ +public class SPARQLStarJSONTupleBackgroundTest extends AbstractQueryResultIOTupleTest { + @Override + protected String getFileName() { + return "test.srjs"; + } + + @Override + protected TupleQueryResultFormat getTupleFormat() { + return TupleQueryResultFormat.JSON_STAR; + } + + @Override + protected BooleanQueryResultFormat getMatchingBooleanFormatOrNull() { + return BooleanQueryResultFormat.JSON; + } + + @Override + protected TupleQueryResult parseTupleInternal(TupleQueryResultFormat format, InputStream in) throws IOException, + QueryResultParseException, TupleQueryResultHandlerException, UnsupportedQueryResultFormatException { + return QueryResultIO.parseTupleBackground(in, format); + } +} diff --git a/core/queryresultio/sparqljson/src/test/java/org/eclipse/rdf4j/query/resultio/sparqlstarjson/SPARQLStarJSONTupleTest.java b/core/queryresultio/sparqljson/src/test/java/org/eclipse/rdf4j/query/resultio/sparqlstarjson/SPARQLStarJSONTupleTest.java new file mode 100644 index 00000000000..14ceb10c0e5 --- /dev/null +++ b/core/queryresultio/sparqljson/src/test/java/org/eclipse/rdf4j/query/resultio/sparqlstarjson/SPARQLStarJSONTupleTest.java @@ -0,0 +1,32 @@ +/******************************************************************************* + * Copyright (c) 2020 Eclipse RDF4J contributors. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Distribution License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ +package org.eclipse.rdf4j.query.resultio.sparqlstarjson; + +import org.eclipse.rdf4j.query.resultio.AbstractQueryResultIOTupleTest; +import org.eclipse.rdf4j.query.resultio.BooleanQueryResultFormat; +import org.eclipse.rdf4j.query.resultio.TupleQueryResultFormat; + +/** + * @author Pavel Mihaylov + */ +public class SPARQLStarJSONTupleTest extends AbstractQueryResultIOTupleTest { + @Override + protected String getFileName() { + return "test.srjs"; + } + + @Override + protected TupleQueryResultFormat getTupleFormat() { + return TupleQueryResultFormat.JSON_STAR; + } + + @Override + protected BooleanQueryResultFormat getMatchingBooleanFormatOrNull() { + return BooleanQueryResultFormat.JSON; + } +} diff --git a/core/queryresultio/sparqlxml/pom.xml b/core/queryresultio/sparqlxml/pom.xml index 08a6c3768a1..064920627fe 100644 --- a/core/queryresultio/sparqlxml/pom.xml +++ b/core/queryresultio/sparqlxml/pom.xml @@ -4,7 +4,7 @@ org.eclipse.rdf4j rdf4j-queryresultio - 3.1.5-SNAPSHOT + 3.2.2-SNAPSHOT rdf4j-queryresultio-sparqlxml RDF4J: Query result IO - SPARQL/XML diff --git a/core/queryresultio/sparqlxml/src/main/java/org/eclipse/rdf4j/query/resultio/sparqlxml/AbstractSPARQLXMLParser.java b/core/queryresultio/sparqlxml/src/main/java/org/eclipse/rdf4j/query/resultio/sparqlxml/AbstractSPARQLXMLParser.java index 707e24349ff..aec782109f7 100644 --- a/core/queryresultio/sparqlxml/src/main/java/org/eclipse/rdf4j/query/resultio/sparqlxml/AbstractSPARQLXMLParser.java +++ b/core/queryresultio/sparqlxml/src/main/java/org/eclipse/rdf4j/query/resultio/sparqlxml/AbstractSPARQLXMLParser.java @@ -33,7 +33,7 @@ /** * Abstract base class for SPARQL Results XML Parsers. - * + * * @author Peter Ansell */ public abstract class AbstractSPARQLXMLParser extends AbstractQueryResultParser implements ErrorHandler { @@ -41,14 +41,14 @@ public abstract class AbstractSPARQLXMLParser extends AbstractQueryResultParser private SimpleSAXParser internalSAXParser; /** - * + * */ protected AbstractSPARQLXMLParser() { super(); } /** - * + * */ protected AbstractSPARQLXMLParser(ValueFactory valueFactory) { super(valueFactory); @@ -229,7 +229,7 @@ protected void reportWarning(String msg) { * {@link XMLReader#setProperty(String, Object)} *

    * Subclasses can override this to specify more supported settings. - * + * * @return A collection of {@link RioSetting}s that indicate which properties will always be setup using * {@link XMLReader#setProperty(String, Object)}. */ @@ -242,7 +242,7 @@ public Collection> getCompulsoryXmlPropertySettings() { * {@link XMLReader#setFeature(String, boolean)}. *

    * Subclasses can override this to specify more supported settings. - * + * * @return A collection of {@link RioSetting}s that indicate which boolean settings will always be setup using * {@link XMLReader#setFeature(String, boolean)}. */ @@ -260,7 +260,7 @@ public Collection> getCompulsoryXmlFeatureSettings() { * properties using {@link XMLReader#setProperty(String, Object)} *

    * Subclasses can override this to specify more supported settings. - * + * * @return A collection of {@link RioSetting}s that indicate which properties can be setup using * {@link XMLReader#setProperty(String, Object)}. */ @@ -273,7 +273,7 @@ public Collection> getOptionalXmlPropertySettings() { * using {@link XMLReader#setFeature(String, boolean)}. *

    * Subclasses can override this to specify more supported settings. - * + * * @return A collection of {@link RioSetting}s that indicate which boolean settings can be setup using * {@link XMLReader#setFeature(String, boolean)}. */ @@ -336,4 +336,4 @@ public void fatalError(SAXParseException exception) throws SAXException { internalSAXParser.getLocator().getColumnNumber())); } -} \ No newline at end of file +} diff --git a/core/queryresultio/sparqlxml/src/main/java/org/eclipse/rdf4j/query/resultio/sparqlxml/AbstractSPARQLXMLWriter.java b/core/queryresultio/sparqlxml/src/main/java/org/eclipse/rdf4j/query/resultio/sparqlxml/AbstractSPARQLXMLWriter.java index d08201cfdc6..49152f3a696 100644 --- a/core/queryresultio/sparqlxml/src/main/java/org/eclipse/rdf4j/query/resultio/sparqlxml/AbstractSPARQLXMLWriter.java +++ b/core/queryresultio/sparqlxml/src/main/java/org/eclipse/rdf4j/query/resultio/sparqlxml/AbstractSPARQLXMLWriter.java @@ -60,7 +60,7 @@ /** * An abstract class to implement the base functionality for both SPARQLBooleanXMLWriter and SPARQLResultsXMLWriter. - * + * * @author Peter Ansell */ abstract class AbstractSPARQLXMLWriter extends AbstractQueryResultWriter implements QueryResultWriter { @@ -94,7 +94,9 @@ abstract class AbstractSPARQLXMLWriter extends AbstractQueryResultWriter impleme *--------------*/ protected AbstractSPARQLXMLWriter(OutputStream out) { - this(new XMLWriter(out)); + super(out); + this.xmlWriter = new XMLWriter(out); + this.xmlWriter.setPrettyPrint(true); } protected AbstractSPARQLXMLWriter(XMLWriter xmlWriter) { @@ -110,7 +112,7 @@ protected AbstractSPARQLXMLWriter(XMLWriter xmlWriter) { * Enables/disables addition of indentation characters and newlines in the XML document. By default, pretty-printing * is set to true. If set to false, no indentation and newlines are added to the XML document. * This method has to be used before writing starts (that is, before {@link #startDocument} is called). - * + * * @deprecated Use {@link #getWriterConfig()} .set(BasicWriterSettings.PRETTY_PRINT, prettyPrint) instead. */ @Deprecated @@ -275,6 +277,8 @@ public void endHeader() throws QueryResultHandlerException { @Override public void startQueryResult(List bindingNames) throws TupleQueryResultHandlerException { + super.startQueryResult(bindingNames); + try { if (!documentOpen) { startDocument(); @@ -321,7 +325,7 @@ public void endQueryResult() throws TupleQueryResultHandlerException { } @Override - public void handleSolution(BindingSet bindingSet) throws TupleQueryResultHandlerException { + protected void handleSolutionImpl(BindingSet bindingSet) throws TupleQueryResultHandlerException { try { if (!documentOpen) { startDocument(); @@ -407,7 +411,7 @@ private boolean isQName(IRI nextUri) { * Write a QName for the given URI if and only if the {@link BasicQueryWriterSettings#ADD_SESAME_QNAME} setting has * been set to true. By default it is false, to ensure that this implementation stays within the specification by * default. - * + * * @param nextUri The prefixed URI to be written as a sesame qname attribute. */ private void writeQName(IRI nextUri) { diff --git a/core/queryresultio/sparqlxml/src/main/java/org/eclipse/rdf4j/query/resultio/sparqlxml/SPARQLBooleanSAXParser.java b/core/queryresultio/sparqlxml/src/main/java/org/eclipse/rdf4j/query/resultio/sparqlxml/SPARQLBooleanSAXParser.java index b8e6be59040..34ed803ec44 100644 --- a/core/queryresultio/sparqlxml/src/main/java/org/eclipse/rdf4j/query/resultio/sparqlxml/SPARQLBooleanSAXParser.java +++ b/core/queryresultio/sparqlxml/src/main/java/org/eclipse/rdf4j/query/resultio/sparqlxml/SPARQLBooleanSAXParser.java @@ -58,4 +58,4 @@ public void endDocument() throws SAXException { public boolean getValue() { return value != null && value; } -} \ No newline at end of file +} diff --git a/core/queryresultio/sparqlxml/src/main/java/org/eclipse/rdf4j/query/resultio/sparqlxml/SPARQLBooleanXMLParserFactory.java b/core/queryresultio/sparqlxml/src/main/java/org/eclipse/rdf4j/query/resultio/sparqlxml/SPARQLBooleanXMLParserFactory.java index e9e8d1dc5ac..9eb5857ec69 100644 --- a/core/queryresultio/sparqlxml/src/main/java/org/eclipse/rdf4j/query/resultio/sparqlxml/SPARQLBooleanXMLParserFactory.java +++ b/core/queryresultio/sparqlxml/src/main/java/org/eclipse/rdf4j/query/resultio/sparqlxml/SPARQLBooleanXMLParserFactory.java @@ -13,7 +13,7 @@ /** * A {@link BooleanQueryResultParserFactory} for parsers of SPARQL/XML boolean query results. - * + * * @author Arjohn Kampman */ public class SPARQLBooleanXMLParserFactory implements BooleanQueryResultParserFactory { diff --git a/core/queryresultio/sparqlxml/src/main/java/org/eclipse/rdf4j/query/resultio/sparqlxml/SPARQLBooleanXMLWriterFactory.java b/core/queryresultio/sparqlxml/src/main/java/org/eclipse/rdf4j/query/resultio/sparqlxml/SPARQLBooleanXMLWriterFactory.java index a2050852d85..c5e936347b4 100644 --- a/core/queryresultio/sparqlxml/src/main/java/org/eclipse/rdf4j/query/resultio/sparqlxml/SPARQLBooleanXMLWriterFactory.java +++ b/core/queryresultio/sparqlxml/src/main/java/org/eclipse/rdf4j/query/resultio/sparqlxml/SPARQLBooleanXMLWriterFactory.java @@ -15,7 +15,7 @@ /** * A {@link BooleanQueryResultWriterFactory} for writers of SPARQL/XML boolean query results. - * + * * @author Arjohn Kampman */ public class SPARQLBooleanXMLWriterFactory implements BooleanQueryResultWriterFactory { diff --git a/core/queryresultio/sparqlxml/src/main/java/org/eclipse/rdf4j/query/resultio/sparqlxml/SPARQLResultsSAXParser.java b/core/queryresultio/sparqlxml/src/main/java/org/eclipse/rdf4j/query/resultio/sparqlxml/SPARQLResultsSAXParser.java index 542b89ecafc..6fdbba4be1e 100644 --- a/core/queryresultio/sparqlxml/src/main/java/org/eclipse/rdf4j/query/resultio/sparqlxml/SPARQLResultsSAXParser.java +++ b/core/queryresultio/sparqlxml/src/main/java/org/eclipse/rdf4j/query/resultio/sparqlxml/SPARQLResultsSAXParser.java @@ -169,4 +169,4 @@ public void endTag(String tagName) throws SAXException { } } } -} \ No newline at end of file +} diff --git a/core/queryresultio/sparqlxml/src/main/java/org/eclipse/rdf4j/query/resultio/sparqlxml/SPARQLResultsXMLConstants.java b/core/queryresultio/sparqlxml/src/main/java/org/eclipse/rdf4j/query/resultio/sparqlxml/SPARQLResultsXMLConstants.java index de294b28dad..fa46e16dd8b 100644 --- a/core/queryresultio/sparqlxml/src/main/java/org/eclipse/rdf4j/query/resultio/sparqlxml/SPARQLResultsXMLConstants.java +++ b/core/queryresultio/sparqlxml/src/main/java/org/eclipse/rdf4j/query/resultio/sparqlxml/SPARQLResultsXMLConstants.java @@ -11,7 +11,7 @@ * Interface defining tags and attribute names that are used in SPARQL Results Documents. See * SPARQL Query Results XML Format for the definition of this * format. - * + * * @author Arjohn Kampman */ interface SPARQLResultsXMLConstants { diff --git a/core/queryresultio/sparqlxml/src/main/java/org/eclipse/rdf4j/query/resultio/sparqlxml/SPARQLResultsXMLParserFactory.java b/core/queryresultio/sparqlxml/src/main/java/org/eclipse/rdf4j/query/resultio/sparqlxml/SPARQLResultsXMLParserFactory.java index 04200741986..dbf1bad0c8f 100644 --- a/core/queryresultio/sparqlxml/src/main/java/org/eclipse/rdf4j/query/resultio/sparqlxml/SPARQLResultsXMLParserFactory.java +++ b/core/queryresultio/sparqlxml/src/main/java/org/eclipse/rdf4j/query/resultio/sparqlxml/SPARQLResultsXMLParserFactory.java @@ -13,7 +13,7 @@ /** * A {@link TupleQueryResultParserFactory} for parsers of SPARQL/XML tuple query results. - * + * * @author Arjohn Kampman */ public class SPARQLResultsXMLParserFactory implements TupleQueryResultParserFactory { diff --git a/core/queryresultio/sparqlxml/src/main/java/org/eclipse/rdf4j/query/resultio/sparqlxml/SPARQLResultsXMLWriterFactory.java b/core/queryresultio/sparqlxml/src/main/java/org/eclipse/rdf4j/query/resultio/sparqlxml/SPARQLResultsXMLWriterFactory.java index 4df478f3ad3..a179bb46604 100644 --- a/core/queryresultio/sparqlxml/src/main/java/org/eclipse/rdf4j/query/resultio/sparqlxml/SPARQLResultsXMLWriterFactory.java +++ b/core/queryresultio/sparqlxml/src/main/java/org/eclipse/rdf4j/query/resultio/sparqlxml/SPARQLResultsXMLWriterFactory.java @@ -15,7 +15,7 @@ /** * A {@link TupleQueryResultWriterFactory} for writers of SPARQL/XML tuple query results. - * + * * @author Arjohn Kampman */ public class SPARQLResultsXMLWriterFactory implements TupleQueryResultWriterFactory { diff --git a/core/queryresultio/sparqlxml/src/test/java/org/eclipse/rdf4j/query/resultio/sparqlxml/SPARQLXMLParserCustomTest.java b/core/queryresultio/sparqlxml/src/test/java/org/eclipse/rdf4j/query/resultio/sparqlxml/SPARQLXMLParserCustomTest.java index 9bfc2be09fe..1ab26312b77 100644 --- a/core/queryresultio/sparqlxml/src/test/java/org/eclipse/rdf4j/query/resultio/sparqlxml/SPARQLXMLParserCustomTest.java +++ b/core/queryresultio/sparqlxml/src/test/java/org/eclipse/rdf4j/query/resultio/sparqlxml/SPARQLXMLParserCustomTest.java @@ -7,7 +7,9 @@ *******************************************************************************/ package org.eclipse.rdf4j.query.resultio.sparqlxml; -import static org.junit.Assert.*; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; import org.eclipse.rdf4j.query.resultio.QueryResultIO; import org.eclipse.rdf4j.query.resultio.QueryResultParseException; @@ -22,7 +24,7 @@ /** * Custom tests for SPARQL/XML Parser. - * + * * @author Michael Grove * @author Peter Ansell */ @@ -30,7 +32,7 @@ public class SPARQLXMLParserCustomTest { /** * Test with the default ParserConfig settings. Ie, setParserConfig is not called. - * + * * @throws Exception */ @Test @@ -59,7 +61,7 @@ public void testEntityExpansionDefaultSettings() throws Exception { /** * Test with unrelated ParserConfig settings - * + * * @throws Exception */ @Test @@ -90,7 +92,7 @@ public void testEntityExpansionUnrelatedSettings() throws Exception { /** * Test with Secure processing setting on. - * + * * @throws Exception */ @Test @@ -124,7 +126,7 @@ public void testEntityExpansionSecureProcessing() throws Exception { * IMPORTANT: Only turn this on to verify it is still working, as there is no way to safely perform this test. *

    * WARNING: This test will cause an OutOfMemoryException when it eventually fails, as it will eventually fail. - * + * * @throws Exception */ @Ignore diff --git a/core/queryresultio/text/pom.xml b/core/queryresultio/text/pom.xml index 551df930edf..06e794ddaba 100644 --- a/core/queryresultio/text/pom.xml +++ b/core/queryresultio/text/pom.xml @@ -4,7 +4,7 @@ org.eclipse.rdf4j rdf4j-queryresultio - 3.1.5-SNAPSHOT + 3.2.2-SNAPSHOT rdf4j-queryresultio-text RDF4J: Query result IO - plain text booleans diff --git a/core/queryresultio/text/src/main/java/org/eclipse/rdf4j/query/resultio/text/BooleanTextParserFactory.java b/core/queryresultio/text/src/main/java/org/eclipse/rdf4j/query/resultio/text/BooleanTextParserFactory.java index 366807c0498..56a9de6354c 100644 --- a/core/queryresultio/text/src/main/java/org/eclipse/rdf4j/query/resultio/text/BooleanTextParserFactory.java +++ b/core/queryresultio/text/src/main/java/org/eclipse/rdf4j/query/resultio/text/BooleanTextParserFactory.java @@ -13,7 +13,7 @@ /** * A {@link BooleanQueryResultParserFactory} for plain text boolean result parsers. - * + * * @author Arjohn Kampman */ public class BooleanTextParserFactory implements BooleanQueryResultParserFactory { diff --git a/core/queryresultio/text/src/main/java/org/eclipse/rdf4j/query/resultio/text/BooleanTextWriter.java b/core/queryresultio/text/src/main/java/org/eclipse/rdf4j/query/resultio/text/BooleanTextWriter.java index 7febcbe9f93..ac648df4c86 100644 --- a/core/queryresultio/text/src/main/java/org/eclipse/rdf4j/query/resultio/text/BooleanTextWriter.java +++ b/core/queryresultio/text/src/main/java/org/eclipse/rdf4j/query/resultio/text/BooleanTextWriter.java @@ -24,7 +24,7 @@ /** * Writer for the plain text boolean result format. - * + * * @author Arjohn Kampman */ public class BooleanTextWriter extends AbstractQueryResultWriter implements BooleanQueryResultWriter { @@ -119,7 +119,7 @@ public void endQueryResult() throws TupleQueryResultHandlerException { } @Override - public void handleSolution(BindingSet bindingSet) throws TupleQueryResultHandlerException { + protected void handleSolutionImpl(BindingSet bindingSet) throws TupleQueryResultHandlerException { throw new UnsupportedOperationException("Cannot handle tuple results"); } diff --git a/core/queryresultio/text/src/main/java/org/eclipse/rdf4j/query/resultio/text/BooleanTextWriterFactory.java b/core/queryresultio/text/src/main/java/org/eclipse/rdf4j/query/resultio/text/BooleanTextWriterFactory.java index 3269550a170..6f2f7b9dc66 100644 --- a/core/queryresultio/text/src/main/java/org/eclipse/rdf4j/query/resultio/text/BooleanTextWriterFactory.java +++ b/core/queryresultio/text/src/main/java/org/eclipse/rdf4j/query/resultio/text/BooleanTextWriterFactory.java @@ -15,7 +15,7 @@ /** * A {@link BooleanQueryResultWriterFactory} for writers of plain text boolean query results. - * + * * @author Arjohn Kampman */ public class BooleanTextWriterFactory implements BooleanQueryResultWriterFactory { diff --git a/core/queryresultio/text/src/main/java/org/eclipse/rdf4j/query/resultio/text/csv/SPARQLResultsCSVParser.java b/core/queryresultio/text/src/main/java/org/eclipse/rdf4j/query/resultio/text/csv/SPARQLResultsCSVParser.java index d38c5fee32f..02ee3922147 100644 --- a/core/queryresultio/text/src/main/java/org/eclipse/rdf4j/query/resultio/text/csv/SPARQLResultsCSVParser.java +++ b/core/queryresultio/text/src/main/java/org/eclipse/rdf4j/query/resultio/text/csv/SPARQLResultsCSVParser.java @@ -23,7 +23,7 @@ /** * SPARQL Results CSV format parser. - * + * * @author Jeen Broekstra * @author Andrew Rucker Jones */ diff --git a/core/queryresultio/text/src/main/java/org/eclipse/rdf4j/query/resultio/text/csv/SPARQLResultsCSVParserFactory.java b/core/queryresultio/text/src/main/java/org/eclipse/rdf4j/query/resultio/text/csv/SPARQLResultsCSVParserFactory.java index 4a3ab15e312..f8d1d1968d7 100644 --- a/core/queryresultio/text/src/main/java/org/eclipse/rdf4j/query/resultio/text/csv/SPARQLResultsCSVParserFactory.java +++ b/core/queryresultio/text/src/main/java/org/eclipse/rdf4j/query/resultio/text/csv/SPARQLResultsCSVParserFactory.java @@ -13,7 +13,7 @@ /** * A {@link TupleQueryResultParserFactory} for SPARQL CSV result parsers. - * + * * @author Jeen Broekstra */ public class SPARQLResultsCSVParserFactory implements TupleQueryResultParserFactory { diff --git a/core/queryresultio/text/src/main/java/org/eclipse/rdf4j/query/resultio/text/csv/SPARQLResultsCSVWriter.java b/core/queryresultio/text/src/main/java/org/eclipse/rdf4j/query/resultio/text/csv/SPARQLResultsCSVWriter.java index 9e38fc17b36..a82347455c2 100644 --- a/core/queryresultio/text/src/main/java/org/eclipse/rdf4j/query/resultio/text/csv/SPARQLResultsCSVWriter.java +++ b/core/queryresultio/text/src/main/java/org/eclipse/rdf4j/query/resultio/text/csv/SPARQLResultsCSVWriter.java @@ -31,7 +31,7 @@ /** * TupleQueryResultWriter for the SPARQL CSV (Comma-Separated Values) format. - * + * * @see SPARQL 1.1 Query Results CSV Format * @author Jeen Broekstra */ @@ -45,12 +45,15 @@ public class SPARQLResultsCSVWriter extends AbstractQueryResultWriter implements * @param out */ public SPARQLResultsCSVWriter(OutputStream out) { + super(out); Writer w = new OutputStreamWriter(out, StandardCharsets.UTF_8); writer = new BufferedWriter(w, 1024); } @Override public void startQueryResult(List bindingNames) throws TupleQueryResultHandlerException { + super.startQueryResult(bindingNames); + this.bindingNames = bindingNames; try { @@ -80,7 +83,7 @@ public void endQueryResult() throws TupleQueryResultHandlerException { } @Override - public void handleSolution(BindingSet bindingSet) throws TupleQueryResultHandlerException { + protected void handleSolutionImpl(BindingSet bindingSet) throws TupleQueryResultHandlerException { if (bindingNames == null) { throw new IllegalStateException("Must call startQueryResult before handleSolution"); } diff --git a/core/queryresultio/text/src/main/java/org/eclipse/rdf4j/query/resultio/text/csv/SPARQLResultsCSVWriterFactory.java b/core/queryresultio/text/src/main/java/org/eclipse/rdf4j/query/resultio/text/csv/SPARQLResultsCSVWriterFactory.java index e493a865581..54dedcb270c 100644 --- a/core/queryresultio/text/src/main/java/org/eclipse/rdf4j/query/resultio/text/csv/SPARQLResultsCSVWriterFactory.java +++ b/core/queryresultio/text/src/main/java/org/eclipse/rdf4j/query/resultio/text/csv/SPARQLResultsCSVWriterFactory.java @@ -15,7 +15,7 @@ /** * A {@link TupleQueryResultWriterFactory} for writers of SPARQL/CSV tuple query results. - * + * * @author Jeen Broekstra */ public class SPARQLResultsCSVWriterFactory implements TupleQueryResultWriterFactory { diff --git a/core/queryresultio/text/src/main/java/org/eclipse/rdf4j/query/resultio/text/tsv/SPARQLResultsTSVMappingStrategy.java b/core/queryresultio/text/src/main/java/org/eclipse/rdf4j/query/resultio/text/tsv/SPARQLResultsTSVMappingStrategy.java index 638af913be4..593c7d12d23 100644 --- a/core/queryresultio/text/src/main/java/org/eclipse/rdf4j/query/resultio/text/tsv/SPARQLResultsTSVMappingStrategy.java +++ b/core/queryresultio/text/src/main/java/org/eclipse/rdf4j/query/resultio/text/tsv/SPARQLResultsTSVMappingStrategy.java @@ -49,29 +49,33 @@ public BindingSet populateNewBean(String[] line) { // process solution List values = new ArrayList<>(line.length); for (String valueString : line) { - Value v = null; - if (valueString.startsWith("_:")) { - v = valueFactory.createBNode(valueString.substring(2)); - } else if (valueString.startsWith("<") && valueString.endsWith(">")) { - try { - v = valueFactory.createIRI(valueString.substring(1, valueString.length() - 1)); - } catch (IllegalArgumentException e) { - v = valueFactory.createLiteral(valueString); - } - } else if (valueString.startsWith("\"")) { - v = parseLiteral(valueString); - } else if (!"".equals(valueString)) { - if (numberPattern.matcher(valueString).matches()) { - v = parseNumberPatternMatch(valueString); - } else { - v = valueFactory.createLiteral(valueString); - } - } - values.add(v); + values.add(parseValue(valueString)); } return new ListBindingSet(bindingNames, values.toArray(new Value[values.size()])); } + protected Value parseValue(String valueString) { + Value v = null; + if (valueString.startsWith("_:")) { + v = valueFactory.createBNode(valueString.substring(2)); + } else if (valueString.startsWith("<") && valueString.endsWith(">")) { + try { + v = valueFactory.createIRI(valueString.substring(1, valueString.length() - 1)); + } catch (IllegalArgumentException e) { + v = valueFactory.createLiteral(valueString); + } + } else if (valueString.startsWith("\"")) { + v = parseLiteral(valueString); + } else if (!"".equals(valueString)) { + if (numberPattern.matcher(valueString).matches()) { + v = parseNumberPatternMatch(valueString); + } else { + v = valueFactory.createLiteral(valueString); + } + } + return v; + } + /** * Parses a literal, creates an object for it and returns this object. * diff --git a/core/queryresultio/text/src/main/java/org/eclipse/rdf4j/query/resultio/text/tsv/SPARQLResultsTSVParser.java b/core/queryresultio/text/src/main/java/org/eclipse/rdf4j/query/resultio/text/tsv/SPARQLResultsTSVParser.java index 0031b225939..82e8d9c48a1 100644 --- a/core/queryresultio/text/src/main/java/org/eclipse/rdf4j/query/resultio/text/tsv/SPARQLResultsTSVParser.java +++ b/core/queryresultio/text/src/main/java/org/eclipse/rdf4j/query/resultio/text/tsv/SPARQLResultsTSVParser.java @@ -25,7 +25,7 @@ /** * SPARQL Results TSV format parser. - * + * * @author Jeen Broekstra * @author Andrew Rucker Jones */ @@ -39,7 +39,7 @@ public TupleQueryResultFormat getTupleQueryResultFormat() { @Override public void parse(InputStream in) throws QueryResultParseException, TupleQueryResultHandlerException { if (handler != null) { - SPARQLResultsTSVMappingStrategy strategy = new SPARQLResultsTSVMappingStrategy(valueFactory); + SPARQLResultsTSVMappingStrategy strategy = createMappingStrategy(); Reader reader = new InputStreamReader(in, StandardCharsets.UTF_8); CsvToBean csvToBean = new CsvToBeanBuilder(reader).withType(BindingSet.class) @@ -56,4 +56,8 @@ public void parse(InputStream in) throws QueryResultParseException, TupleQueryRe handler.endQueryResult(); } } + + protected SPARQLResultsTSVMappingStrategy createMappingStrategy() { + return new SPARQLResultsTSVMappingStrategy(valueFactory); + } } diff --git a/core/queryresultio/text/src/main/java/org/eclipse/rdf4j/query/resultio/text/tsv/SPARQLResultsTSVParserFactory.java b/core/queryresultio/text/src/main/java/org/eclipse/rdf4j/query/resultio/text/tsv/SPARQLResultsTSVParserFactory.java index a1a72c56808..1e4b24e45b4 100644 --- a/core/queryresultio/text/src/main/java/org/eclipse/rdf4j/query/resultio/text/tsv/SPARQLResultsTSVParserFactory.java +++ b/core/queryresultio/text/src/main/java/org/eclipse/rdf4j/query/resultio/text/tsv/SPARQLResultsTSVParserFactory.java @@ -13,7 +13,7 @@ /** * A {@link TupleQueryResultParserFactory} for SPARQL TSV result parsers. - * + * * @author Jeen Broekstra */ public class SPARQLResultsTSVParserFactory implements TupleQueryResultParserFactory { diff --git a/core/queryresultio/text/src/main/java/org/eclipse/rdf4j/query/resultio/text/tsv/SPARQLResultsTSVWriter.java b/core/queryresultio/text/src/main/java/org/eclipse/rdf4j/query/resultio/text/tsv/SPARQLResultsTSVWriter.java index 15120552100..6c1dfbb528c 100644 --- a/core/queryresultio/text/src/main/java/org/eclipse/rdf4j/query/resultio/text/tsv/SPARQLResultsTSVWriter.java +++ b/core/queryresultio/text/src/main/java/org/eclipse/rdf4j/query/resultio/text/tsv/SPARQLResultsTSVWriter.java @@ -33,13 +33,13 @@ /** * TupleQueryResultWriter for the SPARQL TSV (Tab-Separated Values) format. - * + * * @see SPARQL 1.1 Query Results TSV Format * @author Jeen Broekstra */ public class SPARQLResultsTSVWriter extends AbstractQueryResultWriter implements TupleQueryResultWriter { - private Writer writer; + protected Writer writer; private List bindingNames; @@ -49,12 +49,15 @@ public class SPARQLResultsTSVWriter extends AbstractQueryResultWriter implements * @param out */ public SPARQLResultsTSVWriter(OutputStream out) { + super(out); Writer w = new OutputStreamWriter(out, StandardCharsets.UTF_8); writer = new BufferedWriter(w, 1024); } @Override public void startQueryResult(List bindingNames) throws TupleQueryResultHandlerException { + super.startQueryResult(bindingNames); + tupleVariablesFound = true; this.bindingNames = bindingNames; @@ -88,7 +91,7 @@ public void endQueryResult() throws TupleQueryResultHandlerException { } @Override - public void handleSolution(BindingSet bindingSet) throws TupleQueryResultHandlerException { + protected void handleSolutionImpl(BindingSet bindingSet) throws TupleQueryResultHandlerException { if (!tupleVariablesFound) { throw new IllegalStateException("Must call startQueryResult before handleSolution"); } @@ -112,7 +115,7 @@ public void handleSolution(BindingSet bindingSet) throws TupleQueryResultHandler } @Override - public final TupleQueryResultFormat getTupleQueryResultFormat() { + public TupleQueryResultFormat getTupleQueryResultFormat() { return TupleQueryResultFormat.TSV; } diff --git a/core/queryresultio/text/src/main/java/org/eclipse/rdf4j/query/resultio/text/tsv/SPARQLResultsTSVWriterFactory.java b/core/queryresultio/text/src/main/java/org/eclipse/rdf4j/query/resultio/text/tsv/SPARQLResultsTSVWriterFactory.java index 3b50f23a276..555e5841a94 100644 --- a/core/queryresultio/text/src/main/java/org/eclipse/rdf4j/query/resultio/text/tsv/SPARQLResultsTSVWriterFactory.java +++ b/core/queryresultio/text/src/main/java/org/eclipse/rdf4j/query/resultio/text/tsv/SPARQLResultsTSVWriterFactory.java @@ -15,7 +15,7 @@ /** * A {@link TupleQueryResultWriterFactory} for writers of SPARQL/TSV tuple query results. - * + * * @author Jeen Broekstra */ public class SPARQLResultsTSVWriterFactory implements TupleQueryResultWriterFactory { diff --git a/core/queryresultio/text/src/main/java/org/eclipse/rdf4j/query/resultio/textstar/tsv/SPARQLStarResultsTSVMappingStrategy.java b/core/queryresultio/text/src/main/java/org/eclipse/rdf4j/query/resultio/textstar/tsv/SPARQLStarResultsTSVMappingStrategy.java new file mode 100644 index 00000000000..69c6e6dd0ce --- /dev/null +++ b/core/queryresultio/text/src/main/java/org/eclipse/rdf4j/query/resultio/textstar/tsv/SPARQLStarResultsTSVMappingStrategy.java @@ -0,0 +1,33 @@ +/******************************************************************************* + * Copyright (c) 2020 Eclipse RDF4J contributors. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Distribution License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ +package org.eclipse.rdf4j.query.resultio.textstar.tsv; + +import org.eclipse.rdf4j.model.Value; +import org.eclipse.rdf4j.model.ValueFactory; +import org.eclipse.rdf4j.query.resultio.text.tsv.SPARQLResultsTSVMappingStrategy; +import org.eclipse.rdf4j.rio.helpers.NTriplesUtil; + +/** + * Extends {@link SPARQLResultsTSVMappingStrategy} with support for parsing a {@link org.eclipse.rdf4j.model.Triple}. + * + * @author Pavel Mihaylov + */ +public class SPARQLStarResultsTSVMappingStrategy extends SPARQLResultsTSVMappingStrategy { + public SPARQLStarResultsTSVMappingStrategy(ValueFactory valueFactory) { + super(valueFactory); + } + + @Override + protected Value parseValue(String valueString) { + if (valueString.startsWith("<<")) { + return NTriplesUtil.parseTriple(valueString, valueFactory); + } else { + return super.parseValue(valueString); + } + } +} diff --git a/core/queryresultio/text/src/main/java/org/eclipse/rdf4j/query/resultio/textstar/tsv/SPARQLStarResultsTSVParser.java b/core/queryresultio/text/src/main/java/org/eclipse/rdf4j/query/resultio/textstar/tsv/SPARQLStarResultsTSVParser.java new file mode 100644 index 00000000000..5ddd2e13c36 --- /dev/null +++ b/core/queryresultio/text/src/main/java/org/eclipse/rdf4j/query/resultio/textstar/tsv/SPARQLStarResultsTSVParser.java @@ -0,0 +1,31 @@ +/******************************************************************************* + * Copyright (c) 2020 Eclipse RDF4J contributors. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Distribution License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ +package org.eclipse.rdf4j.query.resultio.textstar.tsv; + +import org.eclipse.rdf4j.query.resultio.TupleQueryResultFormat; +import org.eclipse.rdf4j.query.resultio.text.tsv.SPARQLResultsTSVMappingStrategy; +import org.eclipse.rdf4j.query.resultio.text.tsv.SPARQLResultsTSVParser; + +/** + * Parser for SPARQL* TSV results. This is equivalent to the SPARQL TSV parser with the addition of support for RDF* + * triples. Serialized triples must be in Turtle* fashion with the notable exception that any embedded literals may not + * use the triple quotes notation (as regular literals in SPARQL TSV). + * + * @author Pavel Mihaylov + */ +public class SPARQLStarResultsTSVParser extends SPARQLResultsTSVParser { + @Override + public TupleQueryResultFormat getTupleQueryResultFormat() { + return TupleQueryResultFormat.TSV_STAR; + } + + @Override + protected SPARQLResultsTSVMappingStrategy createMappingStrategy() { + return new SPARQLStarResultsTSVMappingStrategy(valueFactory); + } +} diff --git a/core/queryresultio/text/src/main/java/org/eclipse/rdf4j/query/resultio/textstar/tsv/SPARQLStarResultsTSVParserFactory.java b/core/queryresultio/text/src/main/java/org/eclipse/rdf4j/query/resultio/textstar/tsv/SPARQLStarResultsTSVParserFactory.java new file mode 100644 index 00000000000..593efab955d --- /dev/null +++ b/core/queryresultio/text/src/main/java/org/eclipse/rdf4j/query/resultio/textstar/tsv/SPARQLStarResultsTSVParserFactory.java @@ -0,0 +1,35 @@ +/******************************************************************************* + * Copyright (c) 2020 Eclipse RDF4J contributors. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Distribution License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ +package org.eclipse.rdf4j.query.resultio.textstar.tsv; + +import org.eclipse.rdf4j.query.resultio.TupleQueryResultFormat; +import org.eclipse.rdf4j.query.resultio.TupleQueryResultParser; +import org.eclipse.rdf4j.query.resultio.TupleQueryResultParserFactory; + +/** + * {@link TupleQueryResultParserFactory} for creating instances of {@link SPARQLStarResultsTSVParser}. + * + * @author Pavel Mihaylov + */ +public class SPARQLStarResultsTSVParserFactory implements TupleQueryResultParserFactory { + /** + * Returns {@link TupleQueryResultFormat#TSV_STAR}. + */ + @Override + public TupleQueryResultFormat getTupleQueryResultFormat() { + return TupleQueryResultFormat.TSV_STAR; + } + + /** + * Returns a new instance of {@link SPARQLStarResultsTSVParser}. + */ + @Override + public TupleQueryResultParser getParser() { + return new SPARQLStarResultsTSVParser(); + } +} diff --git a/core/queryresultio/text/src/main/java/org/eclipse/rdf4j/query/resultio/textstar/tsv/SPARQLStarResultsTSVWriter.java b/core/queryresultio/text/src/main/java/org/eclipse/rdf4j/query/resultio/textstar/tsv/SPARQLStarResultsTSVWriter.java new file mode 100644 index 00000000000..a946a81a311 --- /dev/null +++ b/core/queryresultio/text/src/main/java/org/eclipse/rdf4j/query/resultio/textstar/tsv/SPARQLStarResultsTSVWriter.java @@ -0,0 +1,49 @@ +/******************************************************************************* + * Copyright (c) 2020 Eclipse RDF4J contributors. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Distribution License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ +package org.eclipse.rdf4j.query.resultio.textstar.tsv; + +import java.io.IOException; +import java.io.OutputStream; + +import org.eclipse.rdf4j.model.Triple; +import org.eclipse.rdf4j.model.Value; +import org.eclipse.rdf4j.query.resultio.TupleQueryResultFormat; +import org.eclipse.rdf4j.query.resultio.text.tsv.SPARQLResultsTSVWriter; + +/** + * Writer for SPARQL* TSV results. This is equivalent to the SPARQL TSV writer with the addition of support for RDF* + * triples. Triples will be serialized in Turtle* fashion with the notable exception that any embedded literals will not + * use the triple quotes notation (as regular literals in SPARQL TSV). + * + * @author Pavel Mihaylov + */ +public class SPARQLStarResultsTSVWriter extends SPARQLResultsTSVWriter { + public SPARQLStarResultsTSVWriter(OutputStream out) { + super(out); + } + + @Override + public TupleQueryResultFormat getTupleQueryResultFormat() { + return TupleQueryResultFormat.TSV_STAR; + } + + @Override + protected void writeValue(Value val) throws IOException { + if (val instanceof Triple) { + writer.write("<<"); + writeValue(((Triple) val).getSubject()); + writer.write(' '); + writeValue(((Triple) val).getPredicate()); + writer.write(' '); + writeValue(((Triple) val).getObject()); + writer.write(">>"); + } else { + super.writeValue(val); + } + } +} diff --git a/core/queryresultio/text/src/main/java/org/eclipse/rdf4j/query/resultio/textstar/tsv/SPARQLStarResultsTSVWriterFactory.java b/core/queryresultio/text/src/main/java/org/eclipse/rdf4j/query/resultio/textstar/tsv/SPARQLStarResultsTSVWriterFactory.java new file mode 100644 index 00000000000..206cfa5ab64 --- /dev/null +++ b/core/queryresultio/text/src/main/java/org/eclipse/rdf4j/query/resultio/textstar/tsv/SPARQLStarResultsTSVWriterFactory.java @@ -0,0 +1,37 @@ +/******************************************************************************* + * Copyright (c) 2020 Eclipse RDF4J contributors. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Distribution License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ +package org.eclipse.rdf4j.query.resultio.textstar.tsv; + +import java.io.OutputStream; + +import org.eclipse.rdf4j.query.resultio.TupleQueryResultFormat; +import org.eclipse.rdf4j.query.resultio.TupleQueryResultWriter; +import org.eclipse.rdf4j.query.resultio.TupleQueryResultWriterFactory; + +/** + * {@link TupleQueryResultWriterFactory} for creating instances of {@link SPARQLStarResultsTSVWriter}. + * + * @author Pavel Mihaylov + */ +public class SPARQLStarResultsTSVWriterFactory implements TupleQueryResultWriterFactory { + /** + * Returns {@link TupleQueryResultFormat#TSV_STAR}. + */ + @Override + public TupleQueryResultFormat getTupleQueryResultFormat() { + return TupleQueryResultFormat.TSV_STAR; + } + + /** + * Returns a new instance of {@link SPARQLStarResultsTSVWriter}. + */ + @Override + public TupleQueryResultWriter getWriter(OutputStream out) { + return new SPARQLStarResultsTSVWriter(out); + } +} diff --git a/core/queryresultio/text/src/main/resources/META-INF/services/org.eclipse.rdf4j.query.resultio.TupleQueryResultParserFactory b/core/queryresultio/text/src/main/resources/META-INF/services/org.eclipse.rdf4j.query.resultio.TupleQueryResultParserFactory index d7c9dbc1d37..0543b8bd92e 100644 --- a/core/queryresultio/text/src/main/resources/META-INF/services/org.eclipse.rdf4j.query.resultio.TupleQueryResultParserFactory +++ b/core/queryresultio/text/src/main/resources/META-INF/services/org.eclipse.rdf4j.query.resultio.TupleQueryResultParserFactory @@ -1,2 +1,3 @@ org.eclipse.rdf4j.query.resultio.text.csv.SPARQLResultsCSVParserFactory org.eclipse.rdf4j.query.resultio.text.tsv.SPARQLResultsTSVParserFactory +org.eclipse.rdf4j.query.resultio.textstar.tsv.SPARQLStarResultsTSVParserFactory diff --git a/core/queryresultio/text/src/main/resources/META-INF/services/org.eclipse.rdf4j.query.resultio.TupleQueryResultWriterFactory b/core/queryresultio/text/src/main/resources/META-INF/services/org.eclipse.rdf4j.query.resultio.TupleQueryResultWriterFactory index d30a92cb4d8..a784b0e2fd7 100644 --- a/core/queryresultio/text/src/main/resources/META-INF/services/org.eclipse.rdf4j.query.resultio.TupleQueryResultWriterFactory +++ b/core/queryresultio/text/src/main/resources/META-INF/services/org.eclipse.rdf4j.query.resultio.TupleQueryResultWriterFactory @@ -1,2 +1,3 @@ org.eclipse.rdf4j.query.resultio.text.csv.SPARQLResultsCSVWriterFactory org.eclipse.rdf4j.query.resultio.text.tsv.SPARQLResultsTSVWriterFactory +org.eclipse.rdf4j.query.resultio.textstar.tsv.SPARQLStarResultsTSVWriterFactory diff --git a/core/queryresultio/text/src/test/java/org/eclipse/rdf4j/query/resultio/text/csv/CSVQueryResultsComparisons.java b/core/queryresultio/text/src/test/java/org/eclipse/rdf4j/query/resultio/text/csv/CSVQueryResultsComparisons.java index d14f4ead320..9b049305268 100644 --- a/core/queryresultio/text/src/test/java/org/eclipse/rdf4j/query/resultio/text/csv/CSVQueryResultsComparisons.java +++ b/core/queryresultio/text/src/test/java/org/eclipse/rdf4j/query/resultio/text/csv/CSVQueryResultsComparisons.java @@ -25,7 +25,7 @@ *

    * FIXME: This code is an adapted copy of the relevant parts of QueryEvaluationUtil. That util can not be used here * directly because of circular dependency issues between the rdf4j and rdf4j-storage repositories. - * + * * @author Jeen Broekstra */ class CSVQueryResultsComparisons { @@ -226,7 +226,7 @@ private static boolean isSupportedDatatype(IRI datatype) { /** * Checks whether the supplied literal is a "simple literal". A "simple literal" is a literal with no language tag * and the datatype {@link XMLSchema#STRING}. - * + * * @see SPARQL Simple Literal Documentation */ private static boolean isSimpleLiteral(Literal l) { diff --git a/core/queryresultio/text/src/test/java/org/eclipse/rdf4j/query/resultio/text/csv/SPARQLCSVTupleBackgroundTest.java b/core/queryresultio/text/src/test/java/org/eclipse/rdf4j/query/resultio/text/csv/SPARQLCSVTupleBackgroundTest.java index 277d48e6468..fe9c1a3465b 100644 --- a/core/queryresultio/text/src/test/java/org/eclipse/rdf4j/query/resultio/text/csv/SPARQLCSVTupleBackgroundTest.java +++ b/core/queryresultio/text/src/test/java/org/eclipse/rdf4j/query/resultio/text/csv/SPARQLCSVTupleBackgroundTest.java @@ -95,7 +95,9 @@ public void testSingleVarResults() throws Exception { assertRegex("a\r\n" + "foo:bar\r\n" + "2.0(E0)?\r\n" + "_:bnode3\r\n" + "''single-quoted string\r\n" + "\"\"\"\"\"double-quoted string\"\r\n" + "space at the end \r\n" + "space at the end \r\n" + "\"\"\"\"\"double-quoted string with no datatype\"\r\n" - + "\"newline at the end \n\"(\r\n)?", out.toString("UTF-8")); + + "\"newline at the end \n\"(\r\n)?" + + "urn:rdf4j:triple:PDw8dXJuOmE-IDxodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjdHlwZT4gPHVybjpiPj4-(\r\n)?", + out.toString("UTF-8")); } @Test diff --git a/core/queryresultio/text/src/test/java/org/eclipse/rdf4j/query/resultio/text/csv/SPARQLCSVTupleTest.java b/core/queryresultio/text/src/test/java/org/eclipse/rdf4j/query/resultio/text/csv/SPARQLCSVTupleTest.java index 91ec21eed5c..0a7e5b58ae3 100644 --- a/core/queryresultio/text/src/test/java/org/eclipse/rdf4j/query/resultio/text/csv/SPARQLCSVTupleTest.java +++ b/core/queryresultio/text/src/test/java/org/eclipse/rdf4j/query/resultio/text/csv/SPARQLCSVTupleTest.java @@ -95,7 +95,9 @@ public void testSingleVarResults() throws Exception { assertRegex("a\r\n" + "foo:bar\r\n" + "2.0(E0)?\r\n" + "_:bnode3\r\n" + "''single-quoted string\r\n" + "\"\"\"\"\"double-quoted string\"\r\n" + "space at the end \r\n" + "space at the end \r\n" + "\"\"\"\"\"double-quoted string with no datatype\"\r\n" - + "\"newline at the end \n\"(\r\n)?", out.toString("UTF-8")); + + "\"newline at the end \n\"(\r\n)?" + + "urn:rdf4j:triple:PDw8dXJuOmE-IDxodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjdHlwZT4gPHVybjpiPj4-(\r\n)?", + out.toString("UTF-8")); } @Test diff --git a/core/queryresultio/text/src/test/java/org/eclipse/rdf4j/query/resultio/text/tsv/SPARQLTSVCustomTest.java b/core/queryresultio/text/src/test/java/org/eclipse/rdf4j/query/resultio/text/tsv/SPARQLTSVCustomTest.java index d476b80f7ec..7bc84147a1a 100644 --- a/core/queryresultio/text/src/test/java/org/eclipse/rdf4j/query/resultio/text/tsv/SPARQLTSVCustomTest.java +++ b/core/queryresultio/text/src/test/java/org/eclipse/rdf4j/query/resultio/text/tsv/SPARQLTSVCustomTest.java @@ -7,7 +7,7 @@ *******************************************************************************/ package org.eclipse.rdf4j.query.resultio.text.tsv; -import static org.junit.Assert.*; +import static org.junit.Assert.assertEquals; import java.io.ByteArrayOutputStream; import java.io.IOException; @@ -39,7 +39,7 @@ public class SPARQLTSVCustomTest { *

    * NOTE: This will fail when using RDF-1.1, as the datatype {@link XMLSchema#STRING} is implied and hence is not * generally represented. - * + * * @throws Exception */ @Ignore("This test does not work with RDF-1.1") @@ -55,7 +55,7 @@ public void testSES2126QuotedLiteralIntegerAsStringExplicitType() throws Excepti /** * Only Literals with the XML Schema numeric types should be simplified. - * + * * @throws Exception */ @Test diff --git a/core/queryresultio/text/src/test/java/org/eclipse/rdf4j/query/resultio/text/tsv/SPARQLTSVTupleBackgroundTest.java b/core/queryresultio/text/src/test/java/org/eclipse/rdf4j/query/resultio/text/tsv/SPARQLTSVTupleBackgroundTest.java index 1566cf3fef5..2aa125ea83e 100644 --- a/core/queryresultio/text/src/test/java/org/eclipse/rdf4j/query/resultio/text/tsv/SPARQLTSVTupleBackgroundTest.java +++ b/core/queryresultio/text/src/test/java/org/eclipse/rdf4j/query/resultio/text/tsv/SPARQLTSVTupleBackgroundTest.java @@ -77,7 +77,8 @@ public void testSingleVarResults() throws Exception { + "\"?space at the end (\"(\\^\\^)?)?\n" + "\"?space at the end (\"(\\^\\^)?)?\n" + "\"\\\\\"\\\\\"double-quoted string with no datatype\"(\\^\\^)?\n" - + "\"newline at the end \\\\n\"(\\^\\^)?\n?", + + "\"newline at the end \\\\n\"(\\^\\^)?\n?" + + "\n?", toString(createTupleSingleVarMultipleBindingSets())); } diff --git a/core/queryresultio/text/src/test/java/org/eclipse/rdf4j/query/resultio/text/tsv/SPARQLTSVTupleTest.java b/core/queryresultio/text/src/test/java/org/eclipse/rdf4j/query/resultio/text/tsv/SPARQLTSVTupleTest.java index 37d4d02f677..2d5170049f9 100644 --- a/core/queryresultio/text/src/test/java/org/eclipse/rdf4j/query/resultio/text/tsv/SPARQLTSVTupleTest.java +++ b/core/queryresultio/text/src/test/java/org/eclipse/rdf4j/query/resultio/text/tsv/SPARQLTSVTupleTest.java @@ -67,7 +67,8 @@ public void testSingleVarResults() throws Exception { + "\"?space at the end (\"(\\^\\^)?)?\n" + "\"?space at the end (\"(\\^\\^)?)?\n" + "\"\\\\\"\\\\\"double-quoted string with no datatype\"(\\^\\^)?\n" - + "\"newline at the end \\\\n\"(\\^\\^)?\n?", + + "\"newline at the end \\\\n\"(\\^\\^)?\n?" + + "\n?", toString(createTupleSingleVarMultipleBindingSets())); } diff --git a/core/queryresultio/text/src/test/java/org/eclipse/rdf4j/query/resultio/textstar/tsv/SPARQLStarTSVTupleBackgroundTest.java b/core/queryresultio/text/src/test/java/org/eclipse/rdf4j/query/resultio/textstar/tsv/SPARQLStarTSVTupleBackgroundTest.java new file mode 100644 index 00000000000..da943743c03 --- /dev/null +++ b/core/queryresultio/text/src/test/java/org/eclipse/rdf4j/query/resultio/textstar/tsv/SPARQLStarTSVTupleBackgroundTest.java @@ -0,0 +1,47 @@ +/******************************************************************************* + * Copyright (c) 2020 Eclipse RDF4J contributors. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Distribution License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ +package org.eclipse.rdf4j.query.resultio.textstar.tsv; + +import java.io.IOException; +import java.io.InputStream; + +import org.eclipse.rdf4j.query.TupleQueryResult; +import org.eclipse.rdf4j.query.TupleQueryResultHandlerException; +import org.eclipse.rdf4j.query.resultio.AbstractQueryResultIOTupleTest; +import org.eclipse.rdf4j.query.resultio.BooleanQueryResultFormat; +import org.eclipse.rdf4j.query.resultio.QueryResultIO; +import org.eclipse.rdf4j.query.resultio.QueryResultParseException; +import org.eclipse.rdf4j.query.resultio.TupleQueryResultFormat; +import org.eclipse.rdf4j.query.resultio.UnsupportedQueryResultFormatException; + +/** + * @author Pavel Mihaylov + */ +public class SPARQLStarTSVTupleBackgroundTest extends AbstractQueryResultIOTupleTest { + + @Override + protected String getFileName() { + return "test.tsvs"; + } + + @Override + protected TupleQueryResultFormat getTupleFormat() { + return TupleQueryResultFormat.TSV_STAR; + } + + @Override + protected BooleanQueryResultFormat getMatchingBooleanFormatOrNull() { + return null; + } + + @Override + protected TupleQueryResult parseTupleInternal(TupleQueryResultFormat format, InputStream in) throws IOException, + QueryResultParseException, TupleQueryResultHandlerException, UnsupportedQueryResultFormatException { + return QueryResultIO.parseTupleBackground(in, format); + } +} diff --git a/core/queryresultio/text/src/test/java/org/eclipse/rdf4j/query/resultio/textstar/tsv/SPARQLStarTSVTupleTest.java b/core/queryresultio/text/src/test/java/org/eclipse/rdf4j/query/resultio/textstar/tsv/SPARQLStarTSVTupleTest.java new file mode 100644 index 00000000000..355ea7696f0 --- /dev/null +++ b/core/queryresultio/text/src/test/java/org/eclipse/rdf4j/query/resultio/textstar/tsv/SPARQLStarTSVTupleTest.java @@ -0,0 +1,32 @@ +/******************************************************************************* + * Copyright (c) 2020 Eclipse RDF4J contributors. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Distribution License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ +package org.eclipse.rdf4j.query.resultio.textstar.tsv; + +import org.eclipse.rdf4j.query.resultio.AbstractQueryResultIOTupleTest; +import org.eclipse.rdf4j.query.resultio.BooleanQueryResultFormat; +import org.eclipse.rdf4j.query.resultio.TupleQueryResultFormat; + +/** + * @author Pavel Mihaylov + */ +public class SPARQLStarTSVTupleTest extends AbstractQueryResultIOTupleTest { + @Override + protected String getFileName() { + return "test.tsvs"; + } + + @Override + protected TupleQueryResultFormat getTupleFormat() { + return TupleQueryResultFormat.TSV_STAR; + } + + @Override + protected BooleanQueryResultFormat getMatchingBooleanFormatOrNull() { + return null; + } +} diff --git a/core/repository/api/pom.xml b/core/repository/api/pom.xml index 3a3cbc66f8c..4665a7343e1 100644 --- a/core/repository/api/pom.xml +++ b/core/repository/api/pom.xml @@ -4,7 +4,7 @@ org.eclipse.rdf4j rdf4j-repository - 3.1.5-SNAPSHOT + 3.2.2-SNAPSHOT rdf4j-repository-api RDF4J: Repository - API diff --git a/core/repository/api/src/main/java/org/eclipse/rdf4j/repository/Repository.java b/core/repository/api/src/main/java/org/eclipse/rdf4j/repository/Repository.java index 790e1cd215f..bf767adcc32 100644 --- a/core/repository/api/src/main/java/org/eclipse/rdf4j/repository/Repository.java +++ b/core/repository/api/src/main/java/org/eclipse/rdf4j/repository/Repository.java @@ -21,28 +21,28 @@ * result in loss of data (depending on the Repository implementation)! *

    * Repository implementations are thread-safe unless specifically documented otherwise. - * + * * @author Arjohn Kampman */ public interface Repository { /** * Set the directory where data and logging for this repository is stored. - * + * * @param dataDir the directory where data for this repository is stored */ public void setDataDir(File dataDir); /** * Get the directory where data and logging for this repository is stored. - * + * * @return the directory where data for this repository is stored. */ public File getDataDir(); /** * Initializes this repository. - * + * * @throws RepositoryException If the initialization failed. * @deprecated Use {@link #init()} instead. */ @@ -53,7 +53,7 @@ public interface Repository { * Initializes this repository. A repository needs to be initialized before it can be used, however explicitly * calling this method is not necessary: the repository will automatically initialize itself if an operation is * executed on it that requires it to be initialized. - * + * * @throws RepositoryException If the initialization failed. * @since 2.5 */ @@ -64,7 +64,7 @@ default void init() throws RepositoryException { /** * Indicates if the Repository has been initialized. Note that the initialization status may change if the * Repository is shut down. - * + * * @return true iff the repository has been initialized. */ public boolean isInitialized(); @@ -85,17 +85,17 @@ default void init() throws RepositoryException { * Opens a connection to this repository that can be used for querying and updating the contents of the repository. * Created connections need to be closed to make sure that any resources they keep hold of are released. The best * way to do this is to use a try-with-resources block, as follows: - * + * *

     	 * try (RepositoryConnection conn = repository.getConnection()) {
     	 * 	// perform operations on the connection
     	 * }
     	 * 
    - * + * * Note that {@link RepositoryConnection} is not guaranteed to be thread-safe! The recommended pattern for * repository access in a multi-threaded application is to share the Repository object between threads, but have * each thread create and use its own {@link RepositoryConnection}s. - * + * * @return A connection that allows operations on this repository. * @throws RepositoryException If something went wrong during the creation of the Connection. */ @@ -103,7 +103,7 @@ default void init() throws RepositoryException { /** * Gets a ValueFactory for this Repository. - * + * * @return A repository-specific ValueFactory. */ public ValueFactory getValueFactory(); diff --git a/core/repository/api/src/main/java/org/eclipse/rdf4j/repository/RepositoryConnection.java b/core/repository/api/src/main/java/org/eclipse/rdf4j/repository/RepositoryConnection.java index 8e52d03c15e..6d87fb5e45d 100644 --- a/core/repository/api/src/main/java/org/eclipse/rdf4j/repository/RepositoryConnection.java +++ b/core/repository/api/src/main/java/org/eclipse/rdf4j/repository/RepositoryConnection.java @@ -57,33 +57,33 @@ * context only. *

    * Examples: - * + * *

      * {@code
      * // Ex 1: this method retrieves all statements that appear in either context1 or
      * // context2, or both.
      * RepositoryConnection.getStatements(null, null, null, true, context1, context2);
    - * 
    + *
      * // Ex 2: this method retrieves all statements that appear in the repository
      * // (regardless of context).
      * RepositoryConnection.getStatements(null, null, null, true);
    - * 
    + *
      * // Ex 3: this method retrieves all statements that have no associated context in
      * // the repository.
      * // Observe that this is not equivalent to the previous method call.
      * RepositoryConnection.getStatements(null, null, null, true, (Resource)null);
    - * 
    + *
      * // Ex 4: this method adds a statement to the store. If the statement object
    - * // itself has a context (i.e. statement.getContext() != null) the statement is added 
    + * // itself has a context (i.e. statement.getContext() != null) the statement is added
      * // to that context. Otherwise, it is added without any associated context.
      * RepositoryConnection.add(statement);
    - * 
    + *
      * // Ex 5: this method adds a statement to context1 in the store. It completely
      * // ignores any context the statement itself has.
      * RepositoryConnection.add(statement, context1);
      * }
      * 
    - * + * * @author Arjohn Kampman * @author Jeen Broekstra * @see Repositories @@ -97,28 +97,28 @@ public interface RepositoryConnection extends AutoCloseable { /** * Set the parser configuration this connection should use for RDFParser-based operations. - * + * * @param config a Rio RDF Parser configuration. */ public void setParserConfig(ParserConfig config); /** * Returns the parser configuration this connection uses for Rio-based operations. - * + * * @return a Rio RDF parser configuration. */ public ParserConfig getParserConfig(); /** * Gets a ValueFactory for this RepositoryConnection. - * + * * @return A repository-specific ValueFactory. */ public ValueFactory getValueFactory(); /** * Checks whether this connection is open. A connection is open from the moment it is created until it is closed. - * + * * @see #close() */ public boolean isOpen() throws RepositoryException; @@ -130,7 +130,7 @@ public interface RepositoryConnection extends AutoCloseable { *

    * Implementation note: All implementations must override this method if they have any resources that they need to * free. - * + * * @throws RepositoryException If the connection could not be closed. */ @Override @@ -144,7 +144,10 @@ public default void close() throws RepositoryException { * Prepares a SPARQL query for evaluation on this repository (optional operation). In case the query contains * relative URIs that need to be resolved against an external base URI, one should use * {@link #prepareQuery(QueryLanguage, String, String)} instead. - * + *

    + * If you already know the type of query, using the more specific {@link #prepareTupleQuery}, + * {@link #prepareGraphQuery} or {@link #prepareBooleanQuery} is likely to be more efficient. + * * @param query The query string, in SPARQL syntax. * @return A query ready to be evaluated on this repository. * @throws MalformedQueryException If the supplied query is malformed. @@ -159,7 +162,10 @@ public default Query prepareQuery(String query) throws RepositoryException, Malf * Prepares a query for evaluation on this repository (optional operation). In case the query contains relative URIs * that need to be resolved against an external base URI, one should use * {@link #prepareQuery(QueryLanguage, String, String)} instead. - * + *

    + * If you already know the type of query, using the more specific {@link #prepareTupleQuery}, + * {@link #prepareGraphQuery} or {@link #prepareBooleanQuery} is likely to be more efficient. + * * @param ql The {@link QueryLanguage query language} in which the query is formulated. * @param query The query string. * @return A query ready to be evaluated on this repository. @@ -172,7 +178,10 @@ public default Query prepareQuery(String query) throws RepositoryException, Malf /** * Prepares a query for evaluation on this repository (optional operation). - * + *

    + * If you already know the type of query, using the more specific {@link #prepareTupleQuery}, + * {@link #prepareGraphQuery} or {@link #prepareBooleanQuery} is likely to be more efficient. + * * @param ql The {@link QueryLanguage query language} in which the query is formulated. * @param query The query string. * @param baseURI The base URI to resolve any relative URIs that are in the query against, can be null if @@ -190,7 +199,7 @@ public Query prepareQuery(QueryLanguage ql, String query, String baseURI) * Prepares a SPARQL query that produces sets of value tuples, that is a SPARQL SELECT query. In case the query * contains relative URIs that need to be resolved against an external base URI, one should use * {@link #prepareTupleQuery(QueryLanguage, String, String)} instead. - * + * * @param query The query string, in SPARQL syntax. * @return a {@link TupleQuery} ready to be evaluated on this {@link RepositoryConnection}. * @throws IllegalArgumentException If the supplied query is not a tuple query. @@ -205,7 +214,7 @@ public default TupleQuery prepareTupleQuery(String query) throws RepositoryExcep * Prepares a query that produces sets of value tuples. In case the query contains relative URIs that need to be * resolved against an external base URI, one should use {@link #prepareTupleQuery(QueryLanguage, String, String)} * instead. - * + * * @param ql The {@link QueryLanguage query language} in which the query is formulated. * @param query The query string. * @return a {@link TupleQuery} ready to be evaluated on this {@link RepositoryConnection}. @@ -218,7 +227,7 @@ public TupleQuery prepareTupleQuery(QueryLanguage ql, String query) /** * Prepares a query that produces sets of value tuples. - * + * * @param ql The {@link QueryLanguage query language} in which the query is formulated. * @param query The query string. * @param baseURI The base URI to resolve any relative URIs that are in the query against, can be null if @@ -235,7 +244,7 @@ public TupleQuery prepareTupleQuery(QueryLanguage ql, String query, String baseU * Prepares SPARQL queries that produce RDF graphs, that is, SPARQL CONSTRUCT or DESCRIBE queries. In case the query * contains relative URIs that need to be resolved against an external base URI, one should use * {@link #prepareGraphQuery(QueryLanguage, String, String)} instead. - * + * * @param query The query string, in SPARQL syntax. * @return a {@link GraphQuery} ready to be evaluated on this {@link RepositoryConnection}. * @throws IllegalArgumentException If the supplied query is not a graph query. @@ -249,7 +258,7 @@ public default GraphQuery prepareGraphQuery(String query) throws RepositoryExcep /** * Prepares queries that produce RDF graphs. In case the query contains relative URIs that need to be resolved * against an external base URI, one should use {@link #prepareGraphQuery(QueryLanguage, String, String)} instead. - * + * * @param ql The {@link QueryLanguage query language} in which the query is formulated. * @param query The query string. * @return a {@link GraphQuery} ready to be evaluated on this {@link RepositoryConnection}. @@ -262,7 +271,7 @@ public GraphQuery prepareGraphQuery(QueryLanguage ql, String query) /** * Prepares queries that produce RDF graphs. - * + * * @param ql The {@link QueryLanguage query language} in which the query is formulated. * @param query The query string. * @param baseURI The base URI to resolve any relative URIs that are in the query against, can be null if @@ -279,7 +288,7 @@ public GraphQuery prepareGraphQuery(QueryLanguage ql, String query, String baseU * Prepares SPARQL queries that return true or false, that is, SPARQL ASK queries. In case the * query contains relative URIs that need to be resolved against an external base URI, one should use * {@link #prepareBooleanQuery(QueryLanguage, String, String)} instead. - * + * * @param query The query string, in SPARQL syntax. * @return a {@link BooleanQuery} ready to be evaluated on this {@link RepositoryConnection}. * @throws IllegalArgumentException If the supplied query is not a boolean query. @@ -294,7 +303,7 @@ public default BooleanQuery prepareBooleanQuery(String query) throws RepositoryE * Prepares queries that return true or false. In case the query contains relative URIs that need * to be resolved against an external base URI, one should use * {@link #prepareBooleanQuery(QueryLanguage, String, String)} instead. - * + * * @param ql The {@link QueryLanguage query language} in which the query is formulated. * @param query The query string. * @return a {@link BooleanQuery} ready to be evaluated on this {@link RepositoryConnection}. @@ -307,7 +316,7 @@ public BooleanQuery prepareBooleanQuery(QueryLanguage ql, String query) /** * Prepares queries that return true or false. - * + * * @param ql The {@link QueryLanguage query language} in which the query is formulated. * @param query The query string. * @param baseURI The base URI to resolve any relative URIs that are in the query against, can be null if @@ -323,7 +332,7 @@ public BooleanQuery prepareBooleanQuery(QueryLanguage ql, String query, String b /** * Prepares a SPARQL Update operation. In case the update string contains relative URIs that need to be resolved * against an external base URI, one should use {@link #prepareUpdate(QueryLanguage, String, String)} instead. - * + * * @param update The update operation string, in SPARQL syntax. * @return a {@link Update} ready to be executed on this {@link RepositoryConnection}. * @throws MalformedQueryException If the supplied update operation string is malformed. @@ -336,7 +345,7 @@ public default Update prepareUpdate(String update) throws RepositoryException, M /** * Prepares an Update operation. In case the update string contains relative URIs that need to be resolved against * an external base URI, one should use {@link #prepareUpdate(QueryLanguage, String, String)} instead. - * + * * @param ql The {@link QueryLanguage query language} in which the update operation is formulated. * @param update The update operation string. * @return a {@link Update} ready to be executed on this {@link RepositoryConnection}. @@ -346,7 +355,7 @@ public default Update prepareUpdate(String update) throws RepositoryException, M /** * Prepares an Update operation. - * + * * @param ql The {@link QueryLanguage query language} in which the update operation is formulated. * @param update The update operation string. * @param baseURI The base URI to resolve any relative URIs that are in the update against, can be null if @@ -360,7 +369,7 @@ public Update prepareUpdate(QueryLanguage ql, String update, String baseURI) /** * Gets all resources that are used as content identifiers. Care should be taken that the returned * {@link RepositoryResult} is closed to free any resources that it keeps hold of. - * + * * @return a RepositoryResult object containing Resources that are used as context identifiers. */ public RepositoryResult getContextIDs() throws RepositoryException; @@ -369,7 +378,7 @@ public Update prepareUpdate(QueryLanguage ql, String update, String baseURI) * Gets all statements with a specific subject, predicate and/or object from the repository. The result is * optionally restricted to the specified set of named contexts. If the repository supports inferencing, inferred * statements will be included in the result. - * + * * @param subj A Resource specifying the subject, or null for a wildcard. * @param pred A URI specifying the predicate, or null for a wildcard. * @param obj A Value specifying the object, or null for a wildcard. @@ -387,7 +396,7 @@ public default RepositoryResult getStatements(Resource subj, IRI pred /** * Gets all statements with a specific subject, predicate and/or object from the repository. The result is * optionally restricted to the specified set of named contexts. - * + * * @param subj A Resource specifying the subject, or null for a wildcard. * @param pred A URI specifying the predicate, or null for a wildcard. * @param obj A Value specifying the object, or null for a wildcard. @@ -409,7 +418,7 @@ public default RepositoryResult getStatements(Resource subj, URI pred /** * Gets all statements with a specific subject, predicate and/or object from the repository. The result is * optionally restricted to the specified set of named contexts. - * + * * @param subj A Resource specifying the subject, or null for a wildcard. * @param pred An IRI specifying the predicate, or null for a wildcard. * @param obj A Value specifying the object, or null for a wildcard. @@ -427,7 +436,7 @@ public RepositoryResult getStatements(Resource subj, IRI pred, Value /** * Checks whether the repository contains statements with a specific subject, predicate and/or object, optionally in * the specified contexts. - * + * * @param subj A Resource specifying the subject, or null for a wildcard. * @param pred An IRI specifying the predicate, or null for a wildcard. * @param obj A Value specifying the object, or null for a wildcard. @@ -443,7 +452,7 @@ public boolean hasStatement(Resource subj, IRI pred, Value obj, boolean includeI /** * Checks whether the repository contains statements with a specific subject, predicate and/or object, optionally in * the specified contexts. - * + * * @param subj A Resource specifying the subject, or null for a wildcard. * @param pred A URI specifying the predicate, or null for a wildcard. * @param obj A Value specifying the object, or null for a wildcard. @@ -462,7 +471,7 @@ public default boolean hasStatement(Resource subj, URI pred, Value obj, boolean /** * Checks whether the repository contains the specified statement, optionally in the specified contexts. - * + * * @param st The statement to look for. Context information in the statement is ignored. * @param contexts The context(s) to get the data from. Note that this parameter is a vararg and as such is * optional. If no contexts are supplied the method operates on the entire repository. @@ -474,8 +483,9 @@ public default boolean hasStatement(Resource subj, URI pred, Value obj, boolean /** * Exports all statements with a specific subject, predicate and/or object from the repository, optionally from the - * specified contexts. - * + * specified contexts. This method supplies the RDFHandler with all namespace declarations available in the + * repository. + * * @param subj The subject, or null if the subject doesn't matter. * @param pred The predicate, or null if the predicate doesn't matter. * @param obj The object, or null if the object doesn't matter. @@ -490,8 +500,9 @@ public void exportStatements(Resource subj, IRI pred, Value obj, boolean include Resource... contexts) throws RepositoryException, RDFHandlerException; /** - * Exports all explicit statements in the specified contexts to the supplied RDFHandler. - * + * Exports all explicit statements in the specified contexts to the supplied RDFHandler. This method supplies the + * RDFHandler with all namespace declarations available in the repository. + * * @param contexts The context(s) to get the data from. Note that this parameter is a vararg and as such is * optional. If no contexts are supplied the method operates on the entire repository. * @param handler The handler that will handle the RDF data. @@ -501,7 +512,7 @@ public void exportStatements(Resource subj, IRI pred, Value obj, boolean include /** * Returns the number of (explicit) statements that are in the specified contexts in this repository. - * + * * @param contexts The context(s) to get the data from. Note that this parameter is a vararg and as such is * optional. If no contexts are supplied the method operates on the entire repository. * @return The number of explicit statements from the specified contexts in this repository. @@ -510,7 +521,7 @@ public void exportStatements(Resource subj, IRI pred, Value obj, boolean include /** * Returns true if this repository does not contain any (explicit) statements. - * + * * @return true if this repository is empty, false otherwise. * @throws RepositoryException If the repository could not be checked to be empty. */ @@ -524,7 +535,7 @@ public void exportStatements(Resource subj, IRI pred, Value obj, boolean include *

    * NOTE: If this connection is switched to auto-commit mode during a transaction, the transaction is * committed. - * + * * @deprecated As of release 2.7.0, use {@link #begin()} instead. * @throws RepositoryException In case the mode switch failed, for example because a currently active transaction * failed to commit. @@ -540,7 +551,7 @@ public void exportStatements(Resource subj, IRI pred, Value obj, boolean include *

  • {@link #begin()} has not been called or; *
  • {@link #commit()} or {@link #rollback()} have been called to finish the transaction. * - * + * * @deprecated since 2.0. Use {@link #isActive()} instead. * @throws RepositoryException If a repository access error occurs. */ @@ -550,7 +561,7 @@ public void exportStatements(Resource subj, IRI pred, Value obj, boolean include /** * Indicates if a transaction is currently active on the connection. A transaction is active if {@link #begin()} has * been called, and becomes inactive after {@link #commit()} or {@link #rollback()} has been called. - * + * * @return true iff a transaction is active, false iff no transaction is active. * @throws UnknownTransactionStateException if the transaction state can not be determined. This can happen for * instance when communication with a repository fails or times out. @@ -562,7 +573,7 @@ public void exportStatements(Resource subj, IRI pred, Value obj, boolean include * Sets the transaction isolation level for the next transaction(s) on this connection. If the level is set to a * value that is not supported by the underlying repository, this method will still succeed but a subsequent call to * {@link #begin()} will result in an exception. - * + * * @param level the transaction isolation level to set. * @throws IllegalStateException if the method is called while a transaction is already active. */ @@ -570,7 +581,7 @@ public void exportStatements(Resource subj, IRI pred, Value obj, boolean include /** * Retrieves the current {@link IsolationLevel transaction isolation level} of the connection. - * + * * @return the current transaction isolation level. */ public IsolationLevel getIsolationLevel(); @@ -578,7 +589,7 @@ public void exportStatements(Resource subj, IRI pred, Value obj, boolean include /** * Begins a new transaction, requiring {@link #commit()} or {@link #rollback()} to be called to end the transaction. * The transaction will use the currently set {@link IsolationLevel isolation level} for this connection. - * + * * @throws RepositoryException If the connection could not start the transaction. One possible reason this may * happen is if a transaction is already {@link #isActive() active} on the current * connection. @@ -593,7 +604,7 @@ public void exportStatements(Resource subj, IRI pred, Value obj, boolean include /** * Begins a new transaction with the supplied {@link IsolationLevel}, requiring {@link #commit()} or * {@link #rollback()} to be called to end the transaction. - * + * * @param level The {@link IsolationLevel} at which this transaction will operate. If set to null the * default isolation level of the underlying store will be used. If the specified isolation level is * not supported by the underlying store, it will attempt to use a supported @@ -615,7 +626,7 @@ public void exportStatements(Resource subj, IRI pred, Value obj, boolean include /** * Commits the active transaction. This operation ends the active transaction. - * + * * @throws UnknownTransactionStateException if the transaction state can not be determined. This can happen for * instance when communication with a repository fails or times out. * @throws RepositoryException If the connection could not be committed, or if the connection does not @@ -628,7 +639,7 @@ public void exportStatements(Resource subj, IRI pred, Value obj, boolean include /** * Rolls back all updates in the active transaction. This operation ends the active transaction. - * + * * @throws UnknownTransactionStateException if the transaction state can not be determined. This can happen for * instance when communication with a repository fails or times out. * @throws RepositoryException If the transaction could not be rolled back, or if the connection does @@ -641,7 +652,7 @@ public void exportStatements(Resource subj, IRI pred, Value obj, boolean include /** * Adds RDF data from an InputStream to the repository, optionally to one or more named contexts. - * + * * @param in An InputStream from which RDF data can be read. * @param baseURI The base URI to resolve any relative URIs that are in the data against. * @param dataFormat The serialization format of the data. @@ -663,7 +674,7 @@ public void add(InputStream in, String baseURI, RDFFormat dataFormat, Resource.. * to upload byte-based data means that you have to be careful not to destroy the data's character encoding by * enforcing a default character encoding upon the bytes. If possible, adding such data using an InputStream is to * be preferred. - * + * * @param reader A Reader from which RDF data can be read. * @param baseURI The base URI to resolve any relative URIs that are in the data against. * @param dataFormat The serialization format of the data. @@ -681,7 +692,7 @@ public void add(Reader reader, String baseURI, RDFFormat dataFormat, Resource... /** * Adds the RDF data that can be found at the specified URL to the repository, optionally to one or more named * contexts. - * + * * @param url The URL of the RDF data. * @param baseURI The base URI to resolve any relative URIs that are in the data against. This defaults to the * value of {@link java.net.URL#toExternalForm() url.toExternalForm()} if the value is set to @@ -703,7 +714,7 @@ public void add(URL url, String baseURI, RDFFormat dataFormat, Resource... conte /** * Adds RDF data from the specified file to a specific contexts in the repository. - * + * * @param file A file containing RDF data. * @param baseURI The base URI to resolve any relative URIs that are in the data against. This defaults to the * value of {@link java.io.File#toURI() file.toURI()} if the value is set to null. @@ -725,7 +736,7 @@ public void add(File file, String baseURI, RDFFormat dataFormat, Resource... con /** * Adds a statement with the specified subject, predicate and object to this repository, optionally to one or more * named contexts. - * + * * @param subject The statement's subject. * @param predicate The statement's predicate. * @param object The statement's object. @@ -742,7 +753,7 @@ public void add(File file, String baseURI, RDFFormat dataFormat, Resource... con /** * Adds a statement with the specified subject, predicate and object to this repository, optionally to one or more * named contexts. - * + * * @param subject The statement's subject. * @param predicate The statement's predicate. * @param object The statement's object. @@ -763,7 +774,7 @@ public default void add(Resource subject, URI predicate, Value object, Resource. /** * Adds the supplied statement to this repository, optionally to one or more named contexts. - * + * * @param st The statement to add. * @param contexts The contexts to add the statements to. Note that this parameter is a vararg and as such is * optional. If no contexts are specified, the statement is added to any context specified in each @@ -777,7 +788,7 @@ public default void add(Resource subject, URI predicate, Value object, Resource. /** * Adds the supplied statements to this repository, optionally to one or more named contexts. - * + * * @param statements The statements that should be added. * @param contexts The contexts to add the statements to. Note that this parameter is a vararg and as such is * optional. If no contexts are specified, each statement is added to any context specified in the @@ -791,7 +802,7 @@ public default void add(Resource subject, URI predicate, Value object, Resource. /** * Adds the supplied statements to this repository, optionally to one or more named contexts. - * + * * @param statements The statements to add. In case the iteration is a * {@link org.eclipse.rdf4j.common.iteration.CloseableIteration}, it will be closed before this * method returns. @@ -826,7 +837,7 @@ default void add(RepositoryResult statements, Resource... contexts) /** * Removes the statement(s) with the specified subject, predicate and object from the repository, optionally * restricted to the specified contexts. - * + * * @param subject The statement's subject, or null for a wildcard. * @param predicate The statement's predicate, or null for a wildcard. * @param object The statement's object, or null for a wildcard. @@ -840,7 +851,7 @@ default void add(RepositoryResult statements, Resource... contexts) /** * Removes the statement(s) with the specified subject, predicate and object from the repository, optionally * restricted to the specified contexts. - * + * * @param subject The statement's subject, or null for a wildcard. * @param predicate The statement's predicate, or null for a wildcard. * @param object The statement's object, or null for a wildcard. @@ -858,7 +869,7 @@ public default void remove(Resource subject, URI predicate, Value object, Resour /** * Removes the supplied statement from the specified contexts in the repository. - * + * * @param st The statement to remove. * @param contexts The context(s) to remove the data from. Note that this parameter is a vararg and as such is * optional. If no contexts are supplied the method operates on the contexts associated with the @@ -870,7 +881,7 @@ public default void remove(Resource subject, URI predicate, Value object, Resour /** * Removes the supplied statements from the specified contexts in this repository. - * + * * @param statements The statements that should be added. * @param contexts The context(s) to remove the data from. Note that this parameter is a vararg and as such is * optional. If no contexts are supplied the method operates on the contexts associated with the @@ -883,7 +894,7 @@ public default void remove(Resource subject, URI predicate, Value object, Resour /** * Removes the supplied statements from a specific context in this repository, ignoring any context information * carried by the statements themselves. - * + * * @param statements The statements to remove. In case the iteration is a * {@link org.eclipse.rdf4j.common.iteration.CloseableIteration}, it will be closed before this * method returns. @@ -915,7 +926,7 @@ default void remove(RepositoryResult statements, Resource... contexts /** * Removes all statements from a specific contexts in the repository. - * + * * @param contexts The context(s) to remove the data from. Note that this parameter is a vararg and as such is * optional. If no contexts are supplied the method operates on the entire repository. * @throws RepositoryException If the statements could not be removed from the repository, for example because the @@ -926,7 +937,7 @@ default void remove(RepositoryResult statements, Resource... contexts /** * Gets all declared namespaces as a RepositoryResult of {@link Namespace} objects. Each Namespace object consists * of a prefix and a namespace name. - * + * * @return A RepositoryResult containing Namespace objects. Care should be taken to close the RepositoryResult after * use. * @throws RepositoryException If the namespaces could not be read from the repository. @@ -935,7 +946,7 @@ default void remove(RepositoryResult statements, Resource... contexts /** * Gets the namespace that is associated with the specified prefix, if any. - * + * * @param prefix A namespace prefix, or an empty string in case of the default namespace. * @return The namespace name that is associated with the specified prefix, or null if there is no such * namespace. @@ -946,7 +957,7 @@ default void remove(RepositoryResult statements, Resource... contexts /** * Sets the prefix for a namespace. - * + * * @param prefix The new prefix, or an empty string in case of the default namespace. * @param name The namespace name that the prefix maps to. * @throws RepositoryException If the namespace could not be set in the repository, for example because the @@ -957,7 +968,7 @@ default void remove(RepositoryResult statements, Resource... contexts /** * Removes a namespace declaration by removing the association between a prefix and a namespace name. - * + * * @param prefix The namespace prefix, or an empty string in case of the default namespace. * @throws RepositoryException If the namespace prefix could not be removed. * @throws NullPointerException In case prefix is null. @@ -966,7 +977,7 @@ default void remove(RepositoryResult statements, Resource... contexts /** * Removes all namespace declarations from the repository. - * + * * @throws RepositoryException If the namespace declarations could not be removed. */ public void clearNamespaces() throws RepositoryException; diff --git a/core/repository/api/src/main/java/org/eclipse/rdf4j/repository/RepositoryLockedException.java b/core/repository/api/src/main/java/org/eclipse/rdf4j/repository/RepositoryLockedException.java index 73b3ef0b8fe..a0ee14e6a21 100644 --- a/core/repository/api/src/main/java/org/eclipse/rdf4j/repository/RepositoryLockedException.java +++ b/core/repository/api/src/main/java/org/eclipse/rdf4j/repository/RepositoryLockedException.java @@ -9,7 +9,7 @@ /** * Indicates that a Repository cannot be initialised because the configured persisted location is locked. - * + * * @author James Leigh */ public class RepositoryLockedException extends RepositoryException { @@ -28,7 +28,7 @@ public RepositoryLockedException(String lockedBy, String requestedBy, String msg /** * Returns the name representing the Java virtual machine that acquired the lock. - * + * * @return the name representing the Java virtual machine that acquired the lock. */ public String getLockedBy() { @@ -37,7 +37,7 @@ public String getLockedBy() { /** * Returns the name representing the Java virtual machine that requested the lock. - * + * * @return the name representing the Java virtual machine that requested the lock. */ public String getRequestedBy() { diff --git a/core/repository/api/src/main/java/org/eclipse/rdf4j/repository/RepositoryReadOnlyException.java b/core/repository/api/src/main/java/org/eclipse/rdf4j/repository/RepositoryReadOnlyException.java index c42d4764bce..1489dc0a8b7 100644 --- a/core/repository/api/src/main/java/org/eclipse/rdf4j/repository/RepositoryReadOnlyException.java +++ b/core/repository/api/src/main/java/org/eclipse/rdf4j/repository/RepositoryReadOnlyException.java @@ -10,7 +10,7 @@ /** * Indicates that the current write operation did not succeed because the SAIL cannot be written to, it can only be read * from. - * + * * @author James Leigh */ public class RepositoryReadOnlyException extends RepositoryException { diff --git a/core/repository/api/src/main/java/org/eclipse/rdf4j/repository/RepositoryResolver.java b/core/repository/api/src/main/java/org/eclipse/rdf4j/repository/RepositoryResolver.java index 00ef91a4c4b..e7ef50e234a 100644 --- a/core/repository/api/src/main/java/org/eclipse/rdf4j/repository/RepositoryResolver.java +++ b/core/repository/api/src/main/java/org/eclipse/rdf4j/repository/RepositoryResolver.java @@ -11,7 +11,7 @@ /** * Gets local repositories using a simple identifier string. - * + * * @author Dale Visser * @since 2.3 */ diff --git a/core/repository/api/src/main/java/org/eclipse/rdf4j/repository/RepositoryResolverClient.java b/core/repository/api/src/main/java/org/eclipse/rdf4j/repository/RepositoryResolverClient.java index 3ca882eaff1..4528d527027 100644 --- a/core/repository/api/src/main/java/org/eclipse/rdf4j/repository/RepositoryResolverClient.java +++ b/core/repository/api/src/main/java/org/eclipse/rdf4j/repository/RepositoryResolverClient.java @@ -9,7 +9,7 @@ /** * Interface used by factory classes that need access to other repositories by their id's. - * + * * @author Dale Visser * @since 2.3 */ diff --git a/core/repository/api/src/main/java/org/eclipse/rdf4j/repository/RepositoryResult.java b/core/repository/api/src/main/java/org/eclipse/rdf4j/repository/RepositoryResult.java index 7e2a4a172fa..19c6b0df862 100644 --- a/core/repository/api/src/main/java/org/eclipse/rdf4j/repository/RepositoryResult.java +++ b/core/repository/api/src/main/java/org/eclipse/rdf4j/repository/RepositoryResult.java @@ -11,7 +11,6 @@ import java.util.Collection; import java.util.Iterator; import java.util.List; -import java.util.stream.Stream; import org.eclipse.rdf4j.common.iteration.AbstractCloseableIteration; import org.eclipse.rdf4j.common.iteration.CloseableIteration; @@ -130,7 +129,7 @@ public > C addTo(C collection) throws RepositoryExceptio @Override public Iterator iterator() { - return new CloseableIterationIterator(this); + return new CloseableIterationIterator<>(this); } } diff --git a/core/repository/api/src/main/java/org/eclipse/rdf4j/repository/UnknownTransactionStateException.java b/core/repository/api/src/main/java/org/eclipse/rdf4j/repository/UnknownTransactionStateException.java index f48188ad5d0..235c465f933 100644 --- a/core/repository/api/src/main/java/org/eclipse/rdf4j/repository/UnknownTransactionStateException.java +++ b/core/repository/api/src/main/java/org/eclipse/rdf4j/repository/UnknownTransactionStateException.java @@ -10,7 +10,7 @@ /** * A specific subtype of {@link RepositoryException} that indicates the connection's transaction state can not be * determined. - * + * * @author Jeen Broekstra */ public class UnknownTransactionStateException extends RepositoryException { diff --git a/core/repository/api/src/main/java/org/eclipse/rdf4j/repository/base/AbstractRepositoryConnection.java b/core/repository/api/src/main/java/org/eclipse/rdf4j/repository/base/AbstractRepositoryConnection.java index 86992ef6058..07414c7719e 100644 --- a/core/repository/api/src/main/java/org/eclipse/rdf4j/repository/base/AbstractRepositoryConnection.java +++ b/core/repository/api/src/main/java/org/eclipse/rdf4j/repository/base/AbstractRepositoryConnection.java @@ -51,7 +51,7 @@ *

    * Open connections are automatically closed when being garbage collected. A warning message will be logged when the * system property org.eclipse.rdf4j.repository.debug has been set to a non-null value. - * + * * @author Jeen Broekstra * @author Arjohn Kampman */ @@ -299,7 +299,7 @@ public void add(InputStream in, String baseURI, RDFFormat dataFormat, Resource.. /** * Starts a new transaction if one is not already active. - * + * * @return true if a new transaction was started, false if a transaction was already * active. * @throws RepositoryException @@ -314,7 +314,7 @@ protected final boolean startLocalTransaction() throws RepositoryException { /** * Invokes {@link #commit()} if supplied boolean condition is true. - * + * * @param condition a boolean condition. * @throws RepositoryException */ @@ -326,7 +326,7 @@ protected final void conditionalCommit(boolean condition) throws RepositoryExcep /** * Invokes {@link #rollback()} if supplied boolean condition is true. - * + * * @param condition a boolean condition. * @throws RepositoryException */ diff --git a/core/repository/api/src/main/java/org/eclipse/rdf4j/repository/base/RepositoryBase.java b/core/repository/api/src/main/java/org/eclipse/rdf4j/repository/base/RepositoryBase.java index 6ff17ad1bf9..84c6b49adb4 100644 --- a/core/repository/api/src/main/java/org/eclipse/rdf4j/repository/base/RepositoryBase.java +++ b/core/repository/api/src/main/java/org/eclipse/rdf4j/repository/base/RepositoryBase.java @@ -9,7 +9,7 @@ /** * Abstract base class for Repository implementations. - * + * * @author Jeen Broekstra * @deprecated since 2.0. Use {@link AbstractRepository} instead. */ diff --git a/core/repository/api/src/main/java/org/eclipse/rdf4j/repository/base/RepositoryConnectionWrapper.java b/core/repository/api/src/main/java/org/eclipse/rdf4j/repository/base/RepositoryConnectionWrapper.java index f5bcb04ce56..def4175bcd4 100644 --- a/core/repository/api/src/main/java/org/eclipse/rdf4j/repository/base/RepositoryConnectionWrapper.java +++ b/core/repository/api/src/main/java/org/eclipse/rdf4j/repository/base/RepositoryConnectionWrapper.java @@ -42,7 +42,7 @@ /** * Delegates all calls to the delegate RepositoryConnection. Conditionally processes add/remove/read to common base * method to make them easier to override. - * + * * @author James Leigh * @see #isDelegatingAdd() * @see #isDelegatingRemove() @@ -75,7 +75,7 @@ public void setDelegate(RepositoryConnection delegate) { /** * If false then the following add methods will call {@link #addWithoutCommit(Resource, IRI, Value, Resource[])}. - * + * * @see #add(Iterable, Resource...) * @see #add(Iteration, Resource...) * @see #add(Statement, Resource...) @@ -95,7 +95,7 @@ protected boolean isDelegatingAdd() throws RepositoryException { /** * If false then the following has/export/isEmpty methods will call * {@link #getStatements(Resource, IRI, Value, boolean, Resource[])}. - * + * * @see #exportStatements(Resource, IRI, Value, boolean, RDFHandler, Resource...) * @see #hasStatement(Statement, boolean, Resource...) * @see #hasStatement(Resource, IRI, Value, boolean, Resource...) @@ -111,7 +111,7 @@ protected boolean isDelegatingRead() throws RepositoryException { /** * If false then the following remove methods will call * {@link #removeWithoutCommit(Resource, IRI, Value, Resource[])}. - * + * * @see #clear(Resource...) * @see #remove(Iterable, Resource...) * @see #remove(Iteration, Resource...) diff --git a/core/repository/api/src/main/java/org/eclipse/rdf4j/repository/base/RepositoryWrapper.java b/core/repository/api/src/main/java/org/eclipse/rdf4j/repository/base/RepositoryWrapper.java index 4ce6268bbe4..acf0af2d372 100644 --- a/core/repository/api/src/main/java/org/eclipse/rdf4j/repository/base/RepositoryWrapper.java +++ b/core/repository/api/src/main/java/org/eclipse/rdf4j/repository/base/RepositoryWrapper.java @@ -17,7 +17,7 @@ /** * A {@link DelegatingRepository} implementation that, by default, forwards all method calls to its delegate. - * + * * @author Herko ter Horst * @author Arjohn Kampman */ diff --git a/core/repository/api/src/main/java/org/eclipse/rdf4j/repository/config/AbstractDelegatingRepositoryImplConfig.java b/core/repository/api/src/main/java/org/eclipse/rdf4j/repository/config/AbstractDelegatingRepositoryImplConfig.java index 03b2383047f..2b1a391036d 100644 --- a/core/repository/api/src/main/java/org/eclipse/rdf4j/repository/config/AbstractDelegatingRepositoryImplConfig.java +++ b/core/repository/api/src/main/java/org/eclipse/rdf4j/repository/config/AbstractDelegatingRepositoryImplConfig.java @@ -77,7 +77,7 @@ public Resource export(Model model) { public void parse(Model model, Resource resource) throws RepositoryConfigException { super.parse(model, resource); - Models.objectResource(model.filter(resource, DELEGATE, null)) + Models.objectResource(model.getStatements(resource, DELEGATE, null)) .ifPresent(delegate -> setDelegate(create(model, delegate))); } } diff --git a/core/repository/api/src/main/java/org/eclipse/rdf4j/repository/config/AbstractRepositoryImplConfig.java b/core/repository/api/src/main/java/org/eclipse/rdf4j/repository/config/AbstractRepositoryImplConfig.java index 64087ad05e1..a724eb15b67 100644 --- a/core/repository/api/src/main/java/org/eclipse/rdf4j/repository/config/AbstractRepositoryImplConfig.java +++ b/core/repository/api/src/main/java/org/eclipse/rdf4j/repository/config/AbstractRepositoryImplConfig.java @@ -32,7 +32,7 @@ public AbstractRepositoryImplConfig() { /** * Create a new RepositoryConfigImpl. - * + * * @param type */ public AbstractRepositoryImplConfig(String type) { @@ -69,13 +69,13 @@ public Resource export(Model model) { @Override public void parse(Model model, Resource resource) throws RepositoryConfigException { - Models.objectLiteral(model.filter(resource, REPOSITORYTYPE, null)) + Models.objectLiteral(model.getStatements(resource, REPOSITORYTYPE, null)) .ifPresent(typeLit -> setType(typeLit.getLabel())); } /** * Utility method to create a new {@link RepositoryImplConfig} by reading data from the supplied {@link Model}. - * + * * @param model the {@link Model} to read configuration data from. * @param resource the subject {@link Resource} identifying the configuration data in the Model. * @return a new {@link RepositoryImplConfig} initialized with the configuration from the input Model, or @@ -88,7 +88,8 @@ public static RepositoryImplConfig create(Model model, Resource resource) throws // Literal typeLit = GraphUtil.getOptionalObjectLiteral(graph, // implNode, REPOSITORYTYPE); - final Literal typeLit = Models.objectLiteral(model.filter(resource, REPOSITORYTYPE, null)).orElse(null); + final Literal typeLit = Models.objectLiteral(model.getStatements(resource, REPOSITORYTYPE, null)) + .orElse(null); if (typeLit != null) { RepositoryFactory factory = RepositoryRegistry.getInstance() .get(typeLit.getLabel()) diff --git a/core/repository/api/src/main/java/org/eclipse/rdf4j/repository/config/ConfigTemplate.java b/core/repository/api/src/main/java/org/eclipse/rdf4j/repository/config/ConfigTemplate.java index 9d619c02fb1..1e81918d796 100644 --- a/core/repository/api/src/main/java/org/eclipse/rdf4j/repository/config/ConfigTemplate.java +++ b/core/repository/api/src/main/java/org/eclipse/rdf4j/repository/config/ConfigTemplate.java @@ -112,7 +112,7 @@ public String render(Map valueMap) { /** * Escape Turtle multiline literal quote characters in the given value. - * + * * @param quoteVariant either ''' or """ * @param value the value to escape properly * @return the value with any needed multiline quote sequences escaped diff --git a/core/repository/api/src/main/java/org/eclipse/rdf4j/repository/config/RepositoryConfig.java b/core/repository/api/src/main/java/org/eclipse/rdf4j/repository/config/RepositoryConfig.java index 0933793171d..da057a72ed9 100644 --- a/core/repository/api/src/main/java/org/eclipse/rdf4j/repository/config/RepositoryConfig.java +++ b/core/repository/api/src/main/java/org/eclipse/rdf4j/repository/config/RepositoryConfig.java @@ -98,7 +98,7 @@ public void setRepositoryImplConfig(RepositoryImplConfig implConfig) { /** * Validates this configuration. A {@link RepositoryConfigException} is thrown when the configuration is invalid. * The exception should contain an error message that indicates why the configuration is invalid. - * + * * @throws RepositoryConfigException If the configuration is invalid. */ public void validate() throws RepositoryConfigException { @@ -149,11 +149,11 @@ public void export(Model model, Resource repositoryNode) { public void parse(Model model, Resource repositoryNode) throws RepositoryConfigException { try { - Models.objectLiteral(model.filter(repositoryNode, REPOSITORYID, null)) + Models.objectLiteral(model.getStatements(repositoryNode, REPOSITORYID, null)) .ifPresent(lit -> setID(lit.getLabel())); - Models.objectLiteral(model.filter(repositoryNode, RDFS.LABEL, null)) + Models.objectLiteral(model.getStatements(repositoryNode, RDFS.LABEL, null)) .ifPresent(lit -> setTitle(lit.getLabel())); - Models.objectResource(model.filter(repositoryNode, REPOSITORYIMPL, null)) + Models.objectResource(model.getStatements(repositoryNode, REPOSITORYIMPL, null)) .ifPresent(res -> setRepositoryImplConfig(AbstractRepositoryImplConfig.create(model, res))); } catch (ModelException e) { throw new RepositoryConfigException(e.getMessage(), e); @@ -163,7 +163,7 @@ public void parse(Model model, Resource repositoryNode) throws RepositoryConfigE /** * Creates a new {@link RepositoryConfig} object and initializes it by supplying the {@code model} and * {@code repositoryNode} to its {@link #parse(Model, Resource) parse} method. - * + * * @param model the {@link Model} to read initialization data from. * @param repositoryNode the subject {@link Resource} that identifies the {@link RepositoryConfig} in the supplied * Model. diff --git a/core/repository/api/src/main/java/org/eclipse/rdf4j/repository/config/RepositoryConfigException.java b/core/repository/api/src/main/java/org/eclipse/rdf4j/repository/config/RepositoryConfigException.java index e714bbc7f1e..f996ed0d511 100644 --- a/core/repository/api/src/main/java/org/eclipse/rdf4j/repository/config/RepositoryConfigException.java +++ b/core/repository/api/src/main/java/org/eclipse/rdf4j/repository/config/RepositoryConfigException.java @@ -11,7 +11,7 @@ /** * Exception indicating a repository configuration problem. - * + * * @author Arjohn Kampman */ public class RepositoryConfigException extends RDF4JConfigException { diff --git a/core/repository/api/src/main/java/org/eclipse/rdf4j/repository/config/RepositoryConfigSchema.java b/core/repository/api/src/main/java/org/eclipse/rdf4j/repository/config/RepositoryConfigSchema.java index bf84c2aa5b7..405a42e4194 100644 --- a/core/repository/api/src/main/java/org/eclipse/rdf4j/repository/config/RepositoryConfigSchema.java +++ b/core/repository/api/src/main/java/org/eclipse/rdf4j/repository/config/RepositoryConfigSchema.java @@ -14,7 +14,7 @@ /** * Defines constants for the repository configuration schema that is used by * {@link org.eclipse.rdf4j.repository.manager.RepositoryManager}s. - * + * * @author Arjohn Kampman */ public class RepositoryConfigSchema { diff --git a/core/repository/api/src/main/java/org/eclipse/rdf4j/repository/config/RepositoryConfigUtil.java b/core/repository/api/src/main/java/org/eclipse/rdf4j/repository/config/RepositoryConfigUtil.java index b8c657eada2..d5c5c5e68d6 100644 --- a/core/repository/api/src/main/java/org/eclipse/rdf4j/repository/config/RepositoryConfigUtil.java +++ b/core/repository/api/src/main/java/org/eclipse/rdf4j/repository/config/RepositoryConfigUtil.java @@ -98,7 +98,7 @@ public static Set getRepositoryIDs(Repository repository) throws Reposit /** * Is configuration information for the specified repository ID present in the (system) repository? - * + * * @param repository the repository to look in * @param repositoryID the repositoryID to look for * @return true if configurion information for the specified repository ID was found, false otherwise @@ -140,7 +140,7 @@ public static RepositoryConfig getRepositoryConfig(Repository repository, String /** * Update the specified Repository with the specified set of RepositoryConfigs. This will overwrite all existing * configurations in the Repository that have a Repository ID occurring in these RepositoryConfigs. - * + * * @param repository The Repository whose contents will be modified. * @param configs The RepositoryConfigs that should be added to or updated in the Repository. The * RepositoryConfig's ID may already occur in the Repository, in which case all previous @@ -161,7 +161,7 @@ public static void updateRepositoryConfigs(Repository repository, RepositoryConf * Update the specified RepositoryConnection with the specified set of RepositoryConfigs. This will overwrite all * existing configurations in the Repository that have a Repository ID occurring in these RepositoryConfigs. Note: * this method does NOT commit the updates on the connection. - * + * * @param con the repository connection to perform the update on * @param configs The RepositoryConfigs that should be added to or updated in the Repository. The RepositoryConfig's * ID may already occur in the Repository, in which case all previous configuration data for that @@ -198,7 +198,7 @@ public static void updateRepositoryConfigs(RepositoryConnection con, RepositoryC /** * Removes one or more Repository configurations from a Repository. Nothing happens when this Repository does not * contain configurations for these Repository IDs. - * + * * @param repository The Repository to remove the configurations from. * @param repositoryIDs The IDs of the Repositories whose configurations need to be removed. * @throws RepositoryException Whenever access to the Repository's RepositoryConnection causes a diff --git a/core/repository/api/src/main/java/org/eclipse/rdf4j/repository/config/RepositoryFactory.java b/core/repository/api/src/main/java/org/eclipse/rdf4j/repository/config/RepositoryFactory.java index 623cd7e48f5..dc30aa15a94 100644 --- a/core/repository/api/src/main/java/org/eclipse/rdf4j/repository/config/RepositoryFactory.java +++ b/core/repository/api/src/main/java/org/eclipse/rdf4j/repository/config/RepositoryFactory.java @@ -12,7 +12,7 @@ /** * A RepositoryFactory takes care of creating and initializing a specific type of {@link Repository}s based on RDF * configuration data. - * + * * @author Arjohn Kampman */ public interface RepositoryFactory { @@ -28,7 +28,7 @@ public interface RepositoryFactory { /** * Returns a Repository instance that has been initialized using the supplied configuration data. - * + * * @param config TODO * @return The created (but un-initialized) repository. * @throws RepositoryConfigException If no repository could be created due to invalid or incomplete configuration diff --git a/core/repository/api/src/main/java/org/eclipse/rdf4j/repository/config/RepositoryImplConfig.java b/core/repository/api/src/main/java/org/eclipse/rdf4j/repository/config/RepositoryImplConfig.java index 267253d68c1..47256f02ffc 100644 --- a/core/repository/api/src/main/java/org/eclipse/rdf4j/repository/config/RepositoryImplConfig.java +++ b/core/repository/api/src/main/java/org/eclipse/rdf4j/repository/config/RepositoryImplConfig.java @@ -20,14 +20,14 @@ public interface RepositoryImplConfig { /** * Validates this configuration. A {@link RepositoryConfigException} is thrown when the configuration is invalid. * The exception should contain an error message that indicates why the configuration is invalid. - * + * * @throws RepositoryConfigException If the configuration is invalid. */ public void validate() throws RepositoryConfigException; /** * Export this {@link RepositoryImplConfig} to its RDF representation - * + * * @param model a {@link Model} object. After successful completion of this method this Model will contain the RDF * representation of this {@link RepositoryImplConfig}. * @return the subject {@link Resource} that identifies this {@link RepositoryImplConfig} in the Model. @@ -36,7 +36,7 @@ public interface RepositoryImplConfig { /** * Reads the properties of this {@link RepositoryImplConfig} from the supplied Model and sets them accordingly. - * + * * @param model a {@link Model} containing repository configuration data. * @param resource the subject {@link Resource} that identifies the {@link RepositoryImplConfig} in the Model. * @throws RepositoryConfigException if the configuration data could not be read from the supplied Model. diff --git a/core/repository/api/src/main/java/org/eclipse/rdf4j/repository/config/RepositoryRegistry.java b/core/repository/api/src/main/java/org/eclipse/rdf4j/repository/config/RepositoryRegistry.java index 5c17d66d9e7..f609836c2f5 100644 --- a/core/repository/api/src/main/java/org/eclipse/rdf4j/repository/config/RepositoryRegistry.java +++ b/core/repository/api/src/main/java/org/eclipse/rdf4j/repository/config/RepositoryRegistry.java @@ -11,7 +11,7 @@ /** * A registry that keeps track of the available {@link RepositoryFactory}s. - * + * * @author Arjohn Kampman */ public class RepositoryRegistry extends ServiceRegistry { @@ -26,7 +26,7 @@ private static class RepositoryRegistryHolder { /** * Gets the default RepositoryRegistry. - * + * * @return The default registry. */ public static RepositoryRegistry getInstance() { diff --git a/core/repository/api/src/main/java/org/eclipse/rdf4j/repository/filters/RepositoryBloomFilter.java b/core/repository/api/src/main/java/org/eclipse/rdf4j/repository/filters/RepositoryBloomFilter.java index 09e39d45dd2..3d7be673d43 100644 --- a/core/repository/api/src/main/java/org/eclipse/rdf4j/repository/filters/RepositoryBloomFilter.java +++ b/core/repository/api/src/main/java/org/eclipse/rdf4j/repository/filters/RepositoryBloomFilter.java @@ -20,7 +20,7 @@ public interface RepositoryBloomFilter { /** * Returns true if the repository may have such a statement or false if it definitely does not. - * + * * @param conn connection to the repository to check. * @param subj subject of the statement to check for (can be null). * @param pred predicate of the statement to check for (can be null). diff --git a/core/repository/api/src/main/java/org/eclipse/rdf4j/repository/package-info.java b/core/repository/api/src/main/java/org/eclipse/rdf4j/repository/package-info.java index 17541b94ecb..15d46e3c74b 100644 --- a/core/repository/api/src/main/java/org/eclipse/rdf4j/repository/package-info.java +++ b/core/repository/api/src/main/java/org/eclipse/rdf4j/repository/package-info.java @@ -1,13 +1,13 @@ /** * The Repository API: the main API for accessing rdf databases and SPARQL endpoints. - * + * * The class {@link org.eclipse.rdf4j.repository.Repository} is the main interface for rdf4j repositories. It provides * all sorts of operations for manipulating RDF in various ways, through a * {@link org.eclipse.rdf4j.repository.RepositoryConnection}. - * + * * An important notion in a rdf4j repository is that of context . Within one repository, subsets of * statements can be identified by their context. * * @see rdf4j repository API documentation */ -package org.eclipse.rdf4j.repository; \ No newline at end of file +package org.eclipse.rdf4j.repository; diff --git a/core/repository/api/src/main/java/org/eclipse/rdf4j/repository/util/AbstractRDFInserter.java b/core/repository/api/src/main/java/org/eclipse/rdf4j/repository/util/AbstractRDFInserter.java index c3252aefa0d..d581db89bf1 100644 --- a/core/repository/api/src/main/java/org/eclipse/rdf4j/repository/util/AbstractRDFInserter.java +++ b/core/repository/api/src/main/java/org/eclipse/rdf4j/repository/util/AbstractRDFInserter.java @@ -81,7 +81,7 @@ protected AbstractRDFInserter(ValueFactory vf) { /** * Sets whether this RDFInserter should preserve blank node IDs. - * + * * @param preserveBNodeIDs The new value for this flag. */ public void setPreserveBNodeIDs(boolean preserveBNodeIDs) { @@ -97,7 +97,7 @@ public boolean preservesBNodeIDs() { /** * Enforces the supplied contexts upon all statements that are reported to this RDFInserter. - * + * * @param contexts the contexts to use. Use an empty array (not null!) to indicate no context(s) should be enforced. */ public void enforceContext(Resource... contexts) { @@ -107,7 +107,7 @@ public void enforceContext(Resource... contexts) { /** * Checks whether this RDFInserter enforces its contexts upon all statements that are reported to it. - * + * * @return true if it enforces its contexts, false otherwise. */ public boolean enforcesContext() { @@ -117,7 +117,7 @@ public boolean enforcesContext() { /** * Gets the contexts that this RDFInserter enforces upon all statements that are reported to it (in case * enforcesContext() returns true). - * + * * @return A Resource[] identifying the contexts, or an empty array if no contexts is enforced. */ public Resource[] getContexts() { @@ -186,7 +186,7 @@ public void handleStatement(Statement st) throws RDFHandlerException { /** * Maps the supplied BNode, which comes from the data, to a new BNode object. Consecutive calls with equal BNode * objects returns the same object everytime. - * + * * @throws RepositoryException */ private BNode mapBNode(BNode bNode) { diff --git a/core/repository/api/src/main/java/org/eclipse/rdf4j/repository/util/Connections.java b/core/repository/api/src/main/java/org/eclipse/rdf4j/repository/util/Connections.java index 690b2754848..8bf39bf6f8e 100644 --- a/core/repository/api/src/main/java/org/eclipse/rdf4j/repository/util/Connections.java +++ b/core/repository/api/src/main/java/org/eclipse/rdf4j/repository/util/Connections.java @@ -35,7 +35,7 @@ public class Connections { /** * Retrieve all {@link Statement}s that together form the RDF Collection starting with the supplied start resource * and send them to the supplied {@link Consumer}. - * + * * @param conn the {@link RepositoryConnection} to use for statement retrieval. * @param head the start resource of the RDF Collection. May not be {@code null}. * @param collectionConsumer a {@link Consumer} function to which all retrieved statements will be reported. May not @@ -59,7 +59,7 @@ public static void consumeRDFCollection(RepositoryConnection conn, Resource head /** * Retrieve all {@link Statement}s that together form the RDF Collection starting with the supplied starting * resource. - * + * * @param conn the {@link RepositoryConnection} to use for statement retrieval. * @param head the start resource of the RDF Collection. May not be {@code null}. * @param statementCollection a {@link Collection} of {@link Statement}s (for example, a {@link Model}) to which all @@ -85,7 +85,7 @@ public static > C getRDFCollection(RepositoryCon * Retrieve a single {@link Statement} matching with the supplied subject, predicate, object and context(s) from the * given {@link RepositoryConnection}. If more than one Statement matches, any one Statement is selected and * returned. - * + * * @param conn the {@link RepositoryConnection} from which to retrieve the statement. * @param subject the subject to which the statement should match. May be {@code null}. * @param predicate the predicate to which the statement should match. May be {@code null}. diff --git a/core/repository/api/src/main/java/org/eclipse/rdf4j/repository/util/RDFInserter.java b/core/repository/api/src/main/java/org/eclipse/rdf4j/repository/util/RDFInserter.java index 50d6d9cedee..1c67aa321c0 100644 --- a/core/repository/api/src/main/java/org/eclipse/rdf4j/repository/util/RDFInserter.java +++ b/core/repository/api/src/main/java/org/eclipse/rdf4j/repository/util/RDFInserter.java @@ -15,7 +15,7 @@ /** * An RDFHandler that adds RDF data to a repository. - * + * * @author jeen */ public class RDFInserter extends AbstractRDFInserter { @@ -36,7 +36,7 @@ public class RDFInserter extends AbstractRDFInserter { /** * Creates a new RDFInserter object that preserves bnode IDs and that does not enforce any context upon statements * that are reported to it. - * + * * @param con The connection to use for the add operations. */ public RDFInserter(RepositoryConnection con) { diff --git a/core/repository/api/src/main/java/org/eclipse/rdf4j/repository/util/RDFLoader.java b/core/repository/api/src/main/java/org/eclipse/rdf4j/repository/util/RDFLoader.java index 85a4da3c188..0f9c31700e0 100644 --- a/core/repository/api/src/main/java/org/eclipse/rdf4j/repository/util/RDFLoader.java +++ b/core/repository/api/src/main/java/org/eclipse/rdf4j/repository/util/RDFLoader.java @@ -38,7 +38,7 @@ /** * Handles common I/O to retrieve and parse RDF. - * + * * @author James Leigh */ public class RDFLoader { @@ -58,7 +58,7 @@ public RDFLoader(ParserConfig config, ValueFactory vf) { /** * Parses RDF data from the specified file to the given RDFHandler. - * + * * @param file A file containing RDF data. * @param baseURI The base URI to resolve any relative URIs that are in the data against. This defaults to the * value of {@link java.io.File#toURI() file.toURI()} if the value is set to null. @@ -88,7 +88,7 @@ public void load(File file, String baseURI, RDFFormat dataFormat, RDFHandler rdf /** * Parses the RDF data that can be found at the specified URL to the RDFHandler. - * + * * @param url The URL of the RDF data. * @param baseURI The base URI to resolve any relative URIs that are in the data against. This defaults to the * value of {@link java.net.URL#toExternalForm() url.toExternalForm()} if the value is set to @@ -144,7 +144,7 @@ public void load(URL url, String baseURI, RDFFormat dataFormat, RDFHandler rdfHa /** * Parses RDF data from an InputStream to the RDFHandler. - * + * * @param in An InputStream from which RDF data can be read. * @param baseURI The base URI to resolve any relative URIs that are in the data against. * @param dataFormat The serialization format of the data. @@ -173,7 +173,7 @@ public void load(InputStream in, String baseURI, RDFFormat dataFormat, RDFHandle * Parses RDF data from a Reader to the RDFHandler. Note: using a Reader to upload byte-based data means that you * have to be careful not to destroy the data's character encoding by enforcing a default character encoding upon * the bytes. If possible, adding such data using an InputStream is to be preferred. - * + * * @param reader A Reader from which RDF data can be read. * @param baseURI The base URI to resolve any relative URIs that are in the data against. * @param dataFormat The serialization format of the data. @@ -218,7 +218,7 @@ private void loadZip(InputStream in, String baseURI, RDFFormat dataFormat, RDFHa /** * Adds the data that can be read from the supplied InputStream or Reader to this repository. - * + * * @param inputStreamOrReader An {@link InputStream} or {@link Reader} containing RDF data that must be added to the * repository. * @param baseURI The base URI for the data. diff --git a/core/repository/api/src/main/java/org/eclipse/rdf4j/repository/util/RDFRemover.java b/core/repository/api/src/main/java/org/eclipse/rdf4j/repository/util/RDFRemover.java index c0867f70333..383a77ff904 100644 --- a/core/repository/api/src/main/java/org/eclipse/rdf4j/repository/util/RDFRemover.java +++ b/core/repository/api/src/main/java/org/eclipse/rdf4j/repository/util/RDFRemover.java @@ -50,7 +50,7 @@ public class RDFRemover extends AbstractRDFHandler { /** * Creates a new RDFRemover object that removes the data from the default context. - * + * * @param con The connection to use for the removal operations. */ public RDFRemover(RepositoryConnection con) { @@ -64,7 +64,7 @@ public RDFRemover(RepositoryConnection con) { /** * Enforces the supplied context upon all statements that are reported to this RDFRemover. - * + * * @param context A Resource identifying the context, or null for the null context. */ public void enforceContext(Resource context) { @@ -74,7 +74,7 @@ public void enforceContext(Resource context) { /** * Checks whether this RDFRemover enforces its context upon all statements that are reported to it. - * + * * @return true if it enforces its context, false otherwise. */ public boolean enforcesContext() { @@ -84,7 +84,7 @@ public boolean enforcesContext() { /** * Gets the context identifier that this RDFRemover enforces upon all statements that are reported to it (in case * enforcesContext() returns true). - * + * * @return A Resource identifying the context, or null if the null context is enforced. */ public Resource getContext() { diff --git a/core/repository/api/src/main/java/org/eclipse/rdf4j/repository/util/Repositories.java b/core/repository/api/src/main/java/org/eclipse/rdf4j/repository/util/Repositories.java index 7ed2660290c..f34d7ab7c47 100644 --- a/core/repository/api/src/main/java/org/eclipse/rdf4j/repository/util/Repositories.java +++ b/core/repository/api/src/main/java/org/eclipse/rdf4j/repository/util/Repositories.java @@ -28,7 +28,7 @@ /** * Utility for dealing with {@link Repository} and {@link RepositoryConnection} objects. - * + * * @author Peter Ansell */ public final class Repositories { @@ -37,7 +37,7 @@ public final class Repositories { * Opens a {@link RepositoryConnection} to the given Repository within a transaction, sends the connection to the * given {@link Consumer}, before either rolling back the transaction if it failed, or committing the transaction if * it was successful. - * + * * @param repository The {@link Repository} to open a connection to. * @param processFunction A {@link Consumer} that performs an action on the connection. * @throws RepositoryException If there was an exception dealing with the Repository. @@ -55,7 +55,7 @@ public static void consume(Repository repository, Consumer /** * Opens a {@link RepositoryConnection} to the given Repository without opening a transaction, sends the connection * to the given {@link Consumer}. - * + * * @param repository The {@link Repository} to open a connection to. * @param processFunction A {@link Consumer} that performs an action on the connection. * @throws RepositoryException If there was an exception dealing with the Repository. @@ -74,7 +74,7 @@ public static void consumeNoTransaction(Repository repository, Consumer /** * Opens a {@link RepositoryConnection} to the given Repository without opening a transaction, sends the connection * to the given {@link Consumer}. - * + * * @param repository The {@link Repository} to open a connection to. * @param processFunction A {@link Consumer} that performs an action on the connection. * @param exceptionHandler A {@link Consumer} that handles an exception if one was generated. @@ -117,7 +117,7 @@ public static void consumeNoTransaction(Repository repository, Consumer The type of the return value. * @param repository The {@link Repository} to open a connection to. * @param processFunction A {@link Function} that performs an action on the connection and returns a result. @@ -177,7 +177,7 @@ public static T get(Repository repository, Function /** * Opens a {@link RepositoryConnection} to the given Repository without opening a transaction, sends the connection * to the given {@link Function}. - * + * * @param The type of the return value. * @param repository The {@link Repository} to open a connection to. * @param processFunction A {@link Function} that performs an action on the connection and returns a result. @@ -205,7 +205,7 @@ public static T getNoTransaction(Repository repository, Function The type of the return value. * @param repository The {@link Repository} to open a connection to. * @param processFunction A {@link Function} that performs an action on the connection and returns a result. @@ -230,7 +230,7 @@ public static T get(Repository repository, Function /** * Opens a {@link RepositoryConnection} to the given Repository without opening a transaction, sends the connection * to the given {@link Function}. - * + * * @param The type of the return value. * @param repository The {@link Repository} to open a connection to. * @param processFunction A {@link Function} that performs an action on the connection and returns a result. @@ -256,7 +256,7 @@ public static T getNoTransaction(Repository repository, Function The type of the return value. * @param repository The {@link Repository} to open a connection to. * @param processFunction A {@link Function} that performs an action on the connection and returns a result. @@ -270,7 +270,7 @@ public static T getSilent(Repository repository, Function The type of the return value. * @param repository The {@link Repository} to open a connection to. * @param processFunction A {@link Function} that performs an action on the connection and returns a result. @@ -285,7 +285,7 @@ public static T getSilentNoTransaction(Repository repository, /** * Performs a SPARQL Select query on the given Repository within a transaction and passes the results to the given * {@link Function} with the result from the function returned by the method. - * + * * @param The type of the return value. * @param repository The {@link Repository} to open a connection to. * @param query The SPARQL Select query to execute. @@ -312,7 +312,7 @@ public static T tupleQuery(Repository repository, String query, Function The type of the return value. * @param repository The {@link Repository} to open a connection to. * @param query The SPARQL Select query to execute. @@ -339,7 +339,7 @@ public static T tupleQueryNoTransaction(Repository repository, String query, /** * Performs a SPARQL Select query on the given Repository within a transaction and passes the results to the given * {@link TupleQueryResultHandler}. - * + * * @param repository The {@link Repository} to open a connection to. * @param query The SPARQL Select query to execute. * @param handler A {@link TupleQueryResultHandler} that consumes the results. @@ -361,7 +361,7 @@ public static void tupleQuery(Repository repository, String query, TupleQueryRes /** * Performs a SPARQL Select query on the given Repository without opening a transaction and passes the results to * the given {@link TupleQueryResultHandler}. - * + * * @param repository The {@link Repository} to open a connection to. * @param query The SPARQL Select query to execute. * @param handler A {@link TupleQueryResultHandler} that consumes the results. @@ -383,7 +383,7 @@ public static void tupleQueryNoTransaction(Repository repository, String query, /** * Performs a SPARQL Construct or Describe query on the given Repository within a transaction and passes the results * to the given {@link Function} with the result from the function returned by the method. - * + * * @param The type of the return value. * @param repository The {@link Repository} to open a connection to. * @param query The SPARQL Construct or Describe query to execute. @@ -410,7 +410,7 @@ public static T graphQuery(Repository repository, String query, Function The type of the return value. * @param repository The {@link Repository} to open a connection to. * @param query The SPARQL Construct or Describe query to execute. @@ -437,7 +437,7 @@ public static T graphQueryNoTransaction(Repository repository, String query, /** * Performs a SPARQL Construct or Describe query on the given Repository within a transaction and passes the results * to the given {@link RDFHandler}. - * + * * @param repository The {@link Repository} to open a connection to. * @param query The SPARQL Construct or Describe query to execute. * @param handler An {@link RDFHandler} that consumes the results. @@ -458,7 +458,7 @@ public static void graphQuery(Repository repository, String query, RDFHandler ha /** * Performs a SPARQL Construct or Describe query on the given Repository without opening a transaction and passes * the results to the given {@link RDFHandler}. - * + * * @param repository The {@link Repository} to open a connection to. * @param query The SPARQL Construct or Describe query to execute. * @param handler An {@link RDFHandler} that consumes the results. @@ -480,7 +480,7 @@ public static void graphQueryNoTransaction(Repository repository, String query, /** * Creates a {@link Supplier} of {@link RepositoryException} objects that be passed to * {@link Optional#orElseThrow(Supplier)} to generate exceptions as necessary. - * + * * @param message The message to be used for the exception * @return A {@link Supplier} that will create {@link RepositoryException} objects with the given message. */ diff --git a/core/repository/api/src/main/java/org/eclipse/rdf4j/repository/util/RepositoryUtil.java b/core/repository/api/src/main/java/org/eclipse/rdf4j/repository/util/RepositoryUtil.java index 8f3e182da6b..f170a5ff9de 100644 --- a/core/repository/api/src/main/java/org/eclipse/rdf4j/repository/util/RepositoryUtil.java +++ b/core/repository/api/src/main/java/org/eclipse/rdf4j/repository/util/RepositoryUtil.java @@ -10,7 +10,6 @@ import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; -import java.util.HashSet; import java.util.Iterator; import java.util.LinkedList; import java.util.Map; diff --git a/core/repository/contextaware/pom.xml b/core/repository/contextaware/pom.xml index 67c1b954ea0..67ebd294cdb 100644 --- a/core/repository/contextaware/pom.xml +++ b/core/repository/contextaware/pom.xml @@ -4,7 +4,7 @@ org.eclipse.rdf4j rdf4j-repository - 3.1.5-SNAPSHOT + 3.2.2-SNAPSHOT rdf4j-repository-contextaware RDF4J: Repository - context aware (wrapper) diff --git a/core/repository/contextaware/src/main/java/org/eclipse/rdf4j/repository/contextaware/ContextAwareConnection.java b/core/repository/contextaware/src/main/java/org/eclipse/rdf4j/repository/contextaware/ContextAwareConnection.java index 844da5e0da7..2ece892f420 100644 --- a/core/repository/contextaware/src/main/java/org/eclipse/rdf4j/repository/contextaware/ContextAwareConnection.java +++ b/core/repository/contextaware/src/main/java/org/eclipse/rdf4j/repository/contextaware/ContextAwareConnection.java @@ -43,7 +43,7 @@ /** * Allows contexts to be specified at the connection level or the method level. - * + * * @author James Leigh */ public class ContextAwareConnection extends RepositoryConnectionWrapper { @@ -181,8 +181,9 @@ public void setReadContexts(IRI... readContexts) { */ @Deprecated public IRI[] getAddContexts() { - if (isNilContext(addContexts)) + if (isNilContext(addContexts)) { return new IRI[] { getInsertContext() }; + } return addContexts; } @@ -327,9 +328,10 @@ public void add(Iteration statemen @Override protected Statement convert(Statement st) { - if (st.getContext() == null) + if (st.getContext() == null) { return getValueFactory().createStatement(st.getSubject(), st.getPredicate(), st.getObject(), insertContext); + } return st; } }); @@ -421,7 +423,7 @@ public void export(RDFHandler handler, Resource... contexts) throws RepositoryEx /** * Exports all statements with a specific subject, predicate and/or object from the repository, optionally from the * specified contexts. - * + * * @param subj The subject, or null if the subject doesn't matter. * @param pred The predicate, or null if the predicate doesn't matter. * @param obj The object, or null if the object doesn't matter. @@ -452,7 +454,7 @@ public void exportStatements(Resource subj, IRI pred, Value obj, boolean include /** * Gets all statements with a specific subject, predicate and/or object from the repository. The result is * optionally restricted to the specified set of named contexts. - * + * * @param subj A Resource specifying the subject, or null for a wildcard. * @param pred A URI specifying the predicate, or null for a wildcard. * @param obj A Value specifying the object, or null for a wildcard. @@ -505,7 +507,7 @@ public boolean hasStatement(Statement st, boolean includeInferred, Resource... c /** * Checks whether the repository contains statements with a specific subject, predicate and/or object, optionally in * the specified contexts. - * + * * @param subj A Resource specifying the subject, or null for a wildcard. * @param pred A URI specifying the predicate, or null for a wildcard. * @param obj A Value specifying the object, or null for a wildcard. @@ -523,7 +525,7 @@ public boolean hasStatement(Resource subj, IRI pred, Value obj, Resource... cont /** * Checks whether the repository contains the specified statement, optionally in the specified contexts. - * + * * @param st The statement to look for. Context information in the statement is ignored. * @return true If the repository contains the specified statement, false otherwise. * @see #getReadContexts() @@ -642,7 +644,7 @@ public void remove(Iterable statements, Resource... context /** * Removes the supplied statements from a specific context in this repository, ignoring any context information * carried by the statements themselves. - * + * * @param statementIter The statements to remove. In case the iterator is a {@link CloseableIteration}, it will be * closed before this method returns. * @throws RepositoryException If the statements could not be removed from the repository, for example because the @@ -658,9 +660,10 @@ public void remove(Iteration state @Override protected Statement convert(Statement st) { - if (st.getContext() == null) + if (st.getContext() == null) { return getValueFactory().createStatement(st.getSubject(), st.getPredicate(), st.getObject(), removeContexts[0]); + } return st; } }); @@ -672,7 +675,7 @@ protected Statement convert(Statement st) { /** * Removes the statement with the specified subject, predicate and object from the repository, optionally restricted * to the specified contexts. - * + * * @param subject The statement's subject. * @param predicate The statement's predicate. * @param object The statement's object. @@ -691,7 +694,7 @@ public void remove(Resource subject, IRI predicate, Value object, Resource... co /** * Removes the supplied statement from the specified contexts in the repository. - * + * * @param st The statement to remove. * @throws RepositoryException If the statement could not be removed from the repository, for example because the * repository is not writable. @@ -708,7 +711,7 @@ public void remove(Statement st, Resource... contexts) throws RepositoryExceptio /** * Returns the number of (explicit) statements that are in the specified contexts in this repository. - * + * * @return The number of explicit statements from the specified contexts in this repository. * @see #getReadContexts() */ diff --git a/core/repository/contextaware/src/main/java/org/eclipse/rdf4j/repository/contextaware/ContextAwareRepository.java b/core/repository/contextaware/src/main/java/org/eclipse/rdf4j/repository/contextaware/ContextAwareRepository.java index a5b79c7d743..db68e3c56dd 100644 --- a/core/repository/contextaware/src/main/java/org/eclipse/rdf4j/repository/contextaware/ContextAwareRepository.java +++ b/core/repository/contextaware/src/main/java/org/eclipse/rdf4j/repository/contextaware/ContextAwareRepository.java @@ -15,7 +15,7 @@ /** * Allows contexts to be specified at the repository level. - * + * * @author James Leigh */ public class ContextAwareRepository extends RepositoryWrapper { diff --git a/core/repository/contextaware/src/main/java/org/eclipse/rdf4j/repository/contextaware/config/ContextAwareConfig.java b/core/repository/contextaware/src/main/java/org/eclipse/rdf4j/repository/contextaware/config/ContextAwareConfig.java index 966347bb7bc..4270ca7f87f 100644 --- a/core/repository/contextaware/src/main/java/org/eclipse/rdf4j/repository/contextaware/config/ContextAwareConfig.java +++ b/core/repository/contextaware/src/main/java/org/eclipse/rdf4j/repository/contextaware/config/ContextAwareConfig.java @@ -228,16 +228,16 @@ public void parse(Model model, Resource resource) throws RepositoryConfigExcepti super.parse(model, resource); try { - Models.objectLiteral(model.filter(resource, INCLUDE_INFERRED, null)) + Models.objectLiteral(model.getStatements(resource, INCLUDE_INFERRED, null)) .ifPresent(lit -> setIncludeInferred(lit.booleanValue())); - Models.objectLiteral(model.filter(resource, MAX_QUERY_TIME, null)) + Models.objectLiteral(model.getStatements(resource, MAX_QUERY_TIME, null)) .ifPresent(lit -> setMaxQueryTime(lit.intValue())); - Models.objectLiteral(model.filter(resource, QUERY_LANGUAGE, null)) + Models.objectLiteral(model.getStatements(resource, QUERY_LANGUAGE, null)) .ifPresent(lit -> setQueryLanguage(QueryLanguage.valueOf(lit.getLabel()))); - Models.objectIRI(model.filter(resource, QUERY_LANGUAGE, null)) + Models.objectIRI(model.getStatements(resource, QUERY_LANGUAGE, null)) .ifPresent(iri -> setBaseURI(iri.stringValue())); Set objects = model.filter(resource, READ_CONTEXT, null).objects(); @@ -252,7 +252,8 @@ public void parse(Model model, Resource resource) throws RepositoryConfigExcepti objects = model.filter(resource, ARCHIVE_CONTEXT, null).objects(); setArchiveContexts(objects.toArray(new IRI[objects.size()])); - Models.objectIRI(model.filter(resource, INSERT_CONTEXT, null)).ifPresent(iri -> setInsertContext(iri)); + Models.objectIRI(model.getStatements(resource, INSERT_CONTEXT, null)) + .ifPresent(iri -> setInsertContext(iri)); } catch (ArrayStoreException e) { throw new RepositoryConfigException(e); } diff --git a/core/repository/contextaware/src/main/java/org/eclipse/rdf4j/repository/contextaware/config/ContextAwareFactory.java b/core/repository/contextaware/src/main/java/org/eclipse/rdf4j/repository/contextaware/config/ContextAwareFactory.java index 37da9e8e7ec..903da274de0 100644 --- a/core/repository/contextaware/src/main/java/org/eclipse/rdf4j/repository/contextaware/config/ContextAwareFactory.java +++ b/core/repository/contextaware/src/main/java/org/eclipse/rdf4j/repository/contextaware/config/ContextAwareFactory.java @@ -15,7 +15,7 @@ /** * A {@link RepositoryFactory} that creates {@link ContextAwareRepository}s based on RDF configuration data. - * + * * @author James Leigh */ public class ContextAwareFactory implements RepositoryFactory { @@ -26,7 +26,7 @@ public class ContextAwareFactory implements RepositoryFactory { /** * The type of repositories that are created by this factory. - * + * * @see RepositoryFactory#getRepositoryType() */ public static final String REPOSITORY_TYPE = "openrdf:ContextAwareRepository"; diff --git a/core/repository/contextaware/src/test/java/org/eclipse/rdf4j/repository/contextaware/ContextAwareConnectionTest.java b/core/repository/contextaware/src/test/java/org/eclipse/rdf4j/repository/contextaware/ContextAwareConnectionTest.java index 3215537836e..fd41881c51d 100644 --- a/core/repository/contextaware/src/test/java/org/eclipse/rdf4j/repository/contextaware/ContextAwareConnectionTest.java +++ b/core/repository/contextaware/src/test/java/org/eclipse/rdf4j/repository/contextaware/ContextAwareConnectionTest.java @@ -29,6 +29,7 @@ import org.eclipse.rdf4j.query.TupleQuery; import org.eclipse.rdf4j.query.TupleQueryResult; import org.eclipse.rdf4j.query.TupleQueryResultHandler; +import org.eclipse.rdf4j.query.explanation.Explanation; import org.eclipse.rdf4j.query.impl.AbstractQuery; import org.eclipse.rdf4j.repository.Repository; import org.eclipse.rdf4j.repository.RepositoryConnection; @@ -50,6 +51,11 @@ public GraphQueryResult evaluate() { @Override public void evaluate(RDFHandler arg0) { } + + @Override + public Explanation explain(Explanation.Level level) { + throw new UnsupportedOperationException(); + } } static class InvocationHandlerStub implements InvocationHandler { @@ -61,6 +67,10 @@ public Object invoke(Object proxy, Method method, Object[] args) throws Throwabl } static class QueryStub extends AbstractQuery { + @Override + public Explanation explain(Explanation.Level level) { + throw new UnsupportedOperationException(); + } } static class RepositoryStub extends RepositoryWrapper { @@ -85,6 +95,11 @@ public TupleQueryResult evaluate() { @Override public void evaluate(TupleQueryResultHandler arg0) { } + + @Override + public Explanation explain(Explanation.Level level) { + throw new UnsupportedOperationException(); + } } private static class RepositoryConnectionStub extends RepositoryConnectionWrapper { diff --git a/core/repository/dataset/pom.xml b/core/repository/dataset/pom.xml index 7e8c94eaa33..446e1fcd570 100644 --- a/core/repository/dataset/pom.xml +++ b/core/repository/dataset/pom.xml @@ -4,7 +4,7 @@ org.eclipse.rdf4j rdf4j-repository - 3.1.5-SNAPSHOT + 3.2.2-SNAPSHOT rdf4j-repository-dataset RDF4J: DatasetRepository (wrapper) diff --git a/core/repository/dataset/src/main/java/org/eclipse/rdf4j/repository/dataset/DatasetBooleanQuery.java b/core/repository/dataset/src/main/java/org/eclipse/rdf4j/repository/dataset/DatasetBooleanQuery.java index caffae5854c..0c0220ed8dd 100644 --- a/core/repository/dataset/src/main/java/org/eclipse/rdf4j/repository/dataset/DatasetBooleanQuery.java +++ b/core/repository/dataset/src/main/java/org/eclipse/rdf4j/repository/dataset/DatasetBooleanQuery.java @@ -25,4 +25,5 @@ public boolean evaluate() throws QueryEvaluationException { con.loadDataset(sailQuery.getActiveDataset()); return ((BooleanQuery) sailQuery).evaluate(); } + } diff --git a/core/repository/dataset/src/main/java/org/eclipse/rdf4j/repository/dataset/DatasetQuery.java b/core/repository/dataset/src/main/java/org/eclipse/rdf4j/repository/dataset/DatasetQuery.java index 23909176a27..51f0de84b9b 100644 --- a/core/repository/dataset/src/main/java/org/eclipse/rdf4j/repository/dataset/DatasetQuery.java +++ b/core/repository/dataset/src/main/java/org/eclipse/rdf4j/repository/dataset/DatasetQuery.java @@ -11,6 +11,7 @@ import org.eclipse.rdf4j.query.BindingSet; import org.eclipse.rdf4j.query.Dataset; import org.eclipse.rdf4j.query.Query; +import org.eclipse.rdf4j.query.explanation.Explanation; import org.eclipse.rdf4j.repository.sail.SailQuery; /** @@ -68,8 +69,8 @@ public final boolean getIncludeInferred() { } @Override - public void setMaxExecutionTime(int maxExecTime) { - sailQuery.setMaxExecutionTime(maxExecTime); + public void setMaxExecutionTime(int maxExecutionTimeSeconds) { + sailQuery.setMaxExecutionTime(maxExecutionTimeSeconds); } @Override @@ -93,4 +94,9 @@ public int getMaxQueryTime() { public String toString() { return sailQuery.toString(); } + + @Override + public Explanation explain(Explanation.Level level) { + throw new UnsupportedOperationException(); + } } diff --git a/core/repository/dataset/src/main/java/org/eclipse/rdf4j/repository/dataset/config/DatasetRepositoryFactory.java b/core/repository/dataset/src/main/java/org/eclipse/rdf4j/repository/dataset/config/DatasetRepositoryFactory.java index c8fdd22daca..fe986a1161b 100644 --- a/core/repository/dataset/src/main/java/org/eclipse/rdf4j/repository/dataset/config/DatasetRepositoryFactory.java +++ b/core/repository/dataset/src/main/java/org/eclipse/rdf4j/repository/dataset/config/DatasetRepositoryFactory.java @@ -15,14 +15,14 @@ /** * A {@link RepositoryFactory} that creates {@link DatasetRepository}s based on RDF configuration data. - * + * * @author Arjohn Kampman */ public class DatasetRepositoryFactory implements RepositoryFactory { /** * The type of repositories that are created by this factory. - * + * * @see RepositoryFactory#getRepositoryType() */ public static final String REPOSITORY_TYPE = "openrdf:DatasetRepository"; diff --git a/core/repository/event/pom.xml b/core/repository/event/pom.xml index d87f2c2c243..bdba0e166ee 100644 --- a/core/repository/event/pom.xml +++ b/core/repository/event/pom.xml @@ -4,7 +4,7 @@ org.eclipse.rdf4j rdf4j-repository - 3.1.5-SNAPSHOT + 3.2.2-SNAPSHOT rdf4j-repository-event RDF4J: Repository - event (wrapper) diff --git a/core/repository/event/src/main/java/org/eclipse/rdf4j/repository/event/NotifyingRepository.java b/core/repository/event/src/main/java/org/eclipse/rdf4j/repository/event/NotifyingRepository.java index 0fd054df67c..32b41808698 100644 --- a/core/repository/event/src/main/java/org/eclipse/rdf4j/repository/event/NotifyingRepository.java +++ b/core/repository/event/src/main/java/org/eclipse/rdf4j/repository/event/NotifyingRepository.java @@ -42,7 +42,7 @@ public interface NotifyingRepository extends Repository { * Opens a connection to this repository that can be used for querying and updating the contents of the repository. * Created connections need to be closed to make sure that any resources they keep hold of are released. The best * way to do this is to use a try-finally-block as follows: - * + * *

     	 * Connection con = repository.getConnection();
     	 * try {
    @@ -51,11 +51,11 @@ public interface NotifyingRepository extends Repository {
     	 * 	con.close();
     	 * }
     	 * 
    - * + * * Note that {@link RepositoryConnection} is not guaranteed to be thread-safe! The recommended pattern for * repository access in a multithreaded application is to share the Repository object between threads, but have each * thread create and use its own {@link RepositoryConnection}s. - * + * * @return A connection that allows operations on this repository. * @throws RepositoryException If something went wrong during the creation of the Connection. */ diff --git a/core/repository/event/src/main/java/org/eclipse/rdf4j/repository/event/RepositoryConnectionInterceptor.java b/core/repository/event/src/main/java/org/eclipse/rdf4j/repository/event/RepositoryConnectionInterceptor.java index 67c4d9f7dcc..7c97cb25d7c 100644 --- a/core/repository/event/src/main/java/org/eclipse/rdf4j/repository/event/RepositoryConnectionInterceptor.java +++ b/core/repository/event/src/main/java/org/eclipse/rdf4j/repository/event/RepositoryConnectionInterceptor.java @@ -16,7 +16,7 @@ /** * Interceptor interface for connection modification. - * + * * @author Herko ter Horst */ public interface RepositoryConnectionInterceptor { diff --git a/core/repository/event/src/main/java/org/eclipse/rdf4j/repository/event/RepositoryConnectionListener.java b/core/repository/event/src/main/java/org/eclipse/rdf4j/repository/event/RepositoryConnectionListener.java index a6322f74426..76cd94a9333 100644 --- a/core/repository/event/src/main/java/org/eclipse/rdf4j/repository/event/RepositoryConnectionListener.java +++ b/core/repository/event/src/main/java/org/eclipse/rdf4j/repository/event/RepositoryConnectionListener.java @@ -16,7 +16,7 @@ /** * Listener interface for connection modification. - * + * * @author James Leigh */ public interface RepositoryConnectionListener { diff --git a/core/repository/event/src/main/java/org/eclipse/rdf4j/repository/event/RepositoryInterceptor.java b/core/repository/event/src/main/java/org/eclipse/rdf4j/repository/event/RepositoryInterceptor.java index 7078b983e12..8ad5967e841 100644 --- a/core/repository/event/src/main/java/org/eclipse/rdf4j/repository/event/RepositoryInterceptor.java +++ b/core/repository/event/src/main/java/org/eclipse/rdf4j/repository/event/RepositoryInterceptor.java @@ -15,7 +15,7 @@ /** * Interceptor interface for Repository state changes. - * + * * @author Herko ter Horst */ public interface RepositoryInterceptor extends EventListener { diff --git a/core/repository/event/src/main/java/org/eclipse/rdf4j/repository/event/RepositoryListener.java b/core/repository/event/src/main/java/org/eclipse/rdf4j/repository/event/RepositoryListener.java index 801c7b6efad..48b088d0bf7 100644 --- a/core/repository/event/src/main/java/org/eclipse/rdf4j/repository/event/RepositoryListener.java +++ b/core/repository/event/src/main/java/org/eclipse/rdf4j/repository/event/RepositoryListener.java @@ -12,7 +12,7 @@ /** * Listener interface for Repository state changes. - * + * * @author James Leigh */ public interface RepositoryListener extends EventListener { diff --git a/core/repository/event/src/main/java/org/eclipse/rdf4j/repository/event/base/InterceptingRepositoryConnectionWrapper.java b/core/repository/event/src/main/java/org/eclipse/rdf4j/repository/event/base/InterceptingRepositoryConnectionWrapper.java index cc049b97a98..ef6dc8e2e88 100644 --- a/core/repository/event/src/main/java/org/eclipse/rdf4j/repository/event/base/InterceptingRepositoryConnectionWrapper.java +++ b/core/repository/event/src/main/java/org/eclipse/rdf4j/repository/event/base/InterceptingRepositoryConnectionWrapper.java @@ -31,7 +31,7 @@ * the operation by returning true from the relevant notification method. To do so will also cause the notification * process to stop, i.e. no other interceptors will be notified. The order in which interceptors are notified is * unspecified. - * + * * @author Herko ter Horst * @see InterceptingRepositoryWrapper */ @@ -336,8 +336,8 @@ public boolean getIncludeInferred() { } @Override - public void setMaxExecutionTime(int maxExecTime) { - delegate.setMaxExecutionTime(maxExecTime); + public void setMaxExecutionTime(int maxExecutionTimeSeconds) { + delegate.setMaxExecutionTime(maxExecutionTimeSeconds); } @Override diff --git a/core/repository/event/src/main/java/org/eclipse/rdf4j/repository/event/base/InterceptingRepositoryWrapper.java b/core/repository/event/src/main/java/org/eclipse/rdf4j/repository/event/base/InterceptingRepositoryWrapper.java index 123cfe8da81..74340346039 100644 --- a/core/repository/event/src/main/java/org/eclipse/rdf4j/repository/event/base/InterceptingRepositoryWrapper.java +++ b/core/repository/event/src/main/java/org/eclipse/rdf4j/repository/event/base/InterceptingRepositoryWrapper.java @@ -24,7 +24,7 @@ * Wrapper that notifies interceptors of events on Repositories before they happen. Any interceptor can block the * operation by returning true from the relevant notification method. To do so will also cause the notification process * to stop, i.e. no other interceptors will be notified. The order in which interceptors are notified is unspecified. - * + * * @author Herko ter Horst * @see InterceptingRepositoryConnectionWrapper */ @@ -108,8 +108,9 @@ public InterceptingRepositoryConnection getConnection() throws RepositoryExcepti conn = null; } } - if (conn == null) + if (conn == null) { return null; + } InterceptingRepositoryConnection iconn = new InterceptingRepositoryConnectionWrapper(this, conn); for (RepositoryConnectionInterceptor conInterceptor : conInterceptors) { diff --git a/core/repository/event/src/main/java/org/eclipse/rdf4j/repository/event/base/NotifyingRepositoryConnectionWrapper.java b/core/repository/event/src/main/java/org/eclipse/rdf4j/repository/event/base/NotifyingRepositoryConnectionWrapper.java index f293ede1b8f..63805f404e2 100644 --- a/core/repository/event/src/main/java/org/eclipse/rdf4j/repository/event/base/NotifyingRepositoryConnectionWrapper.java +++ b/core/repository/event/src/main/java/org/eclipse/rdf4j/repository/event/base/NotifyingRepositoryConnectionWrapper.java @@ -7,14 +7,12 @@ *******************************************************************************/ package org.eclipse.rdf4j.repository.event.base; -import java.util.ArrayList; import java.util.List; import java.util.Set; import java.util.concurrent.CopyOnWriteArraySet; import java.util.stream.Collectors; import java.util.stream.Stream; -import org.eclipse.rdf4j.common.iteration.Iterations; import org.eclipse.rdf4j.model.IRI; import org.eclipse.rdf4j.model.Namespace; import org.eclipse.rdf4j.model.Resource; @@ -29,7 +27,6 @@ import org.eclipse.rdf4j.repository.Repository; import org.eclipse.rdf4j.repository.RepositoryConnection; import org.eclipse.rdf4j.repository.RepositoryException; -import org.eclipse.rdf4j.repository.RepositoryResult; import org.eclipse.rdf4j.repository.base.RepositoryConnectionWrapper; import org.eclipse.rdf4j.repository.event.NotifyingRepositoryConnection; import org.eclipse.rdf4j.repository.event.RepositoryConnectionListener; @@ -339,8 +336,8 @@ public boolean getIncludeInferred() { } @Override - public void setMaxExecutionTime(int maxExecTime) { - delegate.setMaxExecutionTime(maxExecTime); + public void setMaxExecutionTime(int maxExecutionTimeSeconds) { + delegate.setMaxExecutionTime(maxExecutionTimeSeconds); } @Override diff --git a/core/repository/event/src/main/java/org/eclipse/rdf4j/repository/event/base/NotifyingRepositoryWrapper.java b/core/repository/event/src/main/java/org/eclipse/rdf4j/repository/event/base/NotifyingRepositoryWrapper.java index 081751a6f92..d9e93ff7c96 100644 --- a/core/repository/event/src/main/java/org/eclipse/rdf4j/repository/event/base/NotifyingRepositoryWrapper.java +++ b/core/repository/event/src/main/java/org/eclipse/rdf4j/repository/event/base/NotifyingRepositoryWrapper.java @@ -23,7 +23,7 @@ /** * This notifying decorator allows listeners to register with the repository or connection and be notified when events * occur. - * + * * @author James Leigh * @author Herko ter Horst * @author Arjohn Kampman diff --git a/core/repository/event/src/test/java/org/eclipse/rdf4j/repository/event/InterceptorTest.java b/core/repository/event/src/test/java/org/eclipse/rdf4j/repository/event/InterceptorTest.java index 4e88d8e9983..41b9d54736b 100644 --- a/core/repository/event/src/test/java/org/eclipse/rdf4j/repository/event/InterceptorTest.java +++ b/core/repository/event/src/test/java/org/eclipse/rdf4j/repository/event/InterceptorTest.java @@ -43,8 +43,9 @@ static class InvocationHandlerStub implements InvocationHandler { @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { - if (Boolean.TYPE.equals(method.getReturnType())) + if (Boolean.TYPE.equals(method.getReturnType())) { return false; + } return null; } } diff --git a/core/repository/event/src/test/java/org/eclipse/rdf4j/repository/event/NotifyingTest.java b/core/repository/event/src/test/java/org/eclipse/rdf4j/repository/event/NotifyingTest.java index 29a0f1fcf8d..a1f4e7f8583 100644 --- a/core/repository/event/src/test/java/org/eclipse/rdf4j/repository/event/NotifyingTest.java +++ b/core/repository/event/src/test/java/org/eclipse/rdf4j/repository/event/NotifyingTest.java @@ -42,8 +42,9 @@ static class InvocationHandlerStub implements InvocationHandler { @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { - if (Boolean.TYPE.equals(method.getReturnType())) + if (Boolean.TYPE.equals(method.getReturnType())) { return false; + } return null; } } diff --git a/core/repository/http/pom.xml b/core/repository/http/pom.xml index b22dee18db6..1e8b430725a 100644 --- a/core/repository/http/pom.xml +++ b/core/repository/http/pom.xml @@ -4,7 +4,7 @@ org.eclipse.rdf4j rdf4j-repository - 3.1.5-SNAPSHOT + 3.2.2-SNAPSHOT rdf4j-repository-http RDF4J: HTTPRepository diff --git a/core/repository/http/src/main/java/org/eclipse/rdf4j/repository/http/HTTPBooleanQuery.java b/core/repository/http/src/main/java/org/eclipse/rdf4j/repository/http/HTTPBooleanQuery.java index 7e15afe2b30..e59aabcefa8 100644 --- a/core/repository/http/src/main/java/org/eclipse/rdf4j/repository/http/HTTPBooleanQuery.java +++ b/core/repository/http/src/main/java/org/eclipse/rdf4j/repository/http/HTTPBooleanQuery.java @@ -16,12 +16,13 @@ import org.eclipse.rdf4j.query.MalformedQueryException; import org.eclipse.rdf4j.query.QueryEvaluationException; import org.eclipse.rdf4j.query.QueryLanguage; +import org.eclipse.rdf4j.query.explanation.Explanation; import org.eclipse.rdf4j.repository.RepositoryException; /** * TupleQuery specific to the HTTP protocol. Methods in this class may throw the specific RepositoryException subclass * UnautorizedException, the semantics of which is defined by the HTTP protocol. - * + * * @see org.eclipse.rdf4j.http.protocol.UnauthorizedException * @author Arjohn Kampman */ @@ -46,4 +47,9 @@ public boolean evaluate() throws QueryEvaluationException { throw new HTTPQueryEvaluationException(e.getMessage(), e); } } + + @Override + public Explanation explain(Explanation.Level level) { + throw new UnsupportedOperationException(); + } } diff --git a/core/repository/http/src/main/java/org/eclipse/rdf4j/repository/http/HTTPGraphQuery.java b/core/repository/http/src/main/java/org/eclipse/rdf4j/repository/http/HTTPGraphQuery.java index f854d2df11e..2b3f0bf33ce 100644 --- a/core/repository/http/src/main/java/org/eclipse/rdf4j/repository/http/HTTPGraphQuery.java +++ b/core/repository/http/src/main/java/org/eclipse/rdf4j/repository/http/HTTPGraphQuery.java @@ -17,6 +17,7 @@ import org.eclipse.rdf4j.query.MalformedQueryException; import org.eclipse.rdf4j.query.QueryEvaluationException; import org.eclipse.rdf4j.query.QueryLanguage; +import org.eclipse.rdf4j.query.explanation.Explanation; import org.eclipse.rdf4j.repository.RepositoryException; import org.eclipse.rdf4j.rio.RDFHandler; import org.eclipse.rdf4j.rio.RDFHandlerException; @@ -24,7 +25,7 @@ /** * GraphQuery implementation specific to the HTTP protocol. Methods in this class may throw the specific * RepositoryException subclass UnautorizedException, the semantics of which is defined by the HTTP protocol. - * + * * @see org.eclipse.rdf4j.http.protocol.UnauthorizedException * @author Arjohn Kampman * @author Herko ter Horst @@ -71,4 +72,9 @@ public void evaluate(RDFHandler handler) throws QueryEvaluationException, RDFHan throw new HTTPQueryEvaluationException(e.getMessage(), e); } } + + @Override + public Explanation explain(Explanation.Level level) { + throw new UnsupportedOperationException(); + } } diff --git a/core/repository/http/src/main/java/org/eclipse/rdf4j/repository/http/HTTPRepository.java b/core/repository/http/src/main/java/org/eclipse/rdf4j/repository/http/HTTPRepository.java index d45b9508b6d..3fa42a52266 100644 --- a/core/repository/http/src/main/java/org/eclipse/rdf4j/repository/http/HTTPRepository.java +++ b/core/repository/http/src/main/java/org/eclipse/rdf4j/repository/http/HTTPRepository.java @@ -152,7 +152,7 @@ public void setHttpClientSessionManager(HttpClientSessionManager client) { /** * Get the additional HTTP headers which will be used - * + * * @return a read-only view of the additional HTTP headers which will be included in every request to the server. */ public Map getAdditionalHttpHeaders() { @@ -163,7 +163,7 @@ public Map getAdditionalHttpHeaders() { * Set additional HTTP headers to be included in every request to the server, which may be required for certain * unusual server configurations. This will only take effect on connections subsequently returned by * {@link #getConnection()}. - * + * * @param additionalHttpHeaders a map containing pairs of header names and values. May be null */ public void setAdditionalHttpHeaders(Map additionalHttpHeaders) { @@ -240,7 +240,7 @@ public boolean isWritable() throws RepositoryException { * overriding the {@link SPARQLProtocolSession} 's default preference. Setting this parameter is not necessary in * most cases as the {@link SPARQLProtocolSession} by default indicates a preference for the most compact and * efficient format available. - * + * * @param format the preferred {@link TupleQueryResultFormat}. If set to 'null' no explicit preference will be * stated. */ @@ -250,7 +250,7 @@ public void setPreferredTupleQueryResultFormat(final TupleQueryResultFormat form /** * Indicates the current preferred {@link TupleQueryResultFormat}. - * + * * @return The preferred format, of 'null' if no explicit preference is defined. */ public TupleQueryResultFormat getPreferredTupleQueryResultFormat() { @@ -265,7 +265,7 @@ public TupleQueryResultFormat getPreferredTupleQueryResultFormat() { *

    * Use with caution: if set to a format that does not support context serialization any context info contained in * the query result will be lost. - * + * * @param format the preferred {@link RDFFormat}. If set to 'null' no explicit preference will be stated. */ public void setPreferredRDFFormat(final RDFFormat format) { @@ -274,7 +274,7 @@ public void setPreferredRDFFormat(final RDFFormat format) { /** * Indicates the current preferred {@link RDFFormat}. - * + * * @return The preferred format, of 'null' if no explicit preference is defined. */ public RDFFormat getPreferredRDFFormat() { @@ -283,7 +283,7 @@ public RDFFormat getPreferredRDFFormat() { /** * Set the username and password to use for authenticating with the remote repository. - * + * * @param username the username. Setting this to null will disable authentication. * @param password the password. Setting this to null will disable authentication. */ @@ -322,7 +322,7 @@ protected void shutDownInternal() throws RepositoryException { /** * Creates a new HTTPClient object. Subclasses may override to return a more specific HTTPClient subtype. - * + * * @return a HTTPClient object. */ protected RDF4JProtocolSession createHTTPClient() { @@ -348,7 +348,7 @@ protected RDF4JProtocolSession createHTTPClient() { /** * Verify if transaction handling should be done in backward-compatible mode (this is the case when communicating * with an older Sesame Server). - * + * * @return true if the Server does not support the extended transaction protocol, false * otherwise. * @throws RepositoryException if something went wrong while querying the server for the protocol version. diff --git a/core/repository/http/src/main/java/org/eclipse/rdf4j/repository/http/HTTPRepositoryConnection.java b/core/repository/http/src/main/java/org/eclipse/rdf4j/repository/http/HTTPRepositoryConnection.java index cc1418e1e7f..87ad8181b9d 100644 --- a/core/repository/http/src/main/java/org/eclipse/rdf4j/repository/http/HTTPRepositoryConnection.java +++ b/core/repository/http/src/main/java/org/eclipse/rdf4j/repository/http/HTTPRepositoryConnection.java @@ -81,7 +81,7 @@ * RepositoryConnection that communicates with a server using the HTTP protocol. Methods in this class may throw the * specific RepositoryException subclasses UnautorizedException and NotAllowedException, the semantics of which are * defined by the HTTP protocol. - * + * * @see org.eclipse.rdf4j.http.protocol.UnauthorizedException * @see org.eclipse.rdf4j.http.protocol.NotAllowedException * @author Arjohn Kampman @@ -170,7 +170,7 @@ public void begin() throws RepositoryException { * to use the more specific {@link #prepareTupleQuery(QueryLanguage, String, String)}, * {@link #prepareBooleanQuery(QueryLanguage, String, String)}, or * {@link #prepareGraphQuery(QueryLanguage, String, String)} methods instead. - * + * * @throws UnsupportedOperationException if the method is not supported for the supplied query language. */ @Override @@ -294,6 +294,8 @@ public void commit() throws RepositoryException { try { client.commitTransaction(); active = false; + } catch (RepositoryException e) { + throw e; } catch (RDF4JException | IllegalStateException | IOException e) { throw new RepositoryException(e); } @@ -311,6 +313,8 @@ public void rollback() throws RepositoryException { try { client.rollbackTransaction(); active = false; + } catch (RepositoryException e) { + throw e; } catch (RDF4JException | IllegalStateException | IOException e) { throw new RepositoryException(e); } @@ -421,7 +425,8 @@ private RDFFormat getBackwardCompatibleFormat(RDFFormat format) { // N-Triples format, just with a different // default MIME-type. return new RDFFormat(NTRIPLES.getName(), Arrays.asList("text/plain"), NTRIPLES.getCharset(), - NTRIPLES.getFileExtensions(), NTRIPLES.supportsNamespaces(), NTRIPLES.supportsContexts()); + NTRIPLES.getFileExtensions(), NTRIPLES.supportsNamespaces(), NTRIPLES.supportsContexts(), + NTRIPLES.supportsRDFStar()); } return format; diff --git a/core/repository/http/src/main/java/org/eclipse/rdf4j/repository/http/HTTPTupleQuery.java b/core/repository/http/src/main/java/org/eclipse/rdf4j/repository/http/HTTPTupleQuery.java index fdc68cbbcc3..05672a84beb 100644 --- a/core/repository/http/src/main/java/org/eclipse/rdf4j/repository/http/HTTPTupleQuery.java +++ b/core/repository/http/src/main/java/org/eclipse/rdf4j/repository/http/HTTPTupleQuery.java @@ -19,12 +19,13 @@ import org.eclipse.rdf4j.query.TupleQueryResult; import org.eclipse.rdf4j.query.TupleQueryResultHandler; import org.eclipse.rdf4j.query.TupleQueryResultHandlerException; +import org.eclipse.rdf4j.query.explanation.Explanation; import org.eclipse.rdf4j.repository.RepositoryException; /** * TupleQuery specific to the HTTP protocol. Methods in this class may throw the specific RepositoryException subclass * UnautorizedException, the semantics of which is defined by the HTTP protocol. - * + * * @see org.eclipse.rdf4j.http.protocol.UnauthorizedException * @author Arjohn Kampman * @author Herko ter Horst @@ -62,4 +63,9 @@ public void evaluate(TupleQueryResultHandler handler) throw new HTTPQueryEvaluationException(e.getMessage(), e); } } + + @Override + public Explanation explain(Explanation.Level level) { + throw new UnsupportedOperationException(); + } } diff --git a/core/repository/http/src/main/java/org/eclipse/rdf4j/repository/http/HTTPUpdate.java b/core/repository/http/src/main/java/org/eclipse/rdf4j/repository/http/HTTPUpdate.java index cd8323513ed..993c96c59a7 100644 --- a/core/repository/http/src/main/java/org/eclipse/rdf4j/repository/http/HTTPUpdate.java +++ b/core/repository/http/src/main/java/org/eclipse/rdf4j/repository/http/HTTPUpdate.java @@ -22,7 +22,7 @@ /** * Update specific to the HTTP protocol. Methods in this class may throw the specific RepositoryException subclass * UnautorizedException, the semantics of which is defined by the HTTP protocol. - * + * * @see org.eclipse.rdf4j.http.protocol.UnauthorizedException * @author Jeen Broekstra */ diff --git a/core/repository/http/src/main/java/org/eclipse/rdf4j/repository/http/config/HTTPRepositoryConfig.java b/core/repository/http/src/main/java/org/eclipse/rdf4j/repository/http/config/HTTPRepositoryConfig.java index d82e2590c6d..ae4b0840880 100644 --- a/core/repository/http/src/main/java/org/eclipse/rdf4j/repository/http/config/HTTPRepositoryConfig.java +++ b/core/repository/http/src/main/java/org/eclipse/rdf4j/repository/http/config/HTTPRepositoryConfig.java @@ -97,12 +97,13 @@ public void parse(Model model, Resource implNode) throws RepositoryConfigExcepti super.parse(model, implNode); try { - Models.objectIRI(model.filter(implNode, REPOSITORYURL, null)).ifPresent(iri -> setURL(iri.stringValue())); + Models.objectIRI(model.getStatements(implNode, REPOSITORYURL, null)) + .ifPresent(iri -> setURL(iri.stringValue())); - Models.objectLiteral(model.filter(implNode, USERNAME, null)) + Models.objectLiteral(model.getStatements(implNode, USERNAME, null)) .ifPresent(username -> setUsername(username.getLabel())); - Models.objectLiteral(model.filter(implNode, PASSWORD, null)) + Models.objectLiteral(model.getStatements(implNode, PASSWORD, null)) .ifPresent(password -> setPassword(password.getLabel())); } catch (ModelException e) { diff --git a/core/repository/http/src/main/java/org/eclipse/rdf4j/repository/http/config/HTTPRepositoryFactory.java b/core/repository/http/src/main/java/org/eclipse/rdf4j/repository/http/config/HTTPRepositoryFactory.java index d2be6c0196b..2defe8830b7 100644 --- a/core/repository/http/src/main/java/org/eclipse/rdf4j/repository/http/config/HTTPRepositoryFactory.java +++ b/core/repository/http/src/main/java/org/eclipse/rdf4j/repository/http/config/HTTPRepositoryFactory.java @@ -15,14 +15,14 @@ /** * A {@link RepositoryFactory} that creates {@link HTTPRepository}s based on RDF configuration data. - * + * * @author Arjohn Kampman */ public class HTTPRepositoryFactory implements RepositoryFactory { /** * The type of repositories that are created by this factory. - * + * * @see RepositoryFactory#getRepositoryType() */ public static final String REPOSITORY_TYPE = "openrdf:HTTPRepository"; diff --git a/core/repository/http/src/main/java/org/eclipse/rdf4j/repository/http/config/HTTPRepositorySchema.java b/core/repository/http/src/main/java/org/eclipse/rdf4j/repository/http/config/HTTPRepositorySchema.java index 5bd3ba9d2fe..9cd85ffb54d 100644 --- a/core/repository/http/src/main/java/org/eclipse/rdf4j/repository/http/config/HTTPRepositorySchema.java +++ b/core/repository/http/src/main/java/org/eclipse/rdf4j/repository/http/config/HTTPRepositorySchema.java @@ -15,7 +15,7 @@ /** * Defines constants for the HTTPRepository schema which is used by {@link HTTPRepositoryFactory}s to initialize * {@link HTTPRepository}s. - * + * * @author Arjohn Kampman */ public class HTTPRepositorySchema { diff --git a/core/repository/http/src/main/java/org/eclipse/rdf4j/repository/http/helpers/HTTPRepositorySettings.java b/core/repository/http/src/main/java/org/eclipse/rdf4j/repository/http/helpers/HTTPRepositorySettings.java index ac8936ebda2..64345df68c6 100644 --- a/core/repository/http/src/main/java/org/eclipse/rdf4j/repository/http/helpers/HTTPRepositorySettings.java +++ b/core/repository/http/src/main/java/org/eclipse/rdf4j/repository/http/helpers/HTTPRepositorySettings.java @@ -15,7 +15,7 @@ /** * Class encapsulates configuration settings specific for {@link HTTPRepository}. - * + * * @author Jacek Grzebyta */ public class HTTPRepositorySettings { @@ -28,7 +28,7 @@ public class HTTPRepositorySettings { * By default inner buffers within {@link org.eclipse.rdf4j.repository.http.HTTPRepositoryConnection} keep in memory * up to 200000 statement before they are flushed to the remote repository. */ - public static final RioSetting MAX_STATEMENT_BUFFER_SIZE = new RioSettingImpl( + public static final RioSetting MAX_STATEMENT_BUFFER_SIZE = new RioSettingImpl<>( "org.eclipse.rdf4j.http.maxstatementbuffersize", "Maximum number of statement buffered in memory", 200000); } diff --git a/core/repository/manager/pom.xml b/core/repository/manager/pom.xml index 2bbc69f239d..b8ff204cd65 100644 --- a/core/repository/manager/pom.xml +++ b/core/repository/manager/pom.xml @@ -4,7 +4,7 @@ org.eclipse.rdf4j rdf4j-repository - 3.1.5-SNAPSHOT + 3.2.2-SNAPSHOT rdf4j-repository-manager RDF4J: Repository manager diff --git a/core/repository/manager/src/main/java/org/eclipse/rdf4j/repository/manager/LocalRepositoryManager.java b/core/repository/manager/src/main/java/org/eclipse/rdf4j/repository/manager/LocalRepositoryManager.java index 3e01b1f1cd5..8df2f523e37 100644 --- a/core/repository/manager/src/main/java/org/eclipse/rdf4j/repository/manager/LocalRepositoryManager.java +++ b/core/repository/manager/src/main/java/org/eclipse/rdf4j/repository/manager/LocalRepositoryManager.java @@ -13,7 +13,6 @@ import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; -import java.io.FilenameFilter; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; @@ -70,7 +69,7 @@ /** * An implementation of the {@link RepositoryManager} interface that operates directly on the repository data files in * the local file system. - * + * * @author Arjohn Kampman */ public class LocalRepositoryManager extends RepositoryManager { @@ -112,7 +111,7 @@ public class LocalRepositoryManager extends RepositoryManager { /** * Creates a new RepositoryManager that operates on the specfified base directory. - * + * * @param baseDir The base directory where data for repositories can be stored, among other things. */ public LocalRepositoryManager(File baseDir) { @@ -145,7 +144,7 @@ public File getBaseDir() { /** * Gets the base dir against which to resolve relative paths. - * + * * @throws MalformedURLException If the path cannot be parsed as a URL */ @Override @@ -224,7 +223,7 @@ public void shutDown() { /** * Resolves the specified path against the manager's base directory. - * + * * @see #getBaseDir */ public File resolvePath(String path) { @@ -266,7 +265,7 @@ protected Repository createRepository(String id) throws RepositoryConfigExceptio * Creates the stack of Repository objects for the repository represented by the specified * {@link org.eclipse.rdf4j.repository.config.RepositoryImplConfig}. Uses a * {@link org.eclipse.rdf4j.repository.config.RepositoryFactory} to create the repository and initialize it. - * + * * @param config The node representing the to-be-created repository in the configuration. * @return The created repository, or null if no such repository exists. * @throws RepositoryConfigException If no repository could be created due to invalid or incomplete configuration diff --git a/core/repository/manager/src/main/java/org/eclipse/rdf4j/repository/manager/RepositoryManager.java b/core/repository/manager/src/main/java/org/eclipse/rdf4j/repository/manager/RepositoryManager.java index 37b7affccdf..226ee830076 100644 --- a/core/repository/manager/src/main/java/org/eclipse/rdf4j/repository/manager/RepositoryManager.java +++ b/core/repository/manager/src/main/java/org/eclipse/rdf4j/repository/manager/RepositoryManager.java @@ -39,7 +39,7 @@ /** * A manager for {@link Repository}s. - * + * * @author Arjohn Kampman * @see RepositoryProvider */ @@ -78,12 +78,12 @@ public abstract class RepositoryManager implements RepositoryResolver, HttpClien * Creates a new RepositoryManager. */ protected RepositoryManager() { - this(new HashMap()); + this(new HashMap<>()); } /** * Create a new RepositoryManager using the given map to store repository information. - * + * * @param initializedRepositories A map that will be used to store repository information. */ protected RepositoryManager(Map initializedRepositories) { @@ -97,7 +97,7 @@ protected RepositoryManager(Map initializedRepositories) { /** * Indicates if this RepositoryManager has been initialized. Note that the initialization status may change if the * Repository is shut down. - * + * * @return true iff the repository manager has been initialized. */ public boolean isInitialized() { @@ -112,7 +112,7 @@ public boolean isInitialized() { /** * Should be called before {@link #init()}. - * + * * @param httpClient The httpClient to use for remote/service calls. */ @Override @@ -120,7 +120,7 @@ public boolean isInitialized() { /** * Get the {@link ModelFactory} used for creating new {@link Model} objects in the manager. - * + * * @return the modelFactory * @since 3.0 */ @@ -130,7 +130,7 @@ public ModelFactory getModelFactory() { /** * Set the {@link ModelFactory} to use for creating new {@link Model} objects in the manager. - * + * * @param modelFactory the modelFactory to set. May not be null. * @since 3.0 */ @@ -141,7 +141,7 @@ public void setModelFactory(ModelFactory modelFactory) { /** * Initializes the repository manager. - * + * * @throws RepositoryException If the manager failed to initialize * @deprecated since 2.0. Use {@link #init()} instead. */ @@ -152,7 +152,7 @@ public void initialize() throws RepositoryException { /** * Initializes the repository manager. - * + * * @throws RepositoryException If the manager failed to initialize. * @since 2.5 */ @@ -167,7 +167,7 @@ protected Repository createSystemRepository() throws RepositoryException { /** * Gets the SYSTEM repository. - * + * * @deprecated Repository configuration is no longer stored in a centralized system repository, instead using a file * config.ttl per repository, stored in that repository's datadir. */ @@ -194,7 +194,7 @@ public Repository getSystemRepository() { * repository name entered by the user. The generated ID will contain a variant of this name that does not occur as * a repository ID in this manager yet and is suitable for use as a file name (e.g. for the repository's data * directory). - * + * * @param baseName The String on which the returned ID should be based, must not be null. * @return A new repository ID derived from the specified base name. * @throws RepositoryException @@ -268,7 +268,7 @@ public RepositoryConfig getRepositoryConfig(String repositoryID) * Adds or updates the configuration of a repository to the manager's system repository. The system repository may * already contain a configuration for a repository with the same ID as specified by config, in which case * all previous configuration data for that repository will be cleared before the new configuration is added. - * + * * @param config The repository configuration that should be added to or updated in the system repository. * @throws RepositoryException If the manager failed to update it's system repository. * @throws RepositoryConfigException If the manager doesn't know how to update a configuration due to inconsistent @@ -287,7 +287,7 @@ public void addRepositoryConfig(RepositoryConfig config) throws RepositoryExcept * Removes the configuration for the specified repository from the manager's system repository if such a * configuration is present. Returns true if the system repository actually contained the specified * repository configuration. - * + * * @param repositoryID The ID of the repository whose configuration needs to be removed. * @throws RepositoryException If the manager failed to update it's system repository. * @throws RepositoryConfigException If the manager doesn't know how to remove a configuration due to inconsistent @@ -330,7 +330,7 @@ public boolean removeRepositoryConfig(String repositoryID) throws RepositoryExce /** * Checks on whether the given repository is referred to by a * {@link org.eclipse.rdf4j.repository.sail.ProxyRepository} configuration. - * + * * @param repositoryID id to check * @return true if there is no existing proxy reference to the given id, false otherwise * @throws RepositoryException @@ -353,7 +353,7 @@ public boolean isSafeToRemove(String repositoryID) throws RepositoryException { * configuration is present, and removing any persistent data associated with the repository. Returns true * if the system repository actually contained the specified repository configuration. NB this operation can * not be undone! - * + * * @param repositoryID The ID of the repository that needs to be removed. * @throws RepositoryException If the manager failed to update its system repository. * @throws RepositoryConfigException If the manager doesn't know how to remove a repository due to inconsistent @@ -393,7 +393,7 @@ public boolean removeRepository(String repositoryID) throws RepositoryException, /** * Gets the repository that is known by the specified ID from this manager. - * + * * @param identity A repository ID. * @return An initialized Repository object, or null if no repository was known for the specified ID. * @throws RepositoryConfigException If no repository could be created due to invalid or incomplete configuration @@ -431,7 +431,7 @@ public Repository getRepository(String identity) throws RepositoryConfigExceptio /** * Returns all initialized repositories. This method returns fast as no lazy creation of repositories takes place. - * + * * @return a collection containing the IDs of all initialized repositories. * @see #getRepositoryIDs() */ @@ -444,7 +444,7 @@ public Set getInitializedRepositoryIDs() { /** * Returns all initialized repositories. This method returns fast as no lazy creation of repositories takes place. - * + * * @return a set containing the initialized repositories. * @see #getAllRepositories() */ @@ -493,7 +493,7 @@ protected void updateInitializedRepositories() { /** * Returns all configured repositories. This may be an expensive operation as it initializes repositories that have * not been initialized yet. - * + * * @return The Set of all Repositories defined in the SystemRepository. * @see #getInitializedRepositories() */ @@ -511,7 +511,7 @@ public Collection getAllRepositories() throws RepositoryConfigExcept /** * Creates and initializes the repository with the specified ID. - * + * * @param id A repository ID. * @return The created and initialized repository, or null if no such repository exists. * @throws RepositoryConfigException If no repository could be created due to invalid or incomplete configuration @@ -522,7 +522,7 @@ public Collection getAllRepositories() throws RepositoryConfigExcept /** * Gets the repository that is known by the specified ID from this manager. - * + * * @param id A repository ID. * @return A Repository object, or null if no repository was known for the specified ID. * @throws RepositoryException When not able to retrieve existing configurations @@ -553,7 +553,7 @@ public Collection getAllUserRepositoryInfos() throws RepositoryE /** * Shuts down all initialized user repositories. - * + * * @see #shutDown() */ public void refresh() { @@ -584,7 +584,7 @@ public void refresh() { /** * Shuts down all initialized repositories, including the SYSTEM repository. - * + * * @see #refresh() */ public void shutDown() { @@ -640,7 +640,7 @@ void cleanupIfRemoved(String repositoryID) { /** * Clean up a removed repository. Note that the configuration for this repository is no longer present in the system * repository. - * + * * @param repositoryID the ID of the repository to clean up * @throws IOException */ @@ -650,7 +650,7 @@ protected void cleanUpRepository(String repositoryID) throws IOException { /** * Gets the URL of the server or directory. - * + * * @throws MalformedURLException If the location cannot be represented as a URL. */ public abstract URL getLocation() throws MalformedURLException; diff --git a/core/repository/manager/src/main/java/org/eclipse/rdf4j/repository/manager/RepositoryProvider.java b/core/repository/manager/src/main/java/org/eclipse/rdf4j/repository/manager/RepositoryProvider.java index c4c78ae16cd..da459e8fce5 100644 --- a/core/repository/manager/src/main/java/org/eclipse/rdf4j/repository/manager/RepositoryProvider.java +++ b/core/repository/manager/src/main/java/org/eclipse/rdf4j/repository/manager/RepositoryProvider.java @@ -21,7 +21,7 @@ /** * A static access point to manage {@link RepositoryManager}s and {@link Repository Repositories}. RepositoryProvider * ensures that all managers and repositories obtained through it are automatically shutdown when the JVM exits. - * + * * @author James Leigh */ public class RepositoryProvider { @@ -59,7 +59,7 @@ public synchronized void shutDown() { } } - static final Map managers = new HashMap(); + static final Map managers = new HashMap<>(); static { Runtime.getRuntime().addShutdownHook(new Thread("RepositoryProvider-shutdownHook") { @@ -77,7 +77,7 @@ public void run() { /** * Creates a {@link RepositoryManager}, if not already created, that will be shutdown when the JVM exits cleanly. - * + * * @param url location of the data directory for the RepositoryManager. This should be a URL of the form * http://host:port/path/ (for a RemoteRepositoryManager) or file:///path/ (for a * LocalRepositoryManager). @@ -108,7 +108,7 @@ public static RepositoryManager getRepositoryManager(String url) /** * Creates a {@link LocalRepositoryManager}, if not already created, that will be shutdown when the JVM exits * cleanly. - * + * * @param dir the data directory for the repository manager. * @return a (new or existing) {@link LocalRepositoryManager}. * @throws RepositoryConfigException @@ -123,7 +123,7 @@ public static LocalRepositoryManager getRepositoryManager(File dir) /** * Retrieves the {@link RepositoryManager} that will be used for the given repository URL. Creates a * {@link RepositoryManager}, if not already created, that will be shutdown when the JVM exits cleanly. - * + * * @param url the location of the repository for which to retrieve the corresponding RepositoryManager. The * parameter must be a URL of the form http://host:port/path/repositories/id or * file:///path/repositories/id. @@ -147,7 +147,7 @@ public static RepositoryManager getRepositoryManagerOfRepository(String url) /** * Retrieves the Repository ID that will be passed to a RepositoryManager for the given repository URL. - * + * * @param url the location URL for the repository. The parameter must be a URL of the form * http://host:port/path/repositories/id or file:///path/repositories/id. * @return the repository identifier string for the given repository URL. @@ -168,7 +168,7 @@ public static String getRepositoryIdOfRepository(String url) { /** * Retrieves a (new or existing) Repository object for the supplied repository URL. The Repository will be shutdown * when the JVM exits cleanly. - * + * * @param url the repository URL. The parameter must be a URL of the form http://host:port/path/repositories/id or * file:///path/repositories/id. * @return Repository from a RepositoryManager or null if repository is not defined @@ -202,8 +202,9 @@ private static String normalizeDirectory(String url) throws IllegalArgumentExcep norm = new File(".").toURI().resolve(url); } norm = norm.normalize(); - if (norm.isOpaque()) + if (norm.isOpaque()) { throw new IllegalArgumentException("Repository Manager URL must not be opaque: " + url); + } String sch = norm.getScheme(); String host = norm.getAuthority(); String path = norm.getPath(); diff --git a/core/repository/manager/src/main/java/org/eclipse/rdf4j/repository/manager/SystemRepository.java b/core/repository/manager/src/main/java/org/eclipse/rdf4j/repository/manager/SystemRepository.java index dcaa2c649d7..aa14c87c365 100644 --- a/core/repository/manager/src/main/java/org/eclipse/rdf4j/repository/manager/SystemRepository.java +++ b/core/repository/manager/src/main/java/org/eclipse/rdf4j/repository/manager/SystemRepository.java @@ -33,7 +33,7 @@ /** * FIXME: do not extend NotifyingRepositoryWrapper, because SystemRepository shouldn't expose RepositoryWrapper * behaviour, just implement NotifyingRepository. - * + * * @author Herko ter Horst * @author Arjohn Kampman */ diff --git a/core/repository/manager/src/test/java/org/eclipse/rdf4j/repository/manager/LocalRepositoryManagerTest.java b/core/repository/manager/src/test/java/org/eclipse/rdf4j/repository/manager/LocalRepositoryManagerTest.java index 384895452df..8055ef79370 100644 --- a/core/repository/manager/src/test/java/org/eclipse/rdf4j/repository/manager/LocalRepositoryManagerTest.java +++ b/core/repository/manager/src/test/java/org/eclipse/rdf4j/repository/manager/LocalRepositoryManagerTest.java @@ -17,11 +17,11 @@ /** * Unit tests for {@link LocalRepositoryManager}. - * + * * Note a lot of the functionality for the local manager can only be tested by integrating with other RDF4J modules - * more comprehensive tests are therefore located in LocalRepositoryManagerIntegationTest in the * rdfj4-repository-compliance module. - * + * * @author Jeen Broekstra */ public class LocalRepositoryManagerTest extends RepositoryManagerTest { diff --git a/core/repository/manager/src/test/java/org/eclipse/rdf4j/repository/manager/RepositoryManagerTest.java b/core/repository/manager/src/test/java/org/eclipse/rdf4j/repository/manager/RepositoryManagerTest.java index de89e42696f..a916f42d05e 100644 --- a/core/repository/manager/src/test/java/org/eclipse/rdf4j/repository/manager/RepositoryManagerTest.java +++ b/core/repository/manager/src/test/java/org/eclipse/rdf4j/repository/manager/RepositoryManagerTest.java @@ -24,7 +24,7 @@ /** * Unit tests for {@link RepositoryManager}. May be extended by specific {@link RepositoryManager} implementations. - * + * * @author Jeen Broekstra * */ diff --git a/core/repository/pom.xml b/core/repository/pom.xml index d811e1c2de8..adeadc16592 100644 --- a/core/repository/pom.xml +++ b/core/repository/pom.xml @@ -4,7 +4,7 @@ org.eclipse.rdf4j rdf4j-core - 3.1.5-SNAPSHOT + 3.2.2-SNAPSHOT rdf4j-repository pom diff --git a/core/repository/sail/pom.xml b/core/repository/sail/pom.xml index 66cdcb42b57..7b63938d5cf 100644 --- a/core/repository/sail/pom.xml +++ b/core/repository/sail/pom.xml @@ -4,7 +4,7 @@ org.eclipse.rdf4j rdf4j-repository - 3.1.5-SNAPSHOT + 3.2.2-SNAPSHOT rdf4j-repository-sail RDF4J: SailRepository diff --git a/core/repository/sail/src/main/java/org/eclipse/rdf4j/repository/evaluation/RepositoryTripleSource.java b/core/repository/sail/src/main/java/org/eclipse/rdf4j/repository/evaluation/RepositoryTripleSource.java index 730158685d9..9d2c4bb91ec 100644 --- a/core/repository/sail/src/main/java/org/eclipse/rdf4j/repository/evaluation/RepositoryTripleSource.java +++ b/core/repository/sail/src/main/java/org/eclipse/rdf4j/repository/evaluation/RepositoryTripleSource.java @@ -73,4 +73,4 @@ protected QueryEvaluationException convert(Exception exception) { public ValueFactory getValueFactory() { return repo.getValueFactory(); } -} \ No newline at end of file +} diff --git a/core/repository/sail/src/main/java/org/eclipse/rdf4j/repository/sail/ProxyRepository.java b/core/repository/sail/src/main/java/org/eclipse/rdf4j/repository/sail/ProxyRepository.java index c0aff73f5e0..c0ecbd2195f 100644 --- a/core/repository/sail/src/main/java/org/eclipse/rdf4j/repository/sail/ProxyRepository.java +++ b/core/repository/sail/src/main/java/org/eclipse/rdf4j/repository/sail/ProxyRepository.java @@ -33,7 +33,7 @@ * from having to provide implementation details in its configuration data. Instead, it only has to provide an * unambiguous local identifier to the proxy. *

    - * + * * @author Dale Visser */ public class ProxyRepository extends AbstractRepository implements RepositoryResolverClient { @@ -53,7 +53,7 @@ public ProxyRepository() { /** * Creates a repository instance that proxies to a repository of the give ID. - * + * * @param proxiedIdentity id of the proxied repository */ public ProxyRepository(String proxiedIdentity) { @@ -63,7 +63,7 @@ public ProxyRepository(String proxiedIdentity) { /** * Creates a repository instance that proxies to the given repository. - * + * * @param resolver manager that the proxied repository is associated with * @param proxiedIdentity id of the proxied repository */ diff --git a/core/repository/sail/src/main/java/org/eclipse/rdf4j/repository/sail/SailBooleanQuery.java b/core/repository/sail/src/main/java/org/eclipse/rdf4j/repository/sail/SailBooleanQuery.java index e341f76562c..f8e72bb5b28 100644 --- a/core/repository/sail/src/main/java/org/eclipse/rdf4j/repository/sail/SailBooleanQuery.java +++ b/core/repository/sail/src/main/java/org/eclipse/rdf4j/repository/sail/SailBooleanQuery.java @@ -67,4 +67,5 @@ public boolean evaluate() throws QueryEvaluationException { } } } + } diff --git a/core/repository/sail/src/main/java/org/eclipse/rdf4j/repository/sail/SailGraphQuery.java b/core/repository/sail/src/main/java/org/eclipse/rdf4j/repository/sail/SailGraphQuery.java index edc59c43c43..e5b69a20bae 100644 --- a/core/repository/sail/src/main/java/org/eclipse/rdf4j/repository/sail/SailGraphQuery.java +++ b/core/repository/sail/src/main/java/org/eclipse/rdf4j/repository/sail/SailGraphQuery.java @@ -135,4 +135,5 @@ public void evaluate(RDFHandler handler) throws QueryEvaluationException, RDFHan GraphQueryResult queryResult = evaluate(); QueryResults.report(queryResult, handler); } + } diff --git a/core/repository/sail/src/main/java/org/eclipse/rdf4j/repository/sail/SailQuery.java b/core/repository/sail/src/main/java/org/eclipse/rdf4j/repository/sail/SailQuery.java index 2a16a26cab7..b4ec0325e61 100644 --- a/core/repository/sail/src/main/java/org/eclipse/rdf4j/repository/sail/SailQuery.java +++ b/core/repository/sail/src/main/java/org/eclipse/rdf4j/repository/sail/SailQuery.java @@ -7,8 +7,11 @@ *******************************************************************************/ package org.eclipse.rdf4j.repository.sail; +import org.eclipse.rdf4j.query.algebra.TupleExpr; +import org.eclipse.rdf4j.query.explanation.Explanation; import org.eclipse.rdf4j.query.impl.AbstractParserQuery; import org.eclipse.rdf4j.query.parser.ParsedQuery; +import org.eclipse.rdf4j.sail.SailConnection; /** * @author Arjohn Kampman @@ -25,4 +28,20 @@ protected SailQuery(ParsedQuery parsedQuery, SailRepositoryConnection con) { protected SailRepositoryConnection getConnection() { return con; } + + @Override + public Explanation explain(Explanation.Level level) { + + int timeout = DEFAULT_EXPLANATION_EXECUTION_TIMEOUT; + if (getMaxExecutionTime() > 0) { + timeout = getMaxExecutionTime(); + } + + TupleExpr tupleExpr = getParsedQuery().getTupleExpr(); + + SailConnection sailCon = getConnection().getSailConnection(); + + return sailCon.explain(level, tupleExpr, getActiveDataset(), getBindings(), getIncludeInferred(), timeout); + + } } diff --git a/core/repository/sail/src/main/java/org/eclipse/rdf4j/repository/sail/SailRepository.java b/core/repository/sail/src/main/java/org/eclipse/rdf4j/repository/sail/SailRepository.java index ae4d2c74851..1d50c6a2dfe 100644 --- a/core/repository/sail/src/main/java/org/eclipse/rdf4j/repository/sail/SailRepository.java +++ b/core/repository/sail/src/main/java/org/eclipse/rdf4j/repository/sail/SailRepository.java @@ -34,22 +34,22 @@ *

    * Creating a repository object of this type is very easy. For example, the following code creates and initializes a * main-memory store with RDF Schema semantics: - * + * *

      * Repository repository = new SailRepository(new ForwardChainingRDFSInferencer(new MemoryStore()));
      * repository.initialize();
      * 
    - * + * * Or, alternatively: - * + * *
      * Sail sailStack = new MemoryStore();
      * sailStack = new ForwardChainingRDFSInferencer(sailStack);
    - * 
    + *
      * Repository repository = new SailRepository(sailStack);
      * repository.initialize();
      * 
    - * + * * @author Arjohn Kampman */ public class SailRepository extends AbstractRepository implements FederatedServiceResolverClient, @@ -67,7 +67,7 @@ public class SailRepository extends AbstractRepository implements FederatedServi /** * Creates a new repository object that operates on the supplied Sail. - * + * * @param sail A Sail object. */ public SailRepository(Sail sail) { @@ -165,7 +165,7 @@ protected void shutDownInternal() throws RepositoryException { /** * Gets the Sail object that is on top of the Sail stack that this repository operates on. - * + * * @return A Sail object. */ public Sail getSail() { diff --git a/core/repository/sail/src/main/java/org/eclipse/rdf4j/repository/sail/SailRepositoryConnection.java b/core/repository/sail/src/main/java/org/eclipse/rdf4j/repository/sail/SailRepositoryConnection.java index f18a6b8c81f..1e2bfe369b8 100644 --- a/core/repository/sail/src/main/java/org/eclipse/rdf4j/repository/sail/SailRepositoryConnection.java +++ b/core/repository/sail/src/main/java/org/eclipse/rdf4j/repository/sail/SailRepositoryConnection.java @@ -7,6 +7,8 @@ *******************************************************************************/ package org.eclipse.rdf4j.repository.sail; +import java.util.Optional; + import org.apache.http.client.HttpClient; import org.eclipse.rdf4j.IsolationLevel; import org.eclipse.rdf4j.OpenRDFUtil; @@ -20,8 +22,10 @@ import org.eclipse.rdf4j.model.Statement; import org.eclipse.rdf4j.model.Value; import org.eclipse.rdf4j.query.MalformedQueryException; +import org.eclipse.rdf4j.query.Query; import org.eclipse.rdf4j.query.QueryLanguage; import org.eclipse.rdf4j.query.Update; +import org.eclipse.rdf4j.query.algebra.TupleExpr; import org.eclipse.rdf4j.query.algebra.evaluation.federation.FederatedServiceResolver; import org.eclipse.rdf4j.query.algebra.evaluation.federation.FederatedServiceResolverClient; import org.eclipse.rdf4j.query.parser.ParsedBooleanQuery; @@ -195,10 +199,25 @@ public SailQuery prepareQuery(QueryLanguage ql, String queryString, String baseU ParsedQuery parsedQuery = QueryParserUtil.parseQuery(ql, queryString, baseURI); if (parsedQuery instanceof ParsedTupleQuery) { + Optional sailTupleExpr = sailConnection.prepareQuery(ql, Query.QueryType.TUPLE, queryString, + baseURI); + if (sailTupleExpr.isPresent()) { + parsedQuery = new ParsedTupleQuery(queryString, sailTupleExpr.get()); + } return new SailTupleQuery((ParsedTupleQuery) parsedQuery, this); } else if (parsedQuery instanceof ParsedGraphQuery) { + Optional sailTupleExpr = sailConnection.prepareQuery(ql, Query.QueryType.GRAPH, queryString, + baseURI); + if (sailTupleExpr.isPresent()) { + parsedQuery = new ParsedGraphQuery(queryString, sailTupleExpr.get()); + } return new SailGraphQuery((ParsedGraphQuery) parsedQuery, this); } else if (parsedQuery instanceof ParsedBooleanQuery) { + Optional sailTupleExpr = sailConnection.prepareQuery(ql, Query.QueryType.BOOLEAN, queryString, + baseURI); + if (sailTupleExpr.isPresent()) { + parsedQuery = new ParsedBooleanQuery(queryString, sailTupleExpr.get()); + } return new SailBooleanQuery((ParsedBooleanQuery) parsedQuery, this); } else { throw new RuntimeException("Unexpected query type: " + parsedQuery.getClass()); @@ -208,21 +227,34 @@ public SailQuery prepareQuery(QueryLanguage ql, String queryString, String baseU @Override public SailTupleQuery prepareTupleQuery(QueryLanguage ql, String queryString, String baseURI) throws MalformedQueryException { - ParsedTupleQuery parsedQuery = QueryParserUtil.parseTupleQuery(ql, queryString, baseURI); + Optional sailTupleExpr = sailConnection.prepareQuery(ql, Query.QueryType.TUPLE, queryString, + baseURI); + + ParsedTupleQuery parsedQuery = sailTupleExpr + .map(expr -> new ParsedTupleQuery(queryString, expr)) + .orElse(QueryParserUtil.parseTupleQuery(ql, queryString, baseURI)); return new SailTupleQuery(parsedQuery, this); } @Override public SailGraphQuery prepareGraphQuery(QueryLanguage ql, String queryString, String baseURI) throws MalformedQueryException { - ParsedGraphQuery parsedQuery = QueryParserUtil.parseGraphQuery(ql, queryString, baseURI); + Optional sailTupleExpr = sailConnection.prepareQuery(ql, Query.QueryType.GRAPH, queryString, + baseURI); + ParsedGraphQuery parsedQuery = sailTupleExpr + .map(expr -> new ParsedGraphQuery(queryString, expr)) + .orElse(QueryParserUtil.parseGraphQuery(ql, queryString, baseURI)); return new SailGraphQuery(parsedQuery, this); } @Override public SailBooleanQuery prepareBooleanQuery(QueryLanguage ql, String queryString, String baseURI) throws MalformedQueryException { - ParsedBooleanQuery parsedQuery = QueryParserUtil.parseBooleanQuery(ql, queryString, baseURI); + Optional sailTupleExpr = sailConnection.prepareQuery(ql, Query.QueryType.BOOLEAN, queryString, + baseURI); + ParsedBooleanQuery parsedQuery = sailTupleExpr + .map(expr -> new ParsedBooleanQuery(queryString, expr)) + .orElse(QueryParserUtil.parseBooleanQuery(ql, queryString, baseURI)); return new SailBooleanQuery(parsedQuery, this); } diff --git a/core/repository/sail/src/main/java/org/eclipse/rdf4j/repository/sail/SailTupleQuery.java b/core/repository/sail/src/main/java/org/eclipse/rdf4j/repository/sail/SailTupleQuery.java index b99fe6c736c..4370edd8ecb 100644 --- a/core/repository/sail/src/main/java/org/eclipse/rdf4j/repository/sail/SailTupleQuery.java +++ b/core/repository/sail/src/main/java/org/eclipse/rdf4j/repository/sail/SailTupleQuery.java @@ -41,38 +41,25 @@ public ParsedTupleQuery getParsedQuery() { public TupleQueryResult evaluate() throws QueryEvaluationException { TupleExpr tupleExpr = getParsedQuery().getTupleExpr(); - CloseableIteration bindingsIter1 = null; - CloseableIteration bindingsIter2 = null; - IteratingTupleQueryResult result = null; + CloseableIteration bindingsIter = null; boolean allGood = false; try { SailConnection sailCon = getConnection().getSailConnection(); - bindingsIter1 = sailCon.evaluate(tupleExpr, getActiveDataset(), getBindings(), getIncludeInferred()); - bindingsIter2 = enforceMaxQueryTime(bindingsIter1); + bindingsIter = sailCon.evaluate(tupleExpr, getActiveDataset(), getBindings(), getIncludeInferred()); + bindingsIter = enforceMaxQueryTime(bindingsIter); - result = new IteratingTupleQueryResult(new ArrayList<>(tupleExpr.getBindingNames()), bindingsIter2); + IteratingTupleQueryResult result = new IteratingTupleQueryResult( + new ArrayList<>(tupleExpr.getBindingNames()), bindingsIter); allGood = true; return result; } catch (SailException e) { throw new QueryEvaluationException(e.getMessage(), e); } finally { if (!allGood) { - try { - if (result != null) { - result.close(); - } - } finally { - try { - if (bindingsIter2 != null) { - bindingsIter2.close(); - } - } finally { - if (bindingsIter1 != null) { - bindingsIter1.close(); - } - } + if (bindingsIter != null) { + bindingsIter.close(); } } } @@ -84,4 +71,5 @@ public void evaluate(TupleQueryResultHandler handler) TupleQueryResult queryResult = evaluate(); QueryResults.report(queryResult, handler); } + } diff --git a/core/repository/sail/src/main/java/org/eclipse/rdf4j/repository/sail/config/ProxyRepositoryConfig.java b/core/repository/sail/src/main/java/org/eclipse/rdf4j/repository/sail/config/ProxyRepositoryConfig.java index befa51423f1..834781db671 100644 --- a/core/repository/sail/src/main/java/org/eclipse/rdf4j/repository/sail/config/ProxyRepositoryConfig.java +++ b/core/repository/sail/src/main/java/org/eclipse/rdf4j/repository/sail/config/ProxyRepositoryConfig.java @@ -60,10 +60,10 @@ public void parse(Model model, Resource implNode) throws RepositoryConfigExcepti super.parse(model, implNode); try { - Models.objectLiteral(model.filter(implNode, ProxyRepositorySchema.PROXIED_ID, null)) + Models.objectLiteral(model.getStatements(implNode, ProxyRepositorySchema.PROXIED_ID, null)) .ifPresent(lit -> setProxiedRepositoryID(lit.getLabel())); } catch (ModelException e) { throw new RepositoryConfigException(e.getMessage(), e); } } -} \ No newline at end of file +} diff --git a/core/repository/sail/src/main/java/org/eclipse/rdf4j/repository/sail/config/ProxyRepositoryFactory.java b/core/repository/sail/src/main/java/org/eclipse/rdf4j/repository/sail/config/ProxyRepositoryFactory.java index a7416dbe692..2744857fc2a 100644 --- a/core/repository/sail/src/main/java/org/eclipse/rdf4j/repository/sail/config/ProxyRepositoryFactory.java +++ b/core/repository/sail/src/main/java/org/eclipse/rdf4j/repository/sail/config/ProxyRepositoryFactory.java @@ -17,7 +17,7 @@ public class ProxyRepositoryFactory implements RepositoryFactory { /** * The type of repositories that are created by this factory. - * + * * @see RepositoryFactory#getRepositoryType() */ public static final String REPOSITORY_TYPE = "openrdf:ProxyRepository"; diff --git a/core/repository/sail/src/main/java/org/eclipse/rdf4j/repository/sail/config/ProxyRepositorySchema.java b/core/repository/sail/src/main/java/org/eclipse/rdf4j/repository/sail/config/ProxyRepositorySchema.java index 496bf07a48e..38518fe6adc 100644 --- a/core/repository/sail/src/main/java/org/eclipse/rdf4j/repository/sail/config/ProxyRepositorySchema.java +++ b/core/repository/sail/src/main/java/org/eclipse/rdf4j/repository/sail/config/ProxyRepositorySchema.java @@ -14,7 +14,7 @@ /** * Defines constants for the HTTPRepository schema which is used by {@link ProxyRepositoryFactory}s to initialize * {@link org.eclipse.rdf4j.repository.sail.ProxyRepository}s. - * + * * @author Dale Visser */ public class ProxyRepositorySchema { diff --git a/core/repository/sail/src/main/java/org/eclipse/rdf4j/repository/sail/config/RepositoryResolver.java b/core/repository/sail/src/main/java/org/eclipse/rdf4j/repository/sail/config/RepositoryResolver.java index dbe1c4c03aa..28c8e3b8446 100644 --- a/core/repository/sail/src/main/java/org/eclipse/rdf4j/repository/sail/config/RepositoryResolver.java +++ b/core/repository/sail/src/main/java/org/eclipse/rdf4j/repository/sail/config/RepositoryResolver.java @@ -13,7 +13,7 @@ /** * Gets local repositories using a simple identifier string. - * + * * @author Dale Visser * @deprecated since 2.3 use {@link org.eclipse.rdf4j.repository.RepositoryResolver} */ diff --git a/core/repository/sail/src/main/java/org/eclipse/rdf4j/repository/sail/config/RepositoryResolverClient.java b/core/repository/sail/src/main/java/org/eclipse/rdf4j/repository/sail/config/RepositoryResolverClient.java index 9b7fe5c83d5..1279e475e01 100644 --- a/core/repository/sail/src/main/java/org/eclipse/rdf4j/repository/sail/config/RepositoryResolverClient.java +++ b/core/repository/sail/src/main/java/org/eclipse/rdf4j/repository/sail/config/RepositoryResolverClient.java @@ -9,7 +9,7 @@ /** * Interface used by factory classes that need access to other repositories by their id's. - * + * * @author Dale Visser * @deprecated since 2.3 use {@link org.eclipse.rdf4j.repository.RepositoryResolverClient} */ diff --git a/core/repository/sail/src/main/java/org/eclipse/rdf4j/repository/sail/config/SailRepositoryConfig.java b/core/repository/sail/src/main/java/org/eclipse/rdf4j/repository/sail/config/SailRepositoryConfig.java index f5bc1bbd704..eb78be046f7 100644 --- a/core/repository/sail/src/main/java/org/eclipse/rdf4j/repository/sail/config/SailRepositoryConfig.java +++ b/core/repository/sail/src/main/java/org/eclipse/rdf4j/repository/sail/config/SailRepositoryConfig.java @@ -78,9 +78,9 @@ public Resource export(Model model) { @Override public void parse(Model model, Resource repImplNode) throws RepositoryConfigException { try { - Optional sailImplNode = Models.objectResource(model.filter(repImplNode, SAILIMPL, null)); + Optional sailImplNode = Models.objectResource(model.getStatements(repImplNode, SAILIMPL, null)); if (sailImplNode.isPresent()) { - Models.objectLiteral(model.filter(sailImplNode.get(), SAILTYPE, null)).ifPresent(typeLit -> { + Models.objectLiteral(model.getStatements(sailImplNode.get(), SAILTYPE, null)).ifPresent(typeLit -> { SailFactory factory = SailRegistry.getInstance() .get(typeLit.getLabel()) .orElseThrow(() -> new RepositoryConfigException( diff --git a/core/repository/sail/src/main/java/org/eclipse/rdf4j/repository/sail/config/SailRepositoryFactory.java b/core/repository/sail/src/main/java/org/eclipse/rdf4j/repository/sail/config/SailRepositoryFactory.java index b203e100b40..75985b837d8 100644 --- a/core/repository/sail/src/main/java/org/eclipse/rdf4j/repository/sail/config/SailRepositoryFactory.java +++ b/core/repository/sail/src/main/java/org/eclipse/rdf4j/repository/sail/config/SailRepositoryFactory.java @@ -22,7 +22,7 @@ /** * A {@link RepositoryFactory} that creates {@link SailRepository}s based on RDF configuration data. - * + * * @author Arjohn Kampman */ public class SailRepositoryFactory implements RepositoryFactory { @@ -33,7 +33,7 @@ public class SailRepositoryFactory implements RepositoryFactory { /** * The type of repositories that are created by this factory. - * + * * @see RepositoryFactory#getRepositoryType() */ public static final String REPOSITORY_TYPE = "openrdf:SailRepository"; diff --git a/core/repository/sail/src/main/java/org/eclipse/rdf4j/repository/sail/config/SailRepositorySchema.java b/core/repository/sail/src/main/java/org/eclipse/rdf4j/repository/sail/config/SailRepositorySchema.java index 9797aef9cf4..6bbc2aed309 100644 --- a/core/repository/sail/src/main/java/org/eclipse/rdf4j/repository/sail/config/SailRepositorySchema.java +++ b/core/repository/sail/src/main/java/org/eclipse/rdf4j/repository/sail/config/SailRepositorySchema.java @@ -15,7 +15,7 @@ /** * Defines constants for the SailRepository schema which is used by {@link SailRepositoryFactory}s to initialize * {@link SailRepository}s. - * + * * @author Arjohn Kampman */ public class SailRepositorySchema { diff --git a/core/repository/sail/src/main/java/org/eclipse/rdf4j/repository/sail/helpers/RDFSailInserter.java b/core/repository/sail/src/main/java/org/eclipse/rdf4j/repository/sail/helpers/RDFSailInserter.java index 12f50014795..9006957e624 100644 --- a/core/repository/sail/src/main/java/org/eclipse/rdf4j/repository/sail/helpers/RDFSailInserter.java +++ b/core/repository/sail/src/main/java/org/eclipse/rdf4j/repository/sail/helpers/RDFSailInserter.java @@ -19,7 +19,7 @@ /** * An RDFHandler that adds RDF data to a sail. - * + * * @author jeen */ public class RDFSailInserter extends AbstractRDFInserter { @@ -42,7 +42,7 @@ public class RDFSailInserter extends AbstractRDFInserter { /** * Creates a new RDFInserter object that preserves bnode IDs and that does not enforce any context upon statements * that are reported to it. - * + * * @param con The connection to use for the add operations. */ public RDFSailInserter(SailConnection con, ValueFactory vf, UpdateContext uc) { diff --git a/core/repository/sail/src/main/java/org/eclipse/rdf4j/repository/sail/helpers/RDFSailRemover.java b/core/repository/sail/src/main/java/org/eclipse/rdf4j/repository/sail/helpers/RDFSailRemover.java index 11feb6a4353..1b6901c9048 100644 --- a/core/repository/sail/src/main/java/org/eclipse/rdf4j/repository/sail/helpers/RDFSailRemover.java +++ b/core/repository/sail/src/main/java/org/eclipse/rdf4j/repository/sail/helpers/RDFSailRemover.java @@ -24,7 +24,7 @@ /** * An Sail-specific RDFHandler that removes RDF data from a repository. To be used in combination with SPARQL DELETE * DATA only. - * + * * @author jeen */ class RDFSailRemover extends AbstractRDFHandler { @@ -54,7 +54,7 @@ class RDFSailRemover extends AbstractRDFHandler { /** * Creates a new RDFSailRemover object. - * + * * @param con The connection to use for the remove operations. */ public RDFSailRemover(SailConnection con, ValueFactory vf, UpdateContext uc) { @@ -70,7 +70,7 @@ public RDFSailRemover(SailConnection con, ValueFactory vf, UpdateContext uc) { /** * Enforces the supplied contexts upon all statements that are reported to this RDFSailRemover. - * + * * @param contexts the contexts to use. Use an empty array (not null!) to indicate no context(s) should be enforced. */ public void enforceContext(Resource... contexts) { @@ -80,7 +80,7 @@ public void enforceContext(Resource... contexts) { /** * Checks whether this RDFRemover enforces its contexts upon all statements that are reported to it. - * + * * @return true if it enforces its contexts, false otherwise. */ public boolean enforcesContext() { @@ -90,7 +90,7 @@ public boolean enforcesContext() { /** * Gets the contexts that this RDFRemover enforces upon all statements that are reported to it (in case * enforcesContext() returns true). - * + * * @return A Resource[] identifying the contexts, or null if no contexts is enforced. */ public Resource[] getContexts() { @@ -111,7 +111,8 @@ public void handleStatement(Statement st) throws RDFHandlerException { if (ctxt == null) { final Set removeGraphs = uc.getDataset().getDefaultRemoveGraphs(); if (!removeGraphs.isEmpty()) { - con.removeStatement(uc, subj, pred, obj, new IRI[removeGraphs.size()]); + IRI[] ctxts = removeGraphs.toArray(new IRI[removeGraphs.size()]); + con.removeStatement(uc, subj, pred, obj, ctxts); } else { con.removeStatement(uc, subj, pred, obj); } diff --git a/core/repository/sail/src/main/java/org/eclipse/rdf4j/repository/sail/helpers/SPARQLUpdateDataBlockParser.java b/core/repository/sail/src/main/java/org/eclipse/rdf4j/repository/sail/helpers/SPARQLUpdateDataBlockParser.java index 1d935938a00..4074502fdc0 100644 --- a/core/repository/sail/src/main/java/org/eclipse/rdf4j/repository/sail/helpers/SPARQLUpdateDataBlockParser.java +++ b/core/repository/sail/src/main/java/org/eclipse/rdf4j/repository/sail/helpers/SPARQLUpdateDataBlockParser.java @@ -15,23 +15,24 @@ import org.eclipse.rdf4j.rio.RDFFormat; import org.eclipse.rdf4j.rio.RDFHandlerException; import org.eclipse.rdf4j.rio.RDFParseException; -import org.eclipse.rdf4j.rio.trig.TriGParser; +import org.eclipse.rdf4j.rio.trigstar.TriGStarParser; /** - * An extension of {@link TriGParser} that processes data in the format specified in the SPARQL 1.1 grammar for Quad + * An extension of {@link TriGStarParser} that processes data in the format specified in the SPARQL 1.1 grammar for Quad * data (assuming no variables, as is the case for INSERT DATA and DELETE DATA operations). This format is almost * completely compatible with TriG, except for three differences: *
      *
    • it introduces the 'GRAPH' keyword in front of each named graph identifier *
    • it does not allow the occurrence of blank nodes. *
    • it does not require curly braces around the default graph. + *
    • it adds support for RDF* triples (from TriG*).
    • *
    - * + * * @author Jeen Broekstra * @see SPARQL 1.1 Grammar production for INSERT DATA * @see SPARQL 1.1 Grammar production for DELETE DATA */ -public class SPARQLUpdateDataBlockParser extends TriGParser { +public class SPARQLUpdateDataBlockParser extends TriGStarParser { private boolean allowBlankNodes = true; private int lineNumberOffset; @@ -49,7 +50,7 @@ public SPARQLUpdateDataBlockParser() { /** * Creates a new parser that will use the supplied ValueFactory to create RDF model objects. - * + * * @param valueFactory A ValueFactory. */ public SPARQLUpdateDataBlockParser(ValueFactory valueFactory) { diff --git a/core/repository/sail/src/main/java/org/eclipse/rdf4j/repository/sail/helpers/SailUpdateExecutor.java b/core/repository/sail/src/main/java/org/eclipse/rdf4j/repository/sail/helpers/SailUpdateExecutor.java index 9b1b3d46472..773f2b66196 100644 --- a/core/repository/sail/src/main/java/org/eclipse/rdf4j/repository/sail/helpers/SailUpdateExecutor.java +++ b/core/repository/sail/src/main/java/org/eclipse/rdf4j/repository/sail/helpers/SailUpdateExecutor.java @@ -67,7 +67,7 @@ * Implementation of {@link SailUpdate#execute()} using * {@link SailConnection#evaluate(TupleExpr, Dataset, BindingSet, boolean)} and other {@link SailConnection} methods. * LOAD is handled at the Repository API level because it requires access to the Rio parser. - * + * * @author jeen * @author James Leigh * @see SailConnection#startUpdate(UpdateContext) @@ -93,7 +93,7 @@ public class SailUpdateExecutor { * Implementation of {@link SailUpdate#execute()} using * {@link SailConnection#evaluate(TupleExpr, Dataset, BindingSet, boolean)} and other {@link SailConnection} * methods. - * + * * @param con Used to read data from and write data to. * @param vf Used to create {@link BNode}s * @param loadConfig diff --git a/core/repository/sail/src/test/java/org/eclipse/rdf4j/repository/sail/SailRepositoryConnectionTest.java b/core/repository/sail/src/test/java/org/eclipse/rdf4j/repository/sail/SailRepositoryConnectionTest.java new file mode 100644 index 00000000000..7be5dd4ed35 --- /dev/null +++ b/core/repository/sail/src/test/java/org/eclipse/rdf4j/repository/sail/SailRepositoryConnectionTest.java @@ -0,0 +1,149 @@ +/******************************************************************************* + * Copyright (c) 2020 Eclipse RDF4J contributors. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Distribution License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ +package org.eclipse.rdf4j.repository.sail; + +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyBoolean; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import java.util.Optional; + +import org.eclipse.rdf4j.common.iteration.EmptyIteration; +import org.eclipse.rdf4j.query.BooleanQuery; +import org.eclipse.rdf4j.query.GraphQuery; +import org.eclipse.rdf4j.query.Query; +import org.eclipse.rdf4j.query.TupleQuery; +import org.eclipse.rdf4j.query.algebra.TupleExpr; +import org.eclipse.rdf4j.sail.SailConnection; +import org.junit.Before; +import org.junit.Test; + +/** + * Unit tests for {@link SailRepositoryConnection} + * + * @author Jeen Broekstra + * + */ +public class SailRepositoryConnectionTest { + + private SailRepositoryConnection subject; + private SailConnection sailConnection; + private SailRepository sailRepository; + + @Before + public void setUp() throws Exception { + sailConnection = mock(SailConnection.class); + sailRepository = mock(SailRepository.class); + + subject = new SailRepositoryConnection(sailRepository, sailConnection); + } + + @Test + public void testPrepareQuery_not_bypassed() throws Exception { + Optional response = Optional.empty(); + when(sailConnection.prepareQuery(any(), eq(Query.QueryType.TUPLE), any(), any())).thenReturn(response); + when(sailConnection.evaluate(any(), any(), any(), anyBoolean())).thenReturn(new EmptyIteration<>()); + + TupleQuery query = (TupleQuery) subject.prepareQuery("SELECT * WHERE { ?s ?p ?o }"); + query.evaluate(); + // check that evaluation is still called, and not with an empty TupleExpr + verify(sailConnection).evaluate(any(TupleExpr.class), any(), any(), anyBoolean()); + } + + @Test + public void testPrepareQuery_bypassed() throws Exception { + TupleExpr expr = mock(TupleExpr.class); + Optional response = Optional.of(expr); + when(sailConnection.prepareQuery(any(), eq(Query.QueryType.GRAPH), any(), any())).thenReturn(response); + when(sailConnection.evaluate(eq(expr), any(), any(), anyBoolean())).thenReturn(new EmptyIteration<>()); + + GraphQuery query = (GraphQuery) subject.prepareQuery("CONSTRUCT WHERE { ?s ?p ?o }"); + query.evaluate(); + // check that the TupleExpr implementation created by the underlying sail was passed to the evaluation + verify(sailConnection).evaluate(eq(expr), any(), any(), anyBoolean()); + } + + @Test + public void testPrepareTupleQuery_not_bypassed() throws Exception { + Optional response = Optional.empty(); + when(sailConnection.prepareQuery(any(), eq(Query.QueryType.TUPLE), any(), any())).thenReturn(response); + when(sailConnection.evaluate(any(), any(), any(), anyBoolean())).thenReturn(new EmptyIteration<>()); + + TupleQuery query = subject.prepareTupleQuery("SELECT * WHERE { ?s ?p ?o }"); + query.evaluate(); + // check that evaluation is still called, and not with an empty TupleExpr + verify(sailConnection).evaluate(any(TupleExpr.class), any(), any(), anyBoolean()); + } + + @Test + public void testPrepareTupleQuery_bypassed() throws Exception { + TupleExpr expr = mock(TupleExpr.class); + Optional response = Optional.of(expr); + when(sailConnection.prepareQuery(any(), eq(Query.QueryType.TUPLE), any(), any())).thenReturn(response); + when(sailConnection.evaluate(eq(expr), any(), any(), anyBoolean())).thenReturn(new EmptyIteration<>()); + + TupleQuery query = subject.prepareTupleQuery("SELECT * WHERE { ?s ?p ?o }"); + query.evaluate(); + // check that the TupleExpr implementation created by the underlying sail was passed to the evaluation + verify(sailConnection).evaluate(eq(expr), any(), any(), anyBoolean()); + } + + @Test + public void testPrepareGraphQuery_not_bypassed() throws Exception { + Optional response = Optional.empty(); + when(sailConnection.prepareQuery(any(), eq(Query.QueryType.GRAPH), any(), any())).thenReturn(response); + when(sailConnection.evaluate(any(), any(), any(), anyBoolean())).thenReturn(new EmptyIteration<>()); + + GraphQuery query = subject.prepareGraphQuery("CONSTRUCT WHERE { ?s ?p ?o }"); + query.evaluate(); + // check that evaluation is still called, and not with an empty TupleExpr + verify(sailConnection).evaluate(any(TupleExpr.class), any(), any(), anyBoolean()); + } + + @Test + public void testPrepareGraphQuery_bypassed() throws Exception { + TupleExpr expr = mock(TupleExpr.class); + Optional response = Optional.of(expr); + when(sailConnection.prepareQuery(any(), eq(Query.QueryType.GRAPH), any(), any())).thenReturn(response); + when(sailConnection.evaluate(eq(expr), any(), any(), anyBoolean())).thenReturn(new EmptyIteration<>()); + + GraphQuery query = subject.prepareGraphQuery("CONSTRUCT WHERE { ?s ?p ?o }"); + query.evaluate(); + // check that the TupleExpr implementation created by the underlying sail was passed to the evaluation + verify(sailConnection).evaluate(eq(expr), any(), any(), anyBoolean()); + } + + @Test + public void testPrepareBooleanQuery_not_bypassed() throws Exception { + Optional response = Optional.empty(); + when(sailConnection.prepareQuery(any(), eq(Query.QueryType.BOOLEAN), any(), any())).thenReturn(response); + when(sailConnection.evaluate(any(), any(), any(), anyBoolean())).thenReturn(new EmptyIteration<>()); + + BooleanQuery query = subject.prepareBooleanQuery("ASK WHERE { ?s ?p ?o }"); + query.evaluate(); + // check that evaluation is still called, and not with an empty TupleExpr + verify(sailConnection).evaluate(any(TupleExpr.class), any(), any(), anyBoolean()); + } + + @Test + public void testPrepareBooleanQuery_bypassed() throws Exception { + TupleExpr expr = mock(TupleExpr.class); + Optional response = Optional.of(expr); + when(sailConnection.prepareQuery(any(), eq(Query.QueryType.BOOLEAN), any(), any())).thenReturn(response); + when(sailConnection.evaluate(eq(expr), any(), any(), anyBoolean())).thenReturn(new EmptyIteration<>()); + + BooleanQuery query = subject.prepareBooleanQuery("ASK WHERE { ?s ?p ?o }"); + query.evaluate(); + // check that the TupleExpr implementation created by the underlying sail was passed to the evaluation + verify(sailConnection).evaluate(eq(expr), any(), any(), anyBoolean()); + } + +} diff --git a/core/repository/sail/src/test/java/org/eclipse/rdf4j/repository/sail/config/TestProxyRepositoryFactory.java b/core/repository/sail/src/test/java/org/eclipse/rdf4j/repository/sail/config/TestProxyRepositoryFactory.java index a12516f47ad..48fb2ee1e1d 100644 --- a/core/repository/sail/src/test/java/org/eclipse/rdf4j/repository/sail/config/TestProxyRepositoryFactory.java +++ b/core/repository/sail/src/test/java/org/eclipse/rdf4j/repository/sail/config/TestProxyRepositoryFactory.java @@ -46,7 +46,7 @@ public final void testGetRepository() throws RDF4JException, IOException { Model graph = Rio.parse(this.getClass().getResourceAsStream("/proxy.ttl"), RepositoryConfigSchema.NAMESPACE, RDFFormat.TURTLE); RepositoryConfig config = RepositoryConfig.create(graph, - Models.subject(graph.filter(null, RDF.TYPE, RepositoryConfigSchema.REPOSITORY)) + Models.subject(graph.getStatements(null, RDF.TYPE, RepositoryConfigSchema.REPOSITORY)) .orElseThrow(() -> new RepositoryConfigException("missing Repository instance in config"))); config.validate(); assertThat(config.getID()).isEqualTo("proxy"); diff --git a/core/repository/sail/src/test/java/org/eclipse/rdf4j/repository/sail/helpers/TestSPARQLUpdateDataBlockParser.java b/core/repository/sail/src/test/java/org/eclipse/rdf4j/repository/sail/helpers/TestSPARQLUpdateDataBlockParser.java index 04efc7642be..3024c9b0486 100644 --- a/core/repository/sail/src/test/java/org/eclipse/rdf4j/repository/sail/helpers/TestSPARQLUpdateDataBlockParser.java +++ b/core/repository/sail/src/test/java/org/eclipse/rdf4j/repository/sail/helpers/TestSPARQLUpdateDataBlockParser.java @@ -33,4 +33,17 @@ public void testParseGraph() throws RDFParseException, RDFHandlerException, IOEx } } + @Test + public void testParseRDFStar() throws IOException { + SPARQLUpdateDataBlockParser parser = new SPARQLUpdateDataBlockParser(); + + String[] blocksToCheck = new String[] { + "graph { <<\"test\"@en>>} . 2", + "<< << >>>> << >>", + "@prefix u: .\n<< u:2<< u:4 u:5>>>>u:6<< u:7 u:8>>" + }; + for (String block : blocksToCheck) { + parser.parse(new StringReader(block), "http://base.org"); + } + } } diff --git a/core/repository/sparql/pom.xml b/core/repository/sparql/pom.xml index c3f2f81619d..9913db1c14c 100644 --- a/core/repository/sparql/pom.xml +++ b/core/repository/sparql/pom.xml @@ -4,7 +4,7 @@ org.eclipse.rdf4j rdf4j-repository - 3.1.5-SNAPSHOT + 3.2.2-SNAPSHOT rdf4j-repository-sparql RDF4J: SPARQL Repository diff --git a/core/repository/sparql/src/main/java/org/eclipse/rdf4j/repository/sparql/SPARQLConnection.java b/core/repository/sparql/src/main/java/org/eclipse/rdf4j/repository/sparql/SPARQLConnection.java index 3a44742dc1c..99ecfe84647 100644 --- a/core/repository/sparql/src/main/java/org/eclipse/rdf4j/repository/sparql/SPARQLConnection.java +++ b/core/repository/sparql/src/main/java/org/eclipse/rdf4j/repository/sparql/SPARQLConnection.java @@ -14,8 +14,6 @@ import java.io.InputStream; import java.io.Reader; import java.net.URL; -import java.util.ArrayList; -import java.util.List; import org.apache.http.client.HttpClient; import org.eclipse.rdf4j.OpenRDFUtil; @@ -30,11 +28,13 @@ import org.eclipse.rdf4j.model.BNode; import org.eclipse.rdf4j.model.IRI; import org.eclipse.rdf4j.model.Literal; +import org.eclipse.rdf4j.model.Model; +import org.eclipse.rdf4j.model.ModelFactory; import org.eclipse.rdf4j.model.Namespace; import org.eclipse.rdf4j.model.Resource; import org.eclipse.rdf4j.model.Statement; import org.eclipse.rdf4j.model.Value; -import org.eclipse.rdf4j.model.ValueFactory; +import org.eclipse.rdf4j.model.impl.DynamicModelFactory; import org.eclipse.rdf4j.model.impl.SimpleValueFactory; import org.eclipse.rdf4j.model.util.Literals; import org.eclipse.rdf4j.query.BindingSet; @@ -72,7 +72,7 @@ /** * Provides a {@link RepositoryConnection} interface to any SPARQL endpoint. - * + * * @author James Leigh */ public class SPARQLConnection extends AbstractRepositoryConnection implements HttpClientDependent { @@ -87,12 +87,21 @@ public class SPARQLConnection extends AbstractRepositoryConnection implements Ht private static final String NAMEDGRAPHS = "SELECT DISTINCT ?_ WHERE { GRAPH ?_ { ?s ?p ?o } }"; + private static final int DEFAULT_MAX_PENDING_SIZE = 1000000; + private final SPARQLProtocolSession client; + private ModelFactory modelFactory = new DynamicModelFactory(); + private StringBuilder sparqlTransaction; private Object transactionLock = new Object(); + private Model pendingAdds; + private Model pendingRemoves; + + private int maxPendingSize = DEFAULT_MAX_PENDING_SIZE; + private final boolean quadMode; public SPARQLConnection(SPARQLRepository repository, SPARQLProtocolSession client) { @@ -156,7 +165,7 @@ public RepositoryResult getContextIDs() throws RepositoryException { try { TupleQuery query = prepareTupleQuery(SPARQL, NAMEDGRAPHS, ""); iter = query.evaluate(); - result = new RepositoryResult(new ExceptionConvertingIteration( + result = new RepositoryResult<>(new ExceptionConvertingIteration( new ConvertingIteration(iter) { @Override @@ -172,7 +181,9 @@ protected RepositoryException convert(Exception e) { }); allGood = true; return result; - } catch (MalformedQueryException | QueryEvaluationException e) { + } catch (MalformedQueryException | + + QueryEvaluationException e) { throw new RepositoryException(e); } finally { if (!allGood) { @@ -254,7 +265,7 @@ private RepositoryResult getStatementsQuadMode(Resource subj, IRI pre setBindings(tupleQuery, subj, pred, obj, contexts); tupleQuery.setIncludeInferred(includeInferred); qRes = tupleQuery.evaluate(); - result = new RepositoryResult(new ExceptionConvertingIteration( + result = new RepositoryResult<>(new ExceptionConvertingIteration( toStatementIteration(qRes, subj, pred, obj)) { @Override @@ -302,7 +313,7 @@ private RepositoryResult getStatementGeneral(Resource subj, IRI pred, query.setIncludeInferred(includeInferred); setBindings(query, subj, pred, obj, contexts); gRes = query.evaluate(); - result = new RepositoryResult( + result = new RepositoryResult<>( new ExceptionConvertingIteration(gRes) { @Override @@ -392,6 +403,8 @@ public void commit() throws RepositoryException { synchronized (transactionLock) { if (isActive()) { synchronized (transactionLock) { + flushPendingAdds(); + flushPendingRemoves(); // treat commit as a no-op if transaction string is empty if (sparqlTransaction.length() > 0) { SPARQLUpdate transaction = new SPARQLUpdate(client, null, sparqlTransaction.toString()); @@ -416,6 +429,8 @@ public void rollback() throws RepositoryException { if (isActive()) { synchronized (transactionLock) { sparqlTransaction = null; + pendingAdds = getModelFactory().createEmptyModel(); + pendingRemoves = getModelFactory().createEmptyModel(); } } else { throw new RepositoryException("no transaction active."); @@ -429,6 +444,8 @@ public void begin() throws RepositoryException { if (!isActive()) { synchronized (transactionLock) { sparqlTransaction = new StringBuilder(); + this.pendingAdds = getModelFactory().createEmptyModel(); + this.pendingRemoves = getModelFactory().createEmptyModel(); } } else { throw new RepositoryException("active transaction already exists"); @@ -559,14 +576,7 @@ public void add(Reader reader, String baseURI, RDFFormat dataFormat, Resource... @Override public void add(Statement st, Resource... contexts) throws RepositoryException { boolean localTransaction = startLocalTransaction(); - - List list = new ArrayList<>(1); - list.add(st); - String sparqlCommand = createInsertDataCommand(list, contexts); - - sparqlTransaction.append(sparqlCommand); - sparqlTransaction.append("; "); - + addWithoutCommit(st, contexts); try { conditionalCommit(localTransaction); } catch (RepositoryException e) { @@ -578,12 +588,9 @@ public void add(Statement st, Resource... contexts) throws RepositoryException { @Override public void add(Iterable statements, Resource... contexts) throws RepositoryException { boolean localTransaction = startLocalTransaction(); - - String sparqlCommand = createInsertDataCommand(statements, contexts); - - sparqlTransaction.append(sparqlCommand); - sparqlTransaction.append("; "); - + for (Statement st : statements) { + addWithoutCommit(st, contexts); + } try { conditionalCommit(localTransaction); } catch (RepositoryException e) { @@ -632,14 +639,7 @@ public void clearNamespaces() throws RepositoryException { @Override public void remove(Statement st, Resource... contexts) throws RepositoryException { boolean localTransaction = startLocalTransaction(); - - List list = new ArrayList<>(1); - list.add(st); - String sparqlCommand = createDeleteDataCommand(list, contexts); - - sparqlTransaction.append(sparqlCommand); - sparqlTransaction.append("; "); - + removeWithoutCommit(st, contexts); try { conditionalCommit(localTransaction); } catch (RepositoryException e) { @@ -652,11 +652,9 @@ public void remove(Statement st, Resource... contexts) throws RepositoryExceptio @Override public void remove(Iterable statements, Resource... contexts) throws RepositoryException { boolean localTransaction = startLocalTransaction(); - - String sparqlCommand = createDeleteDataCommand(statements, contexts); - - sparqlTransaction.append(sparqlCommand); - sparqlTransaction.append("; "); + for (Statement st : statements) { + removeWithoutCommit(st, contexts); + } try { conditionalCommit(localTransaction); @@ -827,39 +825,84 @@ public boolean isActive() throws UnknownTransactionStateException, RepositoryExc } } + @Override + protected void addWithoutCommit(Statement st, Resource... contexts) + throws RepositoryException { + flushPendingRemoves(); + if (pendingAdds.size() >= maxPendingSize) { + flushPendingAdds(); + } + if (contexts.length == 0) { + pendingAdds.add(st); + } else { + pendingAdds.add(st.getSubject(), st.getPredicate(), st.getObject(), contexts); + } + } + @Override protected void addWithoutCommit(Resource subject, IRI predicate, Value object, Resource... contexts) throws RepositoryException { - ValueFactory f = getValueFactory(); + flushPendingRemoves(); + if (pendingAdds.size() >= maxPendingSize) { + flushPendingAdds(); + } + pendingAdds.add(subject, predicate, object, contexts); + } - Statement st = f.createStatement(subject, predicate, object); + private void flushPendingRemoves() { + if (!pendingRemoves.isEmpty()) { + for (Resource context : pendingRemoves.contexts()) { + String sparqlCommand = createDeleteDataCommand(pendingRemoves.getStatements(null, null, null, context), + context); + sparqlTransaction.append(sparqlCommand); + sparqlTransaction.append("; "); + } + pendingRemoves = getModelFactory().createEmptyModel(); + } + } - List list = new ArrayList<>(1); - list.add(st); - String sparqlCommand = createInsertDataCommand(list, contexts); + private void flushPendingAdds() { + if (!pendingAdds.isEmpty()) { + for (Resource context : pendingAdds.contexts()) { + String sparqlCommand = createInsertDataCommand(pendingAdds.getStatements(null, null, null, context), + context); + sparqlTransaction.append(sparqlCommand); + sparqlTransaction.append("; "); + } + pendingAdds = getModelFactory().createEmptyModel(); + } + } - sparqlTransaction.append(sparqlCommand); - sparqlTransaction.append("; "); + @Override + protected void removeWithoutCommit(Statement st, Resource... contexts) throws RepositoryException { + flushPendingAdds(); + if (pendingRemoves.size() >= maxPendingSize) { + flushPendingRemoves(); + } + + if (contexts.length == 0) { + pendingRemoves.add(st); + } else { + pendingRemoves.add(st.getSubject(), st.getPredicate(), st.getObject(), contexts); + } } @Override protected void removeWithoutCommit(Resource subject, IRI predicate, Value object, Resource... contexts) throws RepositoryException { - String sparqlCommand = ""; - if (subject != null && predicate != null && object != null) { - ValueFactory f = getValueFactory(); - - Statement st = f.createStatement(subject, predicate, object); + flushPendingAdds(); + if (pendingRemoves.size() >= maxPendingSize) { + flushPendingRemoves(); + } - List list = new ArrayList<>(1); - list.add(st); - sparqlCommand = createDeleteDataCommand(list, contexts); + if (subject != null && predicate != null && object != null) { + pendingRemoves.add(subject, predicate, object, contexts); } else { - sparqlCommand = createDeletePatternCommand(subject, predicate, object, contexts); + flushPendingRemoves(); + String sparqlCommand = createDeletePatternCommand(subject, predicate, object, contexts); + sparqlTransaction.append(sparqlCommand); + sparqlTransaction.append("; "); } - - sparqlTransaction.append(sparqlCommand); - sparqlTransaction.append("; "); } private String createDeletePatternCommand(Resource subject, IRI predicate, Value object, Resource[] contexts) { @@ -936,7 +979,7 @@ private void createBGP(StringBuilder qb, Resource subject, IRI predicate, Value /** * Shall graph information also be retrieved, e.g. for * {@link #getStatements(Resource, IRI, Value, boolean, Resource...)} - * + * * @return true if in quad mode */ protected boolean isQuadMode() { @@ -946,7 +989,7 @@ protected boolean isQuadMode() { /** * Converts a {@link TupleQueryResult} resulting from the {@link #EVERYTHING_WITH_GRAPH} to a statement by using the * respective values from the {@link BindingSet} or (if provided) the ones from the arguments. - * + * * @param iter the {@link TupleQueryResult} * @param subj the subject {@link Resource} used as input or null if wildcard was used * @param pred the predicate {@link IRI} used as input or null if wildcard was used @@ -972,4 +1015,8 @@ protected Statement convert(BindingSet b) throws QueryEvaluationException { }; } + private ModelFactory getModelFactory() { + return modelFactory; + } + } diff --git a/core/repository/sparql/src/main/java/org/eclipse/rdf4j/repository/sparql/SPARQLRepository.java b/core/repository/sparql/src/main/java/org/eclipse/rdf4j/repository/sparql/SPARQLRepository.java index 29a001e2d1d..7361279bfe1 100644 --- a/core/repository/sparql/src/main/java/org/eclipse/rdf4j/repository/sparql/SPARQLRepository.java +++ b/core/repository/sparql/src/main/java/org/eclipse/rdf4j/repository/sparql/SPARQLRepository.java @@ -26,14 +26,14 @@ /** * A proxy class to access any SPARQL endpoint. The instance must be initialized prior to using it. - * + * * @author James Leigh */ public class SPARQLRepository extends AbstractRepository implements HttpClientDependent, SessionManagerDependent { /** * Flag indicating if quad mode is enabled in newly created {@link SPARQLConnection}s. - * + * * @see #enableQuadMode(boolean) */ private boolean quadMode = false; @@ -58,7 +58,7 @@ public class SPARQLRepository extends AbstractRepository implements HttpClientDe /** * Create a new SPARQLRepository using the supplied endpoint URL for queries and updates. - * + * * @param endpointUrl a SPARQL endpoint URL. May not be null. */ public SPARQLRepository(String endpointUrl) { @@ -68,7 +68,7 @@ public SPARQLRepository(String endpointUrl) { /** * Create a new SPARQLRepository using the supplied query endpoint URL for queries, and the supplied update endpoint * URL for updates. - * + * * @param queryEndpointUrl a SPARQL endpoint URL for queries. May not be null. * @param updateEndpointUrl a SPARQL endpoint URL for updates. May not be null. * @throws IllegalArgumentException if one of the supplied endpoint URLs is null. @@ -130,7 +130,7 @@ public void setHttpClient(HttpClient httpClient) { /** * Creates a new HTTPClient object. Subclasses may override to return a more specific HTTPClient subtype. - * + * * @return a HTTPClient object. */ protected SPARQLProtocolSession createHTTPClient() { @@ -181,7 +181,7 @@ public void setDataDir(File dataDir) { /** * Set the username and password to use for authenticating with the remote repository. - * + * * @param username the username. Setting this to null will disable authentication. * @param password the password. Setting this to null will disable authentication. */ @@ -212,7 +212,7 @@ public String toString() { /** * Get the additional HTTP headers which will be used - * + * * @return a read-only view of the additional HTTP headers which will be included in every request to the server. */ public Map getAdditionalHttpHeaders() { @@ -223,7 +223,7 @@ public Map getAdditionalHttpHeaders() { * Set additional HTTP headers to be included in every request to the server, which may be required for certain * unusual server configurations. This will only take effect on connections subsequently returned by * {@link #getConnection()}. - * + * * @param additionalHttpHeaders a map containing pairs of header names and values. May be null */ public void setAdditionalHttpHeaders(Map additionalHttpHeaders) { @@ -239,7 +239,7 @@ public void setAdditionalHttpHeaders(Map additionalHttpHeaders) *

    * Note: the setting is only applied in newly created {@link SPARQLConnection}s as the setting is an immutable * configuration of a connection instance. - * + * * @param flag flag to enable or disable the quad mode * @see SPARQLConnection#getStatements(org.eclipse.rdf4j.model.Resource, org.eclipse.rdf4j.model.URI, * org.eclipse.rdf4j.model.Value, boolean, org.eclipse.rdf4j.model.Resource...) diff --git a/core/repository/sparql/src/main/java/org/eclipse/rdf4j/repository/sparql/config/SPARQLRepositoryConfig.java b/core/repository/sparql/src/main/java/org/eclipse/rdf4j/repository/sparql/config/SPARQLRepositoryConfig.java index 6321160ab1e..d482252f0d9 100644 --- a/core/repository/sparql/src/main/java/org/eclipse/rdf4j/repository/sparql/config/SPARQLRepositoryConfig.java +++ b/core/repository/sparql/src/main/java/org/eclipse/rdf4j/repository/sparql/config/SPARQLRepositoryConfig.java @@ -19,7 +19,7 @@ /** * Configuration for a SPARQL endpoint. - * + * * @author James Leigh */ public class SPARQLRepositoryConfig extends AbstractRepositoryImplConfig { @@ -96,9 +96,9 @@ public void parse(Model m, Resource implNode) throws RepositoryConfigException { super.parse(m, implNode); try { - Models.objectIRI(m.filter(implNode, QUERY_ENDPOINT, null)) + Models.objectIRI(m.getStatements(implNode, QUERY_ENDPOINT, null)) .ifPresent(iri -> setQueryEndpointUrl(iri.stringValue())); - Models.objectIRI(m.filter(implNode, UPDATE_ENDPOINT, null)) + Models.objectIRI(m.getStatements(implNode, UPDATE_ENDPOINT, null)) .ifPresent(iri -> setUpdateEndpointUrl(iri.stringValue())); } catch (ModelException e) { throw new RepositoryConfigException(e.getMessage(), e); diff --git a/core/repository/sparql/src/main/java/org/eclipse/rdf4j/repository/sparql/config/SPARQLRepositoryFactory.java b/core/repository/sparql/src/main/java/org/eclipse/rdf4j/repository/sparql/config/SPARQLRepositoryFactory.java index 23ced659413..dffd6768261 100644 --- a/core/repository/sparql/src/main/java/org/eclipse/rdf4j/repository/sparql/config/SPARQLRepositoryFactory.java +++ b/core/repository/sparql/src/main/java/org/eclipse/rdf4j/repository/sparql/config/SPARQLRepositoryFactory.java @@ -14,7 +14,7 @@ /** * Creates {@link SPARQLRepository} from a configuration. - * + * * @author James Leigh */ public class SPARQLRepositoryFactory implements RepositoryFactory { diff --git a/core/repository/sparql/src/main/java/org/eclipse/rdf4j/repository/sparql/federation/CollectionIteration.java b/core/repository/sparql/src/main/java/org/eclipse/rdf4j/repository/sparql/federation/CollectionIteration.java index 1fb722af623..b2899fbfbfb 100644 --- a/core/repository/sparql/src/main/java/org/eclipse/rdf4j/repository/sparql/federation/CollectionIteration.java +++ b/core/repository/sparql/src/main/java/org/eclipse/rdf4j/repository/sparql/federation/CollectionIteration.java @@ -15,7 +15,7 @@ /** * An iteration to access a materialized {@link Collection} of BindingSets. - * + * * @author Andreas Schwarte */ public class CollectionIteration extends AbstractCloseableIteration { diff --git a/core/repository/sparql/src/main/java/org/eclipse/rdf4j/repository/sparql/federation/JoinExecutorBase.java b/core/repository/sparql/src/main/java/org/eclipse/rdf4j/repository/sparql/federation/JoinExecutorBase.java index aa4bb244b03..1714c2c7c0f 100644 --- a/core/repository/sparql/src/main/java/org/eclipse/rdf4j/repository/sparql/federation/JoinExecutorBase.java +++ b/core/repository/sparql/src/main/java/org/eclipse/rdf4j/repository/sparql/federation/JoinExecutorBase.java @@ -20,7 +20,7 @@ * Base class for any join parallel join executor. Note that this class extends {@link LookAheadIteration} and thus any * implementation of this class is applicable for pipelining when used in a different thread (access to shared variables * is synchronized). - * + * * @author Andreas Schwarte */ public abstract class JoinExecutorBase extends LookAheadIteration { @@ -154,7 +154,7 @@ public void handleClose() throws QueryEvaluationException { /** * Gets whether this executor is finished or aborted. - * + * * @return true if this executor is finished or aborted */ public boolean isFinished() { diff --git a/core/repository/sparql/src/main/java/org/eclipse/rdf4j/repository/sparql/federation/RepositoryFederatedService.java b/core/repository/sparql/src/main/java/org/eclipse/rdf4j/repository/sparql/federation/RepositoryFederatedService.java index 17b09dd1e07..0da8bb1b089 100644 --- a/core/repository/sparql/src/main/java/org/eclipse/rdf4j/repository/sparql/federation/RepositoryFederatedService.java +++ b/core/repository/sparql/src/main/java/org/eclipse/rdf4j/repository/sparql/federation/RepositoryFederatedService.java @@ -39,7 +39,7 @@ /** * Federated Service wrapping the {@link Repository} to communicate with a SPARQL endpoint. - * + * * @author Andreas Schwarte */ public class RepositoryFederatedService implements FederatedService { @@ -51,7 +51,7 @@ public class RepositoryFederatedService implements FederatedService { /** * A convenience iteration for SERVICE expression which evaluates intermediate results in batches and manages all * results. Uses {@link JoinExecutorBase} facilities to guarantee correct access to the final results - * + * * @author as */ private class BatchingServiceIteration extends JoinExecutorBase { @@ -93,7 +93,7 @@ protected void handleBindings() throws Exception { /** * Helper iteration to evaluate a block of {@link BindingSet}s using the simple * {@link RepositoryFederatedService#select(Service, Set, BindingSet, String)} routine. - * + * * @author Andreas Schwarte * */ @@ -123,7 +123,7 @@ protected void handleBindings() throws Exception { /** * Wrapper iteration which closes a {@link RepositoryConnection} upon {@link #close()} - * + * * @author Andreas Schwarte * */ @@ -234,7 +234,7 @@ public CloseableIteration select(Service s } if (service.isSilent()) { - return new SilentIteration(result); + return new SilentIteration<>(result); } else { return result; } @@ -363,7 +363,7 @@ protected CloseableIteration evaluateInter TupleQuery query = conn.prepareTupleQuery(QueryLanguage.SPARQL, queryString, baseUri); TupleQueryResult res = null; query.setMaxExecutionTime(60); // TODO how to retrieve max query value - // from actual setting? + // from actual setting? res = query.evaluate(); if (relevantBindingNames.isEmpty()) { @@ -371,7 +371,7 @@ protected CloseableIteration evaluateInter // product } else { result = new ServiceJoinConversionIteration(res, allBindings); // common - // join + // join } if (useFreshConnection) { @@ -426,7 +426,7 @@ protected CloseableIteration evaluateInter /** * Evaluate the service expression for the given lists of bindings using {@link FallbackServiceIteration}, i.e. * basically as a simple join without VALUES clause. - * + * * @param service the SERVICE * @param allBindings all bindings to be processed * @param baseUri the base URI @@ -448,7 +448,7 @@ private CloseableIteration evaluateInterna /** * Insert the constructed VALUES clause in the beginning of the WHERE block. Also adds the {@link #ROW_IDX_VAR} * projection if it is not already present. - * + * * @param queryString the SELECT query string from the SERVICE node * @param valuesClause the constructed VALUES clause * @return the final String @@ -487,7 +487,7 @@ public int getBoundJoinBlockSize() { } /** - * + * * @param boundJoinBlockSize the bound join block size, 0 to evaluate all in a single request */ public void setBoundJoinBlockSize(int boundJoinBlockSize) { @@ -495,7 +495,7 @@ public void setBoundJoinBlockSize(int boundJoinBlockSize) { } /** - * + * * @param flag whether to use a fresh {@link RepositoryConnection} for each individual query */ public void setUseFreshConnection(boolean flag) { @@ -530,7 +530,7 @@ public void shutdown() throws QueryEvaluationException { /** * Return a fresh {@link RepositoryConnection} from the configured repository. - * + * * @return connection * @throws RepositoryException */ @@ -541,7 +541,7 @@ private RepositoryConnection freshConnection() throws RepositoryException { /** * Retrieve a (re-usable) connection. If it is not yet created, open a fresh connection. Note that this connection * is closed automatically when shutting this service. - * + * * @return connection * @throws RepositoryException */ @@ -558,7 +558,7 @@ protected synchronized RepositoryConnection getConnection() throws RepositoryExc * bound by an input binding. *

    * If the resulting list is empty, the cross product needs to be formed. - * + * * @param bindings * @param serviceVars * @return the list of relevant bindings (if empty: the cross product needs to be formed) @@ -582,7 +582,7 @@ private List getRelevantBindingNames(List bindings, Set bindings, List relevan for (BindingSet b : bindings) { sb.append(" ("); sb.append("\"").append(rowIdx++).append("\" "); // identification of - // the row for post - // processing + // the row for post + // processing for (String bName : relevantBindingNames) { QueryStringUtil.appendValueAsString(sb, b.getValue(bName)).append(" "); } diff --git a/core/repository/sparql/src/main/java/org/eclipse/rdf4j/repository/sparql/federation/SPARQLCrossProductIteration.java b/core/repository/sparql/src/main/java/org/eclipse/rdf4j/repository/sparql/federation/SPARQLCrossProductIteration.java index 6feb89c68eb..2d6e89ea4f2 100644 --- a/core/repository/sparql/src/main/java/org/eclipse/rdf4j/repository/sparql/federation/SPARQLCrossProductIteration.java +++ b/core/repository/sparql/src/main/java/org/eclipse/rdf4j/repository/sparql/federation/SPARQLCrossProductIteration.java @@ -23,7 +23,7 @@ * Note that this class is a fully equivalent copy of * {@link org.eclipse.rdf4j.query.algebra.evaluation.iterator.CrossProductIteration}, and is only included here to avoid * a circular dependency between the algebra-evaluation module and the sparql-repository module. - * + * * @author Andreas Schwarte */ public class SPARQLCrossProductIteration extends LookAheadIteration { @@ -48,10 +48,11 @@ protected BindingSet getNextElement() throws QueryEvaluationException { if (currentInputBinding == null) { inputBindingsIterator = inputBindings.iterator(); - if (resultIteration.hasNext()) + if (resultIteration.hasNext()) { currentInputBinding = resultIteration.next(); - else + } else { return null; // no more results + } } if (inputBindingsIterator.hasNext()) { @@ -59,8 +60,9 @@ protected BindingSet getNextElement() throws QueryEvaluationException { SPARQLQueryBindingSet res = new SPARQLQueryBindingSet(next.size() + currentInputBinding.size()); res.addAll(next); res.addAll(currentInputBinding); - if (!inputBindingsIterator.hasNext()) + if (!inputBindingsIterator.hasNext()) { currentInputBinding = null; + } return res; } diff --git a/core/repository/sparql/src/main/java/org/eclipse/rdf4j/repository/sparql/federation/SPARQLFederatedService.java b/core/repository/sparql/src/main/java/org/eclipse/rdf4j/repository/sparql/federation/SPARQLFederatedService.java index 40054f17005..9f4e5aee0ad 100644 --- a/core/repository/sparql/src/main/java/org/eclipse/rdf4j/repository/sparql/federation/SPARQLFederatedService.java +++ b/core/repository/sparql/src/main/java/org/eclipse/rdf4j/repository/sparql/federation/SPARQLFederatedService.java @@ -12,7 +12,7 @@ /** * Federated Service wrapping the {@link SPARQLRepository} to communicate with a SPARQL endpoint. - * + * * @author Andreas Schwarte */ public class SPARQLFederatedService extends RepositoryFederatedService { diff --git a/core/repository/sparql/src/main/java/org/eclipse/rdf4j/repository/sparql/federation/SPARQLServiceResolver.java b/core/repository/sparql/src/main/java/org/eclipse/rdf4j/repository/sparql/federation/SPARQLServiceResolver.java index c0b746bd9a8..3c3039cb6a0 100644 --- a/core/repository/sparql/src/main/java/org/eclipse/rdf4j/repository/sparql/federation/SPARQLServiceResolver.java +++ b/core/repository/sparql/src/main/java/org/eclipse/rdf4j/repository/sparql/federation/SPARQLServiceResolver.java @@ -23,7 +23,7 @@ *

    * This method must only be called after verifying that {@link #isRecognizedDatatype(IRI)} returns true for the * given datatype URI. - * + * * @param literalValue Literal value matching the given datatype URI. * @param datatypeUri A datatype URI that matched with {@link #isRecognizedDatatype(IRI)} * @return True if the datatype URI is recognized by this datatype handler, and it is verified to be syntactically @@ -81,7 +81,7 @@ public interface DatatypeHandler { * This method must only be called after verifying that {@link #isRecognizedDatatype(IRI)} returns true for the * given datatype URI, and {@link #verifyDatatype(String, IRI)} also returns true for the given datatype URI and * literal value. - * + * * @param literalValue Required literal value to use in the normalization process and to provide the value for the * resulting literal. * @param datatypeUri The datatype URI which is to be normalized. This URI is available in normalized form from the @@ -96,7 +96,7 @@ public Literal normalizeDatatype(String literalValue, IRI datatypeUri, ValueFact /** * A unique key for this datatype handler to identify it in the DatatypeHandlerRegistry. - * + * * @return A unique string key. */ public String getKey(); diff --git a/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/DatatypeHandlerRegistry.java b/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/DatatypeHandlerRegistry.java index 97a691c37da..bf3bf14f2cc 100644 --- a/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/DatatypeHandlerRegistry.java +++ b/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/DatatypeHandlerRegistry.java @@ -11,7 +11,7 @@ /** * Registry of {@link DatatypeHandler}s. - * + * * @author Peter Ansell */ public class DatatypeHandlerRegistry extends ServiceRegistry { @@ -26,7 +26,7 @@ private static class DatatypeHandlerRegistryHolder { /** * Gets the default DatatypeHandlerRegistry. - * + * * @return The default registry. */ public static DatatypeHandlerRegistry getInstance() { diff --git a/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/LanguageHandler.java b/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/LanguageHandler.java index a90a80abfcc..fea384580d1 100644 --- a/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/LanguageHandler.java +++ b/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/LanguageHandler.java @@ -17,7 +17,7 @@ * The language handler may optionally provide normalization and verification services for string literals based on the * language tags, including translation, grammar and spelling checks. However, this behavior is entirely driven by the * user. - * + * * @author Peter Ansell */ public interface LanguageHandler { @@ -41,7 +41,7 @@ public interface LanguageHandler { /** * Checks if the given language tag is recognized by this language handler, including cases where the language tag * is recognized, but is not yet normalized. - * + * * @param languageTag The language tag to check. * @return True if the language tag is syntactically valid and could be used with * {@link #verifyLanguage(String, String)} and {@link #normalizeLanguage(String, String, ValueFactory)}. @@ -53,7 +53,7 @@ public interface LanguageHandler { *

    * This method must only be called after verifying that {@link #isRecognizedLanguage(String)} returns true for the * given language tag. - * + * * @param literalValue Literal value matching the given language tag. * @param languageTag A language tag that matched with {@link #isRecognizedLanguage(String)}. * @return True if the language tag is recognized by this language handler, and it is verified to be syntactically @@ -69,7 +69,7 @@ public interface LanguageHandler { * This method must only be called after verifying that {@link #isRecognizedLanguage(String)} returns true for the * given language tag, and {@link #verifyLanguage(String, String)} also returns true for the given language and * literal value. - * + * * @param literalValue Required literal value to use in the normalization process and to provide the value for the * resulting literal. * @param languageTag The language tag which is to be normalized. This tag is available in normalized form from the @@ -84,7 +84,7 @@ public Literal normalizeLanguage(String literalValue, String languageTag, ValueF /** * A unique key for this language handler to identify it in the LanguageHandlerRegistry. - * + * * @return A unique string key. */ public String getKey(); diff --git a/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/LanguageHandlerRegistry.java b/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/LanguageHandlerRegistry.java index bba55743b66..c705d0266f3 100644 --- a/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/LanguageHandlerRegistry.java +++ b/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/LanguageHandlerRegistry.java @@ -11,7 +11,7 @@ /** * Registry of {@link LanguageHandler}s. - * + * * @author Peter Ansell */ public class LanguageHandlerRegistry extends ServiceRegistry { @@ -26,7 +26,7 @@ private static class LanguageHandlerRegistryHolder { /** * Gets the default LanguageHandlerRegistry. - * + * * @return The default registry. */ public static LanguageHandlerRegistry getInstance() { diff --git a/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/ParserConfig.java b/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/ParserConfig.java index a12f798d399..1ce2267e7ef 100644 --- a/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/ParserConfig.java +++ b/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/ParserConfig.java @@ -19,7 +19,7 @@ /** * A container object for easy setting and passing of {@link RDFParser} configuration options. - * + * * @author Jeen Broekstra * @author Peter Ansell */ @@ -40,7 +40,7 @@ public ParserConfig() { /** * Creates a ParserConfig object with the supplied config settings. - * + * * @deprecated Use {@link ParserConfig#ParserConfig()} instead and set preserveBNodeIDs using * {@link #set(RioSetting, Object)} with {@link BasicParserSettings#PRESERVE_BNODE_IDS}. *

    @@ -91,7 +91,7 @@ public ParserConfig(boolean verifyData, boolean stopAtFirstError, boolean preser * deprecated constructor. *

    * Non-Fatal errors that are detected MUST be reported to the error listener. - * + * * @param nonFatalErrors The set of parser errors that are relevant to * @return Either a copy of this config, if it is immutable, or this object, to allow chaining of method calls. */ @@ -103,7 +103,7 @@ public ParserConfig setNonFatalErrors(Set> nonFatalErrors) { /** * Add a non-fatal error to the set used by parsers to determine whether they should attempt to recover from a * particular parsing error. - * + * * @param nextNonFatalError A non-fatal error that a parser should attempt to recover from. * @return Either a copy of this config, if it is immutable, or this object, to allow chaining of method calls. */ @@ -125,7 +125,7 @@ public ParserConfig addNonFatalError(RioSetting nextNonFatalError) { * set of errors that are non-fatal in the given context. *

    * Non-Fatal errors that are detected MUST be reported to the error listener. - * + * * @param errorToCheck * @return True if the user has setup the parser configuration to indicate that this error is not necessarily fatal * and false if the user has not indicated that this error is fatal. @@ -136,7 +136,7 @@ public boolean isNonFatalError(RioSetting errorToCheck) { /** * Get the current set of non-fatal errors. - * + * * @return An unmodifiable set containing the current non-fatal errors. */ public Set> getNonFatalErrors() { @@ -165,7 +165,7 @@ public boolean stopAtFirstError() { * This method is preserved for backwards compatibility. *

    * Code should be gradually migrated to use {@link BasicParserSettings#PRESERVE_BNODE_IDS}. - * + * * @return Returns the {@link BasicParserSettings#PRESERVE_BNODE_IDS} setting. */ public boolean isPreserveBNodeIDs() { diff --git a/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/RDFFormat.java b/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/RDFFormat.java index 2426570c381..b83e100ea61 100644 --- a/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/RDFFormat.java +++ b/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/RDFFormat.java @@ -24,7 +24,7 @@ * and can have one or more associated MIME types, zero or more associated file extensions and can specify a (default) * character encoding. Some formats are able to encode context information while other are not; this is indicated by the * value of {@link #supportsContexts}. - * + * * @author Arjohn Kampman */ public class RDFFormat extends FileFormat { @@ -55,6 +55,16 @@ public class RDFFormat extends FileFormat { */ public static final boolean NO_CONTEXTS = false; + /** + * Indicates that RDF* triples can be serialized natively for this format. + */ + public static final boolean SUPPORTS_RDF_STAR = true; + + /** + * Indicates that RDF* triples will NOT be serialized natively for this format. + */ + public static final boolean NO_RDF_STAR = false; + /** * The RDF/XML file format. *

    @@ -70,7 +80,7 @@ public class RDFFormat extends FileFormat { Arrays.asList("application/rdf+xml", "application/xml", "text/xml"), StandardCharsets.UTF_8, Arrays.asList("rdf", "rdfs", "owl", "xml"), SimpleValueFactory.getInstance().createIRI("http://www.w3.org/ns/formats/RDF_XML"), SUPPORTS_NAMESPACES, - NO_CONTEXTS); + NO_CONTEXTS, NO_RDF_STAR); /** * The N-Triples file format. @@ -84,7 +94,7 @@ public class RDFFormat extends FileFormat { public static final RDFFormat NTRIPLES = new RDFFormat("N-Triples", Arrays.asList("application/n-triples", "text/plain"), StandardCharsets.UTF_8, Arrays.asList("nt"), SimpleValueFactory.getInstance().createIRI("http://www.w3.org/ns/formats/N-Triples"), NO_NAMESPACES, - NO_CONTEXTS); + NO_CONTEXTS, NO_RDF_STAR); /** * The Turtle file format. @@ -98,7 +108,21 @@ public class RDFFormat extends FileFormat { public static final RDFFormat TURTLE = new RDFFormat("Turtle", Arrays.asList("text/turtle", "application/x-turtle"), StandardCharsets.UTF_8, Arrays.asList("ttl"), SimpleValueFactory.getInstance().createIRI("http://www.w3.org/ns/formats/Turtle"), SUPPORTS_NAMESPACES, - NO_CONTEXTS); + NO_CONTEXTS, NO_RDF_STAR); + + /** + * The Turtle* (TurtleStar) file format, a Turtle-based RDF serialization format that supports RDF* triples. + *

    + * The file extension .ttls is recommended for Turtle* documents. The media type is + * application/x-turtlestar and the encoding is UTF-8. + *

    + * + * @see Foundations of an Alternative Approach to Reification in + * RDF + */ + public static final RDFFormat TURTLESTAR = new RDFFormat("Turtle*", + Arrays.asList("text/x-turtlestar", "application/x-turtlestar"), StandardCharsets.UTF_8, + Arrays.asList("ttls"), SUPPORTS_NAMESPACES, NO_CONTEXTS, SUPPORTS_RDF_STAR); /** * The N3/Notation3 file format. @@ -112,7 +136,7 @@ public class RDFFormat extends FileFormat { public static final RDFFormat N3 = new RDFFormat("N3", Arrays.asList("text/n3", "text/rdf+n3"), StandardCharsets.UTF_8, Arrays.asList("n3"), SimpleValueFactory.getInstance().createIRI("http://www.w3.org/ns/formats/N3"), SUPPORTS_NAMESPACES, - NO_CONTEXTS); + NO_CONTEXTS, NO_RDF_STAR); /** * The TriX file format, an XML-based RDF serialization format that @@ -125,7 +149,8 @@ public class RDFFormat extends FileFormat { * @see TriX: RDF Triples in XML */ public static final RDFFormat TRIX = new RDFFormat("TriX", Arrays.asList("application/trix"), - StandardCharsets.UTF_8, Arrays.asList("xml", "trix"), null, SUPPORTS_NAMESPACES, SUPPORTS_CONTEXTS); + StandardCharsets.UTF_8, Arrays.asList("xml", "trix"), null, SUPPORTS_NAMESPACES, SUPPORTS_CONTEXTS, + NO_RDF_STAR); /** * The TriG file format, a Turtle-based RDF serialization format that @@ -140,7 +165,21 @@ public class RDFFormat extends FileFormat { public static final RDFFormat TRIG = new RDFFormat("TriG", Arrays.asList("application/trig", "application/x-trig"), StandardCharsets.UTF_8, Arrays.asList("trig"), SimpleValueFactory.getInstance().createIRI("http://www.w3.org/ns/formats/TriG"), SUPPORTS_NAMESPACES, - SUPPORTS_CONTEXTS); + SUPPORTS_CONTEXTS, NO_RDF_STAR); + + /** + * The TriG* (TriGStar) file format, a TriG-based RDF serialization format that supports RDF* triples. This builds + * upon the idea for the Turtle* format but adds support for named graphs. + *

    + * The file extension .trigs is recommended for TriG* documents. The media type is + * application/x-trigstar and the encoding is UTF-8. + *

    + * + * @see Foundations of an Alternative Approach to Reification in + * RDF + */ + public static final RDFFormat TRIGSTAR = new RDFFormat("TriG*", "application/x-trigstar", + StandardCharsets.UTF_8, "trigs", SUPPORTS_NAMESPACES, SUPPORTS_CONTEXTS, SUPPORTS_RDF_STAR); /** * A binary RDF format. @@ -148,11 +187,11 @@ public class RDFFormat extends FileFormat { * The file extension .brf is recommend for binary RDF documents. The media type is * application/x-binary-rdf. *

    - * + * * @see Binary RDF in Sesame */ public static final RDFFormat BINARY = new RDFFormat("BinaryRDF", Arrays.asList("application/x-binary-rdf"), null, - Arrays.asList("brf"), null, SUPPORTS_NAMESPACES, SUPPORTS_CONTEXTS); + Arrays.asList("brf"), null, SUPPORTS_NAMESPACES, SUPPORTS_CONTEXTS, SUPPORTS_RDF_STAR); /** * The N-Quads file format, an RDF serialization format that supports @@ -167,7 +206,7 @@ public class RDFFormat extends FileFormat { public static final RDFFormat NQUADS = new RDFFormat("N-Quads", Arrays.asList("application/n-quads", "text/x-nquads", "text/nquads"), StandardCharsets.UTF_8, Arrays.asList("nq"), SimpleValueFactory.getInstance().createIRI("http://www.w3.org/ns/formats/N-Quads"), - NO_NAMESPACES, SUPPORTS_CONTEXTS); + NO_NAMESPACES, SUPPORTS_CONTEXTS, NO_RDF_STAR); /** * The JSON-LD file format, an RDF serialization format that supports @@ -182,7 +221,7 @@ public class RDFFormat extends FileFormat { public static final RDFFormat JSONLD = new RDFFormat("JSON-LD", Arrays.asList("application/ld+json"), StandardCharsets.UTF_8, Arrays.asList("jsonld"), SimpleValueFactory.getInstance().createIRI("http://www.w3.org/ns/formats/JSON-LD"), SUPPORTS_NAMESPACES, - SUPPORTS_CONTEXTS); + SUPPORTS_CONTEXTS, NO_RDF_STAR); /** * The RDF/JSON file format, an RDF serialization format that supports @@ -197,7 +236,7 @@ public class RDFFormat extends FileFormat { public static final RDFFormat RDFJSON = new RDFFormat("RDF/JSON", Arrays.asList("application/rdf+json"), StandardCharsets.UTF_8, Arrays.asList("rj"), SimpleValueFactory.getInstance().createIRI("http://www.w3.org/ns/formats/RDF_JSON"), NO_NAMESPACES, - SUPPORTS_CONTEXTS); + SUPPORTS_CONTEXTS, NO_RDF_STAR); /** * The RDFa file format, an RDF serialization format. @@ -212,7 +251,19 @@ public class RDFFormat extends FileFormat { Arrays.asList("application/xhtml+xml", "application/html", "text/html"), StandardCharsets.UTF_8, Arrays.asList("xhtml", "html"), SimpleValueFactory.getInstance().createIRI("http://www.w3.org/ns/formats/RDFa"), SUPPORTS_NAMESPACES, - NO_CONTEXTS); + NO_CONTEXTS, NO_RDF_STAR); + + /** + * The HDT file format, an RDF serialization format. + *

    + * The file extension .hdt is recommended for HDT documents. + *

    + * + * @see HDT v1.0 + */ + public static final RDFFormat HDT = new RDFFormat("HDT", + Arrays.asList("application/vnd.hdt"), null, Arrays.asList("hdt"), null, + SUPPORTS_NAMESPACES, NO_CONTEXTS, NO_RDF_STAR); /*----------------* * Static methods * @@ -221,7 +272,7 @@ public class RDFFormat extends FileFormat { /** * Processes the supplied collection of {@link RDFFormat}s and assigns quality values to each based on whether * context must be supported and whether the format is preferred. - * + * * @param rdfFormats The {@link RDFFormat}s to process. * @param requireContext True to decrease the quality value for formats where {@link RDFFormat#supportsContexts()} * returns false. @@ -290,9 +341,14 @@ public static List getAcceptParams(Iterable rdfFormats, boole */ private final boolean supportsContexts; + /** + * Flag indicating whether the RDFFormat can encode RDF* triples natively. + */ + private final boolean supportsRDFStar; + /** * A standard URI published by the W3C or another standards body to uniquely denote this format. - * + * * @see Unique URIs for File Formats */ private IRI standardURI; @@ -303,7 +359,7 @@ public static List getAcceptParams(Iterable rdfFormats, boole /** * Creates a new RDFFormat object. - * + * * @param name The name of the RDF file format, e.g. "RDF/XML". * @param mimeType The MIME type of the RDF file format, e.g. application/rdf+xml for the RDF/XML * file format. @@ -315,16 +371,40 @@ public static List getAcceptParams(Iterable rdfFormats, boole * and false otherwise. * @param supportsContexts True if the RDFFormat supports the encoding of contexts/named graphs and * false otherwise. + * @deprecated since 3.2.0 */ + @Deprecated public RDFFormat(String name, String mimeType, Charset charset, String fileExtension, boolean supportsNamespaces, boolean supportsContexts) { + this(name, mimeType, charset, fileExtension, supportsNamespaces, supportsContexts, NO_RDF_STAR); + } + + /** + * Creates a new RDFFormat object. + * + * @param name The name of the RDF file format, e.g. "RDF/XML". + * @param mimeType The MIME type of the RDF file format, e.g. application/rdf+xml for the RDF/XML + * file format. + * @param charset The default character encoding of the RDF file format. Specify null if not + * applicable. + * @param fileExtension The (default) file extension for the RDF file format, e.g. rdf for RDF/XML + * files. + * @param supportsNamespaces True if the RDFFormat supports the encoding of namespace/prefix information + * and false otherwise. + * @param supportsContexts True if the RDFFormat supports the encoding of contexts/named graphs and + * false otherwise. + * @param supportsRDFStar True if the RDFFormat supports the encoding of RDF* triples natively and + * false otherwise. + */ + public RDFFormat(String name, String mimeType, Charset charset, String fileExtension, boolean supportsNamespaces, + boolean supportsContexts, boolean supportsRDFStar) { this(name, Arrays.asList(mimeType), charset, Arrays.asList(fileExtension), supportsNamespaces, - supportsContexts); + supportsContexts, supportsRDFStar); } /** * Creates a new RDFFormat object. - * + * * @param name The name of the RDF file format, e.g. "RDF/XML". * @param mimeType The MIME type of the RDF file format, e.g. application/rdf+xml for the RDF/XML * file format. @@ -336,15 +416,40 @@ public RDFFormat(String name, String mimeType, Charset charset, String fileExten * and false otherwise. * @param supportsContexts True if the RDFFormat supports the encoding of contexts/named graphs and * false otherwise. + * @deprecated since 3.2.0 */ + @Deprecated public RDFFormat(String name, String mimeType, Charset charset, Collection fileExtensions, boolean supportsNamespaces, boolean supportsContexts) { - this(name, Arrays.asList(mimeType), charset, fileExtensions, supportsNamespaces, supportsContexts); + this(name, mimeType, charset, fileExtensions, supportsNamespaces, supportsContexts, NO_RDF_STAR); + } + + /** + * Creates a new RDFFormat object. + * + * @param name The name of the RDF file format, e.g. "RDF/XML". + * @param mimeType The MIME type of the RDF file format, e.g. application/rdf+xml for the RDF/XML + * file format. + * @param charset The default character encoding of the RDF file format. Specify null if not + * applicable. + * @param fileExtensions The RDF format's file extensions, e.g. rdf for RDF/XML files. The first item + * in the list is interpreted as the default file extension for the format. + * @param supportsNamespaces True if the RDFFormat supports the encoding of namespace/prefix information + * and false otherwise. + * @param supportsContexts True if the RDFFormat supports the encoding of contexts/named graphs and + * false otherwise. + * @param supportsRDFStar True if the RDFFormat supports the encoding of RDF* triples natively and + * false otherwise. + */ + public RDFFormat(String name, String mimeType, Charset charset, Collection fileExtensions, + boolean supportsNamespaces, boolean supportsContexts, boolean supportsRDFStar) { + this(name, Arrays.asList(mimeType), charset, fileExtensions, supportsNamespaces, supportsContexts, + supportsRDFStar); } /** * Creates a new RDFFormat object. - * + * * @param name The name of the RDF file format, e.g. "RDF/XML". * @param mimeTypes The MIME types of the RDF file format, e.g. application/rdf+xml for the * RDF/XML file format. The first item in the list is interpreted as the default MIME type @@ -357,15 +462,41 @@ public RDFFormat(String name, String mimeType, Charset charset, Collectionfalse

    * Lookup can be done via the serviceUrl using the method {@link #getService(String)}. If there is no service for the * specified url, a {@link SPARQLFederatedService} is created and registered for future use. - * + * * @author Andreas Schwarte * @author James Leigh */ diff --git a/core/repository/sparql/src/main/java/org/eclipse/rdf4j/repository/sparql/federation/ServiceJoinConversionIteration.java b/core/repository/sparql/src/main/java/org/eclipse/rdf4j/repository/sparql/federation/ServiceJoinConversionIteration.java index 5fb44a289c4..09596c44586 100644 --- a/core/repository/sparql/src/main/java/org/eclipse/rdf4j/repository/sparql/federation/ServiceJoinConversionIteration.java +++ b/core/repository/sparql/src/main/java/org/eclipse/rdf4j/repository/sparql/federation/ServiceJoinConversionIteration.java @@ -20,7 +20,7 @@ /** * Inserts original bindings into the result, uses ?__rowIdx to resolve original bindings. See * {@link org.eclipse.rdf4j.query.algebra.evaluation.federation.ServiceJoinIterator} and {@link SPARQLFederatedService}. - * + * * @author Andreas Schwarte */ public class ServiceJoinConversionIteration @@ -54,10 +54,11 @@ protected BindingSet convert(BindingSet bIn) throws QueryEvaluationException { // should never occur: in such case we would have to create the cross product (which // is dealt with in another place) - if (bIndex == -1) + if (bIndex == -1) { throw new QueryEvaluationException( "Invalid join. Probably this is due to non-standard behavior of the SPARQL endpoint. " + "Please report to the developers."); + } res.addAll(bindings.get(bIndex)); return res; diff --git a/core/repository/sparql/src/main/java/org/eclipse/rdf4j/repository/sparql/federation/SilentIteration.java b/core/repository/sparql/src/main/java/org/eclipse/rdf4j/repository/sparql/federation/SilentIteration.java index b199f986857..bbca8334931 100644 --- a/core/repository/sparql/src/main/java/org/eclipse/rdf4j/repository/sparql/federation/SilentIteration.java +++ b/core/repository/sparql/src/main/java/org/eclipse/rdf4j/repository/sparql/federation/SilentIteration.java @@ -14,7 +14,7 @@ /** * Wrap an inner iteration and suppress exceptions silently - * + * * @author Andreas Schwarte * @deprecated Use {@link org.eclipse.rdf4j.common.iteration.SilentIteration} instead. */ diff --git a/core/repository/sparql/src/main/java/org/eclipse/rdf4j/repository/sparql/query/InsertBindingSetCursor.java b/core/repository/sparql/src/main/java/org/eclipse/rdf4j/repository/sparql/query/InsertBindingSetCursor.java index 8700a7f3cec..fbd5e074af6 100644 --- a/core/repository/sparql/src/main/java/org/eclipse/rdf4j/repository/sparql/query/InsertBindingSetCursor.java +++ b/core/repository/sparql/src/main/java/org/eclipse/rdf4j/repository/sparql/query/InsertBindingSetCursor.java @@ -15,7 +15,7 @@ /** * Adds more bindings to each of the results. - * + * * @author James Leigh */ public class InsertBindingSetCursor extends IterationWrapper { diff --git a/core/repository/sparql/src/main/java/org/eclipse/rdf4j/repository/sparql/query/QueryStringUtil.java b/core/repository/sparql/src/main/java/org/eclipse/rdf4j/repository/sparql/query/QueryStringUtil.java index fff8a3b413e..563c29ba065 100644 --- a/core/repository/sparql/src/main/java/org/eclipse/rdf4j/repository/sparql/query/QueryStringUtil.java +++ b/core/repository/sparql/src/main/java/org/eclipse/rdf4j/repository/sparql/query/QueryStringUtil.java @@ -20,7 +20,7 @@ /** * Utility class to perfom query string manipulations as used in {@link SPARQLTupleQuery}, {@link SPARQLGraphQuery} and * {@link SPARQLBooleanQuery}. - * + * * @author Andreas Schwarte * @see SPARQLTupleQuery * @see SPARQLGraphQuery @@ -32,7 +32,7 @@ public class QueryStringUtil { /** * Retrieve a modified queryString into which all bindings of the given argument are replaced. - * + * * @param queryString * @param bindings * @return the modified queryString @@ -144,9 +144,9 @@ public static String valueToString(Value value) { * @return the provided StringBuilder */ public static StringBuilder appendValueAsString(StringBuilder sb, Value value) { - if (value == null) + if (value == null) { return sb.append("UNDEF"); // see grammar for BINDINGs def - else if (value instanceof IRI) { + } else if (value instanceof IRI) { return appendValue(sb, (IRI) value); } else if (value instanceof Literal) { return appendValue(sb, (Literal) value); diff --git a/core/repository/sparql/src/main/java/org/eclipse/rdf4j/repository/sparql/query/QueueCursor.java b/core/repository/sparql/src/main/java/org/eclipse/rdf4j/repository/sparql/query/QueueCursor.java index 5c6fae56bf0..9cd0843e7ab 100644 --- a/core/repository/sparql/src/main/java/org/eclipse/rdf4j/repository/sparql/query/QueueCursor.java +++ b/core/repository/sparql/src/main/java/org/eclipse/rdf4j/repository/sparql/query/QueueCursor.java @@ -10,7 +10,7 @@ /** * Makes working with a queue easier by adding the methods {@link #done()} and {@link #toss(Exception)} and * automatically converting the exception into a QueryEvaluationException with an appropriate stack trace. - * + * * @author James Leigh * @deprecated Use {@link org.eclipse.rdf4j.query.impl.QueueCursor} instead */ diff --git a/core/repository/sparql/src/main/java/org/eclipse/rdf4j/repository/sparql/query/SPARQLBooleanQuery.java b/core/repository/sparql/src/main/java/org/eclipse/rdf4j/repository/sparql/query/SPARQLBooleanQuery.java index 764b7560015..2abd7f5feaf 100644 --- a/core/repository/sparql/src/main/java/org/eclipse/rdf4j/repository/sparql/query/SPARQLBooleanQuery.java +++ b/core/repository/sparql/src/main/java/org/eclipse/rdf4j/repository/sparql/query/SPARQLBooleanQuery.java @@ -15,11 +15,12 @@ import org.eclipse.rdf4j.query.MalformedQueryException; import org.eclipse.rdf4j.query.QueryEvaluationException; import org.eclipse.rdf4j.query.QueryLanguage; +import org.eclipse.rdf4j.query.explanation.Explanation; import org.eclipse.rdf4j.repository.RepositoryException; /** * Parses boolean query response from remote stores. - * + * * @author James Leigh */ public class SPARQLBooleanQuery extends AbstractHTTPQuery implements BooleanQuery { @@ -44,4 +45,9 @@ public boolean evaluate() throws QueryEvaluationException { private String getQueryString() { return QueryStringUtil.getBooleanQueryString(queryString, getBindings()); } + + @Override + public Explanation explain(Explanation.Level level) { + throw new UnsupportedOperationException(); + } } diff --git a/core/repository/sparql/src/main/java/org/eclipse/rdf4j/repository/sparql/query/SPARQLGraphQuery.java b/core/repository/sparql/src/main/java/org/eclipse/rdf4j/repository/sparql/query/SPARQLGraphQuery.java index 709ce8d4d5c..8d300e4f250 100644 --- a/core/repository/sparql/src/main/java/org/eclipse/rdf4j/repository/sparql/query/SPARQLGraphQuery.java +++ b/core/repository/sparql/src/main/java/org/eclipse/rdf4j/repository/sparql/query/SPARQLGraphQuery.java @@ -16,13 +16,14 @@ import org.eclipse.rdf4j.query.MalformedQueryException; import org.eclipse.rdf4j.query.QueryEvaluationException; import org.eclipse.rdf4j.query.QueryLanguage; +import org.eclipse.rdf4j.query.explanation.Explanation; import org.eclipse.rdf4j.repository.RepositoryException; import org.eclipse.rdf4j.rio.RDFHandler; import org.eclipse.rdf4j.rio.RDFHandlerException; /** * Parses RDF results in the background. - * + * * @author James Leigh * @author Andreas Schwarte */ @@ -60,4 +61,9 @@ public void evaluate(RDFHandler handler) throws QueryEvaluationException, RDFHan private String getQueryString() { return QueryStringUtil.getGraphQueryString(queryString, getBindings()); } + + @Override + public Explanation explain(Explanation.Level level) { + throw new UnsupportedOperationException(); + } } diff --git a/core/repository/sparql/src/main/java/org/eclipse/rdf4j/repository/sparql/query/SPARQLOperation.java b/core/repository/sparql/src/main/java/org/eclipse/rdf4j/repository/sparql/query/SPARQLOperation.java index 267ba33aa0f..f67b743c04b 100644 --- a/core/repository/sparql/src/main/java/org/eclipse/rdf4j/repository/sparql/query/SPARQLOperation.java +++ b/core/repository/sparql/src/main/java/org/eclipse/rdf4j/repository/sparql/query/SPARQLOperation.java @@ -106,8 +106,9 @@ protected void execute(Runnable command) { } protected Set getBindingNames() { - if (bindings.size() == 0) + if (bindings.size() == 0) { return Collections.EMPTY_SET; + } Set names = new HashSet<>(); String qry = operation; int b = qry.indexOf('{'); @@ -125,8 +126,9 @@ protected Set getBindingNames() { } protected String getQueryString() { - if (bindings.size() == 0) + if (bindings.size() == 0) { return operation; + } String qry = operation; int b = qry.indexOf('{'); String select = qry.substring(0, b); diff --git a/core/repository/sparql/src/main/java/org/eclipse/rdf4j/repository/sparql/query/SPARQLQueryBindingSet.java b/core/repository/sparql/src/main/java/org/eclipse/rdf4j/repository/sparql/query/SPARQLQueryBindingSet.java index f359d479cca..c92d4d17c11 100644 --- a/core/repository/sparql/src/main/java/org/eclipse/rdf4j/repository/sparql/query/SPARQLQueryBindingSet.java +++ b/core/repository/sparql/src/main/java/org/eclipse/rdf4j/repository/sparql/query/SPARQLQueryBindingSet.java @@ -61,7 +61,7 @@ public void addAll(BindingSet bindingSet) { /** * Adds a new binding to the binding set. The binding's name must not already be part of this binding set. - * + * * @param binding The binding to add this this BindingSet. */ public void addBinding(Binding binding) { @@ -70,7 +70,7 @@ public void addBinding(Binding binding) { /** * Adds a new binding to the binding set. The binding's name must not already be part of this binding set. - * + * * @param name The binding's name, must not be bound in this binding set already. * @param value The binding's value. */ diff --git a/core/repository/sparql/src/main/java/org/eclipse/rdf4j/repository/sparql/query/SPARQLTupleQuery.java b/core/repository/sparql/src/main/java/org/eclipse/rdf4j/repository/sparql/query/SPARQLTupleQuery.java index 2fa509cec8c..ba3dc174d4d 100644 --- a/core/repository/sparql/src/main/java/org/eclipse/rdf4j/repository/sparql/query/SPARQLTupleQuery.java +++ b/core/repository/sparql/src/main/java/org/eclipse/rdf4j/repository/sparql/query/SPARQLTupleQuery.java @@ -18,11 +18,12 @@ import org.eclipse.rdf4j.query.TupleQueryResult; import org.eclipse.rdf4j.query.TupleQueryResultHandler; import org.eclipse.rdf4j.query.TupleQueryResultHandlerException; +import org.eclipse.rdf4j.query.explanation.Explanation; import org.eclipse.rdf4j.repository.RepositoryException; /** * Parses tuple results in the background. - * + * * @author James Leigh */ public class SPARQLTupleQuery extends AbstractHTTPQuery implements TupleQuery { @@ -62,4 +63,9 @@ public void evaluate(TupleQueryResultHandler handler) private String getQueryString() { return QueryStringUtil.getTupleQueryString(queryString, getBindings()); } + + @Override + public Explanation explain(Explanation.Level level) { + throw new UnsupportedOperationException(); + } } diff --git a/core/repository/sparql/src/main/java/org/eclipse/rdf4j/repository/sparql/query/SPARQLUpdate.java b/core/repository/sparql/src/main/java/org/eclipse/rdf4j/repository/sparql/query/SPARQLUpdate.java index ab0f32a6a91..67c26df5cee 100644 --- a/core/repository/sparql/src/main/java/org/eclipse/rdf4j/repository/sparql/query/SPARQLUpdate.java +++ b/core/repository/sparql/src/main/java/org/eclipse/rdf4j/repository/sparql/query/SPARQLUpdate.java @@ -21,7 +21,7 @@ /** * Update operation of the {@link SPARQLRepository} - * + * * @author Jeen Broekstra * @author Andreas Schwarte */ diff --git a/core/repository/sparql/src/test/java/org/eclipse/rdf4j/repository/sparql/SPARQLConnectionTest.java b/core/repository/sparql/src/test/java/org/eclipse/rdf4j/repository/sparql/SPARQLConnectionTest.java index eee36df4633..4bba624826f 100644 --- a/core/repository/sparql/src/test/java/org/eclipse/rdf4j/repository/sparql/SPARQLConnectionTest.java +++ b/core/repository/sparql/src/test/java/org/eclipse/rdf4j/repository/sparql/SPARQLConnectionTest.java @@ -7,6 +7,7 @@ *******************************************************************************/ package org.eclipse.rdf4j.repository.sparql; +import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyBoolean; import static org.mockito.ArgumentMatchers.anyInt; @@ -16,15 +17,24 @@ import static org.mockito.Mockito.verify; import org.eclipse.rdf4j.http.client.SPARQLProtocolSession; +import org.eclipse.rdf4j.model.IRI; +import org.eclipse.rdf4j.model.ValueFactory; +import org.eclipse.rdf4j.model.impl.SimpleValueFactory; +import org.eclipse.rdf4j.model.vocabulary.FOAF; +import org.eclipse.rdf4j.model.vocabulary.RDF; +import org.eclipse.rdf4j.model.vocabulary.RDFS; import org.eclipse.rdf4j.rio.ParserConfig; import org.junit.Before; import org.junit.Test; +import org.mockito.ArgumentCaptor; public class SPARQLConnectionTest { private SPARQLConnection subject; private SPARQLProtocolSession client; + private final ValueFactory vf = SimpleValueFactory.getInstance(); + @Before public void setUp() throws Exception { client = mock(SPARQLProtocolSession.class); @@ -48,4 +58,96 @@ public void commitOnEmptyTxnDoesNothing() throws Exception { verify(client, never()).sendUpdate(any(), any(), any(), any(), anyBoolean(), anyInt(), any()); verify(client, never()).sendUpdate(any(), any(), any(), any(), anyBoolean(), any()); } + + @Test + public void testGroupingAddsInInsert() throws Exception { + ArgumentCaptor sparqlUpdateCaptor = ArgumentCaptor.forClass(String.class); + + subject.begin(); + subject.add(FOAF.PERSON, RDF.TYPE, RDFS.CLASS); + subject.add(FOAF.AGENT, RDF.TYPE, RDFS.CLASS); + subject.commit(); + + verify(client).sendUpdate(any(), sparqlUpdateCaptor.capture(), any(), any(), anyBoolean(), anyInt(), any()); + + String sparqlUpdate = sparqlUpdateCaptor.getValue(); + String expectedTriple1 = "<" + FOAF.PERSON + "> <" + RDF.TYPE + "> <" + RDFS.CLASS + ">"; + String expectedTriple2 = "<" + FOAF.AGENT + "> <" + RDF.TYPE + "> <" + RDFS.CLASS + ">"; + + assertThat(sparqlUpdate).containsOnlyOnce("INSERT DATA").contains(expectedTriple1).contains(expectedTriple2); + } + + @Test + public void testAddSingleContextHandling() throws Exception { + ArgumentCaptor sparqlUpdateCaptor = ArgumentCaptor.forClass(String.class); + + IRI g1 = vf.createIRI("urn:g1"); + + subject.begin(); + subject.add(FOAF.PERSON, RDF.TYPE, RDFS.CLASS, g1); + subject.remove(FOAF.AGENT, RDF.TYPE, RDFS.CLASS); + subject.commit(); + + verify(client).sendUpdate(any(), sparqlUpdateCaptor.capture(), any(), any(), anyBoolean(), anyInt(), any()); + + String sparqlUpdate = sparqlUpdateCaptor.getValue(); + String expectedAddPattern = "INSERT DATA[^{]*\\{[^G]*GRAPH <" + g1 + ">[^{]*\\{[^<]*<" + FOAF.PERSON + "> "; + String expectedRemovePattern = "DELETE DATA[^{]*\\{[^<]*<" + FOAF.AGENT + "> "; + + assertThat(sparqlUpdate).containsPattern(expectedAddPattern).containsPattern(expectedRemovePattern); + } + + @Test + public void testAddMultipleContextHandling() throws Exception { + ArgumentCaptor sparqlUpdateCaptor = ArgumentCaptor.forClass(String.class); + + IRI g1 = vf.createIRI("urn:g1"); + IRI g2 = vf.createIRI("urn:g2"); + + subject.begin(); + subject.add(FOAF.PERSON, RDF.TYPE, RDFS.CLASS, g1, g2); + subject.remove(FOAF.AGENT, RDF.TYPE, RDFS.CLASS); + subject.commit(); + + verify(client).sendUpdate(any(), sparqlUpdateCaptor.capture(), any(), any(), anyBoolean(), anyInt(), any()); + + String sparqlUpdate = sparqlUpdateCaptor.getValue(); + String expectedAddPattern1 = "INSERT DATA[^{]*\\{[^G]*GRAPH <" + g1 + ">[^{]*\\{[^<]*<" + FOAF.PERSON + "> "; + String expectedAddPattern2 = "INSERT DATA[^{]*\\{[^G]*GRAPH <" + g2 + ">[^{]*\\{[^<]*<" + FOAF.PERSON + "> "; + String expectedRemovePattern = "DELETE DATA[^{]*\\{[^<]*<" + FOAF.AGENT + "> "; + + assertThat(sparqlUpdate).containsPattern(expectedAddPattern1) + .containsPattern(expectedAddPattern2) + .containsPattern(expectedRemovePattern); + } + + @Test + public void testHandlingAddsRemoves() throws Exception { + ArgumentCaptor sparqlUpdateCaptor = ArgumentCaptor.forClass(String.class); + + subject.begin(); + subject.add(FOAF.PERSON, RDF.TYPE, RDFS.CLASS); + subject.add(FOAF.AGENT, RDF.TYPE, RDFS.CLASS); + subject.remove(FOAF.BIRTHDAY, RDF.TYPE, RDF.PROPERTY); + subject.add(FOAF.AGE, RDF.TYPE, RDF.PROPERTY); + subject.commit(); + + verify(client).sendUpdate(any(), sparqlUpdateCaptor.capture(), any(), any(), anyBoolean(), anyInt(), any()); + + String sparqlUpdate = sparqlUpdateCaptor.getValue(); + + String expectedAddedTriple1 = "<" + FOAF.PERSON + "> <" + RDF.TYPE + "> <" + RDFS.CLASS + "> ."; + String expectedAddedTriple2 = "<" + FOAF.AGENT + "> <" + RDF.TYPE + "> <" + RDFS.CLASS + "> ."; + String expectedAddedTriple3 = "<" + FOAF.AGE + "> <" + RDF.TYPE + "> <" + RDF.PROPERTY + "> "; + String expectedRemovedTriple1 = "<" + FOAF.BIRTHDAY + "> <" + RDF.TYPE + "> <" + RDF.PROPERTY + "> ."; + + String expectedSequence = "INSERT DATA[^{]*\\{[^}]*\\}[^D]+DELETE DATA[^{]*\\{[^}]*\\}[^I]+INSERT DATA.*"; + + assertThat(sparqlUpdate).containsPattern(expectedSequence); + assertThat(sparqlUpdate).contains(expectedAddedTriple1) + .contains(expectedAddedTriple2) + .contains(expectedAddedTriple3) + .contains(expectedRemovedTriple1); + + } } diff --git a/core/rio/api/pom.xml b/core/rio/api/pom.xml index 56924530ee0..3dfd3140167 100644 --- a/core/rio/api/pom.xml +++ b/core/rio/api/pom.xml @@ -4,7 +4,7 @@ org.eclipse.rdf4j rdf4j-rio - 3.1.5-SNAPSHOT + 3.2.2-SNAPSHOT rdf4j-rio-api RDF4J: Rio - API diff --git a/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/DatatypeHandler.java b/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/DatatypeHandler.java index ae352e31959..c8bf7df2133 100644 --- a/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/DatatypeHandler.java +++ b/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/DatatypeHandler.java @@ -15,7 +15,7 @@ /** * An interface defining methods related to verification and normalization of typed literals and datatype URIs. - * + * * @author Peter Ansell */ public interface DatatypeHandler { @@ -32,28 +32,28 @@ public interface DatatypeHandler { /** * Identifier for datatypes defined by DBPedia. - * + * * @see DBPedia Datatypes */ public static final String DBPEDIA = "org.eclipse.rdf4j.rio.datatypes.dbpedia"; /** * Identifier for datatypes defined in the Virtuoso Geometry vocabulary. - * + * * @see Virtuoso Geospatial */ public static final String VIRTUOSOGEOMETRY = "org.eclipse.rdf4j.rio.datatypes.virtuosogeometry"; /** * Identifier for datatypes defined in the GeoSPARQL vocabulary. - * + * * @see GeoSPARQL */ public static final String GEOSPARQL = "org.eclipse.rdf4j.rio.datatypes.geosparql"; /** * Checks if the given datatype URI is recognized by this datatype handler. - * + * * @param datatypeUri The datatype URI to check. * @return True if the datatype is syntactically valid and could be used with {@link #verifyDatatype(String, IRI)} * and {@link #normalizeDatatype(String, IRI, ValueFactory)}. @@ -65,7 +65,7 @@ public interface DatatypeHandler { *

    otherwise. * @param supportsContexts True if the RDFFormat supports the encoding of contexts/named graphs and * false otherwise. + * @deprecated since 3.2.0 */ + @Deprecated public RDFFormat(String name, Collection mimeTypes, Charset charset, Collection fileExtensions, boolean supportsNamespaces, boolean supportsContexts) { - this(name, mimeTypes, charset, fileExtensions, null, supportsNamespaces, supportsContexts); + this(name, mimeTypes, charset, fileExtensions, null, supportsNamespaces, supportsContexts, NO_RDF_STAR); } /** * Creates a new RDFFormat object. - * + * + * @param name The name of the RDF file format, e.g. "RDF/XML". + * @param mimeTypes The MIME types of the RDF file format, e.g. application/rdf+xml for the + * RDF/XML file format. The first item in the list is interpreted as the default MIME type + * for the format. + * @param charset The default character encoding of the RDF file format. Specify null if not + * applicable. + * @param fileExtensions The RDF format's file extensions, e.g. rdf for RDF/XML files. The first item + * in the list is interpreted as the default file extension for the format. + * @param supportsNamespaces True if the RDFFormat supports the encoding of namespace/prefix information + * and false otherwise. + * @param supportsContexts True if the RDFFormat supports the encoding of contexts/named graphs and + * false otherwise. + * @param supportsRDFStar True if the RDFFormat supports the encoding of RDF* triples natively and + * false otherwise. + */ + public RDFFormat(String name, Collection mimeTypes, Charset charset, Collection fileExtensions, + boolean supportsNamespaces, boolean supportsContexts, boolean supportsRDFStar) { + this(name, mimeTypes, charset, fileExtensions, null, supportsNamespaces, supportsContexts, + supportsRDFStar); + } + + /** + * Creates a new RDFFormat object. + * * @param name The name of the RDF file format, e.g. "RDF/XML". * @param mimeTypes The MIME types of the RDF file format, e.g. application/rdf+xml for the * RDF/XML file format. The first item in the list is interpreted as the default MIME type @@ -380,14 +511,42 @@ public RDFFormat(String name, Collection mimeTypes, Charset charset, Col * and false otherwise. * @param supportsContexts True if the RDFFormat supports the encoding of contexts/named graphs and * false otherwise. + * @deprecated since 3.2.0 */ + @Deprecated public RDFFormat(String name, Collection mimeTypes, Charset charset, Collection fileExtensions, IRI standardURI, boolean supportsNamespaces, boolean supportsContexts) { + this(name, mimeTypes, charset, fileExtensions, standardURI, supportsNamespaces, supportsContexts, NO_RDF_STAR); + } + + /** + * Creates a new RDFFormat object. + * + * @param name The name of the RDF file format, e.g. "RDF/XML". + * @param mimeTypes The MIME types of the RDF file format, e.g. application/rdf+xml for the + * RDF/XML file format. The first item in the list is interpreted as the default MIME type + * for the format. + * @param charset The default character encoding of the RDF file format. Specify null if not + * applicable. + * @param fileExtensions The RDF format's file extensions, e.g. rdf for RDF/XML files. The first item + * in the list is interpreted as the default file extension for the format. + * @param standardURI The standard URI that has been assigned to this format by a standards organisation or + * null if it does not currently have a standard URI. + * @param supportsNamespaces True if the RDFFormat supports the encoding of namespace/prefix information + * and false otherwise. + * @param supportsContexts True if the RDFFormat supports the encoding of contexts/named graphs and + * false otherwise. + * @param supportsRDFStar True if the RDFFormat supports the encoding of RDF* triples natively and + * false otherwise. + */ + public RDFFormat(String name, Collection mimeTypes, Charset charset, Collection fileExtensions, + IRI standardURI, boolean supportsNamespaces, boolean supportsContexts, boolean supportsRDFStar) { super(name, mimeTypes, charset, fileExtensions); this.standardURI = standardURI; this.supportsNamespaces = supportsNamespaces; this.supportsContexts = supportsContexts; + this.supportsRDFStar = supportsRDFStar; } /*---------* @@ -408,6 +567,13 @@ public boolean supportsContexts() { return supportsContexts; } + /** + * Return true if the RDFFormat supports the encoding of RDF* triples natively. + */ + public boolean supportsRDFStar() { + return supportsRDFStar; + } + /** * @return True if a standard URI has been assigned to this format by a standards organisation. */ diff --git a/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/RDFHandler.java b/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/RDFHandler.java index e440e521ffd..b8a2d411720 100644 --- a/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/RDFHandler.java +++ b/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/RDFHandler.java @@ -19,14 +19,14 @@ public interface RDFHandler { /** * Signals the start of the RDF data. This method is called before any data is reported. - * + * * @throws RDFHandlerException If the RDF handler has encountered an unrecoverable error. */ public void startRDF() throws RDFHandlerException; /** * Signals the end of the RDF data. This method is called when all data has been reported. - * + * * @throws RDFHandlerException If the RDF handler has encountered an unrecoverable error. */ public void endRDF() throws RDFHandlerException; @@ -35,7 +35,7 @@ public interface RDFHandler { * Handles a namespace declaration/definition. A namespace declaration associates a (short) prefix string with the * namespace's URI. The prefix for default namespaces, which do not have an associated prefix, are represented as * empty strings. - * + * * @param prefix The prefix for the namespace, or an empty string in case of a default namespace. * @param uri The URI that the prefix maps to. * @throws RDFHandlerException If the RDF handler has encountered an unrecoverable error. @@ -44,7 +44,7 @@ public interface RDFHandler { /** * Handles a statement. - * + * * @param st The statement. * @throws RDFHandlerException If the RDF handler has encountered an unrecoverable error. */ @@ -52,7 +52,7 @@ public interface RDFHandler { /** * Handles a comment. - * + * * @param comment The comment. * @throws RDFHandlerException If the RDF handler has encountered an unrecoverable error. */ diff --git a/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/RDFParseException.java b/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/RDFParseException.java index fbe1b6994d3..9240d2b64e5 100644 --- a/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/RDFParseException.java +++ b/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/RDFParseException.java @@ -31,7 +31,7 @@ public class RDFParseException extends RDF4JException { /** * Creates a new ParseException. - * + * * @param msg An error message. */ public RDFParseException(String msg) { @@ -40,7 +40,7 @@ public RDFParseException(String msg) { /** * Creates a new ParseException. - * + * * @param msg An error message. * @param lineNo A line number associated with the message. * @param columnNo A column number associated with the message. @@ -54,7 +54,7 @@ public RDFParseException(String msg, long lineNo, long columnNo) { /** * Creates a new ParseException wrapping another exception. The ParseException will inherit its message from the * supplied source exception. - * + * * @param t The source exception. */ public RDFParseException(Throwable t) { @@ -64,7 +64,7 @@ public RDFParseException(Throwable t) { /** * Creates a new ParseException wrapping another exception. The ParseException will inherit its message from the * supplied source exception. - * + * * @param msg An error message. * @param t The source exception. */ @@ -75,7 +75,7 @@ public RDFParseException(String msg, Throwable t) { /** * Creates a new ParseException wrapping another exception. The ParseException will inherit its message from the * supplied source exception. - * + * * @param t The source exception. * @param lineNo A line number associated with the message. * @param columnNo A column number associated with the message. @@ -89,7 +89,7 @@ public RDFParseException(Throwable t, long lineNo, long columnNo) { /** * Creates a new ParseException wrapping another exception. The ParseException will inherit its message from the * supplied source exception. - * + * * @param t The source exception. * @param lineNo A line number associated with the message. * @param columnNo A column number associated with the message. @@ -106,7 +106,7 @@ public RDFParseException(String msg, Throwable t, long lineNo, long columnNo) { /** * Gets the line number associated with this parse exception. - * + * * @return A line number, or -1 if no line number is available or applicable. */ public long getLineNumber() { @@ -115,7 +115,7 @@ public long getLineNumber() { /** * Gets the column number associated with this parse exception. - * + * * @return A column number, or -1 if no column number is available or applicable. */ public long getColumnNumber() { diff --git a/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/RDFParser.java b/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/RDFParser.java index 8a79fa13ce0..e010ce9cbc0 100644 --- a/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/RDFParser.java +++ b/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/RDFParser.java @@ -60,7 +60,7 @@ public enum DatatypeHandling { /** * Sets the ValueFactory that the parser will use to create Value objects for the parsed RDF data. - * + * * @param valueFactory The value factory that the parser should use. * @return Either a copy of this parser, if it is immutable, or this object, to allow chaining of method calls. */ @@ -68,7 +68,7 @@ public enum DatatypeHandling { /** * Sets the RDFHandler that will handle the parsed RDF data. - * + * * @param handler The RDFHandler to handle the parsed data. * @return Either a copy of this parser, if it is immutable, or this object, to allow chaining of method calls. */ @@ -76,7 +76,7 @@ public enum DatatypeHandling { /** * Sets the ParseErrorListener that will be notified of any errors that this parser finds during parsing. - * + * * @param el The ParseErrorListener that will be notified of errors or warnings. * @return Either a copy of this parser, if it is immutable, or this object, to allow chaining of method calls. */ @@ -84,7 +84,7 @@ public enum DatatypeHandling { /** * Sets the ParseLocationListener that will be notified of the parser's progress during the parse process. - * + * * @param ll The ParseLocationListener that will be notified of the parser's progress. * @return Either a copy of this parser, if it is immutable, or this object, to allow chaining of method calls. */ @@ -92,7 +92,7 @@ public enum DatatypeHandling { /** * Sets all supplied parser configuration options. - * + * * @param config a parser configuration object. * @return Either a copy of this parser, if it is immutable, or this object, to allow chaining of method calls. */ @@ -100,7 +100,7 @@ public enum DatatypeHandling { /** * Retrieves the current parser configuration as a single object. - * + * * @return a parser configuration object representing the current configuration of the parser. */ public ParserConfig getParserConfig(); @@ -112,7 +112,7 @@ public enum DatatypeHandling { /** * Set a setting on the parser, and return this parser object to allow chaining. - * + * * @param setting The setting to change. * @param value The value to change. * @return Either a copy of this parser, if it is immutable, or this object, to allow chaining of method calls. @@ -121,7 +121,7 @@ public enum DatatypeHandling { /** * Sets whether the parser should verify the data it parses (default value is true). - * + * * @deprecated since 2.0. Use {@link #getParserConfig()} with {@link BasicParserSettings#FAIL_ON_UNKNOWN_DATATYPES}, * {@link BasicParserSettings#VERIFY_DATATYPE_VALUES}, and/or * {@link BasicParserSettings#NORMALIZE_DATATYPE_VALUES} instead. @@ -137,7 +137,7 @@ public enum DatatypeHandling { /** * Sets whether the parser should stop immediately if it finds an error in the data (default value is * true). - * + * * @deprecated since 2.0. Use {@link #getParserConfig()} with {@link ParserConfig#addNonFatalError(RioSetting)} to * select which errors will not always fail the parse prematurely. */ @@ -150,7 +150,7 @@ public enum DatatypeHandling { * datatyped literals. If set to verify, any literals with known (XML Schema built-in) datatypes are * checked to see if their values are valid. If set to normalize, the literal values are not only checked, * but also normalized to their canonical representation. The default value is verify. - * + * * @param datatypeHandling A datatype handling option. * @deprecated since 2.0. Use {@link #getParserConfig()} with {@link BasicParserSettings#FAIL_ON_UNKNOWN_DATATYPES}, * {@link BasicParserSettings#VERIFY_DATATYPE_VALUES}, and/or @@ -161,7 +161,7 @@ public enum DatatypeHandling { /** * Parses the data from the supplied InputStream, using the supplied baseURI to resolve any relative URI references. - * + * * @param in The InputStream from which to read the data. * @param baseURI The URI associated with the data in the InputStream. * @throws IOException If an I/O error occurred while data was read from the InputStream. @@ -172,7 +172,7 @@ public enum DatatypeHandling { /** * Parses the data from the supplied Reader, using the supplied baseURI to resolve any relative URI references. - * + * * @param reader The Reader from which to read the data. * @param baseURI The URI associated with the data in the InputStream. * @throws IOException If an I/O error occurred while data was read from the InputStream. diff --git a/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/RDFParserFactory.java b/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/RDFParserFactory.java index e0f33c5510e..4ce5f99be8d 100644 --- a/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/RDFParserFactory.java +++ b/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/RDFParserFactory.java @@ -9,7 +9,7 @@ /** * A RDFParserFactory returns {@link RDFParser}s for a specific RDF format. - * + * * @author Arjohn Kampman */ public interface RDFParserFactory { diff --git a/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/RDFParserRegistry.java b/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/RDFParserRegistry.java index b8a86b8f563..919b9ee02e0 100644 --- a/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/RDFParserRegistry.java +++ b/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/RDFParserRegistry.java @@ -11,7 +11,7 @@ /** * A registry that keeps track of the available {@link RDFParserFactory}s. - * + * * @author Arjohn Kampman */ public class RDFParserRegistry extends FileFormatServiceRegistry { @@ -26,7 +26,7 @@ private static class RDFParserRegistryHolder { /** * Gets the default RDFParserRegistry. - * + * * @return The default registry. */ public static RDFParserRegistry getInstance() { diff --git a/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/RDFWriter.java b/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/RDFWriter.java index d5fe6cd7244..2ff130cb812 100644 --- a/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/RDFWriter.java +++ b/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/RDFWriter.java @@ -10,6 +10,10 @@ import java.io.OutputStream; import java.io.Writer; import java.util.Collection; +import java.util.Optional; + +import org.eclipse.rdf4j.common.annotation.Experimental; +import org.eclipse.rdf4j.common.annotation.InternalUseOnly; /** * An interface for RDF document writers. To allow RDF document writers to be created through reflection, all @@ -23,9 +27,25 @@ public interface RDFWriter extends RDFHandler { */ public RDFFormat getRDFFormat(); + /** + * Gets the {@link OutputStream} this writer writes to, if it uses one. + * + * @return an optional OutputStream + * @implNote This temporary default method is only supplied for backward compatibility. Concrete implementations are + * expected to override. + * @apiNote This method is currently considered experimental / for internal use only, and is likely to change in a + * future release without guarantees for backward compatibility. Use at your own risk. + * @since 3.2.0 + */ + @InternalUseOnly + @Experimental + public default Optional getOutputStream() { + return Optional.empty(); + } + /** * Sets all supplied writer configuration options. - * + * * @param config a writer configuration object. * @return Either a copy of this writer, if it is immutable, or this object, to allow chaining of method calls. */ @@ -33,7 +53,7 @@ public interface RDFWriter extends RDFHandler { /** * Retrieves the current writer configuration as a single object. - * + * * @return a writer configuration object representing the current configuration of the writer. */ public WriterConfig getWriterConfig(); @@ -45,7 +65,7 @@ public interface RDFWriter extends RDFHandler { /** * Set a setting on the writer, and return this writer object to allow chaining. - * + * * @param setting The setting to change. * @param value The value to change. * @return Either a copy of this writer, if it is immutable, or this object, to allow chaining of method calls. diff --git a/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/RDFWriterFactory.java b/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/RDFWriterFactory.java index 27594049833..b596bde27f2 100644 --- a/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/RDFWriterFactory.java +++ b/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/RDFWriterFactory.java @@ -13,7 +13,7 @@ /** * A RDFWriterFactory returns {@link RDFWriter}s for a specific RDF format. - * + * * @author Arjohn Kampman */ public interface RDFWriterFactory { @@ -25,7 +25,7 @@ public interface RDFWriterFactory { /** * Returns an RDFWriter instance that will write to the supplied output stream. - * + * * @param out The OutputStream to write the RDF to. */ public RDFWriter getWriter(OutputStream out); @@ -42,7 +42,7 @@ public interface RDFWriterFactory { /** * Returns an RDFWriter instance that will write to the supplied writer. (Optional operation) - * + * * @param writer The Writer to write the RDF to. * @throws UnsupportedOperationException if the RDFWriter the specific format does not support writing to a * {@link java.io.Writer} diff --git a/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/RDFWriterRegistry.java b/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/RDFWriterRegistry.java index e46c25e974a..f5d6935305f 100644 --- a/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/RDFWriterRegistry.java +++ b/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/RDFWriterRegistry.java @@ -11,7 +11,7 @@ /** * A registry that keeps track of the available {@link RDFWriterFactory}s. - * + * * @author Arjohn Kampman */ public class RDFWriterRegistry extends FileFormatServiceRegistry { @@ -26,7 +26,7 @@ private static class RDFWriterRegistryHolder { /** * Gets the default RDFWriterRegistry. - * + * * @return The default registry. */ public static RDFWriterRegistry getInstance() { diff --git a/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/Rio.java b/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/Rio.java index e2314ef9ac6..bd885117537 100644 --- a/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/Rio.java +++ b/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/Rio.java @@ -19,12 +19,13 @@ import java.util.function.Supplier; import org.eclipse.rdf4j.model.Model; +import org.eclipse.rdf4j.model.ModelFactory; import org.eclipse.rdf4j.model.Namespace; import org.eclipse.rdf4j.model.NamespaceAware; import org.eclipse.rdf4j.model.Resource; import org.eclipse.rdf4j.model.Statement; import org.eclipse.rdf4j.model.ValueFactory; -import org.eclipse.rdf4j.model.impl.LinkedHashModel; +import org.eclipse.rdf4j.model.impl.DynamicModelFactory; import org.eclipse.rdf4j.model.impl.SimpleValueFactory; import org.eclipse.rdf4j.rio.helpers.ContextStatementCollector; import org.eclipse.rdf4j.rio.helpers.ParseErrorLogger; @@ -34,7 +35,7 @@ *

    * It includes methods for searching for {@link RDFFormat}s based on MIME types and file extensions, creating * {@link RDFParser}s and {@link RDFWriter}s, and directly parsing and writing. - * + * * @author Arjohn Kampman * @author Peter Ansell */ @@ -42,7 +43,7 @@ public class Rio { /** * Tries to match a MIME type against the list of RDF formats that can be parsed. - * + * * @param mimeType A MIME type, e.g. "application/rdf+xml". * @return An RDFFormat object if a match was found, or {@link Optional#empty()} otherwise. */ @@ -52,7 +53,7 @@ public static Optional getParserFormatForMIMEType(String mimeType) { /** * Tries to match the extension of a file name against the list of RDF formats that can be parsed. - * + * * @param fileName A file name. * @return An RDFFormat object if a match was found, or {@link Optional#empty()} otherwise. */ @@ -62,7 +63,7 @@ public static Optional getParserFormatForFileName(String fileName) { /** * Tries to match a MIME type against the list of RDF formats that can be written. - * + * * @param mimeType A MIME type, e.g. "application/rdf+xml". * @return An RDFFormat object if a match was found, or {@link Optional#empty()} otherwise. */ @@ -72,7 +73,7 @@ public static Optional getWriterFormatForMIMEType(String mimeType) { /** * Tries to match the extension of a file name against the list of RDF formats that can be written. - * + * * @param fileName A file name. * @return An RDFFormat object if a match was found, or {@link Optional#empty()} otherwise. */ @@ -84,7 +85,7 @@ public static Optional getWriterFormatForFileName(String fileName) { * Convenience methods for creating RDFParser objects.This method uses the registry returned by * {@link RDFParserRegistry#getInstance()} to get a factory for the specified format and uses this factory to create * the appropriate parser. - * + * * @param format * @return RDF Parser * @throws UnsupportedRDFormatException If no parser is available for the specified RDF format. @@ -100,7 +101,7 @@ public static RDFParser createParser(RDFFormat format) throws UnsupportedRDForma /** * Convenience methods for creating RDFParser objects that use the specified ValueFactory to create RDF model * objects. - * + * * @param format * @param valueFactory * @return RDF Parser @@ -119,7 +120,7 @@ public static RDFParser createParser(RDFFormat format, ValueFactory valueFactory * Convenience methods for creating RDFWriter objects.This method uses the registry returned by * {@link RDFWriterRegistry#getInstance()} to get a factory for the specified format and uses this factory to create * the appropriate writer. - * + * * @param format * @param out * @return RDF Writer @@ -137,7 +138,7 @@ public static RDFWriter createWriter(RDFFormat format, OutputStream out) throws * Convenience methods for creating RDFWriter objects.This method uses the registry returned by * {@link RDFWriterRegistry#getInstance()} to get a factory for the specified format and uses this factory to create * the appropriate writer. - * + * * @param format * @param out * @param baseURI @@ -158,7 +159,7 @@ public static RDFWriter createWriter(RDFFormat format, OutputStream out, String * Convenience methods for creating RDFWriter objects.This method uses the registry returned by * {@link RDFWriterRegistry#getInstance()} to get a factory for the specified format and uses this factory to create * the appropriate writer. - * + * * @param format * @param writer * @return RDF Writer @@ -176,7 +177,7 @@ public static RDFWriter createWriter(RDFFormat format, Writer writer) throws Uns * Convenience methods for creating RDFWriter objects.This method uses the registry returned by * {@link RDFWriterRegistry#getInstance()} to get a factory for the specified format and uses this factory to create * the appropriate writer. - * + * * @param format * @param writer * @param baseURI @@ -195,7 +196,7 @@ public static RDFWriter createWriter(RDFFormat format, Writer writer, String bas /** * Adds RDF data from an {@link InputStream} to a {@link Model}, optionally to one or more named contexts. - * + * * @param in An InputStream from which RDF data can be read. * @param baseURI The base URI to resolve any relative URIs that are in the data against. * @param dataFormat The serialization format of the data. @@ -219,7 +220,7 @@ public static Model parse(InputStream in, String baseURI, RDFFormat dataFormat, * a Reader to upload byte-based data means that you have to be careful not to destroy the data's character encoding * by enforcing a default character encoding upon the bytes. If possible, adding such data using an InputStream is * to be preferred. - * + * * @param reader A Reader from which RDF data can be read. * @param baseURI The base URI to resolve any relative URIs that are in the data against. * @param dataFormat The serialization format of the data. @@ -238,7 +239,7 @@ public static Model parse(Reader reader, String baseURI, RDFFormat dataFormat, R /** * Adds RDF data from an {@link InputStream} to a {@link Model}, optionally to one or more named contexts. - * + * * @param in An InputStream from which RDF data can be read. * @param baseURI The base URI to resolve any relative URIs that are in the data against. * @param dataFormat The serialization format of the data. @@ -258,12 +259,39 @@ public static Model parse(Reader reader, String baseURI, RDFFormat dataFormat, R public static Model parse(InputStream in, String baseURI, RDFFormat dataFormat, ParserConfig settings, ValueFactory valueFactory, ParseErrorListener errors, Resource... contexts) throws IOException, RDFParseException, UnsupportedRDFormatException { - Model result = new LinkedHashModel(); + + return parse(in, baseURI, dataFormat, settings, valueFactory, errors, new DynamicModelFactory(), contexts); + } + + /** + * Adds RDF data from an {@link InputStream} to a {@link Model}, optionally to one or more named contexts. + * + * @param in An InputStream from which RDF data can be read. + * @param baseURI The base URI to resolve any relative URIs that are in the data against. + * @param dataFormat The serialization format of the data. + * @param settings The {@link ParserConfig} containing settings for configuring the parser. + * @param valueFactory The {@link ValueFactory} used by the parser to create statements. + * @param errors The {@link ParseErrorListener} used by the parser to signal errors, including errors that do + * not generate an {@link RDFParseException}. + * @param modelFactory the ModelFactory used to instantiate the model that gets returned. + * @param contexts The contexts to add the data to. If one or more contexts are supplied the method ignores + * contextual information in the actual data. If no contexts are supplied the contextual + * information in the input stream is used, if no context information is available the data is + * added without any context. + * @return A {@link Model} containing the parsed statements. + * @throws IOException If an I/O error occurred while reading from the input stream. + * @throws UnsupportedRDFormatException If no {@link RDFParser} is available for the specified RDF format. + * @throws RDFParseException If an error was found while parsing the RDF data. + */ + public static Model parse(InputStream in, String baseURI, RDFFormat dataFormat, ParserConfig settings, + ValueFactory valueFactory, ParseErrorListener errors, ModelFactory modelFactory, Resource... contexts) + throws IOException, RDFParseException, UnsupportedRDFormatException { + Model result = modelFactory.createEmptyModel(); RDFParser parser = createParser(dataFormat, valueFactory); parser.setParserConfig(settings); parser.setParseErrorListener(errors); parser.setRDFHandler(new ContextStatementCollector(result, valueFactory, contexts)); - // LinkedHashModel and ContextStatementCollector should not throw + // DynamicModel and ContextStatementCollector should not throw // RDFHandlerException exceptions parser.parse(in, baseURI); return result; @@ -274,7 +302,7 @@ public static Model parse(InputStream in, String baseURI, RDFFormat dataFormat, * a Reader to upload byte-based data means that you have to be careful not to destroy the data's character encoding * by enforcing a default character encoding upon the bytes. If possible, adding such data using an InputStream is * to be preferred. - * + * * @param reader A Reader from which RDF data can be read. * @param baseURI The base URI to resolve any relative URIs that are in the data against. * @param dataFormat The serialization format of the data. @@ -292,12 +320,40 @@ public static Model parse(InputStream in, String baseURI, RDFFormat dataFormat, public static Model parse(Reader reader, String baseURI, RDFFormat dataFormat, ParserConfig settings, ValueFactory valueFactory, ParseErrorListener errors, Resource... contexts) throws IOException, RDFParseException, UnsupportedRDFormatException { - Model result = new LinkedHashModel(); + + return parse(reader, baseURI, dataFormat, settings, valueFactory, errors, new DynamicModelFactory(), contexts); + } + + /** + * Adds RDF data from a {@link Reader} to a {@link Model}, optionally to one or more named contexts. Note: using + * a Reader to upload byte-based data means that you have to be careful not to destroy the data's character encoding + * by enforcing a default character encoding upon the bytes. If possible, adding such data using an InputStream is + * to be preferred. + * + * @param reader A Reader from which RDF data can be read. + * @param baseURI The base URI to resolve any relative URIs that are in the data against. + * @param dataFormat The serialization format of the data. + * @param settings The {@link ParserConfig} containing settings for configuring the parser. + * @param valueFactory The {@link ValueFactory} used by the parser to create statements. + * @param errors The {@link ParseErrorListener} used by the parser to signal errors, including errors that do + * not generate an {@link RDFParseException}. + * @param modelFactory the ModelFactory used to instantiate the model that gets returned. + * @param contexts The contexts to add the data to. If one or more contexts are specified the data is added to + * these contexts, ignoring any context information in the data itself. + * @return A {@link Model} containing the parsed statements. + * @throws IOException If an I/O error occurred while reading from the reader. + * @throws UnsupportedRDFormatException If no {@link RDFParser} is available for the specified RDF format. + * @throws RDFParseException If an error was found while parsing the RDF data. + */ + public static Model parse(Reader reader, String baseURI, RDFFormat dataFormat, ParserConfig settings, + ValueFactory valueFactory, ParseErrorListener errors, ModelFactory modelFactory, Resource... contexts) + throws IOException, RDFParseException, UnsupportedRDFormatException { + Model result = modelFactory.createEmptyModel(); RDFParser parser = createParser(dataFormat, valueFactory); parser.setParserConfig(settings); parser.setParseErrorListener(errors); parser.setRDFHandler(new ContextStatementCollector(result, valueFactory, contexts)); - // LinkedHashModel and ContextStatementCollector should not throw + // Model and ContextStatementCollector should not throw // RDFHandlerException exceptions parser.parse(reader, baseURI); return result; @@ -307,7 +363,7 @@ public static Model parse(Reader reader, String baseURI, RDFFormat dataFormat, P * Writes the given statements to the given {@link OutputStream} in the given format. *

    * If the collection is a {@link Model}, its namespaces will also be written. - * + * * @param model A collection of statements, such as a {@link Model}, to be written. * @param output The {@link OutputStream} to write the statements to. * @param dataFormat The {@link RDFFormat} to use when writing the statements. @@ -323,7 +379,7 @@ public static void write(Iterable model, OutputStream output, RDFForm * Writes the given statements to the given {@link OutputStream} in the given format. *

    * If the collection is a {@link Model}, its namespaces will also be written. - * + * * @param model A collection of statements, such as a {@link Model}, to be written. * @param output The {@link OutputStream} to write the statements to. * @param baseURI The base URI to relativize IRIs against. @@ -341,7 +397,7 @@ public static void write(Iterable model, OutputStream output, String * Writes the given statements to the given {@link Writer} in the given format. *

    * If the collection is a {@link Model}, its namespaces will also be written. - * + * * @param model A collection of statements, such as a {@link Model}, to be written. * @param output The {@link Writer} to write the statements to. * @param dataFormat The {@link RDFFormat} to use when writing the statements. @@ -357,7 +413,7 @@ public static void write(Iterable model, Writer output, RDFFormat dat * Writes the given statements to the given {@link Writer} in the given format. *

    * If the collection is a {@link Model}, its namespaces will also be written. - * + * * @param model A collection of statements, such as a {@link Model}, to be written. * @param output The {@link Writer} to write the statements to. * @param baseURI The base URI to relativize IRIs against. @@ -375,7 +431,7 @@ public static void write(Iterable model, Writer output, String baseUR * Writes the given statements to the given {@link OutputStream} in the given format. *

    * If the collection is a {@link Model}, its namespaces will also be written. - * + * * @param model A collection of statements, such as a {@link Model}, to be written. * @param output The {@link OutputStream} to write the statements to. * @param dataFormat The {@link RDFFormat} to use when writing the statements. @@ -394,7 +450,7 @@ public static void write(Iterable model, OutputStream output, RDFForm * Writes the given statements to the given {@link OutputStream} in the given format. *

    * If the collection is a {@link Model}, its namespaces will also be written. - * + * * @param model A collection of statements, such as a {@link Model}, to be written. * @param output The {@link OutputStream} to write the statements to. * @param baseURI The base URI to relativize IRIs against. @@ -415,7 +471,7 @@ public static void write(Iterable model, OutputStream output, String * Writes the given statements to the given {@link Writer} in the given format. *

    * If the collection is a {@link Model}, its namespaces will also be written. - * + * * @param model A collection of statements, such as a {@link Model}, to be written. * @param output The {@link Writer} to write the statements to. * @param dataFormat The {@link RDFFormat} to use when writing the statements. @@ -434,7 +490,7 @@ public static void write(Iterable model, Writer output, RDFFormat dat * Writes the given statements to the given {@link Writer} in the given format. *

    * If the collection is a {@link Model}, its namespaces will also be written. - * + * * @param model A collection of statements, such as a {@link Model}, to be written. * @param output The {@link Writer} to write the statements to. * @param baseURI The base URI to relativize IRIs against. @@ -455,7 +511,7 @@ public static void write(Iterable model, Writer output, String baseUR * Writes the given statements to the given {@link RDFHandler}. *

    * If the collection is a {@link Model}, its namespaces will also be written. - * + * * @param model A collection of statements, such as a {@link Model}, to be written. * @param writer * @throws RDFHandlerException Thrown if there is an error writing the statements. @@ -478,7 +534,7 @@ public static void write(Iterable model, RDFHandler writer) throws RD /** * Writes the given statement to the given {@link OutputStream} in the given format. *

    - * + * * @param st The statement to be written. * @param output The {@link OutputStream} to write the statement to. * @param dataFormat The {@link RDFFormat} to use when writing the statement. @@ -491,7 +547,7 @@ public static void write(Statement st, OutputStream output, RDFFormat dataFormat /** * Writes the given single statement to the given {@link OutputStream} in the given format. - * + * * @param st The statement to be written. * @param output The {@link OutputStream} to write the statement to. * @param dataFormat The {@link RDFFormat} to use when writing the statement. @@ -509,7 +565,7 @@ public static void write(Statement st, OutputStream output, RDFFormat dataFormat /** * Writes the given single statement to the given {@link Writer} in the given format. *

    - * + * * @param statement A statement to be written. * @param output The {@link Writer} to write the statement to. * @param dataFormat The {@link RDFFormat} to use when writing the statement. @@ -523,7 +579,7 @@ public static void write(Statement statement, Writer output, RDFFormat dataForma /** * Writes the given single statement to the given {@link Writer} in the given format. *

    - * + * * @param statement A statement to be written. * @param output The {@link Writer} to write the statement to. * @param dataFormat The {@link RDFFormat} to use when writing the statement. @@ -541,7 +597,7 @@ public static void write(Statement statement, Writer output, RDFFormat dataForma /** * Writes the given single statement to the given {@link RDFHandler}. *

    - * + * * @param statement A statement, to be written. * @param writer * @throws RDFHandlerException Thrown if there is an error writing the statement. @@ -575,7 +631,7 @@ public static void main(String[] args) /** * Helper method to use to create a lambda for {@link Optional#orElseThrow(Supplier)} to indicate a format is * unsupported. - * + * * @param unsupportedFormat The format that was not found. * @return A lambda that can be used to generate an exception if the format is not found. */ @@ -586,7 +642,7 @@ public static Supplier unsupportedFormat(RDFFormat /** * Helper method to use to create a lambda for {@link Optional#orElseThrow(Supplier)} to indicate a format is * unsupported. - * + * * @param unsupportedFormat The format that was not found. * @return A lambda that can be used to generate an exception if the format is not found. */ diff --git a/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/RioConfig.java b/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/RioConfig.java index 1eec1725712..94f47b9759a 100644 --- a/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/RioConfig.java +++ b/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/RioConfig.java @@ -28,7 +28,7 @@ * by every type of {@link RioSetting}: boolean values, strings, and numeric (long) values are supported, but more * complex types are not

  • * - * + * * @author Peter Ansell * @see RioSetting */ @@ -52,7 +52,7 @@ public class RioConfig implements Serializable { protected final Logger log = LoggerFactory.getLogger(this.getClass()); /** - * + * */ public RioConfig() { super(); @@ -60,7 +60,7 @@ public RioConfig() { /** * Return the value for a given {@link RioSetting} or the default value if it has not been set. - * + * * @param setting The {@link RioSetting} to fetch a value for. * @return The value for the parser setting, or the default value if it is not set. */ @@ -95,7 +95,7 @@ public T get(RioSetting setting) { /** * Sets a {@link RioSetting} to have a new value. If the value is null, the parser setting is removed and the * default will be used instead. - * + * * @param setting The setting to set a new value for. * @param value The value for the parser setting, or null to reset the parser setting to use the default value. * @return Either a copy of this config, if it is immutable, or this object, to allow chaining of method calls. @@ -125,7 +125,7 @@ public RioConfig set(RioSetting setting, T value) { * Checks for whether a {@link RioSetting} has been explicitly set by a user. *

    * A setting can be set via {@link RioConfig#set(RioSetting, Object)}, or via use of a system property. - * + * * @param setting The setting to check for. * @return True if the setting has been explicitly set, or false otherwise. */ @@ -140,7 +140,7 @@ private boolean hasSystemPropertyOverride(RioSetting setting) { /** * Resets all settings back to their default values. - * + * * @return Either a copy of this config, if it is immutable, or this object, to allow chaining of method calls. */ public RioConfig useDefaults() { @@ -148,4 +148,4 @@ public RioConfig useDefaults() { systemPropertyCache.clear(); return this; } -} \ No newline at end of file +} diff --git a/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/RioSetting.java b/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/RioSetting.java index d66c7e0a87d..2b8d60085a2 100644 --- a/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/RioSetting.java +++ b/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/RioSetting.java @@ -13,35 +13,35 @@ /** * Identifies a parser setting along with its default value. - * + * * @author Peter Ansell */ public interface RioSetting extends Serializable { /** * A unique key for this parser setting. - * + * * @return A unique key identifying this parser setting. */ String getKey(); /** * The human readable name for this parser setting - * + * * @return The name for this parser setting. */ String getDescription(); /** * Returns the default value for this parser setting if it is not set by a user. - * + * * @return The default value for this parser setting. */ T getDefaultValue(); /** * Attempts to convert from a string to a type-safe representation based on the generic type of this setting. - * + * * @param stringRepresentation a string representation of a value for this setting. * @return The corresponding object of type T for the supplied string value. * @throws RioConfigurationException if the setting type does not provide conversion from a string to the expected diff --git a/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/UnsupportedRDFormatException.java b/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/UnsupportedRDFormatException.java index 21be23af48b..e66d48b3aec 100644 --- a/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/UnsupportedRDFormatException.java +++ b/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/UnsupportedRDFormatException.java @@ -10,7 +10,7 @@ /** * A RuntimeException indicating that a specific RDF format is not supported. A typical cause of this exception is that * the class library for the specified RDF format is not present in the classpath. - * + * * @author jeen */ public class UnsupportedRDFormatException extends RuntimeException { @@ -19,7 +19,7 @@ public class UnsupportedRDFormatException extends RuntimeException { /** * Creates a new UnsupportedRDFormatException. - * + * * @param msg An error message. */ public UnsupportedRDFormatException(String msg) { @@ -28,7 +28,7 @@ public UnsupportedRDFormatException(String msg) { /** * Creates a new UnsupportedRDFormatException. - * + * * @param cause The cause of the exception. */ public UnsupportedRDFormatException(Throwable cause) { @@ -37,7 +37,7 @@ public UnsupportedRDFormatException(Throwable cause) { /** * Creates a new UnsupportedRDFormatException wrapping another exception. - * + * * @param msg An error message. * @param cause The cause of the exception. */ diff --git a/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/WriterConfig.java b/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/WriterConfig.java index 867ebb4a55f..c55e0d4f65d 100644 --- a/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/WriterConfig.java +++ b/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/WriterConfig.java @@ -11,7 +11,7 @@ /** * A container object for easy setting and passing of {@link RDFWriter} configuration options. - * + * * @author Jeen Broekstra * @author Peter Ansell */ diff --git a/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/helpers/AbstractRDFParser.java b/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/helpers/AbstractRDFParser.java index 772c9723e84..da6a55d219a 100644 --- a/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/helpers/AbstractRDFParser.java +++ b/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/helpers/AbstractRDFParser.java @@ -40,7 +40,7 @@ /** * Base class for {@link RDFParser}s offering common functionality for RDF parsers. - * + * * @author Arjohn Kampman */ public abstract class AbstractRDFParser implements RDFParser { @@ -71,6 +71,8 @@ public abstract class AbstractRDFParser implements RDFParser { */ protected ValueFactory valueFactory; + private ValueFactory originalValueFactory; + /** * The base URI for resolving relative URIs. */ @@ -107,7 +109,7 @@ protected AbstractRDFParser() { /** * Creates a new RDFParserBase that will use the supplied ValueFactory to create RDF model objects. - * + * * @param valueFactory A ValueFactory. */ protected AbstractRDFParser(ValueFactory valueFactory) { @@ -130,6 +132,7 @@ protected AbstractRDFParser(ValueFactory valueFactory) { @Override public RDFParser setValueFactory(ValueFactory valueFactory) { this.valueFactory = valueFactory; + this.originalValueFactory = valueFactory; return this; } @@ -318,12 +321,13 @@ protected void setNamespace(String prefix, String namespace) { /** * Gets the namespace that is associated with the specified prefix or throws an {@link RDFParseException}. - * + * * @throws RDFParseException if no namespace is associated with this prefix */ protected String getNamespace(String prefix) throws RDFParseException { - if (namespaceTable.containsKey(prefix)) + if (namespaceTable.containsKey(prefix)) { return namespaceTable.get(prefix); + } String msg = "Namespace prefix '" + prefix + "' used but not defined"; if ("".equals(prefix)) { @@ -342,6 +346,12 @@ protected void clear() { baseURI = null; nextBNodePrefix = createUniqueBNodePrefix(); namespaceTable.clear(); + // Don't use the setter setValueFactory() as it will update originalValueFactory too + if (getParserConfig().get(BasicParserSettings.PROCESS_ENCODED_RDF_STAR)) { + valueFactory = new RDFStarDecodingValueFactory(originalValueFactory); + } else { + valueFactory = originalValueFactory; + } initializeNamespaceTableFromConfiguration(); } @@ -356,7 +366,7 @@ protected void initializeNamespaceTableFromConfiguration() { * Clears the map that keeps track of blank nodes that have been parsed. Normally, this map is clear when the * document has been parsed completely, but subclasses can clear the map at other moments too, for example when a * bnode scope ends. - * + * * @deprecated Map is no longer used, call {@link #clear()} instead. */ @Deprecated @@ -521,7 +531,7 @@ protected Literal createLiteral(String label, String lang, IRI datatype) throws /** * Creates a {@link Literal} object with the supplied parameters, using the lineNo and columnNo to enhance error * messages or exceptions that may be generated during the creation of the literal. - * + * * @see org.eclipse.rdf4j.rio.helpers.RDFParserHelper#createLiteral(String, String, IRI, ParserConfig, * ParseErrorListener, ValueFactory, long, long) */ @@ -566,7 +576,7 @@ protected void reportLocation(long lineNo, long columnNo) { /** * Reports a warning to the registered ParseErrorListener, if any. This method simply calls - * {@link #reportWarning(String,long,long)} supplying -1 for the line- and column number. + * {@link #reportWarning(String, long, long)} supplying -1 for the line- and column number. */ protected void reportWarning(String msg) { reportWarning(msg, -1, -1); @@ -587,7 +597,7 @@ protected void reportWarning(String msg, long lineNo, long columnNo) { *

    * This method also throws an {@link RDFParseException} when the given setting has been set to true and it * is not a nonFatalError. - * + * * @param msg The message to use for {@link ParseErrorListener#error(String, long, long)} and for * {@link RDFParseException#RDFParseException(String, long, long)} . * @param relevantSetting The boolean setting that will be checked to determine if this is an issue that we need to @@ -607,7 +617,7 @@ protected void reportError(String msg, RioSetting relevantSetting) thro *

    * This method also throws an {@link RDFParseException} when the given setting has been set to true and it * is not a nonFatalError. - * + * * @param msg The message to use for {@link ParseErrorListener#error(String, long, long)} and for * {@link RDFParseException#RDFParseException(String, long, long)} . * @param lineNo Optional line number, should default to setting this as -1 if not known. Used for @@ -634,7 +644,7 @@ protected void reportError(String msg, long lineNo, long columnNo, RioSetting * This method also throws an {@link RDFParseException} when the given setting has been set to true and it * is not a nonFatalError. - * + * * @param e The exception whose message will be used for * {@link ParseErrorListener#error(String, long, long)} and for * {@link RDFParseException#RDFParseException(String, long, long)} . @@ -655,7 +665,7 @@ protected void reportError(Exception e, RioSetting relevantSetting) thr *

    * This method also throws an {@link RDFParseException} when the given setting has been set to true and it * is not a nonFatalError. - * + * * @param e The exception whose message will be used for * {@link ParseErrorListener#error(String, long, long)} and for * {@link RDFParseException#RDFParseException(String, long, long)} . @@ -683,7 +693,7 @@ protected void reportError(Exception e, long lineNo, long columnNo, RioSetting * This method also throws an {@link RDFParseException} when the given setting has been set to true and it * is not a nonFatalError. - * + * * @param msg The message to use for {@link ParseErrorListener#error(String, long, long)} and for * {@link RDFParseException#RDFParseException(String, long, long)} . * @param e The exception whose message will be used for @@ -709,7 +719,7 @@ protected void reportError(String msg, Exception e, long lineNo, long columnNo, /** * Reports a fatal error to the registered ParseErrorListener, if any, and throws a ParseException - * afterwards. This method simply calls {@link #reportFatalError(String,long,long)} supplying -1 for the + * afterwards. This method simply calls {@link #reportFatalError(String, long, long)} supplying -1 for the * line- and column number. */ protected void reportFatalError(String msg) throws RDFParseException { @@ -731,7 +741,7 @@ protected void reportFatalError(String msg, long lineNo, long columnNo) throws R * to the ParseErrorListener, assuming that it has already been reported when the original ParseException was * thrown. *

    - * This method simply calls {@link #reportFatalError(Exception,long,long)} supplying -1 for the line- and + * This method simply calls {@link #reportFatalError(Exception, long, long)} supplying -1 for the line- and * column number. */ protected void reportFatalError(Exception e) throws RDFParseException { diff --git a/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/helpers/AbstractRDFWriter.java b/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/helpers/AbstractRDFWriter.java index 29aaebf05bb..46150558598 100644 --- a/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/helpers/AbstractRDFWriter.java +++ b/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/helpers/AbstractRDFWriter.java @@ -7,10 +7,19 @@ *******************************************************************************/ package org.eclipse.rdf4j.rio.helpers; +import java.io.OutputStream; import java.util.Collection; import java.util.Collections; +import java.util.LinkedHashMap; import java.util.Map; +import java.util.Optional; +import java.util.function.Consumer; +import org.eclipse.rdf4j.model.Resource; +import org.eclipse.rdf4j.model.Statement; +import org.eclipse.rdf4j.model.Triple; +import org.eclipse.rdf4j.model.Value; +import org.eclipse.rdf4j.model.util.Statements; import org.eclipse.rdf4j.rio.RDFHandlerException; import org.eclipse.rdf4j.rio.RDFWriter; import org.eclipse.rdf4j.rio.RioSetting; @@ -18,7 +27,7 @@ /** * Base class for {@link RDFWriter}s offering common functionality for RDF writers. - * + * * @author Peter Ansell */ public abstract class AbstractRDFWriter implements RDFWriter { @@ -26,17 +35,33 @@ public abstract class AbstractRDFWriter implements RDFWriter { /** * Mapping from namespace prefixes to namespace names. */ - protected Map namespaceTable; + protected Map namespaceTable = new LinkedHashMap<>(); /** * A collection of configuration options for this writer. */ private WriterConfig writerConfig = new WriterConfig(); + private boolean writingStarted; + + private final OutputStream outputStream; + + protected Consumer statementConsumer; + /** * Default constructor. */ protected AbstractRDFWriter() { + this(null); + } + + protected AbstractRDFWriter(OutputStream out) { + this.outputStream = out; + } + + @Override + public Optional getOutputStream() { + return Optional.ofNullable(outputStream); } @Override @@ -68,4 +93,75 @@ public RDFWriter set(RioSetting setting, T value) { getWriterConfig().set(setting, value); return this; } + + @Override + public void startRDF() throws RDFHandlerException { + if (writingStarted) { + throw new RDFHandlerException("Document writing has already started"); + } + + writingStarted = true; + + statementConsumer = this::consumeStatement; + if (getWriterConfig().get(BasicWriterSettings.CONVERT_RDF_STAR_TO_REIFICATION)) { + // All writers can convert RDF* to reification on request + statementConsumer = this::handleStatementConvertRDFStar; + } else if (!getRDFFormat().supportsRDFStar() && getWriterConfig().get(BasicWriterSettings.ENCODE_RDF_STAR)) { + // By default non-RDF* writers encode RDF* to special RDF IRIs + // (all parsers, including RDF* will convert back the encoded IRIs) + statementConsumer = this::handleStatementEncodeRDFStar; + } + } + + @Override + public void handleStatement(Statement st) throws RDFHandlerException { + checkWritingStarted(); + statementConsumer.accept(st); + } + + /** + * Consume a statement. + * + * Extending classes must override this method instead of overriding {@link #handleStatement(Statement)} in order to + * benefit from automatic handling of RDF* conversion or encoding. + * + * @param st the statement to consume. + */ + protected void consumeStatement(Statement st) { + // this method intended to be abstract, implemented as no-op to provide basic backward compatibility. + } + + /** + * See if writing has started + * + * @return {@code true} if writing has started, {@code false} otherwise + */ + protected boolean isWritingStarted() { + return writingStarted; + } + + /** + * Verify that writing has started. + * + * @throws RDFHandlerException if writing has not yet started. + */ + protected void checkWritingStarted() { + if (!writingStarted) { + throw new RDFHandlerException("Document writing has not started yet"); + } + } + + private void handleStatementConvertRDFStar(Statement st) { + Statements.convertRDFStarToReification(st, this::consumeStatement); + } + + private void handleStatementEncodeRDFStar(Statement st) { + Resource s = st.getSubject(); + Value o = st.getObject(); + if (s instanceof Triple || o instanceof Triple) { + consumeStatement(new RDFStarEncodingStatement(st)); + } else { + consumeStatement(st); + } + } } diff --git a/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/helpers/AbstractRioSetting.java b/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/helpers/AbstractRioSetting.java index 3b02198bb78..f3ae4e2c38f 100644 --- a/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/helpers/AbstractRioSetting.java +++ b/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/helpers/AbstractRioSetting.java @@ -13,7 +13,7 @@ /** * Base class for {@link RioSetting}. Includes base functionality for reading default values from system properties. - * + * * @author Jeen Broekstra * @param the setting type */ @@ -39,7 +39,7 @@ public abstract class AbstractRioSetting implements RioSetting { /** * Create a new setting object that will be used to reference the given setting. - * + * * @param key A unique key to use for this setting. * @param description A short human-readable description for this setting. * @param defaultValue An immutable value specifying the default for this setting. This can be optionally be diff --git a/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/helpers/BasicParserSettings.java b/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/helpers/BasicParserSettings.java index 381ead4d36b..735d22baf51 100644 --- a/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/helpers/BasicParserSettings.java +++ b/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/helpers/BasicParserSettings.java @@ -28,7 +28,7 @@ /** * A class encapsulating the basic parser settings that most parsers may support. - * + * * @author Peter Ansell */ public class BasicParserSettings { @@ -40,6 +40,7 @@ public class BasicParserSettings { * @see http://www.w3.org/2013/json-ld-context/rdfa11 */ private static final Set _DEFAULT_PREFIX; + static { Set aNamespaces = new HashSet<>(); @@ -255,7 +256,7 @@ public class BasicParserSettings { *

    * Defaults to {@link LargeLiteralHandling#PRESERVE}. */ - public static final RioSetting LARGE_LITERALS_HANDLING = new RioSettingImpl( + public static final RioSetting LARGE_LITERALS_HANDLING = new RioSettingImpl<>( "org.eclipse.rdf4j.rio.large_literals", "Large literals handling", LargeLiteralHandling.PRESERVE); /** @@ -288,9 +289,24 @@ public class BasicParserSettings { * Defaults to this list. *

    */ - public static final RioSetting> NAMESPACES = new RioSettingImpl>( + public static final RioSetting> NAMESPACES = new RioSettingImpl<>( "org.eclipse.rdf4j.rio.namespaces", "Collection of default namespaces to use for parsing", _DEFAULT_PREFIX); + /** + * Boolean setting for parser to determine whether it should process RDF* triples encoded as RDF-compatible special + * IRIs back to RDF* values. These IRIs start with urn:rdf4j:triple: followed by the base64-encoding of the + * N-Triples serialization of the RDF* triple value. + *

    + * Parsers that support RDF* natively will honour this setting too. + *

    + * Defaults to true. + *

    + * Can be overridden by setting system property {@code org.eclipse.rdf4j.rio.process_encoded_rdf_star}. + */ + public static final RioSetting PROCESS_ENCODED_RDF_STAR = new BooleanRioSetting( + "org.eclipse.rdf4j.rio.process_encoded_rdf_star", + "Converts RDF* triples encoded as RDF-compatible IRIs back to triple values", Boolean.TRUE); + static { List defaultDatatypeHandlers = new ArrayList<>(5); try { diff --git a/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/helpers/BasicWriterSettings.java b/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/helpers/BasicWriterSettings.java index 57e492b29d0..ac46dce550a 100644 --- a/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/helpers/BasicWriterSettings.java +++ b/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/helpers/BasicWriterSettings.java @@ -11,7 +11,7 @@ /** * A class encapsulating the basic writer settings that most writers may support. - * + * * @author Peter Ansell */ public class BasicWriterSettings { @@ -88,6 +88,31 @@ public class BasicWriterSettings { public static final RioSetting BASE_DIRECTIVE = new BooleanRioSetting( "org.eclipse.rdf4j.rio.base_directive", "Serialize base directive", Boolean.TRUE); + /** + * Boolean setting for writer to determine whether it should convert RDF* statements to standard RDF reification. + *

    + * Defaults to false + *

    + * Can be overridden by setting system property {@code org.eclipse.rdf4j.rio.convert_rdf_star}. + */ + public static final RioSetting CONVERT_RDF_STAR_TO_REIFICATION = new BooleanRioSetting( + "org.eclipse.rdf4j.rio.convert_rdf_star", "Convert RDF* statements to RDF reification", Boolean.FALSE); + + /** + * Boolean setting for writer to determine whether it should encode RDF* triple values to RDF-compatible special + * IRIs. These IRIs start with urn:rdf4j:triple: followed by the base64-encoding of the N-Triples serialization of + * the RDF* triple value. + *

    + * Writers that support RDF* natively will ignore this setting and always serialize RDF* triples. + *

    + * Defaults to true. + *

    + * Can be overridden by setting system property {@code org.eclipse.rdf4j.rio.encode_rdf_star}. + */ + public static final RioSetting ENCODE_RDF_STAR = new BooleanRioSetting( + "org.eclipse.rdf4j.rio.encode_rdf_star", + "Encodes RDF* triples to special IRIs for compatibility with RDF", Boolean.TRUE); + /** * Private default constructor. */ diff --git a/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/helpers/BooleanRioSetting.java b/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/helpers/BooleanRioSetting.java index ac7e5dbbf09..92415a7e34c 100644 --- a/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/helpers/BooleanRioSetting.java +++ b/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/helpers/BooleanRioSetting.java @@ -12,7 +12,7 @@ /** * A {@link RioSetting} with a {@link Boolean} value. The given default for the setting can be overridden by means of a * System property with a name equal to the setting key, and a string value of "true" or "false" (ignoring case). - * + * * @author Jeen Broekstra */ public class BooleanRioSetting extends AbstractRioSetting { @@ -21,7 +21,7 @@ public class BooleanRioSetting extends AbstractRioSetting { /** * Creates a new boolean {@link RioSetting}. - * + * * @param key A unique key to use for this setting. * @param description A short human-readable description for this setting. * @param defaultValue An immutable value specifying the default for this setting. @@ -32,7 +32,7 @@ public BooleanRioSetting(String key, String description, Boolean defaultValue) { /** * Converts a String to a Boolean - * + * * @return a Boolean representing the supplied string value. Iff the string value is "true" (ignoring case), the * returned Boolean will be {@code true}, otherwise {@code false}. */ diff --git a/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/helpers/BufferedGroupingRDFHandler.java b/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/helpers/BufferedGroupingRDFHandler.java index b5206232a88..1f16b2b8948 100644 --- a/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/helpers/BufferedGroupingRDFHandler.java +++ b/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/helpers/BufferedGroupingRDFHandler.java @@ -21,7 +21,7 @@ /** * An {@link RDFHandlerWrapper} that buffers statements internally and passes them to underlying handlers grouped by * context, then subject, then predicate. - * + * * @author Jeen Broekstra */ public class BufferedGroupingRDFHandler extends RDFHandlerWrapper { @@ -41,7 +41,7 @@ public class BufferedGroupingRDFHandler extends RDFHandlerWrapper { /** * Creates a new BufferedGroupedWriter that wraps the supplied handlers, using the default buffer size. - * + * * @param handlers one or more wrapped RDFHandlers */ public BufferedGroupingRDFHandler(RDFHandler... handlers) { @@ -50,7 +50,7 @@ public BufferedGroupingRDFHandler(RDFHandler... handlers) { /** * Creates a new BufferedGroupedWriter that wraps the supplied handlers, using the supplied buffer size. - * + * * @param bufferSize size of the buffer expressed in number of RDF statements * @param handlers one or more wrapped RDFHandlers */ @@ -85,7 +85,7 @@ private void processBuffer() throws RDFHandlerException { Set processedPredicates = new HashSet<>(); // give rdf:type preference over other predicates. - for (Statement typeStatement : contextData.filter(subject, RDF.TYPE, null)) { + for (Statement typeStatement : contextData.getStatements(subject, RDF.TYPE, null)) { super.handleStatement(typeStatement); } @@ -93,10 +93,10 @@ private void processBuffer() throws RDFHandlerException { // retrieve other statement from this context with the same // subject, and output them grouped by predicate - for (Statement subjectStatement : contextData.filter(subject, null, null)) { + for (Statement subjectStatement : contextData.getStatements(subject, null, null)) { IRI predicate = subjectStatement.getPredicate(); if (!processedPredicates.contains(predicate)) { - for (Statement toWrite : contextData.filter(subject, predicate, null)) { + for (Statement toWrite : contextData.getStatements(subject, predicate, null)) { super.handleStatement(toWrite); } processedPredicates.add(predicate); diff --git a/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/helpers/ClassRioSetting.java b/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/helpers/ClassRioSetting.java index c0a543cc49b..824ae8041f9 100644 --- a/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/helpers/ClassRioSetting.java +++ b/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/helpers/ClassRioSetting.java @@ -12,7 +12,7 @@ /** * A {@link RioSetting} with a {@link Class} value. The given default for the setting can be overridden by means of a * system property with a name equal to the setting key. - * + * * @author Bart Hanssens */ public class ClassRioSetting extends AbstractRioSetting { diff --git a/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/helpers/CodePointIterator.java b/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/helpers/CodePointIterator.java index d38a436d093..66e24448b1c 100644 --- a/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/helpers/CodePointIterator.java +++ b/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/helpers/CodePointIterator.java @@ -12,7 +12,7 @@ /** * Helper class for quickly iterating over a String and receiving each character code point (taking care to handle * surrogate pairs correctly). - * + * * @author Jeen Broekstra * @see CodePointSequence */ diff --git a/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/helpers/CodePointSequence.java b/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/helpers/CodePointSequence.java index 1615954982b..cc205c7ae56 100644 --- a/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/helpers/CodePointSequence.java +++ b/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/helpers/CodePointSequence.java @@ -11,7 +11,7 @@ /** * Helper class for working with Strings as sequences of Unicode code points. - * + * * @author Jeen Broekstra * @see CodePointIterator */ diff --git a/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/helpers/ContextStatementCollector.java b/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/helpers/ContextStatementCollector.java index 2fa72e2ac97..213b1fbef78 100644 --- a/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/helpers/ContextStatementCollector.java +++ b/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/helpers/ContextStatementCollector.java @@ -22,7 +22,7 @@ /** * A RDFHandler that can be used to collect reported statements in collections. - * + * * @author Arjohn Kampman */ public class ContextStatementCollector extends AbstractRDFHandler { @@ -48,7 +48,7 @@ public class ContextStatementCollector extends AbstractRDFHandler { * LinkedHashMap to store the reported namespaces. */ public ContextStatementCollector(ValueFactory vf, Resource... contexts) { - this(new ArrayList(), vf, contexts); + this(new ArrayList<>(), vf, contexts); } /** diff --git a/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/helpers/JSONLDMode.java b/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/helpers/JSONLDMode.java index 094a14ce25e..172ffdd29e3 100644 --- a/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/helpers/JSONLDMode.java +++ b/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/helpers/JSONLDMode.java @@ -9,7 +9,7 @@ /** * Specifies constants to identify various modes that are relevant to JSONLD documents. - * + * * @author Peter Ansell * @see JSONLD Features */ diff --git a/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/helpers/JSONLDSettings.java b/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/helpers/JSONLDSettings.java index 8f5acad2515..ebb262c9527 100644 --- a/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/helpers/JSONLDSettings.java +++ b/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/helpers/JSONLDSettings.java @@ -13,7 +13,7 @@ /** * Settings that can be passed to JSONLD Parsers and Writers. - * + * * @author Peter Ansell * @see JSONLD Data Structures */ @@ -26,7 +26,7 @@ public class JSONLDSettings { * Defaults to true. *

    * Can be overridden by setting system property {@code org.eclipse.rdf4j.rio.jsonld.compact_arrays}. - * + * * @see JSONLD Data Structures */ public static final RioSetting COMPACT_ARRAYS = new BooleanRioSetting( @@ -36,7 +36,7 @@ public class JSONLDSettings { * If specified, it is used to retrieve remote documents and contexts; otherwise the processor's built-in loader is * used. */ - public static final RioSetting DOCUMENT_LOADER = new ClassRioSetting( + public static final RioSetting DOCUMENT_LOADER = new ClassRioSetting<>( "org.eclipse.rdf4j.rio.jsonld.document_loader", "Document loader", null); /** @@ -47,7 +47,7 @@ public class JSONLDSettings { * Defaults to false. *

    * Can be overridden by setting system property {@code org.eclipse.rdf4j.rio.jsonld.optimize}. - * + * * @see JSONLD Data Structures */ public static final RioSetting OPTIMIZE = new BooleanRioSetting("org.eclipse.rdf4j.rio.jsonld.optimize", @@ -55,14 +55,14 @@ public class JSONLDSettings { /** * If set to true, the JSON-LD processor may emit blank nodes for triple predicates, otherwise they will be omitted. - * + * * Note: the use of blank node identifiers to label properties is obsolete, and may be removed in a future version * of JSON-LD, *

    * Defaults to false. *

    * Can be overridden by setting system property {@code org.eclipse.rdf4j.rio.jsonld.produce_generalized_rdf}. - * + * * @see JSONLD Data Structures */ public static final RioSetting PRODUCE_GENERALIZED_RDF = new BooleanRioSetting( @@ -76,7 +76,7 @@ public class JSONLDSettings { * Defaults to false for RDF compatibility. *

    * Can be overridden by setting system property {@code org.eclipse.rdf4j.rio.jsonld.use_native_types}. - * + * * @see JSONLD Data Structures */ public static final RioSetting USE_NATIVE_TYPES = new BooleanRioSetting( @@ -89,7 +89,7 @@ public class JSONLDSettings { * Defaults to false. *

    * Can be overridden by setting system property {@code org.eclipse.rdf4j.rio.jsonld.use_rdf_type}. - * + * * @see JSONLD Data Structures */ public static final RioSetting USE_RDF_TYPE = new BooleanRioSetting( @@ -99,10 +99,10 @@ public class JSONLDSettings { * The {@link JSONLDMode} that the writer will use to reorganise the JSONLD document after it is created. *

    * Defaults to {@link JSONLDMode#EXPAND} to provide maximum RDF compatibility. - * + * * @see JSONLD Features */ - public static final RioSetting JSONLD_MODE = new RioSettingImpl( + public static final RioSetting JSONLD_MODE = new RioSettingImpl<>( "org.eclipse.rdf4j.rio.jsonld_mode", "JSONLD Mode", JSONLDMode.EXPAND); /** diff --git a/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/helpers/LargeLiteralHandling.java b/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/helpers/LargeLiteralHandling.java index 98c38e2f946..bf15daa1f23 100644 --- a/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/helpers/LargeLiteralHandling.java +++ b/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/helpers/LargeLiteralHandling.java @@ -10,7 +10,7 @@ /** * An enumeration used to define constants used with the {@link BasicParserSettings#LARGE_LITERALS_HANDLING} parser * setting. - * + * * @author Peter Ansell */ public enum LargeLiteralHandling { diff --git a/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/helpers/LongRioSetting.java b/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/helpers/LongRioSetting.java index d4b3a59a1af..eb55eacaac5 100644 --- a/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/helpers/LongRioSetting.java +++ b/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/helpers/LongRioSetting.java @@ -12,7 +12,7 @@ /** * A {@link RioSetting} with a {@link Long} value. The given default for the setting can be overriden by means of a * system property with a name equal to the setting key. - * + * * @author Jeen Broekstra */ public class LongRioSetting extends AbstractRioSetting { diff --git a/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/helpers/NTriplesParserSettings.java b/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/helpers/NTriplesParserSettings.java index 1906f7c1353..ac11ba72a96 100644 --- a/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/helpers/NTriplesParserSettings.java +++ b/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/helpers/NTriplesParserSettings.java @@ -13,7 +13,7 @@ * ParserSettings for the N-Triples parser features. *

    * Several of these settings can be overridden by means of a system property, but only if specified at JVM startup time. - * + * * @author Peter Ansell */ public class NTriplesParserSettings { @@ -36,7 +36,7 @@ public class NTriplesParserSettings { * Defaults to true. *

    * Can be overridden by setting system property {@code org.eclipse.rdf4j.rio.ntriples.fail_on_invalid_lines} - * + * * @deprecated use {@link #FAIL_ON_INVALID_LINES} instead. */ @Deprecated diff --git a/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/helpers/NTriplesUtil.java b/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/helpers/NTriplesUtil.java new file mode 100644 index 00000000000..2ac408dc15d --- /dev/null +++ b/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/helpers/NTriplesUtil.java @@ -0,0 +1,886 @@ +/******************************************************************************* + * Copyright (c) 2015 Eclipse RDF4J contributors, Aduna, and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Distribution License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ +package org.eclipse.rdf4j.rio.helpers; + +import java.io.IOException; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import org.eclipse.rdf4j.common.text.ASCIIUtil; +import org.eclipse.rdf4j.common.text.StringUtil; +import org.eclipse.rdf4j.model.BNode; +import org.eclipse.rdf4j.model.IRI; +import org.eclipse.rdf4j.model.Literal; +import org.eclipse.rdf4j.model.Resource; +import org.eclipse.rdf4j.model.Triple; +import org.eclipse.rdf4j.model.Value; +import org.eclipse.rdf4j.model.ValueFactory; +import org.eclipse.rdf4j.model.util.Literals; +import org.eclipse.rdf4j.model.vocabulary.XMLSchema; + +/** + * Utility methods for N-Triples encoding/decoding. + */ +public class NTriplesUtil { + /* + * The following correspond to the N-Triples grammar (https://www.w3.org/TR/n-triples/#n-triples-grammar). + */ + private static String PN_CHARS_BASE = "[A-Za-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF" + + "\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD" + + "\uD800\uDC00-\uDB7F\uDFFF]"; // <- \u10000-\uEFFFF expressed with surrogate pairs + private static String PN_CHARS_U = "(?:" + PN_CHARS_BASE + "|_)"; + private static String PN_CHARS = "(?:" + PN_CHARS_U + "|[0-9\u0300-\u036F\u203F-\u2040\u00B7-])"; + private static String BNODE_ID = "(?:" + PN_CHARS_U + "|[0-9])(?:(?:" + PN_CHARS + "|\\.)*" + PN_CHARS + ")?"; + private static String BNODE = "_:" + BNODE_ID; + + private static String HEX = "[0-9A-Fa-f]"; + private static String UCHAR = "(?:\\\\u" + HEX + "{4}|\\\\U" + HEX + "{8})"; + private static String IRI = "<(?:[^\u0000-\u0020<>\"{}|^`\\\\]|" + UCHAR + ")*>"; + + private static String ECHAR = "\\\\[tbnrf\"'\\\\]"; + private static String STRING_LITERAL_QUOTE = "\"(?:[^\"\\\\\n\r]|" + ECHAR + "|" + UCHAR + ")*\""; + private static String LANGTAG = "@[a-zA-Z]+(?:-[a-zA-Z0-9]+)*"; + private static String LITERAL = STRING_LITERAL_QUOTE + "(?:\\^\\^" + IRI + "|" + LANGTAG + ")?"; + + private static Pattern BNODE_ID_PATTERN = Pattern.compile(BNODE_ID); + private static Pattern BNODE_PATTERN = Pattern.compile(BNODE); + private static Pattern IRI_PATTERN = Pattern.compile(IRI); + private static Pattern LITERAL_PATTERN = Pattern.compile(LITERAL); + + static class TripleMatch { + Triple triple; + int length; + + TripleMatch(Triple triple, int length) { + this.triple = triple; + this.length = length; + } + } + + /** + * Parses an N-Triples value, creates an object for it using the supplied ValueFactory and returns this object. + * + * @param nTriplesValue The N-Triples value to parse. + * @param valueFactory The ValueFactory to use for creating the object. + * @return An object representing the parsed value. + * @throws IllegalArgumentException If the supplied value could not be parsed correctly. + */ + public static Value parseValue(String nTriplesValue, ValueFactory valueFactory) throws IllegalArgumentException { + if (nTriplesValue.startsWith("<<")) { + return parseTriple(nTriplesValue, valueFactory); + } else if (nTriplesValue.startsWith("<")) { + return parseURI(nTriplesValue, valueFactory); + } else if (nTriplesValue.startsWith("_:")) { + return parseBNode(nTriplesValue, valueFactory); + } else if (nTriplesValue.startsWith("\"")) { + return parseLiteral(nTriplesValue, valueFactory); + } else { + throw new IllegalArgumentException("Not a legal N-Triples value: " + nTriplesValue); + } + } + + /** + * Parses an N-Triples resource, creates an object for it using the supplied ValueFactory and returns this object. + * + * @param nTriplesResource The N-Triples resource to parse. + * @param valueFactory The ValueFactory to use for creating the object. + * @return An object representing the parsed resource. + * @throws IllegalArgumentException If the supplied resource could not be parsed correctly. + */ + public static Resource parseResource(String nTriplesResource, ValueFactory valueFactory) + throws IllegalArgumentException { + if (nTriplesResource.startsWith("<<")) { + return parseTriple(nTriplesResource, valueFactory); + } else if (nTriplesResource.startsWith("<")) { + return parseURI(nTriplesResource, valueFactory); + } else if (nTriplesResource.startsWith("_:")) { + return parseBNode(nTriplesResource, valueFactory); + } else { + throw new IllegalArgumentException("Not a legal N-Triples resource: " + nTriplesResource); + } + } + + /** + * Parses an N-Triples URI, creates an object for it using the supplied ValueFactory and returns this object. + * + * @param nTriplesURI The N-Triples URI to parse. + * @param valueFactory The ValueFactory to use for creating the object. + * @return An object representing the parsed URI. + * @throws IllegalArgumentException If the supplied URI could not be parsed correctly. + */ + public static IRI parseURI(String nTriplesURI, ValueFactory valueFactory) throws IllegalArgumentException { + if (nTriplesURI.startsWith("<") && nTriplesURI.endsWith(">")) { + String uri = nTriplesURI.substring(1, nTriplesURI.length() - 1); + // Disambiguate with RDF* triple + if (!uri.startsWith("<")) { + uri = unescapeString(uri); + return valueFactory.createIRI(uri); + } + } + throw new IllegalArgumentException("Not a legal N-Triples URI: " + nTriplesURI); + } + + /** + * Parses an N-Triples bNode, creates an object for it using the supplied ValueFactory and returns this object. + * + * @param nTriplesBNode The N-Triples bNode to parse. + * @param valueFactory The ValueFactory to use for creating the object. + * @return An object representing the parsed bNode. + * @throws IllegalArgumentException If the supplied bNode could not be parsed correctly. + */ + public static BNode parseBNode(String nTriplesBNode, ValueFactory valueFactory) throws IllegalArgumentException { + if (nTriplesBNode.startsWith("_:")) { + return valueFactory.createBNode(nTriplesBNode.substring(2)); + } else { + throw new IllegalArgumentException("Not a legal N-Triples Blank Node: " + nTriplesBNode); + } + } + + /** + * Parses an N-Triples literal, creates an object for it using the supplied ValueFactory and returns this object. + * + * @param nTriplesLiteral The N-Triples literal to parse. + * @param valueFactory The ValueFactory to use for creating the object. + * @return An object representing the parsed literal. + * @throws IllegalArgumentException If the supplied literal could not be parsed correctly. + */ + public static Literal parseLiteral(String nTriplesLiteral, ValueFactory valueFactory) + throws IllegalArgumentException { + if (nTriplesLiteral.startsWith("\"")) { + // Find string separation points + int endLabelIdx = findEndOfLabel(nTriplesLiteral); + + if (endLabelIdx != -1) { + int startLangIdx = nTriplesLiteral.indexOf('@', endLabelIdx); + int startDtIdx = nTriplesLiteral.indexOf("^^", endLabelIdx); + + if (startLangIdx != -1 && startDtIdx != -1) { + throw new IllegalArgumentException("Literals can not have both a language and a datatype"); + } + + // Get label + String label = nTriplesLiteral.substring(1, endLabelIdx); + label = unescapeString(label); + + if (startLangIdx != -1) { + // Get language + String language = nTriplesLiteral.substring(startLangIdx + 1); + return valueFactory.createLiteral(label, language); + } else if (startDtIdx != -1) { + // Get datatype + String datatype = nTriplesLiteral.substring(startDtIdx + 2); + IRI dtURI = parseURI(datatype, valueFactory); + return valueFactory.createLiteral(label, dtURI); + } else { + return valueFactory.createLiteral(label); + } + } + } + + throw new IllegalArgumentException("Not a legal N-Triples literal: " + nTriplesLiteral); + } + + /** + * Parses an RDF* triple (non-standard N-Triples), creates an object for it using the supplied ValueFactory and + * returns this object. + * + * @param nTriplesTriple The RDF* triple to parse. + * @param valueFactory The ValueFactory to use for creating the object. + * @return An object representing the parsed triple. + * @throws IllegalArgumentException If the supplied triple could not be parsed correctly. + */ + public static Triple parseTriple(String nTriplesTriple, ValueFactory valueFactory) { + TripleMatch tm = parseTripleInternal(nTriplesTriple, valueFactory); + if (tm.length != nTriplesTriple.length()) { + throw new IllegalArgumentException("Not a valid N-Triples triple: " + nTriplesTriple); + } + return tm.triple; + } + + /** + * Parses an RDF* triple (non-standard N-Triples), creates an object for it using the supplied ValueFactory and + * returns an object that contains the parsed triple and the length of the parsed text. + * + * @param nTriplesTriple The RDF* triple to parse. + * @param valueFactory The ValueFactory to use for creating the object. + * @return An object representing the parsed triple and the length of the matching text. + * @throws IllegalArgumentException If the supplied triple could not be parsed correctly. + */ + private static TripleMatch parseTripleInternal(String nTriplesTriple, ValueFactory valueFactory) { + if (nTriplesTriple.startsWith("<<")) { + String triple = nTriplesTriple.substring(2); + int offset = 2; + + while (triple.length() > 0 && Character.isWhitespace(triple.charAt(0))) { + triple = triple.substring(1); + ++offset; + } + + Resource subject = null; + IRI predicate = null; + Value object = null; + + for (int i = 0; i < 3; i++) { + Value v = null; + if (triple.startsWith("_:")) { + Matcher bNodeMatcher = BNODE_PATTERN.matcher(triple); + if (bNodeMatcher.find() && bNodeMatcher.start() == 0) { + String value = bNodeMatcher.group(); + v = NTriplesUtil.parseBNode(value, valueFactory); + triple = triple.substring(bNodeMatcher.end()); + offset += bNodeMatcher.end(); + } + } else if (triple.startsWith("<<")) { + TripleMatch tm = parseTripleInternal(triple, valueFactory); + triple = triple.substring(tm.length); + offset += tm.length; + v = tm.triple; + } else if (triple.startsWith("<")) { + Matcher iriMatcher = IRI_PATTERN.matcher(triple); + if (iriMatcher.find() && iriMatcher.start() == 0) { + String value = iriMatcher.group(); + v = NTriplesUtil.parseURI(value, valueFactory); + triple = triple.substring(iriMatcher.end()); + offset += iriMatcher.end(); + } + } else if (triple.startsWith("\"")) { + Matcher literalMatcher = LITERAL_PATTERN.matcher(triple); + if (literalMatcher.find() && literalMatcher.start() == 0) { + String value = literalMatcher.group(); + v = NTriplesUtil.parseLiteral(value, valueFactory); + triple = triple.substring(literalMatcher.end()); + offset += literalMatcher.end(); + } + } + + if (i == 0) { + if (!(v instanceof Resource)) { + throw new IllegalArgumentException("Not a valid N-Triples triple: " + nTriplesTriple); + } + subject = (Resource) v; + } else if (i == 1) { + if (!(v instanceof IRI)) { + throw new IllegalArgumentException("Not a valid N-Triples triple: " + nTriplesTriple); + } + predicate = (org.eclipse.rdf4j.model.IRI) v; + } else if (i == 2) { + if (v == null) { + throw new IllegalArgumentException("Not a valid N-Triples triple: " + nTriplesTriple); + } + object = v; + } + while (triple.length() > 0 && Character.isWhitespace(triple.charAt(0))) { + triple = triple.substring(1); + ++offset; + } + } + + if (triple.endsWith(">>")) { + offset += 2; + return new TripleMatch(valueFactory.createTriple(subject, predicate, object), offset); + } + } + + throw new IllegalArgumentException("Not a valid N-Triples triple: " + nTriplesTriple); + } + + /** + * Finds the end of the label in a literal string. This method takes into account that characters can be escaped + * using backslashes. + * + * @return The index of the double quote ending the label, or -1 if it could not be found. + */ + private static int findEndOfLabel(String nTriplesLiteral) { + // First character of literal is guaranteed to be a double + // quote, start search at second character. + + boolean previousWasBackslash = false; + + for (int i = 1; i < nTriplesLiteral.length(); i++) { + char c = nTriplesLiteral.charAt(i); + + if (c == '"' && !previousWasBackslash) { + return i; + } else if (c == '\\' && !previousWasBackslash) { + // start of escape + previousWasBackslash = true; + } else if (previousWasBackslash) { + // c was escaped + previousWasBackslash = false; + } + } + + return -1; + } + + /** + * Creates an N-Triples string for the supplied value. + * + * @param value + * @return string + */ + public static String toNTriplesString(Value value) { + // default to false. Users must call new method directly to remove + // xsd:string + return toNTriplesString(value, BasicWriterSettings.XSD_STRING_TO_PLAIN_LITERAL.getDefaultValue()); + } + + /** + * Creates an N-Triples string for the supplied value.If the supplied value is a {@link Literal}, it optionally + * ignores the xsd:string datatype, since this datatype is implicit in RDF-1.1. + * + * @param value The value to write. + * @param xsdStringToPlainLiteral True to omit serialising the xsd:string datatype and false to always serialise the + * datatype for literals. + * @return string + */ + public static String toNTriplesString(Value value, boolean xsdStringToPlainLiteral) { + if (value instanceof Resource) { + return toNTriplesString((Resource) value); + } else if (value instanceof Literal) { + return toNTriplesString((Literal) value, xsdStringToPlainLiteral); + } else { + throw new IllegalArgumentException("Unknown value type: " + value.getClass()); + } + } + + /** + * Appends the N-Triples representation of the given {@link Value} to the given {@link Appendable}. + * + * @param value The value to write. + * @param appendable The object to append to. + * @throws IOException + */ + public static void append(Value value, Appendable appendable) throws IOException { + // default to false. Users must call new method directly to remove + // xsd:string + append(value, appendable, BasicWriterSettings.XSD_STRING_TO_PLAIN_LITERAL.getDefaultValue(), + NTriplesWriterSettings.ESCAPE_UNICODE.getDefaultValue()); + } + + /** + * Appends the N-Triples representation of the given {@link Value} to the given {@link Appendable}, optionally not + * serializing the datatype a {@link Literal} with the xsd:string datatype as it is implied for RDF-1.1. + * + * @param value The value to write. + * @param appendable The object to append to. + * @param xsdStringToPlainLiteral True to omit serializing the xsd:string datatype and false to always serialize the + * datatype for literals. + * @param escapeUnicode + * @throws IOException + */ + public static void append(Value value, Appendable appendable, boolean xsdStringToPlainLiteral, + boolean escapeUnicode) throws IOException { + if (value instanceof Resource) { + append((Resource) value, appendable); + } else if (value instanceof Literal) { + append((Literal) value, appendable, xsdStringToPlainLiteral, escapeUnicode); + } else { + throw new IllegalArgumentException("Unknown value type: " + value.getClass()); + } + } + + /** + * Creates an N-Triples string for the supplied resource. + * + * @param resource + * @return string + */ + public static String toNTriplesString(Resource resource) { + if (resource instanceof IRI) { + return toNTriplesString((IRI) resource); + } else if (resource instanceof BNode) { + return toNTriplesString((BNode) resource); + } else if (resource instanceof Triple) { + return toNTriplesString((Triple) resource); + } else { + throw new IllegalArgumentException("Unknown resource type: " + resource.getClass()); + } + } + + /** + * Appends the N-Triples representation of the given {@link Resource} to the given {@link Appendable}. + * + * @param resource The resource to write. + * @param appendable The object to append to. + * @throws IOException + */ + public static void append(Resource resource, Appendable appendable) throws IOException { + if (resource instanceof IRI) { + append((IRI) resource, appendable); + } else if (resource instanceof BNode) { + append((BNode) resource, appendable); + } else if (resource instanceof Triple) { + append((Triple) resource, appendable); + } else { + throw new IllegalArgumentException("Unknown resource type: " + resource.getClass()); + } + } + + /** + * Creates an N-Triples string for the supplied URI. + * + * @param uri + * @return string + */ + public static String toNTriplesString(IRI uri) { + return "<" + escapeString(uri.toString()) + ">"; + } + + /** + * Appends the N-Triples representation of the given {@link IRI} to the given {@link Appendable}. + * + * @param uri The IRI to write. + * @param appendable The object to append to. + * @throws IOException + */ + public static void append(IRI uri, Appendable appendable) throws IOException { + append(uri, appendable, true); + } + + /** + * Appends the N-Triples representation of the given {@link IRI} to the given {@link Appendable}. + * + * @param uri + * @param appendable + * @param escapeUnicode + * @throws IOException + */ + public static void append(IRI uri, Appendable appendable, boolean escapeUnicode) throws IOException { + appendable.append('<'); + StringUtil.simpleEscapeIRI(uri.toString(), appendable, escapeUnicode); + appendable.append('>'); + } + + /** + * Creates an N-Triples string for the supplied blank node. + * + * @param bNode + * @return string + */ + public static String toNTriplesString(BNode bNode) { + try { + StringBuilder result = new StringBuilder(bNode.getID().length() + 1); + append(bNode, result); + return result.toString(); + } catch (IOException e) { + throw new RuntimeException("Should not receive IOException with StringBuilder", e); + } + } + + /** + * Appends the N-Triples representation of the given {@link BNode} to the given {@link Appendable}. + * + * @param bNode + * @param appendable + * @throws IOException + */ + public static void append(BNode bNode, Appendable appendable) throws IOException { + String nextId = bNode.getID(); + appendable.append("_:"); + + if (nextId.isEmpty() || !BNODE_ID_PATTERN.matcher(nextId).matches()) { + appendable.append("genid"); + appendable.append(Integer.toHexString(bNode.hashCode())); + } else { + // The regex check via BNODE_ID_PATTERN also covers SES-2129, previous workaround in Protocol.encodeValue() + appendable.append(nextId); + } + } + + /** + * Creates an N-Triples string for the supplied literal. + * + * @param lit + * @return string + */ + public static String toNTriplesString(Literal lit) { + // default to false. Users must call new method directly to remove + // xsd:string + return toNTriplesString(lit, BasicWriterSettings.XSD_STRING_TO_PLAIN_LITERAL.getDefaultValue()); + } + + /** + * Creates an N-Triples string for the supplied literal, optionally ignoring the xsd:string datatype as it is + * implied for RDF-1.1. + * + * @param lit The literal to write. + * @param xsdStringToPlainLiteral True to omit serializing the xsd:string datatype and false to always serialize the + * datatype for literals. + * @return String + */ + public static String toNTriplesString(Literal lit, boolean xsdStringToPlainLiteral) { + try { + StringBuilder sb = new StringBuilder(); + append(lit, sb, xsdStringToPlainLiteral, NTriplesWriterSettings.ESCAPE_UNICODE.getDefaultValue()); + return sb.toString(); + } catch (IOException e) { + throw new AssertionError(); + } + } + + /** + * Appends the N-Triples representation of the given {@link Literal} to the given {@link Appendable}. + * + * @param lit + * @param appendable + * @throws IOException + */ + public static void append(Literal lit, Appendable appendable) throws IOException { + // default to false. Users must call new method directly to remove + // xsd:string + append(lit, appendable, BasicWriterSettings.XSD_STRING_TO_PLAIN_LITERAL.getDefaultValue(), + NTriplesWriterSettings.ESCAPE_UNICODE.getDefaultValue()); + } + + /** + * Appends the N-Triples representation of the given {@link Literal} to the given {@link Appendable}, optionally + * ignoring the xsd:string datatype as it is implied for RDF-1.1. + * + * @param lit The literal to write. + * @param appendable The object to append to. + * @param xsdStringToPlainLiteral True to omit serializing the xsd:string datatype and false to always serialize the + * datatype for literals. + * @param escapeUnicode True to escape non-ascii/non-printable characters using Unicode escapes + * (\uxxxx and \Uxxxxxxxx), false to print without + * escaping. + * @throws IOException + */ + public static void append(Literal lit, Appendable appendable, boolean xsdStringToPlainLiteral, + boolean escapeUnicode) throws IOException { + // Do some character escaping on the label: + appendable.append("\""); + escapeString(lit.getLabel(), appendable, escapeUnicode); + appendable.append("\""); + + if (Literals.isLanguageLiteral(lit)) { + // Append the literal's language + appendable.append("@"); + appendable.append(lit.getLanguage().get()); + } else { + // SES-1917 : In RDF-1.1, all literals have a type, and if they are not + // language literals we display the type for backwards compatibility + // Append the literal's datatype + IRI datatype = lit.getDatatype(); + boolean ignoreDatatype = datatype.equals(XMLSchema.STRING) && xsdStringToPlainLiteral; + if (!ignoreDatatype) { + appendable.append("^^"); + append(lit.getDatatype(), appendable); + } + } + } + + /** + * Creates an N-Triples (non-standard) string for the supplied RDF* triple. + * + * @param triple + * @return string + */ + public static String toNTriplesString(Triple triple) { + return "<<" + NTriplesUtil.toNTriplesString(triple.getSubject()) + " " + + NTriplesUtil.toNTriplesString(triple.getPredicate()) + " " + + NTriplesUtil.toNTriplesString(triple.getObject()) + ">>"; + } + + /** + * Appends the N-Triples (non-standard) representation of the given {@link Triple} to the given {@link Appendable}. + * + * @param triple + * @param appendable + * @throws IOException + */ + public static void append(Triple triple, Appendable appendable) throws IOException { + appendable.append("<<"); + append(triple.getSubject(), appendable); + appendable.append(' '); + append(triple.getPredicate(), appendable); + appendable.append(' '); + append(triple.getObject(), appendable); + appendable.append(">>"); + } + + /** + * Checks whether the supplied character is a letter or number according to the N-Triples specification. + * + * @deprecated use {@link ASCIIUtil#isLetterOrNumber(int)} + * @see #isLetter + * @see #isNumber + * @param c + * @return true if it is a letter or a number + */ + @Deprecated + public static boolean isLetterOrNumber(int c) { + return ASCIIUtil.isLetterOrNumber(c); + } + + /** + * Checks whether the supplied character is a letter according to the N-Triples specification.N-Triples letters are + * A - Z and a - z. + * + * @deprecated use {@link ASCIIUtil#isLetter(int)} + * @param c + * @return + */ + @Deprecated + public static boolean isLetter(int c) { + return ASCIIUtil.isLetter(c); + } + + /** + * Checks whether the supplied character is a number according to the N-Triples specification.N-Triples numbers are + * 0 - 9. + * + * @deprecated use {@link ASCIIUtil#isNumber(int)} + * @param c + * @return true if the character is a number + */ + @Deprecated + public static boolean isNumber(int c) { + return ASCIIUtil.isNumber(c); + } + + /** + * Checks whether the supplied character is valid character as per N-Triples specification. + * + * @see https://www.w3.org/TR/n-triples/#BNodes + * @param c + * @return true if valid + */ + public static boolean isValidCharacterForBNodeLabel(int c) { + return ASCIIUtil.isLetterOrNumber(c) || isLiberalCharactersButNotDot(c) || isDot(c); + } + + /** + * Checks whether the supplied character is in list of liberal characters according to the N-Triples specification + * except Dot. + * + * @param c + * @return true if valid + */ + public static boolean isLiberalCharactersButNotDot(int c) { + return isUnderscore(c) || c == 45 || c == 183 || (c >= 768 && c <= 879) || c == 8255 || c == 8256; + } + + /** + * Checks whether the supplied character is Underscore. + * + * @param c + * @return true if it is an underscore + */ + public static boolean isUnderscore(int c) { + return c == 95; + } + + /** + * Checks whether the supplied character is Dot '.'. + * + * @param c + * @return true if it is a dot + */ + public static boolean isDot(int c) { + return c == 46; + } + + /** + * Escapes a Unicode string to an all-ASCII character sequence.Any special characters are escaped using backslashes + * ( " becomes \", etc.), and non-ascii/non-printable characters are escaped using Unicode escapes + * ( \uxxxx and \Uxxxxxxxx). + * + * @param label + * @return + */ + public static String escapeString(String label) { + try { + StringBuilder sb = new StringBuilder(2 * label.length()); + escapeString(label, sb); + return sb.toString(); + } catch (IOException e) { + throw new AssertionError(); + } + } + + /** + * Escapes a Unicode string to an all-ASCII character sequence. Any special characters are escaped using backslashes + * ( " becomes \", etc.), and non-ascii/non-printable characters are escaped using Unicode escapes + * ( \uxxxx and \Uxxxxxxxx). + * + * @param label + * @param appendable + * @throws IOException + */ + public static void escapeString(String label, Appendable appendable) throws IOException { + escapeString(label, appendable, true); + } + + /** + * Escapes a Unicode string to an N-Triples compatible character sequence.Any special characters are escaped using + * backslashes (" becomes \", etc.), and non-ascii/non-printable characters are escaped using + * Unicode escapes (\uxxxx and \Uxxxxxxxx) if the option is selected. + * + * @param label + * @param appendable + * @param escapeUnicode + * @throws IOException + */ + public static void escapeString(String label, Appendable appendable, boolean escapeUnicode) throws IOException { + int labelLength = label.length(); + + for (int i = 0; i < labelLength; i++) { + char c = label.charAt(i); + int cInt = c; + + if (c == '\\') { + appendable.append("\\\\"); + } else if (c == '"') { + appendable.append("\\\""); + } else if (c == '\n') { + appendable.append("\\n"); + } else if (c == '\r') { + appendable.append("\\r"); + } else if (c == '\t') { + appendable.append("\\t"); + } else if (cInt >= 0x0 && cInt <= 0x8 || cInt == 0xB || cInt == 0xC || cInt >= 0xE && cInt <= 0x1F + || cInt >= 0x7F && cInt <= 0xFFFF) { + if (escapeUnicode) { + appendable.append("\\u"); + appendable.append(toHexString(cInt, 4)); + } else { + appendable.append(c); + } + } else if (cInt >= 0x10000 && cInt <= 0x10FFFF) { + if (escapeUnicode) { + appendable.append("\\U"); + appendable.append(toHexString(cInt, 8)); + } else { + appendable.append(c); + } + } else { + appendable.append(c); + } + } + } + + /** + * Unescapes an escaped Unicode string. Any Unicode sequences ( \uxxxx and \Uxxxxxxxx) + * are restored to the value indicated by the hexadecimal argument and any backslash-escapes ( \", + * \\, etc.) are decoded to their original form. + * + * @param s An escaped Unicode string. + * @return The unescaped string. + * @throws IllegalArgumentException If the supplied string is not a correctly escaped N-Triples string. + */ + public static String unescapeString(String s) { + int backSlashIdx = s.indexOf('\\'); + + if (backSlashIdx == -1) { + // No escaped characters found + return s; + } + + int startIdx = 0; + int sLength = s.length(); + StringBuilder sb = new StringBuilder(sLength); + + while (backSlashIdx != -1) { + sb.append(s.substring(startIdx, backSlashIdx)); + + if (backSlashIdx + 1 >= sLength) { + throw new IllegalArgumentException("Unescaped backslash in: " + s); + } + + char c = s.charAt(backSlashIdx + 1); + + if (c == 't') { + sb.append('\t'); + startIdx = backSlashIdx + 2; + } else if (c == 'b') { + sb.append('\b'); + startIdx = backSlashIdx + 2; + } else if (c == 'n') { + sb.append('\n'); + startIdx = backSlashIdx + 2; + } else if (c == 'r') { + sb.append('\r'); + startIdx = backSlashIdx + 2; + } else if (c == 'f') { + sb.append('\f'); + startIdx = backSlashIdx + 2; + } else if (c == '"') { + sb.append('"'); + startIdx = backSlashIdx + 2; + } else if (c == '\'') { + sb.append('\''); + startIdx = backSlashIdx + 2; + } else if (c == '\\') { + sb.append('\\'); + startIdx = backSlashIdx + 2; + } else if (c == 'u') { + // \\uxxxx + if (backSlashIdx + 5 >= sLength) { + throw new IllegalArgumentException("Incomplete Unicode escape sequence in: " + s); + } + String xx = s.substring(backSlashIdx + 2, backSlashIdx + 6); + + try { + final int codePoint = Integer.parseInt(xx, 16); + sb.append(Character.toChars(codePoint)); + + startIdx = backSlashIdx + 6; + } catch (NumberFormatException e) { + throw new IllegalArgumentException("Illegal Unicode escape sequence '\\u" + xx + "' in: " + s); + } + } else if (c == 'U') { + // \\Uxxxxxxxx + if (backSlashIdx + 9 >= sLength) { + throw new IllegalArgumentException("Incomplete Unicode escape sequence in: " + s); + } + String xx = s.substring(backSlashIdx + 2, backSlashIdx + 10); + + try { + final int codePoint = Integer.parseInt(xx, 16); + sb.append(Character.toChars(codePoint)); + + startIdx = backSlashIdx + 10; + } catch (NumberFormatException e) { + throw new IllegalArgumentException("Illegal Unicode escape sequence '\\U" + xx + "' in: " + s); + } + } else { + throw new IllegalArgumentException("Unescaped backslash in: " + s); + } + + backSlashIdx = s.indexOf('\\', startIdx); + } + + sb.append(s.substring(startIdx)); + + return sb.toString(); + } + + /** + * Converts a decimal value to a hexadecimal string representation of the specified length. + * + * @param decimal A decimal value. + * @param stringLength The length of the resulting string. + * @return padded string + */ + public static String toHexString(int decimal, int stringLength) { + StringBuilder sb = new StringBuilder(stringLength); + + String hexVal = Integer.toHexString(decimal).toUpperCase(); + + // insert zeros if hexVal has less than stringLength characters: + int nofZeros = stringLength - hexVal.length(); + for (int i = 0; i < nofZeros; i++) { + sb.append('0'); + } + + sb.append(hexVal); + + return sb.toString(); + } +} diff --git a/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/helpers/NTriplesWriterSettings.java b/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/helpers/NTriplesWriterSettings.java index df171057259..8d65cf3694d 100644 --- a/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/helpers/NTriplesWriterSettings.java +++ b/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/helpers/NTriplesWriterSettings.java @@ -11,7 +11,7 @@ /** * WriterSettings for the N-Triples writer features. - * + * * @author Peter Ansell */ public class NTriplesWriterSettings { diff --git a/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/helpers/ParseErrorCollector.java b/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/helpers/ParseErrorCollector.java index a49ac567440..66b8f36694c 100644 --- a/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/helpers/ParseErrorCollector.java +++ b/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/helpers/ParseErrorCollector.java @@ -15,7 +15,7 @@ /** * A ParseErrorListener that collects Rio parse errors in the sequence they were collected in. - * + * * @author Peter Ansell */ public class ParseErrorCollector implements ParseErrorListener { diff --git a/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/helpers/ParseErrorLogger.java b/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/helpers/ParseErrorLogger.java index da549eb8bc4..90b8fcb9a74 100644 --- a/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/helpers/ParseErrorLogger.java +++ b/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/helpers/ParseErrorLogger.java @@ -13,7 +13,7 @@ /** * A ParseErrorListener that reports Rio parser errors to the SLf4J Logging framework. - * + * * @author jeen */ public class ParseErrorLogger implements ParseErrorListener { diff --git a/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/helpers/RDFHandlerWrapper.java b/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/helpers/RDFHandlerWrapper.java index f0d79dcec98..ca959ad5dbf 100644 --- a/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/helpers/RDFHandlerWrapper.java +++ b/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/helpers/RDFHandlerWrapper.java @@ -17,7 +17,7 @@ /** * Convenience base class for RDF handlers that wrap one or more other RDF handler. This class provides default methods * that forward method calls to the wrapped RDF handler(s). - * + * * @author Arjohn Kampman * @author Jeen Broekstra */ @@ -42,7 +42,7 @@ public class RDFHandlerWrapper implements RDFHandler { * Creates a new RDFHandlerWrapper that wraps the supplied RDF handler(s). If more than one RDFHandler is supplied * for wrapping, the RDFHandlerWrapper forwards every method call to each of the supplied handler, in the order in * which the handlers are supplied. - * + * * @param rdfHandlers One or more wrapped RDF handlers for this RDFHandlerWrapper, must not be * null. */ @@ -54,7 +54,7 @@ public RDFHandlerWrapper(RDFHandler... rdfHandlers) { * Creates a new RDFHandlerWrapper that wraps the supplied RDF handler(s). If more than one RDFHandler is supplied * for wrapping, the RDFHandlerWrapper forwards every method call to each of the supplied handlers, in the order in * which the handlers are supplied. - * + * * @param modelFactory a {@link ModelFactory} that can be used for creating new empty {@link Model}s by the handler. * @param rdfHandlers One or more wrapped RDF handlers for this RDFHandlerWrapper, must not be * null. diff --git a/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/helpers/RDFJSONParserSettings.java b/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/helpers/RDFJSONParserSettings.java index f06cf258db6..4c3ce7c4d93 100644 --- a/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/helpers/RDFJSONParserSettings.java +++ b/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/helpers/RDFJSONParserSettings.java @@ -13,7 +13,7 @@ * A selection of parser settings specific to RDF/JSON parsers. *

    * Several of these settings can be overridden by means of a system property, but only if specified at JVM startup time. - * + * * @author Peter Ansell */ public class RDFJSONParserSettings { diff --git a/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/helpers/RDFParserHelper.java b/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/helpers/RDFParserHelper.java index 7ad72a83476..57134961bd2 100644 --- a/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/helpers/RDFParserHelper.java +++ b/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/helpers/RDFParserHelper.java @@ -28,7 +28,7 @@ *

    * This class contains reference implementations of the workflows for {@link ParseErrorListener}, * {@link RDFParseException}, {@link ParserConfig}, {@link DatatypeHandler} and {@link LanguageHandler} related methods - * + * * @author Peter Ansell */ public class RDFParserHelper { @@ -36,7 +36,7 @@ public class RDFParserHelper { /** * Create a literal using the given parameters, including iterative verification and normalization by any * {@link DatatypeHandler} or {@link LanguageHandler} implementations that are found in the {@link ParserConfig}. - * + * * @param label The value for {@link Literal#getLabel()}, which may be iteratively normalized. * @param lang If this is not null, and the datatype is either not null, or is equal to * {@link RDF#LANGSTRING}, then a language literal will be created. @@ -62,7 +62,7 @@ public static final Literal createLiteral(String label, String lang, IRI datatyp /** * Create a literal using the given parameters, including iterative verification and normalization by any * {@link DatatypeHandler} or {@link LanguageHandler} implementations that are found in the {@link ParserConfig}. - * + * * @param label The value for {@link Literal#getLabel()}, which may be iteratively normalized. * @param lang If this is not null, and the datatype is either not null, or is equal to * {@link RDF#LANGSTRING}, then a language literal will be created. @@ -216,7 +216,7 @@ else if (workingDatatype != null) { *

    * This method also throws an {@link RDFParseException} when the given setting has been set to true and it * is not a nonFatalError. - * + * * @param msg The message to use for {@link ParseErrorListener#error(String, long, long)} and for * {@link RDFParseException#RDFParseException(String, long, long)}. * @param relevantSetting The boolean setting that will be checked to determine if this is an issue that we need to @@ -241,7 +241,7 @@ public static void reportError(String msg, RioSetting relevantSetting, *

    * This method also throws an {@link RDFParseException} when the given setting has been set to true and it * is not a nonFatalError. - * + * * @param msg The message to use for {@link ParseErrorListener#error(String, long, long)} and for * {@link RDFParseException#RDFParseException(String, long, long)}. * @param lineNo Optional line number, should default to setting this as -1 if not known. Used for @@ -280,7 +280,7 @@ public static void reportError(String msg, long lineNo, long columnNo, RioSettin *

    * This method also throws an {@link RDFParseException} when the given setting has been set to true and it * is not a nonFatalError. - * + * * @param e The exception whose message to use for * {@link ParseErrorListener#error(String, long, long)} and for * {@link RDFParseException#RDFParseException(String, long, long)}. diff --git a/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/helpers/RDFStarDecodingValueFactory.java b/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/helpers/RDFStarDecodingValueFactory.java new file mode 100644 index 00000000000..158748d2dba --- /dev/null +++ b/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/helpers/RDFStarDecodingValueFactory.java @@ -0,0 +1,148 @@ +/******************************************************************************* + * Copyright (c) 2020 Eclipse RDF4J contributors. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Distribution License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ +package org.eclipse.rdf4j.rio.helpers; + +import java.math.BigDecimal; +import java.math.BigInteger; +import java.util.Date; + +import javax.xml.datatype.XMLGregorianCalendar; + +import org.eclipse.rdf4j.model.BNode; +import org.eclipse.rdf4j.model.IRI; +import org.eclipse.rdf4j.model.Literal; +import org.eclipse.rdf4j.model.Resource; +import org.eclipse.rdf4j.model.Statement; +import org.eclipse.rdf4j.model.Triple; +import org.eclipse.rdf4j.model.Value; +import org.eclipse.rdf4j.model.ValueFactory; + +/** + * A {@link ValueFactory} that will delegate everything to another {@link ValueFactory} and create statements whose + * subject and object will be converted from RDF* triples encoded as special IRIs back to RDF* values. + *

    + * All other values in the subject and object position will be used as is. + */ +class RDFStarDecodingValueFactory implements ValueFactory { + private ValueFactory delegate; + + RDFStarDecodingValueFactory(ValueFactory delegate) { + this.delegate = delegate; + } + + @Override + public IRI createIRI(String iri) { + return delegate.createIRI(iri); + } + + @Override + public IRI createIRI(String namespace, String localName) { + return delegate.createIRI(namespace, localName); + } + + @Override + public BNode createBNode() { + return delegate.createBNode(); + } + + @Override + public BNode createBNode(String nodeID) { + return delegate.createBNode(nodeID); + } + + @Override + public Literal createLiteral(String label) { + return delegate.createLiteral(label); + } + + @Override + public Literal createLiteral(String label, String language) { + return delegate.createLiteral(label, language); + } + + @Override + public Literal createLiteral(String label, IRI datatype) { + return delegate.createLiteral(label, datatype); + } + + @Override + public Literal createLiteral(boolean value) { + return delegate.createLiteral(value); + } + + @Override + public Literal createLiteral(byte value) { + return delegate.createLiteral(value); + } + + @Override + public Literal createLiteral(short value) { + return delegate.createLiteral(value); + } + + @Override + public Literal createLiteral(int value) { + return delegate.createLiteral(value); + } + + @Override + public Literal createLiteral(long value) { + return delegate.createLiteral(value); + } + + @Override + public Literal createLiteral(float value) { + return delegate.createLiteral(value); + } + + @Override + public Literal createLiteral(double value) { + return delegate.createLiteral(value); + } + + @Override + public Literal createLiteral(BigDecimal bigDecimal) { + return delegate.createLiteral(bigDecimal); + } + + @Override + public Literal createLiteral(BigInteger bigInteger) { + return delegate.createLiteral(bigInteger); + } + + @Override + public Literal createLiteral(XMLGregorianCalendar calendar) { + return delegate.createLiteral(calendar); + } + + @Override + public Literal createLiteral(Date date) { + return delegate.createLiteral(date); + } + + @Override + public Statement createStatement(Resource subject, + IRI predicate, Value object) { + return delegate.createStatement(RDFStarUtil.fromRDFEncodedValue(subject), predicate, + RDFStarUtil.fromRDFEncodedValue(object)); + } + + @Override + public Statement createStatement(Resource subject, + IRI predicate, Value object, + Resource context) { + return delegate.createStatement(RDFStarUtil.fromRDFEncodedValue(subject), predicate, + RDFStarUtil.fromRDFEncodedValue(object), context); + } + + @Override + public Triple createTriple(Resource subject, + IRI predicate, Value object) { + return delegate.createTriple(subject, predicate, object); + } +} diff --git a/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/helpers/RDFStarEncodingStatement.java b/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/helpers/RDFStarEncodingStatement.java new file mode 100644 index 00000000000..292a2814535 --- /dev/null +++ b/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/helpers/RDFStarEncodingStatement.java @@ -0,0 +1,70 @@ +/******************************************************************************* + * Copyright (c) 2020 Eclipse RDF4J contributors. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Distribution License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ +package org.eclipse.rdf4j.rio.helpers; + +import java.util.Objects; + +import org.eclipse.rdf4j.model.IRI; +import org.eclipse.rdf4j.model.Resource; +import org.eclipse.rdf4j.model.Statement; +import org.eclipse.rdf4j.model.Value; + +/** + * Represents a {@link Statement} whose subject or object may be an RDF* triple that will be encoded as a special IRI + * value on {@link #getSubject()} and {@link #getObject()}. + * + * @author Pavel Mihaylov + */ +class RDFStarEncodingStatement implements Statement { + private Statement delegate; + + RDFStarEncodingStatement(Statement delegate) { + this.delegate = delegate; + } + + @Override + public Resource getSubject() { + return RDFStarUtil.toRDFEncodedValue(delegate.getSubject()); + } + + @Override + public IRI getPredicate() { + return delegate.getPredicate(); + } + + @Override + public Value getObject() { + return RDFStarUtil.toRDFEncodedValue(delegate.getObject()); + } + + @Override + public Resource getContext() { + return delegate.getContext(); + } + + @Override + public boolean equals(Object other) { + if (this == other) { + return true; + } + + if (other instanceof Statement) { + Statement that = (Statement) other; + + return getObject().equals(that.getObject()) && getSubject().equals(that.getSubject()) + && getPredicate().equals(that.getPredicate()) && Objects.equals(getContext(), that.getContext()); + } + + return false; + } + + @Override + public int hashCode() { + return Objects.hash(getSubject(), getPredicate(), getObject(), getContext()); + } +} diff --git a/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/helpers/RDFStarUtil.java b/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/helpers/RDFStarUtil.java new file mode 100644 index 00000000000..0df0460453b --- /dev/null +++ b/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/helpers/RDFStarUtil.java @@ -0,0 +1,90 @@ +/******************************************************************************* + * Copyright (c) 2020 Eclipse RDF4J contributors. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Distribution License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ +package org.eclipse.rdf4j.rio.helpers; + +import java.nio.charset.StandardCharsets; +import java.util.Base64; + +import org.eclipse.rdf4j.model.IRI; +import org.eclipse.rdf4j.model.Triple; +import org.eclipse.rdf4j.model.Value; +import org.eclipse.rdf4j.model.ValueFactory; +import org.eclipse.rdf4j.model.impl.SimpleValueFactory; + +/** + * Utility methods for RDF* triples. + * + * @author Pavel Mihaylov + */ +public class RDFStarUtil { + /** + * IRI prefix for RDF* triples encoded as IRIs. + */ + public static final String TRIPLE_PREFIX = "urn:rdf4j:triple:"; + + private static ValueFactory VF = SimpleValueFactory.getInstance(); + + /** + * Converts the supplied value from RDF* to an RDF-compatible representation. + *

    + * RDF* triples are encoded as IRIs that start with {@link #TRIPLE_PREFIX}, followed by the base64 encoding of the + * N-Triples serialization of the triple. + *

    + * All other RDF* values are valid in RDF as well and remain unchanged. + * + * @param value a RDF* {@link Value} to encode. + * @param + * @return the RDF-compatible encoded value, if a {@link Triple} was supplied, or the supplied value otherwise. + */ + public static T toRDFEncodedValue(T value) { + return value instanceof Triple + ? (T) VF.createIRI(TRIPLE_PREFIX + encode(NTriplesUtil.toNTriplesString(value))) + : value; + } + + /** + * Converts the supplied value from an RDF-compatible representation to an RDF* value. + *

    + * See {@link #toRDFEncodedValue(Value)}. + * + * @param encodedValue an RDF {@link Value} to convert to RDF*. + * @param + * @return the decoded RDF* triple, if a {@link Triple} encoded as {@link IRI} was supplied, or the supplied value + * otherwise. + * @throws IllegalArgumentException if the supplied value looked like an RDF* triple encoded as an IRI but it could + * not be decoded successfully. + */ + public static T fromRDFEncodedValue(T encodedValue) { + try { + return isEncodedTriple(encodedValue) + ? (T) NTriplesUtil.parseTriple(decode( + encodedValue.stringValue().substring(TRIPLE_PREFIX.length())), VF) + : encodedValue; + } catch (IllegalArgumentException e) { + throw new IllegalArgumentException("Invalid RDF* encoded triple: " + encodedValue); + } + } + + /** + * Checks if the supplied {@link Value} represents an RDF* triple encoded as an IRI. + * + * @param value the value to check. + * @return True if the value is an RDF* triple encoded as an IRI, false otherwise. + */ + public static boolean isEncodedTriple(Value value) { + return value instanceof IRI && value.stringValue().startsWith(TRIPLE_PREFIX); + } + + private static String encode(String s) { + return Base64.getUrlEncoder().encodeToString(s.getBytes(StandardCharsets.UTF_8)); + } + + private static String decode(String s) { + return new String(Base64.getUrlDecoder().decode(s), StandardCharsets.UTF_8); + } +} diff --git a/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/helpers/RDFaParserSettings.java b/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/helpers/RDFaParserSettings.java index 82eaa2f42d8..4ad6ed0ef4c 100644 --- a/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/helpers/RDFaParserSettings.java +++ b/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/helpers/RDFaParserSettings.java @@ -13,7 +13,7 @@ * A selection of parser settings specific to RDFa parsers. *

    * Several of these settings can be overridden by means of a system property, but only if specified at JVM startup time. - * + * * @author Peter Ansell */ public class RDFaParserSettings { @@ -23,7 +23,7 @@ public class RDFaParserSettings { *

    * Defaults to {@link RDFaVersion#RDFA_1_0}. */ - public static final RioSetting RDFA_COMPATIBILITY = new RioSettingImpl( + public static final RioSetting RDFA_COMPATIBILITY = new RioSettingImpl<>( "org.eclipse.rdf4j.rio.rdfa.version", "RDFa Version Compatibility", RDFaVersion.RDFA_1_0); /** @@ -33,7 +33,7 @@ public class RDFaParserSettings { * Defaults to false *

    * Can be overridden by setting system property {@code org.eclipse.rdf4j.rio.rdfa.vocab_expansion}. - * + * * @see RDFa Vocabulary Expansion */ public static final RioSetting VOCAB_EXPANSION_ENABLED = new BooleanRioSetting( diff --git a/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/helpers/RDFaVersion.java b/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/helpers/RDFaVersion.java index afd37c62bec..1d6e44d6269 100644 --- a/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/helpers/RDFaVersion.java +++ b/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/helpers/RDFaVersion.java @@ -9,21 +9,21 @@ /** * Enumeration for tracking versions of the RDFa specification to specify processing capabilities of RDFa modules. - * + * * @author Peter Ansell */ public enum RDFaVersion { /** * The initial RDFa 1.0 version (2008) - * + * * @see RDFa in XHTML: Syntax and Processing */ RDFA_1_0("RDFa 1.0", "http://www.w3.org/TR/2008/REC-rdfa-syntax-20081014/"), /** * The modified RDFa 1.1 version (2012) - * + * * @see RDFa Core 1.1 */ RDFA_1_1("RDFa 1.1", "http://www.w3.org/TR/2012/REC-rdfa-core-20120607/"), diff --git a/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/helpers/RioConfigurationException.java b/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/helpers/RioConfigurationException.java index aabba4fb5d0..f305433d05a 100644 --- a/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/helpers/RioConfigurationException.java +++ b/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/helpers/RioConfigurationException.java @@ -13,7 +13,7 @@ * A RuntimeException indicating that a specific Rio parser/writer configuration setting is not supported. A typical * cause of this exception is that a system property is used to specify a default setting, for a setting that does not * support this way of default specification. - * + * * @author Jeen Broekstra */ public class RioConfigurationException extends RDF4JException { diff --git a/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/helpers/RioSettingImpl.java b/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/helpers/RioSettingImpl.java index 7aefaf66558..2860163a230 100644 --- a/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/helpers/RioSettingImpl.java +++ b/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/helpers/RioSettingImpl.java @@ -11,7 +11,7 @@ /** * Basic implementation of {@link RioSetting} interface, without support for default override via system properties. - * + * * @author Peter Ansell * @see StringRioSetting * @see BooleanRioSetting diff --git a/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/helpers/SimpleParseLocationListener.java b/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/helpers/SimpleParseLocationListener.java index 576648199ff..480d4f24bfa 100644 --- a/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/helpers/SimpleParseLocationListener.java +++ b/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/helpers/SimpleParseLocationListener.java @@ -11,7 +11,7 @@ /** * A simple implementation of {@link ParseLocationListener}. - * + * * @author Peter Ansell */ public class SimpleParseLocationListener implements ParseLocationListener { diff --git a/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/helpers/StatementCollector.java b/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/helpers/StatementCollector.java index 4017ca7a6b3..74b5bbe80c6 100644 --- a/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/helpers/StatementCollector.java +++ b/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/helpers/StatementCollector.java @@ -15,7 +15,7 @@ /** * A RDFHandler that can be used to collect reported statements in collections. - * + * * @author Arjohn Kampman */ public class StatementCollector extends ContextStatementCollector { diff --git a/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/helpers/StringRioSetting.java b/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/helpers/StringRioSetting.java index 7f02422d454..3af83dced8a 100644 --- a/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/helpers/StringRioSetting.java +++ b/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/helpers/StringRioSetting.java @@ -12,7 +12,7 @@ /** * A {@link RioSetting} with a {@link String} value. The given default for the setting can be overridden by means of a * system property with a name equal to the setting key. - * + * * @author Jeen Broekstra */ public class StringRioSetting extends AbstractRioSetting { diff --git a/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/helpers/TriXParserSettings.java b/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/helpers/TriXParserSettings.java index 266f5f1243b..6f16e5b4f03 100644 --- a/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/helpers/TriXParserSettings.java +++ b/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/helpers/TriXParserSettings.java @@ -13,7 +13,7 @@ * ParserSettings for the TriX parser features. *

    * Several of these settings can be overridden by means of a system property, but only if specified at JVM startup time. - * + * * @author Peter Ansell */ public class TriXParserSettings { diff --git a/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/helpers/TurtleParserSettings.java b/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/helpers/TurtleParserSettings.java index adf4c72c715..72aa31a50ad 100644 --- a/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/helpers/TurtleParserSettings.java +++ b/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/helpers/TurtleParserSettings.java @@ -11,7 +11,7 @@ /** * Parser Settings that are specific to {@link org.eclipse.rdf4j.rio.RDFFormat#TURTLE} parsers. - * + * * @author Peter Ansell */ public class TurtleParserSettings { diff --git a/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/helpers/XMLParserSettings.java b/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/helpers/XMLParserSettings.java index 5a6d0998c46..6fd25fb89c8 100644 --- a/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/helpers/XMLParserSettings.java +++ b/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/helpers/XMLParserSettings.java @@ -17,7 +17,7 @@ * ParserSettings for the XML parser features. *

    * Several of these settings can be overridden by means of a system property, but only if specified at JVM startup time. - * + * * @author Michael Grove * @author Peter Ansell * @see XMLConstants @@ -31,7 +31,7 @@ public final class XMLParserSettings { * Defaults to true *

    * Can be overridden by setting system property {@code http://javax.xml.XMLConstants/feature/secure-processing} - * + * * @see * XMLConstants.FEATURE_SECURE_PROCESSING */ @@ -44,7 +44,7 @@ public final class XMLParserSettings { * Defaults to false. Can be overridden by setting system property * {@code http://apache.org/xml/features/disallow-doctype-decl} *

    - * + * * @see Apache XML Project - Features * @see XXE Prevention * Cheat Sheet @@ -59,7 +59,7 @@ public final class XMLParserSettings { *

    * Can be overridden by setting system property * {@code http://apache.org/xml/features/nonvalidating/load-external-dtd} - * + * * @see Apache XML Project - Features */ public static final RioSetting LOAD_EXTERNAL_DTD = new BooleanRioSetting( @@ -71,7 +71,7 @@ public final class XMLParserSettings { * Defaults to false. *

    * Can be overridden by setting system property {@code http://xml.org/sax/features/external-general-entities} - * + * * @see Apache XML Project - Features * @see XXE Prevention * Cheat Sheet @@ -85,7 +85,7 @@ public final class XMLParserSettings { * Defaults to false. *

    * Can be overridden by setting system property {@code http://xml.org/sax/features/external-parameter-entities} - * + * * @see Apache XML Project - Features * @see XXE Prevention * Cheat Sheet @@ -101,7 +101,7 @@ public final class XMLParserSettings { *

    * Defaults to null, This settings is only useful if {@link RioConfig#isSet(RioSetting)} returns true. */ - public static final RioSetting CUSTOM_XML_READER = new RioSettingImpl( + public static final RioSetting CUSTOM_XML_READER = new RioSettingImpl<>( "org.eclipse.rdf4j.rio.xmlreader", "Custom XML Reader", null); /** diff --git a/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/helpers/XMLReaderBasedParser.java b/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/helpers/XMLReaderBasedParser.java index 4b248fce694..4052fb01759 100644 --- a/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/helpers/XMLReaderBasedParser.java +++ b/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/helpers/XMLReaderBasedParser.java @@ -16,7 +16,7 @@ /** * Base class for Rio parsers that are based on a SAX {@link XMLReader}. - * + * * @author Jeen Broekstra */ public abstract class XMLReaderBasedParser extends AbstractRDFParser { @@ -37,7 +37,7 @@ protected XMLReaderBasedParser(ValueFactory f) { * {@link XMLReader#setProperty(String, Object)} *

    * Subclasses can override this to specify more supported settings. - * + * * @return A collection of {@link RioSetting}s that indicate which properties will always be setup using * {@link XMLReader#setProperty(String, Object)}. */ @@ -50,7 +50,7 @@ public Collection> getCompulsoryXmlPropertySettings() { * {@link XMLReader#setFeature(String, boolean)}. *

    * Subclasses can override this to specify more supported settings. - * + * * @return A collection of {@link RioSetting}s that indicate which boolean settings will always be setup using * {@link XMLReader#setFeature(String, boolean)}. */ @@ -63,7 +63,7 @@ public Collection> getCompulsoryXmlFeatureSettings() { * properties using {@link XMLReader#setProperty(String, Object)} *

    * Subclasses can override this to specify more supported settings. - * + * * @return A collection of {@link RioSetting}s that indicate which properties can be setup using * {@link XMLReader#setProperty(String, Object)}. */ @@ -76,7 +76,7 @@ public Collection> getOptionalXmlPropertySettings() { * using {@link XMLReader#setFeature(String, boolean)}. *

    * Subclasses can override this to specify more supported settings. - * + * * @return A collection of {@link RioSetting}s that indicate which boolean settings can be setup using * {@link XMLReader#setFeature(String, boolean)}. */ @@ -86,7 +86,7 @@ public Collection> getOptionalXmlFeatureSettings() { /** * Creates an XML Reader configured using the current parser settings. - * + * * @return a configured {@link XMLReader} * @throws SAXException if an error occurs during configuration. */ diff --git a/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/helpers/XMLWriterSettings.java b/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/helpers/XMLWriterSettings.java index 7d8746cf386..981e8dcb3a0 100644 --- a/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/helpers/XMLWriterSettings.java +++ b/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/helpers/XMLWriterSettings.java @@ -12,7 +12,7 @@ /** * A class encapsulating writer settings that XML writers may support. - * + * * @author Peter Ansell */ public class XMLWriterSettings { @@ -25,7 +25,7 @@ public class XMLWriterSettings { * Defaults to true. *

    * Can be overridden by setting system property {@code org.eclipse.rdf4j.rio.include_xml_pi} - * + * * @see RDF/XML * specification */ @@ -39,7 +39,7 @@ public class XMLWriterSettings { * Defaults to true. *

    * Can be overridden by setting system property {@code org.eclipse.rdf4j.rio.include_root_rdf_tag} - * + * * @see RDF/XML * specification */ @@ -60,7 +60,7 @@ public class XMLWriterSettings { /** * Boolean setting for RDF/XML Writer to determine if the character used to quote attribute values, (single quote or * double quote) is also replaced within text nodes by it's corresponding entity. - * + * *

    * Defaults to false. *

    diff --git a/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/package-info.java b/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/package-info.java index 857603ffce0..1d164e62ca7 100644 --- a/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/package-info.java +++ b/core/rio/api/src/main/java/org/eclipse/rdf4j/rio/package-info.java @@ -1,9 +1,9 @@ /** * Rio: The rdf4j parser/writer API. - * + * * The Rio parser/writer toolkit provides support for all major RDF syntax formats, including RDF/XML, Turtle, * N-Triples, N-Quads, TriG, and TriX. - * + * * @see the Rio documentation */ -package org.eclipse.rdf4j.rio; \ No newline at end of file +package org.eclipse.rdf4j.rio; diff --git a/core/rio/api/src/test/java/org/eclipse/rdf4j/rio/AbstractParserHandlingTest.java b/core/rio/api/src/test/java/org/eclipse/rdf4j/rio/AbstractParserHandlingTest.java index 58c95340784..b1d02629b4c 100644 --- a/core/rio/api/src/test/java/org/eclipse/rdf4j/rio/AbstractParserHandlingTest.java +++ b/core/rio/api/src/test/java/org/eclipse/rdf4j/rio/AbstractParserHandlingTest.java @@ -17,6 +17,7 @@ import java.io.InputStream; import java.io.OutputStream; import java.util.Collections; +import java.util.Date; import java.util.HashSet; import java.util.Locale; @@ -24,6 +25,7 @@ import org.eclipse.rdf4j.model.IRI; import org.eclipse.rdf4j.model.Model; import org.eclipse.rdf4j.model.Statement; +import org.eclipse.rdf4j.model.Triple; import org.eclipse.rdf4j.model.ValueFactory; import org.eclipse.rdf4j.model.impl.LinkedHashModel; import org.eclipse.rdf4j.model.impl.SimpleValueFactory; @@ -34,6 +36,7 @@ import org.eclipse.rdf4j.model.vocabulary.XMLSchema; import org.eclipse.rdf4j.rio.helpers.BasicParserSettings; import org.eclipse.rdf4j.rio.helpers.ParseErrorCollector; +import org.eclipse.rdf4j.rio.helpers.RDFStarUtil; import org.eclipse.rdf4j.rio.helpers.StatementCollector; import org.junit.After; import org.junit.Before; @@ -43,7 +46,7 @@ /** * Abstract tests to confirm consistent behaviour for the datatype and language handling settings. - * + * * @author Peter Ansell */ public abstract class AbstractParserHandlingTest { @@ -114,7 +117,7 @@ public abstract class AbstractParserHandlingTest { /** * Returns an {@link InputStream} containing the given RDF statements in a format that is recognised by the * RDFParser returned by {@link #getParser()}. - * + * * @param unknownDatatypeStatements A {@link Model} containing statements which all contain unknown datatypes. * @return An InputStream based on the given parameters. */ @@ -125,7 +128,7 @@ protected InputStream getUnknownDatatypeStream(Model model) throws Exception { /** * Returns an {@link InputStream} containing the given RDF statements in a format that is recognised by the * RDFParser returned by {@link #getParser()}. - * + * * @param knownDatatypeStatements A {@link Model} containing statements which all contain known datatypes. * @return An InputStream based on the given parameters. */ @@ -136,7 +139,7 @@ protected InputStream getKnownDatatypeStream(Model model) throws Exception { /** * Returns an {@link InputStream} containing the given RDF statements in a format that is recognised by the * RDFParser returned by {@link #getParser()}. - * + * * @param unknownLanguageStatements A {@link Model} containing statements which all contain unknown language tags. * @return An InputStream based on the given parameters. */ @@ -147,7 +150,7 @@ protected InputStream getUnknownLanguageStream(Model model) throws Exception { /** * Returns an {@link InputStream} containing the given RDF statements in a format that is recognised by the * RDFParser returned by {@link #getParser()}. - * + * * @param knownLanguageStatements A {@link Model} containing statements which all contain known language tags. * @return An InputStream based on the given parameters. */ @@ -158,7 +161,7 @@ protected InputStream getKnownLanguageStream(Model model) throws Exception { /** * Returns an {@link InputStream} containing the given RDF statements in a format that is recognised by the * RDFParser returned by {@link #getParser()}. - * + * * @param RDFLangStringWithNoLanguageStatements A {@link Model} containing statements which all contain statements * that have RDF langString with no language tag. * @return An InputStream based on the given parameters. @@ -169,7 +172,7 @@ protected InputStream getRDFLangStringWithNoLanguageStream(Model model) throws E /** * Concrete test classes can override this to return a new instance of the RDFParser that is being tested. - * + * * @return A new instance of the RDFParser that is being tested. */ protected abstract RDFParser getParser(); @@ -917,6 +920,47 @@ public final void testSkolemization() throws Exception { assertTrue(Models.subjectBNodes(testStatements).isEmpty()); // skolemized } + @Test + public final void testRDFStarCompatibility() throws Exception { + Model expectedModel = new LinkedHashModel(); + Triple t1 = vf.createTriple(vf.createIRI("http://example.com/1"), vf.createIRI("http://example.com/2"), + vf.createLiteral("example", vf.createIRI("http://example.com/3"))); + expectedModel.add(vf.createStatement(t1, DC.SOURCE, vf.createIRI("http://example.com/4"))); + Triple t2 = vf.createTriple(t1, DC.DATE, vf.createLiteral(new Date())); + expectedModel.add(vf.createStatement(vf.createIRI("http://example.com/5"), DC.RELATION, t2)); + Triple t3 = vf.createTriple(vf.createTriple(vf.createTriple(vf.createIRI("urn:a"), RDF.TYPE, + vf.createIRI("urn:b")), vf.createIRI("urn:c"), vf.createIRI("urn:d")), vf.createIRI("urn:e"), + vf.createIRI("urn:f")); + expectedModel.add(vf.createStatement(t3, vf.createIRI("urn:same"), t3)); + + // Default: formats with RDF* support handle it natively and non-RDF* use a compatibility encoding + InputStream input1 = serialize(expectedModel); + testParser.parse(input1, BASE_URI); + assertErrorListener(0, 0, 0); + assertModel(expectedModel); + + testListener.reset(); + testStatements.clear(); + + // Turn off compatibility on parsing: formats with RDF* support will produce RDF* triples, + // non-RDF* formats will produce IRIs of the kind urn:rdf4j:triple:xxx + InputStream input2 = serialize(expectedModel); + testParser.getParserConfig().set(BasicParserSettings.PROCESS_ENCODED_RDF_STAR, false); + testParser.parse(input2, BASE_URI); + assertErrorListener(0, 0, 0); + if (testParser.getRDFFormat().supportsRDFStar()) { + assertModel(expectedModel); + } else { + assertTrue(testStatements.contains(RDFStarUtil.toRDFEncodedValue(t1), DC.SOURCE, + vf.createIRI("http://example.com/4"))); + assertTrue(testStatements.contains(vf.createIRI("http://example.com/5"), DC.RELATION, + RDFStarUtil.toRDFEncodedValue(t2))); + assertTrue(testStatements.contains(RDFStarUtil.toRDFEncodedValue(t3), vf.createIRI("urn:same"), + RDFStarUtil.toRDFEncodedValue(t3))); + assertEquals(3, testStatements.size()); + } + } + private void assertModel(Model expectedModel) { if (logger.isTraceEnabled()) { logger.trace("Expected: {}", expectedModel); diff --git a/core/rio/api/src/test/java/org/eclipse/rdf4j/rio/ParserConfigTest.java b/core/rio/api/src/test/java/org/eclipse/rdf4j/rio/ParserConfigTest.java index bdaffbc487b..ab599a70312 100644 --- a/core/rio/api/src/test/java/org/eclipse/rdf4j/rio/ParserConfigTest.java +++ b/core/rio/api/src/test/java/org/eclipse/rdf4j/rio/ParserConfigTest.java @@ -23,7 +23,7 @@ /** * Test for ParserConfig to verify that the core operations succeed and are consistent. - * + * * @author Peter Ansell */ public class ParserConfigTest { diff --git a/core/rio/api/src/test/java/org/eclipse/rdf4j/rio/RDFWriterTest.java b/core/rio/api/src/test/java/org/eclipse/rdf4j/rio/RDFWriterTest.java index 3c0d195f710..db8e90977a3 100644 --- a/core/rio/api/src/test/java/org/eclipse/rdf4j/rio/RDFWriterTest.java +++ b/core/rio/api/src/test/java/org/eclipse/rdf4j/rio/RDFWriterTest.java @@ -16,6 +16,7 @@ import java.io.BufferedOutputStream; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; +import java.io.Closeable; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; @@ -23,6 +24,7 @@ import java.io.InputStream; import java.io.OutputStream; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.HashSet; @@ -36,6 +38,7 @@ import org.eclipse.rdf4j.model.Model; import org.eclipse.rdf4j.model.Resource; import org.eclipse.rdf4j.model.Statement; +import org.eclipse.rdf4j.model.Triple; import org.eclipse.rdf4j.model.Value; import org.eclipse.rdf4j.model.ValueFactory; import org.eclipse.rdf4j.model.impl.LinkedHashModel; @@ -53,9 +56,11 @@ import org.eclipse.rdf4j.model.vocabulary.SP; import org.eclipse.rdf4j.model.vocabulary.SPIN; import org.eclipse.rdf4j.rio.helpers.BasicParserSettings; +import org.eclipse.rdf4j.rio.helpers.BasicWriterSettings; import org.eclipse.rdf4j.rio.helpers.JSONLDMode; import org.eclipse.rdf4j.rio.helpers.StatementCollector; import org.junit.Assert; +import org.junit.Assume; import org.junit.Rule; import org.junit.Test; import org.junit.rules.TemporaryFolder; @@ -113,6 +118,18 @@ public abstract class RDFWriterTest { private IRI uri5; + private Triple triple1; + + private Triple triple2; + + private Triple triple3; + + private Triple triple4; + + private Triple triple5; + + private Triple triple6; + private Literal plainLit; private Literal dtLit; @@ -177,6 +194,13 @@ protected RDFWriterTest(RDFWriterFactory writerF, RDFParserFactory parserF) { litBigPlaceholder = vf.createLiteral(prng.nextDouble()); + triple1 = vf.createTriple(uri1, uri2, plainLit); + triple2 = vf.createTriple(bnode, uri3, litWithMultipleNewlines); + triple3 = vf.createTriple(uri3, uri4, bnodeSingleLetter); + triple4 = vf.createTriple(uri5, uri1, uri3); + triple5 = vf.createTriple(triple1, uri3, litBigPlaceholder); + triple6 = vf.createTriple(triple2, uri4, triple5); + potentialSubjects = new ArrayList<>(); potentialSubjects.add(bnode); potentialSubjects.add(bnodeEmpty); @@ -190,6 +214,7 @@ protected RDFWriterTest(RDFWriterFactory writerF, RDFParserFactory parserF) { potentialSubjects.add(uri3); potentialSubjects.add(uri4); potentialSubjects.add(uri5); + potentialSubjects.addAll(Arrays.asList(triple1, triple2, triple2, triple3, triple4, triple5, triple6)); for (int i = 0; i < 50; i++) { potentialSubjects.add(vf.createBNode()); } @@ -212,6 +237,7 @@ protected RDFWriterTest(RDFWriterFactory writerF, RDFParserFactory parserF) { potentialObjects.add(plainLit); potentialObjects.add(dtLit); potentialObjects.add(langLit); + potentialObjects.addAll(Arrays.asList(triple1, triple2, triple2, triple3, triple4, triple5, triple6)); // FIXME: SES-879: The following break the RDF/XML parser/writer // combination in terms of getting the same number of triples back as we // start with @@ -264,7 +290,7 @@ protected RDFWriterTest(RDFWriterFactory writerF, RDFParserFactory parserF) { * One example of this is that {@link JSONLDMode#EXPAND} does not preserve namespace prefixes, causing the tests * here to be unnecessarily ignored. The fix for that is to override this method and set the mode to * {@link JSONLDMode#COMPACT} that does preserve namespaces. - * + * * @param config The config object to modify. */ protected void setupWriterConfig(WriterConfig config) { @@ -272,7 +298,7 @@ protected void setupWriterConfig(WriterConfig config) { /** * Override this method to setup custom settings for ParserConfig needed to pass tests. - * + * * @param config The config object to modify. */ protected void setupParserConfig(ParserConfig config) { @@ -353,8 +379,8 @@ private void testRoundTripInternal(boolean preserveBNodeIds) ByteArrayOutputStream out = new ByteArrayOutputStream(); RDFWriter rdfWriter = rdfWriterFactory.getWriter(out); setupWriterConfig(rdfWriter.getWriterConfig()); - rdfWriter.handleNamespace("ex", exNs); rdfWriter.startRDF(); + rdfWriter.handleNamespace("ex", exNs); rdfWriter.handleStatement(st1); rdfWriter.handleStatement(st2); rdfWriter.handleStatement(st3); @@ -503,8 +529,8 @@ public void testRoundTripNaN921() throws RDFHandlerException, IOException, RDFPa ByteArrayOutputStream out = new ByteArrayOutputStream(); RDFWriter rdfWriter = rdfWriterFactory.getWriter(out); setupWriterConfig(rdfWriter.getWriterConfig()); - rdfWriter.handleNamespace("ex", exNs); rdfWriter.startRDF(); + rdfWriter.handleNamespace("ex", exNs); rdfWriter.handleStatement(st1); rdfWriter.handleStatement(st2); rdfWriter.handleStatement(st3); @@ -540,10 +566,10 @@ public void testPrefixRedefinition() throws RDFHandlerException, RDFParseExcepti ByteArrayOutputStream out = new ByteArrayOutputStream(); RDFWriter rdfWriter = rdfWriterFactory.getWriter(out); setupWriterConfig(rdfWriter.getWriterConfig()); + rdfWriter.startRDF(); rdfWriter.handleNamespace("", ns1); rdfWriter.handleNamespace("", ns2); rdfWriter.handleNamespace("", ns3); - rdfWriter.startRDF(); rdfWriter.handleStatement(st); rdfWriter.endRDF(); @@ -577,10 +603,10 @@ public void testIllegalPrefix() throws RDFHandlerException, RDFParseException, I ByteArrayOutputStream out = new ByteArrayOutputStream(); RDFWriter rdfWriter = rdfWriterFactory.getWriter(out); setupWriterConfig(rdfWriter.getWriterConfig()); + rdfWriter.startRDF(); rdfWriter.handleNamespace("1", ns1); rdfWriter.handleNamespace("_", ns2); rdfWriter.handleNamespace("a%", ns3); - rdfWriter.startRDF(); rdfWriter.handleStatement(st); rdfWriter.endRDF(); @@ -605,16 +631,16 @@ public void testDefaultNamespace() throws Exception { ByteArrayOutputStream out = new ByteArrayOutputStream(); RDFWriter rdfWriter = rdfWriterFactory.getWriter(out); setupWriterConfig(rdfWriter.getWriterConfig()); + rdfWriter.startRDF(); rdfWriter.handleNamespace("", RDF.NAMESPACE); rdfWriter.handleNamespace("rdf", RDF.NAMESPACE); - rdfWriter.startRDF(); rdfWriter.handleStatement(vf.createStatement(vf.createIRI(RDF.NAMESPACE), RDF.TYPE, OWL.ONTOLOGY)); rdfWriter.endRDF(); } /** * Test specifically for bnode collisions of the form "a" -> "aa", with preserve BNode ids setting on. - * + * * @throws Exception */ @Test @@ -624,7 +650,7 @@ public void testSES2030BNodeCollisionsPreserveBNodeIds() throws Exception { /** * Test specifically for bnode collisions of the form "a" -> "aa", with preserve BNode ids setting off. - * + * * @throws Exception */ @Test @@ -660,7 +686,7 @@ private void testSES2030BNodeCollisionsInternal(boolean preserveBNodeIDs) throws /** * Fuzz and performance test designed to find cases where parsers and/or writers are incompatible with each other. - * + * * @throws Exception */ @Test @@ -670,7 +696,7 @@ public void testPerformance() throws Exception { /** * Tests raw parser performance, without checking for consistency, by not storing the resulting triples. - * + * * @throws Exception */ @Test @@ -695,8 +721,17 @@ private void testPerformanceInternal(boolean storeParsedStatements) throws Excep obj = vf.createLiteral(big.toString()); } + IRI pred = potentialPredicates.get(prng.nextInt(potentialPredicates.size())); + while (obj instanceof Triple && pred.equals(RDF.TYPE)) { + // Avoid statements "x rdf:type <>" as those use the shorter syntax in RDFXMLPrettyWriter + // and the writer produces invalid XML in that case. Even though the RDF* triples are encoded as + // valid IRIs, XML has limitations on what characters may form an XML tag name and thus a limitation + // on what IRIs may be used in predicates (predicates are XML tags) or the short form of rdf:type + // (where the type is also an XML tag). + obj = potentialObjects.get(prng.nextInt(potentialObjects.size())); + } model.add(potentialSubjects.get(prng.nextInt(potentialSubjects.size())), - potentialPredicates.get(prng.nextInt(potentialPredicates.size())), obj); + pred, obj); } logger.debug("Test class: " + this.getClass().getName()); logger.debug("Test statements size: " + model.size() + " (" + rdfWriterFactory.getRDFFormat() + ")"); @@ -710,12 +745,12 @@ private void testPerformanceInternal(boolean storeParsedStatements) throws Excep RDFWriter rdfWriter = rdfWriterFactory.getWriter(out); setupWriterConfig(rdfWriter.getWriterConfig()); // Test prefixed URIs for only some of the URIs available + rdfWriter.startRDF(); rdfWriter.handleNamespace(RDF.PREFIX, RDF.NAMESPACE); rdfWriter.handleNamespace(SKOS.PREFIX, SKOS.NAMESPACE); rdfWriter.handleNamespace(FOAF.PREFIX, FOAF.NAMESPACE); rdfWriter.handleNamespace(EARL.PREFIX, EARL.NAMESPACE); rdfWriter.handleNamespace("ex", exNs); - rdfWriter.startRDF(); for (Statement nextSt : model) { rdfWriter.handleStatement(nextSt); @@ -1757,6 +1792,81 @@ public void testBogusIRICharacters() throws Exception { Assert.assertEquals(model.size(), parsedOutput.size()); } + @Test + public void testRDFStarConversion() throws IOException { + Model model = new LinkedHashModel(); + model.add(vf.createStatement(triple3, uri1, triple6, uri4)); + model.add(vf.createStatement(uri1, uri2, uri3, uri5)); + + ByteArrayOutputStream outputWriter = new ByteArrayOutputStream(); + RDFWriter rdfWriter = rdfWriterFactory.getWriter(outputWriter); + setupWriterConfig(rdfWriter.getWriterConfig()); + rdfWriter.getWriterConfig().set(BasicWriterSettings.CONVERT_RDF_STAR_TO_REIFICATION, true); + rdfWriter.startRDF(); + model.forEach(rdfWriter::handleStatement); + rdfWriter.endRDF(); + + ByteArrayInputStream inputReader = new ByteArrayInputStream(outputWriter.toByteArray()); + RDFParser rdfParser = rdfParserFactory.getParser(); + setupParserConfig(rdfParser.getParserConfig().set(BasicParserSettings.VERIFY_URI_SYNTAX, false)); + Model parsedOutput = new LinkedHashModel(); + rdfParser.setRDFHandler(new StatementCollector(parsedOutput)); + rdfParser.parse(inputReader, ""); + + // 1 non-RDF* statement + // 1 RDF* statement whose conversion yields 20 additional statements: + // 4 for triple3 + // 4 for triple6 + // 4 for triple2 (contained in triple6) + // 4 for triple5 (contained in triple6) + // 4 for triple1 (contained in triple5) + assertEquals(22, parsedOutput.size()); + } + + @Test + public void testHandlingSequenceCloseableWriter() throws IOException { + // If an RDFWriter is a Closeable and it calls endRDF() explicitly on close() we should check + // it's consistent in various situations. Currently only RDFXMLPrettyWriter is a Closeable. + boolean[][] options = { + // call endRDF(), don't call close() + { true, false }, + // don't call endRDF(), call close() + { false, true }, + // call endRDF(), call close() + { true, true }, + }; + + Set sizes = new HashSet<>(); + for (boolean[] opts : options) { + try (ByteArrayOutputStream outs = new ByteArrayOutputStream()) { + RDFWriter rdfWriter = rdfWriterFactory.getWriter(outs); + + Assume.assumeTrue("Test makes sense only if RDFWriter is a Closeable", + rdfWriter instanceof Closeable); + + rdfWriter.startRDF(); + rdfWriter.handleNamespace("ex", "http://example.com/"); + rdfWriter.handleStatement(vf.createStatement(vf.createIRI("urn:a"), RDF.TYPE, RDF.STATEMENT)); + rdfWriter.handleComment("this is a comment"); + + if (opts[0]) { + rdfWriter.endRDF(); + sizes.add(outs.size()); + } + + if (opts[1]) { + ((Closeable) rdfWriter).close(); + sizes.add(outs.size()); + // Calling close() more than once shouldn't break things + ((Closeable) rdfWriter).close(); + sizes.add(outs.size()); + } + } + } + + assertEquals(1, sizes.size()); + } + private void assertSameModel(Model expected, Model actual) { assertEquals(expected.size(), actual.size()); assertEquals(expected.subjects().size(), actual.subjects().size()); diff --git a/core/rio/api/src/test/java/org/eclipse/rdf4j/rio/helpers/NTriplesUtilTest.java b/core/rio/api/src/test/java/org/eclipse/rdf4j/rio/helpers/NTriplesUtilTest.java new file mode 100644 index 00000000000..e7ace56f1e0 --- /dev/null +++ b/core/rio/api/src/test/java/org/eclipse/rdf4j/rio/helpers/NTriplesUtilTest.java @@ -0,0 +1,144 @@ +/******************************************************************************* + * Copyright (c) 2019 Eclipse RDF4J contributors. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Distribution License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ +package org.eclipse.rdf4j.rio.helpers; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.fail; + +import java.io.IOException; +import java.util.function.Function; + +import org.eclipse.rdf4j.model.Literal; +import org.eclipse.rdf4j.model.Resource; +import org.eclipse.rdf4j.model.Triple; +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.DC; +import org.junit.Before; +import org.junit.Test; + +/** + * Unit tests for {@link NTriplesUtil} + * + * @author Jeen Broekstra + * + */ +public class NTriplesUtilTest { + + private StringBuilder appendable; + private ValueFactory f = SimpleValueFactory.getInstance(); + + @Before + public void setUp() throws Exception { + appendable = new StringBuilder(); + } + + @Test + public void testAppendWithoutEncoding() throws Exception { + Literal l = f.createLiteral("Äbc"); + NTriplesUtil.append(l, appendable, true, false); + assertThat(appendable.toString()).isEqualTo("\"Äbc\""); + } + + @Test + public void testAppendWithEncoding() throws Exception { + Literal l = f.createLiteral("Äbc"); + NTriplesUtil.append(l, appendable, true, true); + assertThat(appendable.toString()).isEqualTo("\"\\u00C4bc\""); + } + + @Test + public void testSerializeTriple() throws IOException { + Object[] triples = new Object[] { + f.createTriple(f.createIRI("urn:a"), f.createIRI("urn:b"), f.createIRI("urn:c")), + "<< >>", + // + f.createTriple(f.createTriple(f.createIRI("urn:a"), f.createIRI("urn:b"), f.createIRI("urn:c")), + DC.SOURCE, f.createLiteral("news")), + "<<<< >> \"news\">>", + // + f.createTriple(f.createBNode("bnode1"), f.createIRI("urn:x"), + f.createTriple(f.createIRI("urn:a"), f.createIRI("urn:b"), f.createIRI("urn:c"))), + "<<_:bnode1 << >>>>" + }; + + for (int i = 0; i < triples.length; i += 2) { + assertEquals(triples[i + 1], NTriplesUtil.toNTriplesString((Triple) triples[i])); + assertEquals(triples[i + 1], NTriplesUtil.toNTriplesString((Resource) triples[i])); + assertEquals(triples[i + 1], NTriplesUtil.toNTriplesString((Value) triples[i])); + NTriplesUtil.append((Triple) triples[i], appendable); + assertEquals(triples[i + 1], appendable.toString()); + appendable = new StringBuilder(); + NTriplesUtil.append((Resource) triples[i], appendable); + assertEquals(triples[i + 1], appendable.toString()); + appendable = new StringBuilder(); + NTriplesUtil.append((Value) triples[i], appendable); + assertEquals(triples[i + 1], appendable.toString()); + appendable = new StringBuilder(); + } + } + + @Test + public void testParseTriple() { + String[] triples = new String[] { + "<<<<\"täst\"@de-DE>>>>", + "<>>>", + // + "<< << \"täst\"@de-DE >> >>", + "<>>>", + // + "<<<<_:bnode1foobar\"literál за проба\"^^>>\"test\\\\\\\"lit\">>", + "<<<<_:bnode1foobar urn:täst \"literál за проба\"^^>> http://test/baz \"test\\\"lit\">>", + // + "<< <<_:bnode1foobar \"literál за проба\"^^ >> \"test\\\\\\\"lit\" >>", + "<<<<_:bnode1foobar urn:täst \"literál за проба\"^^>> http://test/baz \"test\\\"lit\">>", + // test surrogate pair range in bnode + "<<_:test_\uD800\uDC00_\uD840\uDC00_bnode >>", + "<<_:test_\uD800\uDC00_\uD840\uDC00_bnode urn:x urn:y>>", + // invalid: missing closing >> for inner triple + "<<<<_:bnode1foobar\"literál за проба\"^^\"test\\\\\\\"lit\">>", + null, + // invalid: missing closing >> for outer triple + "<<<<_:bnode1foobar\"literál за проба\"^^>>\"test\\\\\\\"lit\"", + null, + // invalid: literal subject + "<<\"test\" \"test\">>", + null, + // invalid: bnode predicate + "<< _:test \"test\">>", + null, + // invalid: triple predicate + "<< << >> >>", + null + }; + + for (int i = 0; i < triples.length; i += 2) { + parseTriple(triples[i], triples[i + 1], (t) -> NTriplesUtil.parseTriple(t, f)); + parseTriple(triples[i], triples[i + 1], (t) -> (Triple) NTriplesUtil.parseValue(t, f)); + parseTriple(triples[i], triples[i + 1], (t) -> (Triple) NTriplesUtil.parseResource(t, f)); + } + } + + private void parseTriple(String triple, String expected, Function parser) { + try { + Triple t = parser.apply(triple); + assertEquals(expected, t.stringValue()); + } catch (IllegalArgumentException e) { + if (expected != null) { + fail("Unexpected exception for valid triple: " + triple); + } + } + } + + @Test(expected = IllegalArgumentException.class) + public void testParseIRIvsTriple() { + NTriplesUtil.parseURI("<<>>", f); + } +} diff --git a/core/rio/api/src/test/java/org/eclipse/rdf4j/rio/helpers/RDFParserHelperTest.java b/core/rio/api/src/test/java/org/eclipse/rdf4j/rio/helpers/RDFParserHelperTest.java index 1f20fed1760..be7895ddcfc 100644 --- a/core/rio/api/src/test/java/org/eclipse/rdf4j/rio/helpers/RDFParserHelperTest.java +++ b/core/rio/api/src/test/java/org/eclipse/rdf4j/rio/helpers/RDFParserHelperTest.java @@ -7,7 +7,10 @@ *******************************************************************************/ package org.eclipse.rdf4j.rio.helpers; -import static org.junit.Assert.*; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; import java.util.Collections; import java.util.HashSet; @@ -31,7 +34,7 @@ /** * Tests for {@link RDFParserHelper} methods. - * + * * @author Peter Ansell */ public class RDFParserHelperTest { @@ -317,7 +320,7 @@ public final void testReportFatalErrorExceptionIntInt() throws Exception { /** * Private method for verifying the number of errors that were logged to the {@link ParseErrorListener}. - * + * * @param fatalErrors Expected number of fatal errors logged by error listener. * @param errors Expected number of errors logged by error listener. * @param warnings Expected number of warnings logged by error listener. diff --git a/core/rio/api/src/test/java/org/eclipse/rdf4j/rio/helpers/RDFStarUtilTest.java b/core/rio/api/src/test/java/org/eclipse/rdf4j/rio/helpers/RDFStarUtilTest.java new file mode 100644 index 00000000000..4a11b8dfd8a --- /dev/null +++ b/core/rio/api/src/test/java/org/eclipse/rdf4j/rio/helpers/RDFStarUtilTest.java @@ -0,0 +1,115 @@ +/******************************************************************************* + * Copyright (c) 2020 Eclipse RDF4J contributors. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Distribution License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ +package org.eclipse.rdf4j.rio.helpers; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertSame; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +import org.eclipse.rdf4j.model.BNode; +import org.eclipse.rdf4j.model.IRI; +import org.eclipse.rdf4j.model.Literal; +import org.eclipse.rdf4j.model.Triple; +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.junit.Test; + +/** + * @author Pavel Mihaylov + */ +public class RDFStarUtilTest { + private ValueFactory vf = SimpleValueFactory.getInstance(); + + @Test + public void testEncoding() { + IRI iri = vf.createIRI("urn:a"); + assertSame(iri, RDFStarUtil.toRDFEncodedValue(iri)); + assertFalse(RDFStarUtil.isEncodedTriple(iri)); + + Literal literal1 = vf.createLiteral("plain"); + assertSame(literal1, RDFStarUtil.toRDFEncodedValue(literal1)); + assertFalse(RDFStarUtil.isEncodedTriple(literal1)); + + Literal literal2 = vf.createLiteral(1984L); + assertSame(literal2, RDFStarUtil.toRDFEncodedValue(literal2)); + assertFalse(RDFStarUtil.isEncodedTriple(literal2)); + + Literal literal3 = vf.createLiteral("einfach aber auf deutsch", "de"); + assertSame(literal3, RDFStarUtil.toRDFEncodedValue(literal3)); + assertFalse(RDFStarUtil.isEncodedTriple(literal3)); + + BNode bNode = vf.createBNode("bnode1"); + assertSame(bNode, RDFStarUtil.toRDFEncodedValue(bNode)); + assertFalse(RDFStarUtil.isEncodedTriple(bNode)); + + Triple triple = vf.createTriple(iri, RDF.TYPE, literal1); + assertEquals(vf.createIRI("urn:rdf4j:triple:PDw8dXJuOmE-IDxodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1ze" + + "W50YXgtbnMjdHlwZT4gInBsYWluIj4-"), + RDFStarUtil.toRDFEncodedValue(triple)); + assertFalse(RDFStarUtil.isEncodedTriple(triple)); + assertTrue(RDFStarUtil.isEncodedTriple(RDFStarUtil.toRDFEncodedValue(triple))); + } + + @Test + public void testDecoding() { + IRI iri = vf.createIRI("urn:a"); + assertSame(iri, RDFStarUtil.fromRDFEncodedValue(iri)); + + Literal literal1 = vf.createLiteral("plain"); + assertSame(literal1, RDFStarUtil.fromRDFEncodedValue(literal1)); + assertFalse(RDFStarUtil.isEncodedTriple(literal1)); + + Literal literal2 = vf.createLiteral(1984L); + assertSame(literal2, RDFStarUtil.fromRDFEncodedValue(literal2)); + + Literal literal3 = vf.createLiteral("einfach aber auf deutsch", "de"); + assertSame(literal3, RDFStarUtil.fromRDFEncodedValue(literal3)); + assertFalse(RDFStarUtil.isEncodedTriple(literal3)); + + BNode bNode = vf.createBNode("bnode1"); + assertSame(bNode, RDFStarUtil.fromRDFEncodedValue(bNode)); + + IRI encoded = vf.createIRI("urn:rdf4j:triple:PDw8dXJuOmE-IDxodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1ze" + + "W50YXgtbnMjdHlwZT4gInBsYWluIj4-"); + Value decoded = RDFStarUtil.fromRDFEncodedValue(encoded); + assertTrue(decoded instanceof Triple); + assertEquals(iri, ((Triple) decoded).getSubject()); + assertEquals(RDF.TYPE, ((Triple) decoded).getPredicate()); + assertEquals(literal1, ((Triple) decoded).getObject()); + } + + @Test + public void testInvalidEncodedValue() { + IRI[] invalidValues = { + vf.createIRI("urn:rdf4j:triple:"), + vf.createIRI("urn:rdf4j:triple:foo"), + vf.createIRI("urn:rdf4j:triple:кирилица"), + vf.createIRI("urn:rdf4j:triple:PDw8dXJuOmE-"), + // Missing final - + vf.createIRI("urn:rdf4j:triple:PDw8dXJuOmE-IDxodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1ze" + + "W50YXgtbnMjdHlwZT4gInBsYWluIj4"), + // Extra x at the end + vf.createIRI("urn:rdf4j:triple:PDw8dXJuOmE-IDxodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1ze" + + "W50YXgtbnMjdHlwZT4gInBsYWluIj4-x"), + }; + + for (IRI invalidValue : invalidValues) { + assertTrue(RDFStarUtil.isEncodedTriple(invalidValue)); + try { + RDFStarUtil.fromRDFEncodedValue(invalidValue); + fail("Must fail because of invalid value"); + } catch (IllegalArgumentException e) { + assertTrue(e.getMessage().startsWith("Invalid RDF* encoded triple")); + } + } + } +} diff --git a/core/rio/api/src/test/java/org/eclipse/rdf4j/rio/helpers/RioSettingTest.java b/core/rio/api/src/test/java/org/eclipse/rdf4j/rio/helpers/RioSettingTest.java index 6e182061e4a..849a1e45cdf 100644 --- a/core/rio/api/src/test/java/org/eclipse/rdf4j/rio/helpers/RioSettingTest.java +++ b/core/rio/api/src/test/java/org/eclipse/rdf4j/rio/helpers/RioSettingTest.java @@ -48,14 +48,14 @@ public void testConvertIllegal() throws Exception { /** * a (legal) default value for the type T - * + * * @return a single legal default value. */ protected abstract T getDefaultValue(); /** * a legal string-represention of a setting value - * + * * @return a legal string-representation of a setting value. */ protected abstract String getLegalStringValue(); @@ -63,21 +63,21 @@ public void testConvertIllegal() throws Exception { /** * the value of type T that corresponds to the value returned by {@link #getLegalStringValue()}. NB implementors * should return a hardcoded value, not doing on-the-fly conversion. - * + * * @return a value of type T corresponding to the the value returned by {@link #getLegalStringValue()} */ protected abstract T getConvertedStringValue(); /** * an illegal string-representation of a setting value. - * + * * @return an illegal string value; */ protected abstract String getIllegalStringValue(); /** * Create a new {@link RioSetting} for use as the test subject. - * + * * @param key the setting key * @param description the setting description * @param defaultValue the default value diff --git a/core/rio/api/src/test/java/org/eclipse/rdf4j/rio/helpers/StatementCollectorTest.java b/core/rio/api/src/test/java/org/eclipse/rdf4j/rio/helpers/StatementCollectorTest.java index 686c1a781f1..7bb9df9bd92 100644 --- a/core/rio/api/src/test/java/org/eclipse/rdf4j/rio/helpers/StatementCollectorTest.java +++ b/core/rio/api/src/test/java/org/eclipse/rdf4j/rio/helpers/StatementCollectorTest.java @@ -169,7 +169,7 @@ public final void testEndRDF() throws Exception { /** * Test method for {@link org.eclipse.rdf4j.rio.helpers.AbstractRDFHandler#handleComment(java.lang.String)} . - * + * * @throws Exception */ @Test diff --git a/core/rio/binary/pom.xml b/core/rio/binary/pom.xml index 6c3e3342e3a..34e0fbd19fe 100644 --- a/core/rio/binary/pom.xml +++ b/core/rio/binary/pom.xml @@ -4,7 +4,7 @@ org.eclipse.rdf4j rdf4j-rio - 3.1.5-SNAPSHOT + 3.2.2-SNAPSHOT rdf4j-rio-binary RDF4J: Rio - Binary diff --git a/core/rio/binary/src/main/java/org/eclipse/rdf4j/rio/binary/BinaryRDFConstants.java b/core/rio/binary/src/main/java/org/eclipse/rdf4j/rio/binary/BinaryRDFConstants.java index c2ee4b21c7a..a752e3384f5 100644 --- a/core/rio/binary/src/main/java/org/eclipse/rdf4j/rio/binary/BinaryRDFConstants.java +++ b/core/rio/binary/src/main/java/org/eclipse/rdf4j/rio/binary/BinaryRDFConstants.java @@ -48,4 +48,6 @@ class BinaryRDFConstants { static final int DATATYPE_LITERAL_VALUE = 5; static final int VALUE_REF = 6; + + static final int TRIPLE_VALUE = 7; } diff --git a/core/rio/binary/src/main/java/org/eclipse/rdf4j/rio/binary/BinaryRDFParser.java b/core/rio/binary/src/main/java/org/eclipse/rdf4j/rio/binary/BinaryRDFParser.java index 1f6c73f1bc7..4acad4cbf57 100644 --- a/core/rio/binary/src/main/java/org/eclipse/rdf4j/rio/binary/BinaryRDFParser.java +++ b/core/rio/binary/src/main/java/org/eclipse/rdf4j/rio/binary/BinaryRDFParser.java @@ -18,6 +18,7 @@ import static org.eclipse.rdf4j.rio.binary.BinaryRDFConstants.NULL_VALUE; import static org.eclipse.rdf4j.rio.binary.BinaryRDFConstants.PLAIN_LITERAL_VALUE; import static org.eclipse.rdf4j.rio.binary.BinaryRDFConstants.STATEMENT; +import static org.eclipse.rdf4j.rio.binary.BinaryRDFConstants.TRIPLE_VALUE; import static org.eclipse.rdf4j.rio.binary.BinaryRDFConstants.URI_VALUE; import static org.eclipse.rdf4j.rio.binary.BinaryRDFConstants.VALUE_DECL; import static org.eclipse.rdf4j.rio.binary.BinaryRDFConstants.VALUE_REF; @@ -34,6 +35,7 @@ import org.eclipse.rdf4j.model.Literal; import org.eclipse.rdf4j.model.Resource; import org.eclipse.rdf4j.model.Statement; +import org.eclipse.rdf4j.model.Triple; import org.eclipse.rdf4j.model.Value; import org.eclipse.rdf4j.rio.RDFFormat; import org.eclipse.rdf4j.rio.RDFHandlerException; @@ -202,6 +204,8 @@ private Value readValue() throws RDFParseException, IOException { return readLangLiteral(); case DATATYPE_LITERAL_VALUE: return readDatatypeLiteral(); + case TRIPLE_VALUE: + return readTriple(); default: reportFatalError("Unknown value type: " + valueType); return null; @@ -241,6 +245,21 @@ private Literal readDatatypeLiteral() throws IOException, RDFParseException { return createLiteral(label, null, dtUri, -1, -1); } + private Triple readTriple() throws IOException { + Value subject = readValue(); + if (subject instanceof Resource) { + Value predicate = readValue(); + if (predicate instanceof IRI) { + Value object = readValue(); + + return valueFactory.createTriple((Resource) subject, (IRI) predicate, object); + } + } + + reportFatalError("Invalid RDF* triple value"); + return null; + } + private String readString() throws IOException { int stringLength = in.readInt(); int stringBytes = stringLength << 1; diff --git a/core/rio/binary/src/main/java/org/eclipse/rdf4j/rio/binary/BinaryRDFParserFactory.java b/core/rio/binary/src/main/java/org/eclipse/rdf4j/rio/binary/BinaryRDFParserFactory.java index f9e25727197..f487b1afd6f 100644 --- a/core/rio/binary/src/main/java/org/eclipse/rdf4j/rio/binary/BinaryRDFParserFactory.java +++ b/core/rio/binary/src/main/java/org/eclipse/rdf4j/rio/binary/BinaryRDFParserFactory.java @@ -13,7 +13,7 @@ /** * An {@link RDFParserFactory} for Binary RDF parsers. - * + * * @author Arjohn Kampman */ public class BinaryRDFParserFactory implements RDFParserFactory { diff --git a/core/rio/binary/src/main/java/org/eclipse/rdf4j/rio/binary/BinaryRDFWriter.java b/core/rio/binary/src/main/java/org/eclipse/rdf4j/rio/binary/BinaryRDFWriter.java index 362a836e6d6..b455d57f58f 100644 --- a/core/rio/binary/src/main/java/org/eclipse/rdf4j/rio/binary/BinaryRDFWriter.java +++ b/core/rio/binary/src/main/java/org/eclipse/rdf4j/rio/binary/BinaryRDFWriter.java @@ -17,6 +17,7 @@ import static org.eclipse.rdf4j.rio.binary.BinaryRDFConstants.NAMESPACE_DECL; import static org.eclipse.rdf4j.rio.binary.BinaryRDFConstants.NULL_VALUE; import static org.eclipse.rdf4j.rio.binary.BinaryRDFConstants.STATEMENT; +import static org.eclipse.rdf4j.rio.binary.BinaryRDFConstants.TRIPLE_VALUE; import static org.eclipse.rdf4j.rio.binary.BinaryRDFConstants.URI_VALUE; import static org.eclipse.rdf4j.rio.binary.BinaryRDFConstants.VALUE_REF; @@ -35,6 +36,7 @@ import org.eclipse.rdf4j.model.IRI; import org.eclipse.rdf4j.model.Literal; import org.eclipse.rdf4j.model.Statement; +import org.eclipse.rdf4j.model.Triple; import org.eclipse.rdf4j.model.Value; import org.eclipse.rdf4j.model.util.Literals; import org.eclipse.rdf4j.rio.RDFFormat; @@ -57,8 +59,6 @@ public class BinaryRDFWriter extends AbstractRDFWriter implements RDFWriter { private final DataOutputStream out; - private boolean writingStarted = false; - private byte[] buf; public BinaryRDFWriter(OutputStream out) { @@ -66,6 +66,7 @@ public BinaryRDFWriter(OutputStream out) { } public BinaryRDFWriter(OutputStream out, int bufferSize) { + super(out); this.out = new DataOutputStream(new BufferedOutputStream(out)); this.statementQueue = new ArrayBlockingQueue<>(bufferSize); this.valueFreq = new HashMap<>(3 * bufferSize); @@ -79,27 +80,24 @@ public RDFFormat getRDFFormat() { @Override public void startRDF() throws RDFHandlerException { - if (!writingStarted) { - writingStarted = true; - try { - out.write(MAGIC_NUMBER); - out.writeInt(FORMAT_VERSION); - } catch (IOException e) { - throw new RDFHandlerException(e); - } + super.startRDF(); + try { + out.write(MAGIC_NUMBER); + out.writeInt(FORMAT_VERSION); + } catch (IOException e) { + throw new RDFHandlerException(e); } } @Override public void endRDF() throws RDFHandlerException { - startRDF(); + checkWritingStarted(); try { while (!statementQueue.isEmpty()) { writeStatement(); } out.writeByte(END_OF_DATA); out.flush(); - writingStarted = false; } catch (IOException e) { throw new RDFHandlerException(e); } @@ -107,7 +105,7 @@ public void endRDF() throws RDFHandlerException { @Override public void handleNamespace(String prefix, String uri) throws RDFHandlerException { - startRDF(); + checkWritingStarted(); try { out.writeByte(NAMESPACE_DECL); writeString(prefix); @@ -119,7 +117,7 @@ public void handleNamespace(String prefix, String uri) throws RDFHandlerExceptio @Override public void handleComment(String comment) throws RDFHandlerException { - startRDF(); + checkWritingStarted(); try { out.writeByte(COMMENT); writeString(comment); @@ -129,7 +127,7 @@ public void handleComment(String comment) throws RDFHandlerException { } @Override - public void handleStatement(Statement st) throws RDFHandlerException { + protected void consumeStatement(Statement st) { statementQueue.add(st); incValueFreq(st.getSubject()); incValueFreq(st.getPredicate()); @@ -142,7 +140,6 @@ public void handleStatement(Statement st) throws RDFHandlerException { } // Process the first statement from the queue - startRDF(); try { writeStatement(); } catch (IOException e) { @@ -247,6 +244,8 @@ private void writeValue(Value value) throws RDFHandlerException, IOException { writeBNode((BNode) value); } else if (value instanceof Literal) { writeLiteral((Literal) value); + } else if (value instanceof Triple) { + writeTriple((Triple) value); } else { throw new RDFHandlerException("Unknown Value object type: " + value.getClass()); } @@ -277,6 +276,13 @@ private void writeLiteral(Literal literal) throws IOException { } } + private void writeTriple(Triple triple) throws IOException { + out.writeByte(TRIPLE_VALUE); + writeValue(triple.getSubject()); + writeValue(triple.getPredicate()); + writeValue(triple.getObject()); + } + private void writeString(String s) throws IOException { int strLen = s.length(); out.writeInt(strLen); diff --git a/core/rio/binary/src/main/java/org/eclipse/rdf4j/rio/binary/BinaryRDFWriterFactory.java b/core/rio/binary/src/main/java/org/eclipse/rdf4j/rio/binary/BinaryRDFWriterFactory.java index 674ae87bfa6..aa2caa8af2e 100644 --- a/core/rio/binary/src/main/java/org/eclipse/rdf4j/rio/binary/BinaryRDFWriterFactory.java +++ b/core/rio/binary/src/main/java/org/eclipse/rdf4j/rio/binary/BinaryRDFWriterFactory.java @@ -16,7 +16,7 @@ /** * An {@link RDFWriterFactory} for Binary RDF writers. - * + * * @author Arjohn Kampman */ public class BinaryRDFWriterFactory implements RDFWriterFactory { diff --git a/core/rio/binary/src/test/java/org/eclipse/rdf4j/rio/binary/BinaryHandlingTest.java b/core/rio/binary/src/test/java/org/eclipse/rdf4j/rio/binary/BinaryHandlingTest.java index c62c5a859b8..1c72668fdb6 100644 --- a/core/rio/binary/src/test/java/org/eclipse/rdf4j/rio/binary/BinaryHandlingTest.java +++ b/core/rio/binary/src/test/java/org/eclipse/rdf4j/rio/binary/BinaryHandlingTest.java @@ -8,45 +8,23 @@ package org.eclipse.rdf4j.rio.binary; import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.InputStream; +import java.io.OutputStream; import org.eclipse.rdf4j.model.Model; -import org.eclipse.rdf4j.model.Statement; import org.eclipse.rdf4j.rio.AbstractParserHandlingTest; -import org.eclipse.rdf4j.rio.RDFHandlerException; import org.eclipse.rdf4j.rio.RDFParser; import org.eclipse.rdf4j.rio.RDFWriter; /** * Test for error handling by Binary Parser. - * + * * @author Peter Ansell */ public class BinaryHandlingTest extends AbstractParserHandlingTest { - @Override - protected InputStream getUnknownDatatypeStream(Model unknownDatatypeStatements) throws Exception { - return writeBinary(unknownDatatypeStatements); - } - - @Override - protected InputStream getKnownDatatypeStream(Model knownDatatypeStatements) throws Exception { - return writeBinary(knownDatatypeStatements); - } - - @Override - protected InputStream getUnknownLanguageStream(Model unknownLanguageStatements) throws Exception { - return writeBinary(unknownLanguageStatements); - } - - @Override - protected InputStream getKnownLanguageStream(Model knownLanguageStatements) throws Exception { - return writeBinary(knownLanguageStatements); - } - @Override protected InputStream getRDFLangStringWithNoLanguageStream(Model model) throws Exception { String fileName = "src/test/resources/testcases/binary/binary-RDF-langString-no-language-test.rdf"; @@ -65,24 +43,8 @@ protected RDFParser getParser() { return new BinaryRDFParser(); } - /** - * Helper method to write the given model to N-Triples and return an InputStream containing the results. - * - * @param statements - * @return An {@link InputStream} containing the results. - * @throws RDFHandlerException - */ - private InputStream writeBinary(Model statements) throws RDFHandlerException { - ByteArrayOutputStream output = new ByteArrayOutputStream(8096); - - RDFWriter binaryWriter = new BinaryRDFWriter(output); - binaryWriter.startRDF(); - for (Statement nextStatement : statements) { - binaryWriter.handleStatement(nextStatement); - } - binaryWriter.endRDF(); - - return new ByteArrayInputStream(output.toByteArray()); + @Override + protected RDFWriter createWriter(OutputStream output) { + return new BinaryRDFWriter(output); } - } diff --git a/core/rio/datatypes/pom.xml b/core/rio/datatypes/pom.xml index 2ddab3cdb65..1e7de1afc17 100644 --- a/core/rio/datatypes/pom.xml +++ b/core/rio/datatypes/pom.xml @@ -4,7 +4,7 @@ org.eclipse.rdf4j rdf4j-rio - 3.1.5-SNAPSHOT + 3.2.2-SNAPSHOT rdf4j-rio-datatypes RDF4J: Rio - Datatypes diff --git a/core/rio/datatypes/src/main/java/org/eclipse/rdf4j/rio/datatypes/DBPediaDatatypeHandler.java b/core/rio/datatypes/src/main/java/org/eclipse/rdf4j/rio/datatypes/DBPediaDatatypeHandler.java index e8f97fb936c..255da35f797 100644 --- a/core/rio/datatypes/src/main/java/org/eclipse/rdf4j/rio/datatypes/DBPediaDatatypeHandler.java +++ b/core/rio/datatypes/src/main/java/org/eclipse/rdf4j/rio/datatypes/DBPediaDatatypeHandler.java @@ -15,7 +15,7 @@ /** * An implementation of a datatype handler that can process DBPedia datatypes. - * + * * @author Peter Ansell */ public class DBPediaDatatypeHandler implements DatatypeHandler { diff --git a/core/rio/datatypes/src/main/java/org/eclipse/rdf4j/rio/datatypes/GeoSPARQLDatatypeHandler.java b/core/rio/datatypes/src/main/java/org/eclipse/rdf4j/rio/datatypes/GeoSPARQLDatatypeHandler.java index a12343a7689..b4b735d1fbc 100644 --- a/core/rio/datatypes/src/main/java/org/eclipse/rdf4j/rio/datatypes/GeoSPARQLDatatypeHandler.java +++ b/core/rio/datatypes/src/main/java/org/eclipse/rdf4j/rio/datatypes/GeoSPARQLDatatypeHandler.java @@ -16,7 +16,7 @@ /** * An implementation of a datatype handler that can process GeoSPARQL datatypes. - * + * * @author Peter Ansell */ public class GeoSPARQLDatatypeHandler implements DatatypeHandler { diff --git a/core/rio/datatypes/src/main/java/org/eclipse/rdf4j/rio/datatypes/RDFDatatypeHandler.java b/core/rio/datatypes/src/main/java/org/eclipse/rdf4j/rio/datatypes/RDFDatatypeHandler.java index e412e754398..3c435bc2c89 100644 --- a/core/rio/datatypes/src/main/java/org/eclipse/rdf4j/rio/datatypes/RDFDatatypeHandler.java +++ b/core/rio/datatypes/src/main/java/org/eclipse/rdf4j/rio/datatypes/RDFDatatypeHandler.java @@ -16,7 +16,7 @@ /** * An implementation of a datatype handler that can process {@link RDF} built-in datatypes. - * + * * @author Peter Ansell */ public class RDFDatatypeHandler implements DatatypeHandler { diff --git a/core/rio/datatypes/src/main/java/org/eclipse/rdf4j/rio/datatypes/VirtuosoGeometryDatatypeHandler.java b/core/rio/datatypes/src/main/java/org/eclipse/rdf4j/rio/datatypes/VirtuosoGeometryDatatypeHandler.java index 866177eb1f2..2752b82fdd6 100644 --- a/core/rio/datatypes/src/main/java/org/eclipse/rdf4j/rio/datatypes/VirtuosoGeometryDatatypeHandler.java +++ b/core/rio/datatypes/src/main/java/org/eclipse/rdf4j/rio/datatypes/VirtuosoGeometryDatatypeHandler.java @@ -16,7 +16,7 @@ /** * An implementation of a datatype handler that can process Virtuoso Geometry datatypes. - * + * * @author Peter Ansell */ public class VirtuosoGeometryDatatypeHandler implements DatatypeHandler { diff --git a/core/rio/datatypes/src/main/java/org/eclipse/rdf4j/rio/datatypes/XMLSchemaDatatypeHandler.java b/core/rio/datatypes/src/main/java/org/eclipse/rdf4j/rio/datatypes/XMLSchemaDatatypeHandler.java index 84e25824feb..f39d00efa21 100644 --- a/core/rio/datatypes/src/main/java/org/eclipse/rdf4j/rio/datatypes/XMLSchemaDatatypeHandler.java +++ b/core/rio/datatypes/src/main/java/org/eclipse/rdf4j/rio/datatypes/XMLSchemaDatatypeHandler.java @@ -19,7 +19,7 @@ * An implementation of a datatype handler that can process {@link XMLSchema} datatypes. *

    * Implemented using {@link XMLDatatypeUtil}. - * + * * @author Peter Ansell */ public class XMLSchemaDatatypeHandler implements DatatypeHandler { diff --git a/core/rio/datatypes/src/test/java/org/eclipse/rdf4j/rio/datatypes/AbstractDatatypeHandlerTest.java b/core/rio/datatypes/src/test/java/org/eclipse/rdf4j/rio/datatypes/AbstractDatatypeHandlerTest.java index 2da014de34b..04537e92959 100644 --- a/core/rio/datatypes/src/test/java/org/eclipse/rdf4j/rio/datatypes/AbstractDatatypeHandlerTest.java +++ b/core/rio/datatypes/src/test/java/org/eclipse/rdf4j/rio/datatypes/AbstractDatatypeHandlerTest.java @@ -7,7 +7,10 @@ *******************************************************************************/ package org.eclipse.rdf4j.rio.datatypes; -import static org.junit.Assert.*; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; import org.eclipse.rdf4j.model.IRI; import org.eclipse.rdf4j.model.Literal; @@ -22,7 +25,7 @@ /** * Abstract test for DatatypeHandler interface. - * + * * @author Peter Ansell */ public abstract class AbstractDatatypeHandlerTest { @@ -32,7 +35,7 @@ public abstract class AbstractDatatypeHandlerTest { /** * Generates a new instance of the {@link DatatypeHandler} implementation in question and returns it. - * + * * @return A new instance of the {@link DatatypeHandler} implementation being tested. */ protected abstract DatatypeHandler getNewDatatypeHandler(); diff --git a/core/rio/datatypes/src/test/java/org/eclipse/rdf4j/rio/datatypes/DBPediaCelsiusDatatypeHandlerTest.java b/core/rio/datatypes/src/test/java/org/eclipse/rdf4j/rio/datatypes/DBPediaCelsiusDatatypeHandlerTest.java index ea27f2afdd6..81ec95f7d05 100644 --- a/core/rio/datatypes/src/test/java/org/eclipse/rdf4j/rio/datatypes/DBPediaCelsiusDatatypeHandlerTest.java +++ b/core/rio/datatypes/src/test/java/org/eclipse/rdf4j/rio/datatypes/DBPediaCelsiusDatatypeHandlerTest.java @@ -18,7 +18,7 @@ /** * Test for {@link DBPediaDatatypeHandler} with http://dbpedia.org/datatype/degreeCelsius . - * + * * @author Peter Ansell */ public class DBPediaCelsiusDatatypeHandlerTest extends AbstractDatatypeHandlerTest { diff --git a/core/rio/datatypes/src/test/java/org/eclipse/rdf4j/rio/datatypes/RDFLangStringDatatypeHandlerTest.java b/core/rio/datatypes/src/test/java/org/eclipse/rdf4j/rio/datatypes/RDFLangStringDatatypeHandlerTest.java index e6e30299a4e..9476b284b46 100644 --- a/core/rio/datatypes/src/test/java/org/eclipse/rdf4j/rio/datatypes/RDFLangStringDatatypeHandlerTest.java +++ b/core/rio/datatypes/src/test/java/org/eclipse/rdf4j/rio/datatypes/RDFLangStringDatatypeHandlerTest.java @@ -19,7 +19,7 @@ /** * Test for {@link RDFDatatypeHandler} with {@link RDF#LANGSTRING}. - * + * * @author Peter Ansell */ public class RDFLangStringDatatypeHandlerTest extends AbstractDatatypeHandlerTest { diff --git a/core/rio/datatypes/src/test/java/org/eclipse/rdf4j/rio/datatypes/VirtuosoGeometryPointDatatypeHandlerTest.java b/core/rio/datatypes/src/test/java/org/eclipse/rdf4j/rio/datatypes/VirtuosoGeometryPointDatatypeHandlerTest.java index 58e235613db..0002b74d080 100644 --- a/core/rio/datatypes/src/test/java/org/eclipse/rdf4j/rio/datatypes/VirtuosoGeometryPointDatatypeHandlerTest.java +++ b/core/rio/datatypes/src/test/java/org/eclipse/rdf4j/rio/datatypes/VirtuosoGeometryPointDatatypeHandlerTest.java @@ -16,7 +16,7 @@ /** * Test for {@link VirtuosoDatatypeHandler} with http://www.openlinksw.com/schemas/virtrdf#Geometry . - * + * * @author Peter Ansell */ public class VirtuosoGeometryPointDatatypeHandlerTest extends AbstractDatatypeHandlerTest { diff --git a/core/rio/datatypes/src/test/java/org/eclipse/rdf4j/rio/datatypes/XMLSchemaDoubleDatatypeHandlerTest.java b/core/rio/datatypes/src/test/java/org/eclipse/rdf4j/rio/datatypes/XMLSchemaDoubleDatatypeHandlerTest.java index 8c25f887d20..26c4cc84b91 100644 --- a/core/rio/datatypes/src/test/java/org/eclipse/rdf4j/rio/datatypes/XMLSchemaDoubleDatatypeHandlerTest.java +++ b/core/rio/datatypes/src/test/java/org/eclipse/rdf4j/rio/datatypes/XMLSchemaDoubleDatatypeHandlerTest.java @@ -17,7 +17,7 @@ /** * Test for {@link XMLSchemaDatatypeHandler} with {@link XMLSchema#DOUBLE}. - * + * * @author Peter Ansell */ public class XMLSchemaDoubleDatatypeHandlerTest extends AbstractDatatypeHandlerTest { diff --git a/core/rio/hdt/pom.xml b/core/rio/hdt/pom.xml new file mode 100644 index 00000000000..dd6f1b10b1a --- /dev/null +++ b/core/rio/hdt/pom.xml @@ -0,0 +1,31 @@ + + + 4.0.0 + + org.eclipse.rdf4j + rdf4j-rio + 3.2.2-SNAPSHOT + + rdf4j-rio-hdt + jar + RDF4J: Rio - HDT + Experimental Rio parser and writer implementation for the HDT file format. + + + ${project.groupId} + rdf4j-model + ${project.version} + + + ${project.groupId} + rdf4j-rio-api + ${project.version} + + + ${project.groupId} + rdf4j-rio-ntriples + ${project.version} + test + + + diff --git a/core/rio/hdt/src/main/java/org/eclipse/rdf4j/rio/hdt/CRC16.java b/core/rio/hdt/src/main/java/org/eclipse/rdf4j/rio/hdt/CRC16.java new file mode 100644 index 00000000000..db70adbe033 --- /dev/null +++ b/core/rio/hdt/src/main/java/org/eclipse/rdf4j/rio/hdt/CRC16.java @@ -0,0 +1,111 @@ +/******************************************************************************* + * Copyright (c) 2020 Eclipse RDF4J contributors. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Distribution License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ +package org.eclipse.rdf4j.rio.hdt; + +import java.util.zip.Checksum; + +/** + * CRC16-ANSI checksum + * + * @author Bart Hanssens + */ +class CRC16 implements Checksum { + // note that Java considers short to be signed, hence the need to cast values larger than 32767 + private final static short[] TABLE = new short[] { + (short) 0x0000, (short) 0xC0C1, (short) 0xC181, (short) 0x0140, (short) 0xC301, (short) 0x03C0, + (short) 0x0280, (short) 0xC241, + (short) 0xC601, (short) 0x06C0, (short) 0x0780, (short) 0xC741, (short) 0x0500, (short) 0xC5C1, + (short) 0xC481, (short) 0x0440, + (short) 0xCC01, (short) 0x0CC0, (short) 0x0D80, (short) 0xCD41, (short) 0x0F00, (short) 0xCFC1, + (short) 0xCE81, (short) 0x0E40, + (short) 0x0A00, (short) 0xCAC1, (short) 0xCB81, (short) 0x0B40, (short) 0xC901, (short) 0x09C0, + (short) 0x0880, (short) 0xC841, + (short) 0xD801, (short) 0x18C0, (short) 0x1980, (short) 0xD941, (short) 0x1B00, (short) 0xDBC1, + (short) 0xDA81, (short) 0x1A40, + (short) 0x1E00, (short) 0xDEC1, (short) 0xDF81, (short) 0x1F40, (short) 0xDD01, (short) 0x1DC0, + (short) 0x1C80, (short) 0xDC41, + (short) 0x1400, (short) 0xD4C1, (short) 0xD581, (short) 0x1540, (short) 0xD701, (short) 0x17C0, + (short) 0x1680, (short) 0xD641, + (short) 0xD201, (short) 0x12C0, (short) 0x1380, (short) 0xD341, (short) 0x1100, (short) 0xD1C1, + (short) 0xD081, (short) 0x1040, + (short) 0xF001, (short) 0x30C0, (short) 0x3180, (short) 0xF141, (short) 0x3300, (short) 0xF3C1, + (short) 0xF281, (short) 0x3240, + (short) 0x3600, (short) 0xF6C1, (short) 0xF781, (short) 0x3740, (short) 0xF501, (short) 0x35C0, + (short) 0x3480, (short) 0xF441, + (short) 0x3C00, (short) 0xFCC1, (short) 0xFD81, (short) 0x3D40, (short) 0xFF01, (short) 0x3FC0, + (short) 0x3E80, (short) 0xFE41, + (short) 0xFA01, (short) 0x3AC0, (short) 0x3B80, (short) 0xFB41, (short) 0x3900, (short) 0xF9C1, + (short) 0xF881, (short) 0x3840, + (short) 0x2800, (short) 0xE8C1, (short) 0xE981, (short) 0x2940, (short) 0xEB01, (short) 0x2BC0, + (short) 0x2A80, (short) 0xEA41, + (short) 0xEE01, (short) 0x2EC0, (short) 0x2F80, (short) 0xEF41, (short) 0x2D00, (short) 0xEDC1, + (short) 0xEC81, (short) 0x2C40, + (short) 0xE401, (short) 0x24C0, (short) 0x2580, (short) 0xE541, (short) 0x2700, (short) 0xE7C1, + (short) 0xE681, (short) 0x2640, + (short) 0x2200, (short) 0xE2C1, (short) 0xE381, (short) 0x2340, (short) 0xE101, (short) 0x21C0, + (short) 0x2080, (short) 0xE041, + (short) 0xA001, (short) 0x60C0, (short) 0x6180, (short) 0xA141, (short) 0x6300, (short) 0xA3C1, + (short) 0xA281, (short) 0x6240, + (short) 0x6600, (short) 0xA6C1, (short) 0xA781, (short) 0x6740, (short) 0xA501, (short) 0x65C0, + (short) 0x6480, (short) 0xA441, + (short) 0x6C00, (short) 0xACC1, (short) 0xAD81, (short) 0x6D40, (short) 0xAF01, (short) 0x6FC0, + (short) 0x6E80, (short) 0xAE41, + (short) 0xAA01, (short) 0x6AC0, (short) 0x6B80, (short) 0xAB41, (short) 0x6900, (short) 0xA9C1, + (short) 0xA881, (short) 0x6840, + (short) 0x7800, (short) 0xB8C1, (short) 0xB981, (short) 0x7940, (short) 0xBB01, (short) 0x7BC0, + (short) 0x7A80, (short) 0xBA41, + (short) 0xBE01, (short) 0x7EC0, (short) 0x7F80, (short) 0xBF41, (short) 0x7D00, (short) 0xBDC1, + (short) 0xBC81, (short) 0x7C40, + (short) 0xB401, (short) 0x74C0, (short) 0x7580, (short) 0xB541, (short) 0x7700, (short) 0xB7C1, + (short) 0xB681, (short) 0x7640, + (short) 0x7200, (short) 0xB2C1, (short) 0xB381, (short) 0x7340, (short) 0xB101, (short) 0x71C0, + (short) 0x7080, (short) 0xB041, + (short) 0x5000, (short) 0x90C1, (short) 0x9181, (short) 0x5140, (short) 0x9301, (short) 0x53C0, + (short) 0x5280, (short) 0x9241, + (short) 0x9601, (short) 0x56C0, (short) 0x5780, (short) 0x9741, (short) 0x5500, (short) 0x95C1, + (short) 0x9481, (short) 0x5440, + (short) 0x9C01, (short) 0x5CC0, (short) 0x5D80, (short) 0x9D41, (short) 0x5F00, (short) 0x9FC1, + (short) 0x9E81, (short) 0x5E40, + (short) 0x5A00, (short) 0x9AC1, (short) 0x9B81, (short) 0x5B40, (short) 0x9901, (short) 0x59C0, + (short) 0x5880, (short) 0x9841, + (short) 0x8801, (short) 0x48C0, (short) 0x4980, (short) 0x8941, (short) 0x4B00, (short) 0x8BC1, + (short) 0x8A81, (short) 0x4A40, + (short) 0x4E00, (short) 0x8EC1, (short) 0x8F81, (short) 0x4F40, (short) 0x8D01, (short) 0x4DC0, + (short) 0x4C80, (short) 0x8C41, + (short) 0x4400, (short) 0x84C1, (short) 0x8581, (short) 0x4540, (short) 0x8701, (short) 0x47C0, + (short) 0x4680, (short) 0x8641, + (short) 0x8201, (short) 0x42C0, (short) 0x4380, (short) 0x8341, (short) 0x4100, (short) 0x81C1, + (short) 0x8081, (short) 0x4040 + }; + + private long value = 0; + + @Override + public void update(int b) { + int j = (int) (value ^ b) & 0xFF; + value = ((value >>> 8) ^ TABLE[j]) & 0xFFFF; + } + + @Override + public void update(byte[] b, int off, int len) { + while (len-- > 0) { + int j = (int) (value ^ b[off++]) & 0xFF; + value = (TABLE[j] ^ value >>> 8) & 0xFFFF; + } + } + + @Override + public long getValue() { + return value & 0xFFFF; + } + + @Override + public void reset() { + value = 0; + } +} diff --git a/core/rio/hdt/src/main/java/org/eclipse/rdf4j/rio/hdt/CRC32.java b/core/rio/hdt/src/main/java/org/eclipse/rdf4j/rio/hdt/CRC32.java new file mode 100644 index 00000000000..f26ead50a91 --- /dev/null +++ b/core/rio/hdt/src/main/java/org/eclipse/rdf4j/rio/hdt/CRC32.java @@ -0,0 +1,84 @@ +/******************************************************************************* + * Copyright (c) 2020 Eclipse RDF4J contributors. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Distribution icense v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ +package org.eclipse.rdf4j.rio.hdt; + +import java.util.zip.Checksum; + +/** + * CRC32C checksum + * + * Note that CRC32C is not available in JDK8, but there is a CRC32 in JDK9. + * + * @author Bart Hanssens + */ +class CRC32 implements Checksum { + private final static int[] TABLE = new int[] { + 0x00000000, 0xF26B8303, 0xE13B70F7, 0x1350F3F4, 0xC79A971F, 0x35F1141C, 0x26A1E7E8, 0xD4CA64EB, + 0x8AD958CF, 0x78B2DBCC, 0x6BE22838, 0x9989AB3B, 0x4D43CFD0, 0xBF284CD3, 0xAC78BF27, 0x5E133C24, + 0x105EC76F, 0xE235446C, 0xF165B798, 0x030E349B, 0xD7C45070, 0x25AFD373, 0x36FF2087, 0xC494A384, + 0x9A879FA0, 0x68EC1CA3, 0x7BBCEF57, 0x89D76C54, 0x5D1D08BF, 0xAF768BBC, 0xBC267848, 0x4E4DFB4B, + 0x20BD8EDE, 0xD2D60DDD, 0xC186FE29, 0x33ED7D2A, 0xE72719C1, 0x154C9AC2, 0x061C6936, 0xF477EA35, + 0xAA64D611, 0x580F5512, 0x4B5FA6E6, 0xB93425E5, 0x6DFE410E, 0x9F95C20D, 0x8CC531F9, 0x7EAEB2FA, + 0x30E349B1, 0xC288CAB2, 0xD1D83946, 0x23B3BA45, 0xF779DEAE, 0x05125DAD, 0x1642AE59, 0xE4292D5A, + 0xBA3A117E, 0x4851927D, 0x5B016189, 0xA96AE28A, 0x7DA08661, 0x8FCB0562, 0x9C9BF696, 0x6EF07595, + 0x417B1DBC, 0xB3109EBF, 0xA0406D4B, 0x522BEE48, 0x86E18AA3, 0x748A09A0, 0x67DAFA54, 0x95B17957, + 0xCBA24573, 0x39C9C670, 0x2A993584, 0xD8F2B687, 0x0C38D26C, 0xFE53516F, 0xED03A29B, 0x1F682198, + 0x5125DAD3, 0xA34E59D0, 0xB01EAA24, 0x42752927, 0x96BF4DCC, 0x64D4CECF, 0x77843D3B, 0x85EFBE38, + 0xDBFC821C, 0x2997011F, 0x3AC7F2EB, 0xC8AC71E8, 0x1C661503, 0xEE0D9600, 0xFD5D65F4, 0x0F36E6F7, + 0x61C69362, 0x93AD1061, 0x80FDE395, 0x72966096, 0xA65C047D, 0x5437877E, 0x4767748A, 0xB50CF789, + 0xEB1FCBAD, 0x197448AE, 0x0A24BB5A, 0xF84F3859, 0x2C855CB2, 0xDEEEDFB1, 0xCDBE2C45, 0x3FD5AF46, + 0x7198540D, 0x83F3D70E, 0x90A324FA, 0x62C8A7F9, 0xB602C312, 0x44694011, 0x5739B3E5, 0xA55230E6, + 0xFB410CC2, 0x092A8FC1, 0x1A7A7C35, 0xE811FF36, 0x3CDB9BDD, 0xCEB018DE, 0xDDE0EB2A, 0x2F8B6829, + 0x82F63B78, 0x709DB87B, 0x63CD4B8F, 0x91A6C88C, 0x456CAC67, 0xB7072F64, 0xA457DC90, 0x563C5F93, + 0x082F63B7, 0xFA44E0B4, 0xE9141340, 0x1B7F9043, 0xCFB5F4A8, 0x3DDE77AB, 0x2E8E845F, 0xDCE5075C, + 0x92A8FC17, 0x60C37F14, 0x73938CE0, 0x81F80FE3, 0x55326B08, 0xA759E80B, 0xB4091BFF, 0x466298FC, + 0x1871A4D8, 0xEA1A27DB, 0xF94AD42F, 0x0B21572C, 0xDFEB33C7, 0x2D80B0C4, 0x3ED04330, 0xCCBBC033, + 0xA24BB5A6, 0x502036A5, 0x4370C551, 0xB11B4652, 0x65D122B9, 0x97BAA1BA, 0x84EA524E, 0x7681D14D, + 0x2892ED69, 0xDAF96E6A, 0xC9A99D9E, 0x3BC21E9D, 0xEF087A76, 0x1D63F975, 0x0E330A81, 0xFC588982, + 0xB21572C9, 0x407EF1CA, 0x532E023E, 0xA145813D, 0x758FE5D6, 0x87E466D5, 0x94B49521, 0x66DF1622, + 0x38CC2A06, 0xCAA7A905, 0xD9F75AF1, 0x2B9CD9F2, 0xFF56BD19, 0x0D3D3E1A, 0x1E6DCDEE, 0xEC064EED, + 0xC38D26C4, 0x31E6A5C7, 0x22B65633, 0xD0DDD530, 0x0417B1DB, 0xF67C32D8, 0xE52CC12C, 0x1747422F, + 0x49547E0B, 0xBB3FFD08, 0xA86F0EFC, 0x5A048DFF, 0x8ECEE914, 0x7CA56A17, 0x6FF599E3, 0x9D9E1AE0, + 0xD3D3E1AB, 0x21B862A8, 0x32E8915C, 0xC083125F, 0x144976B4, 0xE622F5B7, 0xF5720643, 0x07198540, + 0x590AB964, 0xAB613A67, 0xB831C993, 0x4A5A4A90, 0x9E902E7B, 0x6CFBAD78, 0x7FAB5E8C, 0x8DC0DD8F, + 0xE330A81A, 0x115B2B19, 0x020BD8ED, 0xF0605BEE, 0x24AA3F05, 0xD6C1BC06, 0xC5914FF2, 0x37FACCF1, + 0x69E9F0D5, 0x9B8273D6, 0x88D28022, 0x7AB90321, 0xAE7367CA, 0x5C18E4C9, 0x4F48173D, 0xBD23943E, + 0xF36E6F75, 0x0105EC76, 0x12551F82, 0xE03E9C81, 0x34F4F86A, 0xC69F7B69, 0xD5CF889D, 0x27A40B9E, + 0x79B737BA, 0x8BDCB4B9, 0x988C474D, 0x6AE7C44E, 0xBE2DA0A5, 0x4C4623A6, 0x5F16D052, 0xAD7D5351 + }; + + private long value = 0; + + @Override + public void update(int b) { + value ^= 0xFFFFFFFFL; + int j = (int) ((value ^ b) & 0xFF); + value = (value >>> 8) ^ TABLE[j] & 0xFFFFFFFFL; + value ^= 0xFFFFFFFFL; + } + + @Override + public void update(byte[] b, int off, int len) { + while (len-- > 0) { + value ^= 0xFFFFFFFFL; + int j = (int) ((value ^ b[off++]) & 0xFF); + value = (value >>> 8) ^ TABLE[j] & 0xFFFFFFFFL; + value ^= 0xFFFFFFFFL; + } + } + + @Override + public long getValue() { + return value & 0xFFFFFFFFL; + } + + @Override + public void reset() { + value = 0xFFFFFFFF; + } +} diff --git a/core/rio/hdt/src/main/java/org/eclipse/rdf4j/rio/hdt/CRC8.java b/core/rio/hdt/src/main/java/org/eclipse/rdf4j/rio/hdt/CRC8.java new file mode 100644 index 00000000000..b1a9d3eed94 --- /dev/null +++ b/core/rio/hdt/src/main/java/org/eclipse/rdf4j/rio/hdt/CRC8.java @@ -0,0 +1,77 @@ +/******************************************************************************* + * Copyright (c) 2020 Eclipse RDF4J contributors. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Distribution License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ +package org.eclipse.rdf4j.rio.hdt; + +import java.util.zip.Checksum; + +/** + * CRC8-CCIT checksum + * + * @author Bart Hanssens + */ +class CRC8 implements Checksum { + // note that Java considers bytes to be signed, hence the need to cast values larger than 127 + private final static byte[] TABLE = new byte[] { + (byte) 0x00, (byte) 0x07, (byte) 0x0E, (byte) 0x09, (byte) 0x1C, (byte) 0x1B, (byte) 0x12, (byte) 0x15, + (byte) 0x38, (byte) 0x3F, (byte) 0x36, (byte) 0x31, (byte) 0x24, (byte) 0x23, (byte) 0x2A, (byte) 0x2D, + (byte) 0x70, (byte) 0x77, (byte) 0x7E, (byte) 0x79, (byte) 0x6C, (byte) 0x6B, (byte) 0x62, (byte) 0x65, + (byte) 0x48, (byte) 0x4F, (byte) 0x46, (byte) 0x41, (byte) 0x54, (byte) 0x53, (byte) 0x5A, (byte) 0x5D, + (byte) 0xE0, (byte) 0xE7, (byte) 0xEE, (byte) 0xE9, (byte) 0xFC, (byte) 0xFB, (byte) 0xF2, (byte) 0xF5, + (byte) 0xD8, (byte) 0xDF, (byte) 0xD6, (byte) 0xD1, (byte) 0xC4, (byte) 0xC3, (byte) 0xCA, (byte) 0xCD, + (byte) 0x90, (byte) 0x97, (byte) 0x9E, (byte) 0x99, (byte) 0x8C, (byte) 0x8B, (byte) 0x82, (byte) 0x85, + (byte) 0xA8, (byte) 0xAF, (byte) 0xA6, (byte) 0xA1, (byte) 0xB4, (byte) 0xB3, (byte) 0xBA, (byte) 0xBD, + (byte) 0xC7, (byte) 0xC0, (byte) 0xC9, (byte) 0xCE, (byte) 0xDB, (byte) 0xDC, (byte) 0xD5, (byte) 0xD2, + (byte) 0xFF, (byte) 0xF8, (byte) 0xF1, (byte) 0xF6, (byte) 0xE3, (byte) 0xE4, (byte) 0xED, (byte) 0xEA, + (byte) 0xB7, (byte) 0xB0, (byte) 0xB9, (byte) 0xBE, (byte) 0xAB, (byte) 0xAC, (byte) 0xA5, (byte) 0xA2, + (byte) 0x8F, (byte) 0x88, (byte) 0x81, (byte) 0x86, (byte) 0x93, (byte) 0x94, (byte) 0x9D, (byte) 0x9A, + (byte) 0x27, (byte) 0x20, (byte) 0x29, (byte) 0x2E, (byte) 0x3B, (byte) 0x3C, (byte) 0x35, (byte) 0x32, + (byte) 0x1F, (byte) 0x18, (byte) 0x11, (byte) 0x16, (byte) 0x03, (byte) 0x04, (byte) 0x0D, (byte) 0x0A, + (byte) 0x57, (byte) 0x50, (byte) 0x59, (byte) 0x5E, (byte) 0x4B, (byte) 0x4C, (byte) 0x45, (byte) 0x42, + (byte) 0x6F, (byte) 0x68, (byte) 0x61, (byte) 0x66, (byte) 0x73, (byte) 0x74, (byte) 0x7D, (byte) 0x7A, + (byte) 0x89, (byte) 0x8E, (byte) 0x87, (byte) 0x80, (byte) 0x95, (byte) 0x92, (byte) 0x9B, (byte) 0x9C, + (byte) 0xB1, (byte) 0xB6, (byte) 0xBF, (byte) 0xB8, (byte) 0xAD, (byte) 0xAA, (byte) 0xA3, (byte) 0xA4, + (byte) 0xF9, (byte) 0xFE, (byte) 0xF7, (byte) 0xF0, (byte) 0xE5, (byte) 0xE2, (byte) 0xEB, (byte) 0xEC, + (byte) 0xC1, (byte) 0xC6, (byte) 0xCF, (byte) 0xC8, (byte) 0xDD, (byte) 0xDA, (byte) 0xD3, (byte) 0xD4, + (byte) 0x69, (byte) 0x6E, (byte) 0x67, (byte) 0x60, (byte) 0x75, (byte) 0x72, (byte) 0x7B, (byte) 0x7C, + (byte) 0x51, (byte) 0x56, (byte) 0x5F, (byte) 0x58, (byte) 0x4D, (byte) 0x4A, (byte) 0x43, (byte) 0x44, + (byte) 0x19, (byte) 0x1E, (byte) 0x17, (byte) 0x10, (byte) 0x05, (byte) 0x02, (byte) 0x0B, (byte) 0x0C, + (byte) 0x21, (byte) 0x26, (byte) 0x2F, (byte) 0x28, (byte) 0x3D, (byte) 0x3A, (byte) 0x33, (byte) 0x34, + (byte) 0x4E, (byte) 0x49, (byte) 0x40, (byte) 0x47, (byte) 0x52, (byte) 0x55, (byte) 0x5C, (byte) 0x5B, + (byte) 0x76, (byte) 0x71, (byte) 0x78, (byte) 0x7F, (byte) 0x6A, (byte) 0x6D, (byte) 0x64, (byte) 0x63, + (byte) 0x3E, (byte) 0x39, (byte) 0x30, (byte) 0x37, (byte) 0x22, (byte) 0x25, (byte) 0x2C, (byte) 0x2B, + (byte) 0x06, (byte) 0x01, (byte) 0x08, (byte) 0x0F, (byte) 0x1A, (byte) 0x1D, (byte) 0x14, (byte) 0x13, + (byte) 0xAE, (byte) 0xA9, (byte) 0xA0, (byte) 0xA7, (byte) 0xB2, (byte) 0xB5, (byte) 0xBC, (byte) 0xBB, + (byte) 0x96, (byte) 0x91, (byte) 0x98, (byte) 0x9F, (byte) 0x8A, (byte) 0x8D, (byte) 0x84, (byte) 0x83, + (byte) 0xDE, (byte) 0xD9, (byte) 0xD0, (byte) 0xD7, (byte) 0xC2, (byte) 0xC5, (byte) 0xCC, (byte) 0xCB, + (byte) 0xE6, (byte) 0xE1, (byte) 0xE8, (byte) 0xEF, (byte) 0xFA, (byte) 0xFD, (byte) 0xF4, (byte) 0xF3 + }; + + private long value = 0; + + @Override + public void update(int b) { + value = TABLE[(byte) (value ^ b) & 0xFF]; + } + + @Override + public void update(byte[] b, int off, int len) { + while (len-- > 0) { + value = TABLE[(byte) (value ^ b[off++]) & 0xFF]; + } + } + + @Override + public long getValue() { + return value & 0xFF; + } + + @Override + public void reset() { + value = 0; + } +} diff --git a/core/rio/hdt/src/main/java/org/eclipse/rdf4j/rio/hdt/HDTArray.java b/core/rio/hdt/src/main/java/org/eclipse/rdf4j/rio/hdt/HDTArray.java new file mode 100644 index 00000000000..73633590e5f --- /dev/null +++ b/core/rio/hdt/src/main/java/org/eclipse/rdf4j/rio/hdt/HDTArray.java @@ -0,0 +1,110 @@ +/******************************************************************************* + * Copyright (c) 2020 Eclipse RDF4J contributors. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Distribution License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ +package org.eclipse.rdf4j.rio.hdt; + +import java.io.IOException; +import java.io.InputStream; +import java.util.zip.CheckedInputStream; + +import org.eclipse.rdf4j.common.io.UncloseableInputStream; + +/** + * HDT Array + * + * This part starts with a byte indicating the type of the array, followed by a byte containing the number of bits used + * to encode an entry in the array, and the VByte-encoded number of entries. + * + * Then the 8-bit CRC, followed by the array data itself. + * + * Structure: + * + *

    + * +------+--------+---------+------+------...
    + * | type | nrbits | entries | CRC8 | data 
    + * +------+--------+---------+------+------...
    + * 
    + * + * @author Bart Hanssens + */ +abstract class HDTArray extends HDTPart { + protected enum Type { + LOG64(1), + UINT32(2), + UINT64(3); + private final int value; + + /** + * Get value associated with this type + * + * @return value 1,2 or 3 + */ + public int getValue() { + return value; + } + + private Type(int value) { + this.value = value; + } + } + + protected int nrbits; + protected int entries; + + /** + * Get the type of the array + * + * @return byte + */ + protected abstract int getType(); + + /** + * Get number of bits used to encode an entry + * + * @return positive integer value + */ + protected int getNrBits() { + return nrbits; + } + + /** + * Get number of entries in this array + * + * @return positive integer value + */ + protected int size() { + return entries; + } + + /** + * Get entry from this array + * + * @param i zero-based index + * @return entry + */ + protected abstract int get(int i); + + @Override + protected void parse(InputStream is) throws IOException { + CRC8 crc8 = new CRC8(); + crc8.update(getType()); + + // don't close CheckedInputStream, as it will close the underlying inputstream + try (UncloseableInputStream uis = new UncloseableInputStream(is); + CheckedInputStream cis = new CheckedInputStream(uis, crc8)) { + + nrbits = cis.read(); + long l = VByte.decode(cis); + if (l > Integer.MAX_VALUE) { + throw new UnsupportedOperationException("Maximum number of bytes in array exceeded: " + l); + } + entries = (int) l; + + checkCRC(cis, is, 1); + } + } +} diff --git a/core/rio/hdt/src/main/java/org/eclipse/rdf4j/rio/hdt/HDTArrayFactory.java b/core/rio/hdt/src/main/java/org/eclipse/rdf4j/rio/hdt/HDTArrayFactory.java new file mode 100644 index 00000000000..b42c98acd63 --- /dev/null +++ b/core/rio/hdt/src/main/java/org/eclipse/rdf4j/rio/hdt/HDTArrayFactory.java @@ -0,0 +1,28 @@ +/******************************************************************************* + * Copyright (c) 2020 Eclipse RDF4J contributors. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Distribution License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ +package org.eclipse.rdf4j.rio.hdt; + +import java.io.IOException; +import java.io.InputStream; + +/** + * HDT Array factory. + * + * @author Bart Hanssens + */ +class HDTArrayFactory { + + protected static HDTArray parse(InputStream is) throws IOException { + int dtype = is.read(); + if (dtype != HDTArray.Type.LOG64.getValue()) { + throw new UnsupportedOperationException("Array section: encoding " + Long.toHexString(dtype) + + ", but only Log64 encoding is supported"); + } + return new HDTArrayLog64(); + } +} diff --git a/core/rio/hdt/src/main/java/org/eclipse/rdf4j/rio/hdt/HDTArrayLog64.java b/core/rio/hdt/src/main/java/org/eclipse/rdf4j/rio/hdt/HDTArrayLog64.java new file mode 100644 index 00000000000..8ad311571cf --- /dev/null +++ b/core/rio/hdt/src/main/java/org/eclipse/rdf4j/rio/hdt/HDTArrayLog64.java @@ -0,0 +1,81 @@ +/******************************************************************************* + * Copyright (c) 2020 Eclipse RDF4J contributors. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Distribution License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ +package org.eclipse.rdf4j.rio.hdt; + +import java.io.IOException; +import java.io.InputStream; +import java.util.zip.CheckedInputStream; + +import org.eclipse.rdf4j.common.io.UncloseableInputStream; + +/** + * Log64 + * + * It contains the data part of the {@link HDTArray}, followed by the 32-bit CRC calculated over this data. + * + * Data structure: + * + *
    + * ...+---------+-------+
    + *    | entries | CRC32 |
    + * ...+---------+-------+
    + * 
    + * + * Entries are stored little-endian, with each entry using nrbits bits + * + * @author Bart Hanssens + */ +class HDTArrayLog64 extends HDTArray { + private byte buffer[]; + + @Override + protected int getType() { + return HDTArray.Type.LOG64.getValue(); + } + + @Override + protected int get(int i) { + // start byte of the value, and start bit in that start byte + int bytePos = (i * nrbits) / 8; + int bitPos = (i * nrbits) % 8; + + // value bits may be encoded across boundaries of bytes + int tmplen = (bitPos + nrbits + 7) / 8; + + long val = 0L; + // little-endian to big-endian + for (int j = 0; j < tmplen; j++) { + val |= (buffer[bytePos + j] & 0xFFL) << (j * 8); + } + + val >>= bitPos; + val &= 0xFFFFFFFFFFFFFFFFL >>> (64 - nrbits); + + return (int) val; + } + + @Override + protected void parse(InputStream is) throws IOException { + super.parse(is); + + // don't close CheckedInputStream, as it will close the underlying inputstream + try (UncloseableInputStream uis = new UncloseableInputStream(is); + CheckedInputStream cis = new CheckedInputStream(uis, new CRC32())) { + // read bytes, minimum 1 + long bytes = (nrbits * entries + 7) / 8; + if (bytes > Integer.MAX_VALUE) { + throw new UnsupportedOperationException("Maximum number of bytes in array exceeded: " + bytes); + } + + buffer = new byte[(int) bytes]; + cis.read(buffer); + + checkCRC(cis, is, 4); + } + } +} diff --git a/core/rio/hdt/src/main/java/org/eclipse/rdf4j/rio/hdt/HDTBitmap.java b/core/rio/hdt/src/main/java/org/eclipse/rdf4j/rio/hdt/HDTBitmap.java new file mode 100644 index 00000000000..59e6a9cf7ef --- /dev/null +++ b/core/rio/hdt/src/main/java/org/eclipse/rdf4j/rio/hdt/HDTBitmap.java @@ -0,0 +1,83 @@ +/******************************************************************************* + * Copyright (c) 2020 Eclipse RDF4J contributors. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Distribution License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ +package org.eclipse.rdf4j.rio.hdt; + +import java.io.IOException; +import java.io.InputStream; +import java.util.zip.CheckedInputStream; + +import org.eclipse.rdf4j.common.io.UncloseableInputStream; + +/** + * + * @author Bart Hanssens + */ +class HDTBitmap extends HDTPart { + protected final static int BITMAP1 = 1; + + private int bits; + private byte[] buffer; + + /** + * Get bit + * + * @param i + * @return 0 or 1 + */ + protected int get(int i) { + int bytePos = i / 8; + int bitPos = i % 8; + + byte b = buffer[bytePos]; + return ((b & 0xFF) >> bitPos) & 1; + } + + /** + * Get number of entries in this bitmap + * + * @return positive integer value + */ + protected int size() { + return bits; + } + + @Override + protected void parse(InputStream is) throws IOException { + long bytes = 0L; + + // don't close CheckedInputStream, as it will close the underlying inputstream + try (UncloseableInputStream uis = new UncloseableInputStream(is); + CheckedInputStream cis = new CheckedInputStream(uis, new CRC8())) { + + int dtype = cis.read(); + if (dtype != BITMAP1) { + throw new UnsupportedOperationException("Bitmap encoding " + Long.toHexString(dtype) + + ", but only bitmap v1 is supported"); + } + + long b = (int) VByte.decode(cis); + if (b > Integer.MAX_VALUE) { + throw new UnsupportedOperationException("Maximum number of entries in bitmap exceeded: " + b); + } + bits = (int) b; + bytes = (bits + 7) / 8; + + checkCRC(cis, is, 1); + } + + // don't close CheckedInputStream, as it will close the underlying inputstream + try (UncloseableInputStream uis = new UncloseableInputStream(is); + CheckedInputStream cis = new CheckedInputStream(uis, new CRC32())) { + + buffer = new byte[(int) bytes]; + cis.read(buffer); + + checkCRC(cis, is, 4); + } + } +} diff --git a/core/rio/hdt/src/main/java/org/eclipse/rdf4j/rio/hdt/HDTDictionary.java b/core/rio/hdt/src/main/java/org/eclipse/rdf4j/rio/hdt/HDTDictionary.java new file mode 100644 index 00000000000..25c1e35a0f3 --- /dev/null +++ b/core/rio/hdt/src/main/java/org/eclipse/rdf4j/rio/hdt/HDTDictionary.java @@ -0,0 +1,55 @@ +/******************************************************************************* + * Copyright (c) 2020 Eclipse RDF4J contributors. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Distribution License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ +package org.eclipse.rdf4j.rio.hdt; + +import java.io.IOException; +import java.io.InputStream; +import java.nio.charset.StandardCharsets; +import java.util.zip.CheckedInputStream; + +import org.eclipse.rdf4j.common.io.UncloseableInputStream; + +/** + * HDT Dictionary Part. + * + * This part starts with $HDT, followed by a byte indicating the type of the part, the NULL-terminated URI + * string for the format, and optionally one or more key=value; properties. + * + * Then a NULL byte, followed by the 16-bit CRC ($HDT and NULL included). + * + * Structure: + * + *
    + * +------+------+-----+------+------------+------+-------+
    + * | $HDT | type | URI | NULL | key=value; | NULL | CRC16 |
    + * +------+------+-----+------+------------+------+-------+
    + * 
    + * + * @author Bart Hanssens + */ +class HDTDictionary extends HDTPart { + protected final static byte[] DICT_FORMAT = "" + .getBytes(StandardCharsets.US_ASCII); + protected final static String DICT_MAPPING = "mapping"; + protected final static String DICT_ELEMENTS = "elements"; + + @Override + protected void parse(InputStream is) throws IOException { + // don't close CheckedInputStream, as it will close the underlying inputstream + try (UncloseableInputStream uis = new UncloseableInputStream(is); + CheckedInputStream cis = new CheckedInputStream(uis, new CRC16())) { + + checkControl(cis, HDTPart.Type.DICTIONARY); + checkFormat(cis, DICT_FORMAT); + + properties = getProperties(cis); + + checkCRC(cis, is, 2); + } + } +} diff --git a/core/rio/hdt/src/main/java/org/eclipse/rdf4j/rio/hdt/HDTDictionarySection.java b/core/rio/hdt/src/main/java/org/eclipse/rdf4j/rio/hdt/HDTDictionarySection.java new file mode 100644 index 00000000000..7a5962c35f4 --- /dev/null +++ b/core/rio/hdt/src/main/java/org/eclipse/rdf4j/rio/hdt/HDTDictionarySection.java @@ -0,0 +1,60 @@ +/******************************************************************************* + * Copyright (c) 2020 Eclipse RDF4J contributors. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Distribution License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ +package org.eclipse.rdf4j.rio.hdt; + +import java.io.IOException; + +/** + * HDT DictionarySection part. Various encodings exist. + * + * @author Bart Hanssens + */ +abstract class HDTDictionarySection extends HDTPart { + protected enum Type { + PLAIN(1), + FRONT(2), + HTFC(3), + FMINDEX(4), + REPAIRDAC(5), + HASHHUFF(6); + private final int value; + + protected int getValue() { + return value; + } + + private Type(int value) { + this.value = value; + } + } + + /** + * Get the size + * + * @return + */ + protected abstract int size(); + + /** + * Get the entry + * + * @param i zero-based index + * @return + */ + protected abstract byte[] get(int i) throws IOException; + + /** + * Constructor + * + * @param pos position + * @param name name + */ + protected HDTDictionarySection(String name, long pos) { + super(name, pos); + } +} diff --git a/core/rio/hdt/src/main/java/org/eclipse/rdf4j/rio/hdt/HDTDictionarySectionFactory.java b/core/rio/hdt/src/main/java/org/eclipse/rdf4j/rio/hdt/HDTDictionarySectionFactory.java new file mode 100644 index 00000000000..f0ff7649d4b --- /dev/null +++ b/core/rio/hdt/src/main/java/org/eclipse/rdf4j/rio/hdt/HDTDictionarySectionFactory.java @@ -0,0 +1,36 @@ +/******************************************************************************* + * Copyright (c) 2020 Eclipse RDF4J contributors. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Distribution License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ +package org.eclipse.rdf4j.rio.hdt; + +import java.io.IOException; +import java.io.InputStream; + +/** + * HDT DictionarySection factory. + * + * @author Bart Hanssens + */ +class HDTDictionarySectionFactory { + /** + * Create a dictionary section from input stream. The name an starting position are provided for debugging purposes. + * + * @param is input stream + * @param name name + * @param pos starting position + * @return dictionary section + * @throws IOException + */ + protected static HDTDictionarySection parse(InputStream is, String name, long pos) throws IOException { + int dtype = is.read(); + if (dtype != HDTDictionarySection.Type.FRONT.getValue()) { + throw new UnsupportedOperationException("Dictionary " + name + ": encoding " + + Long.toHexString(dtype) + ", but only front encoding is supported"); + } + return new HDTDictionarySectionPFC(name, pos); + } +} diff --git a/core/rio/hdt/src/main/java/org/eclipse/rdf4j/rio/hdt/HDTDictionarySectionPFC.java b/core/rio/hdt/src/main/java/org/eclipse/rdf4j/rio/hdt/HDTDictionarySectionPFC.java new file mode 100644 index 00000000000..1a5e8e69f25 --- /dev/null +++ b/core/rio/hdt/src/main/java/org/eclipse/rdf4j/rio/hdt/HDTDictionarySectionPFC.java @@ -0,0 +1,183 @@ +/******************************************************************************* + * Copyright (c) 2020 Eclipse RDF4J contributors. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Distribution License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ +package org.eclipse.rdf4j.rio.hdt; + +import java.io.IOException; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.LinkedHashMap; +import java.util.Map; +import java.util.zip.CheckedInputStream; + +import org.eclipse.rdf4j.common.io.UncloseableInputStream; + +/** + * HDT DictionarySection Plain Front Coding. + * + * This part starts with a byte indicating the type of the dictionary section, followed by the VByte-encoded number of + * strings, the VByte-encoded buffer size and the VByte-encoded buffer length. + * + * Then the 8-bit CRC. + * + * Followed by an array and one or more buffers, and the 32-bit CRC calculated over the index and the buffers. + * + * Structure: + * + *
    + * +------+--------------+--------------+-------+------+-------+--------+...+-------+
    + * | type | totalStrings | stringsBlock | array | CRC8 | index | buffer |...| CRC32 | 
    + * +------+--------------+--------------+-------+------+-------+--------+...+-------+
    + * 
    + * + * Each buffer starts with a full string, followed by a maximum of stringsBlock - 1 pair of a VByte-encoded + * number of characters this string has in common with the _previous_ string, and the (different) suffix. + * + * E.g. abcdef 2 gh 3 ij will result in abcde, abgh, abgij. + * + * Buffer structure: + * + *
    + * +--------+--------+--------+...+--------+--------+
    + * | string | common | suffix |...| common | suffix |
    + * +--------+--------+--------+...+--------+--------+
    + * 
    + * + * @author Bart Hanssens + */ +class HDTDictionarySectionPFC extends HDTDictionarySection { + private byte[] buffer; + + private int totalStrings; + private int stringsBlock; + private HDTArray blockStarts; + + // keep most recently used blocks in memory as decoded values + private final LinkedHashMap> cache = new LinkedHashMap>(100, + 1, true) { + @Override + protected boolean removeEldestEntry(Map.Entry eldest) { + return size() > 99; + } + }; + + /** + * Constructor + * + * @param name + * @param pos + */ + protected HDTDictionarySectionPFC(String name, long pos) { + super(name, pos); + } + + @Override + protected int size() { + return totalStrings; + } + + @Override + protected byte[] get(int i) throws IOException { + // HDT index start counting from 1 + int idx = i - 1; + + // get the block this string belongs to, and maintain the cache of recently used blocks + int block = idx / stringsBlock; + + ArrayList strings = cache.get(block); + if (strings == null) { + int blockStart = blockStarts.get(block); + strings = decodeBlock(block, blockStart); + cache.put(block, strings); + } + return strings.get(idx - (block * stringsBlock)); + } + + @Override + protected void parse(InputStream is) throws IOException { + CRC8 crc8 = new CRC8(); + crc8.update((byte) HDTDictionarySection.Type.FRONT.getValue()); + + int buflen; + + // don't close CheckedInputStream, as it will close the underlying inputstream + try (UncloseableInputStream uis = new UncloseableInputStream(is); + CheckedInputStream cis = new CheckedInputStream(uis, crc8)) { + + long val = VByte.decode(cis); + if (totalStrings > Integer.MAX_VALUE) { + throw new UnsupportedOperationException(getDebugPartStr() + " max number of strings exceeded: " + val); + } + totalStrings = (int) val; + + val = VByte.decode(cis); + if (val > Integer.MAX_VALUE) { + throw new UnsupportedOperationException(getDebugPartStr() + " max buffer length exceeded: " + val); + } + buflen = (int) val; + + val = VByte.decode(cis); + if (val > Integer.MAX_VALUE) { + throw new UnsupportedOperationException( + getDebugPartStr() + "max number of strings per exceeded: " + val); + } + stringsBlock = (int) val; + + checkCRC(cis, is, 1); + } + + // keep track of starting positions of the blocks + blockStarts = HDTArrayFactory.parse(is); + blockStarts.parse(is); + + // don't close CheckedInputStream, as it will close the underlying inputstream + try (UncloseableInputStream uis = new UncloseableInputStream(is); + CheckedInputStream cis = new CheckedInputStream(uis, new CRC32())) { + + buffer = new byte[buflen]; + cis.read(buffer); + checkCRC(cis, is, 4); + } + } + + /** + * Parse a single block + * + * @param block block number + * @param start starting position + * @return list of decoded byte strings + * @throws IOException + */ + private ArrayList decodeBlock(int block, int start) throws IOException { + ArrayList arr = new ArrayList<>(stringsBlock); + + // initial string + int idx = start; + int end = HDTPart.countToNull(buffer, idx); + byte[] str = Arrays.copyOfRange(buffer, idx, end); + arr.add(str); + idx = end + 1; + + // read the remaining strings, with a maximum of stringsBlock + int remaining = totalStrings - (block * stringsBlock); + for (int j = 1; j < stringsBlock && j < remaining; j++) { + int common = (int) VByte.decodeFrom(buffer, idx); + idx += VByte.encodedLength(common); + end = HDTPart.countToNull(buffer, idx); + byte[] suffix = Arrays.copyOfRange(buffer, idx, end); + + // copy the common part and add the suffix + str = Arrays.copyOf(str, common + suffix.length); + System.arraycopy(suffix, 0, str, common, suffix.length); + arr.add(str); + + idx = end + 1; + } + return arr; + } +} diff --git a/core/rio/hdt/src/main/java/org/eclipse/rdf4j/rio/hdt/HDTGlobal.java b/core/rio/hdt/src/main/java/org/eclipse/rdf4j/rio/hdt/HDTGlobal.java new file mode 100644 index 00000000000..4a991b1a37c --- /dev/null +++ b/core/rio/hdt/src/main/java/org/eclipse/rdf4j/rio/hdt/HDTGlobal.java @@ -0,0 +1,55 @@ +/******************************************************************************* + * Copyright (c) 2020 Eclipse RDF4J contributors. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Distribution License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ +package org.eclipse.rdf4j.rio.hdt; + +import java.io.IOException; +import java.io.InputStream; +import java.nio.charset.StandardCharsets; +import java.util.zip.CheckedInputStream; + +import org.eclipse.rdf4j.common.io.UncloseableInputStream; + +/** + * HDT Global Part. + * + * This part starts with $HDT, followed by a byte indicating the type of the part, the NULL-terminated URI + * string for the format, and optionally one or more key=value; properties. + * + * These properties may include a base URI, and the name of the software that produced the HDT file. + * + * Then a NULL byte, followed by the 16-bit CRC ($HDT and NULL included) + * + * Structure: + * + *
    + * +------+------+--------+------+------------+------+-------+
    + * | $HDT | type | format | NULL | key=value; | NULL | CRC16 |
    + * +------+------+--------+------+------------+------+-------+
    + * 
    + * + * @author Bart Hanssens + */ +class HDTGlobal extends HDTPart { + protected final static byte[] GLOBAL_FORMAT = "".getBytes(StandardCharsets.US_ASCII); + protected final static String GLOBAL_BASEURI = "BaseUri"; + protected final static String GLOBAL_SOFTWARE = "Software"; + + @Override + protected void parse(InputStream is) throws IOException { + // don't close CheckedInputStream, as it will close the underlying inputstream + try (UncloseableInputStream uis = new UncloseableInputStream(is); + CheckedInputStream cis = new CheckedInputStream(uis, new CRC16())) { + + checkControl(cis, HDTPart.Type.GLOBAL); + checkFormat(cis, GLOBAL_FORMAT); + properties = getProperties(cis); + + checkCRC(cis, is, 2); + } + } +} diff --git a/core/rio/hdt/src/main/java/org/eclipse/rdf4j/rio/hdt/HDTHeader.java b/core/rio/hdt/src/main/java/org/eclipse/rdf4j/rio/hdt/HDTHeader.java new file mode 100644 index 00000000000..8560fa44af1 --- /dev/null +++ b/core/rio/hdt/src/main/java/org/eclipse/rdf4j/rio/hdt/HDTHeader.java @@ -0,0 +1,79 @@ +/******************************************************************************* + * Copyright (c) 2020 Eclipse RDF4J contributors. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Distribution License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ +package org.eclipse.rdf4j.rio.hdt; + +import java.io.IOException; +import java.io.InputStream; +import java.nio.charset.StandardCharsets; +import java.util.zip.CheckedInputStream; + +import org.eclipse.rdf4j.common.io.UncloseableInputStream; + +/** + * HDT Header Part. + * + * This part starts with $HDT, followed by a byte indicating the type of the part, the NULL-terminated + * string for the format, and optionally one or more key=value; properties. + * + * Then a NULL byte, followed by the 16-bit CRC ($HDT and NULL included). + * + * Structure: + * + *
    + * +------+------+--------+------+------------+------+-------+
    + * | $HDT | type | format | NULL | key=value; | NULL | CRC16 |
    + * +------+------+--------+------+------------+------+-------+
    + * 
    + * + * @author Bart Hanssens + */ +class HDTHeader extends HDTPart { + + protected final static byte[] HEADER_FORMAT = "ntriples".getBytes(StandardCharsets.US_ASCII); + protected final static String HEADER_LENGTH = "length"; + + private byte[] headerData; + + @Override + protected void parse(InputStream is) throws IOException { + // don't close CheckedInputStream, as it will close the underlying inputstream + try (UncloseableInputStream uis = new UncloseableInputStream(is); + CheckedInputStream cis = new CheckedInputStream(uis, new CRC16())) { + + checkControl(cis, HDTPart.Type.HEADER); + checkFormat(cis, HEADER_FORMAT); + properties = getProperties(cis); + + checkCRC(cis, is, 2); + } + int hlen = getIntegerProperty(properties, HEADER_LENGTH, "Header length"); + headerData = parseHeaderData(is, hlen); + } + + /** + * Get raw header data (byte array data stored as NTriples) + * + * @return byte array + */ + protected byte[] getHeaderData() { + return headerData; + } + + /** + * Parse header data with metadata in NTriples format. + * + * @param is + * @param len + * @throws IOException + */ + private byte[] parseHeaderData(InputStream is, int len) throws IOException { + byte b[] = new byte[len]; + is.read(b); + return b; + } +} diff --git a/core/rio/hdt/src/main/java/org/eclipse/rdf4j/rio/hdt/HDTParser.java b/core/rio/hdt/src/main/java/org/eclipse/rdf4j/rio/hdt/HDTParser.java new file mode 100644 index 00000000000..d846a2a2657 --- /dev/null +++ b/core/rio/hdt/src/main/java/org/eclipse/rdf4j/rio/hdt/HDTParser.java @@ -0,0 +1,269 @@ +/******************************************************************************* + * Copyright (c) 2020 Eclipse RDF4J contributors. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Distribution License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ +package org.eclipse.rdf4j.rio.hdt; + +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.Reader; +import java.nio.charset.StandardCharsets; +import java.util.Collection; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; + +import org.apache.commons.io.input.CountingInputStream; +import org.eclipse.rdf4j.model.IRI; +import org.eclipse.rdf4j.model.Resource; +import org.eclipse.rdf4j.model.Statement; +import org.eclipse.rdf4j.model.Value; +import org.eclipse.rdf4j.model.ValueFactory; +import org.eclipse.rdf4j.model.impl.SimpleValueFactory; +import org.eclipse.rdf4j.rio.RDFFormat; +import org.eclipse.rdf4j.rio.RDFHandlerException; +import org.eclipse.rdf4j.rio.RDFParseException; +import org.eclipse.rdf4j.rio.RioSetting; +import org.eclipse.rdf4j.rio.helpers.AbstractRDFParser; + +/** + * RDF parser for HDT v1.0 files. This parser is not thread-safe, therefore its public methods are synchronized. + * + * Unfortunately the draft specification is not entirely clear and probably slightly out of date, since the open source + * reference implementation HDT-It seems to implement a slightly different version. This parser tries to be compatible + * with HDT-It 1.0. + * + * The most important parts are the Dictionaries containing the actual values (S, P, O part of a triple), and the + * Triples containing the numeric references to construct the triples. + * + * Since objects in one triple are often subjects in another triple, these "shared" parts are stored in a shared + * Dictionary, which may significantly reduce the file size. + * + * File structure: + * + *
    + * +---------------------+
    + * | Global              |
    + * | Header              |
    + * | Dictionary (Shared) |
    + * | Dictionary (S)      |
    + * | Dictionary (P)      |
    + * | Dictionary (O)      |    
    + * | Triples             |
    + * +---------------------+
    + * 
    + * + * @author Bart Hanssens + * + * @see HDT draft (2015) + * @see W3C Member Submission (2011) + */ +public class HDTParser extends AbstractRDFParser { + /** + * Creates a new HDTParser that will use a {@link SimpleValueFactory} to create RDF model objects. + */ + public HDTParser() { + super(); + } + + /** + * Creates a new HDTParser that will use the supplied ValueFactory to create RDF model objects. + * + * @param valueFactory A ValueFactory. + */ + public HDTParser(ValueFactory valueFactory) { + super(valueFactory); + } + + @Override + public RDFFormat getRDFFormat() { + return RDFFormat.HDT; + } + + @Override + public Collection> getSupportedSettings() { + Set> result = new HashSet<>(); + return result; + } + + /** + * Implementation of the parse(InputStream, String) method defined in the RDFParser interface. + * + * @param in The InputStream from which to read the data, must not be null. + * @param baseURI The URI associated with the data in the InputStream, must not be null. + * @throws IOException If an I/O error occurred while data was read from the InputStream. + * @throws RDFParseException If the parser has found an unrecoverable parse error. + * @throws RDFHandlerException If the configured statement handler encountered an unrecoverable error. + * @throws IllegalArgumentException If the supplied input stream or base URI is null. + */ + @Override + public synchronized void parse(InputStream in, String baseURI) + throws IOException, RDFParseException, RDFHandlerException { + if (in == null) { + throw new IllegalArgumentException("Input stream must not be 'null'"); + } + + if (in instanceof FileInputStream) { + // "TODO: use more optimized way to parse the file, eg. filechannel / membuffer" + } + + HDTDictionarySection shared = null; + HDTDictionarySection subjects = null; + HDTDictionarySection predicates = null; + HDTDictionarySection objects = null; + HDTTriplesSection section = null; + + // not using try-with-resources, since the counter is needed in the catch clause (JDK8) + CountingInputStream bis = new CountingInputStream(in); + try { + reportLocation(0, -1); + HDTGlobal global = new HDTGlobal(); + global.parse(bis); + Map globalProps = global.getProperties(); + String base = globalProps.getOrDefault(HDTGlobal.GLOBAL_BASEURI, ""); + if (!base.isEmpty()) { + setBaseURI(base); + } + + reportLocation(bis.getByteCount(), -1); + HDTHeader header = new HDTHeader(); + header.parse(bis); + + reportLocation(bis.getByteCount(), -1); + new HDTDictionary().parse(bis); + + long dpos = bis.getByteCount(); + reportLocation(dpos, -1); + shared = HDTDictionarySectionFactory.parse(bis, "S+O", dpos); + shared.parse(bis); + + dpos = bis.getByteCount(); + reportLocation(dpos, -1); + subjects = HDTDictionarySectionFactory.parse(bis, "S", dpos); + subjects.parse(bis); + + dpos = bis.getByteCount(); + reportLocation(dpos, -1); + predicates = HDTDictionarySectionFactory.parse(bis, "P", dpos); + predicates.parse(bis); + + dpos = bis.getByteCount(); + reportLocation(dpos, -1); + objects = HDTDictionarySectionFactory.parse(bis, "O", dpos); + objects.parse(bis); + + reportLocation(bis.getByteCount(), -1); + HDTTriples triples = new HDTTriples(); + triples.parse(bis); + + reportLocation(bis.getByteCount(), -1); + section = HDTTriplesSectionFactory.parse(new String(HDTTriples.FORMAT_BITMAP)); + section.parse(bis, triples.getOrder()); + } catch (IOException ioe) { + reportFatalError(ioe.getMessage(), bis.getCount(), -1); + } finally { + bis.close(); + } + + if (rdfHandler != null) { + rdfHandler.startRDF(); + } + + int cnt = 0; + int size = shared.size(); + + while (section.hasNext()) { + int[] t = section.next(); + byte[] s = getSO(t[0], size, shared, subjects); + byte[] p = predicates.get(t[1]); + byte[] o = getSO(t[2], size, shared, objects); + Statement stmt = valueFactory.createStatement(createSubject(s), createPredicate(p), createObject(o)); + + if (rdfHandler != null) { + rdfHandler.handleStatement(stmt); + } + } + + if (rdfHandler != null) { + rdfHandler.endRDF(); + } + } + + /** + * Not supported, since HDT is a binary format. + */ + @Override + public synchronized void parse(Reader reader, String baseURI) + throws IOException, RDFParseException, RDFHandlerException { + throw new UnsupportedOperationException("HDT is binary, text readers not supported."); + } + + /** + * Get part of triple from shared HDT Dictionary or (if not found) from specific HDT Dictionary + * + * @param pos position + * @param size size of shared Dictionary + * @param shared shared Dictionary + * @param other specific Dictionary + * @return subject or object + */ + private byte[] getSO(int pos, int size, HDTDictionarySection shared, HDTDictionarySection other) + throws IOException { + return (pos <= size) ? shared.get(pos) : other.get(pos - size); + } + + private boolean isBNodeID(byte[] b) { + // HDT-It generates "genid" for blank nodes in RDF/XML + return (b[0] == '_' || (b.length > 5 && b[0] == 'g' && b[1] == 'e')); + } + + /** + * Create subject IRI or blank node + * + * @param b byte buffer + * @return IRI or blank node + */ + private Resource createSubject(byte[] b) { + String str = new String(b, StandardCharsets.UTF_8); + return isBNodeID(b) ? valueFactory.createBNode(str) : valueFactory.createIRI(str); + } + + /** + * Create predicate IRI + * + * @param b byte buffer + * @return IRI + */ + private IRI createPredicate(byte[] b) { + return valueFactory.createIRI(new String(b, StandardCharsets.UTF_8)); + } + + /** + * Create object (typed) literal, IRI or blank node + * + * @param b byte buffer + * @return literal, IRI or blank node + */ + private Value createObject(byte[] b) { + if (b[0] == '"') { + int i = b.length - 1; + for (; i > 1 && b[i] != '"'; i--) { + if (b[i] == '@') { + String lang = new String(b, i + 1, b.length - i - 1, StandardCharsets.US_ASCII); + return valueFactory.createLiteral(new String(b, 1, i - 2, StandardCharsets.UTF_8), lang); + } else if (b[i] == '^') { + IRI datatype = valueFactory + .createIRI(new String(b, i + 2, b.length - i - 3, StandardCharsets.US_ASCII)); + return valueFactory.createLiteral(new String(b, 1, i - 3, StandardCharsets.UTF_8), datatype); + } + } + return valueFactory.createLiteral(new String(b, 1, i - 1, StandardCharsets.UTF_8)); + } + String str = new String(b, StandardCharsets.UTF_8); + return isBNodeID(b) ? valueFactory.createBNode(str) : valueFactory.createIRI(str); + } +} diff --git a/core/rio/hdt/src/main/java/org/eclipse/rdf4j/rio/hdt/HDTParserFactory.java b/core/rio/hdt/src/main/java/org/eclipse/rdf4j/rio/hdt/HDTParserFactory.java new file mode 100644 index 00000000000..1eb749dd991 --- /dev/null +++ b/core/rio/hdt/src/main/java/org/eclipse/rdf4j/rio/hdt/HDTParserFactory.java @@ -0,0 +1,35 @@ +/******************************************************************************* + * Copyright (c) 2020 Eclipse RDF4J contributors. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Distribution License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ +package org.eclipse.rdf4j.rio.hdt; + +import org.eclipse.rdf4j.rio.RDFFormat; +import org.eclipse.rdf4j.rio.RDFParserFactory; + +/** + * An {@link RDFParserFactory} for HDT parsers. + * + * @author Bart Hanssens + */ +public class HDTParserFactory implements RDFParserFactory { + + /** + * Returns {@link RDFFormat#HDT}. + */ + @Override + public RDFFormat getRDFFormat() { + return RDFFormat.HDT; + } + + /** + * Returns a new instance of {@link HDTParser}. + */ + @Override + public HDTParser getParser() { + return new HDTParser(); + } +} diff --git a/core/rio/hdt/src/main/java/org/eclipse/rdf4j/rio/hdt/HDTPart.java b/core/rio/hdt/src/main/java/org/eclipse/rdf4j/rio/hdt/HDTPart.java new file mode 100644 index 00000000000..8c8e285ed07 --- /dev/null +++ b/core/rio/hdt/src/main/java/org/eclipse/rdf4j/rio/hdt/HDTPart.java @@ -0,0 +1,269 @@ +/******************************************************************************* + * Copyright (c) 2020 Eclipse RDF4J contributors. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Distribution License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ +package org.eclipse.rdf4j.rio.hdt; + +import java.io.IOException; +import java.io.InputStream; +import java.nio.charset.StandardCharsets; +import java.util.Arrays; +import java.util.HashMap; +import java.util.Map; +import java.util.zip.CheckedInputStream; + +/** + * Helper class for different HDT parts. + * + * Each part starts with $HDT, followed by a byte indicating the type of the part. + * + * Structure: + * + *
    + * +------+------+
    + * | $HDT | type |
    + * +------+------+
    + * 
    + * + * @author Bart Hanssens + */ +abstract class HDTPart { + protected enum Type { + GLOBAL((byte) 1), + HEADER((byte) 2), + DICTIONARY((byte) 3), + TRIPLES((byte) 4); + private final byte value; + + /** + * Get value associated with this type + * + * @return value 1,2 or 3 + */ + protected byte getValue() { + return value; + } + + private Type(byte value) { + this.value = value; + } + } + + protected final static byte[] COOKIE = "$HDT".getBytes(StandardCharsets.US_ASCII); + + // TODO: make configurable, buffer for reading object values + private final static int BUFLEN = 1 * 1024 * 1024; + // for debugging purposes + protected final String name; + protected final long pos; + protected Map properties; + + /** + * Parse from input stream + * + * @param is + * @throws IOException + */ + protected abstract void parse(InputStream is) throws IOException; + + /** + * Get properties, if any. + * + * @return key, value map + */ + protected Map getProperties() { + return properties; + } + + /** + * Constructor + * + * @param name part name + * @param pos starting position in input stream + */ + protected HDTPart(String name, long pos) { + this.name = name; + this.pos = pos; + } + + /** + * Constructor + */ + protected HDTPart() { + this("", -1); + } + + /** + * Get a string for debugging purposes, containing the name and starting position of this part. + * + * @return string + */ + protected String getDebugPartStr() { + if (name == null || name.isEmpty()) { + return ""; + } + return (pos != -1) ? name + " (starts at byte " + pos + ")" : name; + } + + /** + * Check start of part for $HDT and the byte indicating the type + * + * @param is input stream + * @param ctype control type + * @throws IOException + */ + protected static void checkControl(InputStream is, HDTPart.Type ctype) throws IOException { + byte[] cookie = new byte[COOKIE.length]; + is.read(cookie); + if (!Arrays.equals(cookie, COOKIE)) { + throw new IOException("$HDT marker not found"); + } + + byte b = (byte) is.read(); + if (b != ctype.getValue()) { + throw new IOException("Info type " + Long.toHexString(b) + ", but expected different control info type"); + } + } + + /** + * Check for null terminated format string. + * + * @param is + * @param format + * @throws IOException + */ + protected static void checkFormat(InputStream is, byte[] format) throws IOException { + byte[] b = new byte[format.length]; + is.read(b); + if (!Arrays.equals(b, format)) { + throw new IOException("Unknown format, expected " + new String(format, StandardCharsets.US_ASCII)); + } + is.read(); // also read null byte + } + + /** + * Read null terminated series of bytes + * + * @param is input stream + * @return + * @throws IOException + */ + protected static byte[] readToNull(InputStream is) throws IOException { + byte[] buf = new byte[BUFLEN]; + int len = 0; + + do { + buf[len] = (byte) is.read(); + } while (buf[len] != 0b00 && ++len < BUFLEN); + + if (len == BUFLEN) { + throw new IOException("Buffer for reading properties exceeded, max " + BUFLEN); + } + return Arrays.copyOf(buf, len); + } + + /** + * Get the first position of the NULL byte within an array of bytes + * + * @param b byte array + * @param start position to start from + * @return position of first NULL byte + */ + protected static int countToNull(byte[] b, int start) throws IOException { + for (int i = start; i < b.length; i++) { + if (b[i] == 0b00) { + return i; + } + } + throw new IOException("No null byte found in buffer starting at byte " + start); + } + + /** + * Get the properties from the input stream, reading at most BUFLEN bytes. The properties are encoded as a + * key=value; string and must be null terminated. + * + * @param is input stream + * @return key, value map + * @throws IOException + */ + protected static Map getProperties(InputStream is) throws IOException { + return mapProperties(readToNull(is)); + } + + /** + * Get properties as a key, value map + * + * @param props + * @return + */ + protected static Map mapProperties(byte[] props) { + Map map = new HashMap<>(); + if (props == null || props.length == 0) { + return map; + } + + String strs[] = new String(props, 0, props.length, StandardCharsets.US_ASCII).split(";"); + for (String str : strs) { + String prop[] = str.split("="); + if (prop.length == 2) { + map.put(prop[0], prop[1]); + } + } + return map; + } + + /** + * Get the positive integer value from a property map. Throw an exception when the property is missing, or less than + * 1. + * + * @param props property map + * @param prop name of the property + * @param name display name of the property + * @return positive integer + * @throws IOException + */ + protected int getIntegerProperty(Map props, String prop, String name) throws IOException { + int len = 0; + + String str = props.getOrDefault(prop, "0"); + try { + len = Integer.parseInt(str); + } catch (NumberFormatException nfe) { + throw new IOException(name + " is not an integer: " + str); + } + if (len < 1) { + throw new IOException(name + " is less than 1: " + len); + } + return len; + } + + /** + * Compare the calculated checksum to the expected one. + * + * @param cis checked input stream + * @param is (unchecked) input stream + * @param len number of bytes of the checksum + * @throws IOException + */ + protected static void checkCRC(CheckedInputStream cis, InputStream is, int len) throws IOException { + long calc = cis.getChecksum().getValue(); + + byte[] checksum = new byte[len]; + is.read(checksum); + + long expect = 0L; + // little-endian to big-endian, e.g. HDT-It stores checksum 7635 as 0x35 0x76 (at least on x86) + for (int i = len - 1; i >= 0; i--) { + expect <<= 8; + expect |= checksum[i] & 0xFF; + } + + if (calc != expect) { + throw new IOException("CRC does not match: calculated " + + Long.toHexString(calc) + " instead of " + Long.toHexString(expect)); + } + } +} diff --git a/core/rio/hdt/src/main/java/org/eclipse/rdf4j/rio/hdt/HDTTriples.java b/core/rio/hdt/src/main/java/org/eclipse/rdf4j/rio/hdt/HDTTriples.java new file mode 100644 index 00000000000..abe24a32f47 --- /dev/null +++ b/core/rio/hdt/src/main/java/org/eclipse/rdf4j/rio/hdt/HDTTriples.java @@ -0,0 +1,101 @@ +/******************************************************************************* + * Copyright (c) 2020 Eclipse RDF4J contributors. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Distribution License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ +package org.eclipse.rdf4j.rio.hdt; + +import java.io.IOException; +import java.io.InputStream; +import java.nio.charset.StandardCharsets; +import java.util.zip.CheckedInputStream; + +import org.eclipse.rdf4j.common.io.UncloseableInputStream; + +/** + * HDT Triples Part. + * + * This part starts with $HDT, followed by a byte indicating the type of the part, the NULL-terminated URI + * string for the format, and optionally one or more key=value; properties. + * + * These properties may include the order (SPO, SOP...), and the number of triples. + * + * Then a NULL byte, followed by the 16-bit CRC ($HDT and NULL included) + * + * Structure: + * + *
    + * +------+------+-----+------+------------+------+-------+
    + * | $HDT | type | URI | NULL | key=value; | NULL | CRC16 |
    + * +------+------+-----+------+------------+------+-------+
    + * 
    + * + * @author Bart Hanssens + */ +class HDTTriples extends HDTPart { + protected enum Order { + UNKNOWN(0), + SPO(1), + SOP(2), + PSO(3), + POS(4), + OSP(5), + OPS(6); + private final int value; + + protected int getValue() { + return value; + } + + /** + * Constructor + * + * @param value integer value + */ + private Order(int value) { + this.value = value; + } + } + + protected final static byte[] FORMAT_LIST = "" + .getBytes(StandardCharsets.US_ASCII); + protected final static byte[] FORMAT_BITMAP = "" + .getBytes(StandardCharsets.US_ASCII); + protected final static String ORDER = "order"; + protected final static String NUM = "numTriples"; + + private Order order; + private int nrtriples; + + /** + * Return triple order + * + * @return enum + */ + protected Order getOrder() { + return order; + } + + @Override + protected void parse(InputStream is) throws IOException { + // don't close CheckedInputStream, as it will close the underlying inputstream + try (UncloseableInputStream uis = new UncloseableInputStream(is); + CheckedInputStream cis = new CheckedInputStream(uis, new CRC16())) { + + checkControl(cis, HDTPart.Type.TRIPLES); + checkFormat(cis, FORMAT_BITMAP); + + properties = getProperties(cis); + + int i = getIntegerProperty(properties, ORDER, "order"); + if (i != HDTTriples.Order.SPO.getValue()) { + throw new UnsupportedOperationException( + "Triples section: order " + Integer.toString(i) + ", but only SPO order is supported"); + } + + checkCRC(cis, is, 2); + } + } +} diff --git a/core/rio/hdt/src/main/java/org/eclipse/rdf4j/rio/hdt/HDTTriplesSection.java b/core/rio/hdt/src/main/java/org/eclipse/rdf4j/rio/hdt/HDTTriplesSection.java new file mode 100644 index 00000000000..f0e960603a7 --- /dev/null +++ b/core/rio/hdt/src/main/java/org/eclipse/rdf4j/rio/hdt/HDTTriplesSection.java @@ -0,0 +1,28 @@ +/******************************************************************************* + * Copyright (c) 2020 Eclipse RDF4J contributors. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Distribution License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ +package org.eclipse.rdf4j.rio.hdt; + +import java.io.IOException; +import java.io.InputStream; +import java.util.Iterator; + +/** + * HDT TriplesSection part. + * + * @author Bart Hanssens + */ +abstract class HDTTriplesSection extends HDTPart implements Iterator { + /** + * Parse triples section and return the triple parts in the correct S,P,O order. + * + * @param is + * @param order + * @throws IOException + */ + protected abstract void parse(InputStream is, HDTTriples.Order order) throws IOException; +} diff --git a/core/rio/hdt/src/main/java/org/eclipse/rdf4j/rio/hdt/HDTTriplesSectionBitmap.java b/core/rio/hdt/src/main/java/org/eclipse/rdf4j/rio/hdt/HDTTriplesSectionBitmap.java new file mode 100644 index 00000000000..94d30ddec97 --- /dev/null +++ b/core/rio/hdt/src/main/java/org/eclipse/rdf4j/rio/hdt/HDTTriplesSectionBitmap.java @@ -0,0 +1,99 @@ +/******************************************************************************* + * Copyright (c) 2020 Eclipse RDF4J contributors. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Distribution License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ +package org.eclipse.rdf4j.rio.hdt; + +import java.io.IOException; +import java.io.InputStream; + +/** + * HDT Triples section. + * + * This part contains two levels of bitmaps and arrays. + * + * Typically (in SPO order), the Y-level corresponds to the predicates and the Z-level to the objects. + * + * The X (subjects) is implicit since triples are already ordered by X, and bitmap Y is used to notify when there is a + * new X: X will be used until a 1 is found in bitmap Y, which indicates that the next triple uses X+1. + * + * The array contains numeric references to the predicates and objects in the HDT dictionaries, starting with the + * entries in the "shared" {@link org.eclipse.rdf4j.rio.hdt.HDTDictionary Dictionary} These positions are counted + * starting with 1, not 0. + * + * E.g. Y-bitmap 0 1 1 and Y-array 1 2 3 results in S1-P1 S1-P2 S2-P3 + * + * + * Structure: + * + *
    + * +----------+----------+---------+---------+
    + * | Bitmap Y | Bitmap Z | Array Y | Array Z |
    + * +----------+----------+---------+---------+
    + * 
    + * + * @author Bart Hanssens + */ +class HDTTriplesSectionBitmap extends HDTTriplesSection { + private HDTBitmap bitmapY; + private HDTBitmap bitmapZ; + private HDTArray arrY; + private HDTArray arrZ; + + private int sizeY = 0; + private int sizeZ = 0; + + private int posX = 1; + private int posY = 0; + private int posZ = 0; + + @Override + public boolean hasNext() { + // we only need to check if we've reach the end of the "lowest" level + return posZ < sizeZ; + } + + @Override + public int[] next() { + int z = arrZ.get(posZ); + int y = arrY.get(posY); + int x = posX; + + if (bitmapZ.get(posZ) == 1 && posZ < sizeZ) { + // move to next Y position (predicate) when there is no Z (predicate) left + if (bitmapY.get(posY) == 1 && posY < sizeY) { + // move to next X position (subject) when there is no Y (predicate) left + posX++; + } + posY++; + } + posZ++; + + return new int[] { x, y, z }; + } + + @Override + protected void parse(InputStream is) throws IOException { + parse(is, HDTTriples.Order.SPO); + } + + @Override + protected void parse(InputStream is, HDTTriples.Order order) throws IOException { + bitmapY = new HDTBitmap(); + bitmapY.parse(is); + sizeY = bitmapY.size(); + + bitmapZ = new HDTBitmap(); + bitmapZ.parse(is); + sizeZ = bitmapZ.size(); + + arrY = HDTArrayFactory.parse(is); + arrY.parse(is); + + arrZ = HDTArrayFactory.parse(is); + arrZ.parse(is); + } +} diff --git a/core/rio/hdt/src/main/java/org/eclipse/rdf4j/rio/hdt/HDTTriplesSectionFactory.java b/core/rio/hdt/src/main/java/org/eclipse/rdf4j/rio/hdt/HDTTriplesSectionFactory.java new file mode 100644 index 00000000000..ad7eee7fec2 --- /dev/null +++ b/core/rio/hdt/src/main/java/org/eclipse/rdf4j/rio/hdt/HDTTriplesSectionFactory.java @@ -0,0 +1,26 @@ +/******************************************************************************* + * Copyright (c) 2020 Eclipse RDF4J contributors. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Distribution License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ +package org.eclipse.rdf4j.rio.hdt; + +import java.io.IOException; + +/** + * HDT Array factory. + * + * @author Bart Hanssens + */ +class HDTTriplesSectionFactory { + + protected static HDTTriplesSection parse(String str) throws IOException { + if (!str.equals(new String(HDTTriples.FORMAT_BITMAP))) { + throw new UnsupportedOperationException( + "Triples section: " + str + ", but only bitmap encoding is supported"); + } + return new HDTTriplesSectionBitmap(); + } +} diff --git a/core/rio/hdt/src/main/java/org/eclipse/rdf4j/rio/hdt/VByte.java b/core/rio/hdt/src/main/java/org/eclipse/rdf4j/rio/hdt/VByte.java new file mode 100644 index 00000000000..22b3afadb0f --- /dev/null +++ b/core/rio/hdt/src/main/java/org/eclipse/rdf4j/rio/hdt/VByte.java @@ -0,0 +1,116 @@ +/******************************************************************************* + * Copyright (c) 2020 Eclipse RDF4J contributors. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Distribution License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ +package org.eclipse.rdf4j.rio.hdt; + +import java.io.IOException; +import java.io.InputStream; + +/** + * Variable byte encoding for numbers. + * + * A variable number of bytes is used to encode (unsigned) numeric values, the first bit (MSB) of each byte indicates if + * there are more bytes to read, the other 7 bits are used to encode the value. + * + * In this implementation, the MSB is set to 1 if this byte is the last one. + * + * E.g: 10000001 is value 1, 00000001 10000001 is 128 (decimal). Note that the value is stored + * little-endian, so in this example 10000001 00000001. + * + * @author Bart.Hanssens + * + * @see Variable byte codes + */ +public class VByte { + /** + * Checks if the most significant bit is set. If this bit is zero, then the next byte must also be read to decode + * the number. + * + * @param b + * @return true if there is a next byte + */ + public static boolean hasNext(byte b) { + return (b & 0xff) < 0x80; + } + + /** + * Decode a series of encoded bytes, with a maximum of 8 bytes + * + * @param bytes byte array + * @param len number of bytes to decode + * @return long value + */ + public static long decode(byte[] bytes, int len) { + if (len > 8 || bytes.length < len) { + throw new IllegalArgumentException("Buffer too long, or incorrect length"); + } + long val = 0L; + // little-endian to big-endian, e.g. HDT-It stores vbyte 0x81 0x00 as 0x00 0x81 (at least on x86) + for (int i = len - 1; i >= 0; i--) { + val <<= 7; + val |= bytes[i] & 0x7F; + } + return val; + } + + /** + * Decode a maximum of 8 bytes from the input stream. + * + * @param is input stream + * @return decode value + * @throws IOException + */ + public static long decode(InputStream is) throws IOException { + byte[] buffer = new byte[8]; + + int i = 0; + do { + buffer[i] = (byte) is.read(); + } while (i < buffer.length && hasNext(buffer[i++])); + return decode(buffer, i); + } + + /** + * Decode a maximum of 8 bytes from a byte array. + * + * @param b byte array + * @param start starting position + * @return decode value + * @throws IOException + */ + public static long decodeFrom(byte[] b, int start) throws IOException { + byte[] buffer = new byte[8]; + + int i = 0; + do { + buffer[i] = b[start + i]; + } while (i < buffer.length && hasNext(buffer[i++])); + return decode(buffer, i); + } + + /** + * Calculate the number of bytes needed for encoding a value + * + * @param value numeric value + * @return number of bytes + */ + public static int encodedLength(long value) { + if (value < 127) { + return 1; + } + if (value < 16_384) { + return 2; + } + if (value < 2_097_152) { + return 3; + } + if (value < 268_435_456) { + return 4; + } + return 5; + } +} diff --git a/core/rio/hdt/src/main/java/org/eclipse/rdf4j/rio/hdt/package-info.java b/core/rio/hdt/src/main/java/org/eclipse/rdf4j/rio/hdt/package-info.java new file mode 100644 index 00000000000..116670c1f46 --- /dev/null +++ b/core/rio/hdt/src/main/java/org/eclipse/rdf4j/rio/hdt/package-info.java @@ -0,0 +1,38 @@ +/** + * Parser/writer for the HDT v1.0 format. + * + * Unfortunately the draft specification is not entirely clear and probably slightly out of date, since the open source + * reference implementation HDT-It seems to implement a slightly different version. This parser tries to be compatible + * with HDT-It 1.0. + * + * File structure: + * + *
    + * +---------------------+
    + * | Global              |
    + * | Header              |
    + * | Dictionary (Shared) |
    + * | Dictionary (S)      |
    + * | Dictionary (P)      |
    + * | Dictionary (O)      |    
    + * | Triples             |
    + * +---------------------+
    + * 
    + * + *

    General structure for Global, Header, Dictionary and Triples

    + * + * These part all starts with $HDT, followed by a byte indicating the type of the part, the format, and + * optionally one or more key=value; properties. + * + * Then a NULL byte, followed by the 16-bit CRC ($HDT and NULL included) + * + *
    + * +------+------+--------+------+------------+------+-------+
    + * | $HDT | type | format | NULL | key=value; | NULL | CRC16 |
    + * +------+------+--------+------+------------+------+-------+
    + * 
    + * + * The format varies slightly: depending on the section, it can either be a string or a URI. + * + */ +package org.eclipse.rdf4j.rio.hdt; diff --git a/core/rio/hdt/src/main/resources/META-INF/services/org.eclipse.rdf4j.rio.RDFParserFactory b/core/rio/hdt/src/main/resources/META-INF/services/org.eclipse.rdf4j.rio.RDFParserFactory new file mode 100644 index 00000000000..e832fb572fe --- /dev/null +++ b/core/rio/hdt/src/main/resources/META-INF/services/org.eclipse.rdf4j.rio.RDFParserFactory @@ -0,0 +1 @@ +org.eclipse.rdf4j.rio.hdt.HDTParserFactory diff --git a/core/rio/hdt/src/test/java/org/eclipse/rdf4j/rio/hdt/CRC16Test.java b/core/rio/hdt/src/test/java/org/eclipse/rdf4j/rio/hdt/CRC16Test.java new file mode 100644 index 00000000000..8d4ffdac267 --- /dev/null +++ b/core/rio/hdt/src/test/java/org/eclipse/rdf4j/rio/hdt/CRC16Test.java @@ -0,0 +1,36 @@ +/******************************************************************************* + * Copyright (c) 2020 Eclipse RDF4J contributors. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Distribution License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ +package org.eclipse.rdf4j.rio.hdt; + +import static org.junit.Assert.assertEquals; + +import java.nio.charset.StandardCharsets; + +import org.junit.Test; + +/** + * + * @author Bart Hanssens + */ +public class CRC16Test { + @Test + public void testHello() { + CRC16 crc = new CRC16(); + crc.update("Hello world".getBytes(StandardCharsets.US_ASCII), 0, "Hello world".length()); + assertEquals("CRC hello world not correct", 0xF96A, crc.getValue()); + } + + @Test + public void testHelloPerByte() { + CRC16 crc = new CRC16(); + for (byte b : "Hello world".getBytes(StandardCharsets.US_ASCII)) { + crc.update(b); + } + assertEquals("CRC hello world not correct", 0xF96A, crc.getValue()); + } +} diff --git a/core/rio/hdt/src/test/java/org/eclipse/rdf4j/rio/hdt/CRC32Test.java b/core/rio/hdt/src/test/java/org/eclipse/rdf4j/rio/hdt/CRC32Test.java new file mode 100644 index 00000000000..3b887e1ecb3 --- /dev/null +++ b/core/rio/hdt/src/test/java/org/eclipse/rdf4j/rio/hdt/CRC32Test.java @@ -0,0 +1,36 @@ +/******************************************************************************* + * Copyright (c) 2020 Eclipse RDF4J contributors. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Distribution License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ +package org.eclipse.rdf4j.rio.hdt; + +import static org.junit.Assert.assertEquals; + +import java.nio.charset.StandardCharsets; + +import org.junit.Test; + +/** + * + * @author Bart Hanssens + */ +public class CRC32Test { + @Test + public void testHello() { + CRC32 crc = new CRC32(); + crc.update("Hello world".getBytes(StandardCharsets.US_ASCII), 0, "Hello world".length()); + assertEquals("CRC hello world not correct", 0x72B51F78, crc.getValue()); + } + + @Test + public void testHelloPerByte() { + CRC32 crc = new CRC32(); + for (byte b : "Hello world".getBytes(StandardCharsets.US_ASCII)) { + crc.update(b); + } + assertEquals("CRC hello world not correct", 0x72B51F78, crc.getValue()); + } +} diff --git a/core/rio/hdt/src/test/java/org/eclipse/rdf4j/rio/hdt/CRC8Test.java b/core/rio/hdt/src/test/java/org/eclipse/rdf4j/rio/hdt/CRC8Test.java new file mode 100644 index 00000000000..0afe6ad51ab --- /dev/null +++ b/core/rio/hdt/src/test/java/org/eclipse/rdf4j/rio/hdt/CRC8Test.java @@ -0,0 +1,36 @@ +/******************************************************************************* + * Copyright (c) 2020 Eclipse RDF4J contributors. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Distribution License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ +package org.eclipse.rdf4j.rio.hdt; + +import static org.junit.Assert.assertEquals; + +import java.nio.charset.StandardCharsets; + +import org.junit.Test; + +/** + * + * @author Bart.Hanssens + */ +public class CRC8Test { + @Test + public void testHello() { + CRC8 crc = new CRC8(); + crc.update("Hello world".getBytes(StandardCharsets.US_ASCII), 0, "Hello world".length()); + assertEquals("CRC hello world not correct", 0x41, crc.getValue()); + } + + @Test + public void testHelloPerByte() { + CRC8 crc = new CRC8(); + for (byte b : "Hello world".getBytes(StandardCharsets.US_ASCII)) { + crc.update(b); + } + assertEquals("CRC hello world not correct", 0x41, crc.getValue()); + } +} diff --git a/core/rio/hdt/src/test/java/org/eclipse/rdf4j/rio/hdt/HDTParserTest.java b/core/rio/hdt/src/test/java/org/eclipse/rdf4j/rio/hdt/HDTParserTest.java new file mode 100644 index 00000000000..b22edccb674 --- /dev/null +++ b/core/rio/hdt/src/test/java/org/eclipse/rdf4j/rio/hdt/HDTParserTest.java @@ -0,0 +1,75 @@ +/******************************************************************************* + * Copyright (c) 2020 Eclipse RDF4J contributors. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Distribution License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ +package org.eclipse.rdf4j.rio.hdt; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.fail; + +import java.io.InputStream; + +import org.eclipse.rdf4j.model.Model; +import org.eclipse.rdf4j.model.impl.LinkedHashModel; +import org.eclipse.rdf4j.rio.RDFFormat; +import org.eclipse.rdf4j.rio.RDFParser; +import org.eclipse.rdf4j.rio.Rio; +import org.eclipse.rdf4j.rio.helpers.StatementCollector; +import org.junit.Before; +import org.junit.Test; + +/** + * + * @author Bart Hanssens + */ +public class HDTParserTest { + private RDFParser parser; + + @Before + public void setUp() throws Exception { + parser = Rio.createParser(RDFFormat.HDT); + parser.setParseLocationListener((line, col) -> System.err.println("byte " + line)); + } + + @Test + public void parseSimpleSPO() { + // load original N-Triples file + Model orig = new LinkedHashModel(); + try (InputStream is = HDTParserTest.class.getResourceAsStream("/test-orig.nt")) { + RDFParser nt = Rio.createParser(RDFFormat.NTRIPLES); + nt.setRDFHandler(new StatementCollector(orig)); + nt.parse(is, ""); + } catch (Exception e) { + fail(e.getMessage()); + } + + Model m = new LinkedHashModel(); + try (InputStream is = HDTParserTest.class.getResourceAsStream("/test.hdt")) { + parser.setRDFHandler(new StatementCollector(m)); + parser.parse(is, ""); + assertEquals("Number of statements does not match", 43, m.size()); + } catch (Exception e) { + fail(e.getMessage()); + } + + orig.removeAll(m); + assertEquals("HDT model does not match original NT file", 0, orig.size()); + } + + @Test + public void parseSimplePOS() { + Model m = new LinkedHashModel(); + + try (InputStream is = HDTParserTest.class.getResourceAsStream("/test-pos.hdt")) { + parser.setRDFHandler(new StatementCollector(m)); + parser.parse(is, ""); + assertEquals("Number of statements does not match", 43, m.size()); + fail("Unsupported not caught"); + } catch (Exception e) { + assertEquals(e.getMessage(), "Triples section: order 4, but only SPO order is supported"); + } + } +} diff --git a/core/rio/hdt/src/test/java/org/eclipse/rdf4j/rio/hdt/VByteTest.java b/core/rio/hdt/src/test/java/org/eclipse/rdf4j/rio/hdt/VByteTest.java new file mode 100644 index 00000000000..972919a2369 --- /dev/null +++ b/core/rio/hdt/src/test/java/org/eclipse/rdf4j/rio/hdt/VByteTest.java @@ -0,0 +1,43 @@ +/******************************************************************************* + * Copyright (c) 2020 Eclipse RDF4J contributors. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Distribution License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ +package org.eclipse.rdf4j.rio.hdt; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.fail; + +import java.io.ByteArrayInputStream; +import java.io.IOException; + +import org.junit.Test; + +/** + * + * @author Bart.Hanssens + */ +public class VByteTest { + @Test + public void test127() { + assertEquals("127 not correctly decoded", 127, VByte.decode(new byte[] { (byte) 0xff }, 1)); + } + + @Test + public void test128() { + assertEquals("128 not correctly decoded", 128, VByte.decode(new byte[] { (byte) 0x00, (byte) 0x81 }, 2)); + } + + @Test + public void test128Input() { + byte b[] = new byte[] { (byte) 0x00, (byte) 0x81 }; + + try (ByteArrayInputStream bis = new ByteArrayInputStream(b)) { + assertEquals("128 not correctly decoded", 128, VByte.decode(bis)); + } catch (IOException ioe) { + fail(ioe.getMessage()); + } + } +} diff --git a/core/rio/hdt/src/test/resources/test-orig.nt b/core/rio/hdt/src/test/resources/test-orig.nt new file mode 100644 index 00000000000..531cea13c3d --- /dev/null +++ b/core/rio/hdt/src/test/resources/test-orig.nt @@ -0,0 +1,43 @@ + . + . + . + "FOD BOSA DG Digitale Transformatie stelt een geconsolideerd bestand van de adresgegevens uit de 3 regio’s ter beschikking als open data. Dit project kwam tot stand dankzij een intense samenwerking tussen de verschillende regionale en federale overheidsdiensten. Deze XML-bestanden bevatten de officiële adressen (straatnamen + huisnummers en postcodes) met hun bijhorende geografische coördinaten, en mogen door burgers, bedrijven en andere geïnteresseerden gratis hergebruikt worden mits bronvermelding."@nl . + "SPF BOSA DG Transformation digitale met à disposition sous forme de données ouvertes un fichier consolidé des données d'adresses des 3 Régions. Ce projet est le fruit d'une intense collaboration entre les différents services publics régionaux et fédéraux. Ces fichiers XML contiennent les adresses officielles (noms de rues + numéros de rues et codes postaux) avec leurs coordonnées géographiques correspondantes, et peuvent être réutilisés gratuitement par les citoyens, les entreprises et autres parties intéressées, à condition que la source soit mentionnée."@fr . + "BeSt adressen"@nl . + "Adresses BeSt"@fr . + "c646365c4441f53426a72e2f1b14b9d6e63e0756" . + . + . + . + . + . + . + . + . + . + . + . + . + . + "ZIP bestand"@nl . + "text/xml" . + . + . + . + . + . + "Fichier ZIP"@fr . + "text/xml" . + . + . + . + . + "FPS BOSA"@en . + "FOD BOSA"@nl . + "SPF BOSA"@fr . + . + "Open Data FPS BOSA DG DT"@en . + "Open Data FOD BOSA DG DT"@nl . + "Open Data SPF BOSA DG DT"@fr . + . + . \ No newline at end of file diff --git a/core/rio/hdt/src/test/resources/test-pos.hdt b/core/rio/hdt/src/test/resources/test-pos.hdt new file mode 100644 index 00000000000..29868ec0847 Binary files /dev/null and b/core/rio/hdt/src/test/resources/test-pos.hdt differ diff --git a/core/rio/hdt/src/test/resources/test-pos.hdt.index b/core/rio/hdt/src/test/resources/test-pos.hdt.index new file mode 100644 index 00000000000..130bca6fa7f Binary files /dev/null and b/core/rio/hdt/src/test/resources/test-pos.hdt.index differ diff --git a/core/rio/hdt/src/test/resources/test.hdt b/core/rio/hdt/src/test/resources/test.hdt new file mode 100644 index 00000000000..753612b1ad8 Binary files /dev/null and b/core/rio/hdt/src/test/resources/test.hdt differ diff --git a/core/rio/hdt/src/test/resources/test.hdt.index b/core/rio/hdt/src/test/resources/test.hdt.index new file mode 100644 index 00000000000..e36b6fe467b Binary files /dev/null and b/core/rio/hdt/src/test/resources/test.hdt.index differ diff --git a/core/rio/jsonld/pom.xml b/core/rio/jsonld/pom.xml index 3a7ef0dbcff..0144c428acb 100644 --- a/core/rio/jsonld/pom.xml +++ b/core/rio/jsonld/pom.xml @@ -4,7 +4,7 @@ org.eclipse.rdf4j rdf4j-rio - 3.1.5-SNAPSHOT + 3.2.2-SNAPSHOT rdf4j-rio-jsonld RDF4J: Rio - JSON-LD diff --git a/core/rio/jsonld/src/main/java/org/eclipse/rdf4j/rio/jsonld/JSONLDHierarchicalProcessor.java b/core/rio/jsonld/src/main/java/org/eclipse/rdf4j/rio/jsonld/JSONLDHierarchicalProcessor.java index 62a6bcd06c1..539cf06ab5e 100644 --- a/core/rio/jsonld/src/main/java/org/eclipse/rdf4j/rio/jsonld/JSONLDHierarchicalProcessor.java +++ b/core/rio/jsonld/src/main/java/org/eclipse/rdf4j/rio/jsonld/JSONLDHierarchicalProcessor.java @@ -7,7 +7,13 @@ *******************************************************************************/ package org.eclipse.rdf4j.rio.jsonld; -import java.util.*; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.LinkedHashMap; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; +import java.util.Set; import java.util.stream.Collectors; /** @@ -22,7 +28,7 @@ public class JSONLDHierarchicalProcessor { /** * Converts a JSON-LD object to a hierarchical JSON-LD object - * + * * @param jsonLdObject JSON-LD object to be converted. Gets modified during processing * @return hierarchical JSON-LD object */ diff --git a/core/rio/jsonld/src/main/java/org/eclipse/rdf4j/rio/jsonld/JSONLDParser.java b/core/rio/jsonld/src/main/java/org/eclipse/rdf4j/rio/jsonld/JSONLDParser.java index b2f0aa87b8d..0d4d4ec0384 100644 --- a/core/rio/jsonld/src/main/java/org/eclipse/rdf4j/rio/jsonld/JSONLDParser.java +++ b/core/rio/jsonld/src/main/java/org/eclipse/rdf4j/rio/jsonld/JSONLDParser.java @@ -36,7 +36,7 @@ /** * An {@link RDFParser} that links to {@link JSONLDInternalTripleCallback}. - * + * * @author Peter Ansell */ public class JSONLDParser extends AbstractRDFParser implements RDFParser { @@ -52,7 +52,7 @@ public JSONLDParser() { /** * Creates a Sesame JSONLD Parser using the given {@link ValueFactory} to create new {@link Value}s. - * + * * @param valueFactory The ValueFactory to use */ public JSONLDParser(final ValueFactory valueFactory) { @@ -99,7 +99,7 @@ public void parse(final Reader reader, final String baseURI) /** * Parse - * + * * @param nextParser * @param baseURI * @throws IOException @@ -144,7 +144,7 @@ valueFactory, getParserConfig(), getParseErrorListener(), nodeID -> createNode(n /** * Get an instance of JsonFactory configured using the settings from {@link #getParserConfig()}. - * + * * @return A newly configured JsonFactory based on the currently enabled settings */ private JsonFactory configureNewJsonFactory() { diff --git a/core/rio/jsonld/src/main/java/org/eclipse/rdf4j/rio/jsonld/JSONLDParserFactory.java b/core/rio/jsonld/src/main/java/org/eclipse/rdf4j/rio/jsonld/JSONLDParserFactory.java index a6f7d8556d4..f9d631d23b0 100644 --- a/core/rio/jsonld/src/main/java/org/eclipse/rdf4j/rio/jsonld/JSONLDParserFactory.java +++ b/core/rio/jsonld/src/main/java/org/eclipse/rdf4j/rio/jsonld/JSONLDParserFactory.java @@ -13,7 +13,7 @@ /** * An {@link RDFParserFactory} that creates instances of {@link JSONLDParser}. - * + * * @author Peter Ansell */ public class JSONLDParserFactory implements RDFParserFactory { diff --git a/core/rio/jsonld/src/main/java/org/eclipse/rdf4j/rio/jsonld/JSONLDWriter.java b/core/rio/jsonld/src/main/java/org/eclipse/rdf4j/rio/jsonld/JSONLDWriter.java index a819c536bf9..c2612f91a34 100644 --- a/core/rio/jsonld/src/main/java/org/eclipse/rdf4j/rio/jsonld/JSONLDWriter.java +++ b/core/rio/jsonld/src/main/java/org/eclipse/rdf4j/rio/jsonld/JSONLDWriter.java @@ -42,7 +42,7 @@ /** * An RDFWriter that links to {@link JSONLDInternalRDFParser}. - * + * * @author Peter Ansell */ public class JSONLDWriter extends AbstractRDFWriter implements RDFWriter { @@ -65,13 +65,15 @@ public JSONLDWriter(OutputStream outputStream) { } /** - * Create a SesameJSONLDWriter using a {@link java.io.OutputStream} + * Create a JSONLDWriter using a {@link java.io.OutputStream} * * @param outputStream The OutputStream to write to. * @param baseURI base URI */ public JSONLDWriter(OutputStream outputStream, String baseURI) { - this(new BufferedWriter(new OutputStreamWriter(outputStream, StandardCharsets.UTF_8)), baseURI); + super(outputStream); + this.baseURI = baseURI; + this.writer = new BufferedWriter(new OutputStreamWriter(outputStream, StandardCharsets.UTF_8)); } /** @@ -96,17 +98,20 @@ public JSONLDWriter(Writer writer, String baseURI) { @Override public void handleNamespace(String prefix, String uri) throws RDFHandlerException { + checkWritingStarted(); model.setNamespace(prefix, uri); } @Override public void startRDF() throws RDFHandlerException { + super.startRDF(); statementCollector.clear(); model.clear(); } @Override public void endRDF() throws RDFHandlerException { + checkWritingStarted(); final JSONLDInternalRDFParser serialiser = new JSONLDInternalRDFParser(); try { Object output = JsonLdProcessor.fromRDF(model, serialiser); @@ -158,12 +163,13 @@ public void endRDF() throws RDFHandlerException { } @Override - public void handleStatement(Statement st) throws RDFHandlerException { + public void consumeStatement(Statement st) throws RDFHandlerException { statementCollector.handleStatement(st); } @Override public void handleComment(String comment) throws RDFHandlerException { + checkWritingStarted(); } @Override @@ -187,7 +193,7 @@ public Collection> getSupportedSettings() { /** * Add name space prefixes to JSON-LD context, empty prefix gets the '@vocab' prefix - * + * * @param ctx context * @param namespaces set of RDF name spaces */ diff --git a/core/rio/jsonld/src/main/java/org/eclipse/rdf4j/rio/jsonld/JSONLDWriterFactory.java b/core/rio/jsonld/src/main/java/org/eclipse/rdf4j/rio/jsonld/JSONLDWriterFactory.java index 09bdf574498..ca3165f9c98 100644 --- a/core/rio/jsonld/src/main/java/org/eclipse/rdf4j/rio/jsonld/JSONLDWriterFactory.java +++ b/core/rio/jsonld/src/main/java/org/eclipse/rdf4j/rio/jsonld/JSONLDWriterFactory.java @@ -16,7 +16,7 @@ /** * An {@link RDFWriterFactory} that creates instances of {@link JSONLDWriter}. - * + * * @author Peter Ansell */ public class JSONLDWriterFactory implements RDFWriterFactory { diff --git a/core/rio/jsonld/src/test/java/org/eclipse/rdf4j/rio/jsonld/JSONLDHierarchicalWriterTest.java b/core/rio/jsonld/src/test/java/org/eclipse/rdf4j/rio/jsonld/JSONLDHierarchicalWriterTest.java index 1ab05b09aef..2b2a8a1d2ab 100644 --- a/core/rio/jsonld/src/test/java/org/eclipse/rdf4j/rio/jsonld/JSONLDHierarchicalWriterTest.java +++ b/core/rio/jsonld/src/test/java/org/eclipse/rdf4j/rio/jsonld/JSONLDHierarchicalWriterTest.java @@ -265,7 +265,7 @@ public void testTreeModeSetting() throws IOException { /** * Verify output hierarchy does not duplicate nodes B and C. - * + * * @throws IOException * @see https://github.com/eclipse/rdf4j/issues/1283 */ @@ -353,8 +353,9 @@ public ComparingOutputStream(InputStream is) { @Override public void write(int b) throws IOException { if (Arrays.binarySearch(toIgnore, b) < 0) { - while (Arrays.binarySearch(toIgnore, charInFile = is.read()) >= 0) + while (Arrays.binarySearch(toIgnore, charInFile = is.read()) >= 0) { ; + } assertEquals("Files are equal", charInFile, b); } } diff --git a/core/rio/jsonld/src/test/java/org/eclipse/rdf4j/rio/jsonld/JSONLDParserCustomTest.java b/core/rio/jsonld/src/test/java/org/eclipse/rdf4j/rio/jsonld/JSONLDParserCustomTest.java index d4a0002296e..9c23f23d54f 100644 --- a/core/rio/jsonld/src/test/java/org/eclipse/rdf4j/rio/jsonld/JSONLDParserCustomTest.java +++ b/core/rio/jsonld/src/test/java/org/eclipse/rdf4j/rio/jsonld/JSONLDParserCustomTest.java @@ -7,7 +7,11 @@ *******************************************************************************/ package org.eclipse.rdf4j.rio.jsonld; -import static org.junit.Assert.*; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; import java.io.Reader; import java.io.StringReader; @@ -39,7 +43,7 @@ /** * Custom (non-manifest) tests for JSON-LD parser. - * + * * @author Peter Ansell */ public class JSONLDParserCustomTest { diff --git a/core/rio/jsonld/src/test/java/org/eclipse/rdf4j/rio/jsonld/JSONLDParserHandlerTest.java b/core/rio/jsonld/src/test/java/org/eclipse/rdf4j/rio/jsonld/JSONLDParserHandlerTest.java index 991654c1663..798ca4c2aa7 100644 --- a/core/rio/jsonld/src/test/java/org/eclipse/rdf4j/rio/jsonld/JSONLDParserHandlerTest.java +++ b/core/rio/jsonld/src/test/java/org/eclipse/rdf4j/rio/jsonld/JSONLDParserHandlerTest.java @@ -7,47 +7,22 @@ *******************************************************************************/ package org.eclipse.rdf4j.rio.jsonld; -import java.io.ByteArrayInputStream; import java.io.FileInputStream; import java.io.InputStream; -import java.io.StringWriter; -import java.nio.charset.StandardCharsets; +import java.io.OutputStream; import org.eclipse.rdf4j.model.Model; -import org.eclipse.rdf4j.model.Namespace; -import org.eclipse.rdf4j.model.Statement; import org.eclipse.rdf4j.rio.AbstractParserHandlingTest; -import org.eclipse.rdf4j.rio.RDFHandlerException; import org.eclipse.rdf4j.rio.RDFParser; import org.eclipse.rdf4j.rio.RDFWriter; /** * Unit tests for {@link JSONLDParser} related to handling of datatypes and languages. - * + * * @author Peter Ansell */ public class JSONLDParserHandlerTest extends AbstractParserHandlingTest { - @Override - protected InputStream getUnknownDatatypeStream(Model unknownDatatypeStatements) throws Exception { - return writeJSONLD(unknownDatatypeStatements); - } - - @Override - protected InputStream getKnownDatatypeStream(Model knownDatatypeStatements) throws Exception { - return writeJSONLD(knownDatatypeStatements); - } - - @Override - protected InputStream getUnknownLanguageStream(Model unknownLanguageStatements) throws Exception { - return writeJSONLD(unknownLanguageStatements); - } - - @Override - protected InputStream getKnownLanguageStream(Model knownLanguageStatements) throws Exception { - return writeJSONLD(knownLanguageStatements); - } - @Override protected InputStream getRDFLangStringWithNoLanguageStream(Model model) throws Exception { InputStream RDFLangStringWithNoLanguageStatements = new FileInputStream( @@ -60,29 +35,8 @@ protected RDFParser getParser() { return new JSONLDParser(); } - /** - * Helper method to write the given model to JSON-LD and return an InputStream containing the results. - * - * @param statements - * @return An {@link InputStream} containing the results. - * @throws RDFHandlerException - */ - private InputStream writeJSONLD(Model statements) throws RDFHandlerException { - final StringWriter writer = new StringWriter(); - - final RDFWriter jsonldWriter = new JSONLDWriter(writer); - jsonldWriter.startRDF(); - for (final Namespace prefix : statements.getNamespaces()) { - jsonldWriter.handleNamespace(prefix.getPrefix(), prefix.getName()); - } - for (final Statement nextStatement : statements) { - jsonldWriter.handleStatement(nextStatement); - } - jsonldWriter.endRDF(); - - // System.out.println(writer.toString()); - - return new ByteArrayInputStream(writer.toString().getBytes(StandardCharsets.UTF_8)); + @Override + protected RDFWriter createWriter(OutputStream output) { + return new JSONLDWriter(output); } - } diff --git a/core/rio/jsonld/src/test/java/org/eclipse/rdf4j/rio/jsonld/JSONLDWriterBackgroundTest.java b/core/rio/jsonld/src/test/java/org/eclipse/rdf4j/rio/jsonld/JSONLDWriterBackgroundTest.java index db22ac420c4..c95af9611f8 100644 --- a/core/rio/jsonld/src/test/java/org/eclipse/rdf4j/rio/jsonld/JSONLDWriterBackgroundTest.java +++ b/core/rio/jsonld/src/test/java/org/eclipse/rdf4j/rio/jsonld/JSONLDWriterBackgroundTest.java @@ -83,8 +83,8 @@ public void testRoundTripNamespaces() throws Exception { ByteArrayOutputStream out = new ByteArrayOutputStream(); RDFWriter rdfWriter = rdfWriterFactory.getWriter(out); rdfWriter.getWriterConfig().set(JSONLDSettings.JSONLD_MODE, JSONLDMode.COMPACT); - rdfWriter.handleNamespace("ex", exNs); rdfWriter.startRDF(); + rdfWriter.handleNamespace("ex", exNs); rdfWriter.handleStatement(st1); rdfWriter.endRDF(); diff --git a/core/rio/jsonld/src/test/java/org/eclipse/rdf4j/rio/jsonld/JSONLDWriterTest.java b/core/rio/jsonld/src/test/java/org/eclipse/rdf4j/rio/jsonld/JSONLDWriterTest.java index d1f4c45cf19..b6c35cdf5c8 100644 --- a/core/rio/jsonld/src/test/java/org/eclipse/rdf4j/rio/jsonld/JSONLDWriterTest.java +++ b/core/rio/jsonld/src/test/java/org/eclipse/rdf4j/rio/jsonld/JSONLDWriterTest.java @@ -74,9 +74,9 @@ public void testEmptyNamespace() throws Exception { RDFWriter rdfWriter = rdfWriterFactory.getWriter(w); rdfWriter.getWriterConfig().set(JSONLDSettings.JSONLD_MODE, JSONLDMode.COMPACT); + rdfWriter.startRDF(); rdfWriter.handleNamespace("", exNs); rdfWriter.handleNamespace(DCTERMS.PREFIX, DCTERMS.NAMESPACE); - rdfWriter.startRDF(); rdfWriter.handleStatement(vf.createStatement(uri1, DCTERMS.TITLE, vf.createBNode())); rdfWriter.handleStatement(vf.createStatement(uri1, uri2, vf.createBNode())); rdfWriter.endRDF(); @@ -95,8 +95,8 @@ public void testRoundTripNamespaces() throws Exception { ByteArrayOutputStream out = new ByteArrayOutputStream(); RDFWriter rdfWriter = rdfWriterFactory.getWriter(out); rdfWriter.getWriterConfig().set(JSONLDSettings.JSONLD_MODE, JSONLDMode.COMPACT); - rdfWriter.handleNamespace("ex", exNs); rdfWriter.startRDF(); + rdfWriter.handleNamespace("ex", exNs); rdfWriter.handleStatement(st1); rdfWriter.endRDF(); diff --git a/core/rio/languages/pom.xml b/core/rio/languages/pom.xml index c3a728f2dbb..05878a52573 100644 --- a/core/rio/languages/pom.xml +++ b/core/rio/languages/pom.xml @@ -4,7 +4,7 @@ org.eclipse.rdf4j rdf4j-rio - 3.1.5-SNAPSHOT + 3.2.2-SNAPSHOT rdf4j-rio-languages RDF4J: Rio - Languages diff --git a/core/rio/languages/src/main/java/org/eclipse/rdf4j/rio/languages/BCP47LanguageHandler.java b/core/rio/languages/src/main/java/org/eclipse/rdf4j/rio/languages/BCP47LanguageHandler.java index 615cac8b1f8..86dbc2f04f3 100644 --- a/core/rio/languages/src/main/java/org/eclipse/rdf4j/rio/languages/BCP47LanguageHandler.java +++ b/core/rio/languages/src/main/java/org/eclipse/rdf4j/rio/languages/BCP47LanguageHandler.java @@ -21,7 +21,7 @@ *

    * This language handler normalises language tags to lower-case if * {@link #normalizeLanguage(String, String, ValueFactory)} is used. - * + * * @see BCP47 * @author Peter Ansell */ diff --git a/core/rio/languages/src/main/java/org/eclipse/rdf4j/rio/languages/RFC3066LanguageHandler.java b/core/rio/languages/src/main/java/org/eclipse/rdf4j/rio/languages/RFC3066LanguageHandler.java index be3c70d354d..61f41edb340 100644 --- a/core/rio/languages/src/main/java/org/eclipse/rdf4j/rio/languages/RFC3066LanguageHandler.java +++ b/core/rio/languages/src/main/java/org/eclipse/rdf4j/rio/languages/RFC3066LanguageHandler.java @@ -20,7 +20,7 @@ *

    * This language handler normalises language tags to lower-case if * {@link #normalizeLanguage(String, String, ValueFactory)} is used. - * + * * @see RFC 3066 * @author Peter Ansell */ diff --git a/core/rio/n3/pom.xml b/core/rio/n3/pom.xml index 2fa857f0ac7..46029ee1bf6 100644 --- a/core/rio/n3/pom.xml +++ b/core/rio/n3/pom.xml @@ -4,7 +4,7 @@ org.eclipse.rdf4j rdf4j-rio - 3.1.5-SNAPSHOT + 3.2.2-SNAPSHOT rdf4j-rio-n3 RDF4J: Rio - N3 (writer-only) diff --git a/core/rio/n3/src/main/java/org/eclipse/rdf4j/rio/n3/N3ParserFactory.java b/core/rio/n3/src/main/java/org/eclipse/rdf4j/rio/n3/N3ParserFactory.java index 2ff66343116..feda1c80c45 100644 --- a/core/rio/n3/src/main/java/org/eclipse/rdf4j/rio/n3/N3ParserFactory.java +++ b/core/rio/n3/src/main/java/org/eclipse/rdf4j/rio/n3/N3ParserFactory.java @@ -14,7 +14,7 @@ /** * An {@link RDFParserFactory} for N3 parsers. - * + * * @author Arjohn Kampman */ public class N3ParserFactory implements RDFParserFactory { diff --git a/core/rio/n3/src/main/java/org/eclipse/rdf4j/rio/n3/N3Writer.java b/core/rio/n3/src/main/java/org/eclipse/rdf4j/rio/n3/N3Writer.java index cd6da66fad2..ecd3c50c743 100644 --- a/core/rio/n3/src/main/java/org/eclipse/rdf4j/rio/n3/N3Writer.java +++ b/core/rio/n3/src/main/java/org/eclipse/rdf4j/rio/n3/N3Writer.java @@ -9,20 +9,24 @@ import java.io.OutputStream; import java.io.Writer; +import java.util.Collection; +import java.util.Collections; +import java.util.Optional; import org.eclipse.rdf4j.common.net.ParsedIRI; import org.eclipse.rdf4j.model.Statement; import org.eclipse.rdf4j.rio.RDFFormat; import org.eclipse.rdf4j.rio.RDFHandlerException; import org.eclipse.rdf4j.rio.RDFWriter; -import org.eclipse.rdf4j.rio.helpers.AbstractRDFWriter; +import org.eclipse.rdf4j.rio.RioSetting; +import org.eclipse.rdf4j.rio.WriterConfig; import org.eclipse.rdf4j.rio.turtle.TurtleWriter; /** * An implementation of the RDFWriter interface that writes RDF documents in N3 format. Note: the current implementation * simply wraps a {@link TurtleWriter} and writes documents in Turtle format, which is a subset of N3. */ -public class N3Writer extends AbstractRDFWriter implements RDFWriter { +public class N3Writer implements RDFWriter { /*-----------* * Variables * @@ -30,13 +34,18 @@ public class N3Writer extends AbstractRDFWriter implements RDFWriter { private TurtleWriter ttlWriter; + /** + * A collection of configuration options for this writer. + */ + private WriterConfig writerConfig = new WriterConfig(); + /*--------------* * Constructors * *--------------*/ /** * Creates a new N3Writer that will write to the supplied OutputStream. - * + * * @param out The OutputStream to write the N3 document to. */ public N3Writer(OutputStream out) { @@ -55,7 +64,7 @@ public N3Writer(OutputStream out, ParsedIRI baseIRI) { /** * Creates a new N3Writer that will write to the supplied Writer. - * + * * @param writer The Writer to write the N3 document to. */ public N3Writer(Writer writer) { @@ -81,6 +90,28 @@ public RDFFormat getRDFFormat() { return RDFFormat.N3; } + @Override + public RDFWriter setWriterConfig(WriterConfig config) { + this.writerConfig = config; + return this; + } + + @Override + public WriterConfig getWriterConfig() { + return writerConfig; + } + + @Override + public Collection> getSupportedSettings() { + return Collections.emptyList(); + } + + @Override + public RDFWriter set(RioSetting setting, T value) { + getWriterConfig().set(setting, value); + return this; + } + @Override public void startRDF() throws RDFHandlerException { ttlWriter.startRDF(); @@ -105,4 +136,9 @@ public void handleStatement(Statement st) throws RDFHandlerException { public void handleComment(String comment) throws RDFHandlerException { ttlWriter.handleComment(comment); } + + @Override + public Optional getOutputStream() { + return ttlWriter.getOutputStream(); + } } diff --git a/core/rio/n3/src/main/java/org/eclipse/rdf4j/rio/n3/N3WriterFactory.java b/core/rio/n3/src/main/java/org/eclipse/rdf4j/rio/n3/N3WriterFactory.java index 30bfbecf93b..a179dd55e94 100644 --- a/core/rio/n3/src/main/java/org/eclipse/rdf4j/rio/n3/N3WriterFactory.java +++ b/core/rio/n3/src/main/java/org/eclipse/rdf4j/rio/n3/N3WriterFactory.java @@ -18,7 +18,7 @@ /** * An {@link RDFWriterFactory} for N3 writers. - * + * * @author Arjohn Kampman */ public class N3WriterFactory implements RDFWriterFactory { diff --git a/core/rio/nquads/pom.xml b/core/rio/nquads/pom.xml index 724e98c8b56..8285293a586 100644 --- a/core/rio/nquads/pom.xml +++ b/core/rio/nquads/pom.xml @@ -4,7 +4,7 @@ org.eclipse.rdf4j rdf4j-rio - 3.1.5-SNAPSHOT + 3.2.2-SNAPSHOT rdf4j-rio-nquads RDF4J: Rio - N-Quads diff --git a/core/rio/nquads/src/main/java/org/eclipse/rdf4j/rio/nquads/NQuadsParser.java b/core/rio/nquads/src/main/java/org/eclipse/rdf4j/rio/nquads/NQuadsParser.java index 8db54726ca2..2f37d0fff31 100644 --- a/core/rio/nquads/src/main/java/org/eclipse/rdf4j/rio/nquads/NQuadsParser.java +++ b/core/rio/nquads/src/main/java/org/eclipse/rdf4j/rio/nquads/NQuadsParser.java @@ -28,7 +28,7 @@ * RDF parser implementation for the {@link RDFFormat#NQUADS N-Quads} RDF format, extending the Rio N-Triples parser. A * specification of N-Quads can be found here. This parser is not * thread-safe, therefore its public methods are synchronized. - * + * * @author Joshua Shinavier */ public class NQuadsParser extends NTriplesParser { diff --git a/core/rio/nquads/src/main/java/org/eclipse/rdf4j/rio/nquads/NQuadsParserFactory.java b/core/rio/nquads/src/main/java/org/eclipse/rdf4j/rio/nquads/NQuadsParserFactory.java index 439f3322f6c..d56a416b4c4 100644 --- a/core/rio/nquads/src/main/java/org/eclipse/rdf4j/rio/nquads/NQuadsParserFactory.java +++ b/core/rio/nquads/src/main/java/org/eclipse/rdf4j/rio/nquads/NQuadsParserFactory.java @@ -13,7 +13,7 @@ /** * An {@link RDFParserFactory} for N-Quads parsers. - * + * * @author Peter Ansell */ public class NQuadsParserFactory implements RDFParserFactory { diff --git a/core/rio/nquads/src/main/java/org/eclipse/rdf4j/rio/nquads/NQuadsWriter.java b/core/rio/nquads/src/main/java/org/eclipse/rdf4j/rio/nquads/NQuadsWriter.java index 7501bf458c8..92ebc04252d 100644 --- a/core/rio/nquads/src/main/java/org/eclipse/rdf4j/rio/nquads/NQuadsWriter.java +++ b/core/rio/nquads/src/main/java/org/eclipse/rdf4j/rio/nquads/NQuadsWriter.java @@ -18,7 +18,7 @@ /** * RDFWriter implementation for the {@link org.eclipse.rdf4j.rio.RDFFormat#NQUADS N-Quads} RDF format. - * + * * @author Joshua Shinavier */ public class NQuadsWriter extends NTriplesWriter { @@ -37,11 +37,7 @@ public RDFFormat getRDFFormat() { } @Override - public void handleStatement(Statement st) throws RDFHandlerException { - if (!writingStarted) { - throw new RuntimeException("Document writing has not yet been started"); - } - + public void consumeStatement(Statement st) throws RDFHandlerException { try { // SUBJECT writeValue(st.getSubject()); diff --git a/core/rio/nquads/src/main/java/org/eclipse/rdf4j/rio/nquads/NQuadsWriterFactory.java b/core/rio/nquads/src/main/java/org/eclipse/rdf4j/rio/nquads/NQuadsWriterFactory.java index 9377388df31..1a830f4aef1 100644 --- a/core/rio/nquads/src/main/java/org/eclipse/rdf4j/rio/nquads/NQuadsWriterFactory.java +++ b/core/rio/nquads/src/main/java/org/eclipse/rdf4j/rio/nquads/NQuadsWriterFactory.java @@ -16,7 +16,7 @@ /** * An {@link RDFWriterFactory} for {@link RDFFormat#NQUADS N-Quads} writers. - * + * * @author Peter Ansell */ public class NQuadsWriterFactory implements RDFWriterFactory { diff --git a/core/rio/nquads/src/test/java/org/eclipse/rdf4j/rio/nquads/NQuadsHandlingTest.java b/core/rio/nquads/src/test/java/org/eclipse/rdf4j/rio/nquads/NQuadsHandlingTest.java index 005e08b4818..4cd14c41f39 100644 --- a/core/rio/nquads/src/test/java/org/eclipse/rdf4j/rio/nquads/NQuadsHandlingTest.java +++ b/core/rio/nquads/src/test/java/org/eclipse/rdf4j/rio/nquads/NQuadsHandlingTest.java @@ -7,46 +7,22 @@ *******************************************************************************/ package org.eclipse.rdf4j.rio.nquads; -import java.io.ByteArrayInputStream; import java.io.FileInputStream; import java.io.InputStream; -import java.io.StringWriter; -import java.nio.charset.StandardCharsets; +import java.io.OutputStream; import org.eclipse.rdf4j.model.Model; -import org.eclipse.rdf4j.model.Statement; import org.eclipse.rdf4j.rio.AbstractParserHandlingTest; -import org.eclipse.rdf4j.rio.RDFHandlerException; import org.eclipse.rdf4j.rio.RDFParser; import org.eclipse.rdf4j.rio.RDFWriter; /** * Test for error handling by N-Quads Parser. - * + * * @author Peter Ansell */ public class NQuadsHandlingTest extends AbstractParserHandlingTest { - @Override - protected InputStream getUnknownDatatypeStream(Model unknownDatatypeStatements) throws Exception { - return writeNQuads(unknownDatatypeStatements); - } - - @Override - protected InputStream getKnownDatatypeStream(Model knownDatatypeStatements) throws Exception { - return writeNQuads(knownDatatypeStatements); - } - - @Override - protected InputStream getUnknownLanguageStream(Model unknownLanguageStatements) throws Exception { - return writeNQuads(unknownLanguageStatements); - } - - @Override - protected InputStream getKnownLanguageStream(Model knownLanguageStatements) throws Exception { - return writeNQuads(knownLanguageStatements); - } - @Override protected InputStream getRDFLangStringWithNoLanguageStream(Model model) throws Exception { InputStream RDFLangStringWithNoLanguageStatements = new FileInputStream( @@ -59,24 +35,8 @@ protected RDFParser getParser() { return new NQuadsParser(); } - /** - * Helper method to write the given model to N-Triples and return an InputStream containing the results. - * - * @param statements - * @return An {@link InputStream} containing the results. - * @throws RDFHandlerException - */ - private InputStream writeNQuads(Model statements) throws RDFHandlerException { - StringWriter writer = new StringWriter(); - - RDFWriter nQuadsWriter = new NQuadsWriter(writer); - nQuadsWriter.startRDF(); - for (Statement nextStatement : statements) { - nQuadsWriter.handleStatement(nextStatement); - } - nQuadsWriter.endRDF(); - - return new ByteArrayInputStream(writer.toString().getBytes(StandardCharsets.UTF_8)); + @Override + protected RDFWriter createWriter(OutputStream output) { + return new NQuadsWriter(output); } - } diff --git a/core/rio/nquads/src/test/java/org/eclipse/rdf4j/rio/nquads/NQuadsParserUnitTest.java b/core/rio/nquads/src/test/java/org/eclipse/rdf4j/rio/nquads/NQuadsParserUnitTest.java index 8da3f2cbd07..e6070cc8fee 100644 --- a/core/rio/nquads/src/test/java/org/eclipse/rdf4j/rio/nquads/NQuadsParserUnitTest.java +++ b/core/rio/nquads/src/test/java/org/eclipse/rdf4j/rio/nquads/NQuadsParserUnitTest.java @@ -11,7 +11,7 @@ /** * JUnit test for the N-Quads parser. - * + * * @author Peter Ansell */ public class NQuadsParserUnitTest extends AbstractNQuadsParserUnitTest { diff --git a/core/rio/ntriples/pom.xml b/core/rio/ntriples/pom.xml index c0d5d461489..5b990516fe7 100644 --- a/core/rio/ntriples/pom.xml +++ b/core/rio/ntriples/pom.xml @@ -4,7 +4,7 @@ org.eclipse.rdf4j rdf4j-rio - 3.1.5-SNAPSHOT + 3.2.2-SNAPSHOT rdf4j-rio-ntriples RDF4J: Rio - N-Triples diff --git a/core/rio/ntriples/src/main/java/org/eclipse/rdf4j/rio/ntriples/NTriplesParser.java b/core/rio/ntriples/src/main/java/org/eclipse/rdf4j/rio/ntriples/NTriplesParser.java index 8f3cbcb8194..7b64becb139 100644 --- a/core/rio/ntriples/src/main/java/org/eclipse/rdf4j/rio/ntriples/NTriplesParser.java +++ b/core/rio/ntriples/src/main/java/org/eclipse/rdf4j/rio/ntriples/NTriplesParser.java @@ -33,12 +33,13 @@ import org.eclipse.rdf4j.rio.helpers.AbstractRDFParser; import org.eclipse.rdf4j.rio.helpers.BasicParserSettings; import org.eclipse.rdf4j.rio.helpers.NTriplesParserSettings; +import org.eclipse.rdf4j.rio.helpers.NTriplesUtil; /** * RDF parser for N-Triples files. A specification of NTriples can be found in * this section of the RDF Test Cases document. This parser * is not thread-safe, therefore its public methods are synchronized. - * + * * @author Arjohn Kampman */ public class NTriplesParser extends AbstractRDFParser { @@ -63,7 +64,7 @@ public NTriplesParser() { /** * Creates a new NTriplesParser that will use the supplied ValueFactory to create RDF model objects. - * + * * @param valueFactory A ValueFactory. */ public NTriplesParser(ValueFactory valueFactory) { @@ -81,7 +82,7 @@ public RDFFormat getRDFFormat() { /** * Implementation of the parse(InputStream, String) method defined in the RDFParser interface. - * + * * @param in The InputStream from which to read the data, must not be null. The InputStream is * supposed to contain 7-bit US-ASCII characters, as per the N-Triples specification. * @param baseURI The URI associated with the data in the InputStream, must not be null. @@ -108,7 +109,7 @@ public synchronized void parse(InputStream in, String baseURI) /** * Implementation of the parse(Reader, String) method defined in the RDFParser interface. - * + * * @param reader The Reader from which to read the data, must not be null. * @param baseURI The URI associated with the data in the Reader, must not be null. * @throws IOException If an I/O error occurred while data was read from the InputStream. @@ -537,7 +538,7 @@ protected IRI createURI(String uri) throws RDFParseException { /** * Reads the next Unicode code point. - * + * * @return the next Unicode code point, or -1 if the end of the stream has been reached. * @throws IOException */ @@ -617,7 +618,7 @@ protected void throwEOFException() throws RDFParseException { * Return a buffer of zero length and non-zero capacity. The same buffer is reused for each thing which is parsed. * This reduces the heap churn substantially. However, you have to watch out for side-effects and convert the buffer * to a {@link String} before the buffer is reused. - * + * * @return a buffer of zero length and non-zero capacity. */ private StringBuilder getBuffer() { @@ -631,7 +632,7 @@ private StringBuilder getBuffer() { * Return a buffer for the use of parsing literal language tags. The buffer is of zero length and non-zero capacity. * The same buffer is reused for each tag which is parsed. This reduces the heap churn substantially. However, you * have to watch out for side-effects and convert the buffer to a {@link String} before the buffer is reused. - * + * * @return a buffer of zero length and non-zero capacity, for the use of parsing literal language tags. */ private StringBuilder getLanguageTagBuffer() { @@ -645,7 +646,7 @@ private StringBuilder getLanguageTagBuffer() { * Return a buffer for the use of parsing literal datatype URIs. The buffer is of zero length and non-zero capacity. * The same buffer is reused for each datatype which is parsed. This reduces the heap churn substantially. However, * you have to watch out for side-effects and convert the buffer to a {@link String} before the buffer is reused. - * + * * @return a buffer of zero length and non-zero capacity, for the user of parsing literal datatype URIs. */ private StringBuilder getDatatypeUriBuffer() { diff --git a/core/rio/ntriples/src/main/java/org/eclipse/rdf4j/rio/ntriples/NTriplesParserFactory.java b/core/rio/ntriples/src/main/java/org/eclipse/rdf4j/rio/ntriples/NTriplesParserFactory.java index 7edd42137ac..319a7dcf0a5 100644 --- a/core/rio/ntriples/src/main/java/org/eclipse/rdf4j/rio/ntriples/NTriplesParserFactory.java +++ b/core/rio/ntriples/src/main/java/org/eclipse/rdf4j/rio/ntriples/NTriplesParserFactory.java @@ -13,7 +13,7 @@ /** * An {@link RDFParserFactory} for N-Triples parsers. - * + * * @author Arjohn Kampman */ public class NTriplesParserFactory implements RDFParserFactory { diff --git a/core/rio/ntriples/src/main/java/org/eclipse/rdf4j/rio/ntriples/NTriplesUtil.java b/core/rio/ntriples/src/main/java/org/eclipse/rdf4j/rio/ntriples/NTriplesUtil.java index 7c7e64fd2bb..83de2e82e69 100644 --- a/core/rio/ntriples/src/main/java/org/eclipse/rdf4j/rio/ntriples/NTriplesUtil.java +++ b/core/rio/ntriples/src/main/java/org/eclipse/rdf4j/rio/ntriples/NTriplesUtil.java @@ -7,713 +7,10 @@ *******************************************************************************/ package org.eclipse.rdf4j.rio.ntriples; -import java.io.IOException; - -import org.eclipse.rdf4j.common.text.ASCIIUtil; -import org.eclipse.rdf4j.common.text.StringUtil; -import org.eclipse.rdf4j.model.BNode; -import org.eclipse.rdf4j.model.IRI; -import org.eclipse.rdf4j.model.Literal; -import org.eclipse.rdf4j.model.Resource; -import org.eclipse.rdf4j.model.Value; -import org.eclipse.rdf4j.model.ValueFactory; -import org.eclipse.rdf4j.model.util.Literals; -import org.eclipse.rdf4j.model.vocabulary.XMLSchema; -import org.eclipse.rdf4j.rio.helpers.BasicWriterSettings; -import org.eclipse.rdf4j.rio.helpers.NTriplesWriterSettings; - /** - * Utility methods for N-Triples encoding/decoding. + * @deprecated since 4.0. Use {@link org.eclipse.rdf4j.rio.helpers.NTriplesUtil} instead. Utility methods for N-Triples + * encoding/decoding. */ -public class NTriplesUtil { - - /** - * Parses an N-Triples value, creates an object for it using the supplied ValueFactory and returns this object. - * - * @param nTriplesValue The N-Triples value to parse. - * @param valueFactory The ValueFactory to use for creating the object. - * @return An object representing the parsed value. - * @throws IllegalArgumentException If the supplied value could not be parsed correctly. - */ - public static Value parseValue(String nTriplesValue, ValueFactory valueFactory) throws IllegalArgumentException { - if (nTriplesValue.startsWith("<")) { - return parseURI(nTriplesValue, valueFactory); - } else if (nTriplesValue.startsWith("_:")) { - return parseBNode(nTriplesValue, valueFactory); - } else if (nTriplesValue.startsWith("\"")) { - return parseLiteral(nTriplesValue, valueFactory); - } else { - throw new IllegalArgumentException("Not a legal N-Triples value: " + nTriplesValue); - } - } - - /** - * Parses an N-Triples resource, creates an object for it using the supplied ValueFactory and returns this object. - * - * @param nTriplesResource The N-Triples resource to parse. - * @param valueFactory The ValueFactory to use for creating the object. - * @return An object representing the parsed resource. - * @throws IllegalArgumentException If the supplied resource could not be parsed correctly. - */ - public static Resource parseResource(String nTriplesResource, ValueFactory valueFactory) - throws IllegalArgumentException { - if (nTriplesResource.startsWith("<")) { - return parseURI(nTriplesResource, valueFactory); - } else if (nTriplesResource.startsWith("_:")) { - return parseBNode(nTriplesResource, valueFactory); - } else { - throw new IllegalArgumentException("Not a legal N-Triples resource: " + nTriplesResource); - } - } - - /** - * Parses an N-Triples URI, creates an object for it using the supplied ValueFactory and returns this object. - * - * @param nTriplesURI The N-Triples URI to parse. - * @param valueFactory The ValueFactory to use for creating the object. - * @return An object representing the parsed URI. - * @throws IllegalArgumentException If the supplied URI could not be parsed correctly. - */ - public static IRI parseURI(String nTriplesURI, ValueFactory valueFactory) throws IllegalArgumentException { - if (nTriplesURI.startsWith("<") && nTriplesURI.endsWith(">")) { - String uri = nTriplesURI.substring(1, nTriplesURI.length() - 1); - uri = unescapeString(uri); - return valueFactory.createIRI(uri); - } else { - throw new IllegalArgumentException("Not a legal N-Triples URI: " + nTriplesURI); - } - } - - /** - * Parses an N-Triples bNode, creates an object for it using the supplied ValueFactory and returns this object. - * - * @param nTriplesBNode The N-Triples bNode to parse. - * @param valueFactory The ValueFactory to use for creating the object. - * @return An object representing the parsed bNode. - * @throws IllegalArgumentException If the supplied bNode could not be parsed correctly. - */ - public static BNode parseBNode(String nTriplesBNode, ValueFactory valueFactory) throws IllegalArgumentException { - if (nTriplesBNode.startsWith("_:")) { - return valueFactory.createBNode(nTriplesBNode.substring(2)); - } else { - throw new IllegalArgumentException("Not a legal N-Triples Blank Node: " + nTriplesBNode); - } - } - - /** - * Parses an N-Triples literal, creates an object for it using the supplied ValueFactory and returns this object. - * - * @param nTriplesLiteral The N-Triples literal to parse. - * @param valueFactory The ValueFactory to use for creating the object. - * @return An object representing the parsed literal. - * @throws IllegalArgumentException If the supplied literal could not be parsed correctly. - */ - public static Literal parseLiteral(String nTriplesLiteral, ValueFactory valueFactory) - throws IllegalArgumentException { - if (nTriplesLiteral.startsWith("\"")) { - // Find string separation points - int endLabelIdx = findEndOfLabel(nTriplesLiteral); - - if (endLabelIdx != -1) { - int startLangIdx = nTriplesLiteral.indexOf('@', endLabelIdx); - int startDtIdx = nTriplesLiteral.indexOf("^^", endLabelIdx); - - if (startLangIdx != -1 && startDtIdx != -1) { - throw new IllegalArgumentException("Literals can not have both a language and a datatype"); - } - - // Get label - String label = nTriplesLiteral.substring(1, endLabelIdx); - label = unescapeString(label); - - if (startLangIdx != -1) { - // Get language - String language = nTriplesLiteral.substring(startLangIdx + 1); - return valueFactory.createLiteral(label, language); - } else if (startDtIdx != -1) { - // Get datatype - String datatype = nTriplesLiteral.substring(startDtIdx + 2); - IRI dtURI = parseURI(datatype, valueFactory); - return valueFactory.createLiteral(label, dtURI); - } else { - return valueFactory.createLiteral(label); - } - } - } - - throw new IllegalArgumentException("Not a legal N-Triples literal: " + nTriplesLiteral); - } - - /** - * Finds the end of the label in a literal string. This method takes into account that characters can be escaped - * using backslashes. - * - * @return The index of the double quote ending the label, or -1 if it could not be found. - */ - private static int findEndOfLabel(String nTriplesLiteral) { - // First character of literal is guaranteed to be a double - // quote, start search at second character. - - boolean previousWasBackslash = false; - - for (int i = 1; i < nTriplesLiteral.length(); i++) { - char c = nTriplesLiteral.charAt(i); - - if (c == '"' && !previousWasBackslash) { - return i; - } else if (c == '\\' && !previousWasBackslash) { - // start of escape - previousWasBackslash = true; - } else if (previousWasBackslash) { - // c was escaped - previousWasBackslash = false; - } - } - - return -1; - } - - /** - * Creates an N-Triples string for the supplied value. - * - * @param value - * @return string - */ - public static String toNTriplesString(Value value) { - // default to false. Users must call new method directly to remove - // xsd:string - return toNTriplesString(value, BasicWriterSettings.XSD_STRING_TO_PLAIN_LITERAL.getDefaultValue()); - } - - /** - * Creates an N-Triples string for the supplied value.If the supplied value is a {@link Literal}, it optionally - * ignores the xsd:string datatype, since this datatype is implicit in RDF-1.1. - * - * @param value The value to write. - * @param xsdStringToPlainLiteral True to omit serialising the xsd:string datatype and false to always serialise the - * datatype for literals. - * @return string - */ - public static String toNTriplesString(Value value, boolean xsdStringToPlainLiteral) { - if (value instanceof Resource) { - return toNTriplesString((Resource) value); - } else if (value instanceof Literal) { - return toNTriplesString((Literal) value, xsdStringToPlainLiteral); - } else { - throw new IllegalArgumentException("Unknown value type: " + value.getClass()); - } - } - - /** - * Appends the N-Triples representation of the given {@link Value} to the given {@link Appendable}. - * - * @param value The value to write. - * @param appendable The object to append to. - * @throws IOException - */ - public static void append(Value value, Appendable appendable) throws IOException { - // default to false. Users must call new method directly to remove - // xsd:string - append(value, appendable, BasicWriterSettings.XSD_STRING_TO_PLAIN_LITERAL.getDefaultValue(), - NTriplesWriterSettings.ESCAPE_UNICODE.getDefaultValue()); - } - - /** - * Appends the N-Triples representation of the given {@link Value} to the given {@link Appendable}, optionally not - * serializing the datatype a {@link Literal} with the xsd:string datatype as it is implied for RDF-1.1. - * - * @param value The value to write. - * @param appendable The object to append to. - * @param xsdStringToPlainLiteral True to omit serializing the xsd:string datatype and false to always serialize the - * datatype for literals. - * @param escapeUnicode - * @throws IOException - */ - public static void append(Value value, Appendable appendable, boolean xsdStringToPlainLiteral, - boolean escapeUnicode) throws IOException { - if (value instanceof Resource) { - append((Resource) value, appendable); - } else if (value instanceof Literal) { - append((Literal) value, appendable, xsdStringToPlainLiteral, escapeUnicode); - } else { - throw new IllegalArgumentException("Unknown value type: " + value.getClass()); - } - } - - /** - * Creates an N-Triples string for the supplied resource. - * - * @param resource - * @return string - */ - public static String toNTriplesString(Resource resource) { - if (resource instanceof IRI) { - return toNTriplesString((IRI) resource); - } else if (resource instanceof BNode) { - return toNTriplesString((BNode) resource); - } else { - throw new IllegalArgumentException("Unknown resource type: " + resource.getClass()); - } - } - - /** - * Appends the N-Triples representation of the given {@link Resource} to the given {@link Appendable}. - * - * @param resource The resource to write. - * @param appendable The object to append to. - * @throws IOException - */ - public static void append(Resource resource, Appendable appendable) throws IOException { - if (resource instanceof IRI) { - append((IRI) resource, appendable); - } else if (resource instanceof BNode) { - append((BNode) resource, appendable); - } else { - throw new IllegalArgumentException("Unknown resource type: " + resource.getClass()); - } - } - - /** - * Creates an N-Triples string for the supplied URI. - * - * @param uri - * @return string - */ - public static String toNTriplesString(IRI uri) { - return "<" + escapeString(uri.toString()) + ">"; - } - - /** - * Appends the N-Triples representation of the given {@link IRI} to the given {@link Appendable}. - * - * @param uri The IRI to write. - * @param appendable The object to append to. - * @throws IOException - */ - public static void append(IRI uri, Appendable appendable) throws IOException { - append(uri, appendable, true); - } - - /** - * Appends the N-Triples representation of the given {@link IRI} to the given {@link Appendable}. - * - * @param uri - * @param appendable - * @param escapeUnicode - * @throws java.io.IOException - */ - public static void append(IRI uri, Appendable appendable, boolean escapeUnicode) throws IOException { - appendable.append('<'); - StringUtil.simpleEscapeIRI(uri.toString(), appendable, escapeUnicode); - appendable.append('>'); - } - - /** - * Creates an N-Triples string for the supplied blank node. - * - * @param bNode - * @return string - */ - public static String toNTriplesString(BNode bNode) { - try { - StringBuilder result = new StringBuilder(bNode.getID().length() + 1); - append(bNode, result); - return result.toString(); - } catch (IOException e) { - throw new RuntimeException("Should not receive IOException with StringBuilder", e); - } - } - - /** - * Appends the N-Triples representation of the given {@link BNode} to the given {@link Appendable}. - * - * @param bNode - * @param appendable - * @throws IOException - */ - public static void append(BNode bNode, Appendable appendable) throws IOException { - String nextId = bNode.getID(); - appendable.append("_:"); - - if (nextId.isEmpty()) { - appendable.append("genid"); - appendable.append(Integer.toHexString(bNode.hashCode())); - } else { - if (!ASCIIUtil.isLetter(nextId.charAt(0))) { - appendable.append("genid"); - appendable.append(Integer.toHexString(nextId.charAt(0))); - } - - for (int i = 0; i < nextId.length(); i++) { - if (ASCIIUtil.isLetterOrNumber(nextId.charAt(i))) { - appendable.append(nextId.charAt(i)); - } else { - // Append the character as its hex representation - appendable.append(Integer.toHexString(nextId.charAt(i))); - } - } - } - } - - /** - * Creates an N-Triples string for the supplied literal. - * - * @param lit - * @return string - */ - public static String toNTriplesString(Literal lit) { - // default to false. Users must call new method directly to remove - // xsd:string - return toNTriplesString(lit, BasicWriterSettings.XSD_STRING_TO_PLAIN_LITERAL.getDefaultValue()); - } - - /** - * Creates an N-Triples string for the supplied literal, optionally ignoring the xsd:string datatype as it is - * implied for RDF-1.1. - * - * @param lit The literal to write. - * @param xsdStringToPlainLiteral True to omit serializing the xsd:string datatype and false to always serialize the - * datatype for literals. - * @return String - */ - public static String toNTriplesString(Literal lit, boolean xsdStringToPlainLiteral) { - try { - StringBuilder sb = new StringBuilder(); - append(lit, sb, xsdStringToPlainLiteral, NTriplesWriterSettings.ESCAPE_UNICODE.getDefaultValue()); - return sb.toString(); - } catch (IOException e) { - throw new AssertionError(); - } - } - - /** - * Appends the N-Triples representation of the given {@link Literal} to the given {@link Appendable}. - * - * @param lit - * @param appendable - * @throws IOException - */ - public static void append(Literal lit, Appendable appendable) throws IOException { - // default to false. Users must call new method directly to remove - // xsd:string - append(lit, appendable, BasicWriterSettings.XSD_STRING_TO_PLAIN_LITERAL.getDefaultValue(), - NTriplesWriterSettings.ESCAPE_UNICODE.getDefaultValue()); - } - - /** - * Appends the N-Triples representation of the given {@link Literal} to the given {@link Appendable}, optionally - * ignoring the xsd:string datatype as it is implied for RDF-1.1. - * - * @param lit The literal to write. - * @param appendable The object to append to. - * @param xsdStringToPlainLiteral True to omit serializing the xsd:string datatype and false to always serialize the - * datatype for literals. - * @param escapeUnicode True to escape non-ascii/non-printable characters using Unicode escapes - * (\uxxxx and \Uxxxxxxxx), false to print without - * escaping. - * @throws IOException - */ - public static void append(Literal lit, Appendable appendable, boolean xsdStringToPlainLiteral, - boolean escapeUnicode) throws IOException { - // Do some character escaping on the label: - appendable.append("\""); - escapeString(lit.getLabel(), appendable, escapeUnicode); - appendable.append("\""); - - if (Literals.isLanguageLiteral(lit)) { - // Append the literal's language - appendable.append("@"); - appendable.append(lit.getLanguage().get()); - } else { - // SES-1917 : In RDF-1.1, all literals have a type, and if they are not - // language literals we display the type for backwards compatibility - // Append the literal's datatype - IRI datatype = lit.getDatatype(); - boolean ignoreDatatype = datatype.equals(XMLSchema.STRING) && xsdStringToPlainLiteral; - if (!ignoreDatatype) { - appendable.append("^^"); - append(lit.getDatatype(), appendable); - } - } - } - - /** - * Checks whether the supplied character is a letter or number according to the N-Triples specification. - * - * @deprecated use {@link ASCIIUtil#isLetterOrNumber(int)} - * @see #isLetter - * @see #isNumber - * @param c - * @return true if it is a letter or a number - */ - @Deprecated - public static boolean isLetterOrNumber(int c) { - return ASCIIUtil.isLetterOrNumber(c); - } - - /** - * Checks whether the supplied character is a letter according to the N-Triples specification.N-Triples letters are - * A - Z and a - z. - * - * @deprecated use {@link ASCIIUtil#isLetter(int)} - * @param c - * @return - */ - @Deprecated - public static boolean isLetter(int c) { - return ASCIIUtil.isLetter(c); - } - - /** - * Checks whether the supplied character is a number according to the N-Triples specification.N-Triples numbers are - * 0 - 9. - * - * @deprecated use {@link org.eclipse.rdf4j.common.text.ASCIIUtil#isNumber(int)} - * @param c - * @return true if the character is a number - */ - @Deprecated - public static boolean isNumber(int c) { - return ASCIIUtil.isNumber(c); - } - - /** - * Checks whether the supplied character is valid character as per N-Triples specification. - * - * @see https://www.w3.org/TR/n-triples/#BNodes - * @param c - * @return true if valid - */ - public static boolean isValidCharacterForBNodeLabel(int c) { - return ASCIIUtil.isLetterOrNumber(c) || isLiberalCharactersButNotDot(c) || isDot(c); - } - - /** - * Checks whether the supplied character is in list of liberal characters according to the N-Triples specification - * except Dot. - * - * @param c - * @return true if valid - */ - public static boolean isLiberalCharactersButNotDot(int c) { - return isUnderscore(c) || c == 45 || c == 183 || (c >= 768 && c <= 879) || c == 8255 || c == 8256; - } - - /** - * Checks whether the supplied character is Underscore. - * - * @param c - * @return true if it is an underscore - */ - public static boolean isUnderscore(int c) { - return c == 95; - } - - /** - * Checks whether the supplied character is Dot '.'. - * - * @param c - * @return true if it is a dot - */ - public static boolean isDot(int c) { - return c == 46; - } - - /** - * Escapes a Unicode string to an all-ASCII character sequence.Any special characters are escaped using backslashes - * ( " becomes \", etc.), and non-ascii/non-printable characters are escaped using Unicode escapes - * ( \uxxxx and \Uxxxxxxxx). - * - * @param label - * @return - */ - public static String escapeString(String label) { - try { - StringBuilder sb = new StringBuilder(2 * label.length()); - escapeString(label, sb); - return sb.toString(); - } catch (IOException e) { - throw new AssertionError(); - } - } - - /** - * Escapes a Unicode string to an all-ASCII character sequence. Any special characters are escaped using backslashes - * ( " becomes \", etc.), and non-ascii/non-printable characters are escaped using Unicode escapes - * ( \uxxxx and \Uxxxxxxxx). - * - * @param label - * @param appendable - * @throws IOException - */ - public static void escapeString(String label, Appendable appendable) throws IOException { - escapeString(label, appendable, true); - } - - /** - * Escapes a Unicode string to an N-Triples compatible character sequence.Any special characters are escaped using - * backslashes (" becomes \", etc.), and non-ascii/non-printable characters are escaped using - * Unicode escapes (\uxxxx and \Uxxxxxxxx) if the option is selected. - * - * @param label - * @param appendable - * @param escapeUnicode - * @throws IOException - */ - public static void escapeString(String label, Appendable appendable, boolean escapeUnicode) throws IOException { - int labelLength = label.length(); - - for (int i = 0; i < labelLength; i++) { - char c = label.charAt(i); - int cInt = c; - - if (c == '\\') { - appendable.append("\\\\"); - } else if (c == '"') { - appendable.append("\\\""); - } else if (c == '\n') { - appendable.append("\\n"); - } else if (c == '\r') { - appendable.append("\\r"); - } else if (c == '\t') { - appendable.append("\\t"); - } else if (cInt >= 0x0 && cInt <= 0x8 || cInt == 0xB || cInt == 0xC || cInt >= 0xE && cInt <= 0x1F - || cInt >= 0x7F && cInt <= 0xFFFF) { - if (escapeUnicode) { - appendable.append("\\u"); - appendable.append(toHexString(cInt, 4)); - } else { - appendable.append(c); - } - } else if (cInt >= 0x10000 && cInt <= 0x10FFFF) { - if (escapeUnicode) { - appendable.append("\\U"); - appendable.append(toHexString(cInt, 8)); - } else { - appendable.append(c); - } - } else { - appendable.append(c); - } - } - } - - /** - * Unescapes an escaped Unicode string. Any Unicode sequences ( \uxxxx and \Uxxxxxxxx) - * are restored to the value indicated by the hexadecimal argument and any backslash-escapes ( \", - * \\, etc.) are decoded to their original form. - * - * @param s An escaped Unicode string. - * @return The unescaped string. - * @throws IllegalArgumentException If the supplied string is not a correctly escaped N-Triples string. - */ - public static String unescapeString(String s) { - int backSlashIdx = s.indexOf('\\'); - - if (backSlashIdx == -1) { - // No escaped characters found - return s; - } - - int startIdx = 0; - int sLength = s.length(); - StringBuilder sb = new StringBuilder(sLength); - - while (backSlashIdx != -1) { - sb.append(s.substring(startIdx, backSlashIdx)); - - if (backSlashIdx + 1 >= sLength) { - throw new IllegalArgumentException("Unescaped backslash in: " + s); - } - - char c = s.charAt(backSlashIdx + 1); - - if (c == 't') { - sb.append('\t'); - startIdx = backSlashIdx + 2; - } else if (c == 'b') { - sb.append('\b'); - startIdx = backSlashIdx + 2; - } else if (c == 'n') { - sb.append('\n'); - startIdx = backSlashIdx + 2; - } else if (c == 'r') { - sb.append('\r'); - startIdx = backSlashIdx + 2; - } else if (c == 'f') { - sb.append('\f'); - startIdx = backSlashIdx + 2; - } else if (c == '"') { - sb.append('"'); - startIdx = backSlashIdx + 2; - } else if (c == '\'') { - sb.append('\''); - startIdx = backSlashIdx + 2; - } else if (c == '\\') { - sb.append('\\'); - startIdx = backSlashIdx + 2; - } else if (c == 'u') { - // \\uxxxx - if (backSlashIdx + 5 >= sLength) { - throw new IllegalArgumentException("Incomplete Unicode escape sequence in: " + s); - } - String xx = s.substring(backSlashIdx + 2, backSlashIdx + 6); - - try { - final int codePoint = Integer.parseInt(xx, 16); - sb.append(Character.toChars(codePoint)); - - startIdx = backSlashIdx + 6; - } catch (NumberFormatException e) { - throw new IllegalArgumentException("Illegal Unicode escape sequence '\\u" + xx + "' in: " + s); - } - } else if (c == 'U') { - // \\Uxxxxxxxx - if (backSlashIdx + 9 >= sLength) { - throw new IllegalArgumentException("Incomplete Unicode escape sequence in: " + s); - } - String xx = s.substring(backSlashIdx + 2, backSlashIdx + 10); - - try { - final int codePoint = Integer.parseInt(xx, 16); - sb.append(Character.toChars(codePoint)); - - startIdx = backSlashIdx + 10; - } catch (NumberFormatException e) { - throw new IllegalArgumentException("Illegal Unicode escape sequence '\\U" + xx + "' in: " + s); - } - } else { - throw new IllegalArgumentException("Unescaped backslash in: " + s); - } - - backSlashIdx = s.indexOf('\\', startIdx); - } - - sb.append(s.substring(startIdx)); - - return sb.toString(); - } - - /** - * Converts a decimal value to a hexadecimal string representation of the specified length. - * - * @param decimal A decimal value. - * @param stringLength The length of the resulting string. - * @return padded string - */ - public static String toHexString(int decimal, int stringLength) { - StringBuilder sb = new StringBuilder(stringLength); - - String hexVal = Integer.toHexString(decimal).toUpperCase(); - - // insert zeros if hexVal has less than stringLength characters: - int nofZeros = stringLength - hexVal.length(); - for (int i = 0; i < nofZeros; i++) { - sb.append('0'); - } - - sb.append(hexVal); - - return sb.toString(); - } +@Deprecated +public class NTriplesUtil extends org.eclipse.rdf4j.rio.helpers.NTriplesUtil { } diff --git a/core/rio/ntriples/src/main/java/org/eclipse/rdf4j/rio/ntriples/NTriplesWriter.java b/core/rio/ntriples/src/main/java/org/eclipse/rdf4j/rio/ntriples/NTriplesWriter.java index b45cc767085..b0567b995fa 100644 --- a/core/rio/ntriples/src/main/java/org/eclipse/rdf4j/rio/ntriples/NTriplesWriter.java +++ b/core/rio/ntriples/src/main/java/org/eclipse/rdf4j/rio/ntriples/NTriplesWriter.java @@ -28,6 +28,7 @@ import org.eclipse.rdf4j.rio.RioSetting; import org.eclipse.rdf4j.rio.helpers.AbstractRDFWriter; import org.eclipse.rdf4j.rio.helpers.BasicWriterSettings; +import org.eclipse.rdf4j.rio.helpers.NTriplesUtil; import org.eclipse.rdf4j.rio.helpers.NTriplesWriterSettings; /** @@ -37,7 +38,6 @@ public class NTriplesWriter extends AbstractRDFWriter implements RDFWriter { protected final Writer writer; - protected boolean writingStarted; private boolean xsdStringToPlainLiteral = true; private boolean escapeUnicode; @@ -52,7 +52,8 @@ public class NTriplesWriter extends AbstractRDFWriter implements RDFWriter { * @param out The OutputStream to write the N-Triples document to. */ public NTriplesWriter(OutputStream out) { - this(new OutputStreamWriter(out, StandardCharsets.UTF_8)); + super(out); + this.writer = new OutputStreamWriter(out, StandardCharsets.UTF_8); } /** @@ -62,7 +63,6 @@ public NTriplesWriter(OutputStream out) { */ public NTriplesWriter(Writer writer) { this.writer = writer; - writingStarted = false; } /*---------* @@ -76,41 +76,29 @@ public RDFFormat getRDFFormat() { @Override public void startRDF() throws RDFHandlerException { - if (writingStarted) { - throw new RuntimeException("Document writing has already started"); - } - - writingStarted = true; + super.startRDF(); xsdStringToPlainLiteral = getWriterConfig().get(BasicWriterSettings.XSD_STRING_TO_PLAIN_LITERAL); escapeUnicode = getWriterConfig().get(NTriplesWriterSettings.ESCAPE_UNICODE); } @Override public void endRDF() throws RDFHandlerException { - if (!writingStarted) { - throw new RuntimeException("Document writing has not yet started"); - } - + checkWritingStarted(); try { writer.flush(); } catch (IOException e) { throw new RDFHandlerException(e); - } finally { - writingStarted = false; } } @Override public void handleNamespace(String prefix, String name) { + checkWritingStarted(); // N-Triples does not support namespace prefixes. } @Override - public void handleStatement(Statement st) throws RDFHandlerException { - if (!writingStarted) { - throw new RuntimeException("Document writing has not yet been started"); - } - + protected void consumeStatement(Statement st) { try { writeValue(st.getSubject()); writer.write(" "); @@ -126,6 +114,7 @@ public void handleStatement(Statement st) throws RDFHandlerException { @Override public void handleComment(String comment) throws RDFHandlerException { + checkWritingStarted(); try { writer.write("# "); writer.write(comment); diff --git a/core/rio/ntriples/src/main/java/org/eclipse/rdf4j/rio/ntriples/NTriplesWriterFactory.java b/core/rio/ntriples/src/main/java/org/eclipse/rdf4j/rio/ntriples/NTriplesWriterFactory.java index 1533c7bbfc2..55c79b7a446 100644 --- a/core/rio/ntriples/src/main/java/org/eclipse/rdf4j/rio/ntriples/NTriplesWriterFactory.java +++ b/core/rio/ntriples/src/main/java/org/eclipse/rdf4j/rio/ntriples/NTriplesWriterFactory.java @@ -16,7 +16,7 @@ /** * An {@link RDFWriterFactory} for N-Triples writers. - * + * * @author Arjohn Kampman */ public class NTriplesWriterFactory implements RDFWriterFactory { diff --git a/core/rio/ntriples/src/test/java/org/eclipse/rdf4j/rio/ntriples/NTriplesHandlingTest.java b/core/rio/ntriples/src/test/java/org/eclipse/rdf4j/rio/ntriples/NTriplesHandlingTest.java index b3c1c04077c..59237bf87b2 100644 --- a/core/rio/ntriples/src/test/java/org/eclipse/rdf4j/rio/ntriples/NTriplesHandlingTest.java +++ b/core/rio/ntriples/src/test/java/org/eclipse/rdf4j/rio/ntriples/NTriplesHandlingTest.java @@ -7,46 +7,21 @@ *******************************************************************************/ package org.eclipse.rdf4j.rio.ntriples; -import java.io.ByteArrayInputStream; import java.io.FileInputStream; import java.io.InputStream; -import java.io.StringWriter; -import java.nio.charset.StandardCharsets; +import java.io.OutputStream; import org.eclipse.rdf4j.model.Model; -import org.eclipse.rdf4j.model.Statement; import org.eclipse.rdf4j.rio.AbstractParserHandlingTest; -import org.eclipse.rdf4j.rio.RDFHandlerException; import org.eclipse.rdf4j.rio.RDFParser; import org.eclipse.rdf4j.rio.RDFWriter; /** * Test for error handling by N-Triples Parser. - * + * * @author Peter Ansell */ public class NTriplesHandlingTest extends AbstractParserHandlingTest { - - @Override - protected InputStream getUnknownDatatypeStream(Model unknownDatatypeStatements) throws Exception { - return writeNTriples(unknownDatatypeStatements); - } - - @Override - protected InputStream getKnownDatatypeStream(Model knownDatatypeStatements) throws Exception { - return writeNTriples(knownDatatypeStatements); - } - - @Override - protected InputStream getUnknownLanguageStream(Model unknownLanguageStatements) throws Exception { - return writeNTriples(unknownLanguageStatements); - } - - @Override - protected InputStream getKnownLanguageStream(Model knownLanguageStatements) throws Exception { - return writeNTriples(knownLanguageStatements); - } - @Override protected InputStream getRDFLangStringWithNoLanguageStream(Model model) throws Exception { InputStream RDFLangStringWithNoLanguageStatements = new FileInputStream( @@ -59,24 +34,8 @@ protected RDFParser getParser() { return new NTriplesParser(); } - /** - * Helper method to write the given model to N-Triples and return an InputStream containing the results. - * - * @param statements - * @return An {@link InputStream} containing the results. - * @throws RDFHandlerException - */ - private InputStream writeNTriples(Model statements) throws RDFHandlerException { - StringWriter writer = new StringWriter(); - - RDFWriter nTriplesWriter = new NTriplesWriter(writer); - nTriplesWriter.startRDF(); - for (Statement nextStatement : statements) { - nTriplesWriter.handleStatement(nextStatement); - } - nTriplesWriter.endRDF(); - - return new ByteArrayInputStream(writer.toString().getBytes(StandardCharsets.UTF_8)); + @Override + protected RDFWriter createWriter(OutputStream output) { + return new NTriplesWriter(output); } - } diff --git a/core/rio/ntriples/src/test/java/org/eclipse/rdf4j/rio/ntriples/NTriplesParserUnitTest.java b/core/rio/ntriples/src/test/java/org/eclipse/rdf4j/rio/ntriples/NTriplesParserUnitTest.java index bbac5848291..8e617541768 100644 --- a/core/rio/ntriples/src/test/java/org/eclipse/rdf4j/rio/ntriples/NTriplesParserUnitTest.java +++ b/core/rio/ntriples/src/test/java/org/eclipse/rdf4j/rio/ntriples/NTriplesParserUnitTest.java @@ -11,7 +11,7 @@ /** * JUnit test for the N-Triples parser. - * + * * @author Arjohn Kampman */ public class NTriplesParserUnitTest extends AbstractNTriplesParserUnitTest { diff --git a/core/rio/ntriples/src/test/java/org/eclipse/rdf4j/rio/ntriples/NTriplesUtilTest.java b/core/rio/ntriples/src/test/java/org/eclipse/rdf4j/rio/ntriples/NTriplesUtilTest.java deleted file mode 100644 index c2d8ea74e10..00000000000 --- a/core/rio/ntriples/src/test/java/org/eclipse/rdf4j/rio/ntriples/NTriplesUtilTest.java +++ /dev/null @@ -1,47 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2019 Eclipse RDF4J contributors. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Distribution License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/org/documents/edl-v10.php. - *******************************************************************************/ -package org.eclipse.rdf4j.rio.ntriples; - -import static org.assertj.core.api.Assertions.assertThat; - -import org.eclipse.rdf4j.model.Literal; -import org.eclipse.rdf4j.model.ValueFactory; -import org.eclipse.rdf4j.model.impl.SimpleValueFactory; -import org.junit.Before; -import org.junit.Test; - -/** - * Unit tests for {@link NTriplesUtil} - * - * @author Jeen Broekstra - * - */ -public class NTriplesUtilTest { - - private StringBuilder appendable; - private ValueFactory f = SimpleValueFactory.getInstance(); - - @Before - public void setUp() throws Exception { - appendable = new StringBuilder(); - } - - @Test - public void testAppendWithoutEncoding() throws Exception { - Literal l = f.createLiteral("Äbc"); - NTriplesUtil.append(l, appendable, true, false); - assertThat(appendable.toString()).isEqualTo("\"Äbc\""); - } - - @Test - public void testAppendWithEncoding() throws Exception { - Literal l = f.createLiteral("Äbc"); - NTriplesUtil.append(l, appendable, true, true); - assertThat(appendable.toString()).isEqualTo("\"\\u00C4bc\""); - } -} diff --git a/core/rio/ntriples/src/test/java/org/eclipse/rdf4j/rio/ntriples/NTriplesWriterBackgroundTest.java b/core/rio/ntriples/src/test/java/org/eclipse/rdf4j/rio/ntriples/NTriplesWriterBackgroundTest.java index 2e2d386f6ae..7b2e8a71888 100644 --- a/core/rio/ntriples/src/test/java/org/eclipse/rdf4j/rio/ntriples/NTriplesWriterBackgroundTest.java +++ b/core/rio/ntriples/src/test/java/org/eclipse/rdf4j/rio/ntriples/NTriplesWriterBackgroundTest.java @@ -18,7 +18,7 @@ /** * JUnit test for the N-Triples parser/writer combination. - * + * * @author Peter Ansell */ public class NTriplesWriterBackgroundTest extends RDFWriterTest { diff --git a/core/rio/ntriples/src/test/java/org/eclipse/rdf4j/rio/ntriples/NTriplesWriterTest.java b/core/rio/ntriples/src/test/java/org/eclipse/rdf4j/rio/ntriples/NTriplesWriterTest.java index f9862e936c9..2a490206606 100644 --- a/core/rio/ntriples/src/test/java/org/eclipse/rdf4j/rio/ntriples/NTriplesWriterTest.java +++ b/core/rio/ntriples/src/test/java/org/eclipse/rdf4j/rio/ntriples/NTriplesWriterTest.java @@ -11,7 +11,7 @@ /** * JUnit test for the RDF/JSON parser. - * + * * @author Peter Ansell */ public class NTriplesWriterTest extends RDFWriterTest { diff --git a/core/rio/pom.xml b/core/rio/pom.xml index 6a693bb27cd..9822a4a1d7f 100644 --- a/core/rio/pom.xml +++ b/core/rio/pom.xml @@ -1,11 +1,10 @@ - + 4.0.0 org.eclipse.rdf4j rdf4j-core - 3.1.5-SNAPSHOT + 3.2.2-SNAPSHOT rdf4j-rio pom @@ -16,6 +15,7 @@ languages datatypes binary + hdt jsonld n3 nquads diff --git a/core/rio/rdfjson/pom.xml b/core/rio/rdfjson/pom.xml index 000eb80e03c..8aec6c4aea2 100644 --- a/core/rio/rdfjson/pom.xml +++ b/core/rio/rdfjson/pom.xml @@ -4,7 +4,7 @@ org.eclipse.rdf4j rdf4j-rio - 3.1.5-SNAPSHOT + 3.2.2-SNAPSHOT rdf4j-rio-rdfjson RDF4J: Rio - RDF/JSON diff --git a/core/rio/rdfjson/src/main/java/org/eclipse/rdf4j/rio/rdfjson/RDFJSONParser.java b/core/rio/rdfjson/src/main/java/org/eclipse/rdf4j/rio/rdfjson/RDFJSONParser.java index 6a7a9b94049..5374aadbd5e 100644 --- a/core/rio/rdfjson/src/main/java/org/eclipse/rdf4j/rio/rdfjson/RDFJSONParser.java +++ b/core/rio/rdfjson/src/main/java/org/eclipse/rdf4j/rio/rdfjson/RDFJSONParser.java @@ -39,7 +39,7 @@ /** * {@link RDFParser} implementation for the RDF/JSON format - * + * * @author Peter Ansell */ public class RDFJSONParser extends AbstractRDFParser implements RDFParser { @@ -55,7 +55,7 @@ public RDFJSONParser() { /** * Creates a parser using the given RDFFormat to self identify. - * + * * @param actualFormat */ public RDFJSONParser(final RDFFormat actualFormat) { @@ -106,7 +106,7 @@ public void parse(final InputStream inputStream, final String baseUri) * Creates a literal, using the current value, language, and datatype, and additionally using the given * {@link JsonLocation} to provide information about the line and column numbers in the event of a warning, error or * exception being generated by the creation of the literal. - * + * * @param label the literal's lexical label * @param language the literal's language tag. Can be null. * @param datatype the literal's datatype. Can be null. @@ -386,7 +386,7 @@ public Collection> getSupportedSettings() { /** * Get an instance of JsonFactory configured using the settings from {@link #getParserConfig()}. - * + * * @return A newly configured JsonFactory based on the currently enabled settings */ private JsonFactory configureNewJsonFactory() { diff --git a/core/rio/rdfjson/src/main/java/org/eclipse/rdf4j/rio/rdfjson/RDFJSONParserFactory.java b/core/rio/rdfjson/src/main/java/org/eclipse/rdf4j/rio/rdfjson/RDFJSONParserFactory.java index fbf88968e95..613120164bb 100644 --- a/core/rio/rdfjson/src/main/java/org/eclipse/rdf4j/rio/rdfjson/RDFJSONParserFactory.java +++ b/core/rio/rdfjson/src/main/java/org/eclipse/rdf4j/rio/rdfjson/RDFJSONParserFactory.java @@ -13,7 +13,7 @@ /** * An {@link RDFParserFactory} for RDF/JSON parsers. - * + * * @author Peter Ansell */ public class RDFJSONParserFactory implements RDFParserFactory { diff --git a/core/rio/rdfjson/src/main/java/org/eclipse/rdf4j/rio/rdfjson/RDFJSONUtility.java b/core/rio/rdfjson/src/main/java/org/eclipse/rdf4j/rio/rdfjson/RDFJSONUtility.java index de05e32fa9c..d2af1a6b0cf 100644 --- a/core/rio/rdfjson/src/main/java/org/eclipse/rdf4j/rio/rdfjson/RDFJSONUtility.java +++ b/core/rio/rdfjson/src/main/java/org/eclipse/rdf4j/rio/rdfjson/RDFJSONUtility.java @@ -9,7 +9,7 @@ /** * A utility class to help converting Sesame Models to and from RDF/JSON using Jackson. - * + * * @author Peter Ansell */ class RDFJSONUtility { @@ -32,4 +32,4 @@ class RDFJSONUtility { public static final String VALUE = "value"; -} \ No newline at end of file +} diff --git a/core/rio/rdfjson/src/main/java/org/eclipse/rdf4j/rio/rdfjson/RDFJSONWriter.java b/core/rio/rdfjson/src/main/java/org/eclipse/rdf4j/rio/rdfjson/RDFJSONWriter.java index 911fba0d7da..a7e7008c5cd 100644 --- a/core/rio/rdfjson/src/main/java/org/eclipse/rdf4j/rio/rdfjson/RDFJSONWriter.java +++ b/core/rio/rdfjson/src/main/java/org/eclipse/rdf4j/rio/rdfjson/RDFJSONWriter.java @@ -40,7 +40,7 @@ /** * {@link RDFWriter} implementation for the RDF/JSON format - * + * * @author Peter Ansell p_ansell@yahoo.com */ public class RDFJSONWriter extends AbstractRDFWriter implements RDFWriter { @@ -54,6 +54,7 @@ public class RDFJSONWriter extends AbstractRDFWriter implements RDFWriter { private final RDFFormat actualFormat; public RDFJSONWriter(final OutputStream out, final RDFFormat actualFormat) { + super(out); this.outputStream = out; this.actualFormat = actualFormat; } @@ -65,6 +66,7 @@ public RDFJSONWriter(final Writer writer, final RDFFormat actualFormat) { @Override public void endRDF() throws RDFHandlerException { + checkWritingStarted(); try { if (this.writer != null) { try (final JsonGenerator jg = configureNewJsonFactory().createGenerator(this.writer);) { @@ -102,28 +104,31 @@ public Collection> getSupportedSettings() { @Override public void handleComment(final String comment) throws RDFHandlerException { + checkWritingStarted(); // Comments are ignored. } @Override public void handleNamespace(final String prefix, final String uri) throws RDFHandlerException { + checkWritingStarted(); // Namespace prefixes are not used in RDF/JSON. } @Override - public void handleStatement(final Statement statement) throws RDFHandlerException { - this.graph.add(statement); + public void consumeStatement(final Statement statement) throws RDFHandlerException { + graph.add(statement); } @Override public void startRDF() throws RDFHandlerException { + super.startRDF(); this.graph = new TreeModel(); } /** * Helper method to reduce complexity of the JSON serialisation algorithm Any null contexts will only be serialised * to JSON if there are also non-null contexts in the contexts array - * + * * @param object The RDF value to serialise * @param contexts The set of contexts that are relevant to this object, including null contexts as they are found. * @param jg the {@link JsonGenerator} to write to. @@ -172,7 +177,7 @@ public static void writeObject(final Value object, final Set contexts, /** * Returns the correct syntax for a Resource, depending on whether it is a URI or a Blank Node (ie, BNode) - * + * * @param uriOrBnode The resource to serialise to a string * @return The string value of the sesame resource */ @@ -217,7 +222,7 @@ public static void modelToRdfJsonInternal(final Model graph, final WriterConfig /** * Get an instance of JsonFactory configured using the settings from {@link #getParserConfig()}. - * + * * @return A newly configured JsonFactory based on the currently enabled settings */ private JsonFactory configureNewJsonFactory() { diff --git a/core/rio/rdfjson/src/main/java/org/eclipse/rdf4j/rio/rdfjson/RDFJSONWriterFactory.java b/core/rio/rdfjson/src/main/java/org/eclipse/rdf4j/rio/rdfjson/RDFJSONWriterFactory.java index 88a103d7901..e99075bf005 100644 --- a/core/rio/rdfjson/src/main/java/org/eclipse/rdf4j/rio/rdfjson/RDFJSONWriterFactory.java +++ b/core/rio/rdfjson/src/main/java/org/eclipse/rdf4j/rio/rdfjson/RDFJSONWriterFactory.java @@ -16,7 +16,7 @@ /** * An {@link RDFWriterFactory} for RDF/JSON writers. - * + * * @author Peter Ansell */ public class RDFJSONWriterFactory implements RDFWriterFactory { diff --git a/core/rio/rdfjson/src/test/java/org/eclipse/rdf4j/rio/rdfjson/RDFJSONHandlingTest.java b/core/rio/rdfjson/src/test/java/org/eclipse/rdf4j/rio/rdfjson/RDFJSONHandlingTest.java index 054dd140016..b45e0ae8f67 100644 --- a/core/rio/rdfjson/src/test/java/org/eclipse/rdf4j/rio/rdfjson/RDFJSONHandlingTest.java +++ b/core/rio/rdfjson/src/test/java/org/eclipse/rdf4j/rio/rdfjson/RDFJSONHandlingTest.java @@ -7,47 +7,23 @@ *******************************************************************************/ package org.eclipse.rdf4j.rio.rdfjson; -import java.io.ByteArrayInputStream; import java.io.FileInputStream; import java.io.InputStream; -import java.io.StringWriter; -import java.nio.charset.StandardCharsets; +import java.io.OutputStream; import org.eclipse.rdf4j.model.Model; -import org.eclipse.rdf4j.model.Statement; import org.eclipse.rdf4j.rio.AbstractParserHandlingTest; import org.eclipse.rdf4j.rio.RDFFormat; -import org.eclipse.rdf4j.rio.RDFHandlerException; import org.eclipse.rdf4j.rio.RDFParser; import org.eclipse.rdf4j.rio.RDFWriter; /** * Test for error handling by RDFJSON Parser. - * + * * @author Peter Ansell */ public class RDFJSONHandlingTest extends AbstractParserHandlingTest { - @Override - protected InputStream getUnknownDatatypeStream(Model unknownDatatypeStatements) throws Exception { - return writeRDFJSON(unknownDatatypeStatements); - } - - @Override - protected InputStream getKnownDatatypeStream(Model knownDatatypeStatements) throws Exception { - return writeRDFJSON(knownDatatypeStatements); - } - - @Override - protected InputStream getUnknownLanguageStream(Model unknownLanguageStatements) throws Exception { - return writeRDFJSON(unknownLanguageStatements); - } - - @Override - protected InputStream getKnownLanguageStream(Model knownLanguageStatements) throws Exception { - return writeRDFJSON(knownLanguageStatements); - } - @Override protected InputStream getRDFLangStringWithNoLanguageStream(Model model) throws Exception { InputStream RDFLangStringWithNoLanguageStatements = new FileInputStream( @@ -60,24 +36,8 @@ protected RDFParser getParser() { return new RDFJSONParser(); } - /** - * Helper method to write the given model to RDFJSON and return an InputStream containing the results. - * - * @param statements - * @return An {@link InputStream} containing the results. - * @throws RDFHandlerException - */ - private InputStream writeRDFJSON(Model statements) throws RDFHandlerException { - StringWriter writer = new StringWriter(); - - RDFWriter rdfjsonWriter = new RDFJSONWriter(writer, RDFFormat.RDFJSON); - rdfjsonWriter.startRDF(); - for (Statement nextStatement : statements) { - rdfjsonWriter.handleStatement(nextStatement); - } - rdfjsonWriter.endRDF(); - - return new ByteArrayInputStream(writer.toString().getBytes(StandardCharsets.UTF_8)); + @Override + protected RDFWriter createWriter(OutputStream output) { + return new RDFJSONWriter(output, RDFFormat.RDFJSON); } - } diff --git a/core/rio/rdfjson/src/test/java/org/eclipse/rdf4j/rio/rdfjson/RDFJSONMimeTypeTest.java b/core/rio/rdfjson/src/test/java/org/eclipse/rdf4j/rio/rdfjson/RDFJSONMimeTypeTest.java index a3e7b770afb..952a235cf94 100644 --- a/core/rio/rdfjson/src/test/java/org/eclipse/rdf4j/rio/rdfjson/RDFJSONMimeTypeTest.java +++ b/core/rio/rdfjson/src/test/java/org/eclipse/rdf4j/rio/rdfjson/RDFJSONMimeTypeTest.java @@ -7,7 +7,7 @@ *******************************************************************************/ package org.eclipse.rdf4j.rio.rdfjson; -import static org.junit.Assert.*; +import static org.junit.Assert.assertEquals; import org.eclipse.rdf4j.rio.RDFFormat; import org.eclipse.rdf4j.rio.Rio; diff --git a/core/rio/rdfjson/src/test/java/org/eclipse/rdf4j/rio/rdfjson/RDFJSONParserCustomTest.java b/core/rio/rdfjson/src/test/java/org/eclipse/rdf4j/rio/rdfjson/RDFJSONParserCustomTest.java index 651fa193cfe..bdfed6f58c7 100644 --- a/core/rio/rdfjson/src/test/java/org/eclipse/rdf4j/rio/rdfjson/RDFJSONParserCustomTest.java +++ b/core/rio/rdfjson/src/test/java/org/eclipse/rdf4j/rio/rdfjson/RDFJSONParserCustomTest.java @@ -7,7 +7,11 @@ *******************************************************************************/ package org.eclipse.rdf4j.rio.rdfjson; -import static org.junit.Assert.*; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; import java.io.Reader; import java.io.StringReader; @@ -36,7 +40,7 @@ /** * Custom (non-manifest) tests for RDF/JSON parser. - * + * * @author Peter Ansell */ public class RDFJSONParserCustomTest { diff --git a/core/rio/rdfjson/src/test/java/org/eclipse/rdf4j/rio/rdfjson/RDFJSONWriterTest.java b/core/rio/rdfjson/src/test/java/org/eclipse/rdf4j/rio/rdfjson/RDFJSONWriterTest.java index ef9810cf39e..134a42e1d32 100644 --- a/core/rio/rdfjson/src/test/java/org/eclipse/rdf4j/rio/rdfjson/RDFJSONWriterTest.java +++ b/core/rio/rdfjson/src/test/java/org/eclipse/rdf4j/rio/rdfjson/RDFJSONWriterTest.java @@ -18,7 +18,7 @@ /** * JUnit test for the RDF/JSON parser. - * + * * @author Peter Ansell */ public class RDFJSONWriterTest extends RDFWriterTest { diff --git a/core/rio/rdfxml/pom.xml b/core/rio/rdfxml/pom.xml index 100748ba4e7..0762bd2d24b 100644 --- a/core/rio/rdfxml/pom.xml +++ b/core/rio/rdfxml/pom.xml @@ -4,7 +4,7 @@ org.eclipse.rdf4j rdf4j-rio - 3.1.5-SNAPSHOT + 3.2.2-SNAPSHOT rdf4j-rio-rdfxml RDF4J: Rio - RDF/XML diff --git a/core/rio/rdfxml/src/main/java/org/eclipse/rdf4j/rio/rdfxml/Atts.java b/core/rio/rdfxml/src/main/java/org/eclipse/rdf4j/rio/rdfxml/Atts.java index 77c204dc126..494f0231aeb 100644 --- a/core/rio/rdfxml/src/main/java/org/eclipse/rdf4j/rio/rdfxml/Atts.java +++ b/core/rio/rdfxml/src/main/java/org/eclipse/rdf4j/rio/rdfxml/Atts.java @@ -38,7 +38,7 @@ public Atts() { /** * Creates a new Atts object. - * + * * @param size The initial size of the array for storing attributes. */ public Atts(int size) { @@ -58,7 +58,7 @@ public void addAtt(Att att) { /** * Get an iterator on the attributes. - * + * * @return an Iterator over Att objects. */ public Iterator iterator() { @@ -67,7 +67,7 @@ public Iterator iterator() { /** * Gets the attribute with the specified QName. - * + * * @param qName The QName of an attribute. * @return The attribute with the specified QName, or null if no such attribute could be found. */ @@ -85,7 +85,7 @@ public Att getAtt(String qName) { /** * Gets the attribute with the specified namespace and local name. - * + * * @param namespace The namespace of an attribute. * @param localName The local name of an attribute. * @return The attribute with the specified namespace and local name, or null if no such attribute could be @@ -105,7 +105,7 @@ public Att getAtt(String namespace, String localName) { /** * Removes the attribute with the specified QName and returns it. - * + * * @param qName The QName of an attribute. * @return The removed attribute, or null if no attribute with the specified QName could be found. */ @@ -124,7 +124,7 @@ public Att removeAtt(String qName) { /** * Removes the attribute with the specified namespace and local name and returns it. - * + * * @param namespace The namespace of an attribute. * @param localName The local name of an attribute. * @return The removed attribute, or null if no attribute with the specified namespace and local name could diff --git a/core/rio/rdfxml/src/main/java/org/eclipse/rdf4j/rio/rdfxml/RDFXMLParser.java b/core/rio/rdfxml/src/main/java/org/eclipse/rdf4j/rio/rdfxml/RDFXMLParser.java index cd45d979c1f..671f967d4c6 100644 --- a/core/rio/rdfxml/src/main/java/org/eclipse/rdf4j/rio/rdfxml/RDFXMLParser.java +++ b/core/rio/rdfxml/src/main/java/org/eclipse/rdf4j/rio/rdfxml/RDFXMLParser.java @@ -59,17 +59,17 @@ *

  • Call the parse method. * * Example code: - * + * *
      * // Use the SAX2-compliant Xerces parser:
      * System.setProperty("org.xml.sax.driver", "org.apache.xerces.parsers.SAXParser");
    - * 
    + *
      * RDFParser parser = new RDFXMLParser();
      * parser.setRDFHandler(myRDFHandler);
      * parser.setParseErrorListener(myParseErrorListener);
      * parser.setVerifyData(true);
      * parser.stopAtFirstError(false);
    - * 
    + *
      * // Parse the data from inputStream, resolving any
      * // relative URIs against http://foo/bar:
      * parser.parse(inputStream, "http://foo/bar");
    @@ -79,13 +79,13 @@
      * limits and using the
      * jaxp.properties file if you get one of
      * the following errors:
    - * 
    + *
      * 
    - *  
    + *
      * JAXP00010001: The parser has encountered more than "64000" entity expansions in this document
      * JAXP00010004: The accumulated size of entities is ... that exceeded the "50,000,000" limit
      * 
    - * + * * As a work-around, try passing -Djdk.xml.totalEntitySizeLimit=0 -DentityExpansionLimit=0 to the JVM. * * @see org.eclipse.rdf4j.model.ValueFactory @@ -142,7 +142,7 @@ public RDFXMLParser() { /** * Creates a new RDFXMLParser that will use the supplied ValueFactory to create RDF model objects. - * + * * @param valueFactory A ValueFactory. */ public RDFXMLParser(ValueFactory valueFactory) { @@ -172,7 +172,7 @@ public void setParseStandAloneDocuments(boolean standAloneDocs) { /** * Returns whether the parser is currently in a mode to parse stand-alone RDF documents. - * + * * @see #setParseStandAloneDocuments */ public boolean getParseStandAloneDocuments() { @@ -181,7 +181,7 @@ public boolean getParseStandAloneDocuments() { /** * Parses the data from the supplied InputStream, using the supplied baseURI to resolve any relative URI references. - * + * * @param in The InputStream from which to read the data, must not be null. * @param baseURI The URI associated with the data in the InputStream, must not be null. * @throws IOException If an I/O error occurred while data was read from the InputStream. @@ -207,7 +207,7 @@ public synchronized void parse(InputStream in, String baseURI) /** * Parses the data from the supplied Reader, using the supplied baseURI to resolve any relative URI references. - * + * * @param reader The Reader from which to read the data, must not be null. * @param baseURI The URI associated with the data in the InputStream, must not be null. * @throws IOException If an I/O error occurred while data was read from the InputStream. @@ -497,7 +497,7 @@ private void processNodeElt(String namespaceURI, String localName, String qName, /** * Retrieves the resource of a node element (subject or object) using relevant attributes (rdf:ID, rdf:about and * rdf:nodeID) from its attributes list. - * + * * @return a resource or a bNode. */ private Resource getNodeResource(Atts atts) throws RDFParseException { @@ -719,7 +719,7 @@ else if (isEmptyElt) { /** * Retrieves the object resource of a property element using relevant attributes (rdf:resource and rdf:nodeID) from * its attributes list. - * + * * @return a resource or a bNode. */ private Resource getPropertyResource(Atts atts) throws RDFParseException { @@ -866,7 +866,7 @@ private void checkNodeEltName(String namespaceURI, String localName, String qNam * property element. If the name is equal to one of the disallowed names (RDF, ID, about, parseType, resource and * li), an error is generated. If the name is not defined in the RDF namespace, but it claims that it is from this * namespace, a warning is generated. - * + * * @param setting */ private void checkPropertyEltName(String namespaceURI, String localName, String qName, RioSetting setting) @@ -949,7 +949,7 @@ private void checkNoMoreAtts(Atts atts) throws RDFParseException { /** * Reports a stament to the configured RDFHandlerException. - * + * * @param subject The statement's subject. * @param predicate The statement's predicate. * @param object The statement's object. diff --git a/core/rio/rdfxml/src/main/java/org/eclipse/rdf4j/rio/rdfxml/RDFXMLParserFactory.java b/core/rio/rdfxml/src/main/java/org/eclipse/rdf4j/rio/rdfxml/RDFXMLParserFactory.java index 71b76af9d66..e83d261bf0f 100644 --- a/core/rio/rdfxml/src/main/java/org/eclipse/rdf4j/rio/rdfxml/RDFXMLParserFactory.java +++ b/core/rio/rdfxml/src/main/java/org/eclipse/rdf4j/rio/rdfxml/RDFXMLParserFactory.java @@ -13,7 +13,7 @@ /** * An {@link RDFParserFactory} for RDF/XML parsers. - * + * * @author Arjohn Kampman */ public class RDFXMLParserFactory implements RDFParserFactory { diff --git a/core/rio/rdfxml/src/main/java/org/eclipse/rdf4j/rio/rdfxml/RDFXMLWriter.java b/core/rio/rdfxml/src/main/java/org/eclipse/rdf4j/rio/rdfxml/RDFXMLWriter.java index 6d048ce98ec..6d952808471 100644 --- a/core/rio/rdfxml/src/main/java/org/eclipse/rdf4j/rio/rdfxml/RDFXMLWriter.java +++ b/core/rio/rdfxml/src/main/java/org/eclipse/rdf4j/rio/rdfxml/RDFXMLWriter.java @@ -43,11 +43,10 @@ public class RDFXMLWriter extends AbstractRDFWriter implements RDFWriter { protected ParsedIRI baseIRI; protected Writer writer; protected String defaultNamespace; - protected boolean writingStarted; - protected boolean headerWritten; - protected Resource lastWrittenSubject; - protected char quote; - protected boolean entityQuote; + protected boolean headerWritten = false; + protected Resource lastWrittenSubject = null; + protected char quote = '"'; + protected boolean entityQuote = false; /** * Creates a new RDFXMLWriter that will write to the supplied OutputStream. @@ -65,7 +64,10 @@ public RDFXMLWriter(OutputStream out) { * @param baseIRI base URI */ public RDFXMLWriter(OutputStream out, ParsedIRI baseIRI) { - this(new OutputStreamWriter(out, StandardCharsets.UTF_8), baseIRI); + super(out); + this.baseIRI = baseIRI; + this.writer = new OutputStreamWriter(out, StandardCharsets.UTF_8); + namespaceTable = new LinkedHashMap<>(); } /** @@ -87,11 +89,6 @@ public RDFXMLWriter(Writer writer, ParsedIRI baseIRI) { this.baseIRI = baseIRI; this.writer = writer; namespaceTable = new LinkedHashMap<>(); - writingStarted = false; - headerWritten = false; - lastWrittenSubject = null; - quote = '"'; - entityQuote = false; } @Override @@ -99,14 +96,6 @@ public RDFFormat getRDFFormat() { return RDFFormat.RDFXML; } - @Override - public void startRDF() throws RDFHandlerException { - if (writingStarted) { - throw new RDFHandlerException("Document writing has already started"); - } - writingStarted = true; - } - protected void writeHeader() throws IOException { try { // This export format needs the RDF namespace to be defined, add a @@ -158,10 +147,7 @@ protected void writeHeader() throws IOException { @Override public void endRDF() throws RDFHandlerException { - if (!writingStarted) { - throw new RDFHandlerException("Document writing has not yet started"); - } - + checkWritingStarted(); try { if (!headerWritten) { writeHeader(); @@ -178,14 +164,12 @@ public void endRDF() throws RDFHandlerException { writer.flush(); } catch (IOException e) { throw new RDFHandlerException(e); - } finally { - writingStarted = false; - headerWritten = false; } } @Override public void handleNamespace(String prefix, String name) { + checkWritingStarted(); setNamespace(prefix, name); } @@ -225,11 +209,7 @@ protected void setNamespace(String prefix, String name) { } @Override - public void handleStatement(Statement st) throws RDFHandlerException { - if (!writingStarted) { - throw new RDFHandlerException("Document writing has not yet been started"); - } - + protected void consumeStatement(Statement st) { Resource subj = st.getSubject(); IRI pred = st.getPredicate(); Value obj = st.getObject(); @@ -335,6 +315,7 @@ public void handleStatement(Statement st) throws RDFHandlerException { @Override public void handleComment(String comment) throws RDFHandlerException { + checkWritingStarted(); try { if (!headerWritten) { writeHeader(); @@ -402,7 +383,7 @@ protected void writeAttribute(String namespace, String attName, String value) /** * Write quoted attribute - * + * * @param attName attribute name * @param value string value * @throws IOException @@ -419,7 +400,7 @@ protected void writeQuotedAttribute(String attName, String value) throws IOExcep /** * Write > - * + * * @throws IOException */ protected void writeEndOfStartTag() throws IOException { @@ -428,7 +409,7 @@ protected void writeEndOfStartTag() throws IOException { /** * Write > or /> - * + * * @throws IOException */ protected void writeEndOfEmptyTag() throws IOException { @@ -454,7 +435,7 @@ protected void writeEndTag(String namespace, String localName) throws IOExceptio /** * Replace special characters in text with entities. - * + * * @param chars text * @throws IOException */ @@ -471,7 +452,7 @@ protected void writeCharacterData(String chars) throws IOException { /** * Write tab - * + * * @throws IOException */ protected void writeIndent() throws IOException { @@ -480,7 +461,7 @@ protected void writeIndent() throws IOException { /** * Write newline character - * + * * @throws IOException */ protected void writeNewLine() throws IOException { @@ -490,7 +471,7 @@ protected void writeNewLine() throws IOException { /** * Create a syntactically valid node id from the supplied blank node id. This is necessary because RDF/XML syntax * enforces the blank node id is a valid NCName. - * + * * @param bNode a blank node identifier * @return the blank node identifier converted to a form that is a valid NCName. * @see section 7.2.34 of the RDF/XML Syntax specification diff --git a/core/rio/rdfxml/src/main/java/org/eclipse/rdf4j/rio/rdfxml/RDFXMLWriterFactory.java b/core/rio/rdfxml/src/main/java/org/eclipse/rdf4j/rio/rdfxml/RDFXMLWriterFactory.java index 3acc184a25b..7f782c7199e 100644 --- a/core/rio/rdfxml/src/main/java/org/eclipse/rdf4j/rio/rdfxml/RDFXMLWriterFactory.java +++ b/core/rio/rdfxml/src/main/java/org/eclipse/rdf4j/rio/rdfxml/RDFXMLWriterFactory.java @@ -18,7 +18,7 @@ /** * An {@link RDFWriterFactory} for RDF/XML writers. - * + * * @author Arjohn Kampman */ public class RDFXMLWriterFactory implements RDFWriterFactory { diff --git a/core/rio/rdfxml/src/main/java/org/eclipse/rdf4j/rio/rdfxml/util/RDFXMLPrettyWriter.java b/core/rio/rdfxml/src/main/java/org/eclipse/rdf4j/rio/rdfxml/util/RDFXMLPrettyWriter.java index 9e475447121..a0e1b394b83 100644 --- a/core/rio/rdfxml/src/main/java/org/eclipse/rdf4j/rio/rdfxml/util/RDFXMLPrettyWriter.java +++ b/core/rio/rdfxml/src/main/java/org/eclipse/rdf4j/rio/rdfxml/util/RDFXMLPrettyWriter.java @@ -47,7 +47,7 @@ * descriptions in each other. *

    * Example: - * + * *

      * <rdf:Seq>
      *    <rdf:li>
    @@ -61,34 +61,34 @@
      *    </rdf:li>
      * </rdf:Seq>
      * 
    - * + * * Typed node elements means that we write out type information in the short form of - * + * *
      * <foaf:Person rdf:about="...">
      *     ...
      *  </foaf:Person>
      * 
    - * + * * instead of - * + * *
      * <rdf:Description rdf:about="...">
      *    <rdf:type rdf:resource="http://xmlns.com/foaf/0.1/Person"/>
      *     ...
      *  </rdf:Description>
      * 
    - * + * * Empty property elements are of the form - * + * *
      * <foaf:Person>
      *    <foaf:homepage rdf:resource="http://www.cs.vu.nl/˜marta"/>
      * </foaf:Person>
      * 
    - * + * * instead of - * + * *
      * <foaf:Person>
      *    <foaf:homepage>
    @@ -96,7 +96,7 @@
      *    <foaf:homepage>
      * </foaf:Person>
      * 
    - * + * * @author Peter Mika (pmika@cs.vu.nl) */ public class RDFXMLPrettyWriter extends RDFXMLWriter implements Closeable, Flushable { @@ -119,13 +119,15 @@ public class RDFXMLPrettyWriter extends RDFXMLWriter implements Closeable, Flush */ private final Stack predicateStack = new Stack<>(); + private boolean writingEnded; + /*--------------* * Constructors * *--------------*/ /** * Creates a new RDFXMLPrintWriter that will write to the supplied OutputStream. - * + * * @param out The OutputStream to write the RDF/XML document to. */ public RDFXMLPrettyWriter(OutputStream out) { @@ -143,7 +145,7 @@ public RDFXMLPrettyWriter(OutputStream out, ParsedIRI baseIRI) { /** * Creates a new RDFXMLPrintWriter that will write to the supplied Writer. - * + * * @param out The Writer to write the RDF/XML document to. */ public RDFXMLPrettyWriter(Writer out) { @@ -164,6 +166,14 @@ public RDFXMLPrettyWriter(Writer writer, ParsedIRI baseIRI) { * Methods * *---------*/ + @Override + public void endRDF() throws RDFHandlerException { + if (!writingEnded) { + super.endRDF(); + writingEnded = true; + } + } + @Override protected void writeHeader() throws IOException { // This export format needs the RDF Schema namespace to be defined: @@ -174,7 +184,7 @@ protected void writeHeader() throws IOException { @Override public void flush() throws IOException { - if (writingStarted) { + if (isWritingStarted()) { if (!headerWritten) { writeHeader(); } @@ -196,7 +206,7 @@ public void flush() throws IOException { @Override public void close() throws IOException { try { - if (writingStarted) { + if (isWritingStarted() && !writingEnded) { endRDF(); } } catch (RDFHandlerException e) { @@ -221,7 +231,7 @@ protected void flushPendingStatements() throws IOException, RDFHandlerException /** * Write out the stacks until we find subject. If subject == null, write out the entire stack - * + * * @param newSubject */ private void popStacks(Resource newSubject) throws IOException, RDFHandlerException { @@ -309,11 +319,7 @@ private void popStacks(Resource newSubject) throws IOException, RDFHandlerExcept } @Override - public void handleStatement(Statement st) throws RDFHandlerException { - if (!writingStarted) { - throw new RDFHandlerException("Document writing has not yet been started"); - } - + public void consumeStatement(Statement st) throws RDFHandlerException { Resource subj = st.getSubject(); IRI pred = st.getPredicate(); Value obj = st.getObject(); diff --git a/core/rio/rdfxml/src/main/java/org/eclipse/rdf4j/rio/rdfxml/util/RDFXMLPrettyWriterFactory.java b/core/rio/rdfxml/src/main/java/org/eclipse/rdf4j/rio/rdfxml/util/RDFXMLPrettyWriterFactory.java index dfaf0cf5681..ae92c708ecf 100644 --- a/core/rio/rdfxml/src/main/java/org/eclipse/rdf4j/rio/rdfxml/util/RDFXMLPrettyWriterFactory.java +++ b/core/rio/rdfxml/src/main/java/org/eclipse/rdf4j/rio/rdfxml/util/RDFXMLPrettyWriterFactory.java @@ -18,7 +18,7 @@ /** * An {@link RDFWriterFactory} for RDF/XML writers. - * + * * @author Arjohn Kampman */ public class RDFXMLPrettyWriterFactory implements RDFWriterFactory { diff --git a/core/rio/rdfxml/src/test/java/org/eclipse/rdf4j/rio/rdfxml/RDFXMLHandlingTest.java b/core/rio/rdfxml/src/test/java/org/eclipse/rdf4j/rio/rdfxml/RDFXMLHandlingTest.java index fb52d6b21d4..4a5fefd4e5f 100644 --- a/core/rio/rdfxml/src/test/java/org/eclipse/rdf4j/rio/rdfxml/RDFXMLHandlingTest.java +++ b/core/rio/rdfxml/src/test/java/org/eclipse/rdf4j/rio/rdfxml/RDFXMLHandlingTest.java @@ -7,46 +7,21 @@ *******************************************************************************/ package org.eclipse.rdf4j.rio.rdfxml; -import java.io.ByteArrayInputStream; import java.io.FileInputStream; import java.io.InputStream; -import java.io.StringWriter; -import java.nio.charset.StandardCharsets; +import java.io.OutputStream; import org.eclipse.rdf4j.model.Model; -import org.eclipse.rdf4j.model.Statement; import org.eclipse.rdf4j.rio.AbstractParserHandlingTest; -import org.eclipse.rdf4j.rio.RDFHandlerException; import org.eclipse.rdf4j.rio.RDFParser; import org.eclipse.rdf4j.rio.RDFWriter; /** * Test for error handling by RDFXML Parser. - * + * * @author Peter Ansell */ public class RDFXMLHandlingTest extends AbstractParserHandlingTest { - - @Override - protected InputStream getUnknownDatatypeStream(Model unknownDatatypeStatements) throws Exception { - return writeRDFXML(unknownDatatypeStatements); - } - - @Override - protected InputStream getKnownDatatypeStream(Model knownDatatypeStatements) throws Exception { - return writeRDFXML(knownDatatypeStatements); - } - - @Override - protected InputStream getUnknownLanguageStream(Model unknownLanguageStatements) throws Exception { - return writeRDFXML(unknownLanguageStatements); - } - - @Override - protected InputStream getKnownLanguageStream(Model knownLanguageStatements) throws Exception { - return writeRDFXML(knownLanguageStatements); - } - @Override protected InputStream getRDFLangStringWithNoLanguageStream(Model model) throws Exception { InputStream RDFLangStringWithNoLanguageStatements = new FileInputStream( @@ -59,24 +34,8 @@ protected RDFParser getParser() { return new RDFXMLParser(); } - /** - * Helper method to write the given model to RDFXML and return an InputStream containing the results. - * - * @param statements - * @return An {@link InputStream} containing the results. - * @throws RDFHandlerException - */ - private InputStream writeRDFXML(Model statements) throws RDFHandlerException { - StringWriter writer = new StringWriter(); - - RDFWriter rdfxmlWriter = new RDFXMLWriter(writer); - rdfxmlWriter.startRDF(); - for (Statement nextStatement : statements) { - rdfxmlWriter.handleStatement(nextStatement); - } - rdfxmlWriter.endRDF(); - - return new ByteArrayInputStream(writer.toString().getBytes(StandardCharsets.UTF_8)); + @Override + protected RDFWriter createWriter(OutputStream output) { + return new RDFXMLWriter(output); } - } diff --git a/core/rio/rdfxml/src/test/java/org/eclipse/rdf4j/rio/rdfxml/RDFXMLParserCustomTest.java b/core/rio/rdfxml/src/test/java/org/eclipse/rdf4j/rio/rdfxml/RDFXMLParserCustomTest.java index c18bddb400d..8fae7af25e0 100644 --- a/core/rio/rdfxml/src/test/java/org/eclipse/rdf4j/rio/rdfxml/RDFXMLParserCustomTest.java +++ b/core/rio/rdfxml/src/test/java/org/eclipse/rdf4j/rio/rdfxml/RDFXMLParserCustomTest.java @@ -7,12 +7,18 @@ *******************************************************************************/ package org.eclipse.rdf4j.rio.rdfxml; -import static org.junit.Assert.*; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.fail; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; import java.io.StringReader; import org.eclipse.rdf4j.model.Model; +import org.eclipse.rdf4j.model.ValueFactory; import org.eclipse.rdf4j.model.impl.LinkedHashModel; +import org.eclipse.rdf4j.model.impl.SimpleValueFactory; import org.eclipse.rdf4j.model.vocabulary.RDF; import org.eclipse.rdf4j.rio.ParserConfig; import org.eclipse.rdf4j.rio.RDFFormat; @@ -22,19 +28,20 @@ import org.eclipse.rdf4j.rio.helpers.ParseErrorCollector; import org.eclipse.rdf4j.rio.helpers.StatementCollector; import org.eclipse.rdf4j.rio.helpers.XMLParserSettings; +import org.eclipse.rdf4j.rio.rdfxml.util.RDFXMLPrettyWriter; import org.junit.Ignore; import org.junit.Test; /** * Custom tests for RDFXML Parser. - * + * * @author Michael Grove */ public class RDFXMLParserCustomTest { /** * Test with the default ParserConfig settings. Ie, setParserConfig is not called. - * + * * @throws Exception */ @Test @@ -64,7 +71,7 @@ public void testEntityExpansionDefaultSettings() throws Exception { /** * Test with unrelated ParserConfig settings - * + * * @throws Exception */ @Test @@ -96,7 +103,7 @@ public void testEntityExpansionUnrelatedSettings() throws Exception { /** * Test with Secure processing setting on. - * + * * @throws Exception */ @Test @@ -131,7 +138,7 @@ public void testEntityExpansionSecureProcessing() throws Exception { * IMPORTANT: Only turn this on to verify it is still working, as there is no way to safely perform this test. *

    * WARNING: This test will cause an OutOfMemoryException when it eventually fails, as it will eventually fail. - * + * * @throws Exception */ @Ignore @@ -209,4 +216,19 @@ public void testParseCommentAtStart() throws Exception { public void testSupportedSettings() throws Exception { assertEquals(25, Rio.createParser(RDFFormat.RDFXML).getSupportedSettings().size()); } + + @Test + public void tset() throws IOException { + ValueFactory vf = SimpleValueFactory.getInstance(); + Model mm = new LinkedHashModel(); + mm.add(vf.createStatement(vf.createIRI("urn:foo:момтен.т=2-"), RDF.TYPE, vf.createIRI("urn:foo:момтен"))); + try (ByteArrayOutputStream bos = new ByteArrayOutputStream()) { + RDFXMLPrettyWriter rdfWriter = new RDFXMLPrettyWriter(System.out); + Rio.write(mm, rdfWriter); + RDFXMLPrettyWriter rdfWriter2 = new RDFXMLPrettyWriter(bos); + Rio.write(mm, rdfWriter2); + Model mmm = Rio.parse(new ByteArrayInputStream(bos.toByteArray()), "urn:base:", RDFFormat.RDFXML); + mmm.forEach(System.out::println); + } + } } diff --git a/core/rio/rdfxml/src/test/java/org/eclipse/rdf4j/rio/rdfxml/RDFXMLParserTest.java b/core/rio/rdfxml/src/test/java/org/eclipse/rdf4j/rio/rdfxml/RDFXMLParserTest.java index e276dc5dc2b..c43e1d845f0 100644 --- a/core/rio/rdfxml/src/test/java/org/eclipse/rdf4j/rio/rdfxml/RDFXMLParserTest.java +++ b/core/rio/rdfxml/src/test/java/org/eclipse/rdf4j/rio/rdfxml/RDFXMLParserTest.java @@ -13,10 +13,8 @@ import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; -import java.io.ByteArrayOutputStream; import java.io.FileNotFoundException; import java.io.InputStream; -import java.io.PrintStream; import java.net.URL; import java.util.Collection; import java.util.Iterator; @@ -140,9 +138,7 @@ public void testFatalErrorDoctypeDecl() throws Exception { try (final InputStream in = this.getClass() .getResourceAsStream("/org/eclipse/rdf4j/rio/rdfxml/rdfxml-external-param-entity.rdf");) { parser.parse(in, ""); - } - - catch (RDFParseException e) { + } catch (RDFParseException e) { assertEquals( "DOCTYPE is disallowed when the feature \"http://apache.org/xml/features/disallow-doctype-decl\" set to true. [line 2, column 10]", e.getMessage()); diff --git a/core/rio/rdfxml/src/test/java/org/eclipse/rdf4j/rio/rdfxml/RDFXMLWriterTest.java b/core/rio/rdfxml/src/test/java/org/eclipse/rdf4j/rio/rdfxml/RDFXMLWriterTest.java index 52b701a2192..5371dba94a8 100644 --- a/core/rio/rdfxml/src/test/java/org/eclipse/rdf4j/rio/rdfxml/RDFXMLWriterTest.java +++ b/core/rio/rdfxml/src/test/java/org/eclipse/rdf4j/rio/rdfxml/RDFXMLWriterTest.java @@ -60,7 +60,7 @@ public void doubleQuotesText() { /** * Write a statement with a literal that needs escaping as RDF/XML to a string - * + * * @param useSingle use single quotes * @param withinText quotes to entity within text * @return RDF/XML output as string diff --git a/core/rio/trig/pom.xml b/core/rio/trig/pom.xml index 9aad9e9553b..9921c2b8eab 100644 --- a/core/rio/trig/pom.xml +++ b/core/rio/trig/pom.xml @@ -4,7 +4,7 @@ org.eclipse.rdf4j rdf4j-rio - 3.1.5-SNAPSHOT + 3.2.2-SNAPSHOT rdf4j-rio-trig RDF4J: Rio - TriG diff --git a/core/rio/trig/src/main/java/org/eclipse/rdf4j/rio/trig/TriGParser.java b/core/rio/trig/src/main/java/org/eclipse/rdf4j/rio/trig/TriGParser.java index 7024bbe72da..18ab0b6c446 100644 --- a/core/rio/trig/src/main/java/org/eclipse/rdf4j/rio/trig/TriGParser.java +++ b/core/rio/trig/src/main/java/org/eclipse/rdf4j/rio/trig/TriGParser.java @@ -24,7 +24,7 @@ /** * RDF parser for RDF-1.1 TriG files. This parser is not thread-safe, * therefore its public methods are synchronized. - * + * * @author Arjohn Kampman * @author Peter Ansell * @see TurtleParser @@ -50,7 +50,7 @@ public TriGParser() { /** * Creates a new TriGParser that will use the supplied ValueFactory to create RDF model objects. - * + * * @param valueFactory A ValueFactory. */ public TriGParser(ValueFactory valueFactory) { diff --git a/core/rio/trig/src/main/java/org/eclipse/rdf4j/rio/trig/TriGParserFactory.java b/core/rio/trig/src/main/java/org/eclipse/rdf4j/rio/trig/TriGParserFactory.java index 858d7f0a41e..1a87690ab61 100644 --- a/core/rio/trig/src/main/java/org/eclipse/rdf4j/rio/trig/TriGParserFactory.java +++ b/core/rio/trig/src/main/java/org/eclipse/rdf4j/rio/trig/TriGParserFactory.java @@ -13,7 +13,7 @@ /** * An {@link RDFParserFactory} for TriG parsers. - * + * * @author Arjohn Kampman */ public class TriGParserFactory implements RDFParserFactory { diff --git a/core/rio/trig/src/main/java/org/eclipse/rdf4j/rio/trig/TriGWriter.java b/core/rio/trig/src/main/java/org/eclipse/rdf4j/rio/trig/TriGWriter.java index 7b438471231..c9295875225 100644 --- a/core/rio/trig/src/main/java/org/eclipse/rdf4j/rio/trig/TriGWriter.java +++ b/core/rio/trig/src/main/java/org/eclipse/rdf4j/rio/trig/TriGWriter.java @@ -23,7 +23,7 @@ * An extension of {@link TurtleWriter} that writes RDF documents in * TriG format by adding graph scopes to the Turtle * document. - * + * * @author Arjohn Kampman */ public class TriGWriter extends TurtleWriter { @@ -42,7 +42,7 @@ public class TriGWriter extends TurtleWriter { /** * Creates a new TriGWriter that will write to the supplied OutputStream. - * + * * @param out The OutputStream to write the TriG document to. */ public TriGWriter(OutputStream out) { @@ -60,7 +60,7 @@ public TriGWriter(OutputStream out, ParsedIRI baseIRI) { /** * Creates a new TriGWriter that will write to the supplied Writer. - * + * * @param writer The Writer to write the TriG document to. */ public TriGWriter(Writer writer) { @@ -106,11 +106,7 @@ public void endRDF() throws RDFHandlerException { } @Override - public void handleStatement(Statement st) throws RDFHandlerException { - if (!writingStarted) { - throw new RuntimeException("Document writing has not yet been started"); - } - + protected void consumeStatement(Statement st) { // If we are pretty-printing, all writing is buffered until endRDF is called if (prettyPrintModel != null) { prettyPrintModel.add(st); diff --git a/core/rio/trig/src/main/java/org/eclipse/rdf4j/rio/trig/TriGWriterFactory.java b/core/rio/trig/src/main/java/org/eclipse/rdf4j/rio/trig/TriGWriterFactory.java index 2d4c2eb5ba6..fdd564ea3d7 100644 --- a/core/rio/trig/src/main/java/org/eclipse/rdf4j/rio/trig/TriGWriterFactory.java +++ b/core/rio/trig/src/main/java/org/eclipse/rdf4j/rio/trig/TriGWriterFactory.java @@ -18,7 +18,7 @@ /** * An {@link RDFWriterFactory} for TriG parsers. - * + * * @author Arjohn Kampman */ public class TriGWriterFactory implements RDFWriterFactory { diff --git a/core/rio/trig/src/main/java/org/eclipse/rdf4j/rio/trigstar/TriGStarParser.java b/core/rio/trig/src/main/java/org/eclipse/rdf4j/rio/trigstar/TriGStarParser.java new file mode 100644 index 00000000000..6f6ba7a9192 --- /dev/null +++ b/core/rio/trig/src/main/java/org/eclipse/rdf4j/rio/trigstar/TriGStarParser.java @@ -0,0 +1,67 @@ +/******************************************************************************* + * Copyright (c) 2020 Eclipse RDF4J contributors. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Distribution License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ +package org.eclipse.rdf4j.rio.trigstar; + +import java.io.IOException; + +import org.eclipse.rdf4j.model.BNode; +import org.eclipse.rdf4j.model.IRI; +import org.eclipse.rdf4j.model.Resource; +import org.eclipse.rdf4j.model.Value; +import org.eclipse.rdf4j.model.ValueFactory; +import org.eclipse.rdf4j.model.impl.SimpleValueFactory; +import org.eclipse.rdf4j.rio.RDFFormat; +import org.eclipse.rdf4j.rio.RDFHandlerException; +import org.eclipse.rdf4j.rio.RDFParseException; +import org.eclipse.rdf4j.rio.trig.TriGParser; + +/** + * RDF parser for TriG* (an extension of TriG that adds RDF* support). + * + * @author Pavel Mihaylov + */ +public class TriGStarParser extends TriGParser { + /** + * Creates a new TriGStarParser that will use a {@link SimpleValueFactory} to create RDF* model objects. + */ + public TriGStarParser() { + super(); + } + + /** + * Creates a new TriGStarParser that will use the supplied ValueFactory to create RDF* model objects. + * + * @param valueFactory A ValueFactory. + */ + public TriGStarParser(ValueFactory valueFactory) { + super(valueFactory); + } + + @Override + public RDFFormat getRDFFormat() { + return RDFFormat.TRIGSTAR; + } + + @Override + protected Value parseValue() throws IOException, RDFParseException, RDFHandlerException { + if (peekIsTripleValue()) { + return parseTripleValue(); + } + + return super.parseValue(); + } + + @Override + protected void setContext(Resource context) { + if (context != null && !(context instanceof IRI || context instanceof BNode)) { + reportFatalError("Illegal context value: " + context); + } + + super.setContext(context); + } +} diff --git a/core/rio/trig/src/main/java/org/eclipse/rdf4j/rio/trigstar/TriGStarParserFactory.java b/core/rio/trig/src/main/java/org/eclipse/rdf4j/rio/trigstar/TriGStarParserFactory.java new file mode 100644 index 00000000000..0935b249a75 --- /dev/null +++ b/core/rio/trig/src/main/java/org/eclipse/rdf4j/rio/trigstar/TriGStarParserFactory.java @@ -0,0 +1,35 @@ +/******************************************************************************* + * Copyright (c) 2020 Eclipse RDF4J contributors. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Distribution License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ +package org.eclipse.rdf4j.rio.trigstar; + +import org.eclipse.rdf4j.rio.RDFFormat; +import org.eclipse.rdf4j.rio.RDFParser; +import org.eclipse.rdf4j.rio.RDFParserFactory; + +/** + * An {@link RDFParserFactory} for TriG* parsers. + * + * @author Pavel Mihaylov + */ +public class TriGStarParserFactory implements RDFParserFactory { + /** + * Returns {@link RDFFormat#TRIGSTAR}. + */ + @Override + public RDFFormat getRDFFormat() { + return RDFFormat.TRIGSTAR; + } + + /** + * Returns a new instance of {@link TriGStarParser}. + */ + @Override + public RDFParser getParser() { + return new TriGStarParser(); + } +} diff --git a/core/rio/trig/src/main/java/org/eclipse/rdf4j/rio/trigstar/TriGStarWriter.java b/core/rio/trig/src/main/java/org/eclipse/rdf4j/rio/trigstar/TriGStarWriter.java new file mode 100644 index 00000000000..814a069b847 --- /dev/null +++ b/core/rio/trig/src/main/java/org/eclipse/rdf4j/rio/trigstar/TriGStarWriter.java @@ -0,0 +1,72 @@ +/******************************************************************************* + * Copyright (c) 2020 Eclipse RDF4J contributors. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Distribution License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ +package org.eclipse.rdf4j.rio.trigstar; + +import java.io.IOException; +import java.io.OutputStream; +import java.io.Writer; + +import org.eclipse.rdf4j.common.net.ParsedIRI; +import org.eclipse.rdf4j.model.Triple; +import org.eclipse.rdf4j.rio.RDFFormat; +import org.eclipse.rdf4j.rio.trig.TriGWriter; + +/** + * An extension of {@link TriGWriter} that writes RDF* documents in the TriG* format by including the RDF* triples. + * + * @author Pavel Mihaylov + */ +public class TriGStarWriter extends TriGWriter { + /** + * Creates a new TriGStarWriter that will write to the supplied OutputStream. + * + * @param out The OutputStream to write the TriG* document to. + */ + public TriGStarWriter(OutputStream out) { + super(out); + } + + /** + * Creates a new TriGStarWriter that will write to the supplied OutputStream using the supplied base IRI. + * + * @param out The OutputStream to write the TriG* document to. + * @param baseIRI The base IRI to use. + */ + public TriGStarWriter(OutputStream out, ParsedIRI baseIRI) { + super(out, baseIRI); + } + + /** + * Creates a new TriGStarWriter that will write to the supplied Writer. + * + * @param writer The Writer to write the TriG* document to. + */ + public TriGStarWriter(Writer writer) { + super(writer); + } + + /** + * Creates a new TriGStarWriter that will write to the supplied Writer using the supplied base IRI. + * + * @param writer The Writer to write the TriG* document to. + * @param baseIRI The base IRI to use. + */ + public TriGStarWriter(Writer writer, ParsedIRI baseIRI) { + super(writer, baseIRI); + } + + @Override + public RDFFormat getRDFFormat() { + return RDFFormat.TRIGSTAR; + } + + @Override + protected void writeTriple(Triple triple, boolean canShorten) throws IOException { + writeTripleRDFStar(triple, canShorten); + } +} diff --git a/core/rio/trig/src/main/java/org/eclipse/rdf4j/rio/trigstar/TriGStarWriterFactory.java b/core/rio/trig/src/main/java/org/eclipse/rdf4j/rio/trigstar/TriGStarWriterFactory.java new file mode 100644 index 00000000000..e2eb7d6e9bc --- /dev/null +++ b/core/rio/trig/src/main/java/org/eclipse/rdf4j/rio/trigstar/TriGStarWriterFactory.java @@ -0,0 +1,69 @@ +/******************************************************************************* + * Copyright (c) 2020 Eclipse RDF4J contributors. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Distribution License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ +package org.eclipse.rdf4j.rio.trigstar; + +import java.io.OutputStream; +import java.io.Writer; +import java.net.URISyntaxException; + +import org.eclipse.rdf4j.common.net.ParsedIRI; +import org.eclipse.rdf4j.rio.RDFFormat; +import org.eclipse.rdf4j.rio.RDFWriter; +import org.eclipse.rdf4j.rio.RDFWriterFactory; + +/** + * An {@link RDFWriterFactory} for TriG* writers. + * + * @author Pavel Mihaylov + */ +public class TriGStarWriterFactory implements RDFWriterFactory { + + /** + * Returns {@link RDFFormat#TRIGSTAR}. + */ + @Override + public RDFFormat getRDFFormat() { + return RDFFormat.TRIGSTAR; + } + + /** + * Returns a new instance of {@link TriGStarWriter}. + */ + @Override + public RDFWriter getWriter(OutputStream out) { + return new TriGStarWriter(out); + } + + /** + * Returns a new instance of {@link TriGStarWriter}. + * + * @throws URISyntaxException + */ + @Override + public RDFWriter getWriter(OutputStream out, String baseURI) throws URISyntaxException { + return new TriGStarWriter(out, new ParsedIRI(baseURI)); + } + + /** + * Returns a new instance of {@link TriGStarWriter}. + */ + @Override + public RDFWriter getWriter(Writer writer) { + return new TriGStarWriter(writer); + } + + /** + * Returns a new instance of {@link TriGStarWriter}. + * + * @throws URISyntaxException + */ + @Override + public RDFWriter getWriter(Writer writer, String baseURI) throws URISyntaxException { + return new TriGStarWriter(writer, new ParsedIRI(baseURI)); + } +} diff --git a/core/rio/trig/src/main/resources/META-INF/services/org.eclipse.rdf4j.rio.RDFParserFactory b/core/rio/trig/src/main/resources/META-INF/services/org.eclipse.rdf4j.rio.RDFParserFactory index a35d8c31152..b40441c0ac0 100644 --- a/core/rio/trig/src/main/resources/META-INF/services/org.eclipse.rdf4j.rio.RDFParserFactory +++ b/core/rio/trig/src/main/resources/META-INF/services/org.eclipse.rdf4j.rio.RDFParserFactory @@ -1 +1,2 @@ org.eclipse.rdf4j.rio.trig.TriGParserFactory +org.eclipse.rdf4j.rio.trigstar.TriGStarParserFactory diff --git a/core/rio/trig/src/main/resources/META-INF/services/org.eclipse.rdf4j.rio.RDFWriterFactory b/core/rio/trig/src/main/resources/META-INF/services/org.eclipse.rdf4j.rio.RDFWriterFactory index 2ae1cbee93f..28dbac942e9 100644 --- a/core/rio/trig/src/main/resources/META-INF/services/org.eclipse.rdf4j.rio.RDFWriterFactory +++ b/core/rio/trig/src/main/resources/META-INF/services/org.eclipse.rdf4j.rio.RDFWriterFactory @@ -1 +1,2 @@ org.eclipse.rdf4j.rio.trig.TriGWriterFactory +org.eclipse.rdf4j.rio.trigstar.TriGStarWriterFactory diff --git a/core/rio/trig/src/test/java/org/eclipse/rdf4j/rio/trig/TriGHandlingTest.java b/core/rio/trig/src/test/java/org/eclipse/rdf4j/rio/trig/TriGHandlingTest.java index 30cadd6658a..8b0ef4c96f6 100644 --- a/core/rio/trig/src/test/java/org/eclipse/rdf4j/rio/trig/TriGHandlingTest.java +++ b/core/rio/trig/src/test/java/org/eclipse/rdf4j/rio/trig/TriGHandlingTest.java @@ -7,46 +7,21 @@ *******************************************************************************/ package org.eclipse.rdf4j.rio.trig; -import java.io.ByteArrayInputStream; import java.io.FileInputStream; import java.io.InputStream; -import java.io.StringWriter; -import java.nio.charset.StandardCharsets; +import java.io.OutputStream; import org.eclipse.rdf4j.model.Model; -import org.eclipse.rdf4j.model.Statement; import org.eclipse.rdf4j.rio.AbstractParserHandlingTest; -import org.eclipse.rdf4j.rio.RDFHandlerException; import org.eclipse.rdf4j.rio.RDFParser; import org.eclipse.rdf4j.rio.RDFWriter; /** * Test for error handling by TriG Parser. - * + * * @author Peter Ansell */ public class TriGHandlingTest extends AbstractParserHandlingTest { - - @Override - protected InputStream getUnknownDatatypeStream(Model unknownDatatypeStatements) throws Exception { - return writeTriG(unknownDatatypeStatements); - } - - @Override - protected InputStream getKnownDatatypeStream(Model knownDatatypeStatements) throws Exception { - return writeTriG(knownDatatypeStatements); - } - - @Override - protected InputStream getUnknownLanguageStream(Model unknownLanguageStatements) throws Exception { - return writeTriG(unknownLanguageStatements); - } - - @Override - protected InputStream getKnownLanguageStream(Model knownLanguageStatements) throws Exception { - return writeTriG(knownLanguageStatements); - } - @Override protected InputStream getRDFLangStringWithNoLanguageStream(Model model) throws Exception { InputStream RDFLangStringWithNoLanguageStatements = new FileInputStream( @@ -59,24 +34,8 @@ protected RDFParser getParser() { return new TriGParser(); } - /** - * Helper method to write the given model to TriG and return an InputStream containing the results. - * - * @param statements - * @return An {@link InputStream} containing the results. - * @throws RDFHandlerException - */ - private InputStream writeTriG(Model statements) throws RDFHandlerException { - StringWriter writer = new StringWriter(); - - RDFWriter trigWriter = new TriGWriter(writer); - trigWriter.startRDF(); - for (Statement nextStatement : statements) { - trigWriter.handleStatement(nextStatement); - } - trigWriter.endRDF(); - - return new ByteArrayInputStream(writer.toString().getBytes(StandardCharsets.UTF_8)); + @Override + protected RDFWriter createWriter(OutputStream output) { + return new TriGWriter(output); } - } diff --git a/core/rio/trig/src/test/java/org/eclipse/rdf4j/rio/trig/TriGParserCustomTest.java b/core/rio/trig/src/test/java/org/eclipse/rdf4j/rio/trig/TriGParserCustomTest.java index e1795c7da0f..dd045e06797 100644 --- a/core/rio/trig/src/test/java/org/eclipse/rdf4j/rio/trig/TriGParserCustomTest.java +++ b/core/rio/trig/src/test/java/org/eclipse/rdf4j/rio/trig/TriGParserCustomTest.java @@ -36,7 +36,7 @@ /** * Custom (non-manifest) tests for TriG parser. - * + * * @author Peter Ansell */ public class TriGParserCustomTest { diff --git a/core/rio/trig/src/test/java/org/eclipse/rdf4j/rio/trig/TriGPrettyWriterBackgroundTest.java b/core/rio/trig/src/test/java/org/eclipse/rdf4j/rio/trig/TriGPrettyWriterBackgroundTest.java index e23c129c00a..862e3d73b70 100644 --- a/core/rio/trig/src/test/java/org/eclipse/rdf4j/rio/trig/TriGPrettyWriterBackgroundTest.java +++ b/core/rio/trig/src/test/java/org/eclipse/rdf4j/rio/trig/TriGPrettyWriterBackgroundTest.java @@ -20,7 +20,7 @@ /** * Unit tests for the TriG pretty printing functionality - * + * * @author Peter Ansell */ public class TriGPrettyWriterBackgroundTest extends RDFWriterTest { diff --git a/core/rio/trig/src/test/java/org/eclipse/rdf4j/rio/trig/TriGPrettyWriterTest.java b/core/rio/trig/src/test/java/org/eclipse/rdf4j/rio/trig/TriGPrettyWriterTest.java index 5b3d8001fa1..95b1e36dfe4 100644 --- a/core/rio/trig/src/test/java/org/eclipse/rdf4j/rio/trig/TriGPrettyWriterTest.java +++ b/core/rio/trig/src/test/java/org/eclipse/rdf4j/rio/trig/TriGPrettyWriterTest.java @@ -13,7 +13,7 @@ /** * Unit tests for the TriG pretty printing functionality - * + * * @author Peter Ansell */ public class TriGPrettyWriterTest extends RDFWriterTest { diff --git a/core/rio/trig/src/test/java/org/eclipse/rdf4j/rio/trigstar/TriGStarHandlingTest.java b/core/rio/trig/src/test/java/org/eclipse/rdf4j/rio/trigstar/TriGStarHandlingTest.java new file mode 100644 index 00000000000..f3933944129 --- /dev/null +++ b/core/rio/trig/src/test/java/org/eclipse/rdf4j/rio/trigstar/TriGStarHandlingTest.java @@ -0,0 +1,29 @@ +/******************************************************************************* + * Copyright (c) 2020 Eclipse RDF4J contributors. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Distribution License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ +package org.eclipse.rdf4j.rio.trigstar; + +import java.io.OutputStream; + +import org.eclipse.rdf4j.rio.AbstractParserHandlingTest; +import org.eclipse.rdf4j.rio.RDFParser; +import org.eclipse.rdf4j.rio.RDFWriter; + +/** + * @author Pavel Mihaylov + */ +public class TriGStarHandlingTest extends AbstractParserHandlingTest { + @Override + protected RDFParser getParser() { + return new TriGStarParser(); + } + + @Override + protected RDFWriter createWriter(OutputStream output) { + return new TriGStarWriter(output); + } +} diff --git a/core/rio/trig/src/test/java/org/eclipse/rdf4j/rio/trigstar/TriGStarMimeTypeRDFFormatTest.java b/core/rio/trig/src/test/java/org/eclipse/rdf4j/rio/trigstar/TriGStarMimeTypeRDFFormatTest.java new file mode 100644 index 00000000000..d5a1b4c047b --- /dev/null +++ b/core/rio/trig/src/test/java/org/eclipse/rdf4j/rio/trigstar/TriGStarMimeTypeRDFFormatTest.java @@ -0,0 +1,59 @@ +/******************************************************************************* + * Copyright (c) 2020 Eclipse RDF4J contributors. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Distribution License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ +package org.eclipse.rdf4j.rio.trigstar; + +import static org.junit.Assert.assertEquals; + +import java.io.IOException; +import java.io.StringWriter; +import java.io.Writer; + +import org.eclipse.rdf4j.rio.RDFFormat; +import org.eclipse.rdf4j.rio.Rio; +import org.junit.Test; + +/** + * @author Pavel Mihaylov + */ +public class TriGStarMimeTypeRDFFormatTest { + private final RDFFormat expectedRDFFormat = RDFFormat.TRIGSTAR; + + @Test + public void testApplicationXTrigStar() { + assertEquals(expectedRDFFormat, Rio.getParserFormatForMIMEType("application/x-trigstar") + .orElseThrow(Rio.unsupportedFormat(expectedRDFFormat))); + } + + @Test + public void testApplicationXTrigStarUtf8() { + assertEquals(RDFFormat.TRIGSTAR, Rio.getParserFormatForMIMEType("application/x-trigstar;charset=UTF-8") + .orElseThrow(Rio.unsupportedFormat(expectedRDFFormat))); + } + + @Test + public void testRDFFormatParser() { + assertEquals(expectedRDFFormat, new TriGStarParser().getRDFFormat()); + } + + @Test + public void testRDFFormatWriter() throws IOException { + try (Writer w = new StringWriter()) { + assertEquals(expectedRDFFormat, new TriGStarWriter(w).getRDFFormat()); + } + } + + @Test + public void testRDFFormatParserFactory() { + assertEquals(expectedRDFFormat, new TriGStarParserFactory().getRDFFormat()); + } + + @Test + public void testRDFFormatWriterFactory() { + assertEquals(expectedRDFFormat, new TriGStarWriterFactory().getRDFFormat()); + } +} diff --git a/core/rio/trig/src/test/java/org/eclipse/rdf4j/rio/trigstar/TriGStarParserTest.java b/core/rio/trig/src/test/java/org/eclipse/rdf4j/rio/trigstar/TriGStarParserTest.java new file mode 100644 index 00000000000..294bb633251 --- /dev/null +++ b/core/rio/trig/src/test/java/org/eclipse/rdf4j/rio/trigstar/TriGStarParserTest.java @@ -0,0 +1,142 @@ +/******************************************************************************* + * Copyright (c) 2020 Eclipse RDF4J contributors. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Distribution License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ +package org.eclipse.rdf4j.rio.trigstar; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +import java.io.IOException; +import java.io.InputStream; +import java.io.Reader; +import java.io.StringReader; +import java.util.Collection; + +import org.eclipse.rdf4j.model.IRI; +import org.eclipse.rdf4j.model.Literal; +import org.eclipse.rdf4j.model.Statement; +import org.eclipse.rdf4j.model.Triple; +import org.eclipse.rdf4j.model.ValueFactory; +import org.eclipse.rdf4j.model.impl.SimpleValueFactory; +import org.eclipse.rdf4j.model.vocabulary.DCTERMS; +import org.eclipse.rdf4j.model.vocabulary.FOAF; +import org.eclipse.rdf4j.model.vocabulary.XMLSchema; +import org.eclipse.rdf4j.rio.RDFParseException; +import org.eclipse.rdf4j.rio.helpers.ParseErrorCollector; +import org.eclipse.rdf4j.rio.helpers.SimpleParseLocationListener; +import org.eclipse.rdf4j.rio.helpers.StatementCollector; +import org.junit.Before; +import org.junit.Test; + +/** + * @author Pavel Mihaylov + */ +public class TriGStarParserTest { + private TriGStarParser parser; + + private ValueFactory vf = SimpleValueFactory.getInstance(); + + private final ParseErrorCollector errorCollector = new ParseErrorCollector(); + + private final StatementCollector statementCollector = new StatementCollector(); + + private final String baseURI = "http://example.org/"; + + private SimpleParseLocationListener locationListener = new SimpleParseLocationListener(); + + @Before + public void setUp() { + parser = new TriGStarParser(); + parser.setParseErrorListener(errorCollector); + parser.setRDFHandler(statementCollector); + parser.setParseLocationListener(locationListener); + } + + @Test + public void testParseRDFStarData() throws IOException { + IRI graph = vf.createIRI("http://example.com/rdfstar"); + + IRI bob = vf.createIRI("http://example.com/bob"); + IRI alice = vf.createIRI("http://example.com/alice"); + IRI book = vf.createIRI("http://example.com/book"); + IRI otherbook = vf.createIRI("http://example.com/otherbook"); + IRI bobshomepage = vf.createIRI("http://example.com/bobshomepage"); + IRI a = vf.createIRI("http://example.org/a"); + IRI b = vf.createIRI("http://example.com/b"); + IRI c = vf.createIRI("http://example.com/c"); + IRI valid = vf.createIRI("http://example.com/valid"); + Literal abcDate = vf.createLiteral("1999-08-16", XMLSchema.DATE); + Literal birthDate = vf.createLiteral("1908-03-18", XMLSchema.DATE); + Literal titleEn = vf.createLiteral("Example book", "en"); + Literal titleDe = vf.createLiteral("Beispielbuch", "de"); + Literal titleEnUs = vf.createLiteral("Example Book", "en-US"); + + Triple bobCreatedBook = vf.createTriple(bob, DCTERMS.CREATED, book); + Triple aliceKnowsBobCreatedBook = vf.createTriple(alice, FOAF.KNOWS, bobCreatedBook); + Triple bobCreatedBookKnowsAlice = vf.createTriple(bobCreatedBook, FOAF.KNOWS, alice); + Triple bookCreatorAlice = vf.createTriple(book, DCTERMS.CREATOR, alice); + Triple aliceCreatedBook = vf.createTriple(alice, DCTERMS.CREATED, book); + Triple abc = vf.createTriple(a, b, c); + Triple bobBirthdayDate = vf.createTriple(bob, FOAF.BIRTHDAY, birthDate); + Triple bookTitleEn = vf.createTriple(book, DCTERMS.TITLE, titleEn); + Triple bookTitleDe = vf.createTriple(book, DCTERMS.TITLE, titleDe); + Triple bookTitleEnUs = vf.createTriple(book, DCTERMS.TITLE, titleEnUs); + + try (InputStream in = this.getClass().getResourceAsStream("/test-rdfstar.trigs")) { + parser.parse(in, baseURI); + + Collection stmts = statementCollector.getStatements(); + + assertEquals(10, stmts.size()); + + assertTrue(stmts.contains(vf.createStatement(bob, FOAF.KNOWS, aliceKnowsBobCreatedBook, graph))); + assertTrue(stmts.contains(vf.createStatement(bobCreatedBookKnowsAlice, DCTERMS.SOURCE, otherbook, graph))); + assertTrue(stmts.contains(vf.createStatement(bobshomepage, DCTERMS.SOURCE, bookCreatorAlice, graph))); + assertTrue(stmts.contains(vf.createStatement(bookCreatorAlice, DCTERMS.SOURCE, bobshomepage, graph))); + assertTrue(stmts.contains(vf.createStatement(bookCreatorAlice, DCTERMS.REQUIRES, aliceCreatedBook, graph))); + assertTrue(stmts.contains(vf.createStatement(abc, valid, abcDate, graph))); + assertTrue(stmts.contains(vf.createStatement(bobBirthdayDate, DCTERMS.SOURCE, bobshomepage, graph))); + assertTrue(stmts.contains(vf.createStatement(bookTitleEn, DCTERMS.SOURCE, bobshomepage, graph))); + assertTrue(stmts.contains(vf.createStatement(bookTitleDe, DCTERMS.SOURCE, bobshomepage, graph))); + assertTrue(stmts.contains(vf.createStatement(bookTitleEnUs, DCTERMS.SOURCE, bobshomepage, graph))); + } + } + + @Test + public void testTripleInPredicate() throws IOException { + String data = "@prefix ex: .\ngraph ex:G { ex:Example <<>> \"foo\"}"; + try (Reader r = new StringReader(data)) { + parser.parse(r, baseURI); + fail("Must fail with RDFParseException"); + } catch (RDFParseException e) { + assertEquals("Illegal predicate value: <> [line 2]", e.getMessage()); + } + } + + @Test + public void testTripleInGraph() throws IOException { + String data = "@prefix ex: .\ngraph << >> {ex:Example ex:p \"foo\" }"; + try (Reader r = new StringReader(data)) { + parser.parse(r, baseURI); + fail("Must fail with RDFParseException"); + } catch (RDFParseException e) { + assertEquals("Illegal context value: <> [line 2]", e.getMessage()); + } + } + + @Test + public void testTripleInDatatype() throws IOException { + String data = "@prefix ex: .\ngraph ex:g { ex:Example ex:p \"foo\"^^<<>> }"; + try (Reader r = new StringReader(data)) { + parser.parse(r, baseURI); + fail("Must fail with RDFParseException"); + } catch (RDFParseException e) { + assertEquals("Illegal datatype value: <> [line 2]", e.getMessage()); + } + } +} diff --git a/core/rio/trig/src/test/java/org/eclipse/rdf4j/rio/trigstar/TriGStarPrettyWriterTest.java b/core/rio/trig/src/test/java/org/eclipse/rdf4j/rio/trigstar/TriGStarPrettyWriterTest.java new file mode 100644 index 00000000000..62372c0f214 --- /dev/null +++ b/core/rio/trig/src/test/java/org/eclipse/rdf4j/rio/trigstar/TriGStarPrettyWriterTest.java @@ -0,0 +1,26 @@ +/******************************************************************************* + * Copyright (c) 2020 Eclipse RDF4J contributors. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Distribution License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ +package org.eclipse.rdf4j.rio.trigstar; + +import org.eclipse.rdf4j.rio.RDFWriterTest; +import org.eclipse.rdf4j.rio.WriterConfig; +import org.eclipse.rdf4j.rio.helpers.BasicWriterSettings; + +/** + * @author Pavel Mihaylov + */ +public class TriGStarPrettyWriterTest extends RDFWriterTest { + public TriGStarPrettyWriterTest() { + super(new TriGStarWriterFactory(), new TriGStarParserFactory()); + } + + @Override + protected void setupWriterConfig(WriterConfig config) { + config.set(BasicWriterSettings.PRETTY_PRINT, true); + } +} diff --git a/core/rio/trig/src/test/java/org/eclipse/rdf4j/rio/trigstar/TriGStarWriterTest.java b/core/rio/trig/src/test/java/org/eclipse/rdf4j/rio/trigstar/TriGStarWriterTest.java new file mode 100644 index 00000000000..c6eaa857c69 --- /dev/null +++ b/core/rio/trig/src/test/java/org/eclipse/rdf4j/rio/trigstar/TriGStarWriterTest.java @@ -0,0 +1,27 @@ +/******************************************************************************* + * Copyright (c) 2020 Eclipse RDF4J contributors. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Distribution License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ +package org.eclipse.rdf4j.rio.trigstar; + +import org.eclipse.rdf4j.rio.RDFWriterTest; +import org.eclipse.rdf4j.rio.WriterConfig; +import org.eclipse.rdf4j.rio.helpers.BasicWriterSettings; + +/** + * @author Pavel Mihaylov + */ +public class TriGStarWriterTest extends RDFWriterTest { + public TriGStarWriterTest() { + super(new TriGStarWriterFactory(), new TriGStarParserFactory()); + } + + @Override + protected void setupWriterConfig(WriterConfig config) { + config.set(BasicWriterSettings.PRETTY_PRINT, false); + } + +} diff --git a/core/rio/trig/src/test/resources/test-rdfstar.trigs b/core/rio/trig/src/test/resources/test-rdfstar.trigs new file mode 100644 index 00000000000..ad856bda144 --- /dev/null +++ b/core/rio/trig/src/test/resources/test-rdfstar.trigs @@ -0,0 +1,32 @@ +@prefix ex: . +@prefix dct: . +@prefix foaf: . +@prefix xsd: . +@prefix rdf: . + + +graph ex:rdfstar { + ex:bob foaf:knows << ex:alice foaf:knows<> >> . + + <<<< ex:bob dct:created ex:book >> foaf:knows ex:alice >> dct:source ex:otherbook . + + ex:bobshomepage dct:source<< ex:book dct:creator ex:alice >> . + + << ex:book dct:creator ex:alice >> dct:source ex:bobshomepage . + + << ex:book dct:creator ex:alice >> dct:requires << ex:alice dct:created ex:book >> . + + <<ex:b ex:c>>ex:valid "1999-08-16"^^xsd:date . + + << # Start of triple + ex:bob # triple subject + foaf:birthday # triple predicate + "1908-03-18"^^xsd:date # triple object + >> # end of triple + dct:source ex:bobshomepage . + + << ex:book dct:title "Example book"@en >> dct:source ex:bobshomepage . + << ex:book dct:title "Beispielbuch"@de>> dct:source ex:bobshomepage. + << ex:book dct:title "Example Book"@en-US>> dct:source ex:bobshomepage. + +} diff --git a/core/rio/trix/pom.xml b/core/rio/trix/pom.xml index 2491bd4dbdb..6eff6ab1f78 100644 --- a/core/rio/trix/pom.xml +++ b/core/rio/trix/pom.xml @@ -4,7 +4,7 @@ org.eclipse.rdf4j rdf4j-rio - 3.1.5-SNAPSHOT + 3.2.2-SNAPSHOT rdf4j-rio-trix RDF4J: Rio - TriX @@ -41,5 +41,13 @@ commons-io commons-io + + ${project.groupId} + rdf4j-rio-api + tests + test-jar + ${project.version} + test + diff --git a/core/rio/trix/src/main/java/org/eclipse/rdf4j/rio/trix/TriXParser.java b/core/rio/trix/src/main/java/org/eclipse/rdf4j/rio/trix/TriXParser.java index 1c0e6a37ae3..0226fc6ce53 100644 --- a/core/rio/trix/src/main/java/org/eclipse/rdf4j/rio/trix/TriXParser.java +++ b/core/rio/trix/src/main/java/org/eclipse/rdf4j/rio/trix/TriXParser.java @@ -53,7 +53,7 @@ /** * A parser that can parse RDF files that are in the TriX format . - * + * * @author Arjohn Kampman */ public class TriXParser extends XMLReaderBasedParser implements ErrorHandler { @@ -75,7 +75,7 @@ public TriXParser() { /** * Creates a new TriXParser that will use the supplied ValueFactory to create objects for resources, bNodes, * literals and statements. - * + * * @param valueFactory A ValueFactory. */ public TriXParser(ValueFactory valueFactory) { @@ -111,7 +111,7 @@ public Collection> getSupportedSettings() { /** * Parses the data from the supplied InputStream, using the supplied baseURI to resolve any relative URI references. - * + * * @param in The InputStream from which to read the data, must not be null. * @param baseURI The URI associated with the data in the InputStream, must not be null. * @throws IOException If an I/O error occurred while data was read from the InputStream. @@ -136,7 +136,7 @@ public void parse(InputStream in, String baseURI) throws IOException, RDFParseEx /** * Parses the data from the supplied Reader, using the supplied baseURI to resolve any relative URI references. - * + * * @param reader The Reader from which to read the data, must not be null. * @param baseURI The URI associated with the data in the InputStream, must not be null. * @throws IOException If an I/O error occurred while data was read from the InputStream. diff --git a/core/rio/trix/src/main/java/org/eclipse/rdf4j/rio/trix/TriXParserFactory.java b/core/rio/trix/src/main/java/org/eclipse/rdf4j/rio/trix/TriXParserFactory.java index 327e93b0a01..185be715a96 100644 --- a/core/rio/trix/src/main/java/org/eclipse/rdf4j/rio/trix/TriXParserFactory.java +++ b/core/rio/trix/src/main/java/org/eclipse/rdf4j/rio/trix/TriXParserFactory.java @@ -13,7 +13,7 @@ /** * An {@link RDFParserFactory} for TriX parsers. - * + * * @author Arjohn Kampman */ public class TriXParserFactory implements RDFParserFactory { diff --git a/core/rio/trix/src/main/java/org/eclipse/rdf4j/rio/trix/TriXWriter.java b/core/rio/trix/src/main/java/org/eclipse/rdf4j/rio/trix/TriXWriter.java index 5ac28d88750..3f19707d361 100644 --- a/core/rio/trix/src/main/java/org/eclipse/rdf4j/rio/trix/TriXWriter.java +++ b/core/rio/trix/src/main/java/org/eclipse/rdf4j/rio/trix/TriXWriter.java @@ -39,7 +39,7 @@ /** * An implementation of the RDFWriter interface that writes RDF documents in * TriX format. - * + * * @author Arjohn Kampman */ public class TriXWriter extends AbstractRDFWriter implements RDFWriter { @@ -50,11 +50,10 @@ public class TriXWriter extends AbstractRDFWriter implements RDFWriter { private XMLWriter xmlWriter; - private boolean writingStarted; + private boolean inActiveContext = false; - private boolean inActiveContext; - - private Resource currentContext; + private boolean convertRDFStar; + private Resource currentContext = null; /*--------------* * Constructors * @@ -62,16 +61,18 @@ public class TriXWriter extends AbstractRDFWriter implements RDFWriter { /** * Creates a new TriXWriter that will write to the supplied OutputStream. - * + * * @param out The OutputStream to write the RDF/XML document to. */ public TriXWriter(OutputStream out) { - this(new XMLWriter(out)); + super(out); + this.xmlWriter = new XMLWriter(out); + this.xmlWriter.setPrettyPrint(true); } /** * Creates a new TriXWriter that will write to the supplied Writer. - * + * * @param writer The Writer to write the RDF/XML document to. */ public TriXWriter(Writer writer) { @@ -81,10 +82,6 @@ public TriXWriter(Writer writer) { protected TriXWriter(XMLWriter xmlWriter) { this.xmlWriter = xmlWriter; this.xmlWriter.setPrettyPrint(true); - - writingStarted = false; - inActiveContext = false; - currentContext = null; } /*---------* @@ -98,9 +95,7 @@ public RDFFormat getRDFFormat() { @Override public void startRDF() throws RDFHandlerException { - if (writingStarted) { - throw new RDFHandlerException("Document writing has already started"); - } + super.startRDF(); try { @@ -112,17 +107,12 @@ public void startRDF() throws RDFHandlerException { xmlWriter.startTag(ROOT_TAG); } catch (IOException e) { throw new RDFHandlerException(e); - } finally { - writingStarted = true; } } @Override public void endRDF() throws RDFHandlerException { - if (!writingStarted) { - throw new RDFHandlerException("Document writing has not yet started"); - } - + checkWritingStarted(); try { if (inActiveContext) { xmlWriter.endTag(CONTEXT_TAG); @@ -133,22 +123,17 @@ public void endRDF() throws RDFHandlerException { xmlWriter.endDocument(); } catch (IOException e) { throw new RDFHandlerException(e); - } finally { - writingStarted = false; } } @Override public void handleNamespace(String prefix, String name) { + checkWritingStarted(); // ignore } @Override - public void handleStatement(Statement st) throws RDFHandlerException { - if (!writingStarted) { - throw new RDFHandlerException("Document writing has not yet been started"); - } - + protected void consumeStatement(Statement st) { try { Resource context = st.getContext(); @@ -184,6 +169,7 @@ public void handleStatement(Statement st) throws RDFHandlerException { @Override public void handleComment(String comment) throws RDFHandlerException { + checkWritingStarted(); try { xmlWriter.comment(comment); } catch (IOException e) { diff --git a/core/rio/trix/src/main/java/org/eclipse/rdf4j/rio/trix/TriXWriterFactory.java b/core/rio/trix/src/main/java/org/eclipse/rdf4j/rio/trix/TriXWriterFactory.java index 57225c00479..aa405489c37 100644 --- a/core/rio/trix/src/main/java/org/eclipse/rdf4j/rio/trix/TriXWriterFactory.java +++ b/core/rio/trix/src/main/java/org/eclipse/rdf4j/rio/trix/TriXWriterFactory.java @@ -16,7 +16,7 @@ /** * An {@link RDFWriterFactory} for TriX writers. - * + * * @author Arjohn Kampman */ public class TriXWriterFactory implements RDFWriterFactory { diff --git a/core/rio/trix/src/test/java/org/eclipse/rdf4j/rio/trix/TriXParserHandlingTest.java b/core/rio/trix/src/test/java/org/eclipse/rdf4j/rio/trix/TriXParserHandlingTest.java new file mode 100644 index 00000000000..368378a877b --- /dev/null +++ b/core/rio/trix/src/test/java/org/eclipse/rdf4j/rio/trix/TriXParserHandlingTest.java @@ -0,0 +1,29 @@ +/******************************************************************************* + * Copyright (c) 2020 Eclipse RDF4J contributors. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Distribution License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ +package org.eclipse.rdf4j.rio.trix; + +import java.io.OutputStream; + +import org.eclipse.rdf4j.rio.AbstractParserHandlingTest; +import org.eclipse.rdf4j.rio.RDFParser; +import org.eclipse.rdf4j.rio.RDFWriter; + +/** + * @author Pavel Mihaylov + */ +public class TriXParserHandlingTest extends AbstractParserHandlingTest { + @Override + protected RDFParser getParser() { + return new TriXParser(); + } + + @Override + protected RDFWriter createWriter(OutputStream output) { + return new TriXWriter(output); + } +} diff --git a/core/rio/trix/src/test/java/org/eclipse/rdf4j/rio/trix/TriXParserTest.java b/core/rio/trix/src/test/java/org/eclipse/rdf4j/rio/trix/TriXParserTest.java index 7b149f3471c..d954c36a510 100644 --- a/core/rio/trix/src/test/java/org/eclipse/rdf4j/rio/trix/TriXParserTest.java +++ b/core/rio/trix/src/test/java/org/eclipse/rdf4j/rio/trix/TriXParserTest.java @@ -11,10 +11,8 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.fail; -import java.io.ByteArrayOutputStream; import java.io.FileNotFoundException; import java.io.InputStream; -import java.io.PrintStream; import java.util.Locale; import org.eclipse.rdf4j.model.Statement; diff --git a/core/rio/turtle/pom.xml b/core/rio/turtle/pom.xml index 4482441932c..c7b96889554 100644 --- a/core/rio/turtle/pom.xml +++ b/core/rio/turtle/pom.xml @@ -4,7 +4,7 @@ org.eclipse.rdf4j rdf4j-rio - 3.1.5-SNAPSHOT + 3.2.2-SNAPSHOT rdf4j-rio-turtle RDF4J: Rio - Turtle diff --git a/core/rio/turtle/src/main/java/org/eclipse/rdf4j/rio/turtle/ArrangedWriter.java b/core/rio/turtle/src/main/java/org/eclipse/rdf4j/rio/turtle/ArrangedWriter.java index c81d8f0c1c3..8f40864c98d 100644 --- a/core/rio/turtle/src/main/java/org/eclipse/rdf4j/rio/turtle/ArrangedWriter.java +++ b/core/rio/turtle/src/main/java/org/eclipse/rdf4j/rio/turtle/ArrangedWriter.java @@ -26,6 +26,7 @@ import org.eclipse.rdf4j.model.Model; import org.eclipse.rdf4j.model.Resource; import org.eclipse.rdf4j.model.Statement; +import org.eclipse.rdf4j.model.Triple; import org.eclipse.rdf4j.model.Value; import org.eclipse.rdf4j.model.impl.LinkedHashModel; import org.eclipse.rdf4j.model.vocabulary.RDF; @@ -34,6 +35,7 @@ import org.eclipse.rdf4j.rio.RDFWriter; import org.eclipse.rdf4j.rio.RioSetting; import org.eclipse.rdf4j.rio.WriterConfig; +import org.eclipse.rdf4j.rio.helpers.AbstractRDFWriter; import org.eclipse.rdf4j.rio.helpers.BasicWriterSettings; /** @@ -42,7 +44,7 @@ * @author James Leigh * @since 2.3 */ -class ArrangedWriter implements RDFWriter { +public class ArrangedWriter extends AbstractRDFWriter { private final static int DEFAULT_QUEUE_SIZE = 100; @@ -73,8 +75,9 @@ class ArrangedWriter implements RDFWriter { return 1; } int cmp = p1.stringValue().compareTo(p2.stringValue()); - if (cmp != 0) + if (cmp != 0) { return cmp; + } Value o1 = s1.getObject(); Value o2 = s2.getObject(); if (o1.equals(o2)) { @@ -90,6 +93,11 @@ class ArrangedWriter implements RDFWriter { } else if (o1 instanceof IRI && !(o2 instanceof IRI)) { return 1; } + if (!(o1 instanceof Triple) && o2 instanceof Triple) { + return -1; + } else if (o1 instanceof Triple && !(o2 instanceof Triple)) { + return 1; + } int str_cmp = o1.stringValue().compareTo(o2.stringValue()); if (str_cmp != 0) { return str_cmp; @@ -112,6 +120,7 @@ public ArrangedWriter(RDFWriter delegate, int size) { } public ArrangedWriter(RDFWriter delegate, int size, boolean repeatBlankNodes) { + super(delegate.getOutputStream().orElse(null)); this.delegate = delegate; this.targetQueueSize = size; this.repeatBlankNodes = repeatBlankNodes; @@ -144,6 +153,7 @@ public RDFWriter set(RioSetting setting, T value) { @Override public void startRDF() throws RDFHandlerException { + super.startRDF(); if (getWriterConfig().get(BasicWriterSettings.INLINE_BLANK_NODES)) { targetQueueSize = -1; repeatBlankNodes = true; @@ -177,7 +187,7 @@ public void handleComment(String comment) throws RDFHandlerException { } @Override - public synchronized void handleStatement(Statement st) throws RDFHandlerException { + protected synchronized void consumeStatement(Statement st) throws RDFHandlerException { if (targetQueueSize == 0) { delegate.handleStatement(st); } else { @@ -389,22 +399,28 @@ public int hashCode() { @Override public boolean equals(Object obj) { - if (this == obj) + if (this == obj) { return true; - if (obj == null) + } + if (obj == null) { return false; - if (getClass() != obj.getClass()) + } + if (getClass() != obj.getClass()) { return false; + } SubjectInContext other = (SubjectInContext) obj; - if (!subject.equals(other.subject)) + if (!subject.equals(other.subject)) { return false; + } if (context == null) { - if (other.context != null) + if (other.context != null) { return false; - } else if (!context.equals(other.context)) + } + } else if (!context.equals(other.context)) { return false; + } return true; } } -} \ No newline at end of file +} diff --git a/core/rio/turtle/src/main/java/org/eclipse/rdf4j/rio/turtle/TurtleParser.java b/core/rio/turtle/src/main/java/org/eclipse/rdf4j/rio/turtle/TurtleParser.java index 81d03f4f494..ed989c78136 100644 --- a/core/rio/turtle/src/main/java/org/eclipse/rdf4j/rio/turtle/TurtleParser.java +++ b/core/rio/turtle/src/main/java/org/eclipse/rdf4j/rio/turtle/TurtleParser.java @@ -21,11 +21,11 @@ import org.apache.commons.io.input.BOMInputStream; import org.eclipse.rdf4j.common.text.ASCIIUtil; -import org.eclipse.rdf4j.model.BNode; import org.eclipse.rdf4j.model.IRI; import org.eclipse.rdf4j.model.Literal; import org.eclipse.rdf4j.model.Resource; import org.eclipse.rdf4j.model.Statement; +import org.eclipse.rdf4j.model.Triple; import org.eclipse.rdf4j.model.Value; import org.eclipse.rdf4j.model.ValueFactory; import org.eclipse.rdf4j.model.impl.SimpleValueFactory; @@ -49,7 +49,7 @@ * allow comments to be used inside triple constructs that extend over multiple lines, but the author's own parser * deviates from this too.

  • * - * + * * @author Arjohn Kampman * @author Peter Ansell */ @@ -630,7 +630,7 @@ protected Literal parseQuotedLiteral() throws IOException, RDFParseException, RD // Turtle // language tags do not need whitespace following the language // tag - if (c == '.' || c == ';' || c == ',' || c == ')' || c == ']' || c == -1) { + if (c == '.' || c == ';' || c == ',' || c == ')' || c == ']' || c == '>' || c == -1) { break; } if (verifyLanguageTag && !TurtleUtil.isLanguageChar(c)) { @@ -654,13 +654,13 @@ protected Literal parseQuotedLiteral() throws IOException, RDFParseException, RD // Read datatype Value datatype = parseValue(); - if (datatype instanceof Literal || datatype instanceof BNode) { - reportFatalError("Illegal datatype value: " + datatype); - } else if (datatype == null) { + if (datatype == null) { // the datatype IRI could not be parsed. report as error only if VERIFY_URI_SYNTAX is enabled, silently // skip otherwise. reportError("Invalid datatype IRI for literal '" + label + "'", BasicParserSettings.VERIFY_URI_SYNTAX); return null; + } else if (!(datatype instanceof IRI)) { + reportFatalError("Illegal datatype value: " + datatype); } return createLiteral(label, null, (IRI) datatype, getLineNumber(), -1); } else { @@ -670,7 +670,7 @@ protected Literal parseQuotedLiteral() throws IOException, RDFParseException, RD /** * Parses a quoted string, which is either a "normal string" or a """long string""". - * + * * @return string * @throws IOException * @throws RDFParseException @@ -710,7 +710,7 @@ protected String parseQuotedString() throws IOException, RDFParseException { /** * Parses a "normal string". This method requires that the opening character has already been parsed. - * + * * @return parsed string * @throws IOException * @throws RDFParseException @@ -1329,7 +1329,7 @@ private StringBuilder getBuilder() { /** * Appends the characters from codepoint into the string builder. This is the same as Character#toChars but prevents * the additional char array garbage for BMP codepoints. - * + * * @param dst the destination in which to append the characters * @param codePoint the codepoint to be appended */ @@ -1343,4 +1343,55 @@ private static void appendCodepoint(StringBuilder dst, int codePoint) { throw new IllegalArgumentException("Invalid codepoint " + codePoint); } } + + /** + * Peeks at the next two Unicode code points without advancing the reader and returns true if they indicate the + * start of an RDF* triple value. Such values start with '<<'. + * + * @return true if the next code points indicate the beginning of an RDF* triple value, false otherwise + * @throws IOException + */ + protected boolean peekIsTripleValue() throws IOException { + int c0 = readCodePoint(); + int c1 = readCodePoint(); + unread(c1); + unread(c0); + + return c0 == '<' && c1 == '<'; + } + + /** + * Parser an RDF* triple value and returns it. + * + * @return An RDF* triple. + * @throws IOException + */ + protected Triple parseTripleValue() throws IOException { + verifyCharacterOrFail(readCodePoint(), "<"); + verifyCharacterOrFail(readCodePoint(), "<"); + skipWSC(); + Value subject = parseValue(); + if (subject instanceof Resource) { + skipWSC(); + Value predicate = parseValue(); + if (predicate instanceof IRI) { + skipWSC(); + Value object = parseValue(); + if (object != null) { + skipWSC(); + verifyCharacterOrFail(readCodePoint(), ">"); + verifyCharacterOrFail(readCodePoint(), ">"); + return valueFactory.createTriple((Resource) subject, (IRI) predicate, object); + } else { + reportFatalError("Missing object in RDF* triple"); + } + } else { + reportFatalError("Illegal predicate value in RDF* triple: " + predicate); + } + } else { + reportFatalError("Illegal subject val in RDF* triple: " + subject); + } + + return null; + } } diff --git a/core/rio/turtle/src/main/java/org/eclipse/rdf4j/rio/turtle/TurtleParserFactory.java b/core/rio/turtle/src/main/java/org/eclipse/rdf4j/rio/turtle/TurtleParserFactory.java index f4241f2f6a7..8cbb7b879f3 100644 --- a/core/rio/turtle/src/main/java/org/eclipse/rdf4j/rio/turtle/TurtleParserFactory.java +++ b/core/rio/turtle/src/main/java/org/eclipse/rdf4j/rio/turtle/TurtleParserFactory.java @@ -13,7 +13,7 @@ /** * An {@link RDFParserFactory} for Turtle parsers. - * + * * @author Arjohn Kampman */ public class TurtleParserFactory implements RDFParserFactory { diff --git a/core/rio/turtle/src/main/java/org/eclipse/rdf4j/rio/turtle/TurtleUtil.java b/core/rio/turtle/src/main/java/org/eclipse/rdf4j/rio/turtle/TurtleUtil.java index 71cec6caa13..f5180f99f3b 100644 --- a/core/rio/turtle/src/main/java/org/eclipse/rdf4j/rio/turtle/TurtleUtil.java +++ b/core/rio/turtle/src/main/java/org/eclipse/rdf4j/rio/turtle/TurtleUtil.java @@ -16,7 +16,7 @@ /** * Utility methods for Turtle encoding/decoding. - * + * * @see Turtle: Terse RDF Triple Language */ public class TurtleUtil { @@ -34,7 +34,7 @@ public class TurtleUtil { /** * Tries to find an index where the supplied URI can be split into a namespace and a local name that comply with the * serialization constraints of the Turtle format. - * + * * @param uri The URI to split. * @return The index where the supplied URI can be split, or -1 if the URI cannot be split. */ @@ -77,7 +77,7 @@ public static int findURISplitIndex(String uri) { /** * Check if the supplied code point represents a whitespace character - * + * * @param codePoint a Unicode code point * @return true if the supplied code point represents a whitespace character, false * otherwise. @@ -137,7 +137,7 @@ public static boolean isPN_CHARS(int codePoint) { /** * Check if the supplied code point represents a valid prefixed name start character. - * + * * @param codePoint a Unicode code point. * @return true if the supplied code point represents a valid prefixed name start char, false * otherwise. @@ -148,7 +148,7 @@ public static boolean isPrefixStartChar(int codePoint) { /** * Check if the supplied code point represents a valid start character for a blank node label. - * + * * @param codePoint a Unicode code point. * @return true if the supplied code point represents a valid blank node label start char, * false otherwise. @@ -159,7 +159,7 @@ public static boolean isBLANK_NODE_LABEL_StartChar(int codePoint) { /** * Check if the supplied code point represents a valid blank node label character. - * + * * @param codePoint a Unicode code point. * @return true if the supplied code point represents a valid blank node label char, false * otherwise. @@ -170,7 +170,7 @@ public static boolean isBLANK_NODE_LABEL_Char(int codePoint) { /** * Check if the supplied code point represents a valid blank node label end character. - * + * * @param codePoint a Unicode code point. * @return true if the supplied code point represents a valid blank node label end char, * false otherwise. @@ -181,7 +181,7 @@ public static boolean isBLANK_NODE_LABEL_EndChar(int codePoint) { /** * Check if the supplied code point represents a valid name start character. - * + * * @param codePoint a Unicode code point. * @return true if the supplied code point represents a valid name start char, false * otherwise. @@ -193,7 +193,7 @@ public static boolean isNameStartChar(int codePoint) { /** * Check if the supplied code point represents a valid name character. - * + * * @param codePoint a Unicode code point. * @return true if the supplied code point represents a valid name char, false otherwise. */ @@ -203,7 +203,7 @@ public static boolean isNameChar(int codePoint) { /** * Check if the supplied code point represents a valid name end character. - * + * * @param codePoint a Unicode code point. * @return true if the supplied code point represents a valid name end char, false * otherwise. @@ -214,7 +214,7 @@ public static boolean isNameEndChar(int codePoint) { /** * Check if the supplied code point represents a valid local escaped character. - * + * * @param codePoint a Unicode code point. * @return true if the supplied code point represents a valid local escaped char, false * otherwise. @@ -225,7 +225,7 @@ public static boolean isLocalEscapedChar(int codePoint) { /** * Check if the supplied code point represents a valid prefix character. - * + * * @param codePoint a Unicode code point. * @return true if the supplied code point represents a valid prefix char, false * otherwise. @@ -236,7 +236,7 @@ public static boolean isPrefixChar(int codePoint) { /** * Check if the supplied code point represents a valid language tag start character. - * + * * @param codePoint a Unicode code point. * @return true if the supplied code point represents a valid language tag start char, * false otherwise. @@ -247,7 +247,7 @@ public static boolean isLanguageStartChar(int codePoint) { /** * Check if the supplied code point represents a valid language tag character. - * + * * @param codePoint a Unicode code point. * @return true if the supplied code point represents a valid language tag char, false * otherwise. @@ -262,7 +262,7 @@ public static boolean isLanguageChar(int codePoint) { * http://www.w3.org/TR/turtle/#grammar-production-PN_PREFIX *

    * [167s] PN_PREFIX ::= PN_CHARS_BASE ((PN_CHARS | '.')* PN_CHARS)? - * + * * @param prefix a prefix string. * @return true if the supplied prefix conforms to Turtle grammar rules */ @@ -407,7 +407,7 @@ public static boolean isPN_LOCAL(String name) { /** * Encodes the supplied string for inclusion as a 'normal' string in a Turtle document. - * + * * @param s * @return encoded string */ @@ -422,7 +422,7 @@ public static String encodeString(String s) { /** * Encodes the supplied string for inclusion as a long string in a Turtle document. - * + * * @param s * @return encoded long string */ @@ -437,7 +437,7 @@ public static String encodeLongString(String s) { /** * Encodes the supplied string for inclusion as a (relative) URI in a Turtle document. - * + * * @param s */ @Deprecated @@ -458,7 +458,7 @@ public static String encodeURIString(String s) { /** * Decodes an encoded Turtle string. Any \-escape sequences are substituted with their decoded value. - * + * * @param s An encoded Turtle string. * @return The unencoded string. * @exception IllegalArgumentException If the supplied string is not a correctly encoded Turtle string. diff --git a/core/rio/turtle/src/main/java/org/eclipse/rdf4j/rio/turtle/TurtleWriter.java b/core/rio/turtle/src/main/java/org/eclipse/rdf4j/rio/turtle/TurtleWriter.java index 954ed87f6db..49e91408bd5 100644 --- a/core/rio/turtle/src/main/java/org/eclipse/rdf4j/rio/turtle/TurtleWriter.java +++ b/core/rio/turtle/src/main/java/org/eclipse/rdf4j/rio/turtle/TurtleWriter.java @@ -13,7 +13,6 @@ import java.io.Writer; import java.nio.charset.StandardCharsets; import java.util.Deque; -import java.util.LinkedHashMap; import java.util.LinkedList; import java.util.Map; import java.util.StringTokenizer; @@ -27,6 +26,7 @@ import org.eclipse.rdf4j.model.Model; import org.eclipse.rdf4j.model.Resource; import org.eclipse.rdf4j.model.Statement; +import org.eclipse.rdf4j.model.Triple; import org.eclipse.rdf4j.model.Value; import org.eclipse.rdf4j.model.datatypes.XMLDatatypeUtil; import org.eclipse.rdf4j.model.impl.SimpleIRI; @@ -62,12 +62,11 @@ public class TurtleWriter extends AbstractRDFWriter implements RDFWriter { protected ParsedIRI baseIRI; protected IndentingWriter writer; - protected boolean writingStarted; /** * Flag indicating whether the last written statement has been closed. */ - protected boolean statementClosed; + protected boolean statementClosed = true; protected Resource lastWrittenSubject; protected IRI lastWrittenPredicate; @@ -104,7 +103,9 @@ public TurtleWriter(OutputStream out) { * @param baseIRI */ public TurtleWriter(OutputStream out, ParsedIRI baseIRI) { - this(new OutputStreamWriter(out, StandardCharsets.UTF_8), baseIRI); + super(out); + this.baseIRI = baseIRI; + this.writer = new IndentingWriter(new OutputStreamWriter(out, StandardCharsets.UTF_8)); } /** @@ -125,11 +126,6 @@ public TurtleWriter(Writer writer) { public TurtleWriter(Writer writer, ParsedIRI baseIRI) { this.baseIRI = baseIRI; this.writer = new IndentingWriter(writer); - namespaceTable = new LinkedHashMap<>(); - writingStarted = false; - statementClosed = true; - lastWrittenSubject = null; - lastWrittenPredicate = null; } /*---------* @@ -143,11 +139,7 @@ public RDFFormat getRDFFormat() { @Override public void startRDF() throws RDFHandlerException { - if (writingStarted) { - throw new RuntimeException("Document writing has already started"); - } - - writingStarted = true; + super.startRDF(); try { xsdStringToPlainLiteral = getWriterConfig().get(BasicWriterSettings.XSD_STRING_TO_PLAIN_LITERAL); @@ -180,22 +172,18 @@ public void startRDF() throws RDFHandlerException { @Override public void endRDF() throws RDFHandlerException { - if (!writingStarted) { - throw new RuntimeException("Document writing has not yet started"); - } - + checkWritingStarted(); try { closePreviousStatement(); writer.flush(); } catch (IOException e) { throw new RDFHandlerException(e); - } finally { - writingStarted = false; } } @Override public void handleNamespace(String prefix, String name) throws RDFHandlerException { + checkWritingStarted(); try { if (!namespaceTable.containsKey(name)) { // Namespace not yet mapped to a prefix, try to give it the @@ -223,11 +211,9 @@ public void handleNamespace(String prefix, String name) throws RDFHandlerExcepti namespaceTable.put(name, prefix); - if (writingStarted) { - closePreviousStatement(); + closePreviousStatement(); - writeNamespace(prefix, name); - } + writeNamespace(prefix, name); } } catch (IOException e) { throw new RDFHandlerException(e); @@ -235,11 +221,7 @@ public void handleNamespace(String prefix, String name) throws RDFHandlerExcepti } @Override - public void handleStatement(Statement st) throws RDFHandlerException { - if (!writingStarted) { - throw new RuntimeException("Document writing has not yet been started"); - } - + protected void consumeStatement(Statement st) throws RDFHandlerException { try { Resource subj = st.getSubject(); IRI pred = st.getPredicate(); @@ -258,7 +240,7 @@ public void handleStatement(Statement st) throws RDFHandlerException { /** * Internal method that differentiates between the pretty-print and streaming writer cases. - * + * * @param st The next statement to write * @param endRDFCalled True if endRDF has been called before this method is called. This is used to buffer * statements for pretty-printing before dumping them when all statements have been @@ -329,6 +311,7 @@ protected void handleStatementInternal(Statement st, boolean endRDFCalled, boole @Override public void handleComment(String comment) throws RDFHandlerException { + checkWritingStarted(); try { closePreviousStatement(); @@ -393,7 +376,7 @@ protected void writeValue(Value val) throws IOException { * Writes a value, optionally shortening it if it is an {@link IRI} and has a namespace definition that is suitable * for use in this context for shortening or a {@link BNode} that has been confirmed to be able to be shortened in * this context. - * + * * @param val The {@link Value} to write. * @param canShorten True if, in the current context, we can shorten this value if it is an instance of * {@link BNode} . @@ -423,7 +406,7 @@ protected void writeResource(Resource res) throws IOException { * Writes a {@link Resource}, optionally shortening it if it is an {@link IRI} and has a namespace definition that * is suitable for use in this context for shortening or a {@link BNode} that has been confirmed to be able to be * shortened in this context. - * + * * @param res The {@link Resource} to write. * @param canShorten True if, in the current context, we can shorten this value if it is an instance of * {@link BNode} . @@ -432,8 +415,10 @@ protected void writeResource(Resource res) throws IOException { protected void writeResource(Resource res, boolean canShorten) throws IOException { if (res instanceof IRI) { writeURI((IRI) res); - } else { + } else if (res instanceof BNode) { writeBNode((BNode) res, canShorten); + } else { + writeTriple((Triple) res, canShorten); } } @@ -516,6 +501,25 @@ protected void writeBNode(BNode bNode, boolean canShorten) throws IOException { } } + protected void writeTriple(Triple triple, boolean canShorten) throws IOException { + throw new IOException(getRDFFormat().getName() + " does not support RDF* triples"); + } + + protected void writeTripleRDFStar(Triple triple, boolean canShorten) throws IOException { + writer.write("<<"); + writeResource(triple.getSubject()); + writer.write(" "); + writeURI(triple.getPredicate()); + writer.write(" "); + Value object = triple.getObject(); + if (object instanceof Literal) { + writeLiteral((Literal) object); + } else { + writeResource((Resource) object, canShorten); + } + writer.write(">>"); + } + protected void writeLiteral(Literal lit) throws IOException { String label = lit.getLabel(); IRI datatype = lit.getDatatype(); diff --git a/core/rio/turtle/src/main/java/org/eclipse/rdf4j/rio/turtle/TurtleWriterFactory.java b/core/rio/turtle/src/main/java/org/eclipse/rdf4j/rio/turtle/TurtleWriterFactory.java index 4beb10a4e1c..c2cf63b61ca 100644 --- a/core/rio/turtle/src/main/java/org/eclipse/rdf4j/rio/turtle/TurtleWriterFactory.java +++ b/core/rio/turtle/src/main/java/org/eclipse/rdf4j/rio/turtle/TurtleWriterFactory.java @@ -18,7 +18,7 @@ /** * An {@link RDFWriterFactory} for Turtle writers. - * + * * @author Arjohn Kampman */ public class TurtleWriterFactory implements RDFWriterFactory { diff --git a/core/rio/turtle/src/main/java/org/eclipse/rdf4j/rio/turtlestar/TurtleStarParser.java b/core/rio/turtle/src/main/java/org/eclipse/rdf4j/rio/turtlestar/TurtleStarParser.java new file mode 100644 index 00000000000..00b962aeed6 --- /dev/null +++ b/core/rio/turtle/src/main/java/org/eclipse/rdf4j/rio/turtlestar/TurtleStarParser.java @@ -0,0 +1,55 @@ +/******************************************************************************* + * Copyright (c) 2020 Eclipse RDF4J contributors. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Distribution License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ +package org.eclipse.rdf4j.rio.turtlestar; + +import java.io.IOException; + +import org.eclipse.rdf4j.model.Value; +import org.eclipse.rdf4j.model.ValueFactory; +import org.eclipse.rdf4j.model.impl.SimpleValueFactory; +import org.eclipse.rdf4j.rio.RDFFormat; +import org.eclipse.rdf4j.rio.RDFHandlerException; +import org.eclipse.rdf4j.rio.RDFParseException; +import org.eclipse.rdf4j.rio.turtle.TurtleParser; + +/** + * RDF parser for Turtle* (an extension of Turtle that adds RDF* support). + * + * @author Pavel Mihaylov + */ +public class TurtleStarParser extends TurtleParser { + /** + * Creates a new TurtleStarParser that will use a {@link SimpleValueFactory} to create RDF* model objects. + */ + public TurtleStarParser() { + super(); + } + + /** + * Creates a new TurtleStarParser that will use the supplied ValueFactory to create RDF* model objects. + * + * @param valueFactory A ValueFactory. + */ + public TurtleStarParser(ValueFactory valueFactory) { + super(valueFactory); + } + + @Override + public RDFFormat getRDFFormat() { + return RDFFormat.TURTLESTAR; + } + + @Override + protected Value parseValue() throws IOException, RDFParseException, RDFHandlerException { + if (peekIsTripleValue()) { + return parseTripleValue(); + } + + return super.parseValue(); + } +} diff --git a/core/rio/turtle/src/main/java/org/eclipse/rdf4j/rio/turtlestar/TurtleStarParserFactory.java b/core/rio/turtle/src/main/java/org/eclipse/rdf4j/rio/turtlestar/TurtleStarParserFactory.java new file mode 100644 index 00000000000..f5fab79fcac --- /dev/null +++ b/core/rio/turtle/src/main/java/org/eclipse/rdf4j/rio/turtlestar/TurtleStarParserFactory.java @@ -0,0 +1,35 @@ +/******************************************************************************* + * Copyright (c) 2020 Eclipse RDF4J contributors. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Distribution License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ +package org.eclipse.rdf4j.rio.turtlestar; + +import org.eclipse.rdf4j.rio.RDFFormat; +import org.eclipse.rdf4j.rio.RDFParser; +import org.eclipse.rdf4j.rio.RDFParserFactory; + +/** + * An {@link RDFParserFactory} for Turtle* parsers. + * + * @author Pavel Mihaylov + */ +public class TurtleStarParserFactory implements RDFParserFactory { + /** + * Returns {@link RDFFormat#TURTLESTAR}. + */ + @Override + public RDFFormat getRDFFormat() { + return RDFFormat.TURTLESTAR; + } + + /** + * Returns a new instance of {@link TurtleStarParser}. + */ + @Override + public RDFParser getParser() { + return new TurtleStarParser(); + } +} diff --git a/core/rio/turtle/src/main/java/org/eclipse/rdf4j/rio/turtlestar/TurtleStarWriter.java b/core/rio/turtle/src/main/java/org/eclipse/rdf4j/rio/turtlestar/TurtleStarWriter.java new file mode 100644 index 00000000000..14386342b1a --- /dev/null +++ b/core/rio/turtle/src/main/java/org/eclipse/rdf4j/rio/turtlestar/TurtleStarWriter.java @@ -0,0 +1,72 @@ +/******************************************************************************* + * Copyright (c) 2020 Eclipse RDF4J contributors. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Distribution License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ +package org.eclipse.rdf4j.rio.turtlestar; + +import java.io.IOException; +import java.io.OutputStream; +import java.io.Writer; + +import org.eclipse.rdf4j.common.net.ParsedIRI; +import org.eclipse.rdf4j.model.Triple; +import org.eclipse.rdf4j.rio.RDFFormat; +import org.eclipse.rdf4j.rio.turtle.TurtleWriter; + +/** + * An extension of {@link TurtleWriter} that writes RDF* documents in the Turtle* format by including the RDF* triples. + * + * @author Pavel Mihaylov + */ +public class TurtleStarWriter extends TurtleWriter { + /** + * Creates a new TurtleStarWriter that will write to the supplied OutputStream. + * + * @param out The OutputStream to write the TurtleStar document to. + */ + public TurtleStarWriter(OutputStream out) { + super(out); + } + + /** + * Creates a new TurtleStarWriter that will write to the supplied OutputStream using the supplied base IRI. + * + * @param out The OutputStream to write the TurtleStar document to. + * @param baseIRI The base IRI to use. + */ + public TurtleStarWriter(OutputStream out, ParsedIRI baseIRI) { + super(out, baseIRI); + } + + /** + * Creates a new TurtleStarWriter that will write to the supplied Writer. + * + * @param writer The Writer to write the TurtleStar document to. + */ + public TurtleStarWriter(Writer writer) { + super(writer); + } + + /** + * Creates a new TurtleStarWriter that will write to the supplied Writer using the supplied base IRI. + * + * @param writer The Writer to write the Turtle document to. + * @param baseIRI The base IRI to use. + */ + public TurtleStarWriter(Writer writer, ParsedIRI baseIRI) { + super(writer, baseIRI); + } + + @Override + public RDFFormat getRDFFormat() { + return RDFFormat.TURTLESTAR; + } + + @Override + protected void writeTriple(Triple triple, boolean canShorten) throws IOException { + writeTripleRDFStar(triple, canShorten); + } +} diff --git a/core/rio/turtle/src/main/java/org/eclipse/rdf4j/rio/turtlestar/TurtleStarWriterFactory.java b/core/rio/turtle/src/main/java/org/eclipse/rdf4j/rio/turtlestar/TurtleStarWriterFactory.java new file mode 100644 index 00000000000..d10d36d7efd --- /dev/null +++ b/core/rio/turtle/src/main/java/org/eclipse/rdf4j/rio/turtlestar/TurtleStarWriterFactory.java @@ -0,0 +1,60 @@ +/******************************************************************************* + * Copyright (c) 2020 Eclipse RDF4J contributors. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Distribution License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ +package org.eclipse.rdf4j.rio.turtlestar; + +import java.io.OutputStream; +import java.io.Writer; +import java.net.URISyntaxException; + +import org.eclipse.rdf4j.common.net.ParsedIRI; +import org.eclipse.rdf4j.rio.RDFFormat; +import org.eclipse.rdf4j.rio.RDFWriter; +import org.eclipse.rdf4j.rio.RDFWriterFactory; +import org.eclipse.rdf4j.rio.turtle.ArrangedWriter; + +/** + * An {@link RDFWriterFactory} for Turtle* writers. + * + * @author Pavel Mihaylov + */ +public class TurtleStarWriterFactory implements RDFWriterFactory { + + /** + * Returns {@link RDFFormat#TURTLESTAR}. + */ + @Override + public RDFFormat getRDFFormat() { + return RDFFormat.TURTLESTAR; + } + + /** + * Returns a new instance of {@link TurtleStarWriter}. + */ + @Override + public RDFWriter getWriter(OutputStream out) { + return new ArrangedWriter(new TurtleStarWriter(out)); + } + + @Override + public RDFWriter getWriter(OutputStream out, String baseURI) throws URISyntaxException { + return new ArrangedWriter(new TurtleStarWriter(out, new ParsedIRI(baseURI))); + } + + /** + * Returns a new instance of {@link TurtleStarWriter}. + */ + @Override + public RDFWriter getWriter(Writer writer) { + return new ArrangedWriter(new TurtleStarWriter(writer)); + } + + @Override + public RDFWriter getWriter(Writer writer, String baseURI) throws URISyntaxException { + return new ArrangedWriter(new TurtleStarWriter(writer, new ParsedIRI(baseURI))); + } +} diff --git a/core/rio/turtle/src/main/resources/META-INF/services/org.eclipse.rdf4j.rio.RDFParserFactory b/core/rio/turtle/src/main/resources/META-INF/services/org.eclipse.rdf4j.rio.RDFParserFactory index 8d96d58a7f9..e5b8f6a09d5 100644 --- a/core/rio/turtle/src/main/resources/META-INF/services/org.eclipse.rdf4j.rio.RDFParserFactory +++ b/core/rio/turtle/src/main/resources/META-INF/services/org.eclipse.rdf4j.rio.RDFParserFactory @@ -1 +1,2 @@ org.eclipse.rdf4j.rio.turtle.TurtleParserFactory +org.eclipse.rdf4j.rio.turtlestar.TurtleStarParserFactory diff --git a/core/rio/turtle/src/main/resources/META-INF/services/org.eclipse.rdf4j.rio.RDFWriterFactory b/core/rio/turtle/src/main/resources/META-INF/services/org.eclipse.rdf4j.rio.RDFWriterFactory index 90e6730bb3f..402d2558478 100644 --- a/core/rio/turtle/src/main/resources/META-INF/services/org.eclipse.rdf4j.rio.RDFWriterFactory +++ b/core/rio/turtle/src/main/resources/META-INF/services/org.eclipse.rdf4j.rio.RDFWriterFactory @@ -1 +1,2 @@ org.eclipse.rdf4j.rio.turtle.TurtleWriterFactory +org.eclipse.rdf4j.rio.turtlestar.TurtleStarWriterFactory diff --git a/core/rio/turtle/src/test/java/org/eclipse/rdf4j/rio/turtle/TurtleHandlingTest.java b/core/rio/turtle/src/test/java/org/eclipse/rdf4j/rio/turtle/TurtleHandlingTest.java index c7fac7e5700..efe1274f7a1 100644 --- a/core/rio/turtle/src/test/java/org/eclipse/rdf4j/rio/turtle/TurtleHandlingTest.java +++ b/core/rio/turtle/src/test/java/org/eclipse/rdf4j/rio/turtle/TurtleHandlingTest.java @@ -7,46 +7,21 @@ *******************************************************************************/ package org.eclipse.rdf4j.rio.turtle; -import java.io.ByteArrayInputStream; import java.io.FileInputStream; import java.io.InputStream; -import java.io.StringWriter; -import java.nio.charset.StandardCharsets; +import java.io.OutputStream; import org.eclipse.rdf4j.model.Model; -import org.eclipse.rdf4j.model.Statement; import org.eclipse.rdf4j.rio.AbstractParserHandlingTest; -import org.eclipse.rdf4j.rio.RDFHandlerException; import org.eclipse.rdf4j.rio.RDFParser; import org.eclipse.rdf4j.rio.RDFWriter; /** * Test for error handling by Turtle Parser. - * + * * @author Peter Ansell */ public class TurtleHandlingTest extends AbstractParserHandlingTest { - - @Override - protected InputStream getUnknownDatatypeStream(Model unknownDatatypeStatements) throws Exception { - return writeTurtle(unknownDatatypeStatements); - } - - @Override - protected InputStream getKnownDatatypeStream(Model knownDatatypeStatements) throws Exception { - return writeTurtle(knownDatatypeStatements); - } - - @Override - protected InputStream getUnknownLanguageStream(Model unknownLanguageStatements) throws Exception { - return writeTurtle(unknownLanguageStatements); - } - - @Override - protected InputStream getKnownLanguageStream(Model knownLanguageStatements) throws Exception { - return writeTurtle(knownLanguageStatements); - } - @Override protected InputStream getRDFLangStringWithNoLanguageStream(Model model) throws Exception { InputStream RDFLangStringWithNoLanguageStatements = new FileInputStream( @@ -59,24 +34,8 @@ protected RDFParser getParser() { return new TurtleParser(); } - /** - * Helper method to write the given model to Turtle and return an InputStream containing the results. - * - * @param statements - * @return An {@link InputStream} containing the results. - * @throws RDFHandlerException - */ - private InputStream writeTurtle(Model statements) throws RDFHandlerException { - StringWriter writer = new StringWriter(); - - RDFWriter turtleWriter = new TurtleWriter(writer); - turtleWriter.startRDF(); - for (Statement nextStatement : statements) { - turtleWriter.handleStatement(nextStatement); - } - turtleWriter.endRDF(); - - return new ByteArrayInputStream(writer.toString().getBytes(StandardCharsets.UTF_8)); + @Override + protected RDFWriter createWriter(OutputStream output) { + return new TurtleWriter(output); } - } diff --git a/core/rio/turtle/src/test/java/org/eclipse/rdf4j/rio/turtle/TurtleUtilTest.java b/core/rio/turtle/src/test/java/org/eclipse/rdf4j/rio/turtle/TurtleUtilTest.java index dd9c5a0bba1..569f04ce1fb 100644 --- a/core/rio/turtle/src/test/java/org/eclipse/rdf4j/rio/turtle/TurtleUtilTest.java +++ b/core/rio/turtle/src/test/java/org/eclipse/rdf4j/rio/turtle/TurtleUtilTest.java @@ -16,7 +16,7 @@ /** * Test for the utility methods in {@link TurtleUtil}. - * + * * @author Peter Ansell */ public class TurtleUtilTest { diff --git a/core/rio/turtle/src/test/java/org/eclipse/rdf4j/rio/turtlestar/TurtleStarHandlingTest.java b/core/rio/turtle/src/test/java/org/eclipse/rdf4j/rio/turtlestar/TurtleStarHandlingTest.java new file mode 100644 index 00000000000..0ec6e42d7c8 --- /dev/null +++ b/core/rio/turtle/src/test/java/org/eclipse/rdf4j/rio/turtlestar/TurtleStarHandlingTest.java @@ -0,0 +1,29 @@ +/******************************************************************************* + * Copyright (c) 2020 Eclipse RDF4J contributors. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Distribution License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ +package org.eclipse.rdf4j.rio.turtlestar; + +import java.io.OutputStream; + +import org.eclipse.rdf4j.rio.AbstractParserHandlingTest; +import org.eclipse.rdf4j.rio.RDFParser; +import org.eclipse.rdf4j.rio.RDFWriter; + +/** + * @author Pavel Mihaylov + */ +public class TurtleStarHandlingTest extends AbstractParserHandlingTest { + @Override + protected RDFParser getParser() { + return new TurtleStarParser(); + } + + @Override + protected RDFWriter createWriter(OutputStream output) { + return new TurtleStarWriter(output); + } +} diff --git a/core/rio/turtle/src/test/java/org/eclipse/rdf4j/rio/turtlestar/TurtleStarMimeTypeRDFFormatTest.java b/core/rio/turtle/src/test/java/org/eclipse/rdf4j/rio/turtlestar/TurtleStarMimeTypeRDFFormatTest.java new file mode 100644 index 00000000000..181d7e2d36b --- /dev/null +++ b/core/rio/turtle/src/test/java/org/eclipse/rdf4j/rio/turtlestar/TurtleStarMimeTypeRDFFormatTest.java @@ -0,0 +1,59 @@ +/******************************************************************************* + * Copyright (c) 2020 Eclipse RDF4J contributors. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Distribution License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ +package org.eclipse.rdf4j.rio.turtlestar; + +import static org.junit.Assert.assertEquals; + +import java.io.IOException; +import java.io.StringWriter; +import java.io.Writer; + +import org.eclipse.rdf4j.rio.RDFFormat; +import org.eclipse.rdf4j.rio.Rio; +import org.junit.Test; + +/** + * @author Pavel Mihaylov + */ +public class TurtleStarMimeTypeRDFFormatTest { + private final RDFFormat expectedRDFFormat = RDFFormat.TURTLESTAR; + + @Test + public void testApplicationXTurtleStarUtf8() { + assertEquals(expectedRDFFormat, Rio.getParserFormatForMIMEType("application/x-turtlestar;charset=UTF-8") + .orElseThrow(Rio.unsupportedFormat(expectedRDFFormat))); + } + + @Test + public void testApplicationXTurtleStar() { + assertEquals(expectedRDFFormat, Rio.getParserFormatForMIMEType("application/x-turtlestar") + .orElseThrow(Rio.unsupportedFormat(expectedRDFFormat))); + } + + @Test + public void testRDFFormatParser() { + assertEquals(expectedRDFFormat, new TurtleStarParser().getRDFFormat()); + } + + @Test + public void testRDFFormatWriter() throws IOException { + try (Writer w = new StringWriter()) { + assertEquals(expectedRDFFormat, new TurtleStarWriter(w).getRDFFormat()); + } + } + + @Test + public void testRDFFormatParserFactory() { + assertEquals(expectedRDFFormat, new TurtleStarParserFactory().getRDFFormat()); + } + + @Test + public void testRDFFormatWriterFactory() { + assertEquals(expectedRDFFormat, new TurtleStarWriterFactory().getRDFFormat()); + } +} diff --git a/core/rio/turtle/src/test/java/org/eclipse/rdf4j/rio/turtlestar/TurtleStarParserTest.java b/core/rio/turtle/src/test/java/org/eclipse/rdf4j/rio/turtlestar/TurtleStarParserTest.java new file mode 100644 index 00000000000..614f9e0b4a1 --- /dev/null +++ b/core/rio/turtle/src/test/java/org/eclipse/rdf4j/rio/turtlestar/TurtleStarParserTest.java @@ -0,0 +1,129 @@ +/******************************************************************************* + * Copyright (c) 2020 Eclipse RDF4J contributors. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Distribution License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ +package org.eclipse.rdf4j.rio.turtlestar; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +import java.io.IOException; +import java.io.InputStream; +import java.io.Reader; +import java.io.StringReader; +import java.util.Collection; + +import org.eclipse.rdf4j.model.IRI; +import org.eclipse.rdf4j.model.Literal; +import org.eclipse.rdf4j.model.Statement; +import org.eclipse.rdf4j.model.Triple; +import org.eclipse.rdf4j.model.ValueFactory; +import org.eclipse.rdf4j.model.impl.SimpleValueFactory; +import org.eclipse.rdf4j.model.vocabulary.DCTERMS; +import org.eclipse.rdf4j.model.vocabulary.FOAF; +import org.eclipse.rdf4j.model.vocabulary.XMLSchema; +import org.eclipse.rdf4j.rio.RDFParseException; +import org.eclipse.rdf4j.rio.helpers.ParseErrorCollector; +import org.eclipse.rdf4j.rio.helpers.SimpleParseLocationListener; +import org.eclipse.rdf4j.rio.helpers.StatementCollector; +import org.junit.Before; +import org.junit.Test; + +/** + * @author Pavel Mihaylov + */ +public class TurtleStarParserTest { + private TurtleStarParser parser; + + private ValueFactory vf = SimpleValueFactory.getInstance(); + + private final ParseErrorCollector errorCollector = new ParseErrorCollector(); + + private final StatementCollector statementCollector = new StatementCollector(); + + private final String baseURI = "http://example.org/"; + + private SimpleParseLocationListener locationListener = new SimpleParseLocationListener(); + + @Before + public void setUp() { + parser = new TurtleStarParser(); + parser.setParseErrorListener(errorCollector); + parser.setRDFHandler(statementCollector); + parser.setParseLocationListener(locationListener); + } + + @Test + public void testParseRDFStarData() throws IOException { + IRI bob = vf.createIRI("http://example.com/bob"); + IRI alice = vf.createIRI("http://example.com/alice"); + IRI book = vf.createIRI("http://example.com/book"); + IRI otherbook = vf.createIRI("http://example.com/otherbook"); + IRI bobshomepage = vf.createIRI("http://example.com/bobshomepage"); + IRI a = vf.createIRI("http://example.org/a"); + IRI b = vf.createIRI("http://example.com/b"); + IRI c = vf.createIRI("http://example.com/c"); + IRI valid = vf.createIRI("http://example.com/valid"); + Literal abcDate = vf.createLiteral("1999-08-16", XMLSchema.DATE); + Literal birthDate = vf.createLiteral("1908-03-18", XMLSchema.DATE); + Literal titleEn = vf.createLiteral("Example book", "en"); + Literal titleDe = vf.createLiteral("Beispielbuch", "de"); + Literal titleEnUs = vf.createLiteral("Example Book", "en-US"); + + Triple bobCreatedBook = vf.createTriple(bob, DCTERMS.CREATED, book); + Triple aliceKnowsBobCreatedBook = vf.createTriple(alice, FOAF.KNOWS, bobCreatedBook); + Triple bobCreatedBookKnowsAlice = vf.createTriple(bobCreatedBook, FOAF.KNOWS, alice); + Triple bookCreatorAlice = vf.createTriple(book, DCTERMS.CREATOR, alice); + Triple aliceCreatedBook = vf.createTriple(alice, DCTERMS.CREATED, book); + Triple abc = vf.createTriple(a, b, c); + Triple bobBirthdayDate = vf.createTriple(bob, FOAF.BIRTHDAY, birthDate); + Triple bookTitleEn = vf.createTriple(book, DCTERMS.TITLE, titleEn); + Triple bookTitleDe = vf.createTriple(book, DCTERMS.TITLE, titleDe); + Triple bookTitleEnUs = vf.createTriple(book, DCTERMS.TITLE, titleEnUs); + + try (InputStream in = this.getClass().getResourceAsStream("/test-rdfstar.ttls")) { + parser.parse(in, baseURI); + + Collection stmts = statementCollector.getStatements(); + + assertEquals(10, stmts.size()); + + assertTrue(stmts.contains(vf.createStatement(bob, FOAF.KNOWS, aliceKnowsBobCreatedBook))); + assertTrue(stmts.contains(vf.createStatement(bobCreatedBookKnowsAlice, DCTERMS.SOURCE, otherbook))); + assertTrue(stmts.contains(vf.createStatement(bobshomepage, DCTERMS.SOURCE, bookCreatorAlice))); + assertTrue(stmts.contains(vf.createStatement(bookCreatorAlice, DCTERMS.SOURCE, bobshomepage))); + assertTrue(stmts.contains(vf.createStatement(bookCreatorAlice, DCTERMS.REQUIRES, aliceCreatedBook))); + assertTrue(stmts.contains(vf.createStatement(abc, valid, abcDate))); + assertTrue(stmts.contains(vf.createStatement(bobBirthdayDate, DCTERMS.SOURCE, bobshomepage))); + assertTrue(stmts.contains(vf.createStatement(bookTitleEn, DCTERMS.SOURCE, bobshomepage))); + assertTrue(stmts.contains(vf.createStatement(bookTitleDe, DCTERMS.SOURCE, bobshomepage))); + assertTrue(stmts.contains(vf.createStatement(bookTitleEnUs, DCTERMS.SOURCE, bobshomepage))); + } + } + + @Test + public void testTripleInPredicate() throws IOException { + String data = "@prefix ex: .\nex:Example << >> \"foo\" ."; + try (Reader r = new StringReader(data)) { + parser.parse(r, baseURI); + fail("Must fail with RDFParseException"); + } catch (RDFParseException e) { + assertEquals("Illegal predicate value: <> [line 2]", e.getMessage()); + } + } + + @Test + public void testTripleInDatatype() throws IOException { + String data = "@prefix ex: .\nex:Example ex:p \"foo\"^^<< >> ."; + try (Reader r = new StringReader(data)) { + parser.parse(r, baseURI); + fail("Must fail with RDFParseException"); + } catch (RDFParseException e) { + assertEquals("Illegal datatype value: <> [line 2]", e.getMessage()); + } + } +} diff --git a/core/rio/turtle/src/test/java/org/eclipse/rdf4j/rio/turtlestar/TurtleStarPrettyWriterTest.java b/core/rio/turtle/src/test/java/org/eclipse/rdf4j/rio/turtlestar/TurtleStarPrettyWriterTest.java new file mode 100644 index 00000000000..e9d38263fbb --- /dev/null +++ b/core/rio/turtle/src/test/java/org/eclipse/rdf4j/rio/turtlestar/TurtleStarPrettyWriterTest.java @@ -0,0 +1,26 @@ +/******************************************************************************* + * Copyright (c) 2020 Eclipse RDF4J contributors. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Distribution License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ +package org.eclipse.rdf4j.rio.turtlestar; + +import org.eclipse.rdf4j.rio.RDFWriterTest; +import org.eclipse.rdf4j.rio.WriterConfig; +import org.eclipse.rdf4j.rio.helpers.BasicWriterSettings; + +/** + * @author Pavel Mihaylov + */ +public class TurtleStarPrettyWriterTest extends RDFWriterTest { + public TurtleStarPrettyWriterTest() { + super(new TurtleStarWriterFactory(), new TurtleStarParserFactory()); + } + + @Override + protected void setupWriterConfig(WriterConfig config) { + config.set(BasicWriterSettings.PRETTY_PRINT, true); + } +} diff --git a/core/rio/turtle/src/test/java/org/eclipse/rdf4j/rio/turtlestar/TurtleStarWriterTest.java b/core/rio/turtle/src/test/java/org/eclipse/rdf4j/rio/turtlestar/TurtleStarWriterTest.java new file mode 100644 index 00000000000..1878e0dfe16 --- /dev/null +++ b/core/rio/turtle/src/test/java/org/eclipse/rdf4j/rio/turtlestar/TurtleStarWriterTest.java @@ -0,0 +1,26 @@ +/******************************************************************************* + * Copyright (c) 2020 Eclipse RDF4J contributors. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Distribution License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ +package org.eclipse.rdf4j.rio.turtlestar; + +import org.eclipse.rdf4j.rio.RDFWriterTest; +import org.eclipse.rdf4j.rio.WriterConfig; +import org.eclipse.rdf4j.rio.helpers.BasicWriterSettings; + +/** + * @author Pavel Mihaylov + */ +public class TurtleStarWriterTest extends RDFWriterTest { + public TurtleStarWriterTest() { + super(new TurtleStarWriterFactory(), new TurtleStarParserFactory()); + } + + @Override + protected void setupWriterConfig(WriterConfig config) { + config.set(BasicWriterSettings.PRETTY_PRINT, false); + } +} diff --git a/core/rio/turtle/src/test/resources/test-rdfstar.ttls b/core/rio/turtle/src/test/resources/test-rdfstar.ttls new file mode 100644 index 00000000000..d5f7ef395d9 --- /dev/null +++ b/core/rio/turtle/src/test/resources/test-rdfstar.ttls @@ -0,0 +1,29 @@ +@prefix ex: . +@prefix dct: . +@prefix foaf: . +@prefix xsd: . +@prefix rdf: . + + +ex:bob foaf:knows << ex:alice foaf:knows<> >> . + +<<<< ex:bob dct:created ex:book >> foaf:knows ex:alice >> dct:source ex:otherbook . + +ex:bobshomepage dct:source<< ex:book dct:creator ex:alice >> . + +<< ex:book dct:creator ex:alice >> dct:source ex:bobshomepage . + +<< ex:book dct:creator ex:alice >> dct:requires << ex:alice dct:created ex:book >> . + +<<ex:b ex:c>>ex:valid "1999-08-16"^^xsd:date . + +<< # Start of triple + ex:bob # triple subject + foaf:birthday # triple predicate + "1908-03-18"^^xsd:date # triple object +>> # end of triple +dct:source ex:bobshomepage . + +<< ex:book dct:title "Example book"@en >> dct:source ex:bobshomepage . +<< ex:book dct:title "Beispielbuch"@de>> dct:source ex:bobshomepage. +<< ex:book dct:title "Example Book"@en-US>> dct:source ex:bobshomepage. diff --git a/core/sail/api/pom.xml b/core/sail/api/pom.xml index 9b5d28ec563..7c665955caf 100644 --- a/core/sail/api/pom.xml +++ b/core/sail/api/pom.xml @@ -4,7 +4,7 @@ org.eclipse.rdf4j rdf4j-sail - 3.1.5-SNAPSHOT + 3.2.2-SNAPSHOT rdf4j-sail-api RDF4J: Sail API diff --git a/core/sail/api/src/main/java/org/eclipse/rdf4j/common/concurrent/locks/AbstractReadWriteLockManager.java b/core/sail/api/src/main/java/org/eclipse/rdf4j/common/concurrent/locks/AbstractReadWriteLockManager.java index 503df1d053a..07e75a3481b 100644 --- a/core/sail/api/src/main/java/org/eclipse/rdf4j/common/concurrent/locks/AbstractReadWriteLockManager.java +++ b/core/sail/api/src/main/java/org/eclipse/rdf4j/common/concurrent/locks/AbstractReadWriteLockManager.java @@ -10,7 +10,7 @@ /** * An abstract base implementation of a read/write lock manager. - * + * * @author Arjohn Kampman * @author James Leigh */ @@ -43,7 +43,7 @@ public AbstractReadWriteLockManager() { /** * Creates a new MultiReadSingleWriteLockManager, optionally with lock tracking enabled. - * + * * @param trackLocks Controls whether the lock manager will keep track of active locks. Enabling lock tracking will * add some overhead, but can be very useful for debugging. */ @@ -73,7 +73,7 @@ protected boolean isReaderActive() { /** * Blocks current thread until after the writer lock is released (if active). - * + * * @throws InterruptedException */ protected void waitForActiveWriter() throws InterruptedException { @@ -82,7 +82,7 @@ protected void waitForActiveWriter() throws InterruptedException { /** * Blocks current thread until there are no reader locks active. - * + * * @throws InterruptedException */ protected void waitForActiveReaders() throws InterruptedException { @@ -92,7 +92,7 @@ protected void waitForActiveReaders() throws InterruptedException { /** * Creates a new Lock for reading and increments counter for active readers. The lock is tracked if lock tracking is * enabled. This method is not thread safe itself, the calling method is expected to handle synchronization issues. - * + * * @return a read lock. */ protected Lock createReadLock() { @@ -102,7 +102,7 @@ protected Lock createReadLock() { /** * Creates a new Lock for writing. The lock is tracked if lock tracking is enabled. This method is not thread safe * itself for performance reasons, the calling method is expected to handle synchronization issues. - * + * * @return a write lock. */ protected Lock createWriteLock() { diff --git a/core/sail/api/src/main/java/org/eclipse/rdf4j/common/concurrent/locks/ExclusiveLockManager.java b/core/sail/api/src/main/java/org/eclipse/rdf4j/common/concurrent/locks/ExclusiveLockManager.java index df9d56f33c8..9f8de27118f 100644 --- a/core/sail/api/src/main/java/org/eclipse/rdf4j/common/concurrent/locks/ExclusiveLockManager.java +++ b/core/sail/api/src/main/java/org/eclipse/rdf4j/common/concurrent/locks/ExclusiveLockManager.java @@ -10,7 +10,7 @@ /** * A lock manager for exclusive locks. - * + * * @author Arjohn Kampman * @author James Leigh */ @@ -35,7 +35,7 @@ public ExclusiveLockManager() { /** * Creates an ExclusiveLockManager. - * + * * @param trackLocks If create stack traces should be logged */ public ExclusiveLockManager(boolean trackLocks) { diff --git a/core/sail/api/src/main/java/org/eclipse/rdf4j/common/concurrent/locks/LockingIteration.java b/core/sail/api/src/main/java/org/eclipse/rdf4j/common/concurrent/locks/LockingIteration.java index 4e6d0e4b1a0..792442ba4df 100644 --- a/core/sail/api/src/main/java/org/eclipse/rdf4j/common/concurrent/locks/LockingIteration.java +++ b/core/sail/api/src/main/java/org/eclipse/rdf4j/common/concurrent/locks/LockingIteration.java @@ -34,7 +34,7 @@ public class LockingIteration extends IterationWrappernull. * @param iter The underlying Iteration, must not be null. */ diff --git a/core/sail/api/src/main/java/org/eclipse/rdf4j/common/concurrent/locks/Properties.java b/core/sail/api/src/main/java/org/eclipse/rdf4j/common/concurrent/locks/Properties.java index 22a51547da0..6d8d0159819 100644 --- a/core/sail/api/src/main/java/org/eclipse/rdf4j/common/concurrent/locks/Properties.java +++ b/core/sail/api/src/main/java/org/eclipse/rdf4j/common/concurrent/locks/Properties.java @@ -11,7 +11,7 @@ /** * Class controlling various logging properties such as the amount of lock tracking that is done for debugging (at the * cost of performance). - * + * * @author Arjohn Kampman */ public class Properties { diff --git a/core/sail/api/src/main/java/org/eclipse/rdf4j/common/concurrent/locks/ReadWriteLockManager.java b/core/sail/api/src/main/java/org/eclipse/rdf4j/common/concurrent/locks/ReadWriteLockManager.java index a0d0118fdc7..98d65c1c146 100644 --- a/core/sail/api/src/main/java/org/eclipse/rdf4j/common/concurrent/locks/ReadWriteLockManager.java +++ b/core/sail/api/src/main/java/org/eclipse/rdf4j/common/concurrent/locks/ReadWriteLockManager.java @@ -12,7 +12,7 @@ * A lock manager that manages a multi-read, single-write lock. This lock manager allows multiple read locks to be * active at the same time. The write lock is exclusive, meaning that no other read- or write locks may be active at the * same time. - * + * * @author Arjohn Kampman */ public interface ReadWriteLockManager { @@ -25,7 +25,7 @@ public interface ReadWriteLockManager { /** * Gets a read lock. This method blocks until the read lock is available. - * + * * @throws InterruptedException In case the thread requesting the lock was {@link Thread#interrupt() interrupted}. */ public Lock getReadLock() throws InterruptedException; @@ -38,7 +38,7 @@ public interface ReadWriteLockManager { /** * Gets an exclusive write lock. This method blocks until the write lock is available. - * + * * @throws InterruptedException In case the thread requesting the lock was {@link Thread#interrupt() interrupted}. */ public Lock getWriteLock() throws InterruptedException; diff --git a/core/sail/api/src/main/java/org/eclipse/rdf4j/common/concurrent/locks/WritePrefReadWriteLockManager.java b/core/sail/api/src/main/java/org/eclipse/rdf4j/common/concurrent/locks/WritePrefReadWriteLockManager.java index da6f85836be..b9c9f0c66ff 100644 --- a/core/sail/api/src/main/java/org/eclipse/rdf4j/common/concurrent/locks/WritePrefReadWriteLockManager.java +++ b/core/sail/api/src/main/java/org/eclipse/rdf4j/common/concurrent/locks/WritePrefReadWriteLockManager.java @@ -11,7 +11,7 @@ /** * A read/write lock manager with writer preference. As soon as a write lock is requested, this lock manager will block * any read lock requests until the writer's request has been satisfied. - * + * * @author Arjohn Kampman * @author James Leigh */ @@ -39,7 +39,7 @@ public WritePrefReadWriteLockManager() { /** * Creates a new MultiReadSingleWriteLockManager, optionally with lock tracking enabled. - * + * * @param trackLocks Controls whether the lock manager will keep track of active locks. Enabling lock tracking will * add some overhead, but can be very useful for debugging. */ @@ -77,8 +77,9 @@ public Lock tryReadLock() { public Lock getReadLock() throws InterruptedException { while (true) { Lock lock = tryReadLock(); - if (lock != null) + if (lock != null) { return lock; + } waitForActiveWriter(); } } diff --git a/core/sail/api/src/main/java/org/eclipse/rdf4j/sail/LockManager.java b/core/sail/api/src/main/java/org/eclipse/rdf4j/sail/LockManager.java index 3660322d2dc..f2b43ea8f14 100644 --- a/core/sail/api/src/main/java/org/eclipse/rdf4j/sail/LockManager.java +++ b/core/sail/api/src/main/java/org/eclipse/rdf4j/sail/LockManager.java @@ -21,21 +21,21 @@ public interface LockManager { /** * Determines if the SAIL is locked. - * + * * @return true if the SAIL is already locked. */ boolean isLocked(); /** * Creates a lock in a SAIL if it does not yet exist. - * + * * @return a newly acquired lock or null if the SAIL is already locked. */ Lock tryLock(); /** * Creates a lock in a SAIL if it does not yet exist. - * + * * @return a newly acquired lock. * @throws SailLockedException if the directory is already locked. */ @@ -43,9 +43,9 @@ public interface LockManager { /** * Revokes a lock owned by another process. - * + * * @return true if a lock was successfully revoked. */ boolean revokeLock(); -} \ No newline at end of file +} diff --git a/core/sail/api/src/main/java/org/eclipse/rdf4j/sail/NotifyingSail.java b/core/sail/api/src/main/java/org/eclipse/rdf4j/sail/NotifyingSail.java index cb3259ce80b..cc948796dcd 100644 --- a/core/sail/api/src/main/java/org/eclipse/rdf4j/sail/NotifyingSail.java +++ b/core/sail/api/src/main/java/org/eclipse/rdf4j/sail/NotifyingSail.java @@ -10,7 +10,7 @@ /** * An interface for {@link Sail}s that notify registered {@link SailChangedListener}s of changes in the data in the * Sail. - * + * * @author James Leigh */ public interface NotifyingSail extends Sail { @@ -18,19 +18,19 @@ public interface NotifyingSail extends Sail { /** * Opens a connection on the Sail which can be used to query and update data. Depending on how the implementation * handles concurrent access, a call to this method might block when there is another open connection on this Sail. - * + * * @throws SailException If no transaction could be started, for example because the Sail is not writable. */ @Override - public NotifyingSailConnection getConnection() throws SailException; + NotifyingSailConnection getConnection() throws SailException; /** * Adds the specified SailChangedListener to receive events when the data in this Sail object changes. */ - public void addSailChangedListener(SailChangedListener listener); + void addSailChangedListener(SailChangedListener listener); /** * Removes the specified SailChangedListener so that it no longer receives events from this Sail object. */ - public void removeSailChangedListener(SailChangedListener listener); + void removeSailChangedListener(SailChangedListener listener); } diff --git a/core/sail/api/src/main/java/org/eclipse/rdf4j/sail/NotifyingSailConnection.java b/core/sail/api/src/main/java/org/eclipse/rdf4j/sail/NotifyingSailConnection.java index 45aa3301dc9..b7c0710bfb0 100644 --- a/core/sail/api/src/main/java/org/eclipse/rdf4j/sail/NotifyingSailConnection.java +++ b/core/sail/api/src/main/java/org/eclipse/rdf4j/sail/NotifyingSailConnection.java @@ -11,7 +11,7 @@ * A connection to an RDF Sail object. A SailConnection is active from the moment it is created until it is closed. Care * should be taken to properly close SailConnections as they might block concurrent queries and/or updates on the Sail * while active, depending on the Sail-implementation that is being used. - * + * * @author James Leigh */ public interface NotifyingSailConnection extends SailConnection { @@ -19,16 +19,16 @@ public interface NotifyingSailConnection extends SailConnection { /** * Registers a SailConnection listener with this SailConnection. The listener should be notified of any statements * that are added or removed as part of this SailConnection. - * + * * @param listener A SailConnectionListener. */ - public void addConnectionListener(SailConnectionListener listener); + void addConnectionListener(SailConnectionListener listener); /** * Deregisters a SailConnection listener with this SailConnection. - * + * * @param listener A SailConnectionListener. */ - public void removeConnectionListener(SailConnectionListener listener); + void removeConnectionListener(SailConnectionListener listener); } diff --git a/core/sail/api/src/main/java/org/eclipse/rdf4j/sail/Sail.java b/core/sail/api/src/main/java/org/eclipse/rdf4j/sail/Sail.java index 6c17478237a..81ecab67056 100644 --- a/core/sail/api/src/main/java/org/eclipse/rdf4j/sail/Sail.java +++ b/core/sail/api/src/main/java/org/eclipse/rdf4j/sail/Sail.java @@ -18,7 +18,7 @@ * queries over them. Statements can be stored in named contexts or in the null context. Contexts can be used to group * sets of statements that logically belong together, for example because they come from the same source. Both URIs and * blank nodes can be used as context identifiers. - * + * * @author Arjohn Kampman */ public interface Sail { @@ -26,14 +26,14 @@ public interface Sail { /** * Sets the data directory for the Sail. The Sail can use this directory for storage of data, parameters, etc. This * directory must be set before the Sail is {@link #initialize() initialized}. - * + * * @throws IllegalStateException If this method is called when the Sail has already been initialized. */ void setDataDir(File dataDir); /** * Gets the Sail's data directory. - * + * * @see #setDataDir(File) */ File getDataDir(); @@ -41,7 +41,7 @@ public interface Sail { /** * Initializes the Sail. Care should be taken that required initialization parameters have been set before this * method is called. Please consult the specific Sail implementation for information about the relevant parameters. - * + * * @throws SailException If the Sail could not be initialized. * @deprecated Use {{@link #init()} instead. */ @@ -51,9 +51,9 @@ public interface Sail { /** * Initializes the Sail. Care should be taken that required initialization parameters have been set before this * method is called. Please consult the specific Sail implementation for information about the relevant parameters. - * + * * @throws SailException If the Sail could not be initialized. - * + * * @since 2.5 */ default void init() throws SailException { @@ -64,7 +64,7 @@ default void init() throws SailException { * Shuts down the Sail, giving it the opportunity to synchronize any stale data. Care should be taken that all * initialized Sails are being shut down before an application exits to avoid potential loss of data. Once shut * down, a Sail can no longer be used until it is re-initialized. - * + * * @throws SailException If the Sail object encountered an error or unexpected situation internally. */ void shutDown() throws SailException; @@ -77,7 +77,7 @@ default void init() throws SailException { /** * Opens a connection on the Sail which can be used to query and update data. Depending on how the implementation * handles concurrent access, a call to this method might block when there is another open connection on this Sail. - * + * * @throws SailException If no transaction could be started, for example because the Sail is not writable. * @throws IllegalStateException If the Sail has not been initialized or has been shut down. */ @@ -85,14 +85,14 @@ default void init() throws SailException { /** * Gets a ValueFactory object that can be used to create IRI-, blank node-, literal- and statement objects. - * + * * @return a ValueFactory object for this Sail object. */ ValueFactory getValueFactory(); /** * Retrieve the {@link IsolationLevel}s supported by this SAIL, ordered by increasing complexity. - * + * * @return a non-empty List of supported Isolation Levels, in order of increasing complexity. Every SAIL supports at * least one {@link IsolationLevel}. */ @@ -100,7 +100,7 @@ default void init() throws SailException { /** * Retrieves the default {@link IsolationLevel} level on which transactions in this Sail operate. - * + * * @return the {@link IsolationLevel} that will be used with {@link SailConnection#begin()}, for SAIL connections * returned by {@link #getConnection()}. */ diff --git a/core/sail/api/src/main/java/org/eclipse/rdf4j/sail/SailChangedEvent.java b/core/sail/api/src/main/java/org/eclipse/rdf4j/sail/SailChangedEvent.java index ef15334297b..3456ed63f6b 100644 --- a/core/sail/api/src/main/java/org/eclipse/rdf4j/sail/SailChangedEvent.java +++ b/core/sail/api/src/main/java/org/eclipse/rdf4j/sail/SailChangedEvent.java @@ -16,20 +16,20 @@ public interface SailChangedEvent { /** * The Sail object that sent this event. */ - public Sail getSail(); + Sail getSail(); /** * Indicates if statements were added to the Sail. * * @return true if statements were added during a transaction, false otherwise. */ - public boolean statementsAdded(); + boolean statementsAdded(); /** * Indicates if statements were removed from the Sail. * * @return true if statements were removed during a transaction, false otherwise. */ - public boolean statementsRemoved(); + boolean statementsRemoved(); } diff --git a/core/sail/api/src/main/java/org/eclipse/rdf4j/sail/SailChangedListener.java b/core/sail/api/src/main/java/org/eclipse/rdf4j/sail/SailChangedListener.java index 99a60227700..ef204d7b8df 100644 --- a/core/sail/api/src/main/java/org/eclipse/rdf4j/sail/SailChangedListener.java +++ b/core/sail/api/src/main/java/org/eclipse/rdf4j/sail/SailChangedListener.java @@ -15,5 +15,5 @@ public interface SailChangedListener { /** * Notifies the listener of a change to the data of a specific Sail. */ - public void sailChanged(SailChangedEvent event); + void sailChanged(SailChangedEvent event); } diff --git a/core/sail/api/src/main/java/org/eclipse/rdf4j/sail/SailConnection.java b/core/sail/api/src/main/java/org/eclipse/rdf4j/sail/SailConnection.java index 879dc43d47e..e31fd5d31da 100644 --- a/core/sail/api/src/main/java/org/eclipse/rdf4j/sail/SailConnection.java +++ b/core/sail/api/src/main/java/org/eclipse/rdf4j/sail/SailConnection.java @@ -7,7 +7,10 @@ *******************************************************************************/ package org.eclipse.rdf4j.sail; +import java.util.Optional; + import org.eclipse.rdf4j.IsolationLevel; +import org.eclipse.rdf4j.common.annotation.Experimental; import org.eclipse.rdf4j.common.iteration.CloseableIteration; import org.eclipse.rdf4j.model.IRI; import org.eclipse.rdf4j.model.Namespace; @@ -17,9 +20,12 @@ import org.eclipse.rdf4j.model.Value; import org.eclipse.rdf4j.query.BindingSet; import org.eclipse.rdf4j.query.Dataset; +import org.eclipse.rdf4j.query.Query; import org.eclipse.rdf4j.query.QueryEvaluationException; +import org.eclipse.rdf4j.query.QueryLanguage; import org.eclipse.rdf4j.query.algebra.TupleExpr; import org.eclipse.rdf4j.query.algebra.UpdateExpr; +import org.eclipse.rdf4j.query.explanation.Explanation; /** * A connection to an RDF Sail object. A SailConnection is active from the moment it is created until it is closed. Care @@ -37,14 +43,32 @@ public interface SailConnection extends AutoCloseable { * * @see SailConnection#close */ - public boolean isOpen() throws SailException; + boolean isOpen() throws SailException; /** * Closes the connection. Any updates that haven't been committed yet will be rolled back. The connection can no * longer be used once it is closed. */ @Override - public void close() throws SailException; + void close() throws SailException; + + /** + * Allows the SailConnection to bypass the standard query parser and provide its own internal {@link TupleExpr} + * implementation. By default this method returns an empty result, signaling that it will rely on the RDF4J query + * parser. + * + * @param ql the query language. + * @param type indicates if the supplied query is a graph, tuple, or boolean query + * @param query the unparsed query string + * @param baseURI the provided base URI. May be null or empty. + * @return an optional TupleExpr that represents a sail-specific version of the query, which {@link #evaluate} can + * process. Returns {@link Optional#empty()} if the Sail does not provide its own query processing. + * @since 3.2.0 + */ + default Optional prepareQuery(QueryLanguage ql, Query.QueryType type, String query, + String baseURI) { + return Optional.empty(); + } /** * Evaluates the supplied TupleExpr on the data contained in this Sail object, using the (optional) dataset and @@ -61,7 +85,7 @@ public interface SailConnection extends AutoCloseable { * @throws SailException If the Sail object encountered an error or unexpected situation internally. * @throws IllegalStateException If the connection has been closed. */ - public CloseableIteration evaluate(TupleExpr tupleExpr, + CloseableIteration evaluate(TupleExpr tupleExpr, Dataset dataset, BindingSet bindings, boolean includeInferred) throws SailException; /** @@ -70,7 +94,7 @@ public CloseableIteration evalua * @return An iterator over the context identifiers, should not contain any duplicates. * @throws IllegalStateException If the connection has been closed. */ - public CloseableIteration getContextIDs() throws SailException; + CloseableIteration getContextIDs() throws SailException; /** * Gets all statements from the specified contexts that have a specific subject, predicate and/or object. All three @@ -89,7 +113,7 @@ public CloseableIteration evalua * @throws SailException If the Sail object encountered an error or unexpected situation internally. * @throws IllegalStateException If the connection has been closed. */ - public CloseableIteration getStatements(Resource subj, IRI pred, Value obj, + CloseableIteration getStatements(Resource subj, IRI pred, Value obj, boolean includeInferred, Resource... contexts) throws SailException; /** @@ -139,7 +163,7 @@ default boolean hasStatement(Resource subj, IRI pred, Value obj, boolean include * @return The number of explicit statements in this store, or in the specified context(s). * @throws IllegalStateException If the connection has been closed. */ - public long size(Resource... contexts) throws SailException; + long size(Resource... contexts) throws SailException; /** * Begins a transaction requiring {@link #commit()} or {@link #rollback()} to be called to close the transaction. @@ -149,7 +173,7 @@ default boolean hasStatement(Resource subj, IRI pred, Value obj, boolean include * @throws SailException If the connection could not start a transaction or if a transaction is already active on * this connection. */ - public void begin() throws SailException; + void begin() throws SailException; /** * Begins a transaction with the specified {@link IsolationLevel} level, requiring {@link #commit()} or @@ -161,7 +185,7 @@ default boolean hasStatement(Resource subj, IRI pred, Value obj, boolean include * transaction isolation level is not supported, or if a transaction is * already active on this connection. */ - public void begin(IsolationLevel level) throws UnknownSailTransactionStateException, SailException; + void begin(IsolationLevel level) throws UnknownSailTransactionStateException, SailException; /** * Flushes any pending updates and notify changes to listeners as appropriate. This is an optional call; calling or @@ -173,7 +197,7 @@ default boolean hasStatement(Resource subj, IRI pred, Value obj, boolean include * active. * @throws IllegalStateException If the connection has been closed. */ - public void flush() throws SailException; + void flush() throws SailException; /** * Checks for an error state in the active transaction that would force the transaction to be rolled back. This is @@ -192,7 +216,7 @@ default boolean hasStatement(Resource subj, IRI pred, Value obj, boolean include * @throws IllegalStateException If the connection has been closed or prepare was already called by * another thread. */ - public void prepare() throws SailException; + void prepare() throws SailException; /** * Commits any updates that have been performed since the last time {@link #commit()} or {@link #rollback()} was @@ -205,7 +229,7 @@ default boolean hasStatement(Resource subj, IRI pred, Value obj, boolean include * @throws SailException If the SailConnection could not be committed. * @throws IllegalStateException If the connection has been closed. */ - public void commit() throws SailException; + void commit() throws SailException; /** * Rolls back the transaction, discarding any uncommitted changes that have been made in this SailConnection. @@ -217,7 +241,7 @@ default boolean hasStatement(Resource subj, IRI pred, Value obj, boolean include * @throws SailException If the SailConnection could not be rolled back. * @throws IllegalStateException If the connection has been closed. */ - public void rollback() throws SailException; + void rollback() throws SailException; /** * Indicates if a transaction is currently active on the connection. A transaction is active if {@link #begin()} has @@ -228,7 +252,7 @@ default boolean hasStatement(Resource subj, IRI pred, Value obj, boolean include * instance when communication between client and server fails or times * out). */ - public boolean isActive() throws UnknownSailTransactionStateException; + boolean isActive() throws UnknownSailTransactionStateException; /** * Adds a statement to the store. @@ -241,7 +265,7 @@ default boolean hasStatement(Resource subj, IRI pred, Value obj, boolean include * @throws SailException If the statement could not be added, for example because no transaction is active. * @throws IllegalStateException If the connection has been closed. */ - public void addStatement(Resource subj, IRI pred, Value obj, Resource... contexts) throws SailException; + void addStatement(Resource subj, IRI pred, Value obj, Resource... contexts) throws SailException; /** * @deprecated since 4.0. Use {@link #addStatement(Resource, IRI, Value, Resource...)} instead. @@ -265,11 +289,12 @@ default void addStatement(Resource subj, URI pred, Value obj, Resource... contex * active. * @throws IllegalStateException If the connection has been closed. */ - public void removeStatements(Resource subj, IRI pred, Value obj, Resource... contexts) throws SailException; + void removeStatements(Resource subj, IRI pred, Value obj, Resource... contexts) throws SailException; /** * @deprecated since 4.0. Use {@link #removeStatements(Resource, IRI, Value, Resource...)} instead. */ + @Deprecated default void removeStatements(Resource subj, URI pred, Value obj, Resource... contexts) throws SailException { removeStatements(subj, (IRI) pred, obj, contexts); } @@ -282,7 +307,7 @@ default void removeStatements(Resource subj, URI pred, Value obj, Resource... co * * @throws SailException */ - public void startUpdate(UpdateContext op) throws SailException; + void startUpdate(UpdateContext op) throws SailException; /** * Adds a statement to the store. Called when adding statements through a {@link UpdateExpr} operation. @@ -296,7 +321,7 @@ default void removeStatements(Resource subj, URI pred, Value obj, Resource... co * @throws SailException If the statement could not be added, for example because no transaction is active. * @throws IllegalStateException If the connection has been closed. */ - public void addStatement(UpdateContext op, Resource subj, IRI pred, Value obj, Resource... contexts) + void addStatement(UpdateContext op, Resource subj, IRI pred, Value obj, Resource... contexts) throws SailException; /** @@ -324,7 +349,7 @@ default void addStatement(UpdateContext op, Resource subj, URI pred, Value obj, * active. * @throws IllegalStateException If the connection has been closed. */ - public void removeStatement(UpdateContext op, Resource subj, IRI pred, Value obj, Resource... contexts) + void removeStatement(UpdateContext op, Resource subj, IRI pred, Value obj, Resource... contexts) throws SailException; /** @@ -343,7 +368,7 @@ default void removeStatement(UpdateContext op, Resource subj, URI pred, Value ob * @param op * @throws SailException */ - public void endUpdate(UpdateContext op) throws SailException; + void endUpdate(UpdateContext op) throws SailException; /** * Removes all statements from the specified/all contexts. If no contexts are specified the method operates on the @@ -355,7 +380,7 @@ default void removeStatement(UpdateContext op, Resource subj, URI pred, Value ob * @throws SailException If the statements could not be removed. * @throws IllegalStateException If the connection has been closed. */ - public void clear(Resource... contexts) throws SailException; + void clear(Resource... contexts) throws SailException; /** * Gets the namespaces relevant to the data contained in this Sail object. @@ -364,7 +389,7 @@ default void removeStatement(UpdateContext op, Resource subj, URI pred, Value ob * @throws SailException If the Sail object encountered an error or unexpected situation internally. * @throws IllegalStateException If the connection has been closed. */ - public CloseableIteration getNamespaces() throws SailException; + CloseableIteration getNamespaces() throws SailException; /** * Gets the namespace that is associated with the specified prefix, if any. @@ -376,7 +401,7 @@ default void removeStatement(UpdateContext op, Resource subj, URI pred, Value ob * @throws NullPointerException In case prefix is null. * @throws IllegalStateException If the connection has been closed. */ - public String getNamespace(String prefix) throws SailException; + String getNamespace(String prefix) throws SailException; /** * Sets the prefix for a namespace. @@ -387,7 +412,7 @@ default void removeStatement(UpdateContext op, Resource subj, URI pred, Value ob * @throws NullPointerException In case prefix or name is null. * @throws IllegalStateException If the connection has been closed. */ - public void setNamespace(String prefix, String name) throws SailException; + void setNamespace(String prefix, String name) throws SailException; /** * Removes a namespace declaration by removing the association between a prefix and a namespace name. @@ -397,7 +422,7 @@ default void removeStatement(UpdateContext op, Resource subj, URI pred, Value ob * @throws NullPointerException In case prefix is null. * @throws IllegalStateException If the connection has been closed. */ - public void removeNamespace(String prefix) throws SailException; + void removeNamespace(String prefix) throws SailException; /** * Removes all namespace declarations from the repository. @@ -405,7 +430,7 @@ default void removeStatement(UpdateContext op, Resource subj, URI pred, Value ob * @throws SailException If the Sail object encountered an error or unexpected situation internally. * @throws IllegalStateException If the connection has been closed. */ - public void clearNamespaces() throws SailException; + void clearNamespaces() throws SailException; /** * Indicates if the Sail has any statement removal operations pending (not yet {@link #flush() flushed}) for the @@ -418,4 +443,38 @@ default void removeStatement(UpdateContext op, Resource subj, URI pred, Value ob @Deprecated boolean pendingRemovals(); + /** + *

    + * Explain how the TupleExpr will be (or has been) executed/evaluated by returning a TupleExpr (which may or may not + * be the provided TupleExpr) that has gone through zero or more of the stages prior to and also including execution + * as specified by the provided level. + *

    + * + *

    + * This method is used by the Query interface. + *

    + * + *

    + * WARNING: This method is experimental and is subject to change or removal without warning. There is currently only + * partial support for this method in RDF4J and and UnsupportedOperationException where support is lacking. + *

    + * + * + * @param level the explanation level, eg. OPTIMIZED + * @param tupleExpr The tuple expression to evaluate. Mutable. + * @param dataset The dataset to use for evaluating the query, null to use the Sail's default + * dataset. + * @param bindings A set of input parameters for the query evaluation. The keys reference variable names that + * should be bound to the value they map to. + * @param includeInferred Indicates whether inferred triples are to be considered in the query result. If false, no + * inferred statements are returned; if true, inferred statements are returned if available + * @param timeoutSeconds for explanations that require execution a timeout can be provided in seconds + * @return The resulting tuple expression after being run through the specified level + */ + // with default implementation for backwards compatibility + @Experimental + default Explanation explain(Explanation.Level level, TupleExpr tupleExpr, Dataset dataset, + BindingSet bindings, boolean includeInferred, int timeoutSeconds) { + throw new UnsupportedOperationException(); + } } diff --git a/core/sail/api/src/main/java/org/eclipse/rdf4j/sail/SailConnectionListener.java b/core/sail/api/src/main/java/org/eclipse/rdf4j/sail/SailConnectionListener.java index 1912665b7e7..a8f55b8fc9d 100644 --- a/core/sail/api/src/main/java/org/eclipse/rdf4j/sail/SailConnectionListener.java +++ b/core/sail/api/src/main/java/org/eclipse/rdf4j/sail/SailConnectionListener.java @@ -13,15 +13,15 @@ public interface SailConnectionListener { /** * Notifies the listener that a statement has been added in a transaction that it has registered itself with. - * + * * @param st The statement that was added. */ - public void statementAdded(Statement st); + void statementAdded(Statement st); /** * Notifies the listener that a statement has been removed in a transaction that it has registered itself with. - * + * * @param st The statement that was removed. */ - public void statementRemoved(Statement st); + void statementRemoved(Statement st); } diff --git a/core/sail/api/src/main/java/org/eclipse/rdf4j/sail/SailLockedException.java b/core/sail/api/src/main/java/org/eclipse/rdf4j/sail/SailLockedException.java index ee96e5cc82f..8273cd44222 100644 --- a/core/sail/api/src/main/java/org/eclipse/rdf4j/sail/SailLockedException.java +++ b/core/sail/api/src/main/java/org/eclipse/rdf4j/sail/SailLockedException.java @@ -9,7 +9,7 @@ /** * Indicates that a SAIL cannot be initialised because the configured persisted location is locked. - * + * * @author James Leigh */ public class SailLockedException extends SailException { @@ -42,7 +42,7 @@ public SailLockedException(String lockedBy, String requestedBy, LockManager mana /** * Returns the name representing the Java virtual machine that acquired the lock. - * + * * @return the name representing the Java virtual machine that acquired the lock. */ public String getLockedBy() { @@ -51,7 +51,7 @@ public String getLockedBy() { /** * Returns the name representing the Java virtual machine that requested the lock. - * + * * @return the name representing the Java virtual machine that requested the lock. */ public String getRequestedBy() { diff --git a/core/sail/api/src/main/java/org/eclipse/rdf4j/sail/SailReadOnlyException.java b/core/sail/api/src/main/java/org/eclipse/rdf4j/sail/SailReadOnlyException.java index 96118ae45c0..643aecf9340 100644 --- a/core/sail/api/src/main/java/org/eclipse/rdf4j/sail/SailReadOnlyException.java +++ b/core/sail/api/src/main/java/org/eclipse/rdf4j/sail/SailReadOnlyException.java @@ -10,7 +10,7 @@ /** * Indicates that the current write operation did not succeed because the SAIL cannot be written to, it can only be read * from. - * + * * @author James Leigh */ public class SailReadOnlyException extends SailException { diff --git a/core/sail/api/src/main/java/org/eclipse/rdf4j/sail/StackableSail.java b/core/sail/api/src/main/java/org/eclipse/rdf4j/sail/StackableSail.java index 207db6af46f..73de0de79b5 100644 --- a/core/sail/api/src/main/java/org/eclipse/rdf4j/sail/StackableSail.java +++ b/core/sail/api/src/main/java/org/eclipse/rdf4j/sail/StackableSail.java @@ -16,10 +16,10 @@ public interface StackableSail extends Sail { * Sets the base Sail that this Sail will work on top of. This method will be called before the initialize() method * is called. */ - public void setBaseSail(Sail baseSail); + void setBaseSail(Sail baseSail); /** * Gets the base Sail that this Sail works on top of. */ - public Sail getBaseSail(); + Sail getBaseSail(); } diff --git a/core/sail/api/src/main/java/org/eclipse/rdf4j/sail/UnknownSailTransactionStateException.java b/core/sail/api/src/main/java/org/eclipse/rdf4j/sail/UnknownSailTransactionStateException.java index 9cf4267267c..4025ed49c0b 100644 --- a/core/sail/api/src/main/java/org/eclipse/rdf4j/sail/UnknownSailTransactionStateException.java +++ b/core/sail/api/src/main/java/org/eclipse/rdf4j/sail/UnknownSailTransactionStateException.java @@ -9,7 +9,7 @@ /** * Indicates that a SAIL's transaction state (active or inactive) cannot be determined. - * + * * @author Jeen Broekstra */ public class UnknownSailTransactionStateException extends SailException { diff --git a/core/sail/api/src/main/java/org/eclipse/rdf4j/sail/UpdateContext.java b/core/sail/api/src/main/java/org/eclipse/rdf4j/sail/UpdateContext.java index 520d1d59e69..c1f2d5267ad 100644 --- a/core/sail/api/src/main/java/org/eclipse/rdf4j/sail/UpdateContext.java +++ b/core/sail/api/src/main/java/org/eclipse/rdf4j/sail/UpdateContext.java @@ -15,7 +15,7 @@ /** * Provided with add and remove operation to give them context within a {@link UpdateExpr} operation. - * + * * @author James Leigh */ public class UpdateContext { diff --git a/core/sail/api/src/main/java/org/eclipse/rdf4j/sail/config/AbstractDelegatingSailImplConfig.java b/core/sail/api/src/main/java/org/eclipse/rdf4j/sail/config/AbstractDelegatingSailImplConfig.java index c5c1b857539..e547d837116 100644 --- a/core/sail/api/src/main/java/org/eclipse/rdf4j/sail/config/AbstractDelegatingSailImplConfig.java +++ b/core/sail/api/src/main/java/org/eclipse/rdf4j/sail/config/AbstractDelegatingSailImplConfig.java @@ -79,7 +79,7 @@ public void parse(Model m, Resource implNode) throws SailConfigException { super.parse(m, implNode); try { - Models.objectResource(m.filter(implNode, DELEGATE, null)) + Models.objectResource(m.getStatements(implNode, DELEGATE, null)) .ifPresent(delegate -> setDelegate(SailConfigUtil.parseRepositoryImpl(m, delegate))); } catch (ModelException e) { throw new SailConfigException(e.getMessage(), e); diff --git a/core/sail/api/src/main/java/org/eclipse/rdf4j/sail/config/AbstractSailImplConfig.java b/core/sail/api/src/main/java/org/eclipse/rdf4j/sail/config/AbstractSailImplConfig.java index 50ecefae2a8..ee7679a14b2 100644 --- a/core/sail/api/src/main/java/org/eclipse/rdf4j/sail/config/AbstractSailImplConfig.java +++ b/core/sail/api/src/main/java/org/eclipse/rdf4j/sail/config/AbstractSailImplConfig.java @@ -19,7 +19,7 @@ /** * Base implementation of {@link SailImplConfig} - * + * * @author Herko ter Horst */ public abstract class AbstractSailImplConfig implements SailImplConfig { @@ -83,10 +83,10 @@ public Resource export(Model m) { @Override public void parse(Model m, Resource implNode) throws SailConfigException { try { - Models.objectLiteral(m.filter(implNode, SAILTYPE, null)).ifPresent(lit -> setType(lit.getLabel())); - Models.objectLiteral(m.filter(implNode, SailConfigSchema.ITERATION_CACHE_SYNC_THRESHOLD, null)) + Models.objectLiteral(m.getStatements(implNode, SAILTYPE, null)).ifPresent(lit -> setType(lit.getLabel())); + Models.objectLiteral(m.getStatements(implNode, SailConfigSchema.ITERATION_CACHE_SYNC_THRESHOLD, null)) .ifPresent(lit -> setIterationCacheSyncThreshold(lit.longValue())); - Models.objectLiteral(m.filter(implNode, SailConfigSchema.CONNECTION_TIME_OUT, null)) + Models.objectLiteral(m.getStatements(implNode, SailConfigSchema.CONNECTION_TIME_OUT, null)) .ifPresent(lit -> setConnectionTimeOut(lit.longValue())); } catch (ModelException e) { throw new SailConfigException(e.getMessage(), e); @@ -110,7 +110,7 @@ public void setIterationCacheSyncThreshold(long iterationCacheSyncThreshold) { /** * Get the connection timeout (in ms). - * + * * @return connection timeout (in ms) */ public long getConnectionTimeOut() { @@ -119,7 +119,7 @@ public long getConnectionTimeOut() { /** * Set the connection timeout (in ms). - * + * * @param connectionTimeOut timeout (in ms) */ public void setConnectionTimeOut(long connectionTimeOut) { diff --git a/core/sail/api/src/main/java/org/eclipse/rdf4j/sail/config/DelegatingSailImplConfig.java b/core/sail/api/src/main/java/org/eclipse/rdf4j/sail/config/DelegatingSailImplConfig.java index 27a28b1fcfe..9ed69eda6a9 100644 --- a/core/sail/api/src/main/java/org/eclipse/rdf4j/sail/config/DelegatingSailImplConfig.java +++ b/core/sail/api/src/main/java/org/eclipse/rdf4j/sail/config/DelegatingSailImplConfig.java @@ -12,5 +12,5 @@ */ public interface DelegatingSailImplConfig extends SailImplConfig { - public SailImplConfig getDelegate(); + SailImplConfig getDelegate(); } diff --git a/core/sail/api/src/main/java/org/eclipse/rdf4j/sail/config/SailConfigException.java b/core/sail/api/src/main/java/org/eclipse/rdf4j/sail/config/SailConfigException.java index 890d7797fa9..d76ab36922c 100644 --- a/core/sail/api/src/main/java/org/eclipse/rdf4j/sail/config/SailConfigException.java +++ b/core/sail/api/src/main/java/org/eclipse/rdf4j/sail/config/SailConfigException.java @@ -11,7 +11,7 @@ /** * Exception indicating a sail configuration problem. - * + * * @author Arjohn Kampman */ public class SailConfigException extends RDF4JConfigException { diff --git a/core/sail/api/src/main/java/org/eclipse/rdf4j/sail/config/SailConfigSchema.java b/core/sail/api/src/main/java/org/eclipse/rdf4j/sail/config/SailConfigSchema.java index 902bb8489cc..5ae6c4dbeaa 100644 --- a/core/sail/api/src/main/java/org/eclipse/rdf4j/sail/config/SailConfigSchema.java +++ b/core/sail/api/src/main/java/org/eclipse/rdf4j/sail/config/SailConfigSchema.java @@ -13,7 +13,7 @@ /** * Defines constants for the Sail repository schema which are used to initialize repositories. - * + * * @author Arjohn Kampman */ public class SailConfigSchema { diff --git a/core/sail/api/src/main/java/org/eclipse/rdf4j/sail/config/SailConfigUtil.java b/core/sail/api/src/main/java/org/eclipse/rdf4j/sail/config/SailConfigUtil.java index 542d1c63497..72d6e399fb5 100644 --- a/core/sail/api/src/main/java/org/eclipse/rdf4j/sail/config/SailConfigUtil.java +++ b/core/sail/api/src/main/java/org/eclipse/rdf4j/sail/config/SailConfigUtil.java @@ -19,7 +19,8 @@ public class SailConfigUtil { public static SailImplConfig parseRepositoryImpl(Model m, Resource implNode) throws SailConfigException { try { - Optional typeLit = Models.objectLiteral(m.filter(implNode, SailConfigSchema.SAILTYPE, null)); + Optional typeLit = Models + .objectLiteral(m.getStatements(implNode, SailConfigSchema.SAILTYPE, null)); if (typeLit.isPresent()) { Optional factory = SailRegistry.getInstance().get(typeLit.get().getLabel()); diff --git a/core/sail/api/src/main/java/org/eclipse/rdf4j/sail/config/SailFactory.java b/core/sail/api/src/main/java/org/eclipse/rdf4j/sail/config/SailFactory.java index f5cd75ba4d8..ec8aa191651 100644 --- a/core/sail/api/src/main/java/org/eclipse/rdf4j/sail/config/SailFactory.java +++ b/core/sail/api/src/main/java/org/eclipse/rdf4j/sail/config/SailFactory.java @@ -13,7 +13,7 @@ * A SailFactory takes care of creating and initializing a specific type of {@link Sail} based on RDF configuration * data. SailFactory's are used to create specific Sails and to initialize them based on the configuration data that is * supplied to it, for example in a server environment. - * + * * @author Arjohn Kampman */ public interface SailFactory { @@ -23,16 +23,16 @@ public interface SailFactory { * uniquely identify specific implementations of the Sail API. This type can be equal to the fully * qualified class name of the Sail, but this is not required. */ - public String getSailType(); + String getSailType(); - public SailImplConfig getConfig(); + SailImplConfig getConfig(); /** * Returns a Sail instance that has been initialized using the supplied configuration data. - * + * * @param config TODO * @return The created (but un-initialized) Sail. * @throws SailConfigException If no Sail could be created due to invalid or incomplete configuration data. */ - public Sail getSail(SailImplConfig config) throws SailConfigException; + Sail getSail(SailImplConfig config) throws SailConfigException; } diff --git a/core/sail/api/src/main/java/org/eclipse/rdf4j/sail/config/SailImplConfig.java b/core/sail/api/src/main/java/org/eclipse/rdf4j/sail/config/SailImplConfig.java index 663deb9ba9a..25aa3286160 100644 --- a/core/sail/api/src/main/java/org/eclipse/rdf4j/sail/config/SailImplConfig.java +++ b/core/sail/api/src/main/java/org/eclipse/rdf4j/sail/config/SailImplConfig.java @@ -12,24 +12,24 @@ /** * Configuration of a Sail implementation. - * + * * @author Arjohn Kampman */ public interface SailImplConfig { - public String getType(); + String getType(); - public long getIterationCacheSyncThreshold(); + long getIterationCacheSyncThreshold(); /** * Validates this configuration. A {@link SailConfigException} is thrown when the configuration is invalid. The * exception should contain an error message that indicates why the configuration is invalid. - * + * * @throws SailConfigException If the configuration is invalid. */ - public void validate() throws SailConfigException; + void validate() throws SailConfigException; - public Resource export(Model graph); + Resource export(Model graph); - public void parse(Model graph, Resource implNode) throws SailConfigException; + void parse(Model graph, Resource implNode) throws SailConfigException; } diff --git a/core/sail/api/src/main/java/org/eclipse/rdf4j/sail/config/SailRegistry.java b/core/sail/api/src/main/java/org/eclipse/rdf4j/sail/config/SailRegistry.java index ac7bb693135..f5e0a04555f 100644 --- a/core/sail/api/src/main/java/org/eclipse/rdf4j/sail/config/SailRegistry.java +++ b/core/sail/api/src/main/java/org/eclipse/rdf4j/sail/config/SailRegistry.java @@ -11,7 +11,7 @@ /** * A registry that keeps track of the available {@link SailFactory}s. - * + * * @author Arjohn Kampman */ public class SailRegistry extends ServiceRegistry { @@ -26,7 +26,7 @@ private static class SailRegistryHolder { /** * Gets the default SailRegistry. - * + * * @return The default registry. */ public static SailRegistry getInstance() { diff --git a/core/sail/api/src/main/java/org/eclipse/rdf4j/sail/helpers/AbstractNotifyingSail.java b/core/sail/api/src/main/java/org/eclipse/rdf4j/sail/helpers/AbstractNotifyingSail.java index 5472091f19b..7ff752a652b 100644 --- a/core/sail/api/src/main/java/org/eclipse/rdf4j/sail/helpers/AbstractNotifyingSail.java +++ b/core/sail/api/src/main/java/org/eclipse/rdf4j/sail/helpers/AbstractNotifyingSail.java @@ -19,7 +19,7 @@ /** * A base {@link NotifyingSail} implementation that takes care of common sail tasks, including proper closing of active * connections and a grace period for active connections during shutdown of the store. - * + * * @author Herko ter Horst * @author jeen * @author Arjohn Kampman diff --git a/core/sail/api/src/main/java/org/eclipse/rdf4j/sail/helpers/AbstractSail.java b/core/sail/api/src/main/java/org/eclipse/rdf4j/sail/helpers/AbstractSail.java index e9aa29579de..b459fe89453 100644 --- a/core/sail/api/src/main/java/org/eclipse/rdf4j/sail/helpers/AbstractSail.java +++ b/core/sail/api/src/main/java/org/eclipse/rdf4j/sail/helpers/AbstractSail.java @@ -27,7 +27,7 @@ /** * An abstract Sail implementation that takes care of common sail tasks, including proper closing of active connections * and a grace period for active connections during shutdown of the store. - * + * * @author Herko ter Horst * @author jeen * @author Arjohn Kampman @@ -109,6 +109,9 @@ protected static boolean debugEnabled() { private long iterationCacheSyncThreshold = DEFAULT_ITERATION_SYNC_THRESHOLD; + // track the results size that each node in the query plan produces during execution + private boolean trackResultSize; + /** * Map used to track active connections and where these were acquired. The Throwable value may be null in case * debugging was disable at the time the connection was acquired. @@ -131,7 +134,7 @@ public AbstractSail() { /** * Set connection timeout on shutdown (in ms). - * + * * @param connectionTimeOut timeout (in ms) */ public void setConnectionTimeOut(long connectionTimeOut) { @@ -164,7 +167,7 @@ public String toString() { /** * Checks whether the Sail has been initialized. Sails are initialized from {@link #initialize() initialization} * until {@link #shutDown() shutdown}. - * + * * @return true if the Sail has been initialized, false otherwise. */ protected boolean isInitialized() { @@ -284,7 +287,7 @@ public SailConnection getConnection() throws SailException { /** * Returns a store-specific SailConnection object. - * + * * @return A connection to the store. */ protected abstract SailConnection getConnectionInternal() throws SailException; @@ -292,7 +295,7 @@ public SailConnection getConnection() throws SailException { /** * Signals to the store that the supplied connection has been closed; called by * {@link AbstractSailConnection#close()}. - * + * * @param connection The connection that has been closed. */ protected void connectionClosed(SailConnection connection) { @@ -313,7 +316,7 @@ protected void connectionClosed(SailConnection connection) { /** * Appends the provided {@link IsolationLevels} to the SAIL's list of supported isolation levels. - * + * * @param level a supported IsolationLevel. */ protected void addSupportedIsolationLevel(IsolationLevels level) { @@ -322,7 +325,7 @@ protected void addSupportedIsolationLevel(IsolationLevels level) { /** * Removes all occurrences of the provided {@link IsolationLevels} in the list of supported Isolation levels. - * + * * @param level the isolation level to remove. */ protected void removeSupportedIsolationLevel(IsolationLevel level) { @@ -333,7 +336,7 @@ protected void removeSupportedIsolationLevel(IsolationLevel level) { /** * Sets the list of supported {@link IsolationLevels}s for this SAIL. The list is expected to be ordered in * increasing complexity. - * + * * @param supportedIsolationLevels a list of supported isolation levels. */ protected void setSupportedIsolationLevels(List supportedIsolationLevels) { @@ -343,7 +346,7 @@ protected void setSupportedIsolationLevels(List supportedIsolati /** * Sets the list of supported {@link IsolationLevels}s for this SAIL. The list is expected to be ordered in * increasing complexity. - * + * * @param supportedIsolationLevels a list of supported isolation levels. */ protected void setSupportedIsolationLevels(IsolationLevel... supportedIsolationLevels) { @@ -362,7 +365,7 @@ public IsolationLevel getDefaultIsolationLevel() { /** * Sets the default {@link IsolationLevel} on which transactions in this Sail operate. - * + * * @param defaultIsolationLevel The defaultIsolationLevel to set. */ public void setDefaultIsolationLevel(IsolationLevel defaultIsolationLevel) { @@ -374,7 +377,7 @@ public void setDefaultIsolationLevel(IsolationLevel defaultIsolationLevel) { /** * Retrieves the currently configured threshold for syncing query evaluation iteration caches to disk. - * + * * @return Returns the iterationCacheSyncThreshold. */ public long getIterationCacheSyncThreshold() { @@ -383,10 +386,30 @@ public long getIterationCacheSyncThreshold() { /** * Set the threshold for syncing query evaluation iteration caches to disk. - * + * * @param iterationCacheSyncThreshold The iterationCacheSyncThreshold to set. */ public void setIterationCacheSyncThreshold(long iterationCacheSyncThreshold) { this.iterationCacheSyncThreshold = iterationCacheSyncThreshold; } + + /** + * Returns the status of the result size tracking for the query plan. Useful to determine which parts of a query + * plan generated the most data. + * + * @return true if result size tracking is enabled. + */ + public boolean isTrackResultSize() { + return trackResultSize; + } + + /** + * Enable or disable results size tracking for the query plan. Useful to determine which parts of a query plan + * generated the most data. + * + * @param trackResultSize true to enable tracking. + */ + public void setTrackResultSize(boolean trackResultSize) { + this.trackResultSize = trackResultSize; + } } diff --git a/core/sail/api/src/main/java/org/eclipse/rdf4j/sail/helpers/DirectoryLockManager.java b/core/sail/api/src/main/java/org/eclipse/rdf4j/sail/helpers/DirectoryLockManager.java index 85ec4969425..d77da4c1d9c 100644 --- a/core/sail/api/src/main/java/org/eclipse/rdf4j/sail/helpers/DirectoryLockManager.java +++ b/core/sail/api/src/main/java/org/eclipse/rdf4j/sail/helpers/DirectoryLockManager.java @@ -26,7 +26,7 @@ /** * Used to create a lock in a directory. - * + * * @author James Leigh * @author Arjohn Kampman */ @@ -57,7 +57,7 @@ private File getLockDir() { /** * Determines if the directory is locked. - * + * * @return true if the directory is already locked. */ @Override @@ -67,7 +67,7 @@ public boolean isLocked() { /** * Creates a lock in a directory if it does not yet exist. - * + * * @return a newly acquired lock or null if the directory is already locked. */ @Override @@ -111,7 +111,7 @@ public Lock tryLock() { /** * Creates a lock in a directory if it does not yet exist. - * + * * @return a newly acquired lock. * @throws SailLockedException if the directory is already locked. */ @@ -140,7 +140,7 @@ public Lock lockOrFail() throws SailLockedException { /** * Revokes a lock owned by another process. - * + * * @return true if a lock was successfully revoked. */ @Override @@ -195,6 +195,7 @@ private Lock createLock(final RandomAccessFile raf, final FileLock fileLock) { return new Lock() { private Thread hook; + { try { Thread hook = new Thread(this::delete); diff --git a/core/sail/api/src/main/java/org/eclipse/rdf4j/sail/helpers/NotifyingSailConnectionBase.java b/core/sail/api/src/main/java/org/eclipse/rdf4j/sail/helpers/NotifyingSailConnectionBase.java index c82b3b32a24..c3ea8c41736 100644 --- a/core/sail/api/src/main/java/org/eclipse/rdf4j/sail/helpers/NotifyingSailConnectionBase.java +++ b/core/sail/api/src/main/java/org/eclipse/rdf4j/sail/helpers/NotifyingSailConnectionBase.java @@ -16,7 +16,7 @@ /** * Abstract Class offering base functionality for SailConnection implementations. - * + * * @author Arjohn Kampman * @author jeen */ diff --git a/core/sail/api/src/main/java/org/eclipse/rdf4j/sail/helpers/NotifyingSailConnectionWrapper.java b/core/sail/api/src/main/java/org/eclipse/rdf4j/sail/helpers/NotifyingSailConnectionWrapper.java index a298c5fd2f3..7179532d0cf 100644 --- a/core/sail/api/src/main/java/org/eclipse/rdf4j/sail/helpers/NotifyingSailConnectionWrapper.java +++ b/core/sail/api/src/main/java/org/eclipse/rdf4j/sail/helpers/NotifyingSailConnectionWrapper.java @@ -14,7 +14,7 @@ * An implementation of the {@link org.eclipse.rdf4j.sail.NotifyingSailConnection} interface that wraps another * {@link org.eclipse.rdf4j.sail.NotifyingSailConnection} object and forwards any method calls to the wrapped * transaction. - * + * * @author Jeen Broekstra */ public class NotifyingSailConnectionWrapper extends SailConnectionWrapper implements NotifyingSailConnection { diff --git a/core/sail/api/src/main/java/org/eclipse/rdf4j/sail/helpers/NotifyingSailWrapper.java b/core/sail/api/src/main/java/org/eclipse/rdf4j/sail/helpers/NotifyingSailWrapper.java index a2c9f487d97..4dd885571ee 100644 --- a/core/sail/api/src/main/java/org/eclipse/rdf4j/sail/helpers/NotifyingSailWrapper.java +++ b/core/sail/api/src/main/java/org/eclipse/rdf4j/sail/helpers/NotifyingSailWrapper.java @@ -16,7 +16,7 @@ /** * An implementation of the StackableSail interface that wraps another Sail object and forwards any relevant calls to * the wrapped Sail. - * + * * @author Arjohn Kampman */ public class NotifyingSailWrapper extends SailWrapper implements NotifyingSail { diff --git a/core/sail/api/src/main/java/org/eclipse/rdf4j/sail/helpers/SailBaseIteration.java b/core/sail/api/src/main/java/org/eclipse/rdf4j/sail/helpers/SailBaseIteration.java index 34a70551346..b7f27a9e5e6 100644 --- a/core/sail/api/src/main/java/org/eclipse/rdf4j/sail/helpers/SailBaseIteration.java +++ b/core/sail/api/src/main/java/org/eclipse/rdf4j/sail/helpers/SailBaseIteration.java @@ -13,7 +13,7 @@ /** * An iteration extension that keeps a reference to the AbstractSailConnection from which it originates and signals when * it is closed. - * + * * @author Jeen Broekstra */ class SailBaseIteration extends IterationWrapper { @@ -22,7 +22,7 @@ class SailBaseIteration extends IterationWrapper { /** * Creates a new memory-store specific iteration object. - * + * * @param lock a query lock * @param iter the wrapped iteration over sail objects. * @param connection the connection from which this iteration originates. diff --git a/core/sail/api/src/main/java/org/eclipse/rdf4j/sail/helpers/SailConnectionWrapper.java b/core/sail/api/src/main/java/org/eclipse/rdf4j/sail/helpers/SailConnectionWrapper.java index 35b1a6dfbfe..30dab2fc6ce 100644 --- a/core/sail/api/src/main/java/org/eclipse/rdf4j/sail/helpers/SailConnectionWrapper.java +++ b/core/sail/api/src/main/java/org/eclipse/rdf4j/sail/helpers/SailConnectionWrapper.java @@ -7,6 +7,8 @@ *******************************************************************************/ package org.eclipse.rdf4j.sail.helpers; +import java.util.Optional; + import org.eclipse.rdf4j.IsolationLevel; import org.eclipse.rdf4j.common.iteration.CloseableIteration; import org.eclipse.rdf4j.model.IRI; @@ -16,10 +18,13 @@ import org.eclipse.rdf4j.model.Value; import org.eclipse.rdf4j.query.BindingSet; import org.eclipse.rdf4j.query.Dataset; +import org.eclipse.rdf4j.query.Query; import org.eclipse.rdf4j.query.QueryEvaluationException; +import org.eclipse.rdf4j.query.QueryLanguage; import org.eclipse.rdf4j.query.algebra.TupleExpr; import org.eclipse.rdf4j.query.algebra.evaluation.federation.FederatedServiceResolver; import org.eclipse.rdf4j.query.algebra.evaluation.federation.FederatedServiceResolverClient; +import org.eclipse.rdf4j.query.explanation.Explanation; import org.eclipse.rdf4j.sail.SailConnection; import org.eclipse.rdf4j.sail.SailException; import org.eclipse.rdf4j.sail.UnknownSailTransactionStateException; @@ -28,7 +33,7 @@ /** * An implementation of the SailConnection interface that wraps another SailConnection object and forwards any method * calls to the wrapped connection. - * + * * @author Jeen Broekstra */ public class SailConnectionWrapper implements SailConnection, FederatedServiceResolverClient { @@ -59,7 +64,7 @@ public SailConnectionWrapper(SailConnection wrappedCon) { /** * Gets the connection that is wrapped by this object. - * + * * @return The SailConnection object that was supplied to the constructor of this class. */ public SailConnection getWrappedConnection() { @@ -83,6 +88,11 @@ public void close() throws SailException { wrappedCon.close(); } + @Override + public Optional prepareQuery(QueryLanguage ql, Query.QueryType type, String query, String baseURI) { + return wrappedCon.prepareQuery(ql, type, query, baseURI); + } + @Override public CloseableIteration evaluate(TupleExpr tupleExpr, Dataset dataset, BindingSet bindings, boolean includeInferred) throws SailException { @@ -190,6 +200,12 @@ public boolean pendingRemovals() { return false; } + @Override + public Explanation explain(Explanation.Level level, TupleExpr tupleExpr, Dataset dataset, + BindingSet bindings, boolean includeInferred, int timeoutSeconds) { + return wrappedCon.explain(level, tupleExpr, dataset, bindings, includeInferred, timeoutSeconds); + } + @Override public void begin() throws SailException { wrappedCon.begin(); diff --git a/core/sail/api/src/main/java/org/eclipse/rdf4j/sail/helpers/SailUtil.java b/core/sail/api/src/main/java/org/eclipse/rdf4j/sail/helpers/SailUtil.java index d07559d6156..bd5bc75a353 100644 --- a/core/sail/api/src/main/java/org/eclipse/rdf4j/sail/helpers/SailUtil.java +++ b/core/sail/api/src/main/java/org/eclipse/rdf4j/sail/helpers/SailUtil.java @@ -18,7 +18,7 @@ public class SailUtil { /** * Searches a stack of Sails from top to bottom for a Sail that is an instance of the suppied class or interface. * The first Sail that matches (i.e. the one closest to the top) is returned. - * + * * @param topSail The top of the Sail stack. * @param sailClass A class or interface. * @return A Sail that is an instance of sailClass, or null if no such Sail was found. diff --git a/core/sail/api/src/main/java/org/eclipse/rdf4j/sail/helpers/SailWrapper.java b/core/sail/api/src/main/java/org/eclipse/rdf4j/sail/helpers/SailWrapper.java index f1783ddc347..108f54b3e0a 100644 --- a/core/sail/api/src/main/java/org/eclipse/rdf4j/sail/helpers/SailWrapper.java +++ b/core/sail/api/src/main/java/org/eclipse/rdf4j/sail/helpers/SailWrapper.java @@ -22,7 +22,7 @@ /** * An implementation of the StackableSail interface that wraps another Sail object and forwards any relevant calls to * the wrapped Sail. - * + * * @author Arjohn Kampman */ public class SailWrapper implements StackableSail, FederatedServiceResolverClient { diff --git a/core/sail/api/src/main/java/org/eclipse/rdf4j/sail/package-info.java b/core/sail/api/src/main/java/org/eclipse/rdf4j/sail/package-info.java index 842ebf354d0..e3dfda483f4 100644 --- a/core/sail/api/src/main/java/org/eclipse/rdf4j/sail/package-info.java +++ b/core/sail/api/src/main/java/org/eclipse/rdf4j/sail/package-info.java @@ -1,7 +1,7 @@ /** * RDF Storage And Inference Layer (RDF Sail): a set of interfaces defining an SPI for RDF databases. - * + * * The main interface is {@link org.eclipse.rdf4j.sail.Sail}, which defines methods for initialization, querying and * starting transactions. */ -package org.eclipse.rdf4j.sail; \ No newline at end of file +package org.eclipse.rdf4j.sail; diff --git a/core/sail/api/src/test/java/org/eclipse/rdf4j/sail/helpers/AbstractSailTest.java b/core/sail/api/src/test/java/org/eclipse/rdf4j/sail/helpers/AbstractSailTest.java index f2adc48b9d9..6ed58abe219 100644 --- a/core/sail/api/src/test/java/org/eclipse/rdf4j/sail/helpers/AbstractSailTest.java +++ b/core/sail/api/src/test/java/org/eclipse/rdf4j/sail/helpers/AbstractSailTest.java @@ -25,7 +25,7 @@ /** * Unit tests for {@link AbstractSail}. - * + * * @author Jeen Broekstra * */ @@ -117,7 +117,7 @@ public SailGetConnectionTask(AbstractSail sail, CountDownLatch connectionObtaine /* * (non-Javadoc) - * + * * @see java.lang.Runnable#run() */ @Override diff --git a/core/sail/api/src/test/java/org/eclipse/rdf4j/sail/helpers/NotifyingSailConnectionWrapperTest.java b/core/sail/api/src/test/java/org/eclipse/rdf4j/sail/helpers/NotifyingSailConnectionWrapperTest.java index d2d33217cc9..c9d74c4185d 100644 --- a/core/sail/api/src/test/java/org/eclipse/rdf4j/sail/helpers/NotifyingSailConnectionWrapperTest.java +++ b/core/sail/api/src/test/java/org/eclipse/rdf4j/sail/helpers/NotifyingSailConnectionWrapperTest.java @@ -86,4 +86,4 @@ public void testAddThenRemoveListener() throws SailException { wrapper.removeConnectionListener(listener); verify(delegate).removeConnectionListener(listener); } -} \ No newline at end of file +} diff --git a/core/sail/base/pom.xml b/core/sail/base/pom.xml index 6f957f5094c..4108d4f458b 100644 --- a/core/sail/base/pom.xml +++ b/core/sail/base/pom.xml @@ -4,7 +4,7 @@ org.eclipse.rdf4j rdf4j-sail - 3.1.5-SNAPSHOT + 3.2.2-SNAPSHOT rdf4j-sail-base RDF4J: Sail base implementations diff --git a/core/sail/base/src/main/java/org/eclipse/rdf4j/sail/base/BackingSailSource.java b/core/sail/base/src/main/java/org/eclipse/rdf4j/sail/base/BackingSailSource.java index 0f016c4b6e0..029277b57ef 100644 --- a/core/sail/base/src/main/java/org/eclipse/rdf4j/sail/base/BackingSailSource.java +++ b/core/sail/base/src/main/java/org/eclipse/rdf4j/sail/base/BackingSailSource.java @@ -12,7 +12,7 @@ /** * A Backing {@link SailSource} that does not respond to {@link #close()} {@link #prepare()} or {@link #flush()}. These * methods have no effect. - * + * * @author James Leigh */ public abstract class BackingSailSource implements SailSource { diff --git a/core/sail/base/src/main/java/org/eclipse/rdf4j/sail/base/Changeset.java b/core/sail/base/src/main/java/org/eclipse/rdf4j/sail/base/Changeset.java index 0ec852931f3..54e164e309d 100644 --- a/core/sail/base/src/main/java/org/eclipse/rdf4j/sail/base/Changeset.java +++ b/core/sail/base/src/main/java/org/eclipse/rdf4j/sail/base/Changeset.java @@ -7,11 +7,17 @@ *******************************************************************************/ package org.eclipse.rdf4j.sail.base; +import java.util.ArrayList; import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; import java.util.HashMap; import java.util.HashSet; +import java.util.List; import java.util.Map; import java.util.Set; +import java.util.stream.Collectors; +import java.util.stream.StreamSupport; import org.eclipse.rdf4j.IsolationLevels; import org.eclipse.rdf4j.model.IRI; @@ -52,11 +58,15 @@ abstract class Changeset implements SailSink, ModelFactory { /** * Statements that have been added as part of a transaction, but has not yet been committed. + * + * DO NOT EXPOSE THE MODEL OUTSIDE OF THIS CLASS BECAUSE IT IS NOT THREAD-SAFE */ private Model approved; /** * Explicit statements that have been removed as part of a transaction, but have not yet been committed. + * + * DO NOT EXPOSE THE MODEL OUTSIDE OF THIS CLASS BECAUSE IT IS NOT THREAD-SAFE */ private Model deprecated; @@ -110,10 +120,8 @@ public void prepare() throws SailException { contexts = new Resource[] { (Resource) ctxVar.getValue() }; } for (Changeset changeset : prepend) { - Model approved = changeset.getApproved(); - Model deprecated = changeset.getDeprecated(); - if (approved != null && approved.contains(subj, pred, obj, contexts) - || deprecated != null && deprecated.contains(subj, pred, obj, contexts)) { + if (changeset.hasApproved(subj, pred, obj, contexts) + || (changeset.hasDeprecated(subj, pred, obj, contexts))) { throw new SailConflictException("Observed State has Changed"); } } @@ -121,6 +129,22 @@ public void prepare() throws SailException { } } + synchronized boolean hasApproved(Resource subj, IRI pred, Value obj, Resource[] contexts) { + if (approved == null) { + return false; + } + + return approved.contains(subj, pred, obj, contexts); + } + + synchronized boolean hasDeprecated(Resource subj, IRI pred, Value obj, Resource[] contexts) { + if (deprecated == null) { + return false; + } + + return deprecated.contains(subj, pred, obj, contexts); + } + public synchronized void addRefback(SailDatasetImpl dataset) { if (refbacks == null) { refbacks = new HashSet<>(); @@ -202,7 +226,7 @@ public synchronized void observe(Resource subj, IRI pred, Value obj, Resource... public synchronized void clear(Resource... contexts) { if (contexts != null && contexts.length == 0) { if (approved != null) { - approved.remove(null, null, null); + approved.clear(); } if (approvedContexts != null) { approvedContexts.clear(); @@ -324,23 +348,17 @@ protected void setChangeset(Changeset from) { } public synchronized Set getObservations() { - return observations; - } - public synchronized Model getApproved() { - return approved; - } + return cloneSet(observations); - public synchronized Model getDeprecated() { - return deprecated; } public synchronized Set getApprovedContexts() { - return approvedContexts; + return cloneSet(approvedContexts); } public synchronized Set getDeprecatedContexts() { - return deprecatedContexts; + return cloneSet(deprecatedContexts); } public synchronized boolean isStatementCleared() { @@ -352,14 +370,79 @@ public synchronized Map getAddedNamespaces() { } public synchronized Set getRemovedPrefixes() { - return removedPrefixes; + return cloneSet(removedPrefixes); } public synchronized boolean isNamespaceCleared() { return namespaceCleared; } - public boolean hasDeprecated() { + public synchronized boolean hasDeprecated() { return deprecated != null && !deprecated.isEmpty(); } + + boolean isChanged() { + return approved != null || deprecated != null || approvedContexts != null + || deprecatedContexts != null || addedNamespaces != null + || removedPrefixes != null || statementCleared || namespaceCleared + || observations != null; + } + + synchronized List getDeprecatedStatements() { + if (deprecated == null) { + return Collections.emptyList(); + } + return new ArrayList<>(deprecated); + } + + synchronized List getApprovedStatements() { + if (approved == null) { + return Collections.emptyList(); + } + return new ArrayList<>(approved); + } + + synchronized boolean hasDeprecated(Statement statement) { + if (deprecated == null) { + return false; + } + return deprecated.contains(statement); + } + + synchronized boolean hasApproved() { + return approved != null && !approved.isEmpty(); + } + + synchronized Iterable getApprovedStatements(Resource subj, IRI pred, Value obj, + Resource[] contexts) { + + if (approved == null) { + return Collections.emptyList(); + } + + Iterable statements = approved.getStatements(subj, pred, obj, contexts); + + // This is a synchronized context, users of this method will be allowed to use the results at their leisure. We + // provide a copy of the data so that there will be no concurrent modification exceptions! + if (statements instanceof Collection) { + return new ArrayList<>((Collection) statements); + } else { + return StreamSupport + .stream(statements.spliterator(), false) + .collect(Collectors.toList()); + } + } + + synchronized void removeApproved(Statement next) { + if (approved != null) { + approved.remove(next); + } + } + + private Set cloneSet(Set deprecatedContexts) { + if (deprecatedContexts == null) { + return null; + } + return new HashSet<>(deprecatedContexts); + } } diff --git a/core/sail/base/src/main/java/org/eclipse/rdf4j/sail/base/DelegatingSailDataset.java b/core/sail/base/src/main/java/org/eclipse/rdf4j/sail/base/DelegatingSailDataset.java index 0f3cfdab549..b4f7b33ae93 100644 --- a/core/sail/base/src/main/java/org/eclipse/rdf4j/sail/base/DelegatingSailDataset.java +++ b/core/sail/base/src/main/java/org/eclipse/rdf4j/sail/base/DelegatingSailDataset.java @@ -12,12 +12,13 @@ import org.eclipse.rdf4j.model.Namespace; import org.eclipse.rdf4j.model.Resource; import org.eclipse.rdf4j.model.Statement; +import org.eclipse.rdf4j.model.Triple; import org.eclipse.rdf4j.model.Value; import org.eclipse.rdf4j.sail.SailException; /** * A wrapper around an {@link SailDataset} to specialize the behaviour of an {@link SailDataset}. - * + * * @author James Leigh */ abstract class DelegatingSailDataset implements SailDataset { @@ -26,7 +27,7 @@ abstract class DelegatingSailDataset implements SailDataset { /** * Wraps an {@link SailDataset} delegating all calls to it. - * + * * @param delegate */ public DelegatingSailDataset(SailDataset delegate) { @@ -63,4 +64,10 @@ public CloseableIteration getStatements(Reso Resource... contexts) throws SailException { return delegate.getStatements(subj, pred, obj, contexts); } + + @Override + public CloseableIteration getTriples(Resource subj, IRI pred, + Value obj) throws SailException { + return delegate.getTriples(subj, pred, obj); + } } diff --git a/core/sail/base/src/main/java/org/eclipse/rdf4j/sail/base/DelegatingSailSource.java b/core/sail/base/src/main/java/org/eclipse/rdf4j/sail/base/DelegatingSailSource.java index 0f0a35dffa2..80f12382ddf 100644 --- a/core/sail/base/src/main/java/org/eclipse/rdf4j/sail/base/DelegatingSailSource.java +++ b/core/sail/base/src/main/java/org/eclipse/rdf4j/sail/base/DelegatingSailSource.java @@ -13,7 +13,7 @@ /** * A wrapper around an {@link SailSource} that can suppress the call to {@link #close()}. This is useful when the a * shared branch is sometimes to be used and other times a dedicated branch is to be used. - * + * * @author James Leigh */ class DelegatingSailSource implements SailSource { @@ -25,7 +25,7 @@ class DelegatingSailSource implements SailSource { /** * Wraps this {@link SailSource}, delegating all calls to it unless closing is false, in which case * {@link #close()} will not be delegated. - * + * * @param delegate * @param closing if {@link #close()} should be delegated */ diff --git a/core/sail/base/src/main/java/org/eclipse/rdf4j/sail/base/DistinctModelReducingUnionIteration.java b/core/sail/base/src/main/java/org/eclipse/rdf4j/sail/base/DistinctModelReducingUnionIteration.java index e3327b9c152..7ca69222213 100644 --- a/core/sail/base/src/main/java/org/eclipse/rdf4j/sail/base/DistinctModelReducingUnionIteration.java +++ b/core/sail/base/src/main/java/org/eclipse/rdf4j/sail/base/DistinctModelReducingUnionIteration.java @@ -1,12 +1,11 @@ package org.eclipse.rdf4j.sail.base; -import java.util.ArrayList; import java.util.Iterator; -import java.util.function.Function; +import java.util.function.Consumer; +import java.util.function.Supplier; import org.eclipse.rdf4j.common.iteration.CloseableIteration; import org.eclipse.rdf4j.common.iteration.LookAheadIteration; -import org.eclipse.rdf4j.model.Model; import org.eclipse.rdf4j.model.Statement; import org.eclipse.rdf4j.sail.SailException; @@ -33,34 +32,36 @@ **/ public class DistinctModelReducingUnionIteration extends LookAheadIteration { - DistinctModelReducingUnionIteration(CloseableIteration iterator, Model model, - Function filterable) { + private final CloseableIteration iterator; + private final Consumer approvedRemover; + private final Supplier> approvedSupplier; + + DistinctModelReducingUnionIteration(CloseableIteration iterator, + Consumer approvedRemover, + Supplier> approvedSupplier) { this.iterator = iterator; - this.model = model; - this.filterable = filterable; + this.approvedRemover = approvedRemover; + this.approvedSupplier = approvedSupplier; } - private final CloseableIteration iterator; - private final Model model; - private final Function filterable; - - private Iterator filteredStatementsIterator; + private Iterator filteredStatementsIterator; @Override protected Statement getNextElement() throws SailException { Statement next = null; + // first run through the statements from the base store if (iterator.hasNext()) { next = iterator.next(); - synchronized (model) { - model.remove(next); - } + + // remove the statement from the approved model in the Changeset, in case the approved model has a duplicate + approvedRemover.accept(next); } else { + // we have now exhausted the base store and will start returning data added in this transaction but not yet + // committed, eg. approved model in the Changeset if (filteredStatementsIterator == null) { - synchronized (model) { - filteredStatementsIterator = new ArrayList<>(filterable.apply(model)).iterator(); - } + filteredStatementsIterator = approvedSupplier.get().iterator(); } if (filteredStatementsIterator.hasNext()) { diff --git a/core/sail/base/src/main/java/org/eclipse/rdf4j/sail/base/ObservingSailDataset.java b/core/sail/base/src/main/java/org/eclipse/rdf4j/sail/base/ObservingSailDataset.java index 7590168fd47..d3b2e70d0d8 100644 --- a/core/sail/base/src/main/java/org/eclipse/rdf4j/sail/base/ObservingSailDataset.java +++ b/core/sail/base/src/main/java/org/eclipse/rdf4j/sail/base/ObservingSailDataset.java @@ -18,7 +18,7 @@ /** * A {@link IsolationLevels#SERIALIZABLE} {@link SailDataset} that tracks the observed statement patterns to an * {@link SailSink#observe(Resource, IRI, Value, Resource...)} to check consistency. - * + * * @author James Leigh */ class ObservingSailDataset extends DelegatingSailDataset { @@ -30,7 +30,7 @@ class ObservingSailDataset extends DelegatingSailDataset { /** * Creates a {@link IsolationLevels#SERIALIZABLE} {@link SailDataset} that tracks consistency. - * + * * @param delegate to be {@link SailDataset#close()} when this {@link SailDataset} is closed. * @param observer to be {@link SailSink#flush()} and {@link SailSink#close()} when this {@link SailDataset} is * closed. diff --git a/core/sail/base/src/main/java/org/eclipse/rdf4j/sail/base/SailClosable.java b/core/sail/base/src/main/java/org/eclipse/rdf4j/sail/base/SailClosable.java index 9b90fd653ef..def732d2d9b 100644 --- a/core/sail/base/src/main/java/org/eclipse/rdf4j/sail/base/SailClosable.java +++ b/core/sail/base/src/main/java/org/eclipse/rdf4j/sail/base/SailClosable.java @@ -11,14 +11,14 @@ /** * Common interface to objects that throw {@link SailException} on close. - * + * * @author James Leigh */ public interface SailClosable extends AutoCloseable { /** * Closes this resource, relinquishing any underlying resources. - * + * * @throws SailException if this resource cannot be closed */ @Override diff --git a/core/sail/base/src/main/java/org/eclipse/rdf4j/sail/base/SailClosingIteration.java b/core/sail/base/src/main/java/org/eclipse/rdf4j/sail/base/SailClosingIteration.java index b25dc7fef74..b095e4f446a 100644 --- a/core/sail/base/src/main/java/org/eclipse/rdf4j/sail/base/SailClosingIteration.java +++ b/core/sail/base/src/main/java/org/eclipse/rdf4j/sail/base/SailClosingIteration.java @@ -21,14 +21,14 @@ * An {@link Iteration} that holds on to a {@link SailClosable} until the Iteration is closed. Upon closing, the * underlying Iteration is closed before the lock is released. This iterator closes itself as soon as all elements have * been read. - * + * * @author James Leigh */ abstract class SailClosingIteration extends IterationWrapper { /** * Creates a new {@link Iteration} that automatically closes the given {@link SailClosable}s. - * + * * @param iter The underlying Iteration, must not be null. * @param closes The {@link SailClosable}s to {@link SailClosable#close()} when the itererator is closed. * @return a {@link CloseableIteration} that closes the given {@link SailClosable} @@ -59,7 +59,7 @@ protected void handleSailException(SailException e) throws SailException { /** * Creates a new {@link Iteration} that automatically closes the given {@link SailClosable}s. - * + * * @param iter The underlying Iteration, must not be null. * @param closes The {@link SailClosable}s to {@link SailClosable#close()} when the itererator is closed. */ @@ -142,7 +142,7 @@ protected void handleClose() throws X { /** * Handler for exceptions generated by the closure of the {@link SailClosable} array given to this object.
    * This method is called after all of the {@link SailClosable} objects have had close called on them. - * + * * @param e The {@link SailException} to handle. * @throws X Instances of this generic-typed exception in response to the given {@link SailException} if the handler * decides to propagate the exception. diff --git a/core/sail/base/src/main/java/org/eclipse/rdf4j/sail/base/SailDataset.java b/core/sail/base/src/main/java/org/eclipse/rdf4j/sail/base/SailDataset.java index 2330aeaba93..5bc96534ce2 100644 --- a/core/sail/base/src/main/java/org/eclipse/rdf4j/sail/base/SailDataset.java +++ b/core/sail/base/src/main/java/org/eclipse/rdf4j/sail/base/SailDataset.java @@ -13,13 +13,14 @@ import org.eclipse.rdf4j.model.Namespace; import org.eclipse.rdf4j.model.Resource; import org.eclipse.rdf4j.model.Statement; +import org.eclipse.rdf4j.model.Triple; import org.eclipse.rdf4j.model.Value; import org.eclipse.rdf4j.sail.SailException; /** * A state of an {@link SailSource} at a point in time that will remain consistent until {@link #close()} is called. The * life cycle follows that of a read operation. - * + * * @author James Leigh */ public interface SailDataset extends SailClosable { @@ -35,7 +36,7 @@ public interface SailDataset extends SailClosable { /** * Gets the namespaces relevant to the data contained in this object. - * + * * @return An iterator over the relevant namespaces, should not contain any duplicates. * @throws SailException If this object encountered an error or unexpected situation internally. */ @@ -43,7 +44,7 @@ public interface SailDataset extends SailClosable { /** * Gets the namespace that is associated with the specified prefix, if any. - * + * * @param prefix A namespace prefix, or an empty string in case of the default namespace. * @return The namespace name that is associated with the specified prefix, or null if there is no such * namespace. @@ -54,7 +55,7 @@ public interface SailDataset extends SailClosable { /** * Returns the set of all unique context identifiers that are used to store statements. - * + * * @return An iterator over the context identifiers, should not contain any duplicates. */ CloseableIteration getContextIDs() throws SailException; @@ -63,7 +64,7 @@ public interface SailDataset extends SailClosable { * Gets all statements that have a specific subject, predicate and/or object. All three parameters may be null to * indicate wildcards. Optionally a (set of) context(s) may be specified in which case the result will be restricted * to statements matching one or more of the specified contexts. - * + * * @param subj A Resource specifying the subject, or null for a wildcard. * @param pred A IRI specifying the predicate, or null for a wildcard. * @param obj A Value specifying the object, or null for a wildcard. @@ -75,4 +76,19 @@ public interface SailDataset extends SailClosable { CloseableIteration getStatements(Resource subj, IRI pred, Value obj, Resource... contexts) throws SailException; + /** + * Gets all RDF* triples that have a specific subject, predicate and/or object. All three parameters may be null to + * indicate wildcards. + * + * @param subj A Resource specifying the subject, or null for a wildcard. + * @param pred A IRI specifying the predicate, or null for a wildcard. + * @param obj A Value specifying the object, or null for a wildcard. + * @return An iterator over the relevant triples. + * @throws SailException If the triple source failed to get the RDF* triples. + */ + default CloseableIteration getTriples(Resource subj, IRI pred, Value obj) + throws SailException { + throw new SailException("RDF* triple retrieval not supported by this store"); + } + } diff --git a/core/sail/base/src/main/java/org/eclipse/rdf4j/sail/base/SailDatasetImpl.java b/core/sail/base/src/main/java/org/eclipse/rdf4j/sail/base/SailDatasetImpl.java index dd8b9919681..4b1281b9105 100644 --- a/core/sail/base/src/main/java/org/eclipse/rdf4j/sail/base/SailDatasetImpl.java +++ b/core/sail/base/src/main/java/org/eclipse/rdf4j/sail/base/SailDatasetImpl.java @@ -15,6 +15,7 @@ import java.util.Map.Entry; import java.util.NoSuchElementException; import java.util.Set; +import java.util.function.Function; import org.eclipse.rdf4j.common.iteration.AbstractCloseableIteration; import org.eclipse.rdf4j.common.iteration.CloseableIteration; @@ -22,10 +23,10 @@ import org.eclipse.rdf4j.common.iteration.EmptyIteration; import org.eclipse.rdf4j.common.iteration.FilterIteration; import org.eclipse.rdf4j.model.IRI; -import org.eclipse.rdf4j.model.Model; import org.eclipse.rdf4j.model.Namespace; import org.eclipse.rdf4j.model.Resource; import org.eclipse.rdf4j.model.Statement; +import org.eclipse.rdf4j.model.Triple; import org.eclipse.rdf4j.model.Value; import org.eclipse.rdf4j.model.impl.SimpleNamespace; import org.eclipse.rdf4j.sail.SailException; @@ -265,17 +266,19 @@ public CloseableIteration getStatements(Reso } else { iter = derivedFrom.getStatements(subj, pred, obj, contexts); } - Model deprecated = changes.getDeprecated(); - if (deprecated != null && iter != null) { - iter = difference(iter, deprecated.filter(subj, pred, obj, contexts)); + if (changes.hasDeprecated() && iter != null) { + iter = difference(iter, changes::hasDeprecated); } - Model approved = changes.getApproved(); - if (approved != null && iter != null) { - return new DistinctModelReducingUnionIteration(iter, approved, (m) -> m.filter(subj, pred, obj, contexts)); + if (changes.hasApproved() && iter != null) { - } else if (approved != null) { - Iterator i = approved.filter(subj, pred, obj, contexts).iterator(); + return new DistinctModelReducingUnionIteration( + iter, + changes::removeApproved, + () -> changes.getApprovedStatements(subj, pred, obj, contexts)); + + } else if (changes.hasApproved()) { + Iterator i = changes.getApprovedStatements(subj, pred, obj, contexts).iterator(); return new CloseableIteratorIteration<>(i); } else if (iter != null) { return iter; @@ -284,16 +287,46 @@ public CloseableIteration getStatements(Reso } } - private CloseableIteration difference( - CloseableIteration result, final Model excluded) { - if (excluded.isEmpty()) { - return result; + @Override + public CloseableIteration getTriples(Resource subj, IRI pred, Value obj) + throws SailException { + CloseableIteration iter; + if (changes.isStatementCleared()) { + iter = null; + } else { + iter = derivedFrom.getTriples(subj, pred, obj); } + + if (iter == null) { + return new EmptyIteration<>(); + } + return iter; // TODO we will need to figure out a way to handle transaction isolation with deprecated and + // approved data +// Model deprecated = changes.getDeprecated(); +// if (deprecated != null && iter != null) { +// iter = difference(iter, deprecated.)); +// } +// Model approved = changes.getApproved(); +// if (approved != null && iter != null) { +// return new DistinctModelReducingUnionIteration(iter, approved, (m) -> m.filter(subj, pred, obj, contexts)); +// +// } else if (approved != null) { +// Iterator i = approved.filter(subj, pred, obj, contexts).iterator(); +// return new CloseableIteratorIteration<>(i); +// } else if (iter != null) { +// return iter; +// } else { +// return new EmptyIteration<>(); +// } + } + + private CloseableIteration difference( + CloseableIteration result, Function excluded) { return new FilterIteration(result) { @Override protected boolean accept(Statement stmt) { - return !excluded.contains(stmt); + return !excluded.apply(stmt); } }; } diff --git a/core/sail/base/src/main/java/org/eclipse/rdf4j/sail/base/SailDatasetTripleSource.java b/core/sail/base/src/main/java/org/eclipse/rdf4j/sail/base/SailDatasetTripleSource.java index e5cfdb1302f..dcaacd3efe9 100644 --- a/core/sail/base/src/main/java/org/eclipse/rdf4j/sail/base/SailDatasetTripleSource.java +++ b/core/sail/base/src/main/java/org/eclipse/rdf4j/sail/base/SailDatasetTripleSource.java @@ -13,16 +13,18 @@ import org.eclipse.rdf4j.model.IRI; import org.eclipse.rdf4j.model.Resource; import org.eclipse.rdf4j.model.Statement; +import org.eclipse.rdf4j.model.Triple; import org.eclipse.rdf4j.model.Value; import org.eclipse.rdf4j.model.ValueFactory; import org.eclipse.rdf4j.query.QueryEvaluationException; +import org.eclipse.rdf4j.query.algebra.evaluation.RDFStarTripleSource; import org.eclipse.rdf4j.query.algebra.evaluation.TripleSource; import org.eclipse.rdf4j.sail.SailException; /** * Implementation of the TripleSource interface using {@link SailDataset} */ -class SailDatasetTripleSource implements TripleSource { +class SailDatasetTripleSource implements TripleSource, RDFStarTripleSource { private final ValueFactory vf; @@ -65,4 +67,27 @@ protected QueryEvaluationException convert(Exception e) { } } + + static class TriplesIteration extends ExceptionConvertingIteration { + + public TriplesIteration(Iteration iter) { + super(iter); + } + + @Override + protected QueryEvaluationException convert(Exception e) { + return new QueryEvaluationException(e); + } + + } + + @Override + public CloseableIteration getRdfStarTriples(Resource subj, IRI pred, + Value obj) throws QueryEvaluationException { + try { + return new TriplesIteration(dataset.getTriples(subj, pred, obj)); + } catch (SailException e) { // TODO is this necessary? + throw new QueryEvaluationException(e); + } + } } diff --git a/core/sail/base/src/main/java/org/eclipse/rdf4j/sail/base/SailSink.java b/core/sail/base/src/main/java/org/eclipse/rdf4j/sail/base/SailSink.java index 1b143f60e15..e9530438bca 100644 --- a/core/sail/base/src/main/java/org/eclipse/rdf4j/sail/base/SailSink.java +++ b/core/sail/base/src/main/java/org/eclipse/rdf4j/sail/base/SailSink.java @@ -8,7 +8,6 @@ package org.eclipse.rdf4j.sail.base; import org.eclipse.rdf4j.IsolationLevels; -import org.eclipse.rdf4j.common.iteration.CloseableIteration; import org.eclipse.rdf4j.model.IRI; import org.eclipse.rdf4j.model.Resource; import org.eclipse.rdf4j.model.Statement; diff --git a/core/sail/base/src/main/java/org/eclipse/rdf4j/sail/base/SailSource.java b/core/sail/base/src/main/java/org/eclipse/rdf4j/sail/base/SailSource.java index eef25187110..bfa427be16c 100644 --- a/core/sail/base/src/main/java/org/eclipse/rdf4j/sail/base/SailSource.java +++ b/core/sail/base/src/main/java/org/eclipse/rdf4j/sail/base/SailSource.java @@ -16,7 +16,7 @@ * A persistent yet mutable source or container of RDF graphs. In which its state can change over time. The life cycle * follows that of a store and/or transactions. The {@link SailClosable#close()} is only applicable to results from * {@link #fork()}, not to the backing {@link SailSource} itself. - * + * * @author James Leigh */ public interface SailSource extends SailClosable { @@ -24,14 +24,14 @@ public interface SailSource extends SailClosable { /** * Creates a new branch of this source. When it's {@link #flush()} is called the changes are applied to this backing * source. - * + * * @return a branched {@link SailSource}. */ SailSource fork(); /** * Create a {@link SailSink} that when when its {@link #flush()} is called, the changes are applied to this source. - * + * * @param level If this level is compatible with {@link IsolationLevels#SERIALIZABLE} then a * {@link SailSink#prepare()} can throw a {@link SailConflictException}. * @return Newly created {@link SailSink} @@ -45,7 +45,7 @@ public interface SailSource extends SailClosable { * that are all derived from the same state of the backing {@link SailSource} (if applicable), that is the only * difference between the states of the {@link SailDataset} will be from changes using this * {@link #sink(IsolationLevel)}. - * + * * @param level If this is compatible with {@link IsolationLevels#SNAPSHOT_READ} the resulting {@link SailDataset} * will observe a single state of this {@link SailSource}. * @return an {@link SailDataset} of the current state @@ -57,7 +57,7 @@ public interface SailSource extends SailClosable { * Check the consistency of this branch and throws a {@link SailConflictException} if {@link #flush()}ing this * branch would cause the backing {@link SailSource} to be inconsistent, if applicable. If this is the final backing * {@link SailSource} calling this method has no effect. - * + * * @throws SailException */ void prepare() throws SailException; @@ -65,7 +65,7 @@ public interface SailSource extends SailClosable { /** * Apply all the changes to this branch to the backing {@link SailSource}, if applicable. If this is the final * backing {@link SailSource} calling this method has no effect. - * + * * @throws SailException */ void flush() throws SailException; diff --git a/core/sail/base/src/main/java/org/eclipse/rdf4j/sail/base/SailSourceBranch.java b/core/sail/base/src/main/java/org/eclipse/rdf4j/sail/base/SailSourceBranch.java index 58cac6dfab1..97c734862e7 100644 --- a/core/sail/base/src/main/java/org/eclipse/rdf4j/sail/base/SailSourceBranch.java +++ b/core/sail/base/src/main/java/org/eclipse/rdf4j/sail/base/SailSourceBranch.java @@ -11,6 +11,7 @@ import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; +import java.util.List; import java.util.Map; import java.util.Set; import java.util.concurrent.locks.ReentrantLock; @@ -23,7 +24,7 @@ import org.eclipse.rdf4j.model.Resource; import org.eclipse.rdf4j.model.Statement; import org.eclipse.rdf4j.model.Value; -import org.eclipse.rdf4j.model.impl.LinkedHashModelFactory; +import org.eclipse.rdf4j.model.impl.DynamicModelFactory; import org.eclipse.rdf4j.query.algebra.StatementPattern; import org.eclipse.rdf4j.query.algebra.Var; import org.eclipse.rdf4j.sail.SailException; @@ -96,7 +97,7 @@ class SailSourceBranch implements SailSource { * @param backingSource */ public SailSourceBranch(SailSource backingSource) { - this(backingSource, new LinkedHashModelFactory(), false); + this(backingSource, new DynamicModelFactory(), false); } /** @@ -350,10 +351,7 @@ void autoFlush() throws SailException { } private boolean isChanged(Changeset change) { - return change.getApproved() != null || change.getDeprecated() != null || change.getApprovedContexts() != null - || change.getDeprecatedContexts() != null || change.getAddedNamespaces() != null - || change.getRemovedPrefixes() != null || change.isStatementCleared() || change.isNamespaceCleared() - || change.getObservations() != null; + return change.isChanged(); } private SailDataset derivedFromSerializable(IsolationLevel level) throws SailException { @@ -483,13 +481,13 @@ private void flush(Changeset change, SailSink sink) throws SailException { if (deprecatedContexts != null && !deprecatedContexts.isEmpty()) { sink.clear(deprecatedContexts.toArray(new Resource[0])); } - Model deprecated = change.getDeprecated(); + List deprecated = change.getDeprecatedStatements(); if (deprecated != null) { for (Statement st : deprecated) { sink.deprecate(st); } } - Model approved = change.getApproved(); + List approved = change.getApprovedStatements(); if (approved != null) { for (Statement st : approved) { sink.approve(st); diff --git a/core/sail/base/src/main/java/org/eclipse/rdf4j/sail/base/SailSourceConnection.java b/core/sail/base/src/main/java/org/eclipse/rdf4j/sail/base/SailSourceConnection.java index aadab78bdbd..606cdc212b1 100644 --- a/core/sail/base/src/main/java/org/eclipse/rdf4j/sail/base/SailSourceConnection.java +++ b/core/sail/base/src/main/java/org/eclipse/rdf4j/sail/base/SailSourceConnection.java @@ -9,6 +9,8 @@ import java.util.HashMap; import java.util.Map; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicBoolean; import java.util.stream.Stream; import org.eclipse.rdf4j.IsolationLevel; @@ -32,6 +34,9 @@ import org.eclipse.rdf4j.query.algebra.evaluation.federation.FederatedServiceResolverClient; import org.eclipse.rdf4j.query.algebra.evaluation.impl.StrictEvaluationStrategy; import org.eclipse.rdf4j.query.algebra.evaluation.impl.StrictEvaluationStrategyFactory; +import org.eclipse.rdf4j.query.algebra.helpers.QueryModelTreeToGenericPlanNode; +import org.eclipse.rdf4j.query.explanation.Explanation; +import org.eclipse.rdf4j.query.explanation.ExplanationImpl; import org.eclipse.rdf4j.query.impl.EmptyBindingSet; import org.eclipse.rdf4j.sail.SailConnection; import org.eclipse.rdf4j.sail.SailException; @@ -122,6 +127,19 @@ public abstract class SailSourceConnection extends NotifyingSailConnectionBase */ private volatile FederatedServiceResolver federatedServiceResolver; + // The context that represents the unnamed graph + static final Resource[] NULL_CTX = new Resource[] { null }; + + // Track the result sizes generated when evaluating a query, used by explain(...) + private boolean trackResultSize; + + // By default all tuple expressions are cloned before being optimized and executed. We don't want to do this for + // .explain(...) since we need to retrieve the optimized or executed plan. + private boolean cloneTupleExpression = true; + + // Track the time used when evaluating a query, used by explain(...) + private boolean trackTime; + /*--------------* * Constructors * *--------------*/ @@ -193,8 +211,10 @@ protected CloseableIteration eva flush(); logger.trace("Incoming query model:\n{}", tupleExpr); - // Clone the tuple expression to allow for more aggresive optimizations - tupleExpr = tupleExpr.clone(); + if (cloneTupleExpression) { + // Clone the tuple expression to allow for more aggressive optimizations + tupleExpr = tupleExpr.clone(); + } if (!(tupleExpr instanceof QueryRoot)) { // Add a dummy root node to the tuple expressions to allow the @@ -204,8 +224,7 @@ protected CloseableIteration eva SailSource branch = null; SailDataset rdfDataset = null; - CloseableIteration iter1 = null; - CloseableIteration iter2 = null; + CloseableIteration iteration = null; boolean allGood = false; try { @@ -214,44 +233,150 @@ protected CloseableIteration eva TripleSource tripleSource = new SailDatasetTripleSource(vf, rdfDataset); EvaluationStrategy strategy = getEvaluationStrategy(dataset, tripleSource); + if (trackResultSize) { + strategy.setTrackResultSize(trackResultSize); + } + + if (trackTime) { + strategy.setTrackTime(trackTime); + } tupleExpr = strategy.optimize(tupleExpr, store.getEvaluationStatistics(), bindings); logger.trace("Optimized query model:\n{}", tupleExpr); - iter1 = strategy.evaluate(tupleExpr, EmptyBindingSet.getInstance()); - iter2 = interlock(iter1, rdfDataset, branch); + iteration = strategy.evaluate(tupleExpr, EmptyBindingSet.getInstance()); + iteration = interlock(iteration, rdfDataset, branch); allGood = true; - return iter2; + return iteration; } catch (QueryEvaluationException e) { throw new SailException(e); } finally { if (!allGood) { + try { - if (iter2 != null) { - iter2.close(); + if (iteration != null) { + iteration.close(); } } finally { try { - if (iter1 != null) { - iter1.close(); + if (rdfDataset != null) { + rdfDataset.close(); } } finally { - try { - if (rdfDataset != null) { - rdfDataset.close(); - } - } finally { - if (branch != null) { - branch.close(); - } + if (branch != null) { + branch.close(); } } + } } } } + @Override + public Explanation explain(Explanation.Level level, TupleExpr tupleExpr, Dataset dataset, + BindingSet bindings, boolean includeInferred, int timeoutSeconds) { + boolean queryTimedOut = false; + + try { + + switch (level) { + case Timed: + this.trackTime = true; + this.trackResultSize = true; + this.cloneTupleExpression = false; + + queryTimedOut = runQueryForExplain(tupleExpr, dataset, bindings, includeInferred, timeoutSeconds); + break; + + case Executed: + this.trackResultSize = true; + this.cloneTupleExpression = false; + + queryTimedOut = runQueryForExplain(tupleExpr, dataset, bindings, includeInferred, timeoutSeconds); + break; + + case Optimized: + this.cloneTupleExpression = false; + + evaluate(tupleExpr, dataset, bindings, includeInferred).close(); + + break; + + case Unoptimized: + break; + + default: + throw new UnsupportedOperationException("Unsupported query explanation level: " + level); + + } + + } finally { + this.cloneTupleExpression = true; + this.trackResultSize = false; + this.trackTime = false; + } + + QueryModelTreeToGenericPlanNode converter = new QueryModelTreeToGenericPlanNode(tupleExpr); + tupleExpr.visit(converter); + + return new ExplanationImpl(converter.getGenericPlanNode(), queryTimedOut); + + } + + private boolean runQueryForExplain(TupleExpr tupleExpr, Dataset dataset, BindingSet bindings, + boolean includeInferred, int timeoutSeconds) { + + AtomicBoolean timedOut = new AtomicBoolean(false); + + Thread currentThread = Thread.currentThread(); + + // selfInterruptOnTimeoutThread will interrupt the current thread after a set timeout to stop the query + // execution + Thread selfInterruptOnTimeoutThread = new Thread(() -> { + try { + TimeUnit.SECONDS.sleep(timeoutSeconds); + currentThread.interrupt(); + timedOut.set(true); + } catch (InterruptedException ignored) { + + } + }); + + try { + selfInterruptOnTimeoutThread.start(); + + try (CloseableIteration evaluate = evaluate(tupleExpr, + dataset, bindings, includeInferred)) { + while (evaluate.hasNext()) { + if (Thread.interrupted()) { + break; + } + evaluate.next(); + } + } catch (Exception e) { + if (!timedOut.get()) { + throw e; + } + } + + return timedOut.get(); + + } finally { + selfInterruptOnTimeoutThread.interrupt(); + try { + // make sure selfInterruptOnTimeoutThread finishes + selfInterruptOnTimeoutThread.join(); + } catch (InterruptedException ignored) { + } + + // clear interrupted flag; + Thread.interrupted(); + } + + } + @Override protected void closeInternal() throws SailException { // no-op @@ -544,9 +669,9 @@ public boolean addInferredStatement(Resource subj, IRI pred, Value obj, Resource } boolean modified = false; if (contexts.length == 0) { - if (!hasStatement(explicitOnlyDataset, subj, pred, obj)) { + if (!hasStatement(explicitOnlyDataset, subj, pred, obj, NULL_CTX)) { // only add inferred statements that aren't already explicit - if (!hasStatement(inferredOnlyDataset, subj, pred, obj)) { + if (!hasStatement(inferredOnlyDataset, subj, pred, obj, NULL_CTX)) { // only report inferred statements that don't already // exist addStatementInternal(subj, pred, obj, contexts); @@ -578,7 +703,7 @@ public boolean addInferredStatement(Resource subj, IRI pred, Value obj, Resource private void add(Resource subj, IRI pred, Value obj, SailDataset dataset, SailSink sink, Resource... contexts) throws SailException { if (contexts.length == 0) { - if (hasConnectionListeners() && !hasStatement(dataset, subj, pred, obj)) { + if (hasConnectionListeners() && !hasStatement(dataset, subj, pred, obj, NULL_CTX)) { notifyStatementAdded(vf.createStatement(subj, pred, obj)); } sink.approve(subj, pred, obj, null); diff --git a/core/sail/base/src/main/java/org/eclipse/rdf4j/sail/base/SailStore.java b/core/sail/base/src/main/java/org/eclipse/rdf4j/sail/base/SailStore.java index b240a42359f..d8be8932ad7 100644 --- a/core/sail/base/src/main/java/org/eclipse/rdf4j/sail/base/SailStore.java +++ b/core/sail/base/src/main/java/org/eclipse/rdf4j/sail/base/SailStore.java @@ -12,21 +12,21 @@ /** * A high level interface used by {@link SailSourceConnection} to access {@link SailSource}. - * + * * @author James Leigh */ public interface SailStore extends SailClosable { /** * The {@link ValueFactory} that should be used in association with this. - * + * * @return this object's {@link ValueFactory} */ ValueFactory getValueFactory(); /** * Used by {@link SailSourceConnection} to determine query join order. - * + * * @return a {@link EvaluationStatistics} that is aware of the data distribution of this {@link SailStore} . */ EvaluationStatistics getEvaluationStatistics(); @@ -41,4 +41,4 @@ public interface SailStore extends SailClosable { */ SailSource getInferredSailSource(); -} \ No newline at end of file +} diff --git a/core/sail/base/src/main/java/org/eclipse/rdf4j/sail/base/SnapshotSailStore.java b/core/sail/base/src/main/java/org/eclipse/rdf4j/sail/base/SnapshotSailStore.java index 7a0a70a5303..21acfaaf1aa 100644 --- a/core/sail/base/src/main/java/org/eclipse/rdf4j/sail/base/SnapshotSailStore.java +++ b/core/sail/base/src/main/java/org/eclipse/rdf4j/sail/base/SnapshotSailStore.java @@ -16,7 +16,7 @@ /** * A {@link SailStore} wrapper that branches the backing {@link SailSource}s to provide concurrent * {@link IsolationLevels#SNAPSHOT_READ} isolation and higher. - * + * * @author James Leigh */ public class SnapshotSailStore implements SailStore { @@ -38,7 +38,7 @@ public class SnapshotSailStore implements SailStore { /** * Wraps an {@link SailStore}, tracking changes in {@link ModelFactory} instances. - * + * * @param backingStore * @param modelFactory */ diff --git a/core/sail/base/src/main/java/org/eclipse/rdf4j/sail/base/UnionSailDataset.java b/core/sail/base/src/main/java/org/eclipse/rdf4j/sail/base/UnionSailDataset.java index 72f8bc735c0..80036067920 100644 --- a/core/sail/base/src/main/java/org/eclipse/rdf4j/sail/base/UnionSailDataset.java +++ b/core/sail/base/src/main/java/org/eclipse/rdf4j/sail/base/UnionSailDataset.java @@ -15,12 +15,13 @@ import org.eclipse.rdf4j.model.Namespace; import org.eclipse.rdf4j.model.Resource; import org.eclipse.rdf4j.model.Statement; +import org.eclipse.rdf4j.model.Triple; import org.eclipse.rdf4j.model.Value; import org.eclipse.rdf4j.sail.SailException; /** * Combines multiple {@link SailDataset} into a single view. - * + * * @author James Leigh */ class UnionSailDataset implements SailDataset { @@ -32,7 +33,7 @@ class UnionSailDataset implements SailDataset { /** * Creates a new {@link SailDataset} that includes all the given {@link SailDataset}s. - * + * * @param datasets */ public UnionSailDataset(SailDataset... datasets) { @@ -93,6 +94,17 @@ public CloseableIteration getStatements(Reso return union(result); } + @Override + public CloseableIteration getTriples(Resource subj, IRI pred, Value obj) + throws SailException { + CloseableIteration[] result; + result = new CloseableIteration[datasets.length]; + for (int i = 0; i < datasets.length; i++) { + result[i] = datasets[i].getTriples(subj, pred, obj); + } + return union(result); + } + private CloseableIteration union( CloseableIteration[] items) { return new UnionIteration<>(items); diff --git a/core/sail/base/src/main/java/org/eclipse/rdf4j/sail/base/config/BaseSailConfig.java b/core/sail/base/src/main/java/org/eclipse/rdf4j/sail/base/config/BaseSailConfig.java index 3ed6f8540e7..502866bb75e 100644 --- a/core/sail/base/src/main/java/org/eclipse/rdf4j/sail/base/config/BaseSailConfig.java +++ b/core/sail/base/src/main/java/org/eclipse/rdf4j/sail/base/config/BaseSailConfig.java @@ -7,7 +7,8 @@ *******************************************************************************/ package org.eclipse.rdf4j.sail.base.config; -import static org.eclipse.rdf4j.sail.base.config.BaseSailSchema.*; +import static org.eclipse.rdf4j.sail.base.config.BaseSailSchema.EVALUATION_STRATEGY_FACTORY; +import static org.eclipse.rdf4j.sail.base.config.BaseSailSchema.NAMESPACE; import org.eclipse.rdf4j.model.Model; import org.eclipse.rdf4j.model.Resource; @@ -68,7 +69,7 @@ public void parse(Model graph, Resource implNode) throws SailConfigException { try { - Models.objectLiteral(graph.filter(implNode, EVALUATION_STRATEGY_FACTORY, null)) + Models.objectLiteral(graph.getStatements(implNode, EVALUATION_STRATEGY_FACTORY, null)) .ifPresent(factoryClassName -> { setEvaluationStrategyFactoryClassName(factoryClassName.stringValue()); }); diff --git a/core/sail/base/src/main/java/org/eclipse/rdf4j/sail/inferencer/InferencerConnection.java b/core/sail/base/src/main/java/org/eclipse/rdf4j/sail/inferencer/InferencerConnection.java index 76adbca16b8..d7314c11a55 100644 --- a/core/sail/base/src/main/java/org/eclipse/rdf4j/sail/inferencer/InferencerConnection.java +++ b/core/sail/base/src/main/java/org/eclipse/rdf4j/sail/inferencer/InferencerConnection.java @@ -23,7 +23,7 @@ public interface InferencerConnection extends NotifyingSailConnection { /** * Adds an inferred statement to a specific context. - * + * * @param subj The subject of the statement to add. * @param pred The predicate of the statement to add. * @param obj The object of the statement to add. @@ -37,7 +37,7 @@ public interface InferencerConnection extends NotifyingSailConnection { /** * Removes an inferred statement from a specific context. - * + * * @param subj The subject of the statement that should be removed. * @param pred The predicate of the statement that should be removed. * @param obj The object of the statement that should be removed. @@ -53,7 +53,7 @@ public boolean removeInferredStatement(Resource subj, IRI pred, Value obj, Resou /** * Removes all inferred statements from the specified/all contexts. If no contexts are specified the method operates * on the entire repository. - * + * * @param contexts The context(s) from which to remove the statements. Note that this parameter is a vararg and as * such is optional. If no contexts are supplied the method operates on the entire repository. * @throws SailException If the statements could not be removed. @@ -64,7 +64,7 @@ public boolean removeInferredStatement(Resource subj, IRI pred, Value obj, Resou /** * Flushes any pending updates to be processed and the resulting changes to be reported to registered * {@link SailConnectionListener}s. - * + * * @throws SailException If the updates could not be processed. * @throws IllegalStateException If the connection has been closed. */ diff --git a/core/sail/base/src/main/java/org/eclipse/rdf4j/sail/inferencer/InferencerConnectionWrapper.java b/core/sail/base/src/main/java/org/eclipse/rdf4j/sail/inferencer/InferencerConnectionWrapper.java index 3db26f33842..38ba453b1cd 100644 --- a/core/sail/base/src/main/java/org/eclipse/rdf4j/sail/inferencer/InferencerConnectionWrapper.java +++ b/core/sail/base/src/main/java/org/eclipse/rdf4j/sail/inferencer/InferencerConnectionWrapper.java @@ -21,7 +21,7 @@ /** * An extension of ConnectionWrapper that implements the {@link InferencerConnection} interface. - * + * * @author Arjohn Kampman */ public class InferencerConnectionWrapper extends NotifyingSailConnectionWrapper implements InferencerConnection { @@ -43,7 +43,7 @@ public InferencerConnectionWrapper(InferencerConnection con) { /** * Gets the connection that is wrapped by this object. - * + * * @return The connection that was supplied to the constructor of this class. */ @Override diff --git a/core/sail/base/src/test/java/org/eclipse/rdf4j/sail/base/ChangesetTest.java b/core/sail/base/src/test/java/org/eclipse/rdf4j/sail/base/ChangesetTest.java new file mode 100644 index 00000000000..12567a23a3c --- /dev/null +++ b/core/sail/base/src/test/java/org/eclipse/rdf4j/sail/base/ChangesetTest.java @@ -0,0 +1,126 @@ +/******************************************************************************* + * Copyright (c) 2020 Eclipse RDF4J contributors. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Distribution License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ +package org.eclipse.rdf4j.sail.base; + +import java.util.Iterator; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import org.eclipse.rdf4j.model.Model; +import org.eclipse.rdf4j.model.Resource; +import org.eclipse.rdf4j.model.Statement; +import org.eclipse.rdf4j.model.impl.LinkedHashModel; +import org.eclipse.rdf4j.model.impl.SimpleValueFactory; +import org.eclipse.rdf4j.model.vocabulary.RDF; +import org.eclipse.rdf4j.model.vocabulary.RDFS; +import org.eclipse.rdf4j.sail.SailException; +import org.junit.Test; + +public class ChangesetTest { + + SimpleValueFactory vf = SimpleValueFactory.getInstance(); + Resource[] allGraph = {}; + + @Test + public void testConcurrency() throws InterruptedException, ExecutionException { + + Changeset changeset = getChangeset(); + + CountDownLatch countDownLatch = new CountDownLatch(3); + + ExecutorService executorService = Executors.newFixedThreadPool(3, + r -> { + Thread t = Executors.defaultThreadFactory().newThread(r); + // this thread pool does not need to stick around if the all other threads are done + t.setDaemon(true); + return t; + }); + + Runnable addingData = () -> { + countDownLatch.countDown(); + try { + countDownLatch.await(); + } catch (InterruptedException e) { + e.printStackTrace(); + } + for (int i = 0; i < 100000; i++) { + changeset.approve(vf.createStatement(vf.createBNode(), RDF.TYPE, RDFS.RESOURCE)); + } + + }; + + Runnable readingData = () -> { + countDownLatch.countDown(); + try { + countDownLatch.await(); + } catch (InterruptedException e) { + e.printStackTrace(); + } + for (int i = 0; i < 100000; i++) { + changeset.hasApproved(null, RDF.TYPE, RDFS.RESOURCE, allGraph); + } + }; + + Runnable readingDataIterator = () -> { + countDownLatch.countDown(); + try { + countDownLatch.await(); + } catch (InterruptedException e) { + e.printStackTrace(); + } + + while (!changeset.hasApproved(null, RDF.TYPE, RDFS.RESOURCE, allGraph)) { + Thread.yield(); + } + + for (int i = 0; i < 100; i++) { + Iterator approvedStatements = changeset.getApprovedStatements(null, RDF.TYPE, null, allGraph) + .iterator(); + + for (int j = 0; j < 100 && approvedStatements.hasNext(); j++) { + approvedStatements.next(); + } + + } + }; + + Stream.of(addingData, readingData, readingDataIterator) + .map(executorService::submit) + .collect(Collectors.toList()) + .forEach(future -> { + try { + future.get(); + } catch (InterruptedException | ExecutionException e) { + throw new RuntimeException(e); + } + }); + + executorService.shutdown(); + executorService.shutdownNow(); + } + + private Changeset getChangeset() { + return new Changeset() { + @Override + public void flush() throws SailException { + + } + + @Override + public Model createEmptyModel() { + // don't use the dynamic model here, we don't want to test upgrading + return new LinkedHashModel(); + } + }; + } + +} diff --git a/core/sail/elasticsearch-store/pom.xml b/core/sail/elasticsearch-store/pom.xml index f4d390d0b20..1819715cbde 100644 --- a/core/sail/elasticsearch-store/pom.xml +++ b/core/sail/elasticsearch-store/pom.xml @@ -4,7 +4,7 @@ org.eclipse.rdf4j rdf4j-sail - 3.1.5-SNAPSHOT + 3.2.2-SNAPSHOT rdf4j-sail-elasticsearch-store RDF4J Elasticsearch Store @@ -88,5 +88,11 @@ rdf4j-sail-extensible-store ${project.version} + + ${project.groupId} + rdf4j-sail-inferencer + ${project.version} + test + diff --git a/core/sail/elasticsearch-store/src/main/java/org/eclipse/rdf4j/sail/elasticsearchstore/ElasticsearchContextStatement.java b/core/sail/elasticsearch-store/src/main/java/org/eclipse/rdf4j/sail/elasticsearchstore/ElasticsearchContextStatement.java index bd0e4ab172a..5f0fb5e81a9 100644 --- a/core/sail/elasticsearch-store/src/main/java/org/eclipse/rdf4j/sail/elasticsearchstore/ElasticsearchContextStatement.java +++ b/core/sail/elasticsearch-store/src/main/java/org/eclipse/rdf4j/sail/elasticsearchstore/ElasticsearchContextStatement.java @@ -10,18 +10,18 @@ import org.eclipse.rdf4j.model.IRI; import org.eclipse.rdf4j.model.Resource; import org.eclipse.rdf4j.model.Value; -import org.eclipse.rdf4j.model.impl.ContextStatement; +import org.eclipse.rdf4j.sail.extensiblestore.valuefactory.ExtensibleContextStatement; /** * @author HÃ¥vard Mikkelsen Ottestad */ -class ElasticsearchContextStatement extends ContextStatement implements ElasticsearchId { +class ElasticsearchContextStatement extends ExtensibleContextStatement implements ElasticsearchId { private String elasticsearchId; ElasticsearchContextStatement(String elasticsearchId, Resource subject, IRI predicate, Value object, - Resource context) { - super(subject, predicate, object, context); + Resource context, boolean inferred) { + super(subject, predicate, object, context, inferred); this.elasticsearchId = elasticsearchId; } diff --git a/core/sail/elasticsearch-store/src/main/java/org/eclipse/rdf4j/sail/elasticsearchstore/ElasticsearchDataStructure.java b/core/sail/elasticsearch-store/src/main/java/org/eclipse/rdf4j/sail/elasticsearchstore/ElasticsearchDataStructure.java index c93e0daa142..451d0874cbc 100644 --- a/core/sail/elasticsearch-store/src/main/java/org/eclipse/rdf4j/sail/elasticsearchstore/ElasticsearchDataStructure.java +++ b/core/sail/elasticsearch-store/src/main/java/org/eclipse/rdf4j/sail/elasticsearchstore/ElasticsearchDataStructure.java @@ -7,13 +7,12 @@ *******************************************************************************/ package org.eclipse.rdf4j.sail.elasticsearchstore; -import static org.elasticsearch.index.query.QueryBuilders.matchAllQuery; - import java.io.IOException; import java.nio.charset.StandardCharsets; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.HashMap; @@ -22,6 +21,7 @@ import java.util.Map; import java.util.Set; import java.util.stream.Collectors; +import java.util.stream.Stream; import org.apache.commons.io.IOUtils; import org.eclipse.rdf4j.common.iteration.CloseableIteration; @@ -30,17 +30,19 @@ import org.eclipse.rdf4j.model.IRI; import org.eclipse.rdf4j.model.Literal; import org.eclipse.rdf4j.model.Resource; -import org.eclipse.rdf4j.model.Statement; import org.eclipse.rdf4j.model.Value; import org.eclipse.rdf4j.sail.SailException; import org.eclipse.rdf4j.sail.extensiblestore.DataStructureInterface; +import org.eclipse.rdf4j.sail.extensiblestore.valuefactory.ExtensibleStatement; import org.elasticsearch.action.DocWriteRequest; import org.elasticsearch.action.admin.indices.create.CreateIndexRequest; import org.elasticsearch.action.admin.indices.exists.indices.IndicesExistsRequest; +import org.elasticsearch.action.admin.indices.stats.IndicesStatsResponse; import org.elasticsearch.action.bulk.BulkItemResponse; import org.elasticsearch.action.bulk.BulkRequestBuilder; import org.elasticsearch.action.bulk.BulkResponse; import org.elasticsearch.client.Client; +import org.elasticsearch.client.IndicesAdminClient; import org.elasticsearch.common.xcontent.XContentType; import org.elasticsearch.index.engine.VersionConflictEngineException; import org.elasticsearch.index.query.BoolQueryBuilder; @@ -61,7 +63,7 @@ class ElasticsearchDataStructure implements DataStructureInterface { private int BUFFER_THRESHOLD = 1024 * 16; private final ClientProvider clientProvider; - private Set addStatementBuffer = new HashSet<>(); + private Set addStatementBuffer = new HashSet<>(); private Set deleteStatementBuffer = new HashSet<>(); private final static ElasticsearchValueFactory vf = ElasticsearchValueFactory.getInstance(); @@ -88,7 +90,7 @@ class ElasticsearchDataStructure implements DataStructureInterface { } @Override - synchronized public void addStatement(Statement statement) { + synchronized public void addStatement(ExtensibleStatement statement) { if (addStatementBuffer.size() >= BUFFER_THRESHOLD) { flushAddStatementBuffer(); } @@ -98,7 +100,7 @@ synchronized public void addStatement(Statement statement) { } @Override - synchronized public void removeStatement(Statement statement) { + synchronized public void removeStatement(ExtensibleStatement statement) { ElasticsearchId elasticsearchIdStatement; @@ -112,10 +114,10 @@ synchronized public void removeStatement(Statement statement) { if (statement.getContext() == null) { elasticsearchIdStatement = vf.createStatement(id, statement.getSubject(), statement.getPredicate(), - statement.getPredicate()); + statement.getPredicate(), statement.isInferred()); } else { elasticsearchIdStatement = vf.createStatement(id, statement.getSubject(), statement.getPredicate(), - statement.getPredicate(), statement.getContext()); + statement.getPredicate(), statement.getContext(), statement.isInferred()); } } @@ -129,7 +131,7 @@ synchronized public void removeStatement(Statement statement) { } @Override - public void addStatement(Collection statements) { + public void addStatement(Collection statements) { addStatementBuffer.addAll(statements); if (addStatementBuffer.size() >= BUFFER_THRESHOLD) { flushAddStatementBuffer(); @@ -137,10 +139,10 @@ public void addStatement(Collection statements) { } @Override - synchronized public void clear(Resource[] contexts) { + synchronized public void clear(boolean inferred, Resource[] contexts) { BulkByScrollResponse response = DeleteByQueryAction.INSTANCE.newRequestBuilder(clientProvider.getClient()) - .filter(getQueryBuilder(null, null, null, contexts)) + .filter(getQueryBuilder(null, null, null, inferred, contexts)) .abortOnVersionConflict(false) .source(index) .get(); @@ -154,21 +156,21 @@ public void flushForCommit() { } @Override - public CloseableIteration getStatements(Resource subject, + public CloseableIteration getStatements(Resource subject, IRI predicate, - Value object, Resource... context) { + Value object, boolean inferred, Resource... context) { - QueryBuilder queryBuilder = getQueryBuilder(subject, predicate, object, context); + QueryBuilder queryBuilder = getQueryBuilder(subject, predicate, object, inferred, context); - return new LookAheadIteration() { + return new LookAheadIteration() { CloseableIteration iterator = ElasticsearchHelper .getScrollingIterator(queryBuilder, clientProvider.getClient(), index, scrollTimeout); @Override - protected Statement getNextElement() throws SailException { + protected ExtensibleStatement getNextElement() throws SailException { - Statement next = null; + ExtensibleStatement next = null; while (next == null && iterator.hasNext()) { SearchHit nextSearchHit = iterator.next(); @@ -177,7 +179,7 @@ protected Statement getNextElement() throws SailException { String id = nextSearchHit.getId(); - Statement statement = sourceToStatement(sourceAsMap, id, subject, predicate, object); + ExtensibleStatement statement = sourceToStatement(sourceAsMap, id, subject, predicate, object); // we use hash to lookup the object value because the object can be bigger than what elasticsearch // allows as max for keyword (32766 bytes), so it needs to be stored in a text field that is not @@ -213,13 +215,12 @@ protected void handleClose() throws SailException { } - private QueryBuilder getQueryBuilder(Resource subject, IRI predicate, Value object, Resource[] contexts) { - boolean matchAll = true; + private QueryBuilder getQueryBuilder(Resource subject, IRI predicate, Value object, boolean inferred, + Resource[] contexts) { BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery(); if (subject != null) { - matchAll = false; boolQueryBuilder.must(QueryBuilders.termQuery("subject", subject.stringValue())); if (subject instanceof IRI) { boolQueryBuilder.must(QueryBuilders.termQuery("subject_IRI", true)); @@ -229,12 +230,10 @@ private QueryBuilder getQueryBuilder(Resource subject, IRI predicate, Value obje } if (predicate != null) { - matchAll = false; boolQueryBuilder.must(QueryBuilders.termQuery("predicate", predicate.stringValue())); } if (object != null) { - matchAll = false; boolQueryBuilder.must(QueryBuilders.termQuery("object_Hash", object.stringValue().hashCode())); if (object instanceof IRI) { boolQueryBuilder.must(QueryBuilders.termQuery("object_IRI", true)); @@ -251,7 +250,6 @@ private QueryBuilder getQueryBuilder(Resource subject, IRI predicate, Value obje } if (contexts != null && contexts.length > 0) { - matchAll = false; BoolQueryBuilder contextQueryBuilder = new BoolQueryBuilder(); @@ -281,36 +279,23 @@ private QueryBuilder getQueryBuilder(Resource subject, IRI predicate, Value obje } - QueryBuilder queryBuilder; - - if (matchAll) { - queryBuilder = matchAllQuery(); - } else { - queryBuilder = boolQueryBuilder; - - } + boolQueryBuilder.must(QueryBuilders.termQuery("inferred", inferred)); - return QueryBuilders.constantScoreQuery(queryBuilder); + return QueryBuilders.constantScoreQuery(boolQueryBuilder); } @Override public void flushForReading() { - Client client = clientProvider.getClient(); - flushAddStatementBuffer(); flushRemoveStatementBuffer(); - client.admin() - .indices() - .prepareRefresh(index) - .get(); - + refreshIndex(); } private void flushAddStatementBuffer() { - Set workingBuffer = null; + Set workingBuffer = null; try { synchronized (this) { @@ -321,11 +306,10 @@ private void flushAddStatementBuffer() { addStatementBuffer = new HashSet<>(Math.min(addStatementBuffer.size(), BUFFER_THRESHOLD)); } - BulkRequestBuilder bulkRequest = clientProvider.getClient().prepareBulk(); - int failures = 0; do { + BulkRequestBuilder bulkRequest = clientProvider.getClient().prepareBulk(); workingBuffer @@ -333,43 +317,7 @@ private void flushAddStatementBuffer() { .parallel() .map(statement -> { - Map jsonMap = new HashMap<>(); - - jsonMap.put("subject", statement.getSubject().stringValue()); - jsonMap.put("predicate", statement.getPredicate().stringValue()); - jsonMap.put("object", statement.getObject().stringValue()); - jsonMap.put("object_Hash", statement.getObject().stringValue().hashCode()); - - Resource context = statement.getContext(); - - if (context != null) { - jsonMap.put("context", context.stringValue()); - - if (context instanceof IRI) { - jsonMap.put("context_IRI", true); - } else { - jsonMap.put("context_BNode", true); - } - } - - if (statement.getSubject() instanceof IRI) { - jsonMap.put("subject_IRI", true); - } else { - jsonMap.put("subject_BNode", true); - } - - if (statement.getObject() instanceof IRI) { - jsonMap.put("object_IRI", true); - } else if (statement.getObject() instanceof BNode) { - jsonMap.put("object_BNode", true); - } else { - jsonMap.put("object_Datatype", - ((Literal) statement.getObject()).getDatatype().stringValue()); - if (((Literal) statement.getObject()).getLanguage().isPresent()) { - jsonMap.put("object_Lang", ((Literal) statement.getObject()).getLanguage().get()); - - } - } + Map jsonMap = statementToJsonMap(statement); return new BuilderAndSha(sha256(statement), jsonMap); @@ -389,9 +337,6 @@ private void flushAddStatementBuffer() { List bulkItemResponses = getBulkItemResponses(bulkResponse); - logger.info("Elasticsearch has failures when adding data, retrying. Message: {}", - bulkResponse.buildFailureMessage()); - boolean onlyVersionConflicts = bulkItemResponses.stream() .filter(BulkItemResponse::isFailed) .allMatch(resp -> resp.getFailure().getCause() instanceof VersionConflictEngineException); @@ -412,7 +357,7 @@ private void flushAddStatementBuffer() { .filter(statement -> { String sha256 = sha256(statement); - Statement statementById = getStatementById(sha256); + ExtensibleStatement statementById = getStatementById(sha256); return !statement.equals(statementById); }) @@ -429,18 +374,27 @@ private void flushAddStatementBuffer() { }) .collect(Collectors.toSet()); + if (!workingBuffer.isEmpty()) { + failures++; + } + } else { failures++; - if (failures > 10) { - throw new RuntimeException("Elasticsearch has failed " + failures - + " times when adding data, retrying. Message: " - + bulkResponse.buildFailureMessage()); - } - try { - Thread.sleep(failures * 100); - } catch (InterruptedException ignored) { - } + logger.info("Elasticsearch has failures when adding data, retrying. Message: {}", + bulkResponse.buildFailureMessage()); + + } + + if (failures > 10) { + throw new RuntimeException("Elasticsearch has failed " + failures + + " times when adding data, retrying. Message: " + + bulkResponse.buildFailureMessage()); + } + + try { + Thread.sleep(failures * 100); + } catch (InterruptedException ignored) { } } else { @@ -460,12 +414,51 @@ private void flushAddStatementBuffer() { } } } + } + + private Map statementToJsonMap(ExtensibleStatement statement) { + Map jsonMap = new HashMap<>(); + + jsonMap.put("subject", statement.getSubject().stringValue()); + jsonMap.put("predicate", statement.getPredicate().stringValue()); + jsonMap.put("object", statement.getObject().stringValue()); + jsonMap.put("object_Hash", statement.getObject().stringValue().hashCode()); + jsonMap.put("inferred", statement.isInferred()); + + Resource context = statement.getContext(); + + if (context != null) { + jsonMap.put("context", context.stringValue()); + + if (context instanceof IRI) { + jsonMap.put("context_IRI", true); + } else { + jsonMap.put("context_BNode", true); + } + } + + if (statement.getSubject() instanceof IRI) { + jsonMap.put("subject_IRI", true); + } else { + jsonMap.put("subject_BNode", true); + } - return; + if (statement.getObject() instanceof IRI) { + jsonMap.put("object_IRI", true); + } else if (statement.getObject() instanceof BNode) { + jsonMap.put("object_BNode", true); + } else { + jsonMap.put("object_Datatype", + ((Literal) statement.getObject()).getDatatype().stringValue()); + if (((Literal) statement.getObject()).getLanguage().isPresent()) { + jsonMap.put("object_Lang", ((Literal) statement.getObject()).getLanguage().get()); + } + } + return jsonMap; } - private Statement getStatementById(String sha256) { + private ExtensibleStatement getStatementById(String sha256) { Map source = clientProvider.getClient() .prepareGet(index, ELASTICSEARCH_TYPE, sha256) .get() @@ -476,12 +469,7 @@ private Statement getStatementById(String sha256) { } private List getBulkItemResponses(BulkResponse bulkResponse) { - List bulkItemResponses = new ArrayList<>(); - - for (BulkItemResponse bulkItemResponse : bulkResponse) { - bulkItemResponses.add(bulkItemResponse); - } - return bulkItemResponses; + return Arrays.asList(bulkResponse.getItems()); } synchronized private void flushRemoveStatementBuffer() { @@ -524,8 +512,6 @@ synchronized private void flushRemoveStatementBuffer() { deleteStatementBuffer = Collections.synchronizedSet(new HashSet<>(BUFFER_THRESHOLD)); - return; - } @Override @@ -544,8 +530,12 @@ public void init() { clientProvider.getClient().admin().indices().create(request).actionGet(); } - clientProvider.getClient().admin().indices().prepareRefresh(index).get(); + refreshIndex(); + + } + private void refreshIndex() { + clientProvider.getClient().admin().indices().prepareRefresh(index).get(); } void setElasticsearchScrollTimeout(int timeout) { @@ -554,16 +544,16 @@ void setElasticsearchScrollTimeout(int timeout) { @Override public synchronized boolean removeStatementsByQuery(Resource subj, IRI pred, Value obj, - Resource[] contexts) { + boolean inferred, Resource[] contexts) { // delete single statement if (subj != null && pred != null && obj != null && contexts.length == 1) { - Statement statement; + ExtensibleStatement statement; if (contexts[0] == null) { - statement = vf.createStatement(subj, pred, obj); + statement = vf.createStatement(subj, pred, obj, inferred); } else { - statement = vf.createStatement(subj, pred, obj, contexts[0]); + statement = vf.createStatement(subj, pred, obj, contexts[0], inferred); } String id = sha256(statement); @@ -572,9 +562,9 @@ public synchronized boolean removeStatementsByQuery(Resource subj, IRI pred, Val if (exists) { if (contexts[0] == null) { - statement = vf.createStatement(id, subj, pred, obj); + statement = vf.createStatement(id, subj, pred, obj, inferred); } else { - statement = vf.createStatement(id, subj, pred, obj, contexts[0]); + statement = vf.createStatement(id, subj, pred, obj, contexts[0], inferred); } // don't actually delete it just yet, we can just call remove and it will be removed at some point @@ -588,15 +578,16 @@ public synchronized boolean removeStatementsByQuery(Resource subj, IRI pred, Val // Elasticsearch delete by query is slow. It's still faster when deleting a lot of data. We assume that // getStatement and bulk delete is faster up to 1000 statements. If there are more, then we instead use // elasticsearch delete by query. - try (CloseableIteration statements = getStatements(subj, pred, obj, - contexts)) { - List statementsToDelete = new ArrayList<>(); + try (CloseableIteration statements = getStatements(subj, pred, + obj, + inferred, contexts)) { + List statementsToDelete = new ArrayList<>(); for (int i = 0; i < 1000 && statements.hasNext(); i++) { statementsToDelete.add(statements.next()); } if (!statements.hasNext()) { - for (Statement statement : statementsToDelete) { + for (ExtensibleStatement statement : statementsToDelete) { removeStatement(statement); } @@ -606,7 +597,7 @@ public synchronized boolean removeStatementsByQuery(Resource subj, IRI pred, Val } BulkByScrollResponse response = DeleteByQueryAction.INSTANCE.newRequestBuilder(clientProvider.getClient()) - .filter(getQueryBuilder(subj, pred, obj, contexts)) + .filter(getQueryBuilder(subj, pred, obj, inferred, contexts)) .source(index) .abortOnVersionConflict(false) .get(); @@ -616,14 +607,35 @@ public synchronized boolean removeStatementsByQuery(Resource subj, IRI pred, Val } - String sha256(Statement statement) { + String sha256(ExtensibleStatement statement) { + + StringBuilder stringBuilder = new StringBuilder(); + + Stream + .of(statement.getSubject(), statement.getPredicate(), statement.getObject(), statement.getContext(), + statement.isInferred()) + .forEachOrdered(o -> { + + if (o instanceof IRI) { + stringBuilder.append("IRI<").append(o.toString()).append(">"); + } else if (o instanceof BNode) { + stringBuilder.append("Bnode<").append(o.toString()).append(">"); + } else if (o instanceof Literal) { + stringBuilder.append("Literal<").append(o.toString()).append(">"); + } else if (o instanceof Boolean) { + stringBuilder.append("Boolean<").append(o).append(">"); + } else if (o == null) { + stringBuilder.append("Null<>"); + } else { + throw new IllegalStateException(); + } - String originalString = statement.toString(); + }); try { MessageDigest digest = MessageDigest.getInstance("SHA-256"); - byte[] hash = digest.digest(originalString.getBytes(StandardCharsets.UTF_8)); + byte[] hash = digest.digest(stringBuilder.toString().getBytes(StandardCharsets.UTF_8)); StringBuilder hexString = new StringBuilder(); for (byte b : hash) { @@ -640,7 +652,7 @@ String sha256(Statement statement) { } - private static Statement sourceToStatement(Map sourceAsMap, String id, Resource subject, + private static ExtensibleStatement sourceToStatement(Map sourceAsMap, String id, Resource subject, IRI predicate, Value object) { Resource subjectRes = subject; @@ -677,17 +689,32 @@ private static Statement sourceToStatement(Map sourceAsMap, Stri contextRes = vf.createBNode((String) sourceAsMap.get("context")); } - Statement statement; + Object inferredNullable = sourceAsMap.get("inferred"); + + boolean inferred = false; + if (inferredNullable != null) { + inferred = ((Boolean) inferredNullable); + } if (contextRes != null) { - statement = vf.createStatement(id, subjectRes, predicateRes, objectRes, contextRes); + return vf.createStatement(id, subjectRes, predicateRes, objectRes, contextRes, inferred); } else { - statement = vf.createStatement(id, subjectRes, predicateRes, objectRes); + return vf.createStatement(id, subjectRes, predicateRes, objectRes, inferred); } - return statement; } public void setElasticsearchBulkSize(int size) { this.BUFFER_THRESHOLD = size; } + + @Override + public long getEstimatedSize() { + Client client = clientProvider.getClient(); + + IndicesAdminClient indices = client.admin().indices(); + IndicesStatsResponse indicesStatsResponse = indices.prepareStats(index).get(); + + return indicesStatsResponse.getTotal().docs.getCount(); + + } } diff --git a/core/sail/elasticsearch-store/src/main/java/org/eclipse/rdf4j/sail/elasticsearchstore/ElasticsearchHelper.java b/core/sail/elasticsearch-store/src/main/java/org/eclipse/rdf4j/sail/elasticsearchstore/ElasticsearchHelper.java index 95fde7cd2dc..84af925f071 100644 --- a/core/sail/elasticsearch-store/src/main/java/org/eclipse/rdf4j/sail/elasticsearchstore/ElasticsearchHelper.java +++ b/core/sail/elasticsearch-store/src/main/java/org/eclipse/rdf4j/sail/elasticsearchstore/ElasticsearchHelper.java @@ -17,6 +17,8 @@ import org.elasticsearch.common.unit.TimeValue; import org.elasticsearch.index.query.QueryBuilder; import org.elasticsearch.search.SearchHit; +import org.elasticsearch.search.sort.FieldSortBuilder; +import org.elasticsearch.search.sort.SortOrder; class ElasticsearchHelper { @@ -33,6 +35,7 @@ static CloseableIteration getScrollingIterator(Quer { SearchResponse scrollResp = client.prepareSearch(index) + .addSort(FieldSortBuilder.DOC_FIELD_NAME, SortOrder.ASC) .setScroll(new TimeValue(scrollTimeout)) .setQuery(queryBuilder) .setSize(size) diff --git a/core/sail/elasticsearch-store/src/main/java/org/eclipse/rdf4j/sail/elasticsearchstore/ElasticsearchId.java b/core/sail/elasticsearch-store/src/main/java/org/eclipse/rdf4j/sail/elasticsearchstore/ElasticsearchId.java index 8b36313d4a2..3eb503e09c3 100644 --- a/core/sail/elasticsearch-store/src/main/java/org/eclipse/rdf4j/sail/elasticsearchstore/ElasticsearchId.java +++ b/core/sail/elasticsearch-store/src/main/java/org/eclipse/rdf4j/sail/elasticsearchstore/ElasticsearchId.java @@ -7,9 +7,11 @@ *******************************************************************************/ package org.eclipse.rdf4j.sail.elasticsearchstore; +import org.eclipse.rdf4j.sail.extensiblestore.valuefactory.ExtensibleStatement; + /** * @author HÃ¥vard Mikkelsen Ottestad */ -interface ElasticsearchId { +interface ElasticsearchId extends ExtensibleStatement { String getElasticsearchId(); } diff --git a/core/sail/elasticsearch-store/src/main/java/org/eclipse/rdf4j/sail/elasticsearchstore/ElasticsearchNamespaceStore.java b/core/sail/elasticsearch-store/src/main/java/org/eclipse/rdf4j/sail/elasticsearchstore/ElasticsearchNamespaceStore.java index 1b4900d8758..f6a5f0909e6 100644 --- a/core/sail/elasticsearch-store/src/main/java/org/eclipse/rdf4j/sail/elasticsearchstore/ElasticsearchNamespaceStore.java +++ b/core/sail/elasticsearch-store/src/main/java/org/eclipse/rdf4j/sail/elasticsearchstore/ElasticsearchNamespaceStore.java @@ -28,6 +28,8 @@ import org.elasticsearch.index.query.QueryBuilders; import org.elasticsearch.search.SearchHit; import org.elasticsearch.search.SearchHits; +import org.elasticsearch.search.sort.FieldSortBuilder; +import org.elasticsearch.search.sort.SortOrder; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -115,6 +117,7 @@ public Iterator iterator() { SearchResponse searchResponse = clientProvider.getClient() .prepareSearch(index) + .addSort(FieldSortBuilder.DOC_FIELD_NAME, SortOrder.ASC) .setQuery(QueryBuilders.constantScoreQuery(matchAllQuery())) .setSize(10000) .get(); diff --git a/core/sail/elasticsearch-store/src/main/java/org/eclipse/rdf4j/sail/elasticsearchstore/ElasticsearchStatement.java b/core/sail/elasticsearch-store/src/main/java/org/eclipse/rdf4j/sail/elasticsearchstore/ElasticsearchStatement.java index 3607da9cb30..c17057392b6 100644 --- a/core/sail/elasticsearch-store/src/main/java/org/eclipse/rdf4j/sail/elasticsearchstore/ElasticsearchStatement.java +++ b/core/sail/elasticsearch-store/src/main/java/org/eclipse/rdf4j/sail/elasticsearchstore/ElasticsearchStatement.java @@ -10,17 +10,17 @@ import org.eclipse.rdf4j.model.IRI; import org.eclipse.rdf4j.model.Resource; import org.eclipse.rdf4j.model.Value; -import org.eclipse.rdf4j.model.impl.SimpleStatement; +import org.eclipse.rdf4j.sail.extensiblestore.valuefactory.ExtensibleStatementImpl; /** * @author HÃ¥vard Mikkelsen Ottestad */ -class ElasticsearchStatement extends SimpleStatement implements ElasticsearchId { +class ElasticsearchStatement extends ExtensibleStatementImpl implements ElasticsearchId { private String elasticsearchId; - ElasticsearchStatement(String elasticsearchId, Resource subject, IRI predicate, Value object) { - super(subject, predicate, object); + ElasticsearchStatement(String elasticsearchId, Resource subject, IRI predicate, Value object, boolean inferred) { + super(subject, predicate, object, inferred); this.elasticsearchId = elasticsearchId; } diff --git a/core/sail/elasticsearch-store/src/main/java/org/eclipse/rdf4j/sail/elasticsearchstore/ElasticsearchStore.java b/core/sail/elasticsearch-store/src/main/java/org/eclipse/rdf4j/sail/elasticsearchstore/ElasticsearchStore.java index 709c07a364c..81296ff2b83 100644 --- a/core/sail/elasticsearch-store/src/main/java/org/eclipse/rdf4j/sail/elasticsearchstore/ElasticsearchStore.java +++ b/core/sail/elasticsearch-store/src/main/java/org/eclipse/rdf4j/sail/elasticsearchstore/ElasticsearchStore.java @@ -21,6 +21,7 @@ import org.eclipse.rdf4j.sail.NotifyingSailConnection; import org.eclipse.rdf4j.sail.SailException; import org.eclipse.rdf4j.sail.extensiblestore.ExtensibleStore; +import org.eclipse.rdf4j.sail.extensiblestore.valuefactory.ExtensibleStatementHelper; import org.elasticsearch.action.admin.cluster.health.ClusterHealthRequest; import org.elasticsearch.action.admin.cluster.health.ClusterHealthResponse; import org.elasticsearch.client.Client; @@ -71,7 +72,6 @@ public ElasticsearchStore(String hostname, int port, String clusterName, String clientProvider = new SingletonClientProvider(hostname, port, clusterName); dataStructure = new ElasticsearchDataStructure(clientProvider, index); - dataStructureInferred = new ElasticsearchDataStructure(clientProvider, index + "_inferred"); namespaceStore = new ElasticsearchNamespaceStore(clientProvider, index + "_namespaces"); ReferenceQueue objectReferenceQueue = new ReferenceQueue<>(); @@ -89,7 +89,6 @@ public ElasticsearchStore(ClientProvider clientPool, String index, boolean cache this.clientProvider = new UnclosableClientProvider(clientPool); dataStructure = new ElasticsearchDataStructure(this.clientProvider, index); - dataStructureInferred = new ElasticsearchDataStructure(this.clientProvider, index + "_inferred"); namespaceStore = new ElasticsearchNamespaceStore(this.clientProvider, index + "_namespaces"); } @@ -228,7 +227,6 @@ private void startGarbageCollectionMonitoring(ReferenceQueue public void setElasticsearchScrollTimeout(int timeout) { dataStructure.setElasticsearchScrollTimeout(timeout); - dataStructureInferred.setElasticsearchScrollTimeout(timeout); } @Override @@ -259,6 +257,10 @@ public String getIndex() { public void setElasticsearchBulkSize(int size) { dataStructure.setElasticsearchBulkSize(size); - dataStructureInferred.setElasticsearchBulkSize(size); + } + + @Override + public ExtensibleStatementHelper getExtensibleStatementHelper() { + return ElasticsearchValueFactory.getInstance(); } } diff --git a/core/sail/elasticsearch-store/src/main/java/org/eclipse/rdf4j/sail/elasticsearchstore/ElasticsearchValueFactory.java b/core/sail/elasticsearch-store/src/main/java/org/eclipse/rdf4j/sail/elasticsearchstore/ElasticsearchValueFactory.java index 5bac5dacab8..bf9b2576141 100644 --- a/core/sail/elasticsearch-store/src/main/java/org/eclipse/rdf4j/sail/elasticsearchstore/ElasticsearchValueFactory.java +++ b/core/sail/elasticsearch-store/src/main/java/org/eclipse/rdf4j/sail/elasticsearchstore/ElasticsearchValueFactory.java @@ -9,13 +9,18 @@ import org.eclipse.rdf4j.model.IRI; import org.eclipse.rdf4j.model.Resource; +import org.eclipse.rdf4j.model.Statement; import org.eclipse.rdf4j.model.Value; import org.eclipse.rdf4j.model.impl.AbstractValueFactory; +import org.eclipse.rdf4j.sail.extensiblestore.valuefactory.ExtensibleContextStatement; +import org.eclipse.rdf4j.sail.extensiblestore.valuefactory.ExtensibleStatement; +import org.eclipse.rdf4j.sail.extensiblestore.valuefactory.ExtensibleStatementHelper; +import org.eclipse.rdf4j.sail.extensiblestore.valuefactory.ExtensibleStatementImpl; /** * @author HÃ¥vard Mikkelsen Ottestad */ -class ElasticsearchValueFactory extends AbstractValueFactory { +class ElasticsearchValueFactory extends AbstractValueFactory implements ExtensibleStatementHelper { /*-----------* * Constants * @@ -38,12 +43,37 @@ static ElasticsearchValueFactory getInstance() { private ElasticsearchValueFactory() { } - ElasticsearchStatement createStatement(String elasticsearchID, Resource subject, IRI predicate, Value object) { - return new ElasticsearchStatement(elasticsearchID, subject, predicate, object); + ExtensibleStatement createStatement(Resource subject, IRI predicate, Value object, boolean inferred) { + return new ExtensibleStatementImpl(subject, predicate, object, inferred); + } + + ExtensibleStatement createStatement(Resource subject, IRI predicate, Value object, + Resource context, boolean inferred) { + return new ExtensibleContextStatement(subject, predicate, object, context, inferred); + } + + ElasticsearchStatement createStatement(String elasticsearchID, Resource subject, IRI predicate, Value object, + boolean inferred) { + return new ElasticsearchStatement(elasticsearchID, subject, predicate, object, inferred); } ElasticsearchContextStatement createStatement(String elasticsearchID, Resource subject, IRI predicate, Value object, - Resource context) { - return new ElasticsearchContextStatement(elasticsearchID, subject, predicate, object, context); + Resource context, boolean inferred) { + return new ElasticsearchContextStatement(elasticsearchID, subject, predicate, object, context, inferred); + } + + @Override + public ExtensibleStatement fromStatement(Statement statement, boolean inferred) { + if (statement instanceof ElasticsearchId) { + + ElasticsearchId elasticsearchIdStatement = (ElasticsearchId) statement; + + if (elasticsearchIdStatement.isInferred() == inferred) { + return elasticsearchIdStatement; + } + } + + return ExtensibleStatementHelper.getDefaultImpl().fromStatement(statement, inferred); + } } diff --git a/core/sail/elasticsearch-store/src/main/java/org/eclipse/rdf4j/sail/elasticsearchstore/config/ElasticsearchStoreConfig.java b/core/sail/elasticsearch-store/src/main/java/org/eclipse/rdf4j/sail/elasticsearchstore/config/ElasticsearchStoreConfig.java index 21ed8a450bb..d3039a9f680 100644 --- a/core/sail/elasticsearch-store/src/main/java/org/eclipse/rdf4j/sail/elasticsearchstore/config/ElasticsearchStoreConfig.java +++ b/core/sail/elasticsearch-store/src/main/java/org/eclipse/rdf4j/sail/elasticsearchstore/config/ElasticsearchStoreConfig.java @@ -64,27 +64,30 @@ public void parse(Model graph, Resource implNode) throws SailConfigException { try { - Models.objectLiteral(graph.filter(implNode, ElasticsearchStoreSchema.hostname, null)).ifPresent(value -> { - try { - setHostname(value.stringValue()); - } catch (IllegalArgumentException e) { - throw new SailConfigException( - "String value required for " + ElasticsearchStoreSchema.hostname + " property, found " - + value); - } - }); - - Models.objectLiteral(graph.filter(implNode, ElasticsearchStoreSchema.index, null)).ifPresent(value -> { - try { - setIndex(value.stringValue()); - } catch (IllegalArgumentException e) { - throw new SailConfigException( - "String value required for " + ElasticsearchStoreSchema.index + " property, found " - + value); - } - }); - - Models.objectLiteral(graph.filter(implNode, ElasticsearchStoreSchema.clusterName, null)) + Models.objectLiteral(graph.getStatements(implNode, ElasticsearchStoreSchema.hostname, null)) + .ifPresent(value -> { + try { + setHostname(value.stringValue()); + } catch (IllegalArgumentException e) { + throw new SailConfigException( + "String value required for " + ElasticsearchStoreSchema.hostname + + " property, found " + + value); + } + }); + + Models.objectLiteral(graph.getStatements(implNode, ElasticsearchStoreSchema.index, null)) + .ifPresent(value -> { + try { + setIndex(value.stringValue()); + } catch (IllegalArgumentException e) { + throw new SailConfigException( + "String value required for " + ElasticsearchStoreSchema.index + " property, found " + + value); + } + }); + + Models.objectLiteral(graph.getStatements(implNode, ElasticsearchStoreSchema.clusterName, null)) .ifPresent(value -> { try { setClusterName(value.stringValue()); @@ -95,15 +98,16 @@ public void parse(Model graph, Resource implNode) throws SailConfigException { } }); - Models.objectLiteral(graph.filter(implNode, ElasticsearchStoreSchema.port, null)).ifPresent(value -> { - try { - setPort(value.intValue()); - } catch (IllegalArgumentException e) { - throw new SailConfigException( - "Integer value required for " + ElasticsearchStoreSchema.port + " property, found " - + value); - } - }); + Models.objectLiteral(graph.getStatements(implNode, ElasticsearchStoreSchema.port, null)) + .ifPresent(value -> { + try { + setPort(value.intValue()); + } catch (IllegalArgumentException e) { + throw new SailConfigException( + "Integer value required for " + ElasticsearchStoreSchema.port + " property, found " + + value); + } + }); } catch (ModelException e) { throw new SailConfigException(e.getMessage(), e); diff --git a/core/sail/elasticsearch-store/src/main/resources/elasticsearchStoreMapping.json b/core/sail/elasticsearch-store/src/main/resources/elasticsearchStoreMapping.json index c364f37d990..7df1720d24a 100644 --- a/core/sail/elasticsearch-store/src/main/resources/elasticsearchStoreMapping.json +++ b/core/sail/elasticsearch-store/src/main/resources/elasticsearchStoreMapping.json @@ -40,6 +40,9 @@ }, "context_BNode": { "type": "boolean" + }, + "inferred": { + "type": "boolean" } } } diff --git a/core/sail/elasticsearch-store/src/test/java/org/eclipse/rdf4j/sail/elasticsearchstore/ClientProviderWithDebugStats.java b/core/sail/elasticsearch-store/src/test/java/org/eclipse/rdf4j/sail/elasticsearchstore/ClientProviderWithDebugStats.java index 7b7f02d3237..4e91e888e99 100644 --- a/core/sail/elasticsearch-store/src/test/java/org/eclipse/rdf4j/sail/elasticsearchstore/ClientProviderWithDebugStats.java +++ b/core/sail/elasticsearch-store/src/test/java/org/eclipse/rdf4j/sail/elasticsearchstore/ClientProviderWithDebugStats.java @@ -1,3 +1,11 @@ +/******************************************************************************* + * Copyright (c) 2020 Eclipse RDF4J contributors. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Distribution License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ + package org.eclipse.rdf4j.sail.elasticsearchstore; import java.net.InetAddress; @@ -14,16 +22,9 @@ public class ClientProviderWithDebugStats implements ClientProvider { transient private ClientWithStats client; private transient boolean closed = false; - private String hostname; - private int port; - private String clusterName; private long getClientCalls; public ClientProviderWithDebugStats(String hostname, int port, String clusterName) { - this.hostname = hostname; - this.port = port; - this.clusterName = clusterName; - try { Settings settings = Settings.builder().put("cluster.name", clusterName).build(); TransportClient client = new PreBuiltTransportClient(settings); diff --git a/core/sail/elasticsearch-store/src/test/java/org/eclipse/rdf4j/sail/elasticsearchstore/ClientWithStats.java b/core/sail/elasticsearch-store/src/test/java/org/eclipse/rdf4j/sail/elasticsearchstore/ClientWithStats.java index 7a2e13e0754..bb322abc1e5 100644 --- a/core/sail/elasticsearch-store/src/test/java/org/eclipse/rdf4j/sail/elasticsearchstore/ClientWithStats.java +++ b/core/sail/elasticsearch-store/src/test/java/org/eclipse/rdf4j/sail/elasticsearchstore/ClientWithStats.java @@ -1,3 +1,11 @@ +/******************************************************************************* + * Copyright (c) 2020 Eclipse RDF4J contributors. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Distribution License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ + package org.eclipse.rdf4j.sail.elasticsearchstore; import java.util.Map; diff --git a/core/sail/elasticsearch-store/src/test/java/org/eclipse/rdf4j/sail/elasticsearchstore/ElasticsearchStoreTransactionsTest.java b/core/sail/elasticsearch-store/src/test/java/org/eclipse/rdf4j/sail/elasticsearchstore/ElasticsearchStoreTransactionsTest.java index 525523954dc..a71ce92607c 100644 --- a/core/sail/elasticsearch-store/src/test/java/org/eclipse/rdf4j/sail/elasticsearchstore/ElasticsearchStoreTransactionsTest.java +++ b/core/sail/elasticsearch-store/src/test/java/org/eclipse/rdf4j/sail/elasticsearchstore/ElasticsearchStoreTransactionsTest.java @@ -770,6 +770,26 @@ public void testNamespace() { } } + @Test + public void testClear() { + SailRepository elasticsearchStore = new SailRepository(this.elasticsearchStore); + try (SailRepositoryConnection connection = elasticsearchStore.getConnection()) { + + BNode context = vf.createBNode(); + + connection.begin(IsolationLevels.READ_COMMITTED); + connection.add(RDF.TYPE, RDF.TYPE, RDFS.RESOURCE); + connection.add(RDF.TYPE, RDF.TYPE, RDF.PROPERTY, context); + connection.commit(); + + connection.begin(IsolationLevels.NONE); + connection.clear(); + connection.commit(); + + } + + } + private Set asSet(Statement... statements) { Set set = new TreeSet<>(Comparator.comparing(Object::toString)); set.addAll(Arrays.asList(statements)); diff --git a/core/sail/elasticsearch-store/src/test/java/org/eclipse/rdf4j/sail/elasticsearchstore/InferenceTest.java b/core/sail/elasticsearch-store/src/test/java/org/eclipse/rdf4j/sail/elasticsearchstore/InferenceTest.java new file mode 100644 index 00000000000..e3525e85a67 --- /dev/null +++ b/core/sail/elasticsearch-store/src/test/java/org/eclipse/rdf4j/sail/elasticsearchstore/InferenceTest.java @@ -0,0 +1,214 @@ +/******************************************************************************* + * Copyright (c) 2020 Eclipse RDF4J contributors. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Distribution License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ + +package org.eclipse.rdf4j.sail.elasticsearchstore; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +import java.io.File; +import java.io.IOException; +import java.net.InetAddress; +import java.net.UnknownHostException; + +import org.assertj.core.util.Files; +import org.eclipse.rdf4j.model.BNode; +import org.eclipse.rdf4j.model.IRI; +import org.eclipse.rdf4j.model.Resource; +import org.eclipse.rdf4j.model.impl.SimpleValueFactory; +import org.eclipse.rdf4j.model.vocabulary.RDF; +import org.eclipse.rdf4j.model.vocabulary.RDFS; +import org.eclipse.rdf4j.repository.sail.SailRepository; +import org.eclipse.rdf4j.repository.sail.SailRepositoryConnection; +import org.eclipse.rdf4j.sail.inferencer.fc.SchemaCachingRDFSInferencer; +import org.elasticsearch.action.admin.indices.get.GetIndexRequest; +import org.elasticsearch.client.transport.TransportClient; +import org.elasticsearch.common.settings.Settings; +import org.elasticsearch.common.transport.TransportAddress; +import org.elasticsearch.transport.client.PreBuiltTransportClient; +import org.junit.After; +import org.junit.AfterClass; +import org.junit.BeforeClass; +import org.junit.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import pl.allegro.tech.embeddedelasticsearch.EmbeddedElastic; + +public class InferenceTest { + + private static final Logger logger = LoggerFactory.getLogger(ElasticsearchStoreTest.class); + private static final SimpleValueFactory vf = SimpleValueFactory.getInstance(); + + private static EmbeddedElastic embeddedElastic; + private static SingletonClientProvider singletonClientProvider; + + private static File installLocation = Files.newTemporaryFolder(); + + @BeforeClass + public static void beforeClass() throws IOException, InterruptedException { + + embeddedElastic = TestHelpers.startElasticsearch(installLocation); + + singletonClientProvider = new SingletonClientProvider("localhost", + embeddedElastic.getTransportTcpPort(), "cluster1"); + } + + @AfterClass + public static void afterClass() throws Exception { + singletonClientProvider.close(); + TestHelpers.stopElasticsearch(embeddedElastic, installLocation); + } + + @After + public void after() { + embeddedElastic.refreshIndices(); + deleteAllIndexes(); + } + + private void deleteAllIndexes() { + for (String index : getIndexes()) { + System.out.println("deleting: " + index); + embeddedElastic.deleteIndex(index); + + } + } + + private String[] getIndexes() { + + Settings settings = Settings.builder().put("cluster.name", "cluster1").build(); + try (TransportClient client = new PreBuiltTransportClient(settings)) { + client.addTransportAddress( + new TransportAddress(InetAddress.getByName("localhost"), embeddedElastic.getTransportTcpPort())); + + return client.admin() + .indices() + .getIndex(new GetIndexRequest()) + .actionGet() + .getIndices(); + } catch (UnknownHostException e) { + throw new IllegalStateException(e); + } + + } + + @Test + public void initiallyInferredStatementsTest() { + ElasticsearchStore elasticsearchStore = new ElasticsearchStore(singletonClientProvider, "testindex"); + + SailRepository sailRepository = new SailRepository(new SchemaCachingRDFSInferencer(elasticsearchStore)); + + try (SailRepositoryConnection connection = sailRepository.getConnection()) { + long explicitStatements = connection.getStatements(null, null, null, false).stream().count(); + assertEquals(0, explicitStatements); + + long inferredStatements = connection.getStatements(null, null, null, true).stream().count(); + assertEquals(141, inferredStatements); + } + + sailRepository.shutDown(); + } + + @Test + public void simpleInferenceTest() { + ElasticsearchStore elasticsearchStore = new ElasticsearchStore(singletonClientProvider, "testindex"); + + SailRepository sailRepository = new SailRepository(new SchemaCachingRDFSInferencer(elasticsearchStore)); + + IRI graph1 = vf.createIRI("http://example.com/graph1"); + + try (SailRepositoryConnection connection = sailRepository.getConnection()) { + connection.add(vf.createBNode(), RDFS.LABEL, vf.createLiteral("label"), graph1); + + long explicitStatements = connection.getStatements(null, null, null, false, graph1).stream().count(); + assertEquals(1, explicitStatements); + + long inferredStatements = connection.getStatements(null, null, null, true, graph1).stream().count(); + assertEquals(2, inferredStatements); + } + + sailRepository.shutDown(); + } + + @Test + public void removeInferredData() { + ElasticsearchStore elasticsearchStore = new ElasticsearchStore(singletonClientProvider, "testindex"); + + SailRepository sailRepository = new SailRepository(new SchemaCachingRDFSInferencer(elasticsearchStore)); + + IRI graph1 = vf.createIRI("http://example.com/graph1"); + + try (SailRepositoryConnection connection = sailRepository.getConnection()) { + connection.begin(); + connection.add(vf.createBNode(), RDFS.LABEL, vf.createLiteral("label"), graph1); + connection.commit(); + + long explicitStatements = connection.getStatements(null, null, null, false, graph1).stream().count(); + assertEquals(1, explicitStatements); + + long inferredStatements = connection.getStatements(null, null, null, true, graph1).stream().count(); + assertEquals(2, inferredStatements); + + connection.begin(); + connection.remove((Resource) null, RDFS.LABEL, null, graph1); + connection.commit(); + + explicitStatements = connection.getStatements(null, null, null, false, graph1).stream().count(); + assertEquals(0, explicitStatements); + + inferredStatements = connection.getStatements(null, null, null, true, graph1).stream().count(); + assertEquals(0, inferredStatements); + + } + + sailRepository.shutDown(); + } + + @Test + public void addInferredStatement() { + ElasticsearchStore elasticsearchStore = new ElasticsearchStore(singletonClientProvider, "testindex"); + + SailRepository sailRepository = new SailRepository(new SchemaCachingRDFSInferencer(elasticsearchStore)); + + IRI graph1 = vf.createIRI("http://example.com/graph1"); + + try (SailRepositoryConnection connection = sailRepository.getConnection()) { + BNode bNode = vf.createBNode(); + BNode bNode2 = vf.createBNode(); + + connection.begin(); + connection.add(bNode, RDFS.LABEL, vf.createLiteral("label"), graph1); + connection.commit(); + + assertTrue(connection.hasStatement(bNode, RDF.TYPE, RDFS.RESOURCE, true)); + + connection.begin(); + connection.add(bNode, RDF.TYPE, RDFS.RESOURCE, graph1); + connection.add(bNode2, RDFS.LABEL, vf.createLiteral("label2"), graph1); + + connection.commit(); + + assertTrue(connection.hasStatement(bNode, RDF.TYPE, RDFS.RESOURCE, false)); + + connection.begin(); + connection.remove(bNode, RDFS.LABEL, vf.createLiteral("label")); + connection.commit(); + + assertTrue(connection.hasStatement(bNode2, RDFS.LABEL, null, false)); + + assertTrue(connection.hasStatement(bNode, RDF.TYPE, RDFS.RESOURCE, true)); + assertTrue(connection.hasStatement(bNode, RDF.TYPE, RDFS.RESOURCE, false)); + assertFalse(connection.hasStatement(bNode, RDFS.LABEL, null, true)); + + } + + sailRepository.shutDown(); + } + +} diff --git a/core/sail/elasticsearch-store/src/test/java/org/eclipse/rdf4j/sail/elasticsearchstore/TestHelpers.java b/core/sail/elasticsearch-store/src/test/java/org/eclipse/rdf4j/sail/elasticsearchstore/TestHelpers.java index a696873acb4..e2b75d4d8ed 100644 --- a/core/sail/elasticsearch-store/src/test/java/org/eclipse/rdf4j/sail/elasticsearchstore/TestHelpers.java +++ b/core/sail/elasticsearch-store/src/test/java/org/eclipse/rdf4j/sail/elasticsearchstore/TestHelpers.java @@ -23,7 +23,7 @@ public class TestHelpers { private final static Random random = new Random(); - public static final String VERSION = "6.5.4"; + public static final String VERSION = "6.8.8"; public static final String CLUSTER = "cluster1"; public static final String ELASTICSEARCH_DOWNLOAD_DIRECTORY = "tempElasticsearchDownload"; diff --git a/core/sail/elasticsearch-store/src/test/java/org/eclipse/rdf4j/sail/elasticsearchstore/benchmark/AddBenchmark.java b/core/sail/elasticsearch-store/src/test/java/org/eclipse/rdf4j/sail/elasticsearchstore/benchmark/AddBenchmark.java index 4b513c7e6ff..9ac62957420 100644 --- a/core/sail/elasticsearch-store/src/test/java/org/eclipse/rdf4j/sail/elasticsearchstore/benchmark/AddBenchmark.java +++ b/core/sail/elasticsearch-store/src/test/java/org/eclipse/rdf4j/sail/elasticsearchstore/benchmark/AddBenchmark.java @@ -55,8 +55,11 @@ public class AddBenchmark { @Setup(Level.Trial) public void beforeClass() throws IOException, InterruptedException { + // JMH does not correctly set JAVA_HOME. Change the JAVA_HOME below if you the following error: + // [EmbeddedElsHandler] INFO p.a.t.e.ElasticServer - could not find java; set JAVA_HOME or ensure java is in + // PATH embeddedElastic = TestHelpers.startElasticsearch(installLocation, - "/Library/Java/JavaVirtualMachines/jdk1.8.0_144.jdk/Contents/Home"); + "/Library/Java/JavaVirtualMachines/adoptopenjdk-8.jdk/Contents/Home"); elasticsearchStore = new SailRepository( new ElasticsearchStore("localhost", embeddedElastic.getTransportTcpPort(), "cluster1", "testindex", @@ -91,4 +94,18 @@ public void clearAndAddLargeFile() throws IOException { } } + @Benchmark + public void clearAndAddLargeFileReadCommitted() throws IOException { + + try (SailRepositoryConnection connection = elasticsearchStore.getConnection()) { + connection.begin(IsolationLevels.NONE); + connection.clear(); + connection.commit(); + + connection.begin(IsolationLevels.READ_COMMITTED); + connection.add(getResourceAsStream("benchmarkFiles/datagovbe-valid.ttl"), "", RDFFormat.TURTLE); + connection.commit(); + } + } + } diff --git a/core/sail/elasticsearch-store/src/test/java/org/eclipse/rdf4j/sail/elasticsearchstore/benchmark/DeleteBenchmark.java b/core/sail/elasticsearch-store/src/test/java/org/eclipse/rdf4j/sail/elasticsearchstore/benchmark/DeleteBenchmark.java index c37d8a0406a..8b0d94cf584 100644 --- a/core/sail/elasticsearch-store/src/test/java/org/eclipse/rdf4j/sail/elasticsearchstore/benchmark/DeleteBenchmark.java +++ b/core/sail/elasticsearch-store/src/test/java/org/eclipse/rdf4j/sail/elasticsearchstore/benchmark/DeleteBenchmark.java @@ -43,12 +43,12 @@ @Warmup(iterations = 20) @BenchmarkMode({ Mode.AverageTime }) @Fork(value = 1, jvmArgs = { "-Xms8G", "-Xmx8G", "-Xmn4G", "-XX:+UseSerialGC" }) -//@Fork(value = 1, jvmArgs = {"-Xms8G", "-Xmx8G", "-Xmn4G", "-XX:+UseSerialGC", "-XX:+UnlockCommercialFeatures", "-XX:StartFlightRecording=delay=60s,duration=120s,filename=recording.jfr,settings=profile", "-XX:FlightRecorderOptions=samplethreads=true,stackdepth=1024", "-XX:+UnlockDiagnosticVMOptions", "-XX:+DebugNonSafepoints"}) +//@Fork(value = 1, jvmArgs = {"-Xms8G", "-Xmx8G", "-Xmn4G", "-XX:StartFlightRecording=delay=60s,duration=120s,filename=recording.jfr,settings=profile", "-XX:FlightRecorderOptions=samplethreads=true,stackdepth=1024", "-XX:+UnlockDiagnosticVMOptions", "-XX:+DebugNonSafepoints"}) @Measurement(iterations = 10) @OutputTimeUnit(TimeUnit.MILLISECONDS) public class DeleteBenchmark { -// @Param({ "100", "1000", "10000" }) + // @Param({ "100", "1000", "10000" }) public int NUMBER_OF_STATEMENTS = 10000; private static EmbeddedElastic embeddedElastic; @@ -59,9 +59,11 @@ public class DeleteBenchmark { @Setup(Level.Trial) public void beforeClass() throws IOException, InterruptedException { - + // JMH does not correctly set JAVA_HOME. Change the JAVA_HOME below if you the following error: + // [EmbeddedElsHandler] INFO p.a.t.e.ElasticServer - could not find java; set JAVA_HOME or ensure java is in + // PATH embeddedElastic = TestHelpers.startElasticsearch(installLocation, - "/Library/Java/JavaVirtualMachines/jdk1.8.0_144.jdk/Contents/Home"); + "/Library/Java/JavaVirtualMachines/adoptopenjdk-8.jdk/Contents/Home"); elasticsearchStore = new SailRepository( new ElasticsearchStore("localhost", embeddedElastic.getTransportTcpPort(), "cluster1", "testindex", @@ -102,8 +104,7 @@ public void afterInvocation() { } @Benchmark - public boolean clear() { - + public boolean clearNone() { try (SailRepositoryConnection connection = elasticsearchStore.getConnection()) { connection.begin(IsolationLevels.NONE); connection.clear(); @@ -116,6 +117,21 @@ public boolean clear() { } + @Benchmark + public boolean clearReadCommitted() { + + try (SailRepositoryConnection connection = elasticsearchStore.getConnection()) { + connection.begin(IsolationLevels.READ_COMMITTED); + connection.clear(); + connection.commit(); + } + + try (SailRepositoryConnection connection = elasticsearchStore.getConnection()) { + return connection.hasStatement(RDFS.RESOURCE, RDF.TYPE, RDFS.RESOURCE, false, RDFS.RESOURCE); + } + + } + @Benchmark public boolean delete() { diff --git a/core/sail/elasticsearch-store/src/test/java/org/eclipse/rdf4j/sail/elasticsearchstore/benchmark/InitBenchmark.java b/core/sail/elasticsearch-store/src/test/java/org/eclipse/rdf4j/sail/elasticsearchstore/benchmark/InitBenchmark.java index f85f978e246..0935aefcce8 100644 --- a/core/sail/elasticsearch-store/src/test/java/org/eclipse/rdf4j/sail/elasticsearchstore/benchmark/InitBenchmark.java +++ b/core/sail/elasticsearch-store/src/test/java/org/eclipse/rdf4j/sail/elasticsearchstore/benchmark/InitBenchmark.java @@ -54,8 +54,11 @@ public class InitBenchmark { @Setup(Level.Trial) public void beforeClass() throws IOException, InterruptedException { + // JMH does not correctly set JAVA_HOME. Change the JAVA_HOME below if you the following error: + // [EmbeddedElsHandler] INFO p.a.t.e.ElasticServer - could not find java; set JAVA_HOME or ensure java is in + // PATH embeddedElastic = TestHelpers.startElasticsearch(installLocation, - "/Library/Java/JavaVirtualMachines/jdk1.8.0_144.jdk/Contents/Home"); + "/Library/Java/JavaVirtualMachines/adoptopenjdk-8.jdk/Contents/Home"); clientPool = new SingletonClientProvider("localhost", embeddedElastic.getTransportTcpPort(), "cluster1"); System.gc(); diff --git a/core/sail/elasticsearch-store/src/test/java/org/eclipse/rdf4j/sail/elasticsearchstore/benchmark/QueryBenchmark.java b/core/sail/elasticsearch-store/src/test/java/org/eclipse/rdf4j/sail/elasticsearchstore/benchmark/QueryBenchmark.java index b9a12093c0a..32eeebd87ed 100644 --- a/core/sail/elasticsearch-store/src/test/java/org/eclipse/rdf4j/sail/elasticsearchstore/benchmark/QueryBenchmark.java +++ b/core/sail/elasticsearch-store/src/test/java/org/eclipse/rdf4j/sail/elasticsearchstore/benchmark/QueryBenchmark.java @@ -68,6 +68,7 @@ public class QueryBenchmark { private static final String query3_2; private static final String query4_1; private static final String query4_2; + static { try { query1 = IOUtils.toString(getResourceAsStream("benchmarkFiles/query1.qr"), StandardCharsets.UTF_8); @@ -86,9 +87,11 @@ public class QueryBenchmark { @Setup(Level.Trial) public void beforeClass() throws IOException, InterruptedException { - + // JMH does not correctly set JAVA_HOME. Change the JAVA_HOME below if you the following error: + // [EmbeddedElsHandler] INFO p.a.t.e.ElasticServer - could not find java; set JAVA_HOME or ensure java is in + // PATH embeddedElastic = TestHelpers.startElasticsearch(installLocation, - "/Library/Java/JavaVirtualMachines/jdk1.8.0_144.jdk/Contents/Home"); + "/Library/Java/JavaVirtualMachines/adoptopenjdk-8.jdk/Contents/Home"); repository = new SailRepository( new ElasticsearchStore("localhost", embeddedElastic.getTransportTcpPort(), "cluster1", "testindex", diff --git a/core/sail/elasticsearch-store/src/test/java/org/eclipse/rdf4j/sail/elasticsearchstore/benchmark/ReadCacheBenchmark.java b/core/sail/elasticsearch-store/src/test/java/org/eclipse/rdf4j/sail/elasticsearchstore/benchmark/ReadCacheBenchmark.java index 04acc3ad08a..833500ac08e 100644 --- a/core/sail/elasticsearch-store/src/test/java/org/eclipse/rdf4j/sail/elasticsearchstore/benchmark/ReadCacheBenchmark.java +++ b/core/sail/elasticsearch-store/src/test/java/org/eclipse/rdf4j/sail/elasticsearchstore/benchmark/ReadCacheBenchmark.java @@ -20,7 +20,6 @@ import org.eclipse.rdf4j.IsolationLevels; import org.eclipse.rdf4j.common.iteration.Iterations; import org.eclipse.rdf4j.model.Literal; -import org.eclipse.rdf4j.model.Statement; import org.eclipse.rdf4j.model.impl.SimpleValueFactory; import org.eclipse.rdf4j.model.vocabulary.RDFS; import org.eclipse.rdf4j.query.BindingSet; @@ -77,13 +76,13 @@ public class ReadCacheBenchmark { } } - private List statementList; - @Setup(Level.Trial) public void beforeClass() throws IOException, InterruptedException { - + // JMH does not correctly set JAVA_HOME. Change the JAVA_HOME below if you the following error: + // [EmbeddedElsHandler] INFO p.a.t.e.ElasticServer - could not find java; set JAVA_HOME or ensure java is in + // PATH embeddedElastic = TestHelpers.startElasticsearch(installLocation, - "/Library/Java/JavaVirtualMachines/jdk1.8.0_144.jdk/Contents/Home"); + "/Library/Java/JavaVirtualMachines/adoptopenjdk-8.jdk/Contents/Home"); repoWithoutCache = new SailRepository( new ElasticsearchStore("localhost", embeddedElastic.getTransportTcpPort(), "cluster1", "testindex1", diff --git a/core/sail/elasticsearch-store/src/test/java/org/eclipse/rdf4j/sail/elasticsearchstore/benchmark/TransactionBenchmark.java b/core/sail/elasticsearch-store/src/test/java/org/eclipse/rdf4j/sail/elasticsearchstore/benchmark/TransactionBenchmark.java index 04b3ece082e..90cd169c0b6 100644 --- a/core/sail/elasticsearch-store/src/test/java/org/eclipse/rdf4j/sail/elasticsearchstore/benchmark/TransactionBenchmark.java +++ b/core/sail/elasticsearch-store/src/test/java/org/eclipse/rdf4j/sail/elasticsearchstore/benchmark/TransactionBenchmark.java @@ -11,22 +11,14 @@ import java.io.File; import java.io.IOException; import java.io.InputStream; -import java.nio.charset.StandardCharsets; import java.util.List; -import java.util.concurrent.TimeUnit; -import java.util.stream.Collectors; import java.util.stream.IntStream; -import org.apache.commons.io.IOUtils; import org.assertj.core.util.Files; import org.eclipse.rdf4j.IsolationLevels; -import org.eclipse.rdf4j.common.iteration.Iterations; -import org.eclipse.rdf4j.model.Resource; import org.eclipse.rdf4j.model.Statement; import org.eclipse.rdf4j.model.impl.SimpleValueFactory; -import org.eclipse.rdf4j.model.vocabulary.RDF; import org.eclipse.rdf4j.model.vocabulary.RDFS; -import org.eclipse.rdf4j.query.BindingSet; import org.eclipse.rdf4j.repository.sail.SailRepository; import org.eclipse.rdf4j.repository.sail.SailRepositoryConnection; import org.eclipse.rdf4j.rio.RDFFormat; @@ -38,7 +30,6 @@ import org.openjdk.jmh.annotations.Level; import org.openjdk.jmh.annotations.Measurement; import org.openjdk.jmh.annotations.Mode; -import org.openjdk.jmh.annotations.OutputTimeUnit; import org.openjdk.jmh.annotations.Scope; import org.openjdk.jmh.annotations.Setup; import org.openjdk.jmh.annotations.State; @@ -68,9 +59,11 @@ public class TransactionBenchmark { @Setup(Level.Trial) public void beforeClass() throws IOException, InterruptedException { - + // JMH does not correctly set JAVA_HOME. Change the JAVA_HOME below if you the following error: + // [EmbeddedElsHandler] INFO p.a.t.e.ElasticServer - could not find java; set JAVA_HOME or ensure java is in + // PATH embeddedElastic = TestHelpers.startElasticsearch(installLocation, - "/Library/Java/JavaVirtualMachines/jdk1.8.0_144.jdk/Contents/Home"); + "/Library/Java/JavaVirtualMachines/adoptopenjdk-8.jdk/Contents/Home"); repository = new SailRepository( new ElasticsearchStore("localhost", embeddedElastic.getTransportTcpPort(), "cluster1", "testindex", diff --git a/core/sail/elasticsearch-store/src/test/java/org/eclipse/rdf4j/sail/elasticsearchstore/benchmark/TransactionParallelBenchmark.java b/core/sail/elasticsearch-store/src/test/java/org/eclipse/rdf4j/sail/elasticsearchstore/benchmark/TransactionParallelBenchmark.java index 4339524e9af..ab8e7efdf52 100644 --- a/core/sail/elasticsearch-store/src/test/java/org/eclipse/rdf4j/sail/elasticsearchstore/benchmark/TransactionParallelBenchmark.java +++ b/core/sail/elasticsearch-store/src/test/java/org/eclipse/rdf4j/sail/elasticsearchstore/benchmark/TransactionParallelBenchmark.java @@ -11,14 +11,12 @@ import java.io.File; import java.io.IOException; import java.io.InputStream; -import java.util.List; import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; import java.util.stream.IntStream; import org.assertj.core.util.Files; import org.eclipse.rdf4j.IsolationLevels; -import org.eclipse.rdf4j.model.Statement; import org.eclipse.rdf4j.model.impl.SimpleValueFactory; import org.eclipse.rdf4j.model.vocabulary.RDF; import org.eclipse.rdf4j.model.vocabulary.RDFS; @@ -62,9 +60,11 @@ public class TransactionParallelBenchmark { @Setup(Level.Trial) public void beforeClass() throws IOException, InterruptedException { - + // JMH does not correctly set JAVA_HOME. Change the JAVA_HOME below if you the following error: + // [EmbeddedElsHandler] INFO p.a.t.e.ElasticServer - could not find java; set JAVA_HOME or ensure java is in + // PATH embeddedElastic = TestHelpers.startElasticsearch(installLocation, - "/Library/Java/JavaVirtualMachines/adoptopenjdk-11.jdk/Contents/Home"); + "/Library/Java/JavaVirtualMachines/adoptopenjdk-8.jdk/Contents/Home"); repository = new SailRepository( new ElasticsearchStore("localhost", embeddedElastic.getTransportTcpPort(), "cluster1", "testindex")); diff --git a/core/sail/elasticsearch-store/src/test/java/org/eclipse/rdf4j/sail/elasticsearchstore/compliance/ElasticsearchStoreIsolationLevelTest.java b/core/sail/elasticsearch-store/src/test/java/org/eclipse/rdf4j/sail/elasticsearchstore/compliance/ElasticsearchStoreIsolationLevelTest.java index 21b8387c0ab..cb9ba2b101d 100644 --- a/core/sail/elasticsearch-store/src/test/java/org/eclipse/rdf4j/sail/elasticsearchstore/compliance/ElasticsearchStoreIsolationLevelTest.java +++ b/core/sail/elasticsearch-store/src/test/java/org/eclipse/rdf4j/sail/elasticsearchstore/compliance/ElasticsearchStoreIsolationLevelTest.java @@ -10,7 +10,6 @@ import java.io.File; import org.assertj.core.util.Files; -import org.eclipse.rdf4j.IsolationLevel; import org.eclipse.rdf4j.sail.NotifyingSail; import org.eclipse.rdf4j.sail.NotifyingSailConnection; import org.eclipse.rdf4j.sail.Sail; @@ -21,7 +20,6 @@ import org.eclipse.rdf4j.sail.elasticsearchstore.TestHelpers; import org.junit.AfterClass; import org.junit.BeforeClass; -import org.junit.Ignore; import pl.allegro.tech.embeddedelasticsearch.EmbeddedElastic; diff --git a/core/sail/elasticsearch/pom.xml b/core/sail/elasticsearch/pom.xml index a7d3af4c4e3..4348d2d781f 100644 --- a/core/sail/elasticsearch/pom.xml +++ b/core/sail/elasticsearch/pom.xml @@ -4,7 +4,7 @@ org.eclipse.rdf4j rdf4j-sail - 3.1.5-SNAPSHOT + 3.2.2-SNAPSHOT rdf4j-sail-elasticsearch RDF4J Elastic Search Sail Index diff --git a/core/sail/elasticsearch/src/main/java/org/eclipse/rdf4j/sail/elasticsearch/ElasticsearchDocument.java b/core/sail/elasticsearch/src/main/java/org/eclipse/rdf4j/sail/elasticsearch/ElasticsearchDocument.java index fb3e44e2f03..eb950897f35 100644 --- a/core/sail/elasticsearch/src/main/java/org/eclipse/rdf4j/sail/elasticsearch/ElasticsearchDocument.java +++ b/core/sail/elasticsearch/src/main/java/org/eclipse/rdf4j/sail/elasticsearch/ElasticsearchDocument.java @@ -55,7 +55,7 @@ public ElasticsearchDocument(SearchHit hit, Function geoContextMapper) { - this(id, type, index, Versions.MATCH_ANY, new HashMap(), geoContextMapper); + this(id, type, index, Versions.MATCH_ANY, new HashMap<>(), geoContextMapper); fields.put(SearchFields.URI_FIELD_NAME, resourceId); if (context != null) { fields.put(SearchFields.CONTEXT_FIELD_NAME, context); diff --git a/core/sail/elasticsearch/src/main/java/org/eclipse/rdf4j/sail/elasticsearch/ElasticsearchIndex.java b/core/sail/elasticsearch/src/main/java/org/eclipse/rdf4j/sail/elasticsearch/ElasticsearchIndex.java index eb3e2f5a39b..c021e98b910 100644 --- a/core/sail/elasticsearch/src/main/java/org/eclipse/rdf4j/sail/elasticsearch/ElasticsearchIndex.java +++ b/core/sail/elasticsearch/src/main/java/org/eclipse/rdf4j/sail/elasticsearch/ElasticsearchIndex.java @@ -23,7 +23,6 @@ import org.eclipse.rdf4j.model.vocabulary.GEOF; import org.eclipse.rdf4j.query.MalformedQueryException; import org.eclipse.rdf4j.query.algebra.Var; -import org.eclipse.rdf4j.sail.SailException; import org.eclipse.rdf4j.sail.lucene.AbstractSearchIndex; import org.eclipse.rdf4j.sail.lucene.BulkUpdater; import org.eclipse.rdf4j.sail.lucene.DocumentDistance; @@ -461,7 +460,7 @@ private SearchHits getDocuments(QueryBuilder query) throws IOException { /** * Returns a Document representing the specified Resource and Context combination, or null when no such Document * exists yet. - * + * * @param subject * @param context * @return search document @@ -478,7 +477,7 @@ public SearchDocument getDocument(Resource subject, Resource context) throws IOE * Returns a list of Documents representing the specified Resource (empty when no such Document exists yet).Each * document represent a set of statements with the specified Resource as a subject, which are stored in a specific * context - * + * * @param subject * @return list of documents * @throws IOException @@ -490,15 +489,16 @@ public Iterable getDocuments(Resource subject) throws /** * Filters the given list of fields, retaining all property fields. - * + * * @param fields * @return set of fields */ public static Set getPropertyFields(Set fields) { Set result = new HashSet<>(fields.size()); for (String field : fields) { - if (SearchFields.isPropertyField(field)) + if (SearchFields.isPropertyField(field)) { result.add(field); + } } return result; } @@ -610,7 +610,7 @@ public DocumentScore apply(SearchHit hit) { /** * Evaluates the given query only for the given resource. - * + * * @param resource * @param request * @param query @@ -748,13 +748,16 @@ public SearchHits search(SearchRequestBuilder request, QueryBuilder query) { private QueryStringQueryBuilder prepareQuery(IRI propertyURI, QueryStringQueryBuilder query) { // check out which query parser to use, based on the given property URI if (propertyURI == null) - // if we have no property given, we create a default query parser which - // has the TEXT_FIELD_NAME as the default field + // if we have no property given, we create a default query parser which + // has the TEXT_FIELD_NAME as the default field + { query.defaultField(SearchFields.TEXT_FIELD_NAME).analyzer(queryAnalyzer); - else - // otherwise we create a query parser that has the given property as - // the default field + } else + // otherwise we create a query parser that has the given property as + // the default field + { query.defaultField(toPropertyFieldName(SearchFields.getPropertyField(propertyURI))).analyzer(queryAnalyzer); + } return query; } diff --git a/core/sail/elasticsearch/src/main/java/org/eclipse/rdf4j/sail/elasticsearch/config/ElasticsearchSailFactory.java b/core/sail/elasticsearch/src/main/java/org/eclipse/rdf4j/sail/elasticsearch/config/ElasticsearchSailFactory.java index 9e65f998b01..c1c8d840e92 100644 --- a/core/sail/elasticsearch/src/main/java/org/eclipse/rdf4j/sail/elasticsearch/config/ElasticsearchSailFactory.java +++ b/core/sail/elasticsearch/src/main/java/org/eclipse/rdf4j/sail/elasticsearch/config/ElasticsearchSailFactory.java @@ -22,7 +22,7 @@ public class ElasticsearchSailFactory implements SailFactory { /** * The type of repositories that are created by this factory. - * + * * @see SailFactory#getSailType() */ public static final String SAIL_TYPE = "openrdf:LuceneSail/Elasticsearch"; diff --git a/core/sail/extensible-store/pom.xml b/core/sail/extensible-store/pom.xml index 4f7e786dc01..cfc934ba156 100644 --- a/core/sail/extensible-store/pom.xml +++ b/core/sail/extensible-store/pom.xml @@ -4,7 +4,7 @@ org.eclipse.rdf4j rdf4j-sail - 3.1.5-SNAPSHOT + 3.2.2-SNAPSHOT rdf4j-sail-extensible-store RDF4J Extensible Store @@ -19,6 +19,11 @@ org.apache.commons commons-collections4 + + net.agkn + hll + 1.6.0 + ${project.groupId} rdf4j-sail-memory @@ -59,5 +64,17 @@ assertj-core test + + org.openjdk.jmh + jmh-core + ${jmhVersion} + test + + + org.openjdk.jmh + jmh-generator-annprocess + ${jmhVersion} + test + diff --git a/core/sail/extensible-store/src/main/java/org/eclipse/rdf4j/sail/extensiblestore/DataStructureInterface.java b/core/sail/extensible-store/src/main/java/org/eclipse/rdf4j/sail/extensiblestore/DataStructureInterface.java index 1068e193043..c69407d3b24 100644 --- a/core/sail/extensible-store/src/main/java/org/eclipse/rdf4j/sail/extensiblestore/DataStructureInterface.java +++ b/core/sail/extensible-store/src/main/java/org/eclipse/rdf4j/sail/extensiblestore/DataStructureInterface.java @@ -13,9 +13,9 @@ import org.eclipse.rdf4j.common.iteration.CloseableIteration; import org.eclipse.rdf4j.model.IRI; import org.eclipse.rdf4j.model.Resource; -import org.eclipse.rdf4j.model.Statement; import org.eclipse.rdf4j.model.Value; import org.eclipse.rdf4j.sail.SailException; +import org.eclipse.rdf4j.sail.extensiblestore.valuefactory.ExtensibleStatement; /** * An interface to implement a base data structure for the ExtensibleStore. The data structure needs to be thread safe. @@ -25,26 +25,27 @@ @Experimental public interface DataStructureInterface { - void addStatement(Statement statement); + void addStatement(ExtensibleStatement statement); - void removeStatement(Statement statement); + void removeStatement(ExtensibleStatement statement); - default void addStatement(Collection statements) { - for (Statement statement : statements) { + default void addStatement(Collection statements) { + for (ExtensibleStatement statement : statements) { addStatement(statement); } } - default void removeStatement(Collection statements) { - for (Statement statement : statements) { + default void removeStatement(Collection statements) { + for (ExtensibleStatement statement : statements) { removeStatement(statement); } } - CloseableIteration getStatements( + CloseableIteration getStatements( Resource subject, IRI predicate, Value object, + boolean inferred, Resource... context); // flush this DataStructure to make added and removed data visible to read operations @@ -52,9 +53,10 @@ CloseableIteration getStatements( void init(); - default void clear(Resource[] contexts) { - try (CloseableIteration statements = getStatements(null, null, null, - contexts)) { + default void clear(boolean inferred, Resource[] contexts) { + try (CloseableIteration statements = getStatements(null, null, + null, + inferred, contexts)) { while (statements.hasNext()) { removeStatement(statements.next()); } @@ -64,11 +66,12 @@ default void clear(Resource[] contexts) { // flush through to any underlying storage, called by the likes of commit() void flushForCommit(); - default boolean removeStatementsByQuery(Resource subj, IRI pred, Value obj, Resource[] contexts) { + default boolean removeStatementsByQuery(Resource subj, IRI pred, Value obj, boolean inferred, Resource[] contexts) { boolean deleted = false; - try (CloseableIteration statements = getStatements(subj, pred, obj, - contexts)) { + try (CloseableIteration statements = getStatements(subj, pred, + obj, + inferred, contexts)) { while (statements.hasNext()) { removeStatement(statements.next()); deleted = true; @@ -78,4 +81,10 @@ default boolean removeStatementsByQuery(Resource subj, IRI pred, Value obj, Reso return deleted; } + + default long getEstimatedSize() { + long inferred = getStatements(null, null, null, true).stream().count(); + long explicit = getStatements(null, null, null, false).stream().count(); + return inferred + explicit; + } } diff --git a/core/sail/extensible-store/src/main/java/org/eclipse/rdf4j/sail/extensiblestore/ExtensibleSailSource.java b/core/sail/extensible-store/src/main/java/org/eclipse/rdf4j/sail/extensiblestore/ExtensibleSailSource.java index abae5fcf175..0ea2565be0a 100644 --- a/core/sail/extensible-store/src/main/java/org/eclipse/rdf4j/sail/extensiblestore/ExtensibleSailSource.java +++ b/core/sail/extensible-store/src/main/java/org/eclipse/rdf4j/sail/extensiblestore/ExtensibleSailSource.java @@ -24,6 +24,7 @@ import org.eclipse.rdf4j.sail.base.SailDataset; import org.eclipse.rdf4j.sail.base.SailSink; import org.eclipse.rdf4j.sail.base.SailSource; +import org.eclipse.rdf4j.sail.extensiblestore.valuefactory.ExtensibleStatementHelper; /** * @author HÃ¥vard Mikkelsen Ottestad @@ -33,10 +34,15 @@ class ExtensibleSailSource implements SailSource { private final DataStructureInterface dataStructure; private final NamespaceStoreInterface namespaceStore; + private final boolean inferred; + private final ExtensibleStatementHelper extensibleStatementHelper; - public ExtensibleSailSource(DataStructureInterface dataStructure, NamespaceStoreInterface namespaceStore) { + public ExtensibleSailSource(DataStructureInterface dataStructure, NamespaceStoreInterface namespaceStore, + boolean inferred, ExtensibleStatementHelper extensibleStatementHelper) { this.dataStructure = dataStructure; this.namespaceStore = namespaceStore; + this.inferred = inferred; + this.extensibleStatementHelper = extensibleStatementHelper; } @@ -46,7 +52,8 @@ public void close() throws SailException { @Override public SailSource fork() { - return new ExtensibleSailSource(new ReadCommittedWrapper(this.dataStructure), namespaceStore); + return new ExtensibleSailSource(new ReadCommittedWrapper(this.dataStructure), namespaceStore, inferred, + extensibleStatementHelper); } @Override @@ -79,7 +86,7 @@ public synchronized void clearNamespaces() throws SailException { @Override public void clear(Resource... contexts) throws SailException { - dataStructure.clear(contexts); + dataStructure.clear(inferred, contexts); } @Override @@ -90,12 +97,14 @@ public void observe(Resource subj, IRI pred, Value obj, Resource... contexts) th @Override public void approve(Resource subj, IRI pred, Value obj, Resource ctx) throws SailException { Statement statement = SimpleValueFactory.getInstance().createStatement(subj, pred, obj, ctx); - dataStructure.addStatement(statement); + + dataStructure.addStatement(extensibleStatementHelper.fromStatement(statement, inferred)); } @Override public void approve(Statement statement) throws SailException { - dataStructure.addStatement(statement); + + dataStructure.addStatement(extensibleStatementHelper.fromStatement(statement, inferred)); } @Override @@ -105,12 +114,12 @@ public void deprecate(Resource subj, IRI pred, Value obj, Resource ctx) throws S @Override public void deprecate(Statement statement) throws SailException { - dataStructure.removeStatement(statement); + dataStructure.removeStatement(extensibleStatementHelper.fromStatement(statement, inferred)); } @Override public boolean deprecateByQuery(Resource subj, IRI pred, Value obj, Resource[] contexts) { - return dataStructure.removeStatementsByQuery(subj, pred, obj, contexts); + return dataStructure.removeStatementsByQuery(subj, pred, obj, inferred, contexts); } @Override @@ -199,7 +208,7 @@ public void close() { @Override public CloseableIteration getStatements(Resource subj, IRI pred, Value obj, Resource... contexts) throws SailException { - return dataStructure.getStatements(subj, pred, obj, contexts); + return dataStructure.getStatements(subj, pred, obj, inferred, contexts); } }; diff --git a/core/sail/extensible-store/src/main/java/org/eclipse/rdf4j/sail/extensiblestore/ExtensibleSailStore.java b/core/sail/extensible-store/src/main/java/org/eclipse/rdf4j/sail/extensiblestore/ExtensibleSailStore.java index 0d3ea173419..a74645547d1 100644 --- a/core/sail/extensible-store/src/main/java/org/eclipse/rdf4j/sail/extensiblestore/ExtensibleSailStore.java +++ b/core/sail/extensible-store/src/main/java/org/eclipse/rdf4j/sail/extensiblestore/ExtensibleSailStore.java @@ -7,30 +7,71 @@ *******************************************************************************/ package org.eclipse.rdf4j.sail.extensiblestore; +import org.eclipse.rdf4j.common.iteration.CloseableIteration; import org.eclipse.rdf4j.model.ValueFactory; import org.eclipse.rdf4j.model.impl.SimpleValueFactory; import org.eclipse.rdf4j.query.algebra.evaluation.impl.EvaluationStatistics; import org.eclipse.rdf4j.sail.SailException; import org.eclipse.rdf4j.sail.base.SailSource; import org.eclipse.rdf4j.sail.base.SailStore; +import org.eclipse.rdf4j.sail.extensiblestore.evaluationstatistics.DynamicStatistics; +import org.eclipse.rdf4j.sail.extensiblestore.evaluationstatistics.EvaluationStatisticsEnum; +import org.eclipse.rdf4j.sail.extensiblestore.evaluationstatistics.EvaluationStatisticsWrapper; +import org.eclipse.rdf4j.sail.extensiblestore.evaluationstatistics.ExtensibleEvaluationStatistics; +import org.eclipse.rdf4j.sail.extensiblestore.valuefactory.ExtensibleStatement; +import org.eclipse.rdf4j.sail.extensiblestore.valuefactory.ExtensibleStatementHelper; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** * @author HÃ¥vard Mikkelsen Ottestad */ -class ExtensibleSailStore implements SailStore { +public class ExtensibleSailStore implements SailStore { + + private static final Logger logger = LoggerFactory.getLogger(ExtensibleSailStore.class); + public static final int EVALUATION_STATISTICS_STALENESS_CHECK_INTERVAL = 1000 * 60; private ExtensibleSailSource sailSource; private ExtensibleSailSource sailSourceInferred; + private final EvaluationStatisticsEnum evaluationStatisticsEnum; + private ExtensibleEvaluationStatistics evaluationStatistics; + private Thread evaluationStatisticsMaintainerThread; + private DataStructureInterface dataStructure; + private volatile boolean closed; + + public ExtensibleSailStore(DataStructureInterface dataStructure, + NamespaceStoreInterface namespaceStore, EvaluationStatisticsEnum evaluationStatisticsEnum, + ExtensibleStatementHelper extensibleStatementHelper) { + + this.evaluationStatisticsEnum = evaluationStatisticsEnum; + this.evaluationStatistics = evaluationStatisticsEnum.getInstance(this); + + if (evaluationStatistics instanceof DynamicStatistics) { + dataStructure = new EvaluationStatisticsWrapper(dataStructure, (DynamicStatistics) evaluationStatistics); + startEvaluationStatisticsMaintainerThread(); + } + + this.dataStructure = dataStructure; + sailSource = new ExtensibleSailSource(dataStructure, namespaceStore, false, extensibleStatementHelper); + sailSourceInferred = new ExtensibleSailSource(dataStructure, namespaceStore, true, extensibleStatementHelper); - public ExtensibleSailStore(DataStructureInterface dataStructure, DataStructureInterface dataStructureInferred, - NamespaceStoreInterface namespaceStore) { - sailSource = new ExtensibleSailSource(dataStructure, namespaceStore); - sailSourceInferred = new ExtensibleSailSource(dataStructureInferred, namespaceStore); } - @Override - public void close() throws SailException { + synchronized private void startEvaluationStatisticsMaintainerThread() { + if (!closed) { + return; + } + evaluationStatisticsMaintainerThread = new Thread(new EvaluationStatisticsThread()); + evaluationStatisticsMaintainerThread.setDaemon(true); + evaluationStatisticsMaintainerThread.start(); + } + @Override + synchronized public void close() throws SailException { + closed = true; + if (evaluationStatisticsMaintainerThread != null) { + evaluationStatisticsMaintainerThread.interrupt(); + } sailSource.close(); sailSourceInferred.close(); } @@ -42,8 +83,7 @@ public ValueFactory getValueFactory() { @Override public EvaluationStatistics getEvaluationStatistics() { - return new EvaluationStatistics() { - }; + return evaluationStatistics; } @Override @@ -61,4 +101,84 @@ public void init() { sailSourceInferred.init(); } + private void startRecalculateStatistics() { + + logger.info("Recalculating stats: started"); + DynamicStatistics instance = (DynamicStatistics) evaluationStatisticsEnum.getInstance(this); + + addToStats(instance, dataStructure.getStatements(null, null, null, false)); + addToStats(instance, dataStructure.getStatements(null, null, null, true)); + + ((EvaluationStatisticsWrapper) dataStructure).setEvaluationStatistics(instance); + + evaluationStatistics = (ExtensibleEvaluationStatistics) instance; + logger.info("Recalculating stats: complete"); + + } + + private void addToStats(DynamicStatistics instance, + CloseableIteration statements) { + + long estimatedSize = dataStructure.getEstimatedSize(); + + long counter = 0; + while (statements.hasNext()) { + ExtensibleStatement next = statements.next(); + instance.add(next); + + if (Thread.interrupted() || closed) { + return; + } + + if (++counter % 100000 == 0) { + logger.info("Recalculating stats: {}%", Math.round(100.0 / estimatedSize * counter)); + } + } + + } + + class EvaluationStatisticsThread implements Runnable { + + @Override + public void run() { + + try { + try { + Thread.sleep(EVALUATION_STATISTICS_STALENESS_CHECK_INTERVAL); + } catch (InterruptedException e) { + return; + } + + if (closed) { + return; + } + + long estimatedSize = dataStructure.getEstimatedSize(); + + if (estimatedSize > 1000) { + double staleness = ((DynamicStatistics) evaluationStatistics).staleness(estimatedSize); + + if (staleness > 0.2) { + long formattedStaleness = Math.round(staleness * 100); + logger.info("Evaluation statistics is stale ({}%) and needs to be recalculated", + formattedStaleness); + startRecalculateStatistics(); + } + + } + + } catch (Exception e) { + if (!(closed || Thread.interrupted())) { + throw new RuntimeException(e); + } + + } finally { + if (!Thread.interrupted()) { + startEvaluationStatisticsMaintainerThread(); + } + } + + } + } + } diff --git a/core/sail/extensible-store/src/main/java/org/eclipse/rdf4j/sail/extensiblestore/ExtensibleStore.java b/core/sail/extensible-store/src/main/java/org/eclipse/rdf4j/sail/extensiblestore/ExtensibleStore.java index 89f54e632b2..3c08fe11664 100644 --- a/core/sail/extensible-store/src/main/java/org/eclipse/rdf4j/sail/extensiblestore/ExtensibleStore.java +++ b/core/sail/extensible-store/src/main/java/org/eclipse/rdf4j/sail/extensiblestore/ExtensibleStore.java @@ -22,6 +22,8 @@ import org.eclipse.rdf4j.query.algebra.evaluation.impl.StrictEvaluationStrategyFactory; import org.eclipse.rdf4j.repository.sparql.federation.SPARQLServiceResolver; import org.eclipse.rdf4j.sail.SailException; +import org.eclipse.rdf4j.sail.extensiblestore.evaluationstatistics.EvaluationStatisticsEnum; +import org.eclipse.rdf4j.sail.extensiblestore.valuefactory.ExtensibleStatementHelper; import org.eclipse.rdf4j.sail.helpers.AbstractNotifyingSail; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -51,15 +53,18 @@ public abstract class ExtensibleStore extends LookAheadIteration { +public class FilteringIteration extends LookAheadIteration { final Iteration wrappedIteration; CloseableIteration closeableWrappedIteration; - Resource subject; - IRI predicate; - Value object; - Resource[] context; + private final Resource subject; + private final IRI predicate; + private final Value object; + private final boolean inferred; + private final Resource[] context; public FilteringIteration(CloseableIteration wrappedIteration, Resource subject, IRI predicate, Value object, - Resource... context) { + boolean inferred, Resource... context) { this.wrappedIteration = wrappedIteration; this.closeableWrappedIteration = wrappedIteration; this.subject = subject; this.predicate = predicate; this.object = object; + this.inferred = inferred; this.context = context; } public FilteringIteration(Iteration wrappedIteration, Resource subject, IRI predicate, Value object, - Resource... context) { + boolean inferred, Resource... context) { this.wrappedIteration = wrappedIteration; this.subject = subject; this.predicate = predicate; this.object = object; + this.inferred = inferred; this.context = context; } @@ -71,6 +74,10 @@ protected E getNextElement() throws X { continue; } + if (next.isInferred() != inferred) { + continue; + } + return next; } @@ -82,7 +89,7 @@ protected E getNextElement() throws X { protected void handleClose() throws X { super.handleClose(); if (closeableWrappedIteration != null) { - assert (closeableWrappedIteration == closeableWrappedIteration); + assert (wrappedIteration == closeableWrappedIteration); closeableWrappedIteration.close(); } } diff --git a/core/sail/extensible-store/src/main/java/org/eclipse/rdf4j/sail/extensiblestore/PartialStatement.java b/core/sail/extensible-store/src/main/java/org/eclipse/rdf4j/sail/extensiblestore/PartialStatement.java index 61bd7c4b0fa..02cdbec13ca 100644 --- a/core/sail/extensible-store/src/main/java/org/eclipse/rdf4j/sail/extensiblestore/PartialStatement.java +++ b/core/sail/extensible-store/src/main/java/org/eclipse/rdf4j/sail/extensiblestore/PartialStatement.java @@ -16,16 +16,18 @@ public class PartialStatement { + private final boolean inferred; Resource subject; IRI predicate; Value object; Resource[] context; - public PartialStatement(Resource subject, IRI predicate, Value object, Resource... context) { + public PartialStatement(Resource subject, IRI predicate, Value object, boolean inferred, Resource... context) { this.subject = subject; this.predicate = predicate; this.object = object; this.context = context; + this.inferred = inferred; } @Override @@ -37,7 +39,8 @@ public boolean equals(Object o) { return false; } PartialStatement that = (PartialStatement) o; - return Objects.equals(subject, that.subject) && + return inferred == that.inferred && + Objects.equals(subject, that.subject) && Objects.equals(predicate, that.predicate) && Objects.equals(object, that.object) && Arrays.equals(context, that.context); @@ -45,7 +48,7 @@ public boolean equals(Object o) { @Override public int hashCode() { - int result = Objects.hash(subject, predicate, object); + int result = Objects.hash(subject, predicate, object, inferred); result = 31 * result + Arrays.hashCode(context); return result; } diff --git a/core/sail/extensible-store/src/main/java/org/eclipse/rdf4j/sail/extensiblestore/ReadCache.java b/core/sail/extensible-store/src/main/java/org/eclipse/rdf4j/sail/extensiblestore/ReadCache.java index c9b197a4fa0..842f05eb95a 100644 --- a/core/sail/extensible-store/src/main/java/org/eclipse/rdf4j/sail/extensiblestore/ReadCache.java +++ b/core/sail/extensible-store/src/main/java/org/eclipse/rdf4j/sail/extensiblestore/ReadCache.java @@ -16,9 +16,9 @@ import org.eclipse.rdf4j.common.iteration.LookAheadIteration; import org.eclipse.rdf4j.model.IRI; import org.eclipse.rdf4j.model.Resource; -import org.eclipse.rdf4j.model.Statement; import org.eclipse.rdf4j.model.Value; import org.eclipse.rdf4j.sail.SailException; +import org.eclipse.rdf4j.sail.extensiblestore.valuefactory.ExtensibleStatement; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -33,7 +33,7 @@ public class ReadCache implements DataStructureInterface { // ReferenceMap defaults to hard reference for key and soft reference for value. This means that a value may be // garbage collected, but unlike a weak ref it will only be garbage collected if we run out of memory. This is a // memory sensitive cache. - ReferenceMap> cache = new ReferenceMap<>(); + ReferenceMap> cache = new ReferenceMap<>(); // The cache ticket is incremented every time the cache is cleared. A getStatements operation retrieves the current // cacheTicket when the iteration is opened. When the iteration is closed it checks the retrieved ticket against the @@ -47,23 +47,24 @@ public ReadCache(DataStructureInterface delegate) { } @Override - public void addStatement(Statement statement) { + public void addStatement(ExtensibleStatement statement) { delegate.addStatement(statement); clearCache(); } @Override - public void removeStatement(Statement statement) { + public void removeStatement(ExtensibleStatement statement) { delegate.removeStatement(statement); clearCache(); } @Override - public CloseableIteration getStatements(Resource subject, IRI predicate, - Value object, Resource... context) { + public CloseableIteration getStatements(Resource subject, + IRI predicate, + Value object, boolean inferred, Resource... context) { - PartialStatement partialStatement = new PartialStatement(subject, predicate, object, context); - CloseableIteration cached = getCached(partialStatement); + PartialStatement partialStatement = new PartialStatement(subject, predicate, object, inferred, context); + CloseableIteration cached = getCached(partialStatement); if (cached != null) { logger.trace("cache hit"); return cached; @@ -71,11 +72,12 @@ public CloseableIteration getStatements(Reso long localCacheTicket = cacheTicket; - return new CloseableIteration() { + return new CloseableIteration() { - CloseableIteration statements = delegate.getStatements(subject, - predicate, object, context); - List cache = new ArrayList<>(); + CloseableIteration statements = delegate.getStatements( + subject, + predicate, object, inferred, context); + List cache = new ArrayList<>(); @Override public boolean hasNext() throws SailException { @@ -83,9 +85,9 @@ public boolean hasNext() throws SailException { } @Override - public Statement next() throws SailException { + public ExtensibleStatement next() throws SailException { - Statement next = statements.next(); + ExtensibleStatement next = statements.next(); if (cache != null) { cache.add(next); @@ -117,17 +119,17 @@ public void close() throws SailException { } - synchronized private CloseableIteration getCached( + synchronized private CloseableIteration getCached( PartialStatement partialStatement) { - List statements = cache.get(partialStatement); + List statements = cache.get(partialStatement); if (statements != null) { - return new LookAheadIteration() { - Iterator iterator = statements.iterator(); + return new LookAheadIteration() { + Iterator iterator = statements.iterator(); @Override - protected Statement getNextElement() throws SailException { + protected ExtensibleStatement getNextElement() throws SailException { if (iterator.hasNext()) { return iterator.next(); } @@ -151,8 +153,8 @@ public void init() { } @Override - public void clear(Resource[] contexts) { - delegate.clear(contexts); + public void clear(boolean inferred, Resource[] contexts) { + delegate.clear(inferred, contexts); clearCache(); } @@ -163,8 +165,8 @@ public void flushForCommit() { } @Override - public boolean removeStatementsByQuery(Resource subj, IRI pred, Value obj, Resource[] contexts) { - boolean removed = delegate.removeStatementsByQuery(subj, pred, obj, contexts); + public boolean removeStatementsByQuery(Resource subj, IRI pred, Value obj, boolean inferred, Resource[] contexts) { + boolean removed = delegate.removeStatementsByQuery(subj, pred, obj, inferred, contexts); clearCache(); return removed; } @@ -179,10 +181,15 @@ synchronized public void clearCache() { } synchronized public void submitToCache(Long localCacheTicket, PartialStatement partialStatement, - List statements) { + List statements) { if (localCacheTicket == cacheTicket && statements != null) { cache.put(partialStatement, statements); } } + + @Override + public long getEstimatedSize() { + return delegate.getEstimatedSize(); + } } diff --git a/core/sail/extensible-store/src/main/java/org/eclipse/rdf4j/sail/extensiblestore/ReadCommittedWrapper.java b/core/sail/extensible-store/src/main/java/org/eclipse/rdf4j/sail/extensiblestore/ReadCommittedWrapper.java index 6f5fcf46094..5d5eafa98d2 100644 --- a/core/sail/extensible-store/src/main/java/org/eclipse/rdf4j/sail/extensiblestore/ReadCommittedWrapper.java +++ b/core/sail/extensible-store/src/main/java/org/eclipse/rdf4j/sail/extensiblestore/ReadCommittedWrapper.java @@ -7,9 +7,11 @@ *******************************************************************************/ package org.eclipse.rdf4j.sail.extensiblestore; +import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.List; +import java.util.Map; import java.util.Set; import java.util.stream.Collectors; @@ -23,6 +25,8 @@ import org.eclipse.rdf4j.model.Value; import org.eclipse.rdf4j.model.impl.SimpleValueFactory; import org.eclipse.rdf4j.sail.SailException; +import org.eclipse.rdf4j.sail.extensiblestore.valuefactory.ExtensibleStatement; +import org.eclipse.rdf4j.sail.extensiblestore.valuefactory.ExtensibleStatementHelper; /** * @author HÃ¥vard Mikkelsen Ottestad @@ -31,43 +35,47 @@ class ReadCommittedWrapper implements DataStructureInterface { private final DataStructureInterface dataStructure; - private Set internalAdded = new HashSet<>(1000); - private Set internalRemoved = new HashSet<>(100); + private Map internalAdded = new HashMap<>(); + private Map internalRemoved = new HashMap<>(); ReadCommittedWrapper(DataStructureInterface dataStructure) { this.dataStructure = dataStructure; } @Override - public void addStatement(Statement statement) { - internalAdded.add(statement); + public void addStatement(ExtensibleStatement statement) { + internalAdded.put(statement, statement); internalRemoved.remove(statement); } @Override - public void removeStatement(Statement statement) { - internalRemoved.add(statement); + public void removeStatement(ExtensibleStatement statement) { + internalRemoved.put(statement, statement); } @Override - public CloseableIteration getStatements(Resource subject, - IRI predicate, Value object, Resource... context) { + public CloseableIteration getStatements(Resource subject, + IRI predicate, Value object, boolean inferred, Resource... context) { // must match single statement if (subject != null && predicate != null && object != null && context != null && context.length == 1) { Statement statement = SimpleValueFactory.getInstance() .createStatement(subject, predicate, object, context[0]); - if (internalAdded.contains(statement)) { - return new SingletonIteration<>(statement); + statement = ExtensibleStatementHelper.getDefaultImpl().fromStatement(statement, inferred); + + ExtensibleStatement extensibleStatement = internalAdded.get(statement); + + if (extensibleStatement != null) { + return new SingletonIteration<>(extensibleStatement); } else { - if (internalRemoved.contains(statement)) { + if (internalRemoved.containsKey(statement)) { return new EmptyIteration<>(); } else { synchronized (dataStructure) { - return dataStructure.getStatements(subject, predicate, object, context); + return dataStructure.getStatements(subject, predicate, object, inferred, context); } } } @@ -75,12 +83,12 @@ public CloseableIteration getStatements(Reso } else { synchronized (dataStructure) { - return new LookAheadIteration() { + return new LookAheadIteration() { - Set internalAddedLocal = new HashSet<>(internalAdded); - Set internalRemovedLocal = new HashSet<>(internalRemoved); + Set internalAddedLocal = new HashSet<>(internalAdded.values()); + Set internalRemovedLocal = new HashSet<>(internalRemoved.values()); - Iterator left = internalAddedLocal.stream() + Iterator left = internalAddedLocal.stream() .filter(statement -> { if (subject != null && !statement.getSubject().equals(subject)) { @@ -97,12 +105,17 @@ public CloseableIteration getStatements(Reso return false; } + if (!inferred && inferred != statement.isInferred()) { + return false; + } + return true; }) .iterator(); - CloseableIteration right = dataStructure.getStatements( - subject, predicate, object, context); + CloseableIteration right = dataStructure + .getStatements( + subject, predicate, object, inferred, context); @Override protected void handleClose() throws SailException { @@ -111,12 +124,12 @@ protected void handleClose() throws SailException { } @Override - protected Statement getNextElement() throws SailException { + protected ExtensibleStatement getNextElement() throws SailException { - Statement next = null; + ExtensibleStatement next = null; do { - Statement tempNext = null; + ExtensibleStatement tempNext = null; if (left.hasNext()) { tempNext = left.next(); } else if (right.hasNext()) { @@ -161,19 +174,24 @@ private static boolean containsContext(Resource[] haystack, Resource needle) { @Override public void flushForCommit() { - List internalAddedEffective = internalAdded + if (internalAdded.isEmpty() && internalRemoved.isEmpty()) { + return; + } + + List internalAddedEffective = internalAdded + .keySet() .stream() - .filter(statement -> !internalRemoved.contains(statement)) + .filter(statement -> !internalRemoved.containsKey(statement)) .collect(Collectors.toList()); synchronized (dataStructure) { internalAddedEffective.forEach(dataStructure::addStatement); - internalRemoved.forEach(dataStructure::removeStatement); + internalRemoved.values().forEach(dataStructure::removeStatement); dataStructure.flushForReading(); } - internalAdded = new HashSet<>(internalAdded.size()); - internalRemoved = new HashSet<>(internalRemoved.size()); + internalAdded = new HashMap<>(); + internalRemoved = new HashMap<>(); } diff --git a/core/sail/extensible-store/src/main/java/org/eclipse/rdf4j/sail/extensiblestore/evaluationstatistics/DynamicStatistics.java b/core/sail/extensible-store/src/main/java/org/eclipse/rdf4j/sail/extensiblestore/evaluationstatistics/DynamicStatistics.java new file mode 100644 index 00000000000..d07c98accff --- /dev/null +++ b/core/sail/extensible-store/src/main/java/org/eclipse/rdf4j/sail/extensiblestore/evaluationstatistics/DynamicStatistics.java @@ -0,0 +1,37 @@ +/******************************************************************************* + * Copyright (c) 2020 Eclipse RDF4J contributors. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Distribution License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ +package org.eclipse.rdf4j.sail.extensiblestore.evaluationstatistics; + +import org.eclipse.rdf4j.common.annotation.Experimental; +import org.eclipse.rdf4j.model.IRI; +import org.eclipse.rdf4j.model.Resource; +import org.eclipse.rdf4j.model.Value; +import org.eclipse.rdf4j.sail.extensiblestore.valuefactory.ExtensibleStatement; + +/** + * Interface to support evaluation statistics that keep their own internal estimates and need to be notified of added or + * removed statements. + */ +@Experimental +public interface DynamicStatistics { + + void add(ExtensibleStatement statement); + + void remove(ExtensibleStatement statement); + + void removeByQuery(Resource subj, IRI pred, Value obj, boolean inferred, Resource... contexts); + + /** + * + * @return 1 if stale, 0 if not stale, 0.5 if 50% stale. Seen as, given a random statement (that has either been + * added, or removed), what is the probability that the statistics will return an incorrect result? + * @param expectedSize + */ + double staleness(long expectedSize); + +} diff --git a/core/sail/extensible-store/src/main/java/org/eclipse/rdf4j/sail/extensiblestore/evaluationstatistics/EvaluationStatisticsEnum.java b/core/sail/extensible-store/src/main/java/org/eclipse/rdf4j/sail/extensiblestore/evaluationstatistics/EvaluationStatisticsEnum.java new file mode 100644 index 00000000000..83c2f5ed59f --- /dev/null +++ b/core/sail/extensible-store/src/main/java/org/eclipse/rdf4j/sail/extensiblestore/evaluationstatistics/EvaluationStatisticsEnum.java @@ -0,0 +1,37 @@ +/******************************************************************************* + * Copyright (c) 2020 Eclipse RDF4J contributors. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Distribution License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ +package org.eclipse.rdf4j.sail.extensiblestore.evaluationstatistics; + +import java.util.function.Function; + +import org.eclipse.rdf4j.common.annotation.Experimental; +import org.eclipse.rdf4j.sail.extensiblestore.ExtensibleSailStore; + +/** + * Enum to support multiple different EvaluationStatistics implementations. The user can control which is used by + * overriding getEvalStats() in the ExtensibleStore. + */ +@Experimental +public enum EvaluationStatisticsEnum { + + direct("Looks up the count directly in the underlying data structure.", ExtensibleDirectEvaluationStatistics::new), + constant("Uses constant values instead of statistics.", ExtensibleConstantEvaluationStatistics::new), + dynamic("Continually keeps dynamic estimates on the counts of various statement patterns.", + ExtensibleDynamicEvaluationStatistics::new); + + private final Function evaluationStatisticsSupplier; + + EvaluationStatisticsEnum(String comment, + Function evaluationStatisticsSupplier) { + this.evaluationStatisticsSupplier = evaluationStatisticsSupplier; + } + + public ExtensibleEvaluationStatistics getInstance(ExtensibleSailStore extensibleSailStore) { + return evaluationStatisticsSupplier.apply(extensibleSailStore); + } +} diff --git a/core/sail/extensible-store/src/main/java/org/eclipse/rdf4j/sail/extensiblestore/evaluationstatistics/EvaluationStatisticsWrapper.java b/core/sail/extensible-store/src/main/java/org/eclipse/rdf4j/sail/extensiblestore/evaluationstatistics/EvaluationStatisticsWrapper.java new file mode 100644 index 00000000000..86a458f02f3 --- /dev/null +++ b/core/sail/extensible-store/src/main/java/org/eclipse/rdf4j/sail/extensiblestore/evaluationstatistics/EvaluationStatisticsWrapper.java @@ -0,0 +1,102 @@ +/******************************************************************************* + * Copyright (c) 2020 Eclipse RDF4J contributors. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Distribution License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ +package org.eclipse.rdf4j.sail.extensiblestore.evaluationstatistics; + +import java.util.Collection; + +import org.eclipse.rdf4j.common.annotation.Experimental; +import org.eclipse.rdf4j.common.iteration.CloseableIteration; +import org.eclipse.rdf4j.model.IRI; +import org.eclipse.rdf4j.model.Resource; +import org.eclipse.rdf4j.model.Value; +import org.eclipse.rdf4j.sail.SailException; +import org.eclipse.rdf4j.sail.extensiblestore.DataStructureInterface; +import org.eclipse.rdf4j.sail.extensiblestore.valuefactory.ExtensibleStatement; + +/** + * A wrapper around a data structure to support evaluation statistics that need to be notified of added or removed + * statements. + */ +@Experimental +public class EvaluationStatisticsWrapper implements DataStructureInterface { + + private DynamicStatistics dynamicStatistics; + private final DataStructureInterface delegate; + + public EvaluationStatisticsWrapper(DataStructureInterface delegate, DynamicStatistics dynamicStatistics) { + this.delegate = delegate; + this.dynamicStatistics = dynamicStatistics; + } + + @Override + public void addStatement(ExtensibleStatement statement) { + delegate.addStatement(statement); + dynamicStatistics.add(statement); + } + + @Override + public void removeStatement(ExtensibleStatement statement) { + delegate.removeStatement(statement); + dynamicStatistics.remove(statement); + + } + + @Override + public CloseableIteration getStatements(Resource subject, + IRI predicate, + Value object, boolean inferred, Resource... context) { + return delegate.getStatements(subject, predicate, object, inferred, context); + } + + @Override + public void flushForReading() { + delegate.flushForReading(); + } + + @Override + public void init() { + delegate.init(); + } + + @Override + public void clear(boolean inferred, Resource[] contexts) { + delegate.clear(inferred, contexts); + } + + @Override + public void flushForCommit() { + delegate.flushForCommit(); + } + + @Override + public boolean removeStatementsByQuery(Resource subj, IRI pred, Value obj, boolean inferred, Resource[] contexts) { + dynamicStatistics.removeByQuery(subj, pred, obj, inferred, contexts); + return delegate.removeStatementsByQuery(subj, pred, obj, inferred, contexts); + } + + @Override + public void addStatement(Collection statements) { + delegate.addStatement(statements); + statements.forEach(dynamicStatistics::add); + } + + @Override + public void removeStatement(Collection statements) { + delegate.addStatement(statements); + statements.forEach(dynamicStatistics::remove); + } + + @Override + public long getEstimatedSize() { + return delegate.getEstimatedSize(); + } + + public void setEvaluationStatistics(DynamicStatistics dynamicStatistics) { + this.dynamicStatistics = dynamicStatistics; + } +} diff --git a/core/sail/extensible-store/src/main/java/org/eclipse/rdf4j/sail/extensiblestore/evaluationstatistics/ExtensibleConstantEvaluationStatistics.java b/core/sail/extensible-store/src/main/java/org/eclipse/rdf4j/sail/extensiblestore/evaluationstatistics/ExtensibleConstantEvaluationStatistics.java new file mode 100644 index 00000000000..c0e0d7d75c4 --- /dev/null +++ b/core/sail/extensible-store/src/main/java/org/eclipse/rdf4j/sail/extensiblestore/evaluationstatistics/ExtensibleConstantEvaluationStatistics.java @@ -0,0 +1,31 @@ +/******************************************************************************* + * Copyright (c) 2020 Eclipse RDF4J contributors. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Distribution License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ +package org.eclipse.rdf4j.sail.extensiblestore.evaluationstatistics; + +import org.eclipse.rdf4j.common.annotation.Experimental; +import org.eclipse.rdf4j.sail.extensiblestore.ExtensibleSailStore; + +/** + * ExtensibleDirectEvaluationStatistics provides evaluation statistics by using the default implementation. The default + * implementation uses constants to return cardinalities for various patterns. + */ +@Experimental +public class ExtensibleConstantEvaluationStatistics extends ExtensibleEvaluationStatistics { + public ExtensibleConstantEvaluationStatistics(ExtensibleSailStore extensibleSailStore) { + super(extensibleSailStore); + } + + @Override + protected CardinalityCalculator createCardinalityCalculator() { + return cardinalityCalculator; + } + + CardinalityCalculator cardinalityCalculator = new CardinalityCalculator() { + }; + +} diff --git a/core/sail/extensible-store/src/main/java/org/eclipse/rdf4j/sail/extensiblestore/evaluationstatistics/ExtensibleDirectEvaluationStatistics.java b/core/sail/extensible-store/src/main/java/org/eclipse/rdf4j/sail/extensiblestore/evaluationstatistics/ExtensibleDirectEvaluationStatistics.java new file mode 100644 index 00000000000..b40e4c92142 --- /dev/null +++ b/core/sail/extensible-store/src/main/java/org/eclipse/rdf4j/sail/extensiblestore/evaluationstatistics/ExtensibleDirectEvaluationStatistics.java @@ -0,0 +1,63 @@ +/******************************************************************************* + * Copyright (c) 2020 Eclipse RDF4J contributors. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Distribution License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ +package org.eclipse.rdf4j.sail.extensiblestore.evaluationstatistics; + +import java.util.stream.Stream; + +import org.eclipse.rdf4j.IsolationLevels; +import org.eclipse.rdf4j.common.annotation.Experimental; +import org.eclipse.rdf4j.common.iteration.Iterations; +import org.eclipse.rdf4j.model.IRI; +import org.eclipse.rdf4j.model.Resource; +import org.eclipse.rdf4j.model.Statement; +import org.eclipse.rdf4j.model.Value; +import org.eclipse.rdf4j.query.algebra.StatementPattern; +import org.eclipse.rdf4j.sail.base.SailDataset; +import org.eclipse.rdf4j.sail.extensiblestore.ExtensibleSailStore; + +/** + * ExtensibleDirectEvaluationStatistics provides evaluation statistics by directly querying the underlying data source. + */ +@Experimental +public class ExtensibleDirectEvaluationStatistics extends ExtensibleEvaluationStatistics { + public ExtensibleDirectEvaluationStatistics(ExtensibleSailStore extensibleSailStore) { + super(extensibleSailStore); + } + + @Override + protected CardinalityCalculator createCardinalityCalculator() { + return cardinalityCalculator; + } + + CardinalityCalculator cardinalityCalculator = new CardinalityCalculator() { + @Override + protected double getCardinality(StatementPattern sp) { + + SailDataset dataset = extensibleSailStore.getExplicitSailSource().dataset(IsolationLevels.NONE); + + Resource subject = (Resource) sp.getSubjectVar().getValue(); + IRI predicate = (IRI) sp.getPredicateVar().getValue(); + Value object = sp.getObjectVar().getValue(); + + if (sp.getScope() == StatementPattern.Scope.DEFAULT_CONTEXTS) { + try (Stream stream = Iterations + .stream(dataset.getStatements(subject, predicate, object))) { + return stream.count(); + } + } else { + Resource[] context = new Resource[] { (Resource) sp.getContextVar().getValue() }; + try (Stream stream = Iterations + .stream(dataset.getStatements(subject, predicate, object, context))) { + return stream.count(); + } + } + + } + }; + +} diff --git a/core/sail/extensible-store/src/main/java/org/eclipse/rdf4j/sail/extensiblestore/evaluationstatistics/ExtensibleDynamicEvaluationStatistics.java b/core/sail/extensible-store/src/main/java/org/eclipse/rdf4j/sail/extensiblestore/evaluationstatistics/ExtensibleDynamicEvaluationStatistics.java new file mode 100644 index 00000000000..89867ac2ed1 --- /dev/null +++ b/core/sail/extensible-store/src/main/java/org/eclipse/rdf4j/sail/extensiblestore/evaluationstatistics/ExtensibleDynamicEvaluationStatistics.java @@ -0,0 +1,391 @@ +/******************************************************************************* + * Copyright (c) 2020 Eclipse RDF4J contributors. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Distribution License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ +package org.eclipse.rdf4j.sail.extensiblestore.evaluationstatistics; + +import java.nio.charset.StandardCharsets; +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.ConcurrentLinkedQueue; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.stream.Stream; + +import org.eclipse.rdf4j.common.annotation.Experimental; +import org.eclipse.rdf4j.model.IRI; +import org.eclipse.rdf4j.model.Resource; +import org.eclipse.rdf4j.model.Statement; +import org.eclipse.rdf4j.model.Value; +import org.eclipse.rdf4j.query.algebra.StatementPattern; +import org.eclipse.rdf4j.query.algebra.Var; +import org.eclipse.rdf4j.sail.extensiblestore.ExtensibleSailStore; +import org.eclipse.rdf4j.sail.extensiblestore.valuefactory.ExtensibleStatement; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.google.common.hash.HashFunction; +import com.google.common.hash.Hashing; + +import net.agkn.hll.HLL; + +/** + *

    + * ExtensibleDynamicEvaluationStatistics aims to keep an internal estimate of the cardinality of various statement + * patterns. + *

    + * + *

    + * It support getting the overall size, any single dimension cardinality (eg. ?a rdf:type ?b) and also two + * multidimensional patterns (:Peter rdf:type ?b; and ?a rdf:type foaf:Person). + *

    + * + *

    + * Since evaluation statistics are best-effort, we use HLL as sets to keep the number of statements for each pattern we + * support. HLL is a very memory efficient set implementation. Furthermore we hash each pattern into a fixed bucket + * size, 1024 for single dimension and 64 per dimension for multidimensional patterns. + *

    + * + *

    + * This means that adding ':peter rdf:type foaf:Person' and ':lisa rdf:type foaf:Person' could potentially return + * getCardinality(:peter, ?b, ?c) = 2 if both :peter and :lisa hash to the same of the 1024 buckets in subjectIndex. + *

    + * + *

    + * HLL does not support "remove" operations, so there are two sets of every index. One for all added statements and one + * for all removed statements. If the user adds, removes and re-adds the same statement then the cardinality for that + * statement will be incorrect. We call this effect "staleness". To prevent staleness from affecting the returned + * cardinalities this class needs to be monitored by calling the staleness(...) method. This will automatically be done + * every 60 seconds by the ExtensibleSailStore. + *

    + * + */ +@Experimental +public class ExtensibleDynamicEvaluationStatistics extends ExtensibleEvaluationStatistics implements DynamicStatistics { + private static final Logger logger = LoggerFactory.getLogger(ExtensibleDynamicEvaluationStatistics.class); + private static final int QUEUE_LIMIT = 128; + private static final int SINGLE_DIMENSION_INDEX_SIZE = 1024; + + ConcurrentLinkedQueue queue = new ConcurrentLinkedQueue<>(); + + AtomicInteger queueSize = new AtomicInteger(); + + private final HashFunction HASH_FUNCTION = Hashing.murmur3_128(); + + private final HLL EMPTY_HLL = getHLL(); + + private final HLL size = getHLL(); + private final HLL size_removed = getHLL(); + + private final Map subjectIndex = new HashMap<>(); + private final Map predicateIndex = new HashMap<>(); + private final Map objectIndex = new HashMap<>(); + private final Map contextIndex = new HashMap<>(); + private final HLL defaultContext = getHLL(); + + private final HLL[][] subjectPredicateIndex = new HLL[64][64]; + private final HLL[][] predicateObjectIndex = new HLL[64][64]; + + private final Map subjectIndex_removed = new HashMap<>(); + private final Map predicateIndex_removed = new HashMap<>(); + private final Map objectIndex_removed = new HashMap<>(); + private final Map contextIndex_removed = new HashMap<>(); + private final HLL defaultContext_removed = getHLL(); + + private final HLL[][] subjectPredicateIndex_removed = new HLL[64][64]; + private final HLL[][] predicateObjectIndex_removed = new HLL[64][64]; + volatile private Thread queueConsumingThread; + + public ExtensibleDynamicEvaluationStatistics(ExtensibleSailStore extensibleSailStore) { + super(extensibleSailStore); + + Stream.of(subjectPredicateIndex, predicateObjectIndex, subjectPredicateIndex_removed, + predicateObjectIndex_removed).forEach(index -> { + for (int i = 0; i < index.length; i++) { + for (int j = 0; j < index[i].length; j++) { + index[i][j] = getHLL(); + } + } + }); + + } + + @Override + protected CardinalityCalculator createCardinalityCalculator() { + return new ExtensibleDynamicEvaluationStatisticsCardinalityCalculator(); + } + + @Override + synchronized public double staleness(long expectedSize) { + + double estimatedSize = size.cardinality() - size_removed.cardinality(); + + // add 500 because this is our minimum margin of error + estimatedSize += 500; + expectedSize += 500; + + double diff = Math.abs(estimatedSize - expectedSize); + + double staleness; + + if (estimatedSize + expectedSize == 0 || diff == 0) { + staleness = 0; + } else { + if (expectedSize > estimatedSize) { + staleness = diff / expectedSize; + } else { + staleness = diff / Math.max(0, estimatedSize); + } + } + + logger.debug("expected size {}; estimated size: {}; staleness: {}", expectedSize, estimatedSize, staleness); + + return staleness; + + } + + class ExtensibleDynamicEvaluationStatisticsCardinalityCalculator extends CardinalityCalculator { + + @Override + synchronized protected double getCardinality(StatementPattern sp) { + double min = size.cardinality() - size_removed.cardinality(); + + min = Math.min(min, getSubjectCardinality(sp.getSubjectVar())); + min = Math.min(min, getPredicateCardinality(sp.getPredicateVar())); + min = Math.min(min, getObjectCardinality(sp.getObjectVar())); + + // skip more complex evaluations if min is unlikely to get lower + if (min < 2) { + return min; + } + + if (sp.getSubjectVar().getValue() != null && sp.getPredicateVar().getValue() != null) { + min = Math.min(min, + getHllCardinality( + subjectPredicateIndex, + subjectPredicateIndex_removed, + sp.getSubjectVar().getValue(), + sp.getPredicateVar().getValue())); + } + + if (sp.getPredicateVar().getValue() != null && sp.getObjectVar().getValue() != null) { + min = Math.min(min, + getHllCardinality( + predicateObjectIndex, + predicateObjectIndex_removed, + sp.getPredicateVar().getValue(), + sp.getObjectVar().getValue())); + } + + return min; + + } + + @Override + synchronized protected double getSubjectCardinality(Var var) { + if (var.getValue() == null) { + return size.cardinality(); + } else { + return getHllCardinality(subjectIndex, subjectIndex_removed, var.getValue()); + } + + } + + @Override + synchronized protected double getPredicateCardinality(Var var) { + if (var.getValue() == null) { + return size.cardinality(); + } else { + return getHllCardinality(predicateIndex, predicateIndex_removed, var.getValue()); + } + } + + @Override + synchronized protected double getObjectCardinality(Var var) { + if (var.getValue() == null) { + return size.cardinality(); + } else { + return getHllCardinality(objectIndex, objectIndex_removed, var.getValue()); + } + } + + @Override + synchronized protected double getContextCardinality(Var var) { + if (var.getValue() == null) { + return defaultContext.cardinality() - defaultContext_removed.cardinality(); + } else { + return getHllCardinality(contextIndex, contextIndex_removed, var.getValue()); + } + } + } + + ; + + private double getHllCardinality(HLL[][] index, HLL[][] index_removed, + Value value1, Value value2) { + + int value1IndexIntoAdded = Math.abs(value1.hashCode() % index.length); + int value2IndexIntoAdded = Math.abs(value2.hashCode() % index.length); + double cardinalityAdded = index[value1IndexIntoAdded][value2IndexIntoAdded].cardinality(); + + int value1IndexIntoRemoved = Math.abs(value1.hashCode() % index_removed.length); + int value2IndexIntoRemoved = Math.abs(value2.hashCode() % index_removed.length); + double removedStatements = index_removed[value1IndexIntoRemoved][value2IndexIntoRemoved].cardinality(); + + return cardinalityAdded - removedStatements; + } + + private double getHllCardinality(Map index, + Map index_removed, Value value) { + + int indexIntoMap = Math.abs(value.hashCode() % SINGLE_DIMENSION_INDEX_SIZE); + + double cardinalityAdded = index.getOrDefault(indexIntoMap, EMPTY_HLL).cardinality(); + double cardinalityRemoved = index_removed.getOrDefault(indexIntoMap, EMPTY_HLL).cardinality(); + + return cardinalityAdded - cardinalityRemoved; + } + + @Override + public void add(ExtensibleStatement statement) { + + queue.add(new StatementQueueItem(statement, StatementQueueItem.Type.added)); + + int size = queueSize.incrementAndGet(); + if (size > QUEUE_LIMIT && queueConsumingThread == null) { + startQueueConsumingThread(); + } + } + + synchronized private void startQueueConsumingThread() { + if (queueConsumingThread == null) { + queueConsumingThread = new Thread(() -> { + try { + while (!queue.isEmpty()) { + StatementQueueItem poll = queue.poll(); + queueSize.decrementAndGet(); + Statement statement = poll.statement; + long statementHash = HASH_FUNCTION + .hashString(statement.toString(), StandardCharsets.UTF_8) + .asLong(); + + if (poll.type == StatementQueueItem.Type.added) { + + handleStatement(statement, statementHash, size, subjectIndex, predicateIndex, objectIndex, + subjectPredicateIndex, predicateObjectIndex, defaultContext, contextIndex); + + } else { // removed + + assert poll.type == StatementQueueItem.Type.removed; + + handleStatement(statement, statementHash, size_removed, subjectIndex_removed, + predicateIndex_removed, objectIndex_removed, subjectPredicateIndex_removed, + predicateObjectIndex_removed, defaultContext_removed, contextIndex_removed); + + } + + if (queue.isEmpty()) { + try { + Thread.sleep(2); + } catch (InterruptedException ignored) { + + } + } + } + } finally { + queueConsumingThread = null; + } + + }); + + queueConsumingThread.setDaemon(true); + queueConsumingThread.start(); + + } + } + + synchronized private void handleStatement(Statement statement, long statementHash, HLL size, + Map subjectIndex, Map predicateIndex, + Map objectIndex, HLL[][] subjectPredicateIndex, + HLL[][] predicateObjectIndex, HLL defaultContext, + Map contextIndex) { + size.addRaw(statementHash); + int subjectHash = statement.getSubject().hashCode(); + int predicateHash = statement.getPredicate().hashCode(); + int objectHash = statement.getObject().hashCode(); + + indexOneValue(statementHash, subjectIndex, subjectHash); + indexOneValue(statementHash, predicateIndex, predicateHash); + indexOneValue(statementHash, objectIndex, objectHash); + + indexTwoValues(statementHash, subjectPredicateIndex, subjectHash, predicateHash); + indexTwoValues(statementHash, predicateObjectIndex, predicateHash, objectHash); + + if (statement.getContext() == null) { + defaultContext.addRaw(statementHash); + } else { + indexOneValue(statementHash, contextIndex, statement.getContext().hashCode()); + } + } + + static class StatementQueueItem { + ExtensibleStatement statement; + Type type; + + public StatementQueueItem(ExtensibleStatement statement, Type type) { + this.statement = statement; + this.type = type; + } + + enum Type { + added, + removed; + } + } + + private void indexTwoValues(long statementHash, HLL[][] index, int indexHash, int indexHash2) { + index[Math.abs(indexHash % index.length)][Math.abs(indexHash2 % index.length)].addRaw(statementHash); + } + + private void indexOneValue(long statementHash, Map index, int indexHash) { + index.compute(Math.abs(indexHash % SINGLE_DIMENSION_INDEX_SIZE), (key, val) -> { + if (val == null) { + val = getHLL(); + } + val.addRaw(statementHash); + return val; + }); + } + + private HLL getHLL() { + return new HLL(13/* log2m */, 5/* registerWidth */); + } + + @Override + public void remove(ExtensibleStatement statement) { + + queue.add(new StatementQueueItem(statement, StatementQueueItem.Type.removed)); + + int size = queueSize.incrementAndGet(); + if (size > QUEUE_LIMIT && queueConsumingThread == null) { + startQueueConsumingThread(); + } + } + + @Override + public void removeByQuery(Resource subj, IRI pred, Value obj, boolean inferred, Resource... contexts) { + // not implemented yet + // we should be able to handle cases where we are removing with up to two specified dimensions. + } + + public void waitForQueue() throws InterruptedException { + while (queueConsumingThread != null) { + try { + queueConsumingThread.join(); + } catch (NullPointerException ignored) { + } + } + } +} diff --git a/core/sail/extensible-store/src/main/java/org/eclipse/rdf4j/sail/extensiblestore/evaluationstatistics/ExtensibleEvaluationStatistics.java b/core/sail/extensible-store/src/main/java/org/eclipse/rdf4j/sail/extensiblestore/evaluationstatistics/ExtensibleEvaluationStatistics.java new file mode 100644 index 00000000000..b45a5f8ba81 --- /dev/null +++ b/core/sail/extensible-store/src/main/java/org/eclipse/rdf4j/sail/extensiblestore/evaluationstatistics/ExtensibleEvaluationStatistics.java @@ -0,0 +1,26 @@ +/******************************************************************************* + * Copyright (c) 2020 Eclipse RDF4J contributors. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Distribution License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ +package org.eclipse.rdf4j.sail.extensiblestore.evaluationstatistics; + +import org.eclipse.rdf4j.common.annotation.Experimental; +import org.eclipse.rdf4j.query.algebra.evaluation.impl.EvaluationStatistics; +import org.eclipse.rdf4j.sail.extensiblestore.ExtensibleSailStore; + +@Experimental +public abstract class ExtensibleEvaluationStatistics extends EvaluationStatistics { + + final ExtensibleSailStore extensibleSailStore; + + public ExtensibleEvaluationStatistics(ExtensibleSailStore extensibleSailStore) { + this.extensibleSailStore = extensibleSailStore; + } + + @Override + abstract protected CardinalityCalculator createCardinalityCalculator(); + +} diff --git a/core/sail/extensible-store/src/main/java/org/eclipse/rdf4j/sail/extensiblestore/valuefactory/ExtensibleContextStatement.java b/core/sail/extensible-store/src/main/java/org/eclipse/rdf4j/sail/extensiblestore/valuefactory/ExtensibleContextStatement.java new file mode 100644 index 00000000000..9cfea507400 --- /dev/null +++ b/core/sail/extensible-store/src/main/java/org/eclipse/rdf4j/sail/extensiblestore/valuefactory/ExtensibleContextStatement.java @@ -0,0 +1,59 @@ +/******************************************************************************* + * Copyright (c) 2020 Eclipse RDF4J contributors. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Distribution License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ +package org.eclipse.rdf4j.sail.extensiblestore.valuefactory; + +import java.util.Objects; + +import org.eclipse.rdf4j.model.IRI; +import org.eclipse.rdf4j.model.Resource; +import org.eclipse.rdf4j.model.Value; +import org.eclipse.rdf4j.model.impl.ContextStatement; + +public class ExtensibleContextStatement extends ContextStatement implements ExtensibleStatement { + final boolean inferred; + + /** + * Creates a new Statement with the supplied subject, predicate and object for the specified associated context. + * + * @param subject The statement's subject, must not be null. + * @param predicate The statement's predicate, must not be null. + * @param object The statement's object, must not be null. + * @param context The statement's context, null to indicate no context is associated. + */ + public ExtensibleContextStatement(Resource subject, IRI predicate, Value object, Resource context, + boolean inferred) { + super(subject, predicate, object, context); + this.inferred = inferred; + } + + @Override + public boolean isInferred() { + return inferred; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (!(o instanceof ExtensibleContextStatement)) { + return false; + } + if (!super.equals(o)) { + return false; + } + ExtensibleContextStatement that = (ExtensibleContextStatement) o; + return inferred == that.inferred; + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), inferred); + } + +} diff --git a/core/sail/extensible-store/src/main/java/org/eclipse/rdf4j/sail/extensiblestore/valuefactory/ExtensibleStatement.java b/core/sail/extensible-store/src/main/java/org/eclipse/rdf4j/sail/extensiblestore/valuefactory/ExtensibleStatement.java new file mode 100644 index 00000000000..215ffdc5202 --- /dev/null +++ b/core/sail/extensible-store/src/main/java/org/eclipse/rdf4j/sail/extensiblestore/valuefactory/ExtensibleStatement.java @@ -0,0 +1,16 @@ +/******************************************************************************* + * Copyright (c) 2020 Eclipse RDF4J contributors. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Distribution License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ +package org.eclipse.rdf4j.sail.extensiblestore.valuefactory; + +import org.eclipse.rdf4j.model.Statement; + +public interface ExtensibleStatement extends Statement { + + boolean isInferred(); + +} diff --git a/core/sail/extensible-store/src/main/java/org/eclipse/rdf4j/sail/extensiblestore/valuefactory/ExtensibleStatementHelper.java b/core/sail/extensible-store/src/main/java/org/eclipse/rdf4j/sail/extensiblestore/valuefactory/ExtensibleStatementHelper.java new file mode 100644 index 00000000000..2fccad1b067 --- /dev/null +++ b/core/sail/extensible-store/src/main/java/org/eclipse/rdf4j/sail/extensiblestore/valuefactory/ExtensibleStatementHelper.java @@ -0,0 +1,42 @@ +/******************************************************************************* + * Copyright (c) 2020 Eclipse RDF4J contributors. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Distribution License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ +package org.eclipse.rdf4j.sail.extensiblestore.valuefactory; + +import org.eclipse.rdf4j.model.Statement; + +public interface ExtensibleStatementHelper { + + DefaultExtensibleStatementHelper defaultExtensibleStatementHelper = new DefaultExtensibleStatementHelper(); + + static ExtensibleStatementHelper getDefaultImpl() { + return defaultExtensibleStatementHelper; + } + + ExtensibleStatement fromStatement(Statement statement, boolean inferred); + + static class DefaultExtensibleStatementHelper implements ExtensibleStatementHelper { + + @Override + public ExtensibleStatement fromStatement(Statement statement, boolean inferred) { + if (statement instanceof ExtensibleStatement + && ((ExtensibleStatement) statement).isInferred() == inferred) { + return (ExtensibleStatement) statement; + } + + if (statement.getContext() != null) { + return new ExtensibleContextStatement(statement.getSubject(), statement.getPredicate(), + statement.getObject(), statement.getContext(), inferred); + } + + return new ExtensibleStatementImpl(statement.getSubject(), statement.getPredicate(), statement.getObject(), + inferred); + + } + } + +} diff --git a/core/sail/extensible-store/src/main/java/org/eclipse/rdf4j/sail/extensiblestore/valuefactory/ExtensibleStatementImpl.java b/core/sail/extensible-store/src/main/java/org/eclipse/rdf4j/sail/extensiblestore/valuefactory/ExtensibleStatementImpl.java new file mode 100644 index 00000000000..eace805a76a --- /dev/null +++ b/core/sail/extensible-store/src/main/java/org/eclipse/rdf4j/sail/extensiblestore/valuefactory/ExtensibleStatementImpl.java @@ -0,0 +1,64 @@ +/******************************************************************************* + * Copyright (c) 2020 Eclipse RDF4J contributors. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Distribution License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ +package org.eclipse.rdf4j.sail.extensiblestore.valuefactory; + +import java.util.Objects; + +import org.eclipse.rdf4j.model.IRI; +import org.eclipse.rdf4j.model.Resource; +import org.eclipse.rdf4j.model.Value; +import org.eclipse.rdf4j.model.ValueFactory; +import org.eclipse.rdf4j.model.impl.SimpleStatement; +import org.eclipse.rdf4j.model.impl.SimpleValueFactory; + +public class ExtensibleStatementImpl extends SimpleStatement implements ExtensibleStatement { + + private final boolean inferred; + + /** + * Creates a new Statement with the supplied subject, predicate and object. * + *

    + * Note that creating SimpleStatement objects directly via this constructor is not the recommended approach. + * Instead, use a {@link ValueFactory ValueFactory} (obtained from your repository or by using + * {@link SimpleValueFactory#getInstance()}) to create new Statement objects. + * + * @param subject The statement's subject, must not be null. + * @param predicate The statement's predicate, must not be null. + * @param object The statement's object, must not be null. + * @see SimpleValueFactory#createStatement(Resource, IRI, Value) + */ + public ExtensibleStatementImpl(Resource subject, IRI predicate, Value object, boolean inferred) { + super(subject, predicate, object); + this.inferred = inferred; + } + + @Override + public boolean isInferred() { + return inferred; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (!(o instanceof ExtensibleStatementImpl)) { + return false; + } + if (!super.equals(o)) { + return false; + } + ExtensibleStatementImpl that = (ExtensibleStatementImpl) o; + return inferred == that.inferred; + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), inferred); + } +} diff --git a/core/sail/extensible-store/src/test/java/org/eclipse/rdf4j/sail/extensiblestoreimpl/ExtensibleStoreConnectionImplForTests.java b/core/sail/extensible-store/src/test/java/org/eclipse/rdf4j/sail/extensiblestore/ExtensibleStoreConnectionImplForTests.java similarity index 84% rename from core/sail/extensible-store/src/test/java/org/eclipse/rdf4j/sail/extensiblestoreimpl/ExtensibleStoreConnectionImplForTests.java rename to core/sail/extensible-store/src/test/java/org/eclipse/rdf4j/sail/extensiblestore/ExtensibleStoreConnectionImplForTests.java index 89b7d20f345..af96676018c 100644 --- a/core/sail/extensible-store/src/test/java/org/eclipse/rdf4j/sail/extensiblestoreimpl/ExtensibleStoreConnectionImplForTests.java +++ b/core/sail/extensible-store/src/test/java/org/eclipse/rdf4j/sail/extensiblestore/ExtensibleStoreConnectionImplForTests.java @@ -5,9 +5,7 @@ * which accompanies this distribution, and is available at * http://www.eclipse.org/org/documents/edl-v10.php. *******************************************************************************/ -package org.eclipse.rdf4j.sail.extensiblestoreimpl; - -import org.eclipse.rdf4j.sail.extensiblestore.ExtensibleStoreConnection; +package org.eclipse.rdf4j.sail.extensiblestore; public class ExtensibleStoreConnectionImplForTests extends ExtensibleStoreConnection { protected ExtensibleStoreConnectionImplForTests(ExtensibleStoreImplForTests sail) { diff --git a/core/sail/extensible-store/src/test/java/org/eclipse/rdf4j/sail/extensiblestoreimpl/ExtensibleStoreImplForTests.java b/core/sail/extensible-store/src/test/java/org/eclipse/rdf4j/sail/extensiblestore/ExtensibleStoreImplForTests.java similarity index 82% rename from core/sail/extensible-store/src/test/java/org/eclipse/rdf4j/sail/extensiblestoreimpl/ExtensibleStoreImplForTests.java rename to core/sail/extensible-store/src/test/java/org/eclipse/rdf4j/sail/extensiblestore/ExtensibleStoreImplForTests.java index 9e25bbfe9c0..b35fb108602 100644 --- a/core/sail/extensible-store/src/test/java/org/eclipse/rdf4j/sail/extensiblestoreimpl/ExtensibleStoreImplForTests.java +++ b/core/sail/extensible-store/src/test/java/org/eclipse/rdf4j/sail/extensiblestore/ExtensibleStoreImplForTests.java @@ -5,12 +5,11 @@ * which accompanies this distribution, and is available at * http://www.eclipse.org/org/documents/edl-v10.php. *******************************************************************************/ -package org.eclipse.rdf4j.sail.extensiblestoreimpl; +package org.eclipse.rdf4j.sail.extensiblestore; +import org.eclipse.rdf4j.query.algebra.evaluation.impl.EvaluationStatistics; import org.eclipse.rdf4j.sail.NotifyingSailConnection; import org.eclipse.rdf4j.sail.SailException; -import org.eclipse.rdf4j.sail.extensiblestore.ExtensibleStore; -import org.eclipse.rdf4j.sail.extensiblestore.SimpleMemoryNamespaceStore; public class ExtensibleStoreImplForTests extends ExtensibleStore { @@ -22,7 +21,6 @@ public ExtensibleStoreImplForTests() { protected synchronized void initializeInternal() throws SailException { namespaceStore = new SimpleMemoryNamespaceStore(); dataStructure = new NaiveHashSetDataStructure(); - dataStructureInferred = new NaiveHashSetDataStructure(); super.initializeInternal(); } @@ -36,4 +34,7 @@ public boolean isWritable() throws SailException { return true; } + public EvaluationStatistics getEvalStats() { + return sailStore.getEvaluationStatistics(); + } } diff --git a/core/sail/extensible-store/src/test/java/org/eclipse/rdf4j/sail/extensiblestoreimpl/NaiveHashSetDataStructure.java b/core/sail/extensible-store/src/test/java/org/eclipse/rdf4j/sail/extensiblestore/NaiveHashSetDataStructure.java similarity index 53% rename from core/sail/extensible-store/src/test/java/org/eclipse/rdf4j/sail/extensiblestoreimpl/NaiveHashSetDataStructure.java rename to core/sail/extensible-store/src/test/java/org/eclipse/rdf4j/sail/extensiblestore/NaiveHashSetDataStructure.java index 0901758add3..ca4f91b9d14 100644 --- a/core/sail/extensible-store/src/test/java/org/eclipse/rdf4j/sail/extensiblestoreimpl/NaiveHashSetDataStructure.java +++ b/core/sail/extensible-store/src/test/java/org/eclipse/rdf4j/sail/extensiblestore/NaiveHashSetDataStructure.java @@ -5,51 +5,41 @@ * which accompanies this distribution, and is available at * http://www.eclipse.org/org/documents/edl-v10.php. *******************************************************************************/ -package org.eclipse.rdf4j.sail.extensiblestoreimpl; +package org.eclipse.rdf4j.sail.extensiblestore; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.Iterator; -import java.util.List; import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; import org.eclipse.rdf4j.common.iteration.CloseableIteration; -import org.eclipse.rdf4j.common.iteration.IterationWrapper; import org.eclipse.rdf4j.common.iteration.IteratorIteration; -import org.eclipse.rdf4j.common.iteration.LookAheadIteration; import org.eclipse.rdf4j.model.IRI; import org.eclipse.rdf4j.model.Resource; -import org.eclipse.rdf4j.model.Statement; import org.eclipse.rdf4j.model.Value; -import org.eclipse.rdf4j.repository.sail.SailRepositoryConnection; -import org.eclipse.rdf4j.sail.Sail; import org.eclipse.rdf4j.sail.SailException; -import org.eclipse.rdf4j.sail.extensiblestore.DataStructureInterface; -import org.eclipse.rdf4j.sail.extensiblestore.FilteringIteration; +import org.eclipse.rdf4j.sail.extensiblestore.valuefactory.ExtensibleStatement; public class NaiveHashSetDataStructure implements DataStructureInterface { - Set statements = new HashSet<>(); + Set statements = ConcurrentHashMap.newKeySet(); @Override - synchronized public void addStatement(Statement statement) { + synchronized public void addStatement(ExtensibleStatement statement) { statements.add(statement); } @Override - synchronized public void removeStatement(Statement statement) { + synchronized public void removeStatement(ExtensibleStatement statement) { statements.remove(statement); } @Override - synchronized public CloseableIteration getStatements(Resource subject, + synchronized public CloseableIteration getStatements(Resource subject, IRI predicate, - Value object, Resource... context) { + Value object, boolean inferred, Resource... context) { return new FilteringIteration<>( - new IteratorIteration(new ArrayList<>(statements).iterator()), subject, - predicate, object, context); + new IteratorIteration<>(statements.iterator()), subject, predicate, object, inferred, context); } @Override @@ -66,4 +56,9 @@ public void init() { public void flushForCommit() { } + + @Override + public long getEstimatedSize() { + return statements.size(); + } } diff --git a/core/sail/extensible-store/src/test/java/org/eclipse/rdf4j/sail/extensiblestoreimpl/TransactionIsolationAndWalTests.java b/core/sail/extensible-store/src/test/java/org/eclipse/rdf4j/sail/extensiblestore/TransactionIsolationAndWalTests.java similarity index 93% rename from core/sail/extensible-store/src/test/java/org/eclipse/rdf4j/sail/extensiblestoreimpl/TransactionIsolationAndWalTests.java rename to core/sail/extensible-store/src/test/java/org/eclipse/rdf4j/sail/extensiblestore/TransactionIsolationAndWalTests.java index 4e48feb99dd..6143f8799fc 100644 --- a/core/sail/extensible-store/src/test/java/org/eclipse/rdf4j/sail/extensiblestoreimpl/TransactionIsolationAndWalTests.java +++ b/core/sail/extensible-store/src/test/java/org/eclipse/rdf4j/sail/extensiblestore/TransactionIsolationAndWalTests.java @@ -5,7 +5,7 @@ * which accompanies this distribution, and is available at * http://www.eclipse.org/org/documents/edl-v10.php. *******************************************************************************/ -package org.eclipse.rdf4j.sail.extensiblestoreimpl; +package org.eclipse.rdf4j.sail.extensiblestore; import org.junit.Test; import org.slf4j.Logger; diff --git a/core/sail/extensible-store/src/test/java/org/eclipse/rdf4j/sail/extensiblestore/benchmark/ExtensibleDynamicEvaluationStatisticsBenchmark.java b/core/sail/extensible-store/src/test/java/org/eclipse/rdf4j/sail/extensiblestore/benchmark/ExtensibleDynamicEvaluationStatisticsBenchmark.java new file mode 100644 index 00000000000..ab0df8726d0 --- /dev/null +++ b/core/sail/extensible-store/src/test/java/org/eclipse/rdf4j/sail/extensiblestore/benchmark/ExtensibleDynamicEvaluationStatisticsBenchmark.java @@ -0,0 +1,89 @@ +/******************************************************************************* + * Copyright (c) 2020 Eclipse RDF4J contributors. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Distribution License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ + +package org.eclipse.rdf4j.sail.extensiblestore.benchmark; + +import java.io.IOException; +import java.io.InputStream; +import java.util.concurrent.TimeUnit; + +import org.eclipse.rdf4j.model.Model; +import org.eclipse.rdf4j.rio.RDFFormat; +import org.eclipse.rdf4j.rio.Rio; +import org.eclipse.rdf4j.sail.extensiblestore.evaluationstatistics.ExtensibleDynamicEvaluationStatistics; +import org.eclipse.rdf4j.sail.extensiblestore.valuefactory.ExtensibleStatementHelper; +import org.openjdk.jmh.annotations.Benchmark; +import org.openjdk.jmh.annotations.BenchmarkMode; +import org.openjdk.jmh.annotations.Fork; +import org.openjdk.jmh.annotations.Level; +import org.openjdk.jmh.annotations.Measurement; +import org.openjdk.jmh.annotations.Mode; +import org.openjdk.jmh.annotations.OutputTimeUnit; +import org.openjdk.jmh.annotations.Scope; +import org.openjdk.jmh.annotations.Setup; +import org.openjdk.jmh.annotations.State; +import org.openjdk.jmh.annotations.Warmup; + +/** + * @author HÃ¥vard Ottestad + */ +@State(Scope.Benchmark) +@Warmup(iterations = 20) +@BenchmarkMode({ Mode.AverageTime }) +@Fork(value = 1, jvmArgs = { "-Xms64M", "-Xmx64M" }) +//@Fork(value = 1, jvmArgs = {"-Xms8G", "-Xmx8G", "-Xmn4G", "-XX:+UseSerialGC", "-XX:+UnlockCommercialFeatures", "-XX:StartFlightRecording=delay=60s,duration=120s,filename=recording.jfr,settings=profile", "-XX:FlightRecorderOptions=samplethreads=true,stackdepth=1024", "-XX:+UnlockDiagnosticVMOptions", "-XX:+DebugNonSafepoints"}) +@Measurement(iterations = 10) +@OutputTimeUnit(TimeUnit.MILLISECONDS) +public class ExtensibleDynamicEvaluationStatisticsBenchmark { + + Model parse; + + @Setup(Level.Iteration) + public void beforeClassIteration() throws IOException, InterruptedException { + + System.gc(); + Thread.sleep(100); + System.gc(); + Thread.sleep(100); + + } + + @Setup(Level.Trial) + public void beforeClass() throws IOException, InterruptedException { + + parse = Rio.parse(getResourceAsStream("bsbm-100.ttl"), "", RDFFormat.TURTLE); + System.gc(); + + } + + private static InputStream getResourceAsStream(String name) { + return ExtensibleDynamicEvaluationStatisticsBenchmark.class.getClassLoader().getResourceAsStream(name); + } + + @Benchmark + public ExtensibleDynamicEvaluationStatistics addStatements() throws IOException, InterruptedException { + ExtensibleDynamicEvaluationStatistics extensibleDynamicEvaluationStatistics = new ExtensibleDynamicEvaluationStatistics( + null); + + parse.forEach(s -> extensibleDynamicEvaluationStatistics + .add(ExtensibleStatementHelper.getDefaultImpl().fromStatement(s, false))); + + extensibleDynamicEvaluationStatistics.waitForQueue(); + + return extensibleDynamicEvaluationStatistics; + } + + @Benchmark + public ExtensibleDynamicEvaluationStatistics instantiate() throws IOException { + ExtensibleDynamicEvaluationStatistics extensibleDynamicEvaluationStatistics = new ExtensibleDynamicEvaluationStatistics( + null); + + return extensibleDynamicEvaluationStatistics; + } + +} diff --git a/core/sail/extensible-store/src/test/java/org/eclipse/rdf4j/sail/extensiblestore/benchmark/ExtensibleDynamicEvaluationStatisticsLowMemBenchmark.java b/core/sail/extensible-store/src/test/java/org/eclipse/rdf4j/sail/extensiblestore/benchmark/ExtensibleDynamicEvaluationStatisticsLowMemBenchmark.java new file mode 100644 index 00000000000..fbfdb46f288 --- /dev/null +++ b/core/sail/extensible-store/src/test/java/org/eclipse/rdf4j/sail/extensiblestore/benchmark/ExtensibleDynamicEvaluationStatisticsLowMemBenchmark.java @@ -0,0 +1,101 @@ +/******************************************************************************* + * Copyright (c) 2019 Eclipse RDF4J contributors. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Distribution License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ + +package org.eclipse.rdf4j.sail.extensiblestore.benchmark; + +import java.io.IOException; +import java.io.InputStream; +import java.util.concurrent.TimeUnit; + +import org.eclipse.rdf4j.model.Statement; +import org.eclipse.rdf4j.rio.RDFFormat; +import org.eclipse.rdf4j.rio.RDFHandler; +import org.eclipse.rdf4j.rio.RDFHandlerException; +import org.eclipse.rdf4j.rio.RDFParser; +import org.eclipse.rdf4j.rio.Rio; +import org.eclipse.rdf4j.sail.extensiblestore.evaluationstatistics.ExtensibleDynamicEvaluationStatistics; +import org.eclipse.rdf4j.sail.extensiblestore.valuefactory.ExtensibleStatementHelper; +import org.openjdk.jmh.annotations.Benchmark; +import org.openjdk.jmh.annotations.BenchmarkMode; +import org.openjdk.jmh.annotations.Fork; +import org.openjdk.jmh.annotations.Level; +import org.openjdk.jmh.annotations.Measurement; +import org.openjdk.jmh.annotations.Mode; +import org.openjdk.jmh.annotations.OutputTimeUnit; +import org.openjdk.jmh.annotations.Scope; +import org.openjdk.jmh.annotations.Setup; +import org.openjdk.jmh.annotations.State; +import org.openjdk.jmh.annotations.Warmup; + +/** + * @author HÃ¥vard Ottestad + */ +@State(Scope.Benchmark) +@Warmup(iterations = 20) +@BenchmarkMode({ Mode.AverageTime }) +@Fork(value = 1, jvmArgs = { "-Xms16M", "-Xmx16M" }) +//@Fork(value = 1, jvmArgs = {"-Xms8G", "-Xmx8G", "-Xmn4G", "-XX:+UseSerialGC", "-XX:+UnlockCommercialFeatures", "-XX:StartFlightRecording=delay=60s,duration=120s,filename=recording.jfr,settings=profile", "-XX:FlightRecorderOptions=samplethreads=true,stackdepth=1024", "-XX:+UnlockDiagnosticVMOptions", "-XX:+DebugNonSafepoints"}) +@Measurement(iterations = 10) +@OutputTimeUnit(TimeUnit.MILLISECONDS) +public class ExtensibleDynamicEvaluationStatisticsLowMemBenchmark { + + @Setup(Level.Iteration) + public void beforeClassIteration() throws IOException, InterruptedException { + + System.gc(); + Thread.sleep(100); + System.gc(); + Thread.sleep(100); + + } + + private static InputStream getResourceAsStream(String name) { + return ExtensibleDynamicEvaluationStatisticsLowMemBenchmark.class.getClassLoader().getResourceAsStream(name); + } + + @Benchmark + public ExtensibleDynamicEvaluationStatistics addStatements() throws IOException, InterruptedException { + ExtensibleDynamicEvaluationStatistics extensibleDynamicEvaluationStatistics = new ExtensibleDynamicEvaluationStatistics( + null); + + RDFParser parser = Rio.createParser(RDFFormat.TURTLE); + parser.setRDFHandler(new RDFHandler() { + @Override + public void startRDF() throws RDFHandlerException { + + } + + @Override + public void endRDF() throws RDFHandlerException { + + } + + @Override + public void handleNamespace(String prefix, String uri) throws RDFHandlerException { + + } + + @Override + public void handleStatement(Statement st) throws RDFHandlerException { + extensibleDynamicEvaluationStatistics + .add(ExtensibleStatementHelper.getDefaultImpl().fromStatement(st, false)); + } + + @Override + public void handleComment(String comment) throws RDFHandlerException { + + } + }); + + parser.parse(getResourceAsStream("bsbm-100.ttl"), ""); + + extensibleDynamicEvaluationStatistics.waitForQueue(); + return extensibleDynamicEvaluationStatistics; + } + +} diff --git a/core/sail/extensible-store/src/test/java/org/eclipse/rdf4j/sail/extensiblestoreimpl/compliance/ExtensibleGraphQueryResultTest.java b/core/sail/extensible-store/src/test/java/org/eclipse/rdf4j/sail/extensiblestore/compliance/ExtensibleGraphQueryResultTest.java similarity index 85% rename from core/sail/extensible-store/src/test/java/org/eclipse/rdf4j/sail/extensiblestoreimpl/compliance/ExtensibleGraphQueryResultTest.java rename to core/sail/extensible-store/src/test/java/org/eclipse/rdf4j/sail/extensiblestore/compliance/ExtensibleGraphQueryResultTest.java index 5dec149cfaf..9b9513a6df7 100644 --- a/core/sail/extensible-store/src/test/java/org/eclipse/rdf4j/sail/extensiblestoreimpl/compliance/ExtensibleGraphQueryResultTest.java +++ b/core/sail/extensible-store/src/test/java/org/eclipse/rdf4j/sail/extensiblestore/compliance/ExtensibleGraphQueryResultTest.java @@ -5,12 +5,12 @@ * which accompanies this distribution, and is available at * http://www.eclipse.org/org/documents/edl-v10.php. *******************************************************************************/ -package org.eclipse.rdf4j.sail.extensiblestoreimpl.compliance; +package org.eclipse.rdf4j.sail.extensiblestore.compliance; import org.eclipse.rdf4j.repository.GraphQueryResultTest; import org.eclipse.rdf4j.repository.Repository; import org.eclipse.rdf4j.repository.sail.SailRepository; -import org.eclipse.rdf4j.sail.extensiblestoreimpl.ExtensibleStoreImplForTests; +import org.eclipse.rdf4j.sail.extensiblestore.ExtensibleStoreImplForTests; public class ExtensibleGraphQueryResultTest extends GraphQueryResultTest { diff --git a/core/sail/extensible-store/src/test/java/org/eclipse/rdf4j/sail/extensiblestoreimpl/compliance/ExtensibleStoreConcurrencyTest.java b/core/sail/extensible-store/src/test/java/org/eclipse/rdf4j/sail/extensiblestore/compliance/ExtensibleStoreConcurrencyTest.java similarity index 85% rename from core/sail/extensible-store/src/test/java/org/eclipse/rdf4j/sail/extensiblestoreimpl/compliance/ExtensibleStoreConcurrencyTest.java rename to core/sail/extensible-store/src/test/java/org/eclipse/rdf4j/sail/extensiblestore/compliance/ExtensibleStoreConcurrencyTest.java index dd804ffe181..610dd663f5c 100644 --- a/core/sail/extensible-store/src/test/java/org/eclipse/rdf4j/sail/extensiblestoreimpl/compliance/ExtensibleStoreConcurrencyTest.java +++ b/core/sail/extensible-store/src/test/java/org/eclipse/rdf4j/sail/extensiblestore/compliance/ExtensibleStoreConcurrencyTest.java @@ -5,12 +5,12 @@ * which accompanies this distribution, and is available at * http://www.eclipse.org/org/documents/edl-v10.php. *******************************************************************************/ -package org.eclipse.rdf4j.sail.extensiblestoreimpl.compliance; +package org.eclipse.rdf4j.sail.extensiblestore.compliance; import org.eclipse.rdf4j.sail.NotifyingSail; import org.eclipse.rdf4j.sail.SailConcurrencyTest; import org.eclipse.rdf4j.sail.SailException; -import org.eclipse.rdf4j.sail.extensiblestoreimpl.ExtensibleStoreImplForTests; +import org.eclipse.rdf4j.sail.extensiblestore.ExtensibleStoreImplForTests; public class ExtensibleStoreConcurrencyTest extends SailConcurrencyTest { diff --git a/core/sail/extensible-store/src/test/java/org/eclipse/rdf4j/sail/extensiblestoreimpl/compliance/ExtensibleStoreConnectionTest.java b/core/sail/extensible-store/src/test/java/org/eclipse/rdf4j/sail/extensiblestore/compliance/ExtensibleStoreConnectionTest.java similarity index 90% rename from core/sail/extensible-store/src/test/java/org/eclipse/rdf4j/sail/extensiblestoreimpl/compliance/ExtensibleStoreConnectionTest.java rename to core/sail/extensible-store/src/test/java/org/eclipse/rdf4j/sail/extensiblestore/compliance/ExtensibleStoreConnectionTest.java index 4ce4accc9ef..e026b4ea106 100644 --- a/core/sail/extensible-store/src/test/java/org/eclipse/rdf4j/sail/extensiblestoreimpl/compliance/ExtensibleStoreConnectionTest.java +++ b/core/sail/extensible-store/src/test/java/org/eclipse/rdf4j/sail/extensiblestore/compliance/ExtensibleStoreConnectionTest.java @@ -5,14 +5,14 @@ * which accompanies this distribution, and is available at * http://www.eclipse.org/org/documents/edl-v10.php. *******************************************************************************/ -package org.eclipse.rdf4j.sail.extensiblestoreimpl.compliance; +package org.eclipse.rdf4j.sail.extensiblestore.compliance; import org.eclipse.rdf4j.IsolationLevel; import org.eclipse.rdf4j.IsolationLevels; import org.eclipse.rdf4j.repository.Repository; import org.eclipse.rdf4j.repository.RepositoryConnectionTest; import org.eclipse.rdf4j.repository.sail.SailRepository; -import org.eclipse.rdf4j.sail.extensiblestoreimpl.ExtensibleStoreImplForTests; +import org.eclipse.rdf4j.sail.extensiblestore.ExtensibleStoreImplForTests; import org.junit.runners.Parameterized; public class ExtensibleStoreConnectionTest extends RepositoryConnectionTest { diff --git a/core/sail/extensible-store/src/test/java/org/eclipse/rdf4j/sail/extensiblestoreimpl/compliance/ExtensibleStoreContextTest.java b/core/sail/extensible-store/src/test/java/org/eclipse/rdf4j/sail/extensiblestore/compliance/ExtensibleStoreContextTest.java similarity index 85% rename from core/sail/extensible-store/src/test/java/org/eclipse/rdf4j/sail/extensiblestoreimpl/compliance/ExtensibleStoreContextTest.java rename to core/sail/extensible-store/src/test/java/org/eclipse/rdf4j/sail/extensiblestore/compliance/ExtensibleStoreContextTest.java index 2bcde2098c7..e6d7240c6ed 100644 --- a/core/sail/extensible-store/src/test/java/org/eclipse/rdf4j/sail/extensiblestoreimpl/compliance/ExtensibleStoreContextTest.java +++ b/core/sail/extensible-store/src/test/java/org/eclipse/rdf4j/sail/extensiblestore/compliance/ExtensibleStoreContextTest.java @@ -5,12 +5,12 @@ * which accompanies this distribution, and is available at * http://www.eclipse.org/org/documents/edl-v10.php. *******************************************************************************/ -package org.eclipse.rdf4j.sail.extensiblestoreimpl.compliance; +package org.eclipse.rdf4j.sail.extensiblestore.compliance; import org.eclipse.rdf4j.sail.NotifyingSail; import org.eclipse.rdf4j.sail.RDFNotifyingStoreTest; import org.eclipse.rdf4j.sail.SailException; -import org.eclipse.rdf4j.sail.extensiblestoreimpl.ExtensibleStoreImplForTests; +import org.eclipse.rdf4j.sail.extensiblestore.ExtensibleStoreImplForTests; public class ExtensibleStoreContextTest extends RDFNotifyingStoreTest { diff --git a/core/sail/extensible-store/src/test/java/org/eclipse/rdf4j/sail/extensiblestoreimpl/compliance/ExtensibleStoreInterruptTest.java b/core/sail/extensible-store/src/test/java/org/eclipse/rdf4j/sail/extensiblestore/compliance/ExtensibleStoreInterruptTest.java similarity index 85% rename from core/sail/extensible-store/src/test/java/org/eclipse/rdf4j/sail/extensiblestoreimpl/compliance/ExtensibleStoreInterruptTest.java rename to core/sail/extensible-store/src/test/java/org/eclipse/rdf4j/sail/extensiblestore/compliance/ExtensibleStoreInterruptTest.java index c0fcd9e3b63..ea8c39a9e32 100644 --- a/core/sail/extensible-store/src/test/java/org/eclipse/rdf4j/sail/extensiblestoreimpl/compliance/ExtensibleStoreInterruptTest.java +++ b/core/sail/extensible-store/src/test/java/org/eclipse/rdf4j/sail/extensiblestore/compliance/ExtensibleStoreInterruptTest.java @@ -5,12 +5,12 @@ * which accompanies this distribution, and is available at * http://www.eclipse.org/org/documents/edl-v10.php. *******************************************************************************/ -package org.eclipse.rdf4j.sail.extensiblestoreimpl.compliance; +package org.eclipse.rdf4j.sail.extensiblestore.compliance; import org.eclipse.rdf4j.sail.NotifyingSail; import org.eclipse.rdf4j.sail.SailException; import org.eclipse.rdf4j.sail.SailInterruptTest; -import org.eclipse.rdf4j.sail.extensiblestoreimpl.ExtensibleStoreImplForTests; +import org.eclipse.rdf4j.sail.extensiblestore.ExtensibleStoreImplForTests; public class ExtensibleStoreInterruptTest extends SailInterruptTest { @Override diff --git a/core/sail/extensible-store/src/test/java/org/eclipse/rdf4j/sail/extensiblestoreimpl/compliance/ExtensibleStoreIsolationLevelTest.java b/core/sail/extensible-store/src/test/java/org/eclipse/rdf4j/sail/extensiblestore/compliance/ExtensibleStoreIsolationLevelTest.java similarity index 85% rename from core/sail/extensible-store/src/test/java/org/eclipse/rdf4j/sail/extensiblestoreimpl/compliance/ExtensibleStoreIsolationLevelTest.java rename to core/sail/extensible-store/src/test/java/org/eclipse/rdf4j/sail/extensiblestore/compliance/ExtensibleStoreIsolationLevelTest.java index 94a4f5d2d7c..ddcfab43277 100644 --- a/core/sail/extensible-store/src/test/java/org/eclipse/rdf4j/sail/extensiblestoreimpl/compliance/ExtensibleStoreIsolationLevelTest.java +++ b/core/sail/extensible-store/src/test/java/org/eclipse/rdf4j/sail/extensiblestore/compliance/ExtensibleStoreIsolationLevelTest.java @@ -5,12 +5,12 @@ * which accompanies this distribution, and is available at * http://www.eclipse.org/org/documents/edl-v10.php. *******************************************************************************/ -package org.eclipse.rdf4j.sail.extensiblestoreimpl.compliance; +package org.eclipse.rdf4j.sail.extensiblestore.compliance; import org.eclipse.rdf4j.sail.NotifyingSail; import org.eclipse.rdf4j.sail.SailException; import org.eclipse.rdf4j.sail.SailIsolationLevelTest; -import org.eclipse.rdf4j.sail.extensiblestoreimpl.ExtensibleStoreImplForTests; +import org.eclipse.rdf4j.sail.extensiblestore.ExtensibleStoreImplForTests; public class ExtensibleStoreIsolationLevelTest extends SailIsolationLevelTest { diff --git a/core/sail/extensible-store/src/test/java/org/eclipse/rdf4j/sail/extensiblestoreimpl/compliance/ExtensibleStoreRepositoryTest.java b/core/sail/extensible-store/src/test/java/org/eclipse/rdf4j/sail/extensiblestore/compliance/ExtensibleStoreRepositoryTest.java similarity index 85% rename from core/sail/extensible-store/src/test/java/org/eclipse/rdf4j/sail/extensiblestoreimpl/compliance/ExtensibleStoreRepositoryTest.java rename to core/sail/extensible-store/src/test/java/org/eclipse/rdf4j/sail/extensiblestore/compliance/ExtensibleStoreRepositoryTest.java index 2e9e94a9d58..7cd89ed6ce9 100644 --- a/core/sail/extensible-store/src/test/java/org/eclipse/rdf4j/sail/extensiblestoreimpl/compliance/ExtensibleStoreRepositoryTest.java +++ b/core/sail/extensible-store/src/test/java/org/eclipse/rdf4j/sail/extensiblestore/compliance/ExtensibleStoreRepositoryTest.java @@ -5,12 +5,12 @@ * which accompanies this distribution, and is available at * http://www.eclipse.org/org/documents/edl-v10.php. *******************************************************************************/ -package org.eclipse.rdf4j.sail.extensiblestoreimpl.compliance; +package org.eclipse.rdf4j.sail.extensiblestore.compliance; import org.eclipse.rdf4j.repository.Repository; import org.eclipse.rdf4j.repository.RepositoryTest; import org.eclipse.rdf4j.repository.sail.SailRepository; -import org.eclipse.rdf4j.sail.extensiblestoreimpl.ExtensibleStoreImplForTests; +import org.eclipse.rdf4j.sail.extensiblestore.ExtensibleStoreImplForTests; public class ExtensibleStoreRepositoryTest extends RepositoryTest { diff --git a/core/sail/extensible-store/src/test/java/org/eclipse/rdf4j/sail/extensiblestoreimpl/compliance/ExtensibleStoreSparqlOrderByTest.java b/core/sail/extensible-store/src/test/java/org/eclipse/rdf4j/sail/extensiblestore/compliance/ExtensibleStoreSparqlOrderByTest.java similarity index 86% rename from core/sail/extensible-store/src/test/java/org/eclipse/rdf4j/sail/extensiblestoreimpl/compliance/ExtensibleStoreSparqlOrderByTest.java rename to core/sail/extensible-store/src/test/java/org/eclipse/rdf4j/sail/extensiblestore/compliance/ExtensibleStoreSparqlOrderByTest.java index 83165ff9d35..56e7e85184b 100644 --- a/core/sail/extensible-store/src/test/java/org/eclipse/rdf4j/sail/extensiblestoreimpl/compliance/ExtensibleStoreSparqlOrderByTest.java +++ b/core/sail/extensible-store/src/test/java/org/eclipse/rdf4j/sail/extensiblestore/compliance/ExtensibleStoreSparqlOrderByTest.java @@ -5,14 +5,14 @@ * which accompanies this distribution, and is available at * http://www.eclipse.org/org/documents/edl-v10.php. *******************************************************************************/ -package org.eclipse.rdf4j.sail.extensiblestoreimpl.compliance; +package org.eclipse.rdf4j.sail.extensiblestore.compliance; import java.io.IOException; import org.eclipse.rdf4j.repository.Repository; import org.eclipse.rdf4j.repository.SparqlOrderByTest; import org.eclipse.rdf4j.repository.sail.SailRepository; -import org.eclipse.rdf4j.sail.extensiblestoreimpl.ExtensibleStoreImplForTests; +import org.eclipse.rdf4j.sail.extensiblestore.ExtensibleStoreImplForTests; public class ExtensibleStoreSparqlOrderByTest extends SparqlOrderByTest { diff --git a/core/sail/extensible-store/src/test/java/org/eclipse/rdf4j/sail/extensiblestoreimpl/compliance/ExtensibleStoreSparqlRegexTest.java b/core/sail/extensible-store/src/test/java/org/eclipse/rdf4j/sail/extensiblestore/compliance/ExtensibleStoreSparqlRegexTest.java similarity index 86% rename from core/sail/extensible-store/src/test/java/org/eclipse/rdf4j/sail/extensiblestoreimpl/compliance/ExtensibleStoreSparqlRegexTest.java rename to core/sail/extensible-store/src/test/java/org/eclipse/rdf4j/sail/extensiblestore/compliance/ExtensibleStoreSparqlRegexTest.java index 74509cb5c60..843382af4e1 100644 --- a/core/sail/extensible-store/src/test/java/org/eclipse/rdf4j/sail/extensiblestoreimpl/compliance/ExtensibleStoreSparqlRegexTest.java +++ b/core/sail/extensible-store/src/test/java/org/eclipse/rdf4j/sail/extensiblestore/compliance/ExtensibleStoreSparqlRegexTest.java @@ -5,14 +5,14 @@ * which accompanies this distribution, and is available at * http://www.eclipse.org/org/documents/edl-v10.php. *******************************************************************************/ -package org.eclipse.rdf4j.sail.extensiblestoreimpl.compliance; +package org.eclipse.rdf4j.sail.extensiblestore.compliance; import java.io.IOException; import org.eclipse.rdf4j.repository.Repository; import org.eclipse.rdf4j.repository.SparqlRegexTest; import org.eclipse.rdf4j.repository.sail.SailRepository; -import org.eclipse.rdf4j.sail.extensiblestoreimpl.ExtensibleStoreImplForTests; +import org.eclipse.rdf4j.sail.extensiblestore.ExtensibleStoreImplForTests; public class ExtensibleStoreSparqlRegexTest extends SparqlRegexTest { diff --git a/core/sail/extensible-store/src/test/java/org/eclipse/rdf4j/sail/extensiblestoreimpl/compliance/ExtensibleStoreTest.java b/core/sail/extensible-store/src/test/java/org/eclipse/rdf4j/sail/extensiblestore/compliance/ExtensibleStoreTest.java similarity index 85% rename from core/sail/extensible-store/src/test/java/org/eclipse/rdf4j/sail/extensiblestoreimpl/compliance/ExtensibleStoreTest.java rename to core/sail/extensible-store/src/test/java/org/eclipse/rdf4j/sail/extensiblestore/compliance/ExtensibleStoreTest.java index 059d300d172..e53c94cfb8e 100644 --- a/core/sail/extensible-store/src/test/java/org/eclipse/rdf4j/sail/extensiblestoreimpl/compliance/ExtensibleStoreTest.java +++ b/core/sail/extensible-store/src/test/java/org/eclipse/rdf4j/sail/extensiblestore/compliance/ExtensibleStoreTest.java @@ -5,12 +5,12 @@ * which accompanies this distribution, and is available at * http://www.eclipse.org/org/documents/edl-v10.php. *******************************************************************************/ -package org.eclipse.rdf4j.sail.extensiblestoreimpl.compliance; +package org.eclipse.rdf4j.sail.extensiblestore.compliance; import org.eclipse.rdf4j.sail.NotifyingSail; import org.eclipse.rdf4j.sail.RDFNotifyingStoreTest; import org.eclipse.rdf4j.sail.SailException; -import org.eclipse.rdf4j.sail.extensiblestoreimpl.ExtensibleStoreImplForTests; +import org.eclipse.rdf4j.sail.extensiblestore.ExtensibleStoreImplForTests; public class ExtensibleStoreTest extends RDFNotifyingStoreTest { diff --git a/core/sail/extensible-store/src/test/java/org/eclipse/rdf4j/sail/extensiblestoreimpl/compliance/ExtensibleStoreTupleQueryResultTest.java b/core/sail/extensible-store/src/test/java/org/eclipse/rdf4j/sail/extensiblestore/compliance/ExtensibleStoreTupleQueryResultTest.java similarity index 86% rename from core/sail/extensible-store/src/test/java/org/eclipse/rdf4j/sail/extensiblestoreimpl/compliance/ExtensibleStoreTupleQueryResultTest.java rename to core/sail/extensible-store/src/test/java/org/eclipse/rdf4j/sail/extensiblestore/compliance/ExtensibleStoreTupleQueryResultTest.java index aa35d06672d..af23f697984 100644 --- a/core/sail/extensible-store/src/test/java/org/eclipse/rdf4j/sail/extensiblestoreimpl/compliance/ExtensibleStoreTupleQueryResultTest.java +++ b/core/sail/extensible-store/src/test/java/org/eclipse/rdf4j/sail/extensiblestore/compliance/ExtensibleStoreTupleQueryResultTest.java @@ -5,14 +5,14 @@ * which accompanies this distribution, and is available at * http://www.eclipse.org/org/documents/edl-v10.php. *******************************************************************************/ -package org.eclipse.rdf4j.sail.extensiblestoreimpl.compliance; +package org.eclipse.rdf4j.sail.extensiblestore.compliance; import java.io.IOException; import org.eclipse.rdf4j.repository.Repository; import org.eclipse.rdf4j.repository.TupleQueryResultTest; import org.eclipse.rdf4j.repository.sail.SailRepository; -import org.eclipse.rdf4j.sail.extensiblestoreimpl.ExtensibleStoreImplForTests; +import org.eclipse.rdf4j.sail.extensiblestore.ExtensibleStoreImplForTests; public class ExtensibleStoreTupleQueryResultTest extends TupleQueryResultTest { diff --git a/core/sail/extensible-store/src/test/java/org/eclipse/rdf4j/sail/extensiblestore/evaluationstatistics/EvaluationStatisticsTest.java b/core/sail/extensible-store/src/test/java/org/eclipse/rdf4j/sail/extensiblestore/evaluationstatistics/EvaluationStatisticsTest.java new file mode 100644 index 00000000000..04cb69d9380 --- /dev/null +++ b/core/sail/extensible-store/src/test/java/org/eclipse/rdf4j/sail/extensiblestore/evaluationstatistics/EvaluationStatisticsTest.java @@ -0,0 +1,192 @@ +/******************************************************************************* + * Copyright (c) 2019 Eclipse RDF4J contributors. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Distribution License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ +package org.eclipse.rdf4j.sail.extensiblestore.evaluationstatistics; + +import static junit.framework.TestCase.assertEquals; + +import java.io.IOException; +import java.io.InputStream; +import java.util.stream.IntStream; + +import org.eclipse.rdf4j.model.IRI; +import org.eclipse.rdf4j.model.Model; +import org.eclipse.rdf4j.model.Resource; +import org.eclipse.rdf4j.model.impl.SimpleValueFactory; +import org.eclipse.rdf4j.model.vocabulary.RDF; +import org.eclipse.rdf4j.model.vocabulary.RDFS; +import org.eclipse.rdf4j.query.algebra.StatementPattern; +import org.eclipse.rdf4j.query.algebra.Var; +import org.eclipse.rdf4j.rio.RDFFormat; +import org.eclipse.rdf4j.rio.Rio; +import org.eclipse.rdf4j.sail.extensiblestore.valuefactory.ExtensibleStatementHelper; +import org.junit.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class EvaluationStatisticsTest { + + private static final Logger logger = LoggerFactory.getLogger(EvaluationStatisticsTest.class); + private static final SimpleValueFactory vf = SimpleValueFactory.getInstance(); + private static final ExtensibleStatementHelper ex = ExtensibleStatementHelper.getDefaultImpl(); + + Model parse; + + { + try { + parse = Rio.parse(getResourceAsStream("bsbm-100.ttl"), "", RDFFormat.TURTLE); + } catch (IOException e) { + e.printStackTrace(); + } + } + + @Test + public void testStaleStats() throws InterruptedException { + + ExtensibleDynamicEvaluationStatistics extensibleDynamicEvaluationStatistics = new ExtensibleDynamicEvaluationStatistics( + null); + + parse.forEach(s -> extensibleDynamicEvaluationStatistics.add(ex.fromStatement(s, false))); + extensibleDynamicEvaluationStatistics.waitForQueue(); + double staleness1 = extensibleDynamicEvaluationStatistics.staleness(parse.size()); + roundedAssert(0, staleness1); + + parse.forEach(s -> extensibleDynamicEvaluationStatistics.remove(ex.fromStatement(s, false))); + extensibleDynamicEvaluationStatistics.waitForQueue(); + double staleness2 = extensibleDynamicEvaluationStatistics.staleness(0); + roundedAssert(0, staleness2); + + IntStream.range(0, 100).forEach(i -> { + extensibleDynamicEvaluationStatistics + .add(ex.fromStatement(vf.createStatement(RDF.TYPE, RDFS.LABEL, vf.createLiteral(i + "a")), false)); + }); + parse.forEach(s -> extensibleDynamicEvaluationStatistics.add(ex.fromStatement(s, false))); + extensibleDynamicEvaluationStatistics.waitForQueue(); + + double staleness3 = extensibleDynamicEvaluationStatistics.staleness(100 + parse.size()); + roundedAssert(1, staleness3); + + IntStream.range(0, 100000).forEach(i -> { + extensibleDynamicEvaluationStatistics + .add(ex.fromStatement(vf.createStatement(RDF.TYPE, RDFS.LABEL, vf.createLiteral(i + "b")), false)); + }); + + extensibleDynamicEvaluationStatistics.waitForQueue(); + + double staleness4 = extensibleDynamicEvaluationStatistics.staleness(100000 + 100 + parse.size()); + + roundedAssert(0.3, staleness4); + + } + + @Test + public void stalenessCalculationTest() throws InterruptedException { + SimpleValueFactory vf = SimpleValueFactory.getInstance(); + + ExtensibleDynamicEvaluationStatistics extensibleDynamicEvaluationStatistics = new ExtensibleDynamicEvaluationStatistics( + null); + + parse.forEach(s -> extensibleDynamicEvaluationStatistics.add(ex.fromStatement(s, false))); + extensibleDynamicEvaluationStatistics.waitForQueue(); + + double staleness1 = extensibleDynamicEvaluationStatistics.staleness(parse.size()); + roundedAssert(0, staleness1); + + double staleness2 = extensibleDynamicEvaluationStatistics.staleness(parse.size() * 3); + roundedAssert(0.7, staleness2); + + double staleness3 = extensibleDynamicEvaluationStatistics.staleness(parse.size() / 3); + roundedAssert(0.7, staleness3); + + } + + @Test + public void testAcurracy() throws InterruptedException { + SimpleValueFactory vf = SimpleValueFactory.getInstance(); + + ExtensibleDynamicEvaluationStatistics extensibleDynamicEvaluationStatistics = new ExtensibleDynamicEvaluationStatistics( + null); + + parse.forEach(s -> extensibleDynamicEvaluationStatistics.add(ex.fromStatement(s, false))); + extensibleDynamicEvaluationStatistics.waitForQueue(); + + ExtensibleDynamicEvaluationStatistics.ExtensibleDynamicEvaluationStatisticsCardinalityCalculator cardinalityCalculator = (ExtensibleDynamicEvaluationStatistics.ExtensibleDynamicEvaluationStatisticsCardinalityCalculator) extensibleDynamicEvaluationStatistics + .createCardinalityCalculator(); + + IRI bdbmProductType = vf.createIRI("http://www4.wiwiss.fu-berlin.de/bizer/bsbm/v01/vocabulary/", "ProductType"); + IRI dataFromProducer1Product31 = vf + .createIRI("http://www4.wiwiss.fu-berlin.de/bizer/bsbm/v01/instances/dataFromProducer1/", "Product31"); + + StatementPattern null_rdfType_bsbmProductType = new StatementPattern( + new Var("a", null), + new Var("b", RDF.TYPE), + new Var("c", bdbmProductType)); + + checkPattern(cardinalityCalculator, null_rdfType_bsbmProductType, 1); + + StatementPattern null_null_null = new StatementPattern( + new Var("a", null), + new Var("b", null), + new Var("c", null)); + + checkPattern(cardinalityCalculator, null_null_null, 1); + + StatementPattern null_rdfType_null = new StatementPattern( + new Var("a", null), + new Var("b", RDF.TYPE), + new Var("c", null)); + + checkPattern(cardinalityCalculator, null_rdfType_null, 1); + + StatementPattern nonExistent = new StatementPattern( + new Var("a", null), + new Var("b", vf.createIRI("http://example.com/fhjerhf2uhfjkdsbf32o")), + new Var("c", null)); + + checkPattern(cardinalityCalculator, nonExistent, 1); + + // this last pattern isn't very accurate, it's actually 46 statements, but the estimate is 100.4 + StatementPattern bsbmProductType_null_null = new StatementPattern( + new Var("a", dataFromProducer1Product31), + new Var("b", null), + new Var("c", null)); + + checkPattern(cardinalityCalculator, bsbmProductType_null_null, 120); + + } + + private void checkPattern( + ExtensibleDynamicEvaluationStatistics.ExtensibleDynamicEvaluationStatisticsCardinalityCalculator cardinalityCalculator, + StatementPattern pattern, int percentage) { + double estimatedCardinality = cardinalityCalculator.getCardinality(pattern); + int actual = parse + .filter((Resource) pattern.getSubjectVar().getValue(), (IRI) pattern.getPredicateVar().getValue(), + pattern.getObjectVar().getValue()) + .size(); + + fuzzyAssert(actual, estimatedCardinality, percentage); + } + + private void fuzzyAssert(int expected, double estimated, int percentage) { + + double diff = Math.abs(expected - estimated); + if (100.0 / expected * diff > percentage) { + assertEquals("Estimated cardinality should be within " + percentage + "% of expected cardinality", expected, + estimated); + } + + } + + private void roundedAssert(double expected, double actual) { + assertEquals(expected, Math.round(actual * 10) / 10.0); + } + + private static InputStream getResourceAsStream(String name) { + return EvaluationStatisticsTest.class.getClassLoader().getResourceAsStream(name); + } + +} diff --git a/core/sail/extensible-store/src/test/resources/bsbm-100.ttl b/core/sail/extensible-store/src/test/resources/bsbm-100.ttl new file mode 100644 index 00000000000..496c043d39f --- /dev/null +++ b/core/sail/extensible-store/src/test/resources/bsbm-100.ttl @@ -0,0 +1,44565 @@ +@prefix rdf: . +@prefix rdfs: . +@prefix foaf: . +@prefix dc: . +@prefix xsd: . +@prefix rev: . +@prefix bsbm: . +@prefix bsbm-inst: . +@prefix dataFromProducer1: . +@prefix dataFromProducer2: . +@prefix dataFromProducer3: . +@prefix dataFromVendor1: . +@prefix dataFromRatingSite1: . + +bsbm-inst:ProductType1 + rdf:type bsbm:ProductType ; + rdfs:label "Thing" ; + rdfs:comment "The Product Type of all Products" ; + dc:publisher ; + dc:date "2000-07-04"^^xsd:date . +bsbm-inst:ProductType2 + rdf:type bsbm:ProductType ; + rdfs:label "amour dupable" ; + rdfs:subClassOf bsbm-inst:ProductType1 ; + rdfs:comment "lengthened galling outposts emulatively looming deplanes stinters forehanded interdisciplinary manoeuvred frankers pederasty heralds disrupts fishnet falsifiable absorbable appreciators undefinable draftable revindicates flashlamp insertion expurgations tarsier" ; + dc:publisher ; + dc:date "2000-06-26"^^xsd:date . +bsbm-inst:ProductType3 + rdf:type bsbm:ProductType ; + rdfs:label "microprocessor mops reigned" ; + rdfs:subClassOf bsbm-inst:ProductType1 ; + rdfs:comment "antecedently nonyielding cocaines milligrams dimorphic shamming clawed hurts enchains jukeboxes mottoes brahminist embrocated quatrefoil harmonize guardants prayerfully adios restring coursing fisticuffs cordlessly augured fumigated academies splotches auctioning timeliness flushest ranching speedily gets nonsymbolic pyorrhea rales headpieces ladrons tightwire playtimes etherizes mistaught screechier casehardening placaters saurian summarization counterfeits skipping" ; + dc:publisher ; + dc:date "2000-07-05"^^xsd:date . +bsbm-inst:ProductType4 + rdf:type bsbm:ProductType ; + rdfs:label "practiced" ; + rdfs:subClassOf bsbm-inst:ProductType1 ; + rdfs:comment "swarmed adjuratory fondled shiksas pourboire chortled distinctiveness fostered unchastened dehumanizes bulleted wieldy reaccession roentgenoscope minorcas nimbly birdhouses outclasses hazels traumatologies glaucomatous sabotages hexone porkier duplicating internee thermodynamically whereinsoever satirizing postformed fatigueless feasance remove unseats sheers stenographers unperceiving shipworms coshers prelim hispaniola impeaches rafting squelchy probationers countless bluejay decontaminator encipherments wading" ; + dc:publisher ; + dc:date "2000-07-14"^^xsd:date . +bsbm-inst:ProductType5 + rdf:type bsbm:ProductType ; + rdfs:label "arteriography" ; + rdfs:subClassOf bsbm-inst:ProductType1 ; + rdfs:comment "hollowness unhealed cityward parring wishing pyromaniacs marbly pions boughed innervate gung inverts demoted comprehended stollen unadjudicated septuagenarians chaptered vocalists bennies unstably moppet cogging ethnics billhooks frenching squeamishly tyres weaseling chancroids pandered amirates relented" ; + dc:publisher ; + dc:date "2000-07-18"^^xsd:date . +bsbm-inst:ProductType6 + rdf:type bsbm:ProductType ; + rdfs:label "huffiest tougheners interfering" ; + rdfs:subClassOf bsbm-inst:ProductType2 ; + rdfs:comment "shucker claviers haggles chorusses nonagons logrolls mathematically intradermal echoed grassier helmeted bristles gonging smidgen flunker atonements bestializes briefness vulgo discounter marooning sheaving neutralizations attains reconsiders glaceed lavers notified malevolently compensations lycanthropies rebroadcasting obliviously sunup arrestee tireless gayer interlinear backlogged encephala chronologist helplessly" ; + dc:publisher ; + dc:date "2000-06-28"^^xsd:date . +bsbm-inst:ProductType7 + rdf:type bsbm:ProductType ; + rdfs:label "papuans womaned" ; + rdfs:subClassOf bsbm-inst:ProductType2 ; + rdfs:comment "teenaged lesbianism unplanted luminously ladyships optimisms protagonists topknots refracts fraternized maoist decimalization steppingstones greens manpowers chipper cognized eggheads abyssinian purblindness chattiest shutters churl nictating reconciliation distrustfulness solstitial rapidity bronzers gadded calicoes sandals geophysicists twaddler mystifier deploring panache" ; + dc:publisher ; + dc:date "2000-07-07"^^xsd:date . +bsbm-inst:ProductType8 + rdf:type bsbm:ProductType ; + rdfs:label "unsalaried" ; + rdfs:subClassOf bsbm-inst:ProductType2 ; + rdfs:comment "crossbars avowedly misguiders trisection duodecimals unhandy lasher clawing annexed incubated unplanted fictionalizes sashed moderner neonatology taloned nominative intramural lounges pissoirs parasiticidal hewers stroker antitoxin fesses virtues carinae summarizes abutters beknighted strutters prepares minimizers remodeled anarchists spiders sensualists lulled bocci seismometer nickered" ; + dc:publisher ; + dc:date "2000-07-22"^^xsd:date . +bsbm-inst:ProductType9 + rdf:type bsbm:ProductType ; + rdfs:label "weapons zeals" ; + rdfs:subClassOf bsbm-inst:ProductType2 ; + rdfs:comment "redeposit stepping aidmen baccarats rearms invasiveness foemen inkstand aircrew bravadoes necking enlivenment discolorations pillaging dispossessed pocketknives upsweeps monosyllables slitted secularized visualizer rescheduled graters sheepish airframes ninepin virulence ramshackle packthreads batiste" ; + dc:publisher ; + dc:date "2000-06-29"^^xsd:date . +bsbm-inst:ProductType10 + rdf:type bsbm:ProductType ; + rdfs:label "sheeny" ; + rdfs:subClassOf bsbm-inst:ProductType3 ; + rdfs:comment "pastured priors ballades tormented towpaths transfused yahweh admonishments insertions afterwards nontemporally scrawlier luxes aphorise tediousness biogeochemistry plutocratic conjurer transnational achoo rehandling bended befogged obstreperously exhaled musks" ; + dc:publisher ; + dc:date "2000-07-13"^^xsd:date . +bsbm-inst:ProductType11 + rdf:type bsbm:ProductType ; + rdfs:label "playacted" ; + rdfs:subClassOf bsbm-inst:ProductType3 ; + rdfs:comment "squeegeed disappointed gabbled misunderstand deriving obituaries eulogist saboteur sward maintops preterit auricled reddened befuddles sidelights reexchanged soothingly conscripts tigrish broguery distributing unconventionalized kvetches fomentation habituation elmy obeisances birdied pseudonymous cabby copulae easels checker exchequers remodifies spatulate upload ceramist kakis infuriation upholsterer plumberies incipiencies" ; + dc:publisher ; + dc:date "2000-06-22"^^xsd:date . +bsbm-inst:ProductType12 + rdf:type bsbm:ProductType ; + rdfs:label "linguini repossession energize" ; + rdfs:subClassOf bsbm-inst:ProductType3 ; + rdfs:comment "superintendence egger sandworms dicotyledonous soliloquizing notcher teraphim meanders marines incandescence contortion pillaring cabmen scholium ensnarer tokyoites chichi conches disheartens tailcoats antecedently whitecomb forewing" ; + dc:publisher ; + dc:date "2000-07-05"^^xsd:date . +bsbm-inst:ProductType13 + rdf:type bsbm:ProductType ; + rdfs:label "chaplets unharmful frizettes" ; + rdfs:subClassOf bsbm-inst:ProductType3 ; + rdfs:comment "wiseliest disunites storables helices eves aims drawler patchiest remigrated indicatives parleys wracking pignorated baboons bassist caramelize definer workup antinucleons chuckfull doozies seismographers stomaching relished wariest botulisms heartsick resided laminates uncouthness ballpoint tabour lipids unsolved chaffier radixes opportunism groins hearthstone gypsied monomials petrographers tints oyes veraciously unshapely" ; + dc:publisher ; + dc:date "2000-07-08"^^xsd:date . +bsbm-inst:ProductType14 + rdf:type bsbm:ProductType ; + rdfs:label "dyspeptics indubitably" ; + rdfs:subClassOf bsbm-inst:ProductType4 ; + rdfs:comment "congruous values tampers pudgier hypothermic tinkered slouches hamstring clef raper deserves tidbits vinculum shopkeeper impresses cannonry discourses outgrowing rebutters haymaker allegorists inkles restorativeness unexcelled quintan vivification ensorceled preclusively respondencies imaginable nabob seductresses chaunters perlites spinally masterpieces credibleness biogeography kisses pepperer gruesomeness intercourse teleport charmed parsers flimsily" ; + dc:publisher ; + dc:date "2000-07-09"^^xsd:date . +bsbm-inst:ProductType15 + rdf:type bsbm:ProductType ; + rdfs:label "redrafted tarting" ; + rdfs:subClassOf bsbm-inst:ProductType4 ; + rdfs:comment "kyat angler sabotages placarded saliently meandered effulgences terminators gendarmerie iguana titteringly laking copepods reactivate hazarded liveliness viscoid incarcerator distress declinable bacchants nontechnical remortgaged prettification bloater criticized teenybopper unhorses viniest swizzler annotatively babu gausses nonaddicting rued immovably mesomorphic" ; + dc:publisher ; + dc:date "2000-06-23"^^xsd:date . +bsbm-inst:ProductType16 + rdf:type bsbm:ProductType ; + rdfs:label "engulfing" ; + rdfs:subClassOf bsbm-inst:ProductType4 ; + rdfs:comment "underfeed wrynecks inconsistency persuadably incinerator etiolated remend transportal millrun solarizes tarp prinks propitiates vegetarianism gars sanctifies toppled polkas nooning servicers whirred clingier outpoured echidnas desolates seismometer" ; + dc:publisher ; + dc:date "2000-07-16"^^xsd:date . +bsbm-inst:ProductType17 + rdf:type bsbm:ProductType ; + rdfs:label "daftly volute outvoted" ; + rdfs:subClassOf bsbm-inst:ProductType4 ; + rdfs:comment "desperadoes easiest peery jughead lepton gamins rebated enthusing bullocks beheading extinguishes mudslinging surefire glands disinter savouriest stakeout desegregation pruners ocurred condones annoying retractors wharfed helipads saucers cassaba burundians quitclaiming conns rotting transpolar silkier romanticization misreporting reproof excoriates medics" ; + dc:publisher ; + dc:date "2000-07-17"^^xsd:date . +bsbm-inst:ProductType18 + rdf:type bsbm:ProductType ; + rdfs:label "reglued renovators" ; + rdfs:subClassOf bsbm-inst:ProductType5 ; + rdfs:comment "reindexed wannest moonlights rattler maracas imposed coronach frizzling dunghill falteringly indigently canes confuters nervily boycotts sheepman supporting soundtrack crudities fumes barred antlers secretor pragmatical igniting cavitation preparer maturating inebriates diluvial" ; + dc:publisher ; + dc:date "2000-07-17"^^xsd:date . +bsbm-inst:ProductType19 + rdf:type bsbm:ProductType ; + rdfs:label "onefold outproduces decalcomania" ; + rdfs:subClassOf bsbm-inst:ProductType5 ; + rdfs:comment "mouldiest sulfurized accommodator shrewdly rugging grumbled celebrators thereout paraphrases interjectional preshaped rationalizes lagoons fossate pinworms egomaniac throating toothaches scrubs tentatively toweling inputted chickpeas unlivable noncomplying knucks aerobes warpers location emulating hangings enfolder seascapes armourer expunging compressors" ; + dc:publisher ; + dc:date "2000-07-19"^^xsd:date . +bsbm-inst:ProductType20 + rdf:type bsbm:ProductType ; + rdfs:label "umbellate" ; + rdfs:subClassOf bsbm-inst:ProductType5 ; + rdfs:comment "insurrectional bucking accommodations floors degaussing sisterhoods primogeniture stover contumelies fifteens atrociously flagellated microradiographically copes plexiglass fowled disincorporated braises mildly incompetencies virucide overembellishes perfectos dignities perdurability pryers overplaying monistic contraindicated trovers impulsed nulled stumper mackerels plentifully bullfight simpers toasting distributors" ; + dc:publisher ; + dc:date "2000-07-17"^^xsd:date . +bsbm-inst:ProductType21 + rdf:type bsbm:ProductType ; + rdfs:label "mannas" ; + rdfs:subClassOf bsbm-inst:ProductType5 ; + rdfs:comment "frustration tubbiness wordstar consults reoccurrences commensurations grinning oles idealities harborers overdiversifying virginally schussed assessors superintendents mowing chapmen cains unmuzzle surtaxed brio managemental thermograph robustly subcommissions quando rani intermix astringents hognoses jailors braver" ; + dc:publisher ; + dc:date "2000-07-15"^^xsd:date . +bsbm-inst:ProductFeature1 + rdf:type bsbm:ProductFeature ; + rdfs:label "melanized" ; + rdfs:comment "saliently uninvited flinging vigilance vulnerability reneger hatters decrial domestically torc billeters mesalliances disturbances fabricators groschen aerometer guiltless threatens ivies alumin advertently magicking undiscriminating dilapidator milfoils fido dancer moderates orogenic storerooms pithed condenser flammably backsaw goggles idolatries anacondas hounds mothering ensky rapider toroids quadriplegia likers mullioning" ; + dc:publisher ; + dc:date "2000-06-22"^^xsd:date . +bsbm-inst:ProductFeature2 + rdf:type bsbm:ProductFeature ; + rdfs:label "pants" ; + rdfs:comment "sheaves grimmer redistills loaning kaliphs hawker progressional journalism backspaced crevasse disfunction deepening gestalts hammerlock tazzas ofttimes overestimated profounds prefabbed gypsied cerebric laserjet broncs foretokens smoker reerects anticipated somewhen feathering gargoyles excellency dehumanize misarranges justifier ponchos percolators moaning annexion pokeys" ; + dc:publisher ; + dc:date "2000-07-06"^^xsd:date . +bsbm-inst:ProductFeature3 + rdf:type bsbm:ProductFeature ; + rdfs:label "soilages feeblemindedness arrhythmical" ; + rdfs:comment "resorts comping christianize gears ranges cobs roscoes derogatoriness arguer polyandries susurrations sputterer arrestment meninges arming nabobisms conventicle hybridizer coffered caracol handpicking flatter uncurling climatically remora scuppering marketings carotin palatably zeroing smells smeariest capful microvolt subtopic" ; + dc:publisher ; + dc:date "2000-06-21"^^xsd:date . +bsbm-inst:ProductFeature4 + rdf:type bsbm:ProductFeature ; + rdfs:label "rectangles" ; + rdfs:comment "factiously propmistress triangulated everted pistolling canzona disapprovals linnet cribbages gravies rubbernecked bleachers buffeted vasodilation hussy vacillated determinedly italicize alacrities abscise tamperer mamboing disemboweling protectionist hacked hyperbolically droppings irritancies graceless kabob oblongly curares tinsmiths kingliness splosh backslider apprenticing baa" ; + dc:publisher ; + dc:date "2000-06-27"^^xsd:date . +bsbm-inst:ProductFeature5 + rdf:type bsbm:ProductFeature ; + rdfs:label "valorizes stammels" ; + rdfs:comment "slumbered tinhorn grubworms purchasers statisticians improvidently albanians manginess entomb elopements adviser gundog lambaste ultrasonics livings copped undraping cavorter freeloader beetroots antiheroes quietude sheathers huaraches beholden coagulator prosthetics ecclesiastically obsessed vitalities batwomen resorted donation puritans slummy oversells untractable oinking pussyfooted insensitivity egomanias megalithic hiccups reinducted" ; + dc:publisher ; + dc:date "2000-07-20"^^xsd:date . +bsbm-inst:ProductFeature6 + rdf:type bsbm:ProductFeature ; + rdfs:label "reinduce balancing antiradicals" ; + rdfs:comment "greeting largely fender rubbles unquote unalarming anthropologies strobilization accommodation terrestrially mollycoddling dehumanizing steppingstone orchestrally tenuousness yardsticks unneedful calamaries supplants endlessly impregnated heroize navvies studbook analogousness barometric coheirs elongations walking nonelectrically sirrees churchy petroleous coverlets unfamiliarly desensitizes useless autostradas infinitesimally gluttonies conjoins scabbily" ; + dc:publisher ; + dc:date "2000-06-30"^^xsd:date . +bsbm-inst:ProductFeature7 + rdf:type bsbm:ProductFeature ; + rdfs:label "heroics biracialism courtrooms" ; + rdfs:comment "capitalizer collapses netter backs reboils ablated whorls calumniations layering blurters dismortgaging commands expropriations vignetting trimly replicates autocracies synovial bullocks typifiers reinfect playwears auriform paupers mannered masers smoothly computer radioman hailed carefully civilization arrived fixative agedly glottologies pushily dognaps piscine alights" ; + dc:publisher ; + dc:date "2000-07-11"^^xsd:date . +bsbm-inst:ProductFeature8 + rdf:type bsbm:ProductFeature ; + rdfs:label "skyjacked" ; + rdfs:comment "sudsed deviated entryways periodontics olios civics intergalactic abrogations interviewees aimlessness ambivalently synovias sakis staffed pufferies outfielder punner huller idler yokelish semicircle" ; + dc:publisher ; + dc:date "2000-07-08"^^xsd:date . +bsbm-inst:ProductFeature9 + rdf:type bsbm:ProductFeature ; + rdfs:label "daphnias" ; + rdfs:comment "despatch females rubbings obtainers roofings thoughtfully punier handsbreadth adamantine glamorously medals overstretches malthus miscarriage ladened spermatozoa seasonally evanishes satisfactoriness prompted rescued wallets wayless demimondaine moonward conformism lathy aerators metacarpal intravaginal interfaces" ; + dc:publisher ; + dc:date "2000-06-29"^^xsd:date . +bsbm-inst:ProductFeature10 + rdf:type bsbm:ProductFeature ; + rdfs:label "dichotomously abhorrences" ; + rdfs:comment "dazzled delicto preexposing nutritionists wriest futuristic busings uneven depleted puritans nonresistant frankensteins manhattans reunifies crumbling sanding vouchering modeler shintoism washwomen pakistanis fineable misnumbered subdivide unimproved ascribed pecker abashed illogics tributaries bruin disjoints loyaler libs coleslaw elegizing reconvening brazened forcedly titillation bldg" ; + dc:publisher ; + dc:date "2000-07-15"^^xsd:date . +bsbm-inst:ProductFeature11 + rdf:type bsbm:ProductFeature ; + rdfs:label "overambitiously" ; + rdfs:comment "riprap nonaddictive endozoic noctambulation tempters miseries topper performances idahoan zebras enrolled flatted unbounded piastre anthropomorphisms stirs accusativeness clotheslines urbanisms grackles fishmeal bedevilling retouchable congas phaseal englishwoman thiamines strikers biddably hoarsening abbess gossips underspent doorplates massacred unclean sidearms useless scrawled egged" ; + dc:publisher ; + dc:date "2000-07-16"^^xsd:date . +bsbm-inst:ProductFeature12 + rdf:type bsbm:ProductFeature ; + rdfs:label "asphyxiates bounds kirigami" ; + rdfs:comment "pussyfooted spoonies plaudits pipits parimutuels writes dickered triadic quicksets gruntingly chancing sparkers comedones levelness heteroerotic reinvited indicatively mendings allegiance sulkily bod kneelers galvanizer keeling imbricate coziness gjetost saddening funning prescore cauls mollifiers barbarize unearth telephonist implores misbestow" ; + dc:publisher ; + dc:date "2000-06-25"^^xsd:date . +bsbm-inst:ProductFeature13 + rdf:type bsbm:ProductFeature ; + rdfs:label "dogsbodies pouffs" ; + rdfs:comment "whiskered unmerciful folderols occludes diddling diligence invaders gophers bedtimes tisane antiabortion detains traditionalize simpered galvanometers reeducates blinder frauleins nonfat bushes kibosh implemented trounces forewarning scrutinize macroscopical decoupage endorsees nestlers mismarked mirthfully" ; + dc:publisher ; + dc:date "2000-06-28"^^xsd:date . +bsbm-inst:ProductFeature14 + rdf:type bsbm:ProductFeature ; + rdfs:label "sadisms obduction" ; + rdfs:comment "chaws kvetch superficiality cowering galloot cars sagacities attenuated implications currycombing underarms semipro reptiles corrosives opprobriated irritability kennelling mahonia satanophobia primevally easier paddling damagers tutting sculker splenectomy wardenship galoots advertised cordoned slumped enshrouded gilders grunters armlet syncopates filterer shingling terminators minter gigabits odorless embolisms flightier recriminating quadroons magistracies patrilinies" ; + dc:publisher ; + dc:date "2000-07-13"^^xsd:date . +bsbm-inst:ProductFeature15 + rdf:type bsbm:ProductFeature ; + rdfs:label "surfaces ambled wifehoods" ; + rdfs:comment "yodler extorts majestical gobbled painfuller berhymed homophone tantalization oversleeps defusing pessimists crossbones realizing victimizations quadruplications sentimentalists ransomers measled hemorrhaging liver adhesions huskiest profeminists feudalists packman" ; + dc:publisher ; + dc:date "2000-07-17"^^xsd:date . +bsbm-inst:ProductFeature16 + rdf:type bsbm:ProductFeature ; + rdfs:label "provisionally" ; + rdfs:comment "urushiol unexcusably synclines apoplectically vends blowtorches offices logotypies pipings antisepticize outlies oceanauts defeatist melanites canaling drear unreconciled sweetness calamities slating leathering counterfeiters fours chatter tramlines pastiest floweret reconcilers bypassed eradicators lobbers" ; + dc:publisher ; + dc:date "2000-07-18"^^xsd:date . +bsbm-inst:ProductFeature17 + rdf:type bsbm:ProductFeature ; + rdfs:label "tolerative" ; + rdfs:comment "marriages endocrinologists seedsmen maximizers unequalled unsparingness syphon jeopardies arguses zombiisms reportages pawnee gravitates casqued meccas banjoes eddying fattening casuistic outclass aggressiveness wordiest" ; + dc:publisher ; + dc:date "2000-06-23"^^xsd:date . +bsbm-inst:ProductFeature18 + rdf:type bsbm:ProductFeature ; + rdfs:label "memorialize hellenist" ; + rdfs:comment "resuscitative curseder daringly licensers breathlessly crofters cloturing disbarment swainish exaggeration laster moldy bloated twiddled decreases cornrows pragmatists wester dustbins daylit waitings relinquishing provides compartmentally debutantes" ; + dc:publisher ; + dc:date "2000-06-22"^^xsd:date . +bsbm-inst:ProductFeature19 + rdf:type bsbm:ProductFeature ; + rdfs:label "fumaroles puled" ; + rdfs:comment "overviolent adjudicated leadworks oddities corrected rubberizes overexcited reloaded pureed interventionist telescoped egads rasing coaxers twiddler overgarment periodontics cryolite teawares bands resurveys chinking admixes" ; + dc:publisher ; + dc:date "2000-07-08"^^xsd:date . +bsbm-inst:ProductFeature20 + rdf:type bsbm:ProductFeature ; + rdfs:label "beatification" ; + rdfs:comment "triunes barmier rabbis bespatter filtration antitoxin grooved penances seining cochairing supplanter outnumbered bottoms affiancing ravishment prevalently uncorking entertainer raser musicianly wrongfulness splaying homonymies copepods antidepressants milfoils lethally spined prosecutable deferrers percussionist nerved activists rebaters tautening overanalyzed cognizer spondee mongrel diphtherian residency handiness bedraggles transsexuals pusillanimously winnings ochers floored underpaid" ; + dc:publisher ; + dc:date "2000-07-16"^^xsd:date . +bsbm-inst:ProductFeature21 + rdf:type bsbm:ProductFeature ; + rdfs:label "globs tops memorability" ; + rdfs:comment "outcastes administratively calculous abolitionism cooee porting rotationally lits paradisiacally profiters vomitous exhibiter calorimeters parlaying papooses footpaths tweezing importuned glucosic bookkeeper nevermore capons stentor posthaste commissioned kalifate ejects carsickness bittering thespians unincumbered dynes disservice deflation magnetos decreases demerits recalling hockshops grumped" ; + dc:publisher ; + dc:date "2000-07-12"^^xsd:date . +bsbm-inst:ProductFeature22 + rdf:type bsbm:ProductFeature ; + rdfs:label "valerian obeah" ; + rdfs:comment "accusatrix overstocks extortion politicoes haver literalness tureen assaults recuperated overgraze wilding brevities prefixed threated disoriented foghorn chartists thymy cerebrates thickset domiciling kalium pericardial bladed challises commixt tutankhamen" ; + dc:publisher ; + dc:date "2000-07-04"^^xsd:date . +bsbm-inst:ProductFeature23 + rdf:type bsbm:ProductFeature ; + rdfs:label "encumbering" ; + rdfs:comment "chondrite laddies commutation phallic henbits nepotists catacombs voiceprint cosmonaut mimer drillmasters doffs daimon riggings dislodges undergraduate frizzling pancreases abhorrence scampish swabbie jailbird attacher collocated leader loosing unprovoked orangeries toning lacing sculpted euphenics decentring kittenishly ophthalmological backspaces connectors specifics affaires unsubstantial lexically romaines pleats catfishes cytologies" ; + dc:publisher ; + dc:date "2000-07-17"^^xsd:date . +bsbm-inst:ProductFeature24 + rdf:type bsbm:ProductFeature ; + rdfs:label "underparts heedfully" ; + rdfs:comment "orneriness gaugers jeopardized daring corrects overinterest racism towable bailies dreck defines chittering nibbles subprincipal morns inarticulateness cribwork almanacs vapourers shticks underhandedness expiratory hippodromes triunes minarets reverbs yodelers archings entertains townish postulated disenfranchised loveably pulling exhausted unamortized disgusts burring brocket nosings litten sequestrable" ; + dc:publisher ; + dc:date "2000-07-22"^^xsd:date . +bsbm-inst:ProductFeature25 + rdf:type bsbm:ProductFeature ; + rdfs:label "farmhouses shutterbug jarsful" ; + rdfs:comment "dayroom fetted relapse calypsoes intenseness lavishly trets semicomatose decontaminate yammering amphitheaters reformating violoncellos kneehole dioritic appestats conjuncts stoppled coact jurywomen progressed kymograph foots hebraists bickerer meaningfully stigmatizes" ; + dc:publisher ; + dc:date "2000-06-22"^^xsd:date . +bsbm-inst:ProductFeature26 + rdf:type bsbm:ProductFeature ; + rdfs:label "cadgy" ; + rdfs:comment "enzymes minify yardmaster flusters underseas vacuums abbesses opposing murderess impulsing treadles pettifogged hawthorns brahmin gurgled electrosurgeries prizefights ambushed sociosexual touches resubmit faints tends inscribing snuggles cordialness" ; + dc:publisher ; + dc:date "2000-06-29"^^xsd:date . +bsbm-inst:ProductFeature27 + rdf:type bsbm:ProductFeature ; + rdfs:label "veinule endured preserved" ; + rdfs:comment "unofficial admirer celebrator extrauterine si reelers orates sweatiest cultic tided fringes noncontrastable tubas gerontotherapy grudged recompenser interhemispheric patrimonially inexplicably entrancing unforeseeable arsonists poiser sombrely weediness elides uninformative havocked nonbelligerents fakes stability" ; + dc:publisher ; + dc:date "2000-06-22"^^xsd:date . +bsbm-inst:ProductFeature28 + rdf:type bsbm:ProductFeature ; + rdfs:label "campstools" ; + rdfs:comment "hoist wheeziest ideals conchoid gathers ridable quagmiry pileups frontager stippler soapers devastative urbanizing gnoses shopman sectors inciters canonise eyeballed parred twiny lawmakers untangle sackbuts hiring triumphantly lyricize mounties kerosenes hoarsest bonesetter wellspring exemplum endoskeleton hon giveaways outsmarted variously pastier observes scaping latest empurpled cotangents recelebrated reciprocating sunnily" ; + dc:publisher ; + dc:date "2000-07-15"^^xsd:date . +bsbm-inst:ProductFeature29 + rdf:type bsbm:ProductFeature ; + rdfs:label "foursomes" ; + rdfs:comment "hallmarked fortuned orpiments congruously apes yielder wondrously dimorphic franchisees raveling subconscious loury legginged umbellate wardresses diemaker breakings weighters xenograft senselessness drags sailable hellishly realign alcoholics ologies remodify spasmodically choirmasters dimes" ; + dc:publisher ; + dc:date "2000-07-05"^^xsd:date . +bsbm-inst:ProductFeature30 + rdf:type bsbm:ProductFeature ; + rdfs:label "owls raps bruted" ; + rdfs:comment "bucklered goddamn hitchhiked unplug recta circuiteer reunifies swanherd learns gradation demobbing mussolini squinters tarmacs delegated repudiator etherizes ambivert homogenized studiousness ageratums molested textuaries sobers sinecures bedevils scattersite saddles oregonians reconfirm spined compensation invincibility understatements feeing amplest anapestic detachable" ; + dc:publisher ; + dc:date "2000-07-07"^^xsd:date . +bsbm-inst:ProductFeature31 + rdf:type bsbm:ProductFeature ; + rdfs:label "harshened imploringly yapped" ; + rdfs:comment "caladium seminude praetors soirees granger plains conveyances denouncements examinee piggybacks thinning aspens neaps peritonea horsepowers hookah rentable maupassant fricassees unfastening interoceanic implacability discontentments spryness overgeneralize jeopardies justified telephoto ley incus kiddy dislocations hours stickling defrauder" ; + dc:publisher ; + dc:date "2000-07-19"^^xsd:date . +bsbm-inst:ProductFeature32 + rdf:type bsbm:ProductFeature ; + rdfs:label "approbating" ; + rdfs:comment "direction subtreasuries unremittingly rubrics tramline osteotomy institutes vaunter chertier substitutions lamaism exculpations maledictions nightwear telluric subbings florets lividly barrister oozy obliqued barricades franchiser mistranslate" ; + dc:publisher ; + dc:date "2000-06-23"^^xsd:date . +bsbm-inst:ProductFeature33 + rdf:type bsbm:ProductFeature ; + rdfs:label "deregulations chicks minty" ; + rdfs:comment "smuggest pensionable eschewals abandoned sordidly turnspit differentiating medicates charlatanism serialize disregardful groans spiritualized submontane cheapen returner carrier pigments spasticities foldboats couplets japer halfpennies computable phooey squeezer" ; + dc:publisher ; + dc:date "2000-07-11"^^xsd:date . +bsbm-inst:ProductFeature34 + rdf:type bsbm:ProductFeature ; + rdfs:label "ocellus" ; + rdfs:comment "orchectomy traumas sinner preventions leggiest unapplied glop cognoscing rhubarbs haphazardness vats potentiate crematoria polymorphism muzzier nightwalker troughs opacifying unfederated doges hermaphroditic ambulating huddler varments consonances demobilizations" ; + dc:publisher ; + dc:date "2000-07-19"^^xsd:date . +bsbm-inst:ProductFeature35 + rdf:type bsbm:ProductFeature ; + rdfs:label "halflives" ; + rdfs:comment "ombres compliantly dillydally potentiated prepayment bestirred fluidizing editorship gorses ethnical zillions infidels albanians consummately analytical slatternly bilgier incommunicative cutup translucence generalized underacting reproached tagboards diagraph exhibitionist incorrigibleness runrounds sulfides dites clearer sportive shikses" ; + dc:publisher ; + dc:date "2000-07-04"^^xsd:date . +bsbm-inst:ProductFeature36 + rdf:type bsbm:ProductFeature ; + rdfs:label "cutins" ; + rdfs:comment "vigils phlebotomies remonstrating impermeabilities categorizer overmodify disbar liers readjust moulin farced salesladies faultily walked shellfish neoplastic intelligently convicts seventeens miscellanies eterne rockers sings chaffers steamiest smidgens pareve counselable cacaos barometrograph winsomest" ; + dc:publisher ; + dc:date "2000-06-24"^^xsd:date . +bsbm-inst:ProductFeature37 + rdf:type bsbm:ProductFeature ; + rdfs:label "forebodies polypod pathogens" ; + rdfs:comment "starched chekhov anapest milliliters variorums commencement apteryxes trichinoses spiderier presifts alimenting inflictor prideful equals mainframes counterpoints quills galled sleeting peristylar expurgates beauts invigorating arider cosigner barbarize cushioning messman cinquains enfoldings tutoresses folktale zonetimes removed mein boxful allergen lindanes causerie lieut yummies prickiest cording disinterested scribers sapidity yours" ; + dc:publisher ; + dc:date "2000-07-22"^^xsd:date . +bsbm-inst:ProductFeature38 + rdf:type bsbm:ProductFeature ; + rdfs:label "viperish blent quarks" ; + rdfs:comment "aesopian debauchees cumquat cloaked sandbags intellectually duplicates umbeled anomalies hacked boomerangs jockeys muumuu workup blah rhododendrons executors eyewitnesses meas hidebound sonants offence dashes reposed reluctancy reshuffles subaverage eternize congratulations encephalitic wooshing potentiates cerecloths leftism plinths nervously pinholes articular brilliancy ancien promulgators nocturnes facially esplanades reconversions irruptions" ; + dc:publisher ; + dc:date "2000-07-14"^^xsd:date . +bsbm-inst:ProductFeature39 + rdf:type bsbm:ProductFeature ; + rdfs:label "enjoyably retirer" ; + rdfs:comment "shamefully eclecticism middlebrowism commitments crabber workingwomen entwine outrace sweated caravaning uncritical winkles dippy pestiferous extraterrestrially criminology genres wrongers warmongers kart nonperishable restfully remailed erose bries reattempts anoints placket nutcrackers braggadocio darkener adagial transients unpaying blintzes mobsters dinking pericardial sequentially uncivilized potences attenuated cuish craftiness romances sideslipping barhop reprintings smells pilothouse" ; + dc:publisher ; + dc:date "2000-07-14"^^xsd:date . +bsbm-inst:ProductFeature40 + rdf:type bsbm:ProductFeature ; + rdfs:label "torrential automatons" ; + rdfs:comment "malefactresses upholstered valutas wrings timpanists wardrobes adoze disintegrated atrophied houseboy ineligibly injustices featherless transubstantiation ruffles cottoned recounted pelleting subrule respectable floorings aerobatics furrowers" ; + dc:publisher ; + dc:date "2000-07-21"^^xsd:date . +bsbm-inst:ProductFeature41 + rdf:type bsbm:ProductFeature ; + rdfs:label "yardarm crashed passivity" ; + rdfs:comment "redid goofed updates aspects mayday permeably revs vernaculars croakier ramparted bethels pyrenees deactivated syne erasures technics nonirritant ricochets unproductively searer dropsied fey gimcrack flamines shunpiked samplings moroccos titrant dogger infundibula voided gangers encompassed accounter globetrotting lasing supplicated babkas pigments warthogs abeyancy polygonally" ; + dc:publisher ; + dc:date "2000-07-21"^^xsd:date . +bsbm-inst:ProductFeature42 + rdf:type bsbm:ProductFeature ; + rdfs:label "saturating petrographers" ; + rdfs:comment "disgustedly middies epistolary caromed bleeps funerals decolonizing nervy klutzes spatular ouzels stemware drillings gunstock fructoses razors imprecisely overinvested vaquero indirectly uncharitable gorgeousness appendages teethings jingoist" ; + dc:publisher ; + dc:date "2000-07-02"^^xsd:date . +bsbm-inst:ProductFeature43 + rdf:type bsbm:ProductFeature ; + rdfs:label "exogenously slenderized supersexes" ; + rdfs:comment "potbellies qui sigmoids lobotomies bestrewn forsakers lowing equitant foods designment vibrance atheists suffixion gamy tundras shortening samovars soapbark bulled electropositive reworking realigns ultrastructural repowering mammalians hedgier liberationist bronzing accumulated topologically" ; + dc:publisher ; + dc:date "2000-07-09"^^xsd:date . +bsbm-inst:ProductFeature44 + rdf:type bsbm:ProductFeature ; + rdfs:label "personas" ; + rdfs:comment "truistic sceptered glamorization reverers golfed saintly yetis imponderability electrochemistry pyrotechnical pronouncing disaffiliation avoided ortho scraggier trapezoids singling indianians reflexiveness conchoid nakedness tarn" ; + dc:publisher ; + dc:date "2000-07-10"^^xsd:date . +bsbm-inst:ProductFeature45 + rdf:type bsbm:ProductFeature ; + rdfs:label "antechambers henpecked designs" ; + rdfs:comment "spacewalk abscises remelts evaluations debating surrealistically biomechanics cherishing noisier terrines quincunx roistering contours tweedles sinicize hon poppets stockading nurserymen bidders weirder pederasty impassability incitants glimpsed dishonoring railroaders quarreling privacies homemaking grinners" ; + dc:publisher ; + dc:date "2000-07-06"^^xsd:date . +bsbm-inst:ProductFeature46 + rdf:type bsbm:ProductFeature ; + rdfs:label "undersigned handpicks" ; + rdfs:comment "scag foredoing inhalants dekagram fortis brunched unsparingness rosarian oxygenated sartorially misshaping probationary incompressable braziers toxicoid mollified truculence bannister sluts hogtieing savoured flops" ; + dc:publisher ; + dc:date "2000-06-26"^^xsd:date . +bsbm-inst:ProductFeature47 + rdf:type bsbm:ProductFeature ; + rdfs:label "burs skullduggeries" ; + rdfs:comment "unified cowering gluttonously antifreezes pacemaker quotations cutthroats severance disinheriting effloresced halftones snuffy forelegs anticommunism reembarks hypothyroids standings kindredship whippiest assortments snuffier bonfires inadmissable charters penetrator hospitableness gasified nudity uncoil ghanaians frailties" ; + dc:publisher ; + dc:date "2000-07-03"^^xsd:date . +bsbm-inst:ProductFeature48 + rdf:type bsbm:ProductFeature ; + rdfs:label "deluged divvy" ; + rdfs:comment "restore disappointment mints minder ecologist ecstatically sufferers portioner flagella merrier upcurve condos bunds cuckolded undertrained inning hobbled cubebs incompletely garbling provincially malignancy aced despisers sucked presifted objurgations immunized ratsbane missions smoked shoes howdie inconsolably remolds triadics amnesias ascendance alluding stretched buffoonish subcompact crutched brittleness subsides feaze outbalance castings" ; + dc:publisher ; + dc:date "2000-06-25"^^xsd:date . +bsbm-inst:ProductFeature49 + rdf:type bsbm:ProductFeature ; + rdfs:label "ethnicity antiparticles" ; + rdfs:comment "beechier soapers vaunted ducal brachium cymbals delegalizing trichlorethylenes metallurgists revarnishes ampulla confidences nickels bedraggled spurring overcapitalize gyrates cabochons teargases xxii albumen mellowest workweeks cartloads cedarwood staterooms uncrosses reasonless vaultings kooky reposition acidification languishers skidded bolted" ; + dc:publisher ; + dc:date "2000-07-01"^^xsd:date . +bsbm-inst:ProductFeature50 + rdf:type bsbm:ProductFeature ; + rdfs:label "dangled crowner" ; + rdfs:comment "surmounts unaffiliated annexational thrilled froggiest mismatched neckwears discrepantly gauchos caoutchouc southerner perkily genres bednights authenticity rains tighter cooperators appaloosa reshuffled hosier boudoir pumped remonetization bunting ultimatums otiosely tenderize bioenvironmentaly virilities outrun gustation perishably mulier degermed" ; + dc:publisher ; + dc:date "2000-07-03"^^xsd:date . +bsbm-inst:ProductFeature51 + rdf:type bsbm:ProductFeature ; + rdfs:label "uncharacteristic" ; + rdfs:comment "motorizes positiveness slimming bottleful icelander falsettos extemporized unscholarly distensibilities manometric preblesses chasmed ensnarling yippie cogence bulbed alchemist autointoxication strugglers slangiest dendrites checkmated" ; + dc:publisher ; + dc:date "2000-07-22"^^xsd:date . +bsbm-inst:ProductFeature52 + rdf:type bsbm:ProductFeature ; + rdfs:label "enquirer trillium thousandths" ; + rdfs:comment "creasing obstructors hamstringing outgo buzzards subtending demits sputters cocomats inconclusiveness colonic vendibility scrutinizers photoengravers browses ultrasonics assented bigamy vouches overexpectant aligning choleric equivocalness netty ironworks rockers cardiographies kebab gerontologist befuddlement ripplers repopulates shingles clodpate expiating monosodium sportscaster rustily assailing" ; + dc:publisher ; + dc:date "2000-07-04"^^xsd:date . +bsbm-inst:ProductFeature53 + rdf:type bsbm:ProductFeature ; + rdfs:label "testers" ; + rdfs:comment "egomaniac laundrywomen cameleers contemplative recumbencies pigsties tramcar excitor airlifting veiner rewin imprints infringes shrinker footnotes leafage chariness coquetting reverified ob apennines snoot basify cranched tetany peppercorns rumormonger unarrested bedgowns dippier monomanias transcendentally cremator spathic megabits strays swankier parolable nudges airiness neutralize nutrias tarrying phlegm vaultings tootling kathartic" ; + dc:publisher ; + dc:date "2000-07-19"^^xsd:date . +bsbm-inst:ProductFeature54 + rdf:type bsbm:ProductFeature ; + rdfs:label "nonunionist roan lawnmower" ; + rdfs:comment "geopolitics approvals reexpressed kindlers naturalized decomposing apronlike solarisms blighting aridity skittles redry sergeancies prepared saps outcropped unsubdued urgingly wierd cogitator backbends immovably seceders recumbencies dehumidifying" ; + dc:publisher ; + dc:date "2000-07-03"^^xsd:date . +bsbm-inst:ProductFeature55 + rdf:type bsbm:ProductFeature ; + rdfs:label "huskies" ; + rdfs:comment "demeans casehardening serialization foreplay reunifications diminishes fagoting enlister lightest expands radioscopical solvable windbreaks sultans schmoozed smashing tribades dbl errs sniggeringly bourgeoned hellcats recreative unerringly embalmer synovias chorussed czechoslovak" ; + dc:publisher ; + dc:date "2000-07-11"^^xsd:date . +bsbm-inst:ProductFeature56 + rdf:type bsbm:ProductFeature ; + rdfs:label "pacemakers" ; + rdfs:comment "flattener spectroscopical successes charbroil hermetically rainmaking trafficable skeletons sipper sweeter avocational pompoms gardener thready supervises forgetfully topflight tribunals veering soldierly internodal disillusion resizing primariness" ; + dc:publisher ; + dc:date "2000-06-21"^^xsd:date . +bsbm-inst:ProductFeature57 + rdf:type bsbm:ProductFeature ; + rdfs:label "rainwater phylacteries" ; + rdfs:comment "dodos dressmaking victualled mashie aggies iniquitously meningism disrepute buttonhook gladiate tropins junkier bringing fertilizers makeups wildwood supererogation sensed exaggerative leftwing kelped trembler recessions limbing roofings overfanciful" ; + dc:publisher ; + dc:date "2000-06-25"^^xsd:date . +bsbm-inst:ProductFeature58 + rdf:type bsbm:ProductFeature ; + rdfs:label "opened predatoriness synchronizer" ; + rdfs:comment "turbines subscriptions creoles succour tenty cameoing rehearser shamois relearn grogs rescheduled interpolating guesstimate unbeliever prolixly swishers reformer reinvestigating underproduced interloping clarinetist unopened divines quagga dashiki caressers cantered pinners cubages acidosis reattempt casts confuted dissection scummiest injectant pelves punctilious statutableness videos coinsurer scalawags deadeye semierect champagnes ridicules nocturn untethers" ; + dc:publisher ; + dc:date "2000-07-15"^^xsd:date . +bsbm-inst:ProductFeature59 + rdf:type bsbm:ProductFeature ; + rdfs:label "broguery periodontics" ; + rdfs:comment "cutlery remonstrance manometric jacketed warningly discomposing filtrating alloted unverifiably deleting citicorp pertinacity sunshines tolerative ravishments attraction provocatively remits pieta reawakened ostensive pauperization subrules denuding hedges gangplow glaciology oratories carnify broodiest celebre" ; + dc:publisher ; + dc:date "2000-07-06"^^xsd:date . +bsbm-inst:ProductFeature60 + rdf:type bsbm:ProductFeature ; + rdfs:label "personalization" ; + rdfs:comment "relenting boxer hotdogging mouthwash unexampled multilayer ceder limeades unmended diluted lays anneals bludgeoning mediumistic vaster goebbels sponsorial digitalized ballyhooing arsenites esculents cupronickel" ; + dc:publisher ; + dc:date "2000-07-22"^^xsd:date . +bsbm-inst:ProductFeature61 + rdf:type bsbm:ProductFeature ; + rdfs:label "flinders meeker" ; + rdfs:comment "hysterectomies thunderhead overscrupulous aortal faiths nits batistes chewer asks beholden tidies trochaics disinfects genet quahaugs nondrinker escallop tremolo immigrated brutally backstitching clamorously uncongenial blustered lechered antidotal reimburses waffling embroiderer prepublication ephedrin" ; + dc:publisher ; + dc:date "2000-06-20"^^xsd:date . +bsbm-inst:ProductFeature62 + rdf:type bsbm:ProductFeature ; + rdfs:label "fumes japanizes" ; + rdfs:comment "jauntiness polarization divisions equivalences transgressors insaner gumtree feared obstructer parachuted coarsely hyposensitize unpossessive stateside coiffes embarrassing considering sharpens farsightedly tartrated bentonite joggles eyeholes contextually bruited osmotically highhandedly jays ordnances casts bested blandishment vilifiers recleaning spunky drawlers warping" ; + dc:publisher ; + dc:date "2000-07-01"^^xsd:date . +bsbm-inst:ProductFeature63 + rdf:type bsbm:ProductFeature ; + rdfs:label "matzo fishways" ; + rdfs:comment "labeled honied clotures tillage bearably chickpea inflationism meniscectomy dishpan prevailers tosser rf maledictive constants elusion ingression seismometric stipulated forbearer cadaverously hindermost nutrimental reembarkation fortuneteller" ; + dc:publisher ; + dc:date "2000-07-20"^^xsd:date . +bsbm-inst:ProductFeature64 + rdf:type bsbm:ProductFeature ; + rdfs:label "dismounting soffits" ; + rdfs:comment "corporations stealer chalkier refinances hairwork progressed squattiest masse defeminize pectorals inculpability glossing uneducable documented sparkier thumbscrews peckier frothily terrane homespuns unpasteurized undercoating" ; + dc:publisher ; + dc:date "2000-07-03"^^xsd:date . +bsbm-inst:ProductFeature65 + rdf:type bsbm:ProductFeature ; + rdfs:label "imputations" ; + rdfs:comment "revenant interrupting believeth torii phonemes movability yoking desensitizing dieters interbanking guardianship unstructured endocrinologic legitimateness cotangents deceiving peripherally prinking confutation steeped identifiable secretariats climacterics quittors psychokinesis hoggishly unpracticable infields gaveled appetizers" ; + dc:publisher ; + dc:date "2000-06-28"^^xsd:date . +bsbm-inst:ProductFeature66 + rdf:type bsbm:ProductFeature ; + rdfs:label "smiters" ; + rdfs:comment "sphygmographies unadjustable achiever rankest flexes bedfellows vendees kneaded asylums remeasurement eggplants rearousal shirtiest tatters gnawingly extorting dost tannates flunking unplanned shacking sorel reportedly cowing goodwills cavalierness sanding porphyries cst turtler matzos beltlines pantries emigrating opacities writing brands overman audiologists teratologist" ; + dc:publisher ; + dc:date "2000-07-16"^^xsd:date . +bsbm-inst:ProductFeature67 + rdf:type bsbm:ProductFeature ; + rdfs:label "exteriorly curmudgeons" ; + rdfs:comment "trustfulness muddleheaded pawing fishpole whoosis silverfish cankers horologies exuberantly confederative sander parve fumet groundwave enrichments crueler cured impalement needers poker crackdown overattached kantian honeycombs moneymakers mens reclassified gainsayer maenads conjectures garniture pronghorns grantors inceptive fretful puttee generational drowses cliquiest descry tonneaux" ; + dc:publisher ; + dc:date "2000-06-26"^^xsd:date . +bsbm-inst:ProductFeature68 + rdf:type bsbm:ProductFeature ; + rdfs:label "diddlers" ; + rdfs:comment "blubbery cybernation gallnuts particularly ensnarled premising festivals unrests lingers thunderheads kb overcompensating relicenses codger reaccredit rehanged reabandons emulating inflators destitution middies chapping votaries analects cloverleaf vinic spurting brevi conks assuredly tarps cords outstandingly cohesions nonviolent humanization transmissive parring napes muslims" ; + dc:publisher ; + dc:date "2000-07-13"^^xsd:date . +bsbm-inst:ProductFeature69 + rdf:type bsbm:ProductFeature ; + rdfs:label "scorched deprecatingly" ; + rdfs:comment "jounced ethicalness fumbler cocomat tusked restamp reactance couped forebye antipacifists reavowing restamping copyholders hagride exclaimer rollovers annularity vermiculites seepages phycomycete winner julienne communicated cryptograph relapse inveteracy" ; + dc:publisher ; + dc:date "2000-07-02"^^xsd:date . +bsbm-inst:ProductFeature70 + rdf:type bsbm:ProductFeature ; + rdfs:label "gooder perpendiculars" ; + rdfs:comment "barometrograph desponded scepters microns condors wastier recoveries polyclinic wallahs polemist croaking abandoned lauders misdemeanor underlies scourges flatfooted breasts cranked piccalillis masterminded playfellows psalters varietally intoxicatedly squatness sugarier legalness gracile recount pangs palefaces lacerations tensiometer judgelike lutist tongueless reinsman asterisks engagement transoms lenience gunmetals neutrals fugging" ; + dc:publisher ; + dc:date "2000-07-19"^^xsd:date . +bsbm-inst:ProductFeature71 + rdf:type bsbm:ProductFeature ; + rdfs:label "boatbills multitudes" ; + rdfs:comment "caffeins arbor actinides hellgrammites succulents trollies sawed vouches instructed restraightened buttresses swagger darwinians deselects budgie emetically miscued miaou premises hepatize columnist understandingly sleeker lightering grandee contours despatcher coalholes technologist bast" ; + dc:publisher ; + dc:date "2000-07-07"^^xsd:date . +bsbm-inst:ProductFeature72 + rdf:type bsbm:ProductFeature ; + rdfs:label "unaccessible biter" ; + rdfs:comment "donative outfaces endear workhouse dom motorists frizzy lallygagged salinity broaching equivocates recapitulates collocated divinize genic maladministering envied nappy incentives salvages cloverleaf plainsmen librettos inflamers neutrons accelerates gormands elidible tutorship registership fieldpieces uncloak mktg culler preexisting pantomiming granaries yolked cynically raincoats" ; + dc:publisher ; + dc:date "2000-06-26"^^xsd:date . +bsbm-inst:ProductFeature73 + rdf:type bsbm:ProductFeature ; + rdfs:label "catenating throngs ataxy" ; + rdfs:comment "pulpits pods hankie lengthily guiltily flossier defamed peels underemphasized whited regulations disused drainpipe realignment generative droopiest reship elucidation clunkers renouncements browns workmaster" ; + dc:publisher ; + dc:date "2000-06-21"^^xsd:date . +bsbm-inst:ProductFeature74 + rdf:type bsbm:ProductFeature ; + rdfs:label "outstares ascriptions" ; + rdfs:comment "panaches disassociate stretched hopes subnormally xanthippe hemistich inquired stalled reallotting sulfating pastellist industrialist brayer secludedness tureens sullenly dissatisfied trifocals muonic preappearances superintend unrewarding purity intuitions" ; + dc:publisher ; + dc:date "2000-07-06"^^xsd:date . +bsbm-inst:ProductFeature75 + rdf:type bsbm:ProductFeature ; + rdfs:label "talkable conscienceless electromagnetical" ; + rdfs:comment "daysides contractors smilaxes miscognizant wheelwrights obtrusions blithering qui ritzy basing righteousness procathedrals getters hickeys showgirls warmths fistic rereads archaizing exscinding semisatirically appendectomies amendatory siglos lignins scrabbled grunters harmoniousness servings tossers bountifulness arisings exampling residually unavoidableness toadflaxes aggravates indissolubly quizzer catamount corrupted executer scalars replanning unartfulness enfeoffing whoresons decrial bumming auf" ; + dc:publisher ; + dc:date "2000-07-09"^^xsd:date . +bsbm-inst:ProductFeature76 + rdf:type bsbm:ProductFeature ; + rdfs:label "resifted boulimia ousels" ; + rdfs:comment "devein demurs babul underlined undemonstrably requestor keister oversold leafstalks obscurest noire whoso kindheartedly conjugators outgoing counteroffensives papuan pronunciations houris expediter subways maenad mammalians vugg dearths selfed ricracs larvicide" ; + dc:publisher ; + dc:date "2000-07-22"^^xsd:date . +bsbm-inst:ProductFeature77 + rdf:type bsbm:ProductFeature ; + rdfs:label "sneering smartens" ; + rdfs:comment "torpedoes rabidness oubliette indorser disorganize credentialed acidheads doorknobs hollower coupons lory introspective immunotherapies bouzoukis resistent remap republishing prioress craves infrangible reappearing haziest" ; + dc:publisher ; + dc:date "2000-06-24"^^xsd:date . +bsbm-inst:ProductFeature78 + rdf:type bsbm:ProductFeature ; + rdfs:label "motivated" ; + rdfs:comment "ranking sorels smoothest changelings miffing wassails avianize indigestibility grizzles carbines greathearted flaking osculates westwardly nonrelational secundogeniture preset cobnut coracle coynesses undenied modeller chimp jabber midwifed virginities forestay maiming reticula marshals outgoings chauvinism moonlights jackknifes ghostliest snacks halloa manumits djinny unpoetically skydived provence abstricts lapping contending placation insolubilities footed wanders" ; + dc:publisher ; + dc:date "2000-07-12"^^xsd:date . +bsbm-inst:ProductFeature79 + rdf:type bsbm:ProductFeature ; + rdfs:label "avulsions" ; + rdfs:comment "exceptionally spiked bewildered gamelan inhibitors brooding handsbreadth inconspicuously dysenteries ignorantness crocket pronunciamentos purchasers aeroliths belatedly levuloses menstruous tutorials ceded develope infundibular montessori inspires sleepings clubbiest coxwain ionicity chenilles copulative weakfish dp threads reengaging nonautomatic peon polychromatic" ; + dc:publisher ; + dc:date "2000-07-17"^^xsd:date . +bsbm-inst:ProductFeature80 + rdf:type bsbm:ProductFeature ; + rdfs:label "goldenly darkliest" ; + rdfs:comment "transepts santonins submissively reshaping unweighted bedded fiftieths overruled platies jolted gallied woodruffs unshaken misbestowing redecorated utilizations interpose bacons fissility falconers generalizing recompilation erythromycin incompetents aeons allergen explications tranquilizer circumstantiate improvises shrinking trigamist bowdlerize" ; + dc:publisher ; + dc:date "2000-06-23"^^xsd:date . +bsbm-inst:ProductFeature81 + rdf:type bsbm:ProductFeature ; + rdfs:label "isolator stoup cluttered" ; + rdfs:comment "cherubically gigged opprobriums deicidal setlines heels coronae subprincipals realizers herbs lappets ghettoizing asphaltum radioing lingeries orreries titillative unsoothed docking bargainer pastellists stoppled unkinder baksheeshes limiest profaners geologers aortic bullhorns refrangibilities epistlers receptions" ; + dc:publisher ; + dc:date "2000-07-15"^^xsd:date . +bsbm-inst:ProductFeature82 + rdf:type bsbm:ProductFeature ; + rdfs:label "horded voter" ; + rdfs:comment "deaconries embalms gastropod photographing draftable subspace grandaunt purist whiners subatomic strangulations steamboats colonially accepter primevally purgatives pees bibbery lianas fringing wealthiest holdups emissaries dwarfed seasonable cultures raved chemosensitive desugaring antiprohibition maguey flams yowed" ; + dc:publisher ; + dc:date "2000-07-15"^^xsd:date . +bsbm-inst:ProductFeature83 + rdf:type bsbm:ProductFeature ; + rdfs:label "utilizers improvisational" ; + rdfs:comment "serially meltons transportal precleans comps cheesier attestator undiscerning cognizers intra leadworks integrating hitches recollection felicitation logicizing plopping monomaniacs beckoner starters archbishopric patchiness replenished despatching" ; + dc:publisher ; + dc:date "2000-06-22"^^xsd:date . +bsbm-inst:ProductFeature84 + rdf:type bsbm:ProductFeature ; + rdfs:label "focalises" ; + rdfs:comment "imper cygnet gouges debauchee follies fifing tomographic insemination slubs lobbers kiter linage potentiometric nougat abducts underhanded shuddering unresponsive slaker rented dognaper touchups reconnect homologies revenued spermatocide liquefies aureus leans peplum remediless" ; + dc:publisher ; + dc:date "2000-06-24"^^xsd:date . +bsbm-inst:ProductFeature85 + rdf:type bsbm:ProductFeature ; + rdfs:label "theaters" ; + rdfs:comment "curvedly reawakenings tomcat inlets substantiations busheler spectrums blockers fidelis bootery bedlams playlet yummies lugged univ wholes crystals workmaster matutinally obliteration calumniator burlaps" ; + dc:publisher ; + dc:date "2000-07-11"^^xsd:date . +bsbm-inst:ProductFeature86 + rdf:type bsbm:ProductFeature ; + rdfs:label "quinces probed" ; + rdfs:comment "impenitence sicklier emblematical gonorrhea housecoats hymnals flourished abused mensas engulf indecencies thrashed hounds saccharinely cardamoms pusillanimous repriced humongous opuses puddlers alimenting coalescence eyeballs divagates engrossing animadverted devest margins corolla unacknowledged hagriding vitiators expediential harvests rafters fuddle airbrushes assures derails impaction diviners anilins aeriest smokers nazifies harkened record" ; + dc:publisher ; + dc:date "2000-06-20"^^xsd:date . +bsbm-inst:ProductFeature87 + rdf:type bsbm:ProductFeature ; + rdfs:label "meaningfulness" ; + rdfs:comment "lovers shahdom dissuasively weaves shakers thaws disparagement concertize lour compatibilities underplays hispanics chromosomic fiscally archaeological tippet recast maligning parachutists rainwater rumours casque tusche" ; + dc:publisher ; + dc:date "2000-07-07"^^xsd:date . +bsbm-inst:ProductFeature88 + rdf:type bsbm:ProductFeature ; + rdfs:label "refulgence sharpies amazing" ; + rdfs:comment "cycloidal equator anticlimactic repeatable orogeny misstatements aurum traipsing glim pumpernickel tercentennial defamation beefless ladlers federating sizing hesitancy dognap essences eroding tetrarchs logrolling bulletproofed stuffiest" ; + dc:publisher ; + dc:date "2000-07-02"^^xsd:date . +bsbm-inst:ProductFeature89 + rdf:type bsbm:ProductFeature ; + rdfs:label "factotum decompensates" ; + rdfs:comment "nonvocal zippier enate sticks snuffles coldish thermodynamics minxish muddier cashbox preventiveness acoin twelvemo lapsing protectorates lachrymation genuses impartibly neats spellbinding discombobulates shimmying trimarans antiquely bashers typebars" ; + dc:publisher ; + dc:date "2000-07-02"^^xsd:date . +bsbm-inst:ProductFeature90 + rdf:type bsbm:ProductFeature ; + rdfs:label "antidepressant" ; + rdfs:comment "markup suitcases overdesirous regnant enquired ruttier redfin basifies horridness fragrantly accomplis smuggest weaves playthings misdo overrefinement chasubles finis redbug dicks zombiisms eulogise merinos noneducational antienvironmentalism baloney puzzling burrowing inconceivabilities strangled solidarities noisome structured kilowatts thankless nitpicking microanalytical funerals foamers dogcatchers strapped vesicant helms obsoleting deprived" ; + dc:publisher ; + dc:date "2000-07-03"^^xsd:date . +bsbm-inst:ProductFeature91 + rdf:type bsbm:ProductFeature ; + rdfs:label "undisputed girthed" ; + rdfs:comment "whimsically nebbishes nonchalantly tangling anesthesiologist mattering earshots overstrict endues avatar puler yamen dabblers bulks welkins gerrymandering terminates terminating risus expostulation demarcation twangs notes meatiest pending horological archbishopric fabaceous unrighteous peacemaking deceiver incontrovertibly communicators corpulency centring masseurs moorier purgatorial retrievers dysenteric envoys jestings orchardman unauthenticated" ; + dc:publisher ; + dc:date "2000-06-27"^^xsd:date . +bsbm-inst:ProductFeature92 + rdf:type bsbm:ProductFeature ; + rdfs:label "airmails" ; + rdfs:comment "implacably flashlamps automatize centenaries tantalizes armigers rulable storefront dimities unweaves blabbing shrieked teleview messily dummied biorythmic mechanoreceptive folding undissolved supplicated photocomposes compacting" ; + dc:publisher ; + dc:date "2000-06-21"^^xsd:date . +bsbm-inst:ProductFeature93 + rdf:type bsbm:ProductFeature ; + rdfs:label "kanas tetherball" ; + rdfs:comment "sarge disassimilating solfege stretchier nonreactive porringer remarriage waviest archdiocesan fourteenths assaulters uptime contemns expertly cathouse boozers infiltrating unrule parented sealable batsmen crooks pallbearers uncross generalists nonpermeable shoat splotches grazable adversities clings flanker vacantly reintegrate shallower nonsubmissiveness ambidextrousness defoliated rejoicers seascape tensions persimmons intellectualizes conclusions wormish hahnium commercialism entree cabers legitimizes" ; + dc:publisher ; + dc:date "2000-06-21"^^xsd:date . +bsbm-inst:ProductFeature94 + rdf:type bsbm:ProductFeature ; + rdfs:label "plena sieurs obviating" ; + rdfs:comment "velum suitors savorous tethering hunted atherosclerotic monaurally vestries watermarks undraping dude pawers smarmy behooving settees monarchical spices truanted shimmeringly burrowers applicants calibration whittles viragoes designee notes" ; + dc:publisher ; + dc:date "2000-06-30"^^xsd:date . +bsbm-inst:ProductFeature95 + rdf:type bsbm:ProductFeature ; + rdfs:label "griefs devolutive" ; + rdfs:comment "biologically supernovas asexually racketiest refrigerated burlesqued outselling loverly totters unfurling striper skuas clouting cornucopian etcher adds impossibleness beseemed seemings charnels yammers agrology preppie queered baseboards defogger baas quirkiest ultraviolet bering reposed unassimilated rivalries jiggers portiered midyears overhaul repacify microsurgeons baptizer forzandos solidifies sleighers knickers giantism" ; + dc:publisher ; + dc:date "2000-06-28"^^xsd:date . +bsbm-inst:ProductFeature96 + rdf:type bsbm:ProductFeature ; + rdfs:label "priceless" ; + rdfs:comment "marcs rewelded upbraiding shims rivalling strived canzones blimps substance carpetbaggers ribbony confounds fumbling originally mirks differentiated airfoils hawkshaws cuttlebones essayist showering cheerless encroachment thermocurrent artworks explicated chastest cannonballing helled blackening dowelling simmers writher lushed funnier hipsters convictions idee states dehumidified" ; + dc:publisher ; + dc:date "2000-07-09"^^xsd:date . +bsbm-inst:ProductFeature97 + rdf:type bsbm:ProductFeature ; + rdfs:label "picadors" ; + rdfs:comment "subpartnership illustrations folderol monsieurs frequenters grosgrains birdcall remains circumstantiate fronds eisteddfod stentor friezes believably dextro romanticists retrofire resembled warrantors extents chantage anomy" ; + dc:publisher ; + dc:date "2000-07-03"^^xsd:date . +bsbm-inst:ProductFeature98 + rdf:type bsbm:ProductFeature ; + rdfs:label "senselessly" ; + rdfs:comment "bedquilt jagless allspices mobber certainly vitalizers stressed adopter styluses overcome cpl technicalness rabbinic telegraphs catchiest robes amebean levied bozo impeder envisioning unidiomatically trenchers teleports retouch hardener pulmonic lucrativeness loblollies gesticulation rulings mooniest nonallergenic aeronauts thuggeries rainmaker whirlier flannelet merriest litchis thruputs" ; + dc:publisher ; + dc:date "2000-07-07"^^xsd:date . +bsbm-inst:ProductFeature99 + rdf:type bsbm:ProductFeature ; + rdfs:label "bitterly perceptively patricides" ; + rdfs:comment "narcissists neatens retie woodcarvers sassily digitalization paella peppiness gloriam pryers vigorously biorythmic payout venturers milestones gladiatorial arterioscleroses domiciliated kipskins escapement kenneled cystitis roared ambassadorships corncobs marzipans argils lavenders unweakened ensilaged obfuscating joinings easements idolatries natron kenneled thatching suspensive centrifuges dilutor misconstructions carnies wincers entoiling commingles moans parodists mopingly dissemination" ; + dc:publisher ; + dc:date "2000-07-15"^^xsd:date . +bsbm-inst:ProductFeature100 + rdf:type bsbm:ProductFeature ; + rdfs:label "luridly" ; + rdfs:comment "tzitzis cootie bracero bridging fighting precollegiate instate cosmonaut solecize endogeny pylorus sightsees vulgarizing pioneered electrical southwesterly odorful patching quarterdecks feigners perjurer rampagers kilobits" ; + dc:publisher ; + dc:date "2000-07-02"^^xsd:date . +bsbm-inst:ProductFeature101 + rdf:type bsbm:ProductFeature ; + rdfs:label "innocenter paperboys markups" ; + rdfs:comment "keynoter discounts nocks leghorns algicide leachers coprocessors deceivers polit turbot muffling honorableness hardship raced fisher concordance gratifying porousness roentgens shinily exhaustless twitcher portion quam uploaded pastured chorizos precelebrations preanesthetic allotrope" ; + dc:publisher ; + dc:date "2000-07-10"^^xsd:date . +bsbm-inst:ProductFeature102 + rdf:type bsbm:ProductFeature ; + rdfs:label "manuevered" ; + rdfs:comment "interspersing accumulatively nighties castigations goldest aspirins beautifully unleavened cornify buttony lumpers intercapillary draped refutes bullocks delinquents martyry steeped nervings phantasmagoric impenitence fens maenades balloting cert disparaging chaffering vervains pyrotechnical randomization packaged roughing pepperiness unmingling maxilla dingdong factorship foresaw dreadfully hairwork" ; + dc:publisher ; + dc:date "2000-07-15"^^xsd:date . +bsbm-inst:ProductFeature103 + rdf:type bsbm:ProductFeature ; + rdfs:label "munches" ; + rdfs:comment "jiggling quackish syllables sagacities narcotically afghans nosier stupider yodeller ameliorative indistinctness asphaltic jaygees reconstruction hamburgs tonsuring denominates rexes filched tactlessly oversalting eruptional abruptly bioenergetics proportionality genevas halfheartedness charring sanely neighborhood birched questioner ethnicity hatting tailbacks suppositories laminator commentate friendliest geologies resolder disengaging bedded vivider swigger grazed fogyism bloomers discolor" ; + dc:publisher ; + dc:date "2000-06-20"^^xsd:date . +bsbm-inst:ProductFeature104 + rdf:type bsbm:ProductFeature ; + rdfs:label "hardener alpinism situational" ; + rdfs:comment "pressingly genuinely heretically holiest indicating overdraw demolitionist instrumentalities indicated rimmers nonalcoholic dishwashers reinstatement killer surroundings injudiciousness mirk amoebic pentagons snouting nabob clemently gyral sampler varlets ichorous mislaid deprecating haystacks greasers lightheaded contractible indoctrinations dragoman sulphate redrill fells fabricates markets oversides troopships candlewicks fruitions" ; + dc:publisher ; + dc:date "2000-07-16"^^xsd:date . +bsbm-inst:ProductFeature105 + rdf:type bsbm:ProductFeature ; + rdfs:label "ivied sailcloth fameless" ; + rdfs:comment "rubellas fainer retransmissions beguiled yelping overmatches tuberosity axseed mischances carafe squawkers glossier ephedra shewed jobbers standishes violater pajama lineages ogling trashed cockles unpeopling manubriums sacrificing bellybutton celibacies colonels prophets fineable tracts instructs coarseness shackles transistors lanciers holidaying divesting demeanors buys slalomed" ; + dc:publisher ; + dc:date "2000-07-10"^^xsd:date . +bsbm-inst:ProductFeature106 + rdf:type bsbm:ProductFeature ; + rdfs:label "gustatory masticatory" ; + rdfs:comment "lories asylums accusers whelping thermometry inculpate creepie canasta handbills soundless mangroves loggias persuaded gagers doggerel encephalogram whipsawing maledicted movables sequencings distasted documenters quirking mussy ichthyologists mealworms dirtier evicts gigantism slimiest milldams neurophysiological trowsers heroize irruptions sandlotter prosperously" ; + dc:publisher ; + dc:date "2000-06-20"^^xsd:date . +bsbm-inst:ProductFeature107 + rdf:type bsbm:ProductFeature ; + rdfs:label "oink" ; + rdfs:comment "centralizing libellers underexposes circulator flagellations subtotalling reels illness vaultier quads departmental cupped limpers antiinsurrectionists outfacing kwhr dissimulated inciters sportily circumstantiation scrimping bristles lines piezochemistry pyloruses" ; + dc:publisher ; + dc:date "2000-07-05"^^xsd:date . +bsbm-inst:ProductFeature108 + rdf:type bsbm:ProductFeature ; + rdfs:label "discontinuations brains favoring" ; + rdfs:comment "tempting headpiece overwound temporizer barbarianism toeplates unforgiven celebration trekkers burweed bravest teacake pursuance inhering ninnyish pampean toastmistresses overbids implausibly proctoscopically" ; + dc:publisher ; + dc:date "2000-07-08"^^xsd:date . +bsbm-inst:ProductFeature109 + rdf:type bsbm:ProductFeature ; + rdfs:label "peered" ; + rdfs:comment "unfrock untruthful stomper surcharging strictly morganatic elicitors quadruplications spenders kickstands barrenness ascenders perforation magistery denominating monogamists serials elands trilled illegitimation unhesitatingly aweless notarial" ; + dc:publisher ; + dc:date "2000-07-20"^^xsd:date . +bsbm-inst:ProductFeature110 + rdf:type bsbm:ProductFeature ; + rdfs:label "givens vedanta" ; + rdfs:comment "vistas nags rathskellers grasped bowleg prelatic prevues crumps cyborg peninsular reconfirmations mallets intellects kebabs rebound crimes wheezers editorially verges larvas bakeries lazarettos storeyed reascent overassured transliteration unmuzzle attorneys paunchier overinclines mermen challises trucklers imitation pavlovian whitewalls snippets faller ombre lockless cynosure tricuspid trustwoman redemonstrated parceling trashed tollways" ; + dc:publisher ; + dc:date "2000-07-10"^^xsd:date . +bsbm-inst:ProductFeature111 + rdf:type bsbm:ProductFeature ; + rdfs:label "nubbins bloodsucking purloiners" ; + rdfs:comment "hawses priced legalistic inhospitality abandons straightedge debriefings cerebration paddocks bravely marihuana safflower gesticulation blandest glaringly turnabouts teaspoonsful stretchable electees weensiest mannerly abscam abstinence hypodermically concealed gweducks parodies lairds pipeful conducers planters kakas neptunian cufflinks dandyish openheartedness kasha increased foozlers bazooka philosophized fructifying inviters demonstrative" ; + dc:publisher ; + dc:date "2000-07-06"^^xsd:date . +bsbm-inst:ProductFeature112 + rdf:type bsbm:ProductFeature ; + rdfs:label "passageways moratoriums" ; + rdfs:comment "helixes defiles apotheoses relentlessly mountaintops resituate slimmest exotics chorused hypnotize acidhead zincky supporters unenterprising mangler embezzling overeducating preventives lichee platypuses imagination speared cloudbursts constellation ensnarements depreciators prettification golliwogs undesired consists waggeries stiffeners reactive quells typographically allays unsought miscounted" ; + dc:publisher ; + dc:date "2000-07-21"^^xsd:date . +bsbm-inst:ProductFeature113 + rdf:type bsbm:ProductFeature ; + rdfs:label "prestigiously" ; + rdfs:comment "nullifications elflock contortionists capablest lucubrate ablated entrenches gaslit answerability churl aortas rackers novices hamburgers nonperishable uprooters vitally contentiousness indiscrete tramming whiteners firebombed transmits wrathier plebes cabbalahs tortured deflation flukes darneder dyslectic ritzier" ; + dc:publisher ; + dc:date "2000-06-22"^^xsd:date . +bsbm-inst:ProductFeature114 + rdf:type bsbm:ProductFeature ; + rdfs:label "cummers demounts" ; + rdfs:comment "singing momism converses poliomyelitic shivas marrowed ditchless restructured maned selfness discerners abundances jeerers unconvincingly nonsuccessiveness adventuress antiquing fluidly nonaggression preexamining docilities spiniest jazziness arables intensifications weirder emasculation taphole raffling bespoken enneads goldener ameer memorably bamboozled thiabendazole pining genially maypole handcrafting wintergreens athletically didies bolshevists mourning enslaved micromillimeter cerebri emulatively" ; + dc:publisher ; + dc:date "2000-07-21"^^xsd:date . +bsbm-inst:ProductFeature115 + rdf:type bsbm:ProductFeature ; + rdfs:label "upwardly showiest thorned" ; + rdfs:comment "galoshed soughed relighting primero rebuked waterlogging apartmental consequentially eely smokeless crumples whiners nisei noncivilized nonexistence manitou strippers topographers anticipation motorships mitigatory packers stabilize freshens zombis invisibility" ; + dc:publisher ; + dc:date "2000-06-26"^^xsd:date . +bsbm-inst:ProductFeature116 + rdf:type bsbm:ProductFeature ; + rdfs:label "sizzlers alveolate kaftans" ; + rdfs:comment "reoccurred submicroscopic latchkey visaed lesbians resole wrings superposition campaigns gifting lins copal reawoke gaffes boosting deductibility balsamic entices discolored pinchpenny chasmed" ; + dc:publisher ; + dc:date "2000-06-20"^^xsd:date . +bsbm-inst:ProductFeature117 + rdf:type bsbm:ProductFeature ; + rdfs:label "tangram upsilons" ; + rdfs:comment "hatefulness impiously scramming fiberizes swarthiness renege misrepresented petiole holist reconsolidations mukluks hypocritically busiest gulpers cherishes pleasureful phonily meaningless sotted cottoned empaling larking setlines cubicity ennead guaranis quietisms preconceive maligners fluxed swamps shuteye nonsensitive bedouin bailouts reaccustomed dramamine reloader trampoliners workaholism harries gauziness singing" ; + dc:publisher ; + dc:date "2000-07-19"^^xsd:date . +bsbm-inst:ProductFeature118 + rdf:type bsbm:ProductFeature ; + rdfs:label "aureolas plaice perambulate" ; + rdfs:comment "impregnations loggias bicyclists regurgitated presbyope breakfasting pollutants reinstating encephalography robotization advisement hereditariness unsung giggling eczematous demeans uncashed newsiest rantingly bulgarians treasonably inchoate tenpins squabbling" ; + dc:publisher ; + dc:date "2000-06-28"^^xsd:date . +bsbm-inst:ProductFeature119 + rdf:type bsbm:ProductFeature ; + rdfs:label "yukking quaintness" ; + rdfs:comment "sailcloth boffins oscars stapedes teacupful paleocene mothproof malarious sixteenths inwards plausibility rooted bdrm sarod forecloses introducible cocain equivoke aromatize reaccompanies election" ; + dc:publisher ; + dc:date "2000-06-22"^^xsd:date . +bsbm-inst:ProductFeature120 + rdf:type bsbm:ProductFeature ; + rdfs:label "imbricate vapourers" ; + rdfs:comment "unpinned haled constructed mistiest reestablishing hoofbeat poltroon treasons spavined veilings chemism circuity hemlocks yeshivah overwilling egalitarians bullies toper observably saclike octopuses opted stipulator hoosegows outputted confuter pitiably rhetors fledges jocosely parasiticide duodenum hibernator placing prochurch belows collaborative whipworms sanctifier slummiest diaeresis baubles subtleness nebulise" ; + dc:publisher ; + dc:date "2000-07-16"^^xsd:date . +bsbm-inst:ProductFeature121 + rdf:type bsbm:ProductFeature ; + rdfs:label "chainmen pieing" ; + rdfs:comment "enjoyer odiousness ascertainment porks mutineered chuckler paganisms bicarb hadjee sonatinas passions profuseness trampled uncloaked dentures synchro niggards corporately sawboneses vicinage dams simplifier nonrepresentational expediently bedcovers dakotan halavahs remora nonrecurrent unsent assuror petcocks sequenced gusseted unartistic mayoresses blatter scandaling bristly kindler flirtingly redeye screwer bubbletops littery improbability" ; + dc:publisher ; + dc:date "2000-07-06"^^xsd:date . +bsbm-inst:ProductFeature122 + rdf:type bsbm:ProductFeature ; + rdfs:label "mesonic aphrodisia climbers" ; + rdfs:comment "dunghill assonances punctiliousness bushman grainer extras evener reequipped appealingly cursers impassioned bunkhouses satirizes hyperbolas offensively bashers achenes fusel imaginal debs rushing housewarming desensitizing bearably dimmers civvies forestays tastelessly incorporations grounds drawers gibbetted melts" ; + dc:publisher ; + dc:date "2000-06-20"^^xsd:date . +bsbm-inst:ProductFeature123 + rdf:type bsbm:ProductFeature ; + rdfs:label "rappelling frequency" ; + rdfs:comment "commodores hundredths nebs repave killjoys weariest cannonism henrys featheredge replenisher magniloquence retypes gulfy bobtailed graduators wicked veluring ginning paced autoimmunization occlusal spright hooraying intonating wildwood broadness pharyngectomies outpatient monsignors uncorroborated knells catalos meanderer dwindling retransferring employability hellcats ruble commingling shoestrings recompensatory selectors hoopster bahamians" ; + dc:publisher ; + dc:date "2000-07-03"^^xsd:date . +bsbm-inst:ProductFeature124 + rdf:type bsbm:ProductFeature ; + rdfs:label "toggles containments refastens" ; + rdfs:comment "truest unascertainable taiwanese skullduggeries canonizes unspeakable tautologies nondiscriminatory dispatchers construction inhabitress vasodilatation devilments fugally malfunctions manginess shoving awless guars muddied tenets gunwale baalism plumps sidlers manipulated wastable bibberies outfielded inspectorial tolerably quasars ataxia battlements reverifying pastimes mukluk writers coted revisiting invoker counterrevolutions" ; + dc:publisher ; + dc:date "2000-07-16"^^xsd:date . +bsbm-inst:ProductFeature125 + rdf:type bsbm:ProductFeature ; + rdfs:label "dentins" ; + rdfs:comment "stellas thoracic empathizing pomegranates entangling scouter femininity antichrist untruthfulness pucks casehardening botcher headbands moory bakes ourangs awkwardest buzzers medicks impenetrably inheritress communicatively" ; + dc:publisher ; + dc:date "2000-07-08"^^xsd:date . +bsbm-inst:ProductFeature126 + rdf:type bsbm:ProductFeature ; + rdfs:label "agates cleansers accelerative" ; + rdfs:comment "notation caramelizes legalized storefronts ungallantly tamer suspended extorting enchant lilliputians trappings germanized sexagenarians nutritiousness jargonize lunas mischief pluperfects ructions subverts copepods syncopes planetoids" ; + dc:publisher ; + dc:date "2000-07-11"^^xsd:date . +bsbm-inst:ProductFeature127 + rdf:type bsbm:ProductFeature ; + rdfs:label "stepparents submental unduly" ; + rdfs:comment "valorized freightyard fatherhood quackish orisons underfinances civilized centuple perverted psychedelically tuckets petitioner ossea delegacies aquiline dared percussor tariffing kirtled bonos baptisteries terrines worshipping hatchways partitions factorage nonbreakable" ; + dc:publisher ; + dc:date "2000-07-16"^^xsd:date . +bsbm-inst:ProductFeature128 + rdf:type bsbm:ProductFeature ; + rdfs:label "betted" ; + rdfs:comment "surplices lave standings velds samariums bleacher systematize chaconnes tilers eyrie gladiatorial appliqued shedable laserdisks mfd seducible buns freethinking strayers degauss airwomen glycemia vagrancy floodwater brachydactylous candies resummoning floatiest underexpose smidgen extremity uprootals panicled ormolus octangle persisters sawing pulses shellfish snowfalls reverer trove tenting genocide imprinters nonsecret" ; + dc:publisher ; + dc:date "2000-07-21"^^xsd:date . +bsbm-inst:ProductFeature129 + rdf:type bsbm:ProductFeature ; + rdfs:label "winterers discourages strutted" ; + rdfs:comment "habitude interdictor deedless serenaded abolitionary carboyed obstetrically scraggier canard ratification viticulture privileges enplaned montaged toothiest recompounded sappiness overspends discovering buttonholer bezils sociologic extortionists geegaw ontologies powders bookshops loins hypoderm adulteresses elicitors nitrated timeserver clifts tasked ochery privities" ; + dc:publisher ; + dc:date "2000-06-26"^^xsd:date . +bsbm-inst:ProductFeature130 + rdf:type bsbm:ProductFeature ; + rdfs:label "warbles missal" ; + rdfs:comment "spreadsheets conditionality physics boarders blitheness yowling tressiest foolery liabilities bordels poodles lyes cantankerously lambed ripened tomtit flypapers beholders plumpness orrery regicide libbers bacchanal costumiers sinner humanest algerians reappearance reminiscence comped" ; + dc:publisher ; + dc:date "2000-06-27"^^xsd:date . +bsbm-inst:ProductFeature131 + rdf:type bsbm:ProductFeature ; + rdfs:label "ophthalmoscopes awed" ; + rdfs:comment "massless durn rastafarian sassily bowknots durns ekistics copped cooperatively climatotherapies darkrooms provocations dogwatch schussing undone acclaimer clonking presifted forgives scholarships cesarian siameses propitiatory autoclaves busyness gladiate areoles shedder selvaged cerebric" ; + dc:publisher ; + dc:date "2000-06-21"^^xsd:date . +bsbm-inst:ProductFeature132 + rdf:type bsbm:ProductFeature ; + rdfs:label "argentum mobcaps antepast" ; + rdfs:comment "scatted outworkers debouched knave perplexed paladin petters barbarities sogginess fangless shoptalk wakening astrolabe mistrusting overbuy telephotographic mikveh lockjaw gravitons durns earthiness psychotropic pranksters overtrained recapitulate sublease introducers pastilles eddying nonconforming scorify frankly cantors griming prettier accruals nonselective suavest impoverishment reliers individualize" ; + dc:publisher ; + dc:date "2000-06-22"^^xsd:date . +bsbm-inst:ProductFeature133 + rdf:type bsbm:ProductFeature ; + rdfs:label "heavily apocalyptical" ; + rdfs:comment "centralizers lymphocytes pertussis kerbs scorcher implored rusks waspishly shutter metalist unreadiest flatterers predigested mercerize sightly venular slyest aridity detoxication ribby histaminic unstrained understands artefact mapper mutualism educations stargazing jovially underlaid releasible needier probation" ; + dc:publisher ; + dc:date "2000-07-17"^^xsd:date . +bsbm-inst:ProductFeature134 + rdf:type bsbm:ProductFeature ; + rdfs:label "salvable biographies" ; + rdfs:comment "monology gendarmes unseeingly cajaputs parcelling convertibles belcher promontory arachnids outbids bucketed apperceptive metamorphisms manly imaginably sewed heartwarming squawks legit psychically discharger louts ropable playpen pallette encourage intimidates footed overmatch bacteriophage overcompetitive cantering camphorates underemphasized inclosers" ; + dc:publisher ; + dc:date "2000-06-20"^^xsd:date . +bsbm-inst:ProductFeature135 + rdf:type bsbm:ProductFeature ; + rdfs:label "yodeller abstractness coving" ; + rdfs:comment "forceless formulators hardcase hipshot lobotomize overclouded trameled triaxial kaputt broidery comfier wildcatting wirable misspend oscillogram corroborating cuffs editresses goldbricks irradiation gantries elephants junkers observer brats sennits regilded tunisians tach reverifies jackets sixthly rememberer catguts drylot mainlining gibbetted biodegradable izar eardrops righto unleveling reassessment torpedoing" ; + dc:publisher ; + dc:date "2000-06-20"^^xsd:date . +bsbm-inst:ProductFeature136 + rdf:type bsbm:ProductFeature ; + rdfs:label "reabandons rotifers" ; + rdfs:comment "horrific muggins looney patois peseta truthfulness forewoman tokes fleabites blamed serigraph hoed triceratopses hefter quarrellers cantharides essentials idem dispensing isled" ; + dc:publisher ; + dc:date "2000-06-26"^^xsd:date . +bsbm-inst:ProductFeature137 + rdf:type bsbm:ProductFeature ; + rdfs:label "demagnetize guessing maxillae" ; + rdfs:comment "dunderpates herdsmen jockeyed speckled shrined yearned excusableness scatologic peacoats horniest mens depreciatively panoramically foldouts recommenders profferers parroters nails bruiter trapt marrer unflaggingly cradled enfevers lustiest inlayers cozier stockjobbing nostalgically deference squelched lacers acanthuses juvenal" ; + dc:publisher ; + dc:date "2000-07-18"^^xsd:date . +bsbm-inst:ProductFeature138 + rdf:type bsbm:ProductFeature ; + rdfs:label "bootstraps" ; + rdfs:comment "accordable clandestinity protoplasmal logrolling volatilizing panicking malodors cosmetically migraines tetanizes winchers tablespoonsful biassing yahooism gypsydom ameliorating unclean cupronickel balladry pavane captors" ; + dc:publisher ; + dc:date "2000-06-22"^^xsd:date . +bsbm-inst:ProductFeature139 + rdf:type bsbm:ProductFeature ; + rdfs:label "vies lightest subcivilizations" ; + rdfs:comment "apiarist mineralization challahs dethroning redcaps tethered anomic expellers pettifoggers cods nonresidential meeds muddier foreigner fowled betokens distills snowbound lascars resound gombo jetsom shambling wides generosities jigger churching retouching farmstead bbl flemings" ; + dc:publisher ; + dc:date "2000-07-21"^^xsd:date . +bsbm-inst:ProductFeature140 + rdf:type bsbm:ProductFeature ; + rdfs:label "queerest stroboscopes" ; + rdfs:comment "damning calorically cleanser indorsees tantalizer primings forehanded creditabilities spaller nondevelopment rememberable intersections maisonettes oversophisticated plateaued abacuses magnesias haciendas materfamilias cowers taggers attestator updated nonforfeiture luxations daunting inlier spicas hippies sublevels piecer egotists toupees awes flamed slaving adapting branchiest breathlessly harmonizers proprietorship masculinity alimentary eclectics bumpkins caryatids egos troubling plenipotentiaries unspoiled" ; + dc:publisher ; + dc:date "2000-07-01"^^xsd:date . +bsbm-inst:ProductFeature141 + rdf:type bsbm:ProductFeature ; + rdfs:label "churchlier" ; + rdfs:comment "woodcocks infolder bassetting supplicating truckage swarmed gangers duelers emetic silicoses selectus unpuckered blazers efficiency teethes mutants pitchier overanalyze abhors gorier tsaritza cannibalized heterophile cento recidivous drumming businesses impalers balusters delightfulness lockable censer thymier walleyes micrology estivated proliferation subdepot apteryxes" ; + dc:publisher ; + dc:date "2000-07-10"^^xsd:date . +bsbm-inst:ProductFeature142 + rdf:type bsbm:ProductFeature ; + rdfs:label "electromagnetical overachiever entoiling" ; + rdfs:comment "dendroid insurrections interacademic incarceration millirems benzoins garnering moues ratified cannulae recirculating applicatively reacclimates sacked woodbines levitating necking rickey flavorings beakers unforseen suctions seasoning videocassette cushy canners potful grownups" ; + dc:publisher ; + dc:date "2000-07-01"^^xsd:date . +bsbm-inst:ProductFeature143 + rdf:type bsbm:ProductFeature ; + rdfs:label "pleasantries steamering nouveaux" ; + rdfs:comment "uncivilized whits handcrafting fates reformulated opaquing therapeutically promisors administrating earworm carved smeltery cantankerous plottages hydrotherapeutically aerobics sibylic newer prologuing lookups psychologically pickwickian gustily passels matcher eternized cloggy gushier anthracitic preadapting" ; + dc:publisher ; + dc:date "2000-07-08"^^xsd:date . +bsbm-inst:ProductFeature144 + rdf:type bsbm:ProductFeature ; + rdfs:label "nonparliamentary" ; + rdfs:comment "stabled punctilio deliciously scintilla mouser deplane nonparametric memos sarcophaguses bummed depicted permissibleness vaccinated restate puffing flummoxes nonequals reexperience begets policyholder serviettes indecisively" ; + dc:publisher ; + dc:date "2000-07-06"^^xsd:date . +bsbm-inst:ProductFeature145 + rdf:type bsbm:ProductFeature ; + rdfs:label "loaches sciences daunter" ; + rdfs:comment "sanitating husbandlike paperer terrarium nonmilitant booking devotional shoreless galileo motivities riles stretchiest toughly curriers desecrating navigators thanatology eveners barns decided futuristic colds knowing noised cochleae beachiest borings irks shakily emendations localite utilise triumvir iffier pithecanthropus feedable wists overcrowds praos unsanctified miffy gadgetries honeybun candidnesses contrapuntal leastwise uneconomical signalized" ; + dc:publisher ; + dc:date "2000-07-07"^^xsd:date . +bsbm-inst:ProductFeature146 + rdf:type bsbm:ProductFeature ; + rdfs:label "amu egos" ; + rdfs:comment "commingles wagering tennesseans caging testifiers cactuses nippier uncontrolled dapperer oversaw withholder scraggier abysms noninjurious vughs chitlins neckerchiefs unobserving banishment bicultural toughen dressier smugger forlorner commissars reproval blackballed heroics untrimmed kathartic unfilial immaculately hurrays jazzed rooty telepathies subjects welcomed catalyze glorifiers breakthroughs universals wincers procurals" ; + dc:publisher ; + dc:date "2000-07-03"^^xsd:date . +bsbm-inst:ProductFeature147 + rdf:type bsbm:ProductFeature ; + rdfs:label "espanoles" ; + rdfs:comment "semifictional staved wigwag danging substitutive typesetters immaterially croupy spreadsheet embalming footbaths preamplifier signories rooking backfields drapeable bonbons groper abnormality redevelopment recopies" ; + dc:publisher ; + dc:date "2000-07-04"^^xsd:date . +bsbm-inst:ProductFeature148 + rdf:type bsbm:ProductFeature ; + rdfs:label "gadgeteers glaceed noninductive" ; + rdfs:comment "askant rearming sniping surceased zings blighted toyotas whifflers ideograph unraised desirability provides breakfront laboriously roommates baubles overkilled ignifying editorialization terminated" ; + dc:publisher ; + dc:date "2000-07-04"^^xsd:date . +bsbm-inst:ProductFeature149 + rdf:type bsbm:ProductFeature ; + rdfs:label "daylighted dognapping" ; + rdfs:comment "ideation soldering faraway lurked fertilizer phrenetic interpreter intravenously curacy gravest deluders applicative forego sharps dislocations advertisements trolleyed foreground licencing tarbush assaulters threatened godowns befooling marseillaise spillway transmissive motivation tempeh rodder neuropsychiatry distracting shrouds miniskirt outfielder wishing snipper facetted interlibrary shoppes raised bilateralism uniques edgeways unsnarl inclusiveness" ; + dc:publisher ; + dc:date "2000-06-29"^^xsd:date . +bsbm-inst:ProductFeature150 + rdf:type bsbm:ProductFeature ; + rdfs:label "noodles" ; + rdfs:comment "sectional dewiness embrocations flashlamps playact navaho decommissions uniter unresisting subdebutantes unsupervised individuality psalmists dehydrogenated hackies endless relevancies quaggier watercolors helpless muchness miraculously thalliums tumbling impersonator armorer irresolutely gritted kinking undergraduate styluses universalizing slopped caduceus saddlebags interrogable directness stickers surveys urological gastropods bort thermites exquisitely" ; + dc:publisher ; + dc:date "2000-07-16"^^xsd:date . +bsbm-inst:ProductFeature151 + rdf:type bsbm:ProductFeature ; + rdfs:label "nourishes abortionist" ; + rdfs:comment "presoaking shyers silhouettes reconsolidation mannequins expiatory adorning gomorrah smellers alibied insulated nitrifies intertidal disinclining scooter vatful unblock filching germinates limping diskettes reassortments anodize foins nonproprietary quanted stalagmite mindlessly unease teammates gleaming setout brokerages centillion persuader cogitation senilely pigmenting larboards seeps cymbalers racialism overgeneralizing weals stalkiest cannabism" ; + dc:publisher ; + dc:date "2000-06-27"^^xsd:date . +bsbm-inst:ProductFeature152 + rdf:type bsbm:ProductFeature ; + rdfs:label "seppukus harangues orthoepist" ; + rdfs:comment "elastins faintheartedly beautifying boniness swaybacks sobber progressiveness sacrilegiously shammed scoundrels defoliation porticoes freezers fellowship sleekier endue prorestoration naturalists deerstalkers homy roscoes gamboled mousily arranges" ; + dc:publisher ; + dc:date "2000-07-17"^^xsd:date . +bsbm-inst:ProductFeature153 + rdf:type bsbm:ProductFeature ; + rdfs:label "brats searing nonplusing" ; + rdfs:comment "climaxing ecliptics decedents trouts browsed renovates founded gemmily flexing antihistamines manholes freshener unmingled scandaled undertaking emblazoning harrumph signorina phosphorous moxie duelists slobbery unfertilized purifier vibraharps mesmerizes replication wasts buffaloes lithographers amuser finally disquiet magyars scalpel" ; + dc:publisher ; + dc:date "2000-06-27"^^xsd:date . +bsbm-inst:ProductFeature154 + rdf:type bsbm:ProductFeature ; + rdfs:label "smokepot wittily" ; + rdfs:comment "neurotics oppositionists stylizers reglazes pinesap machinized enigmatically couldest tangerines unallayed beneficiate chequering feinschmecker ovoidal stipes deloused bringeth bartending princelier colorblind hothouses hesitating leathered juicer expediter airproofed piranhas cleanly siecle inveterately reefers sandmen exobiological freemasons certifiably akimbo logjams interrogatorily vellication lawns gaging" ; + dc:publisher ; + dc:date "2000-07-04"^^xsd:date . +bsbm-inst:ProductFeature155 + rdf:type bsbm:ProductFeature ; + rdfs:label "misrepresentations convection matrilinearly" ; + rdfs:comment "personalizes scalers cochleae wryly inconsiderately conservatively twinged overcompensating sherifs upgrades biller mollifiers weensier simoleon stomachical iodized forces measurers restaurateurs razzing precollege hearting inconclusively monorail regimental topless reprobation favouring ninny umbrellas droller bibs hah misdoer moonlets stiffening amtracks riptide aspiration pinkies upbeats whitening strophes unquestionable additives outsmarting" ; + dc:publisher ; + dc:date "2000-07-10"^^xsd:date . +bsbm-inst:ProductFeature156 + rdf:type bsbm:ProductFeature ; + rdfs:label "scrabbler" ; + rdfs:comment "lacerating cantonal unaired bleached surds canalizations feeblemindedness unshackled tartest captivation backstretches turtler suttees scaldic bouts reinvesting boisterously underpants shamanic kiddoes ovulatory" ; + dc:publisher ; + dc:date "2000-07-13"^^xsd:date . +bsbm-inst:ProductFeature157 + rdf:type bsbm:ProductFeature ; + rdfs:label "stimulatingly forkedly" ; + rdfs:comment "workrooms misfire methinks supervising copperplate wakers apers unartistic bulked frisbee accurst prewarmed torchbearer matchable jointly reapportioning salmonellas figurers besmirchers dimply eternities heterogeneousness" ; + dc:publisher ; + dc:date "2000-06-29"^^xsd:date . +bsbm-inst:ProductFeature158 + rdf:type bsbm:ProductFeature ; + rdfs:label "wheelman" ; + rdfs:comment "pealing neurone quadriennium inheritress quippish constitutes mousse pasturing overreacted boatbill promisingly nincompoops neurotransmitters subkingdom notifier immaterially machineable flytraps cervicitis outrun lacquerer accordingly trews anthologist firehalls flashbulbs hydrophones modifiableness fobs passed safeguards orig subgum brittling subordinated bloodstained miscuing cabbala proselyting interventions graved torturous orthopedists insubordination breeziness" ; + dc:publisher ; + dc:date "2000-06-27"^^xsd:date . +bsbm-inst:ProductFeature159 + rdf:type bsbm:ProductFeature ; + rdfs:label "cedes unmelodious" ; + rdfs:comment "usherettes documents directors cliquey battlement henbit intangibles culpability outstaring acceptance tanagers wagoners rots sacksful freeload pipefuls reseed recompute organist pillowing debark fearers antivivisectionists envenomization misrepresentation nobler klystrons incommunicably musketeer entwists predawn frizzier" ; + dc:publisher ; + dc:date "2000-07-21"^^xsd:date . +bsbm-inst:ProductFeature160 + rdf:type bsbm:ProductFeature ; + rdfs:label "coppering" ; + rdfs:comment "subdepartmental moistens relocating polarization blanched navahos capabler cumulative lankest heartache gaud fortunateness sterilization ministration perpetrates portmanteaux disobedient blanketing refunds pampered subparts coverer sectoring oftest nerves shouter rifely goutiness corniness devices experiments engrams malpresentation hoodooed provinces doublethink" ; + dc:publisher ; + dc:date "2000-07-10"^^xsd:date . +bsbm-inst:ProductFeature161 + rdf:type bsbm:ProductFeature ; + rdfs:label "uraniums transplanted chromiums" ; + rdfs:comment "intermeshes nudities rubying indenter irretrievably disadvantage shopgirl mastoid feverishly enervated indulgences flotsams unconsciousness reveille intelligibly miladis complexes volution chlorotic chawers slashes slenderness subliminally nonmaterial figurations promoted dresses gossips" ; + dc:publisher ; + dc:date "2000-07-10"^^xsd:date . +bsbm-inst:ProductFeature162 + rdf:type bsbm:ProductFeature ; + rdfs:label "graciousness" ; + rdfs:comment "frontages dingles demonology unconscientious resisted merciless assorting thiamines fey crinkly advisatory judicializing bits extremely misclassify icefalls nonviable perambulates raveller posing aggregates verminously reclothing insetters uncannily decelerator captives unionist pantomimists understaffed emasculators" ; + dc:publisher ; + dc:date "2000-07-04"^^xsd:date . +bsbm-inst:ProductFeature163 + rdf:type bsbm:ProductFeature ; + rdfs:label "flunkeys knave dregs" ; + rdfs:comment "vociferating encloser thumbtacking deactivator paternally benthal retinues disaffected hectometer mischief microvasculature exports ageless philologists lingier accredited afeared topful bulbed scantest" ; + dc:publisher ; + dc:date "2000-06-24"^^xsd:date . +bsbm-inst:ProductFeature164 + rdf:type bsbm:ProductFeature ; + rdfs:label "feminists cypriote" ; + rdfs:comment "landholders visualizes disreputably editorializes si seraphs timpani toaster cobbler tamper crosstie multifunction mummer bribers rewrites joggling metaphorical outrank yodeler comedians towelings busier naris reunion ineducability indulgence humphs impinging grammatical hangers vibratos interregnal unrepresented extensors crispen complexing feaze musing asphyxia impetuously scuppers construer" ; + dc:publisher ; + dc:date "2000-07-05"^^xsd:date . +bsbm-inst:ProductFeature165 + rdf:type bsbm:ProductFeature ; + rdfs:label "homerooms" ; + rdfs:comment "bays outgunned slatting nonprofitable ovule poltroonery strolls legibleness sumatrans lectureships phasing hoariest reconsecrate peins ensconced intellectually corpulences zeds animuses feministic recreational matutinally resituates skilful recipients" ; + dc:publisher ; + dc:date "2000-06-28"^^xsd:date . +bsbm-inst:ProductFeature166 + rdf:type bsbm:ProductFeature ; + rdfs:label "mountebanks kneading hellholes" ; + rdfs:comment "aroids wellsite zeals ejects intransigently overindulgence titrators handicrafts squintier venerably ultimas mustachioed excrements frothily avidness skewed queuer mystified affidavits telecasted undernourishment execrator" ; + dc:publisher ; + dc:date "2000-07-10"^^xsd:date . +bsbm-inst:ProductFeature167 + rdf:type bsbm:ProductFeature ; + rdfs:label "thanking worshippers bespattered" ; + rdfs:comment "regain ectoplasm mistbow batty tetanized ladanum matrimonially sweatier symphonies quids cowardly hydrating lintiest stowable circumcisions overshoes unquote shaker chairmanships dreamful chias stover forefend emergents visiting abandoning" ; + dc:publisher ; + dc:date "2000-07-12"^^xsd:date . +bsbm-inst:ProductFeature168 + rdf:type bsbm:ProductFeature ; + rdfs:label "penknives reabandoned vitalities" ; + rdfs:comment "bursal botcher serenes subtracts unenterprising chards dispirited lullabies downgrades composers handicrafts destructors retards allium decimalization oared going regrooves forewarning conveyers hawaiians resew passing ameliorating elastics taximen colorers edicts sweetbread unflappable wavering cerecloth turbulency inflows bayoneting demulcents increasingly hake eland soups sensualness" ; + dc:publisher ; + dc:date "2000-06-29"^^xsd:date . +bsbm-inst:ProductFeature169 + rdf:type bsbm:ProductFeature ; + rdfs:label "resettled silkier parve" ; + rdfs:comment "jalopies refracture oatmeals stagey drubbings repertoires assagai mangler sandbagged leagues negatively slushes dolomites gynecologist terseness carbonation persimmons overcoming alighted journalists yakking revetment persuades bibberies bitable" ; + dc:publisher ; + dc:date "2000-07-15"^^xsd:date . +bsbm-inst:ProductFeature170 + rdf:type bsbm:ProductFeature ; + rdfs:label "lymphocytes redecorates stuccowork" ; + rdfs:comment "unsaddled flouncy unaccompanied ravels stammels modernizes megacycles vacantly impregnated offshoots falconers backfired dewing unassailable capework suets flooders defaces favorer semitists gradualism lyrated reaccustoms decentralize intersperses ferreting microanalyses punctuating altering inflatable differentiations reintegrate sinicized keesters faltering lexicographers pussycats shutterbug chias laten suffragans subminiature openheartedly tinwares lodicules limits seigneur reteaches squalidest" ; + dc:publisher ; + dc:date "2000-07-06"^^xsd:date . +bsbm-inst:ProductFeature171 + rdf:type bsbm:ProductFeature ; + rdfs:label "saddletree schemery paroler" ; + rdfs:comment "fittingness foresworn upholstering stretchers illustrated extricates philosophizes spadices airmailing mb congruency rumbling filagrees prevaricate overdeveloped herpetological interventionism cooler pining reascended retreaded farewells morphogenic cushioned dozening curving pearliest argles sylvans motlier vitrine defeaters returner shiniest lienable slivovic competently resew categorization vehemently pumicer reflower" ; + dc:publisher ; + dc:date "2000-07-20"^^xsd:date . +bsbm-inst:ProductFeature172 + rdf:type bsbm:ProductFeature ; + rdfs:label "caudated probationer" ; + rdfs:comment "consistorial dinkiest tempi leveed inundations tomcat subventions skulkers hadrons defying forgives cubicle tapsters airmobile yipe corals derringer antichrists tartness uglify catchers underrated tictoc provoked gnaws antonymous litigates sponges huntress streptococcic rebukes summery tawdrily adventurer moxie damply treacles burler fulfil atonements transits mambos concordance suavity archimedean" ; + dc:publisher ; + dc:date "2000-06-23"^^xsd:date . +bsbm-inst:ProductFeature173 + rdf:type bsbm:ProductFeature ; + rdfs:label "drips silicas inferentially" ; + rdfs:comment "evaporative thwacker disorderly convolvuluses ungentle verifying playland sapphism orderings braincase sabring hemispheres steamboats interloper respectfulness reheat prewarm merlons pocketer elaborator inhering whelmed sequencer tawers haircuts laminates plumps boreal tiffined hydrolytic despatcher reerects kidded lyrist buoys suddens reseats cosmogonic lasher bowlike lids whoredoms" ; + dc:publisher ; + dc:date "2000-07-16"^^xsd:date . +bsbm-inst:ProductFeature174 + rdf:type bsbm:ProductFeature ; + rdfs:label "reduced" ; + rdfs:comment "bedrid disadvantageousness nymphos disannulling suffragists sultriness psychosocial misarranges crookedness fullest quincunxes deterrence riflings faddists emulation graphics lobbyism elimination oversimple vasodilator recrossed miaowed streptococci opalescence gracilis disguised paraquat ordination unescapably flavors climatical helicopts wiggled annulet blipped catenating restudied topically breather pimplier workbox superannuation countenanced coagency chloroforms immobilized" ; + dc:publisher ; + dc:date "2000-07-13"^^xsd:date . +bsbm-inst:ProductFeature175 + rdf:type bsbm:ProductFeature ; + rdfs:label "dippable" ; + rdfs:comment "etruria amish institutor inflammability spiced benignant valeted advisors lavisher talmudists parboils bullweed forehandedness undertaken dashingly idiosyncracies topper dwellings palmyras butlers revellings heroics forebye clouters unrepresented histrionics kited reapportioned crispers illusiveness pikers suburbias triolet crackerjacks" ; + dc:publisher ; + dc:date "2000-07-18"^^xsd:date . +bsbm-inst:ProductFeature176 + rdf:type bsbm:ProductFeature ; + rdfs:label "locks serb" ; + rdfs:comment "ideated sibylic pairs photometric junker fwd overimpresses assemblymen constants suffragists combed uninhibitedly hod groaning sagier destructs pianists experiments benzocaine longings homogenizing unaffiliated forecasts depilates funky victualers derats motortruck arider suffered tartly singled relented recomposition stagnantly metre foyers taxidermist inextinguishables warrantee" ; + dc:publisher ; + dc:date "2000-07-11"^^xsd:date . +bsbm-inst:ProductFeature177 + rdf:type bsbm:ProductFeature ; + rdfs:label "interplead" ; + rdfs:comment "phrenology critical baedeker subtleness hypotenuses hinderers farriers slakes threesomes dieticians jeweler pressmark sebaceous tunability sexing hectogram nobbling shapely unman punishment opacified heartburns heroisms trochees thorp exasperation meany plashy assembling" ; + dc:publisher ; + dc:date "2000-06-22"^^xsd:date . +bsbm-inst:ProductFeature178 + rdf:type bsbm:ProductFeature ; + rdfs:label "deputed" ; + rdfs:comment "averaging indemnifies otology disced decors cautions bevelling treasuryship creameries exteriorized concentrating dads rebuked undauntedly buttered misconceiving goosey sentrying urbanisms outwits namely shiner porkpies crisply flamboyance collies blots salvias mixology devilries tinkles vasoconstrictive indecencies centerfold accosts hoverers erodes onenesses ratifiers vulgarer maenadism dissuaded" ; + dc:publisher ; + dc:date "2000-07-02"^^xsd:date . +bsbm-inst:ProductFeature179 + rdf:type bsbm:ProductFeature ; + rdfs:label "ramshorn miotic summations" ; + rdfs:comment "amnestied ropeway madonnas countervails mezzos coinhering mischievousness hoydens fared abstraction uninterested incrusting condones espouses bedquilts elaborators winos floorages seeresses accommodating unrestrained retracting combing throatier antiinstitutionalists hullabaloo municipality shirrings appetizingly gambits geomancy nitros lithographs distinctiveness pericarps awls swerves subnormally nines republics carolers retro" ; + dc:publisher ; + dc:date "2000-06-22"^^xsd:date . +bsbm-inst:ProductFeature180 + rdf:type bsbm:ProductFeature ; + rdfs:label "freakily disputing disassimilating" ; + rdfs:comment "devilkin bondwomen specifies wised bayonetted trackings selectly nosily protested nonaddictive teleradiography grizzling costumers globoid tictocking discoursed purpresture severance stockbrokerage pandered ambidexterity speculated forker transcends aneroid dynamics sojourning binned keepers routinizing reverenced chowed swanked trunnions amphora seismologist mustached disarm priss yawning tuners" ; + dc:publisher ; + dc:date "2000-07-11"^^xsd:date . +bsbm-inst:ProductFeature181 + rdf:type bsbm:ProductFeature ; + rdfs:label "coted detecter preserves" ; + rdfs:comment "espials battened purificatory peers attacked betake azote animators doctors maltreats tameness monks establismentarianism underpasses anglers canteens backpacks welshes intruder outpour ambery kinks airsick shrouded unships despondence contemporaries maleficently eightballs eyebolts barnstormers discording specs axillaries evening nauseousness bodes" ; + dc:publisher ; + dc:date "2000-06-30"^^xsd:date . +bsbm-inst:ProductFeature182 + rdf:type bsbm:ProductFeature ; + rdfs:label "concealers untimelier torquing" ; + rdfs:comment "spirits repinning claddings cortices choreas untangles landlordism supervisorship ullages dogy snuffed turndowns factotums arthrography fleeciest recently displanted dusted oversolicitousness infernally mungoose quasars misunderstand slipping potence smacking preventiveness whoppers sounder merits fulcrums plunker rutabagas humphing machinable medicant rawhides unclouded chalkboards massager indescribability meditation" ; + dc:publisher ; + dc:date "2000-06-29"^^xsd:date . +bsbm-inst:ProductFeature183 + rdf:type bsbm:ProductFeature ; + rdfs:label "tumultuousness handmaidens" ; + rdfs:comment "bossa peashooter emporia lumbering tetrapod foghorns presupposes realities integrationist devoted achoo habitably thymes apprisers restlessly antinomy disemboweling injuriously squirted sneezers succubi stingray rapiered machiavellians encrypt universes postpones oilcups" ; + dc:publisher ; + dc:date "2000-07-04"^^xsd:date . +bsbm-inst:ProductFeature184 + rdf:type bsbm:ProductFeature ; + rdfs:label "entwine whittlers" ; + rdfs:comment "emigrated garments lows ministrations zimbabwe gypsyism rebec dissevers untraveled cobbling gayety slowworm chauffeured optionees dialers debauches whirlies ruinousness cosmonauts greasier imitatively seminudity bambinos internments unendangered espadrilles temp venin incarnadines beatified parchment meddling brawls" ; + dc:publisher ; + dc:date "2000-07-07"^^xsd:date . +bsbm-inst:ProductFeature185 + rdf:type bsbm:ProductFeature ; + rdfs:label "lamellas appose outgrew" ; + rdfs:comment "immortalizing splurges saluting shifts liquidizing maladroitly soothsaying squished golfer tabouret inking blankly pulls microinstruction coulees luminiferous foliates fraudulently chitters breakouts viniest popularized majority publishes" ; + dc:publisher ; + dc:date "2000-07-06"^^xsd:date . +bsbm-inst:ProductFeature186 + rdf:type bsbm:ProductFeature ; + rdfs:label "intenser" ; + rdfs:comment "retaliators detecter fencing fizzles quests proposing manos deluders inaptness spacing hurrahs eyeless playbook hairballs polemize tempered dadoed hypertension obtaining reclaimant porringers discomforting portliness exiting disking" ; + dc:publisher ; + dc:date "2000-07-07"^^xsd:date . +bsbm-inst:ProductFeature187 + rdf:type bsbm:ProductFeature ; + rdfs:label "concretes beknighted prosit" ; + rdfs:comment "etiologic jujitsus values breeds correction wineries hastened universalized personages morality perpendicularly amicableness effigies persistency pushes preps trotter cribbing prostrates slackest intercalated allopaths barometric stockateer spruces viscose advocator kinetins adjudicator shorty mahjongs richer vacancy" ; + dc:publisher ; + dc:date "2000-07-13"^^xsd:date . +bsbm-inst:ProductFeature188 + rdf:type bsbm:ProductFeature ; + rdfs:label "mechanization sniveling" ; + rdfs:comment "tightwad trustily unexpended ullages airwomen gloved synthetically overextends technicality streamy dispassionately desiccatory sticked substructure arithmetics zeros forestalling tunability asphyxiator immaculateness complacency lidar refiltering relearnt gemmy disraeli americanizes plashy coagulability cavaliers germier polygamists unfading showup lawing" ; + dc:publisher ; + dc:date "2000-07-13"^^xsd:date . +bsbm-inst:ProductFeature189 + rdf:type bsbm:ProductFeature ; + rdfs:label "proctorial biker" ; + rdfs:comment "ovaries pertly medicator velleity minifloppy anciens succinctness aboding pimpling hauteur giggly conformists boyishly yews deluding sitzmark esophageal corsair misread commiserated fizgigs jiggled medleys" ; + dc:publisher ; + dc:date "2000-06-27"^^xsd:date . +bsbm-inst:ProductFeature190 + rdf:type bsbm:ProductFeature ; + rdfs:label "collecting monastics unentertaining" ; + rdfs:comment "pneumatically nonsecular subdividing expiring petitionee upholstering insurmountably enchanter booms surveiling osculation confiding beautifying sirs sledding preconcessions sunbath deviser alertness archly honduran" ; + dc:publisher ; + dc:date "2000-06-22"^^xsd:date . +bsbm-inst:ProductFeature191 + rdf:type bsbm:ProductFeature ; + rdfs:label "crusaded repayments risings" ; + rdfs:comment "rounding watchers discussionis macers minimums noninterference revamping yangtze promilitary curatorial inheres intents clientless dosed hypnotism furrowing finical equating fatted chronologies incompatibly interlunar uncoagulated coolness adv superimposition tumbles taunter wraps marshalling blether hosanna exceptionally quietest drunkometer debauching preservatives slink stubborner smoothers suns unjustification nonconsenting" ; + dc:publisher ; + dc:date "2000-06-26"^^xsd:date . +bsbm-inst:ProductFeature192 + rdf:type bsbm:ProductFeature ; + rdfs:label "corncobs gaunter misdefined" ; + rdfs:comment "neighed fluidizes disrupted rushingly reckless burweed escarping ringbolt analogic disorientation perineal underages divulgence inflammability nerds indwelt religiously sepalled nonsubmissively tetchy larceners remodelers balsams gabbed entoils accumulable bluffers projectionist sassing spaller lethes universalist axillaries crossbeams disemploys blandishers interlining swilled hodad awards earful tammies" ; + dc:publisher ; + dc:date "2000-06-22"^^xsd:date . +bsbm-inst:ProductFeature193 + rdf:type bsbm:ProductFeature ; + rdfs:label "undisplayed christly" ; + rdfs:comment "filmsets misname guerrillas creepier bodegas kleig queenliness aptnesses reverifies staked collapsibility participles walloped mixer tonetics anaesthesia laryngoscopy premies singing breakdowns effortlessly subtilest foregone scrawls offhandedness exotisms engagingly bisectional tartaric likability cuniform defog luminal immemorially nonmalicious" ; + dc:publisher ; + dc:date "2000-06-30"^^xsd:date . +bsbm-inst:ProductFeature194 + rdf:type bsbm:ProductFeature ; + rdfs:label "contentions pepping" ; + rdfs:comment "dingdonged benchmarked oater cogway headgear reaccept obligation nightjar coastwise manslaughters coterie noncontributory whitening atrociousness lugger dreadfulness interlocutor surfeited barbarically incarcerators appropriateness nonacademic playbill diablery quisling heeltaps minorcas garnishments misnumbering betelnut barons whizbangs daubery lode oology banshies surrealist farthings exterminators resettlements ugliness disunion ragtime agues cabala safaris" ; + dc:publisher ; + dc:date "2000-07-15"^^xsd:date . +bsbm-inst:ProductFeature195 + rdf:type bsbm:ProductFeature ; + rdfs:label "scalawags widdle oozing" ; + rdfs:comment "trivalves munching nucleon capacitors billhooks underlain swarmed winning releasers wanter peaty zed pearler habituation backslidden cosher tensibly reassured devaluations quixotry rifling recoveree vacuumed pseudohistorical frisked anymore catching umping exocrine whirls stanched possessiveness quartiles disemploy doorstop backstretch moistness" ; + dc:publisher ; + dc:date "2000-07-10"^^xsd:date . +bsbm-inst:ProductFeature196 + rdf:type bsbm:ProductFeature ; + rdfs:label "antiphony cutie" ; + rdfs:comment "caravels escaroles flecking basking jackknifed retrospective receptionist moans triggered gesturing disinfection sawdusts flubbing severed omelettes ducked wifedom subdepot tows princelier evincing doggies" ; + dc:publisher ; + dc:date "2000-06-24"^^xsd:date . +bsbm-inst:ProductFeature197 + rdf:type bsbm:ProductFeature ; + rdfs:label "tincturing" ; + rdfs:comment "masseuses daphnia hypersensitivities gearboxes evokers salesroom corniness interbred infrequence pilotage stalagmites bootjack dilates sexless flavonol pelves herders parasites asbestic plasmapheresis livelong playgoer imageries benzoin ideograms harmfully enfranchised cranked stubbornly fomentation battiest alimented altruistic revolutionizing fellatios chambrays scummy nonusers oldies lists befitted ponderers idealogy fosse kadis ladrons bolivars paroxysmal priorates" ; + dc:publisher ; + dc:date "2000-06-21"^^xsd:date . +bsbm-inst:ProductFeature198 + rdf:type bsbm:ProductFeature ; + rdfs:label "filterability inwardly" ; + rdfs:comment "soberly auriferous tighter telemetrically stockpots loggings crows hurrying cesiums celebrities houselights muddier eruptively dashboards anglophobe mastered disabler beltway snappier eluders" ; + dc:publisher ; + dc:date "2000-06-24"^^xsd:date . +bsbm-inst:ProductFeature199 + rdf:type bsbm:ProductFeature ; + rdfs:label "mangey recalcitrancy" ; + rdfs:comment "bearskin crannied keltics sartorial gelatinously rethink deserver kymograms casper totemites appels realtors ephedras laryngotracheal ratsbanes caseworker strawberries infringement wetly headfirst memorably unaccomplished sanguification cs slingshots waggling keloids personifying anginal clustery" ; + dc:publisher ; + dc:date "2000-06-26"^^xsd:date . +bsbm-inst:ProductFeature200 + rdf:type bsbm:ProductFeature ; + rdfs:label "folksiest" ; + rdfs:comment "corned campanology neatens subheads modishly maintop doubtingly migrating enravishes patnesses permafrost zlotys commonness overconcern sheepherder destination guarantees riftless publicist blears elicits muskrats" ; + dc:publisher ; + dc:date "2000-06-22"^^xsd:date . +bsbm-inst:ProductFeature201 + rdf:type bsbm:ProductFeature ; + rdfs:label "nutter honied metallurgically" ; + rdfs:comment "sceptering kegler hooker treasures melanogen quos ostentation breezes sombreros dotier ghettoes embays counseled thalamically buffaloed zapped quibbles hardpan sharply interrelated" ; + dc:publisher ; + dc:date "2000-06-29"^^xsd:date . +bsbm-inst:ProductFeature202 + rdf:type bsbm:ProductFeature ; + rdfs:label "bootie outrides interbank" ; + rdfs:comment "pursuance reveller limby cardiotherapy sandpipers conveyors staphylococcemic machining voiceprints erective bazooka rebinding succulence serrate remarries penstocks outlay forgeries bourne factotums devaluated geologically geriatrist curries reconstructing daunter unselfish allying tattings knavish finagle virologies preschool groggier furless henting" ; + dc:publisher ; + dc:date "2000-06-27"^^xsd:date . +bsbm-inst:ProductFeature203 + rdf:type bsbm:ProductFeature ; + rdfs:label "ophthalmoscopic rotationally anality" ; + rdfs:comment "reformers yawned holistically ovation bobcats thro rendezvouses barny reconditeness grouty neckwear atomization croaks bennets ageing sheeted sanctimoniousness ejaculations dilater readjustment stiflers stats statal autobus chiles rosins" ; + dc:publisher ; + dc:date "2000-07-20"^^xsd:date . +bsbm-inst:ProductFeature204 + rdf:type bsbm:ProductFeature ; + rdfs:label "tuners" ; + rdfs:comment "narcotism damosels curlicues emending reproves pinnacling soarers moisturized howbeit eduction encroached swampland misdeed burnie washstands swordmen moonlighters apeek assigning sashes alcalde pericarps mennonites prominence etym favouring builded travelled decelerations unpent shackling pillion tackling departures unsafe dogsled spinneys foreside grottos hurdling looseness abaters unstuck foregoes indulged havened onionskins" ; + dc:publisher ; + dc:date "2000-06-29"^^xsd:date . +bsbm-inst:ProductFeature205 + rdf:type bsbm:ProductFeature ; + rdfs:label "sticked poles" ; + rdfs:comment "treasonable iratest frugalities boycotting ventriloquists leafworm shewer veinless restuff curableness rebind liens aleatory farcing sacristry antiskid uncontested thuggeries outdrew ballplayers jangles fewer capitalize extensors pouting witches glassful electrocardiography powders kindredness operative" ; + dc:publisher ; + dc:date "2000-06-21"^^xsd:date . +bsbm-inst:ProductFeature206 + rdf:type bsbm:ProductFeature ; + rdfs:label "bestirred typebar" ; + rdfs:comment "brushes immunes kynurenic thievish weepier undyed incompressibly whapped hosteled rimes discase fluidize excluding barbels thundercloud ripely eructates bewilders pulverization garottes joyed assumer haggles upchucked stripteases facilities restock unplugged lightmindedness characters misformed contraindicative hovels musculatures lissomely nonliturgically largos impersonators" ; + dc:publisher ; + dc:date "2000-06-21"^^xsd:date . +bsbm-inst:ProductFeature207 + rdf:type bsbm:ProductFeature ; + rdfs:label "secludedness" ; + rdfs:comment "markers florences tardiness streamliners filibustered hashing tertian bireme leaved licorices chirographical gynarchy leapers crunching parsing mappable warner tetanuses backseats blighter wonderer unlawful" ; + dc:publisher ; + dc:date "2000-07-18"^^xsd:date . +bsbm-inst:ProductFeature208 + rdf:type bsbm:ProductFeature ; + rdfs:label "misadvising" ; + rdfs:comment "doughiest detoxication tictoc kalpas frontispieces pithily tooler gushier gnaws astrobiologist applying chipmunks leeriest bravadoes circuitously hovelling unafraid woolly panelists distensions individuated tongued" ; + dc:publisher ; + dc:date "2000-07-09"^^xsd:date . +bsbm-inst:ProductFeature209 + rdf:type bsbm:ProductFeature ; + rdfs:label "choppiness" ; + rdfs:comment "redoubled retailor herder slices pooled ignores dazes wowing expresses gabs conviviality bumbler stagnation trustworthiness blinkers intricateness alkyl decreasingly overselling calmness fizzers notarized foramen cymbaler circumnavigation properly waits paintier melchizedek promoting" ; + dc:publisher ; + dc:date "2000-07-05"^^xsd:date . +bsbm-inst:ProductFeature210 + rdf:type bsbm:ProductFeature ; + rdfs:label "pluralization" ; + rdfs:comment "lambing rockfish earliness alkalinization mitts twining serigraph discipliners jimminy silicates domesticating alleviations bordered justifiers quadruplicate deathless tangos tetrapods cantilevering snarler carer clemencies precapitalistic knottily buckhounds proceeding unalloyed ceaselessness bolivars sickout principals gamuts moly trivalve needing protuberance zooplankton membranes subclassifying wails reobtaining authentically grouting reencloses phantasms stockjobbing restrains lieges" ; + dc:publisher ; + dc:date "2000-07-01"^^xsd:date . +bsbm-inst:ProductFeature211 + rdf:type bsbm:ProductFeature ; + rdfs:label "dont inferiorities dominium" ; + rdfs:comment "plutonic blusterers decided tunnellers overcrowd excludes prejudiced lapboard metastasis literals unmannerly measliest appraiser blockheads footraces disaffected actuality trimmest productive instructions unpeoples detachably farmhands" ; + dc:publisher ; + dc:date "2000-06-28"^^xsd:date . +bsbm-inst:ProductFeature212 + rdf:type bsbm:ProductFeature ; + rdfs:label "hyperkinesis cesarean housebreaker" ; + rdfs:comment "opposability conoidal tarp farragoes preindustrial nonemotionally newsier supinely pointe heels cuboidal paraguayan borrowed beefcakes batching equips calabash pastelist watercress pussycats hotspurs dodger borborygmus sultans esquired wifedoms exampling sandwiching indigenes ricers misalphabetize fated undefinable trulls griping equalizing imposer unpile jacals abridged bilaterally impudence brevier loopholes regurgitating acres practicably trusted" ; + dc:publisher ; + dc:date "2000-07-11"^^xsd:date . +bsbm-inst:ProductFeature213 + rdf:type bsbm:ProductFeature ; + rdfs:label "sheaves" ; + rdfs:comment "hillers pinesap riffed fussed skoal electrotheraputically colorful inactivating ironwoods boozes overgrows whoso patronymically rumination antrum parasitize gelders salesmanship overextended sulphide speculative incapacitation unexplainable unreasonably others finalities maturest tenanted premeditated interferometry resentfulness addling fecundated larums ramie atypically diminishments juiceless befriends cafes behooves" ; + dc:publisher ; + dc:date "2000-07-19"^^xsd:date . +bsbm-inst:ProductFeature214 + rdf:type bsbm:ProductFeature ; + rdfs:label "benchmarked interface insobriety" ; + rdfs:comment "contended antifascist recompensable waxer cyclotrons avast imposted shipper sasses honouring paradoxes dustpans stridden liquify cyclotrons transfrontier swiftly redissolves skipping deviated housewifery shelver macrobiotic reemerging thriftier preaxial brazening slopping yielder harridan mastication pulsates glutted solidified amours broomiest muster weedily" ; + dc:publisher ; + dc:date "2000-06-29"^^xsd:date . +bsbm-inst:ProductFeature215 + rdf:type bsbm:ProductFeature ; + rdfs:label "pronely tammies jurors" ; + rdfs:comment "excrements unreplaceable cakiest ripplier sapiences fraternizes gorily remembers outriders toters manufacturing overcritically slanderously mewing cars waterspouts choroid windlassed mobilities breading presswork numberless hastens unforeseeable" ; + dc:publisher ; + dc:date "2000-06-24"^^xsd:date . +bsbm-inst:ProductFeature216 + rdf:type bsbm:ProductFeature ; + rdfs:label "submarine happenings" ; + rdfs:comment "microbiologists arythmic gelatinize inorganically recidivism cannibals isotopes commorancies catfishes lignified monologists camass attributions eliminators feists latens overintellectual guesser provincially hospitably eights chases curiosa dumber chronicled deerskins gloomings chitlins" ; + dc:publisher ; + dc:date "2000-06-22"^^xsd:date . +bsbm-inst:ProductFeature217 + rdf:type bsbm:ProductFeature ; + rdfs:label "matureness formless soapsuds" ; + rdfs:comment "sherpa validities pirogues emoted turnhall sightsees devoured hemiola scoutmaster emborders predatoriness counsels frumpish intermingles thinclads occludes mentholated attacking empyrean usefulness predominated fonts pshawing plugged expectative" ; + dc:publisher ; + dc:date "2000-06-20"^^xsd:date . +bsbm-inst:ProductFeature218 + rdf:type bsbm:ProductFeature ; + rdfs:label "appreciated usability" ; + rdfs:comment "undistinguishing execrated japingly kerchiefs trashier deathcups unsoundest birdseye imploded selecting undertakes parsnips disservice preyed pulings mordantly cleansed reassembles lushing slobbers semiautomatically bedighted skewers yardmaster sockmen pacifically irrationalities enrobing gratuitousness yells uptowns astrobiologies repaint desulfured chiefer depilatory bossdom bloodedness autocade" ; + dc:publisher ; + dc:date "2000-06-29"^^xsd:date . +bsbm-inst:ProductFeature219 + rdf:type bsbm:ProductFeature ; + rdfs:label "doltishly polygram" ; + rdfs:comment "inflects solving wirelessed magnetized jackdaws bromate arousing anesthetics contraptions unloosens miasms quartermasters cremations substituter gamester outshouting macrocosmic bartending ennuis vainglory handcraft apercu firebombs takeouts observances crabbily" ; + dc:publisher ; + dc:date "2000-07-16"^^xsd:date . +bsbm-inst:ProductFeature220 + rdf:type bsbm:ProductFeature ; + rdfs:label "lockages delegation slotting" ; + rdfs:comment "arrayals orthopaedic sylvas pixieish mentally scrabbles unstained biopsies ripping neoplasia gondoliers pratfalls theater hexagrams informing flagstones coiffing niggarding probability phylae adequacies letches centralism morbidly transgressions taverns cornucopias surgy perplexedly enfilade centimos lawed" ; + dc:publisher ; + dc:date "2000-07-15"^^xsd:date . +bsbm-inst:ProductFeature221 + rdf:type bsbm:ProductFeature ; + rdfs:label "mousiness guarantying eying" ; + rdfs:comment "fencible extended eighteenths hempen reunites oralogy procrastinators philomels crepitant obviator relabel pix unassertive scrunching deluders digestiveness zebu moonset agglutinatively matchbooks rigmaroles guests dissolves garnisheed emergency jib girdler disabler toiler simpers foretells dormancies silkworms hissed presidio baptists debarment esculent savoriest internalize" ; + dc:publisher ; + dc:date "2000-07-01"^^xsd:date . +bsbm-inst:ProductFeature222 + rdf:type bsbm:ProductFeature ; + rdfs:label "harpooning properties tropia" ; + rdfs:comment "briars transsexual audiogram superconductor cuddlier unhorsed campers shriekers proliferous warbled polystyrene trouper clucking scurrying likableness appraised jesuitries footlessness recrates mullioning" ; + dc:publisher ; + dc:date "2000-07-20"^^xsd:date . +bsbm-inst:ProductFeature223 + rdf:type bsbm:ProductFeature ; + rdfs:label "doyenne tzars" ; + rdfs:comment "unmentionable jackscrew subprocess empyreans privatest hollowing superpower frustration essentials farthings zinnias littles obliquities sampler educability overstate moderators descendance purdahs leeching woefully suborbital frigidly shoshonean accusatrixes" ; + dc:publisher ; + dc:date "2000-07-12"^^xsd:date . +bsbm-inst:ProductFeature224 + rdf:type bsbm:ProductFeature ; + rdfs:label "deflationary sparred" ; + rdfs:comment "audiology ghostwriter reprices presupposed canteens satiny peacoat balefully transmigration sermonic clasps tallying spilth superegos doffs chums commix beryline risque whiffletree heirdoms overloads airmailing disquieted oldstyles termly overbooks wisecracking rehabilitated preys" ; + dc:publisher ; + dc:date "2000-07-14"^^xsd:date . +bsbm-inst:ProductFeature225 + rdf:type bsbm:ProductFeature ; + rdfs:label "contestation pudgily precipitating" ; + rdfs:comment "tinkerers jessed harassing pasturage coffees aboil unitedly townies stingray renotified calamines withholds burler congregating hasta internments separability castellated offends gypsies reapplies smokable raucousness unwholesomeness semites oversized detrains declarant" ; + dc:publisher ; + dc:date "2000-07-04"^^xsd:date . +bsbm-inst:ProductFeature226 + rdf:type bsbm:ProductFeature ; + rdfs:label "sleazy makeweight statuaries" ; + rdfs:comment "votes biotechnological associations misguide crazed rehammered griffon legionnaire hazardless sluggishly balalaika sunshades countermeasure exploitee overmagnifying stepfathers banged chillum horizons investigator threesomes whitecapper resurrects grazier cigarillo industrialize spumous huskings humeral xiphoids consistence reconveyance quarried submergence infinitesimals medullas utopians friending yowlers sideswiper venging reenjoyed orrery dignifying configurations communists shrubby moonish nonconciliatory" ; + dc:publisher ; + dc:date "2000-07-20"^^xsd:date . +bsbm-inst:ProductFeature227 + rdf:type bsbm:ProductFeature ; + rdfs:label "flavored" ; + rdfs:comment "glary sunrises soddy nones austral reinvestigations anglicizes chrysalides annatto kneepan recruited vised machinized overintensely tarriest franchisers flagship corolla integrationist acclimating preppies worming marshs rancors ceaseless internments inshrines revindicating roisterers coxwaining anybodies fifer castigating painstakingly abbreviators vendors fainer gunlock artless primero investing" ; + dc:publisher ; + dc:date "2000-07-16"^^xsd:date . +bsbm-inst:ProductFeature228 + rdf:type bsbm:ProductFeature ; + rdfs:label "herbal" ; + rdfs:comment "cullender pokeweed disharmonious utilizes imbalming fomentation preterminal windily shunpiker anemias incinerations thrilling timeservers entrain deteriorative cittern kowtowed fiancees chantors tenderizes fossils umpteenth nonclassical hastier warwork divergence hagiographer granulations amusements improvising spoonily rebukers" ; + dc:publisher ; + dc:date "2000-06-24"^^xsd:date . +bsbm-inst:ProductFeature229 + rdf:type bsbm:ProductFeature ; + rdfs:label "slued tzitzis basifying" ; + rdfs:comment "autobiographers coccygeal ceaselessly programmatic antimonies conked impugnment deles nonabsolute marshalled misdrawn moult blushed dearths meteors misdiagnosing budless nappers evaluates redemonstrating misbehavior hogged intimateness justifiably playbacks nuzzlers autodials" ; + dc:publisher ; + dc:date "2000-07-04"^^xsd:date . +bsbm-inst:ProductFeature230 + rdf:type bsbm:ProductFeature ; + rdfs:label "televisionally conjured" ; + rdfs:comment "finnan impersonated embarrassedly refrigerators attachments ousting tippet arteriography forgone repetitions vendee chaconnes predictive riffraff restructured panging incarcerator cowskins pulques skittles blowby unpremeditated satisfyingly ricochetting xanthic" ; + dc:publisher ; + dc:date "2000-06-24"^^xsd:date . +bsbm-inst:ProductFeature231 + rdf:type bsbm:ProductFeature ; + rdfs:label "oscillometer berlins" ; + rdfs:comment "showerhead shrined nonmilitantly wrecks labours fueled sequencer soberizing amtrack smelliness mazy buckler anesthesia spreadable overdrive juniors fertilization disinformation amnions transects menhirs speculated objected volcanology deputizing lamaseries hosannas costumey rodmen rebecs kibitzing cassinos slovenliness tribally gastropod preservatives antinationalists roller reunions saned bulged magistracies" ; + dc:publisher ; + dc:date "2000-07-17"^^xsd:date . +bsbm-inst:ProductFeature232 + rdf:type bsbm:ProductFeature ; + rdfs:label "smilax" ; + rdfs:comment "refreshingly caudate macle subprincipals mammae perjured halvers adulating nazifying braids yachts hahnium belligerence muckers tinkerer smatters unvarying vibraphones caseworkers bourgeon ruffes eructated overspending downcasts sweatiest oddments comprehensibleness overconservative glaziers heterogeneously lambie capabler" ; + dc:publisher ; + dc:date "2000-07-16"^^xsd:date . +bsbm-inst:ProductFeature233 + rdf:type bsbm:ProductFeature ; + rdfs:label "disfranchisement" ; + rdfs:comment "whooshed jocosities tempests ringleader pigments tailings clunk darndest darter tuneably cliental sedations tenfolds damasks queened motifs centurion pertained incrusts mammogram insanitation bewaring cloggier dekameters aspic festered leisureless scop entrancement injudiciousness punctually attars clairvoyance pervasiveness unartfulness basify kabobs acerbities fireplugs allergology ably" ; + dc:publisher ; + dc:date "2000-07-04"^^xsd:date . +bsbm-inst:ProductFeature234 + rdf:type bsbm:ProductFeature ; + rdfs:label "reconciliatory obliques" ; + rdfs:comment "bypasses satiating ensheaths cliquey pinup bowhead carnality massaging arraigner reaver absorptions fluttery reverences traits stenos orienting motherliness mealworm narco blackening detested forebear uncage cottons bespattered outworker asphyxy underestimating pasturing creepier restoratives" ; + dc:publisher ; + dc:date "2000-06-25"^^xsd:date . +bsbm-inst:ProductFeature235 + rdf:type bsbm:ProductFeature ; + rdfs:label "rapturing rickracks hollowed" ; + rdfs:comment "potability surmising hards distillates ultimacy arcadias reoccupies nonbeliever untrod ravelings rumblingly keesters slicking occupies perversive dumped tupping magnificently equivocator scandalized cyclizes stagnancy copiously terraqueous flay hypertrophying transmutes fellator recommender praiser" ; + dc:publisher ; + dc:date "2000-07-18"^^xsd:date . +bsbm-inst:ProductFeature236 + rdf:type bsbm:ProductFeature ; + rdfs:label "intrenches radons" ; + rdfs:comment "curbed syphoned bogeys overlooking brunches blankest bronc nonconciliatory crabbier anaesthetist scarless reembodying noblewoman statues miseries explainers syrians shegetz gingerbread raping browniest unsung coloration bialys emendating unhoused twitchiest ejaculatory palettes immix nuances divagations crunches sickbay splined radioactively playgoers heeder insinuates drabness nonpermeable leghorns biodegrading unstably accesses electives theosophically trustfulness" ; + dc:publisher ; + dc:date "2000-07-08"^^xsd:date . +bsbm-inst:ProductFeature237 + rdf:type bsbm:ProductFeature ; + rdfs:label "tabor miscellaneously" ; + rdfs:comment "malignance sprights degaussing waxings peritonital heavily simplifies poppets joining maskers collegiums impasses fart weightless flipped archeries scratched wheezers overmodify qaids braless seducers doubling" ; + dc:publisher ; + dc:date "2000-06-30"^^xsd:date . +bsbm-inst:ProductFeature238 + rdf:type bsbm:ProductFeature ; + rdfs:label "blueing calcines tutelary" ; + rdfs:comment "cobbers giftedly remigrating noxiously absurdness intertwinement ardours noggs piously diuretic unbridled wingspans shareability preserves blockbusting pinochles phallic sweetest sergeants tetotum satisfyingly garrotes poorish comprehensively nous punting fatuousness minimalist turd desisted checks noncritical stevedores footways" ; + dc:publisher ; + dc:date "2000-07-03"^^xsd:date . +bsbm-inst:ProductFeature239 + rdf:type bsbm:ProductFeature ; + rdfs:label "nudged demagnification gracelessly" ; + rdfs:comment "daemonic culmination sifting rainier russe gremmies waddled creaming scumming ameban mammy farmhand restrictively misunderstand transferrers gaming airdrome paintiest theoretical lassie goldurns prospectuses paisan resorters expiates coastings swordmen enforce bhakti fulcrums stria plodders innersole dechlorinated causality bolter caramelized trapshooting lapidating convective overpasses smoldered heedlessness counterplot supramental" ; + dc:publisher ; + dc:date "2000-06-24"^^xsd:date . +bsbm-inst:ProductFeature240 + rdf:type bsbm:ProductFeature ; + rdfs:label "furler expatiator feloniously" ; + rdfs:comment "sunburns parrying coldly lapidating murkest ranched contemplation puggy specificizing unassailably trances cumulative entreats incubuses retoucher heroical undertow mammies noncausal proslavery ventless overawe transmigrates epilog diabolo divining bonders favoured drupe syphilises enlistees neckings readdicted puled" ; + dc:publisher ; + dc:date "2000-07-21"^^xsd:date . +bsbm-inst:ProductFeature241 + rdf:type bsbm:ProductFeature ; + rdfs:label "xanthochroid cartoned" ; + rdfs:comment "aubades shirking preempted djinns offenseless forefend rednesses realise dickeys uncover bicycler elfins knickknacks stampeding rabbits utters spiel robber belittlement readjourns vacates messes fleyed hoatzins hagride handpicks endowing" ; + dc:publisher ; + dc:date "2000-06-23"^^xsd:date . +bsbm-inst:ProductFeature242 + rdf:type bsbm:ProductFeature ; + rdfs:label "intersperses purveyed" ; + rdfs:comment "antiknock limberest setting bereavement granges sadness pressurizers strabismally concaving bumpkins rewrapped linguistically phalange dissatisfies betted donatio yoni junkyards rebounds whities sidesteps inconsistencies unloosens regularizer autodialling untrue moisturized figment dews divagations statelessness centuple chertier citifying fightings gonadectomizing chemoreceptive belts earwigged idiotically mixable hyperexcitable pylori feticides mellowed flinches grouchiness statelier" ; + dc:publisher ; + dc:date "2000-07-08"^^xsd:date . +bsbm-inst:ProductFeature243 + rdf:type bsbm:ProductFeature ; + rdfs:label "turfy" ; + rdfs:comment "egresses arabize jennet cinematographies overassertive gavot cunt custards commemoratively labelled microbars probations jumpiest grimaces negativing vigors scuppers affixed beautification footpace subfamily steamroller shirtsleeve adulteress interdictive snowcapped" ; + dc:publisher ; + dc:date "2000-06-24"^^xsd:date . +bsbm-inst:ProductFeature244 + rdf:type bsbm:ProductFeature ; + rdfs:label "consulted pinchers aethers" ; + rdfs:comment "undercook prewashes aleutians smelteries bloodshedder religions tympanies atrophied haloing remittee epidermization forjudging churlishness fancier tugboats cookeries withdrawable carved straitly parker pivoted bourns efficaciously revolutionizes keepable subleasing minds beefburger paleographical wooers incurious nights scrubber pinyons forgather leukemias polyesters referrals momentums bries unbuttoning abandonments coatrooms influenceability farthingale" ; + dc:publisher ; + dc:date "2000-07-09"^^xsd:date . +bsbm-inst:ProductFeature245 + rdf:type bsbm:ProductFeature ; + rdfs:label "disarticulated martially" ; + rdfs:comment "retrenched curators blueballs tempter buster fulminant womanlike microbars wringers somnambulists facetiousness unanimities embroiled meterage efflorescing corsets verifications goatfish wintriest latterly preventives islet bosoming parking heartiness flyovers chitchats devastatingly laminal accompanists amplifications girted salvages battening snooty forearming reappraisals" ; + dc:publisher ; + dc:date "2000-07-19"^^xsd:date . +bsbm-inst:ProductFeature246 + rdf:type bsbm:ProductFeature ; + rdfs:label "dozers brawniest" ; + rdfs:comment "undeceive beekeeper romaine faker reattaching studiers demonetize mountaineering pestered bestridden paranoids totipotentiality broadtail lightheaded tubectomies exasperates grieved handsprings grower perpetuators uninjured gulled pugs arachnoid fetlocks hijacks nutlets shover allergens aeration befuddling hyperglycemic opacify unconscientiously whalebone provider octavos moonlighter gnawed conferrer" ; + dc:publisher ; + dc:date "2000-06-29"^^xsd:date . +bsbm-inst:ProductFeature247 + rdf:type bsbm:ProductFeature ; + rdfs:label "heirless bootlessly" ; + rdfs:comment "talks rife deflection grunion thermography diddled myopically ordaining eclectically worrier hulling rifted denunciatory ruggers disincorporation noncooperative smeltery pigmented pinker crewed wassail straggling soberest followed disquiets reedier unlucky triadism bravadoes awaiter zoospores reaccedes calligrapher deionize flambeaux shivarees lengthening turnkeys ultrasonics" ; + dc:publisher ; + dc:date "2000-06-30"^^xsd:date . +bsbm-inst:ProductFeature248 + rdf:type bsbm:ProductFeature ; + rdfs:label "agendas" ; + rdfs:comment "onerously flavorsome supperless beltways coos calderon perigee aureole faired boob hemophilia intestacy dislocated reinduct tenancies cattiest sarcomas titivating properitoneal fisted" ; + dc:publisher ; + dc:date "2000-06-20"^^xsd:date . +bsbm-inst:ProductFeature249 + rdf:type bsbm:ProductFeature ; + rdfs:label "enterprisingly nominating" ; + rdfs:comment "shorting mussed opaline quittances careering marjorams polyvinyl durning shoulders boules bioactivity imponderability acidifiable inexcusability demarche mashes brushier diskettes contended revictuals lappets circumstantiation dynes sackfuls hemmed settlings loftiness fishhooks rascality sawteeth impetuousness sighers" ; + dc:publisher ; + dc:date "2000-06-26"^^xsd:date . +bsbm-inst:ProductFeature250 + rdf:type bsbm:ProductFeature ; + rdfs:label "preventability gruntled parte" ; + rdfs:comment "footrests overlying unfair copied lathing valvelets denominated tantalic subsumable bamboos sextile friary refilms soapers transforming homeopathic overelaborates dinginess kludging systematizing dispirit anomalies gormandizes koshering brioches adversity cotter slits soaper fidgeters trichiniasis calmant ouzels gauzy hurdles insects immutability donkeys tollage waxier unbending demonized flagellum interdicting procreativity retrogresses perusals intensifiers revivifying" ; + dc:publisher ; + dc:date "2000-07-01"^^xsd:date . +bsbm-inst:ProductFeature251 + rdf:type bsbm:ProductFeature ; + rdfs:label "whys" ; + rdfs:comment "regroup unfriendly heeler ecus inviters jerseyed knights trekking hollander headwork tawdriness phonically osmosing mantas quaverer proprioceptor misjudging familia bahts restocked embryologic latish reloader solvently pointblank abbr hadronic profiting arises joyously orthomolecular" ; + dc:publisher ; + dc:date "2000-07-14"^^xsd:date . +bsbm-inst:ProductFeature252 + rdf:type bsbm:ProductFeature ; + rdfs:label "vervain" ; + rdfs:comment "burped forehanded pourable cars foxtails constructionism nuke remorselessly caltrop eiffel volcanologist ingulf rockworks amtrac slams muzzier interfiles demobilizing disfranchiser representational cared botanizes abstractionists deceived lampers foments overbidding plops capitalism fissions" ; + dc:publisher ; + dc:date "2000-07-18"^^xsd:date . +bsbm-inst:ProductFeature253 + rdf:type bsbm:ProductFeature ; + rdfs:label "outranking yogee" ; + rdfs:comment "byres oversharp salvageability unaging piggiest sox tinkliest prissily gimleting awaits consistories dont amoebas flavors housecoats trafficks providers satyrid encompassment cuber" ; + dc:publisher ; + dc:date "2000-07-13"^^xsd:date . +bsbm-inst:ProductFeature254 + rdf:type bsbm:ProductFeature ; + rdfs:label "outpour" ; + rdfs:comment "demerits sweltering ulcering manyfold barquentine seamiest reoriented unites rescinder miscarriages pricy smuttily tizzy coups hoboes bondable gweducs jerkiness perspicaciousness stopt circularized reinviting pylorous grutten premarital garrulity" ; + dc:publisher ; + dc:date "2000-07-22"^^xsd:date . +bsbm-inst:ProductFeature255 + rdf:type bsbm:ProductFeature ; + rdfs:label "repeated" ; + rdfs:comment "caracol cower pottier sextos appointive formated winnower twiddles censoring negligees dendrological comedienne clerihews jointing countertenor rehabilitant carpus sodas gallic liquefying bosque imprecating" ; + dc:publisher ; + dc:date "2000-06-27"^^xsd:date . +bsbm-inst:ProductFeature256 + rdf:type bsbm:ProductFeature ; + rdfs:label "coroners depilate" ; + rdfs:comment "prickier detrimentalness identifiers freckles sheepshank northeastwardly erects nonsupport restraighten audiometries manganous heterotic loitering canonization nonconclusive tolerance rodder pct ejaculated yeti punchier narcotherapy cruxes overbuys comprize" ; + dc:publisher ; + dc:date "2000-07-19"^^xsd:date . +bsbm-inst:ProductFeature257 + rdf:type bsbm:ProductFeature ; + rdfs:label "sadly" ; + rdfs:comment "blunter syllabics monofuels castoff flamingos assassination nearliest predestinating neuropathy chirrups pinnately monism targeted honorer scalps ralliers tidiness snorkeling futures impishness tared traditionless lapping bamboozling kismet" ; + dc:publisher ; + dc:date "2000-07-19"^^xsd:date . +bsbm-inst:ProductFeature258 + rdf:type bsbm:ProductFeature ; + rdfs:label "flaxseeds mudslinger" ; + rdfs:comment "hauling paginating sumacs hypocenter powering incestuousness forger expectorants windproof kamikazes admissive cocas prevaricates darners mangler skiwear dissipation aerometer characteristically churchiest gallies feastful rhumbs coercer predations forsaking pastiest arcaded warlord afterdeck philosophers yelped unequal amusable louped versicles rheometers spawns" ; + dc:publisher ; + dc:date "2000-07-20"^^xsd:date . +bsbm-inst:ProductFeature259 + rdf:type bsbm:ProductFeature ; + rdfs:label "professors sorbet" ; + rdfs:comment "digamy titrant pennoned participation rattly filters dozed flopping tortoni methought waveless forgiver huffy imply unmindful soarings unyoke realizability mangos epicenes" ; + dc:publisher ; + dc:date "2000-07-05"^^xsd:date . +bsbm-inst:ProductFeature260 + rdf:type bsbm:ProductFeature ; + rdfs:label "subprovinces tangentiality" ; + rdfs:comment "batmen searching impersonation packers externalization ump unpersuasive allusions bluegills paellas gonadic knees deviators sinisterly tacos deleted depressives lifter jeez vicing faceting" ; + dc:publisher ; + dc:date "2000-07-20"^^xsd:date . +bsbm-inst:ProductFeature261 + rdf:type bsbm:ProductFeature ; + rdfs:label "tipster" ; + rdfs:comment "marshlands leasing dropt flagged overexplicit togas indictable unacknowledging expressionism opaquest instantly inappositeness betas crawdads carabineer obdurately virid implacably wisecracking mated clipt maladroitness inwinds chopstick flurries nympholeptic reeducated disagreed ontogenetic leipzig viand outdodges involved monomanias flanked overvalued pendency lustiness viced pinta apparelling requital closers popedoms militarizes lyrical oversalting degenerative" ; + dc:publisher ; + dc:date "2000-07-21"^^xsd:date . +bsbm-inst:ProductFeature262 + rdf:type bsbm:ProductFeature ; + rdfs:label "pursuits fishings" ; + rdfs:comment "dom bacchant storefront goslings envoys killers teentsy clericalist homonymic connection havened mandibular tautness unexcused ignominy philomel squelching plighted nonhazardous hoverer paisleys mistranslating confidants chirpiest spiculate frequenter earache soffits disbelievers rapidities flighted bibliotherapies nullifying kilters pustulation hennery neckless stealthiest kindler unpainted hysterical kerbing visards mints tailoress" ; + dc:publisher ; + dc:date "2000-07-16"^^xsd:date . +bsbm-inst:ProductFeature263 + rdf:type bsbm:ProductFeature ; + rdfs:label "truckle" ; + rdfs:comment "apolune anthemed broadlooms glassie posits uninsurable scrutinize gamekeepers pommelled demagnification disallowing gesticulating peopling softness jingoistic sauntered lowlifes blousy reinsman duos boondoggling southwester cc relight languisher blunge damner bullion klystrons abetter falsely warmakers governments demagogic shivaree extricated loadstar grumbled unrepressed rancidities unhappily milestones surveyable incriminates satiates reattaining insertions waddlers fairs marshiness" ; + dc:publisher ; + dc:date "2000-06-29"^^xsd:date . +bsbm-inst:ProductFeature264 + rdf:type bsbm:ProductFeature ; + rdfs:label "carpal carryons dago" ; + rdfs:comment "interfactional spectators commitments scrimshaws largely fowler recompounding echolalia germproof hobbit underpowered noncasual sermonizer happily ducktail cerebric belvederes finals sauntering sneezer pitchiest platier bournes dhyana tents draining epitomizing laicizes alopecic waddly" ; + dc:publisher ; + dc:date "2000-07-19"^^xsd:date . +bsbm-inst:ProductFeature265 + rdf:type bsbm:ProductFeature ; + rdfs:label "flexibly" ; + rdfs:comment "laceier unduly ransacker xylograph overweigh containerizing seamount restates performed listed soigne fanjet mutilation redbugs percentaged wincher demographics nonconsenting transcendentalist fameless" ; + dc:publisher ; + dc:date "2000-07-15"^^xsd:date . +bsbm-inst:ProductFeature266 + rdf:type bsbm:ProductFeature ; + rdfs:label "unstinted" ; + rdfs:comment "untired purpresture crewelwork anodically shapelessness copyrights slices apery nescient hiccupped acrimonies avoider unprovable travestying shafts slouches overwrote secretes landforms unloader reenlists realms blasted summits sibs equivocalities lectureship chemosterilants turner duologues rewriters ennuis delectations battiks conterminousness healthier necked ticktock tutoress lordliness" ; + dc:publisher ; + dc:date "2000-06-27"^^xsd:date . +bsbm-inst:ProductFeature267 + rdf:type bsbm:ProductFeature ; + rdfs:label "toras noisemakers labially" ; + rdfs:comment "tobaccoes foreshadow upswings nets disquiets phagosome achromatically crosshatches styling stenches spitball latitudinally headpiece mating sinters doffs disenchant malignities signories carved scourger dropper simoniac outrace chemotherapeuticness citrins labials spadices skilful apprentices lissomeness screwer escaped bastardizations ringworms acquisitiveness electroshock cordials disapproves paddlings recommit rosters wedded" ; + dc:publisher ; + dc:date "2000-07-17"^^xsd:date . +bsbm-inst:ProductFeature268 + rdf:type bsbm:ProductFeature ; + rdfs:label "cogence ostlers" ; + rdfs:comment "hangings sootier apostrophic fertilize manicured retried prostatectomy suffocation whereat quinquina degeneracies confutations karts sunrises bankrolled reclassifications nagged intersocietal seashell saucer suborder strabismally expectorating suggestively dustily ratch" ; + dc:publisher ; + dc:date "2000-07-03"^^xsd:date . +bsbm-inst:ProductFeature269 + rdf:type bsbm:ProductFeature ; + rdfs:label "contravenes" ; + rdfs:comment "assuages materialists compassed amerced pontius sissier scurfs schoolmasters sibilates detracting mishaps stabilization unanticipated waggish plagiarizer wholesaler motleyer daylit cantankerousness sterlings selvages damnableness legislated seasoned drachmae toeing predigest differed permafrost grimy expeditionary sands valances moved gristles" ; + dc:publisher ; + dc:date "2000-07-07"^^xsd:date . +bsbm-inst:ProductFeature270 + rdf:type bsbm:ProductFeature ; + rdfs:label "transferrer repugned hushed" ; + rdfs:comment "columned dysenteric monophobia reginas nervily driftwood meditation seedsman freewheelers prenuptial balkiness gorsy graspers dayglows pursues placarder verticillate undermined betelnut notating conceptualize tetched sistered subsided simplest warned regilded latest twits surcingle instructed spurning sendoff revellers disorganized stupider" ; + dc:publisher ; + dc:date "2000-06-20"^^xsd:date . +bsbm-inst:ProductFeature271 + rdf:type bsbm:ProductFeature ; + rdfs:label "antibiotic" ; + rdfs:comment "beeches cocomat caudillos overcasts stomping besom unruffled backwoodsmen estivate thallophytic presell filmdoms exculpates cranker electrotheraputics pressruns amateurs reinvolves heavers anticlines beltlines lumpily thorning dialytic hyacinthine flump typeable worries capriole electrolyzed hirers fatalist factions deux reshapes fumatory gagers hooches archiepiscopal comics surfed cellulosic funkers assignability mynahs primeros chihuahua mediating centrums" ; + dc:publisher ; + dc:date "2000-07-20"^^xsd:date . +bsbm-inst:ProductFeature272 + rdf:type bsbm:ProductFeature ; + rdfs:label "grabbier" ; + rdfs:comment "fibrillate bombards petunias motionless neatness forepaw decimalized loathed semifinished silentest astrologists overthrower stodgily necrology yarer ruptured blossomed oaks charism pavane taproot jabot homed clarifies perceptually lienal burgeoned" ; + dc:publisher ; + dc:date "2000-07-04"^^xsd:date . +bsbm-inst:ProductFeature273 + rdf:type bsbm:ProductFeature ; + rdfs:label "drachmae" ; + rdfs:comment "mendelianist coulee trameled intercessional sierras monographic redrilled deserving undersigned dingbat intercedes chorizo unknotting remunerativeness installments attender obesity voodooing triads mutts snappers departments tuxes overscrupulously undecided semiskilled cheerlessness periodontics quartering" ; + dc:publisher ; + dc:date "2000-07-06"^^xsd:date . +bsbm-inst:ProductFeature274 + rdf:type bsbm:ProductFeature ; + rdfs:label "humidification sabres noiseless" ; + rdfs:comment "heartworm murkily connectors misrepresents soared wringer solicitress semiconductors adduces benefactrixes nonadvantageous fledgy amplifies administrant illness subserving oolite chorded gobs amenably distributors" ; + dc:publisher ; + dc:date "2000-07-21"^^xsd:date . +bsbm-inst:ProductFeature275 + rdf:type bsbm:ProductFeature ; + rdfs:label "memorizing enzymologist" ; + rdfs:comment "maidservants glazieries peacekeeper gallons minimizes shooed nickelodeons curries refinements owning diffracted diurnals gallantly woolmen ratfish routines panicles smashes leavening beauticians novitiates peaks nonhistoric" ; + dc:publisher ; + dc:date "2000-06-21"^^xsd:date . +bsbm-inst:ProductFeature276 + rdf:type bsbm:ProductFeature ; + rdfs:label "neb" ; + rdfs:comment "fluorinations seductresses promotions corresponding denuder wispier laboriousness mechanisms skepsis tulips barstools demobs bandmasters pallbearer lordlings dialyzed hoardings palmitate resisters redesigned trowing fledging disinters occasionally refry objective comedown senders attendance calculous redux zed bidets subacute swinks berhymed pumping overassured outrush corteges chitters civilest chiffonniers kimonos protects" ; + dc:publisher ; + dc:date "2000-07-22"^^xsd:date . +bsbm-inst:ProductFeature277 + rdf:type bsbm:ProductFeature ; + rdfs:label "falsehoods manner gatemen" ; + rdfs:comment "epizootic centimos dismast boomage issues aggrieves sociably ammoniacs polliwogs labyrinths infatuates whiteout dissentients newmown flunkey titillated caduceus rediscovered breaststrokes schillings endorsement cheerleaders nonconcurrent intoned outpaces inkle superpowers habaneras subsoils paramours laughed guzzling jillion psychotherapists substantiation nonuple deluded snowmelt" ; + dc:publisher ; + dc:date "2000-06-25"^^xsd:date . +bsbm-inst:ProductFeature278 + rdf:type bsbm:ProductFeature ; + rdfs:label "coterie ahchoo reexhibit" ; + rdfs:comment "interlards overrefinement annoyed stuntedness calcimining stereophonically recommendation embezzler reconviction misproportions discountenances callings defacers crummiest triglyceride decentralizations impacting promulgations bibliotherapy murexes professorships locomotes durning lyncher spoonier abhorrence assize goglets distracts" ; + dc:publisher ; + dc:date "2000-07-18"^^xsd:date . +bsbm-inst:ProductFeature279 + rdf:type bsbm:ProductFeature ; + rdfs:label "wrang" ; + rdfs:comment "universally trashily enervator naughtiness illuminating careerers computerese brakeless mesozoa lineate fulminant batholiths mohawks exhalation paraguayan alcaldes foulings primordially almightily placed flukey improvises pommelled sententious bookmark rashers truces mordanted shunter praxeological causable compassed decertified transubstantiation automatize boxful befouling tragedienne visiting alliums triangulates hounders compressively camphorates" ; + dc:publisher ; + dc:date "2000-07-05"^^xsd:date . +bsbm-inst:ProductFeature280 + rdf:type bsbm:ProductFeature ; + rdfs:label "tarts" ; + rdfs:comment "mammons armories scrapes hanger nucleation loftless refractoriness nonhabitual paperer aridness jingliest sportswriters gained efficiently marshals tomogram tambura pureeing doughty compromised antineutrinos revertible picadors oddballs hominies drek irradiations fearlessness cortin hussy" ; + dc:publisher ; + dc:date "2000-07-10"^^xsd:date . +bsbm-inst:ProductFeature281 + rdf:type bsbm:ProductFeature ; + rdfs:label "vacillator mortifying" ; + rdfs:comment "museful pupfish bulletproofing geminates nacre subsistence presifted abhors whereat wanes mooing refused biodegradability oghamic stouter venosities recopying supplantation buxomly foregoers pathologist" ; + dc:publisher ; + dc:date "2000-06-28"^^xsd:date . +bsbm-inst:ProductFeature282 + rdf:type bsbm:ProductFeature ; + rdfs:label "desolates" ; + rdfs:comment "welches comicality manifestos untangles mongols sluices demits inventers entitled taxability fancifulness claimed gastroenterology geotropically glenwood alack autochthonous nabob preempts alternativeness xviii fruiter deist electorally cooker voce abbeys composts jugsful glowing" ; + dc:publisher ; + dc:date "2000-07-06"^^xsd:date . +bsbm-inst:ProductFeature283 + rdf:type bsbm:ProductFeature ; + rdfs:label "waging" ; + rdfs:comment "basset worshipfully rebait bushwhacker implorer jackknifing paraguayan enrolls blazonry dendrological pavilioned cully epistles foreshorten couth usurps legibilities yammered somnolently scalded decoct practitioners infolds levered quartan calcined untransferable auditoria charred payment linoleums cowsheds preconceive undergrounder nosier sawhorse coerces assn turgidities venins" ; + dc:publisher ; + dc:date "2000-07-06"^^xsd:date . +bsbm-inst:ProductFeature284 + rdf:type bsbm:ProductFeature ; + rdfs:label "reveilles tither pettiness" ; + rdfs:comment "obliged homogenize componential redemonstrates dewberries pearlers triplicates planked goddaughters largeness citator palpal thoroughly enactive swimmiest syrups chanceman ventrals phlegmy vower matureness fictionalize iliads gasman tumours afeared tuneably insurrectionaries enfolds cisterns adduction" ; + dc:publisher ; + dc:date "2000-07-03"^^xsd:date . +bsbm-inst:ProductFeature285 + rdf:type bsbm:ProductFeature ; + rdfs:label "resettling uncoagulated lowish" ; + rdfs:comment "leafage maharajas prancingly mannerless vitrines radiocast insulates stilbestrol compartmented appearers undercurrents gunnel hopes launchings deluder overemotional unfolder bioflavonoid snorter thawed instinctively halidome classed towages unctions" ; + dc:publisher ; + dc:date "2000-07-10"^^xsd:date . +bsbm-inst:ProductFeature286 + rdf:type bsbm:ProductFeature ; + rdfs:label "procreators" ; + rdfs:comment "carcase recollects germanely disputation ciscoes unsettle calculableness artiest disprovable soporose rankly fuguing pox recontamination windiness hypothermic chutzpahs lilliput cognoscing divestitive misbehaves culpableness mutilators biogeographic inmesh flumed apeak doweling reheels unshut avascular redirected wiverns graveled quae pithiest unities monks boniness dancing gleemen unimpeachably reaming trekked calculabilities sphinxes protozoans toasty understanding elks" ; + dc:publisher ; + dc:date "2000-06-25"^^xsd:date . +bsbm-inst:ProductFeature287 + rdf:type bsbm:ProductFeature ; + rdfs:label "taiwanese antigene" ; + rdfs:comment "ultrasonography dreggier slashingly pimpernels survivors cultivating swaybacks immodestly pennsylvanian vitrine unpronounceable gallicism laggers undefeated deers heinousness cocobolo steadily gendarmerie blatantly spinosely totalizes invited preyers bandoleers airmailed quotationally intercuts updates digests accusatorially dusking stoppages littles cadaveric holsteins repertoires whirs radiation overman violative" ; + dc:publisher ; + dc:date "2000-07-12"^^xsd:date . +bsbm-inst:ProductFeature288 + rdf:type bsbm:ProductFeature ; + rdfs:label "lignites" ; + rdfs:comment "adulators benumbs disaffectedly cuttages bluebeard vichies resituates breads visard unfought adjunctly bractlets foamed durability amends retailer creaking inseminator sedatest rodeos unreels voicer acidifiers shredding fistula uniformer chivies immunological grimacer spoilt admiringly hyperbolas knouted eulogists bihourly prosiest matrixes jaggedest violinists dins archipelagos heighths limber" ; + dc:publisher ; + dc:date "2000-07-18"^^xsd:date . +bsbm-inst:ProductFeature289 + rdf:type bsbm:ProductFeature ; + rdfs:label "rallying specters" ; + rdfs:comment "azons acceptee husbander ashram relativeness grannies rectangles unearthing conies capered toeshoe fervour domination impishly satirically photonegative kaleidoscopic morticians eyewaters rapturousness" ; + dc:publisher ; + dc:date "2000-07-13"^^xsd:date . +bsbm-inst:ProductFeature290 + rdf:type bsbm:ProductFeature ; + rdfs:label "boggler" ; + rdfs:comment "animater granting twier geosynclinal relearns cosmopolis maizes gemmy unmixt mumbler laundries selenography unpin findings mistrusts porgy discontentedly bolter hulkier windily whoremaster sovietizes expellees reordain fondness nightspots boggier microvasculature fellatee holders inebrious upping mucking yugoslavs blondness" ; + dc:publisher ; + dc:date "2000-07-11"^^xsd:date . +bsbm-inst:ProductFeature291 + rdf:type bsbm:ProductFeature ; + rdfs:label "scuffs expulsing" ; + rdfs:comment "appal premenstrually fiddled disfavors sketchers inhumanities tightest unsatisfied cherubically stonefly mentally buddhists atelier eighteens smartly retaliates marbleizing trappings egomaniacal undercook roadstead reascend dekaliter grinning retakers paintbrushes cichlid ashlars conventual smoothen gombos appurtenance botchy nonchalantly atremble thieve overflows daimons enwinding crystalloidal reproval nontaxable crossbars troupes photoreception" ; + dc:publisher ; + dc:date "2000-07-10"^^xsd:date . +bsbm-inst:ProductFeature292 + rdf:type bsbm:ProductFeature ; + rdfs:label "hinder baedeker" ; + rdfs:comment "tortuousness caromed creamier sphenoid authors nabbing mistimes enactment agoraphobic footslog boycotting overabounding cinerary vixenishly rearwards eczematous chuckler farming drudging ruinable soothest highted incontestabilities archdeacons agendums somatotypology garnished headband curves mows skinfuls uncertainty craving incas maenades fitfulness mas creditors fixity churchlier assumed routines quartered mishmosh booms globoid" ; + dc:publisher ; + dc:date "2000-07-01"^^xsd:date . +bsbm-inst:ProductFeature293 + rdf:type bsbm:ProductFeature ; + rdfs:label "amnesics subversions" ; + rdfs:comment "syndicating orcas visas deprecatingly conceptualist reactivation comebacks matchmaking disinformation muffled granulator basketries warthogs childbeds empowers pantomimist riverbanks loosens foretime managers updatable unzip bayonets bruins abstemiousness advocates destitutely increasing workaholics situating repartees mobilizers anorak" ; + dc:publisher ; + dc:date "2000-06-24"^^xsd:date . +bsbm-inst:ProductFeature294 + rdf:type bsbm:ProductFeature ; + rdfs:label "youngling inessential" ; + rdfs:comment "magdalen inattentiveness filmstrips gusting runways tressiest obeyable lapps mooch defamatory whirs stealer pyramided motivates lapidates syllables showily orientates unhat smelting efficiencies calumniation adolescents loyalest steamboats excitability" ; + dc:publisher ; + dc:date "2000-07-15"^^xsd:date . +bsbm-inst:ProductFeature295 + rdf:type bsbm:ProductFeature ; + rdfs:label "recommending tussock sensitivity" ; + rdfs:comment "platy americanist photomicrograph wantonness parabolas massacring heatless episodes hopsack currying kb miscalled unweakened binned compactest pansophies palomino enureses ternate plottage brightly alkalinization underclerk fishmeal moulter valse kaleyards thaws hedonisms veiled tapes recension concusses enlargements" ; + dc:publisher ; + dc:date "2000-06-25"^^xsd:date . +bsbm-inst:ProductFeature296 + rdf:type bsbm:ProductFeature ; + rdfs:label "haltingly" ; + rdfs:comment "mislabel requiems epitomizes clipsheets quixotries uplinking handsprings flexors concurrences snarls postulator involutions cortically upshifts dinette footfalls untaxed personification subdirectors fleabanes greases paradoxical discusses nondiscriminating heaped aroused machining broccolis synergist toppled techie scarlets scattiest magnetometer wiling pretensions impenetrableness argils feedbox halvahs" ; + dc:publisher ; + dc:date "2000-07-17"^^xsd:date . +bsbm-inst:ProductFeature297 + rdf:type bsbm:ProductFeature ; + rdfs:label "flavonols blocks helve" ; + rdfs:comment "sachems snobbiest impetigos hawknose zulus inadequately potbellied fetters sensuality revalidate elflock bucketful egoisms welterweight friendship topsoiling securer reevaluated proclaimer murker awaiting ferried quinone dengue toxoids unacceptance antibody reinflamed rehardens steeper aerifies unum overbalanced disciplined vulnerably achromat gustative celebrants nonfreezing kindnesses fresher analogs viviparous cosets poleward sagest impellers" ; + dc:publisher ; + dc:date "2000-06-27"^^xsd:date . +bsbm-inst:ProductFeature298 + rdf:type bsbm:ProductFeature ; + rdfs:label "kidnapers" ; + rdfs:comment "enjoyed tailpipes raying prevued flickering inshrining subscript resubmit grandstander pellagras cunts paleographer obsessiveness windlasses songfest inartistically epergnes guarani sonarman hassocks yardages alterability tetralogy treaded elevators anathematize surveyed evolvements juicier suffered commonweals wallpapering ionicity inaptness refreezes pepsine" ; + dc:publisher ; + dc:date "2000-07-14"^^xsd:date . +bsbm-inst:ProductFeature299 + rdf:type bsbm:ProductFeature ; + rdfs:label "femininity" ; + rdfs:comment "shammes reappraises squishiest ethicists bedraggling shivering crimsoned bondable archness occulter overdramatizes liverishness dandles boosting embalms restamp chaining strugglers skullduggeries hums manger pomades alternately pressurized gamed materfamilias supervenes darkest finer seels triste" ; + dc:publisher ; + dc:date "2000-07-02"^^xsd:date . +bsbm-inst:ProductFeature300 + rdf:type bsbm:ProductFeature ; + rdfs:label "locos mambos" ; + rdfs:comment "pronators giddiest tensing frauds vapouring sucroses emulsifiable cesarian octagons stoically suppurative catarrhs triadisms foreseen wennier scurviest focuser recrowned cropped signatures plotting asks disembarkations rickettsiae clubmen reinduction chilblains intertribal balsamic exotism reintroduced charade cubage oarless humanoids observingly mudcaps ubiquities decapitating digged glockenspiels hearted sapid weeny colliers" ; + dc:publisher ; + dc:date "2000-07-21"^^xsd:date . +bsbm-inst:ProductFeature301 + rdf:type bsbm:ProductFeature ; + rdfs:label "dressmakers" ; + rdfs:comment "cylindrical treeing ferries proselyte victorians signifies limeades iterances expressionist sculked supplanter commitment indemnifying sudoral calcifying captivator versified prating pithier daily nearsightedly buskin recompensable capacitances bootee lockets enticement disservices strategists licensors kennelled barding autocrats lathworks blueings tiresomely outdistanced gothicize ejectable materiels homogeneously paintiest sneezers workboat interphone ascii" ; + dc:publisher ; + dc:date "2000-07-07"^^xsd:date . +bsbm-inst:ProductFeature302 + rdf:type bsbm:ProductFeature ; + rdfs:label "braincase" ; + rdfs:comment "unconnected instrumentalist topographical disgruntling pederast sceptring racier evens trimeter banes misdemeanor webless rehinge mitigative defamers naturalist accustoms reclean valiancies pilled bearcats tents demultiplexes" ; + dc:publisher ; + dc:date "2000-07-21"^^xsd:date . +bsbm-inst:ProductFeature303 + rdf:type bsbm:ProductFeature ; + rdfs:label "caskets gooky treadles" ; + rdfs:comment "skulking publicized typecase supervisors escapeway recoinage blinding execs conformism treasures durums rondelle drawing oppressing bores coplots monogamousness zoospores unlikelihood preengaged overhands limekiln penetrator ultrasound lymphocytic" ; + dc:publisher ; + dc:date "2000-07-19"^^xsd:date . +bsbm-inst:ProductFeature304 + rdf:type bsbm:ProductFeature ; + rdfs:label "sestines reproduce" ; + rdfs:comment "radiolucencies chefs feoffment conventionalism cascading machos abundantly godchild frequented misplacing repairers surfy antedating chunter cancelers photoflash mistaught testacies solidest incarnation arrayers gruelingly honorands slobs builders preadjusting cpl fosterage trulls fakers toepiece maximally bouldery hampshirites dermatologies" ; + dc:publisher ; + dc:date "2000-07-10"^^xsd:date . +bsbm-inst:ProductFeature305 + rdf:type bsbm:ProductFeature ; + rdfs:label "xxi" ; + rdfs:comment "flopover noctambulation frizzler submissively reconsolidate clapping enunciators championed nigglingly tongers liquoring reminder podiatrists tussocks reprice renovating chevrolets refolds fantastical polarity ennuis franchisers undiluted macaroons overexcited habitability reaching ethers gratias biers wretchedly warps poetess forthrightness kinaesthetically" ; + dc:publisher ; + dc:date "2000-07-08"^^xsd:date . +bsbm-inst:ProductFeature306 + rdf:type bsbm:ProductFeature ; + rdfs:label "casuals tosh roughhouses" ; + rdfs:comment "lukewarmly decorators viselike ionized pumpernickel durations legitimation hazings protracting beechier monopolizes yids flavonols scaler letup condignly gipsies spoonily forging workups drapers oculist aldehydes subassociation" ; + dc:publisher ; + dc:date "2000-06-28"^^xsd:date . +bsbm-inst:ProductFeature307 + rdf:type bsbm:ProductFeature ; + rdfs:label "reactivate" ; + rdfs:comment "forejudge graciousness carromed mal alpinisms alongshore proceeded institutionally ultraconservatives harpooner vises puffers trainful bordellos wayfarings cumquats jilter strewed imputing sibilantly venosities nosiness wharfs comediennes reprices manias" ; + dc:publisher ; + dc:date "2000-07-22"^^xsd:date . +bsbm-inst:ProductFeature308 + rdf:type bsbm:ProductFeature ; + rdfs:label "gastroenterologically obfuscators inflaters" ; + rdfs:comment "trichroic valvar vaporizing obsolescently feedboxes radiophone antibacterial singlets soaper deists untangle undergraduates kwacha discombobulation chargers slumping servantship vittled jadishly superabundant gibbeting signatary frypan" ; + dc:publisher ; + dc:date "2000-07-08"^^xsd:date . +bsbm-inst:ProductFeature309 + rdf:type bsbm:ProductFeature ; + rdfs:label "outbalancing judice taxonomists" ; + rdfs:comment "horsehides nonclassical sharecropped friendless flushers corrupted utilized emigres acolytes shouldering rassling surfs carvers braw weatherglasses soakers haggis hoisted cowlicks middlemost caroused reattach tenably tympanic binder foresters agamic busboys unrestored kneeler" ; + dc:publisher ; + dc:date "2000-07-15"^^xsd:date . +bsbm-inst:ProductFeature310 + rdf:type bsbm:ProductFeature ; + rdfs:label "gravamen" ; + rdfs:comment "chaplet newts deckle vegas overeducating replicates corks cinematheques charmers licitation geezer recombines admitters underpasses nighty ensnarled pardonable imperialness cowiest crimpers unmuzzles repacify poilu candors dictaphone youngsters stet millers impecuniousness likability comparts endemics reinsert clerkship halfbeak expansionary metaphysician effrontery helpfully hogs secures micks tacks" ; + dc:publisher ; + dc:date "2000-06-29"^^xsd:date . +bsbm-inst:ProductFeature311 + rdf:type bsbm:ProductFeature ; + rdfs:label "ukase" ; + rdfs:comment "oilstone guises clangs bendable maladministrative mopped halitoses quirts amortizable buggered dewclaw loners hydrozoon zinging reequips saddlebags exorcises laudability topside novelle chemoreceptor temporized bloodstreams housemaids sharks bannock resuscitative motets gruels choosier apologizes anticyclonic equalities struggled crappiness reuniter immixes ozonizes quashes unlivable" ; + dc:publisher ; + dc:date "2000-07-15"^^xsd:date . +bsbm-inst:ProductFeature312 + rdf:type bsbm:ProductFeature ; + rdfs:label "misfit" ; + rdfs:comment "backslider feminizing bretons overhauling streaky forejudge weepers dourness viceless hies tubercular refurnish taggers inquisitional rebecs mouthwash deaconing metastasis weans adjectivally troths apperceptive nonprotectively beckoning commiseration guttersnipes doctoring gymkhana sheepmen apologizers" ; + dc:publisher ; + dc:date "2000-07-04"^^xsd:date . +bsbm-inst:ProductFeature313 + rdf:type bsbm:ProductFeature ; + rdfs:label "scooting" ; + rdfs:comment "ortolan toadyish quatrains revalue straying restacks frivolously pierced fauces babus novelistic gills regresses fossilization lipless sulphurize ohmage procrastinator alienator travelled rivets thrivers pingrasses steps campier mismarks plushier proteinaceous bunco snoozes glitters finical simulants hippies skims engrave soundtracks huffish nonnegotiable eclectically hatsful shaftings disobeyers identifies wingspread exceptionally replan" ; + dc:publisher ; + dc:date "2000-07-06"^^xsd:date . +bsbm-inst:ProductFeature314 + rdf:type bsbm:ProductFeature ; + rdfs:label "submerges sorrowed" ; + rdfs:comment "aiming bedstraws tragically pollutants prefabricating isolation sextets rewarders approvement productive salaamed minatory ruleless microsurgeons circumambulate sapphisms nonsexually adjoined noticing deescalated habiting touristy unequalled lucidities discords matureness hydrocephaloid certifies undyingly doylies spellbinds" ; + dc:publisher ; + dc:date "2000-07-18"^^xsd:date . +bsbm-inst:ProductFeature315 + rdf:type bsbm:ProductFeature ; + rdfs:label "malfunctions suggestiveness" ; + rdfs:comment "prenatally govt unpolarized togae overjoying shirts reediness ecclesiastics awakens arrowing corncake crumbliness recommits viperish monkery unappetizingly quarrier speaks malthus overlook fatted archaists refreshed gayness filaree cirque vibrations leukemoid enquirer drossier prescience housewifeliness timed contentiousness constricting scramblers shivarees foilable dreidl tinfuls foolhardier downloading stuccos interpersonal doggish mislabel lowered" ; + dc:publisher ; + dc:date "2000-06-21"^^xsd:date . +bsbm-inst:ProductFeature316 + rdf:type bsbm:ProductFeature ; + rdfs:label "snoopers moulds punctures" ; + rdfs:comment "solubility beguiler aboil slavey strolling prorating dimming descents benthos viced bruising hetero romps polymerically undecided runners libidinal fustic escapements obols sandlots channelizes notational gongs" ; + dc:publisher ; + dc:date "2000-07-09"^^xsd:date . +bsbm-inst:ProductFeature317 + rdf:type bsbm:ProductFeature ; + rdfs:label "cots" ; + rdfs:comment "elks misspellings heedfully accelerative labella phlebotomy preeners diviners hugeness zilches amortizable roughness pullers remunerates doomsdays brisks coordinately unequaled stopcocks consistently bafflers drypoints nannies vialing trolleys ologist uncork rigatonis airhead remodification sereneness playsuit microtomy skewness reelecting prevailingly musicians sightings bylined reconveyed preconception overanxious sinfully scampi slaveries mishandles" ; + dc:publisher ; + dc:date "2000-06-27"^^xsd:date . +bsbm-inst:ProductFeature318 + rdf:type bsbm:ProductFeature ; + rdfs:label "canzoni writeoff" ; + rdfs:comment "ailment waggish tonicity ablutions randomizes innervations healthiness lights disassociates spinel countenancing expedites roped helloed querists halloo assignment rendezvouses dentistries climaxed filmlands frills poulticing nakedest jabs chlorites amused psychologists cloches adducers requisitioner gapes tessellation consecratory stilting adders unclothes flabbiest detrain gardening eyedroppers levied carroms uncourageous tormented destining reaffirmed" ; + dc:publisher ; + dc:date "2000-06-27"^^xsd:date . +bsbm-inst:ProductFeature319 + rdf:type bsbm:ProductFeature ; + rdfs:label "briquettes weirdie uranous" ; + rdfs:comment "communicates internship miscontinuance overgrows fledges elopes unkenneled warding assumable greenness swanned rapprochements burbles gastrectomy sporulate heres transferror pregame isostasy holsters implores" ; + dc:publisher ; + dc:date "2000-06-25"^^xsd:date . +bsbm-inst:ProductFeature320 + rdf:type bsbm:ProductFeature ; + rdfs:label "pourer" ; + rdfs:comment "grapes warfares refectories broadcasters tambura negotiations jargoned unknowingly appendectomies stalks shattering fluttering agonised hooligans deltoids dilatoriness regulars necessaries obstruction optics unlearned howdah banquets forcibleness bossa molester disturbingly evacuations mulattoes coheirs" ; + dc:publisher ; + dc:date "2000-07-03"^^xsd:date . +bsbm-inst:ProductFeature321 + rdf:type bsbm:ProductFeature ; + rdfs:label "advancement supplicated ophthalmologically" ; + rdfs:comment "staffing unkosher canceler denarius analytically firedamp mosts undetermined tauruses slipperiness daydreams judicatures knitwear inflammability degreasing sufficing prerecording sheriffdom boyfriends hedonics saucerized" ; + dc:publisher ; + dc:date "2000-07-12"^^xsd:date . +bsbm-inst:ProductFeature322 + rdf:type bsbm:ProductFeature ; + rdfs:label "bombardments" ; + rdfs:comment "pendulums painkillers biparental coving knighting chases suicidally extranuclear mights manifoldness thinker bawdiness thinclads vedic civicism avengingly flatulence assessment torchier uniquest dehorns roader irritableness discontentedness fruiterer algonquins wattages hecticly scollop subassociation overfurnishing healthiest unwarmed flinchingly implementable tranship" ; + dc:publisher ; + dc:date "2000-07-05"^^xsd:date . +bsbm-inst:ProductFeature323 + rdf:type bsbm:ProductFeature ; + rdfs:label "boiler" ; + rdfs:comment "scut procommunists muumuu sacristan instability darky philters microminiaturization nubbins suitability mimeoing subdirectors heptoses rousted webfoot heartiest sauted spittles triflingly chemotherapeutical spurned guardants unfriendly organists haplessness griddlecake synthetics coatrack erotogenesis armoured divestment nurser manacling merchandised vaulting prostatitis truckles gapes harborless blah sheds heeded triarchy euglena" ; + dc:publisher ; + dc:date "2000-07-11"^^xsd:date . +bsbm-inst:ProductFeature324 + rdf:type bsbm:ProductFeature ; + rdfs:label "unthriftily outplays" ; + rdfs:comment "reticules monaxonic cocomat imply tillages organelle progressing socializers gunlocks reciter parochialism cesuras birdcall woodlore proscriptive omniscience timorous triumphing misspoke abbreviates savannas thirstily canallers ocurred dipoles smelled pancaking praying beneficing hussar marquise mailboxes" ; + dc:publisher ; + dc:date "2000-07-21"^^xsd:date . +bsbm-inst:ProductFeature325 + rdf:type bsbm:ProductFeature ; + rdfs:label "accusant filially" ; + rdfs:comment "pedicabs ovules pieces workfolk rugger satirizer doable adolescently citied diverseness psychs wonderlands subsidizable fricassees waterfowl interlocution unevener rancours boggier finis helots spooning frolickers darkeners entombing hairbands lachrymatory enouncing fullering uncurbed rototiller fewer nixy distensions sotted" ; + dc:publisher ; + dc:date "2000-06-26"^^xsd:date . +bsbm-inst:ProductFeature326 + rdf:type bsbm:ProductFeature ; + rdfs:label "photometric calories parsable" ; + rdfs:comment "badinaging hornswoggling overexercised forested algorithms tournaments stomachic squinching liquefiers baronets nutmeats spurtles unseats flannelled speculums affright cento spraying yanqui bettered reclining quarterfinalist transmigrator inflections discouraged withering resides coiffed spadefuls monocellular predecease justifiers pilings noncorroborative agaves lights monomolecularly brassards" ; + dc:publisher ; + dc:date "2000-07-03"^^xsd:date . +bsbm-inst:ProductFeature327 + rdf:type bsbm:ProductFeature ; + rdfs:label "pored suits" ; + rdfs:comment "copulatory doodlers winey librarians featly heteronomous finks bushelers garlics reiving secretness tyke distraint ordainer tacos tubercled hemstitches spoiling counteractions nonvisually corroborations culls prechill impresarios tautest entangler manicurists" ; + dc:publisher ; + dc:date "2000-07-13"^^xsd:date . +bsbm-inst:ProductFeature328 + rdf:type bsbm:ProductFeature ; + rdfs:label "trailblazer countian" ; + rdfs:comment "cooch pubescence dipper isopropyl gossipers foreordain akenes admissibility wainscotting falconers wobblies woodcarvers portages arthrography plash conditions pythons possessors modernly nonadults kilos jnanas plowable crimpiest hyaenic swordsmen inflaters hearkened puckering teleradiography unambiguous disinterring chocks genders psychologized pasteurized bridling reoriented mibs" ; + dc:publisher ; + dc:date "2000-07-03"^^xsd:date . +bsbm-inst:ProductFeature329 + rdf:type bsbm:ProductFeature ; + rdfs:label "twitching godsends slapdash" ; + rdfs:comment "towered stertorous primeros riffraff machicolation grazer broncos dabbling honkers handsewn wagoners caverned chivalrousness archetypic crenated enzymologies expressionist diverters unclasps cabining treatabilities unsent unpeg occultism nonclerically anywise patly galls reclassifications nonautomated nonphysiological hearing viciously identifications ortolans cosie toothiest bastardize straiten complimenter frangible" ; + dc:publisher ; + dc:date "2000-07-20"^^xsd:date . +bsbm-inst:ProductFeature330 + rdf:type bsbm:ProductFeature ; + rdfs:label "chiseled deair moue" ; + rdfs:comment "noninductive windless plodder traditionalism venine trephining endocrinological downstroke safest hogtie dialled rosin diagrammatical voles tref paleontologists viniest humanizers bargained hypnotized forbiddance autographing greetings violoncellists contaminations pellagras trampling mosser peninsulas vinosities preaccepting miscall intermittence rivers trendier ichthyoid misidentification" ; + dc:publisher ; + dc:date "2000-07-15"^^xsd:date . +bsbm-inst:ProductFeature331 + rdf:type bsbm:ProductFeature ; + rdfs:label "detoxifier schmoos coddles" ; + rdfs:comment "cymbals suppressive guided boxer calorics animates fluctuated streamer oaten trekkers emotions workbag approximation jingoistic abominators paned tawniest reciter stomachache singers volga frizzliest flagger monopolization mayvin coagulator duellist taxis amerindians columbines coloration" ; + dc:publisher ; + dc:date "2000-07-20"^^xsd:date . +bsbm-inst:ProductFeature332 + rdf:type bsbm:ProductFeature ; + rdfs:label "scansion" ; + rdfs:comment "scathing peskiness appeared reminiscing exudative debtors collop stalags comities dognaped belfries gardens caulking contributing conquering overachieved nerving sumpter lures reprovers thornier feeblemindedness numerously" ; + dc:publisher ; + dc:date "2000-06-26"^^xsd:date . +bsbm-inst:ProductFeature333 + rdf:type bsbm:ProductFeature ; + rdfs:label "stodgiest crooned" ; + rdfs:comment "kilovolt godliest mendicant tremens snatchier traveling polariscopic hydrargyrum stripteases subassemblies sensitization heavies fabricated cookshops wrestlers rosery synchronizes spillage wagoning proportionately reradiate evisceration busting nympho yetis dyarchy telegraphed plateaux cooch" ; + dc:publisher ; + dc:date "2000-06-25"^^xsd:date . +bsbm-inst:ProductFeature334 + rdf:type bsbm:ProductFeature ; + rdfs:label "felted compresses marbles" ; + rdfs:comment "specifiers harried coursings gauntest millibar aquanauts xxi swanked basements miscognizant vigour sprier troche shirr diagraming sedulousness nervelessness pilings sandblasters etagere groundswell prosceniums casualness preconceived hearthstones melodramatists reanalyses" ; + dc:publisher ; + dc:date "2000-06-22"^^xsd:date . +bsbm-inst:ProductFeature335 + rdf:type bsbm:ProductFeature ; + rdfs:label "muskmelons taskmasters" ; + rdfs:comment "punctilious flexor draftees vignetting foxed incommensurately miffing jeerers labor lichenous coleuses huffiest conjuror pervades fagotings intestinally quagga vasomotor joineries indicative repentantly individualizes manageress outlying canoed" ; + dc:publisher ; + dc:date "2000-07-01"^^xsd:date . +bsbm-inst:ProductFeature336 + rdf:type bsbm:ProductFeature ; + rdfs:label "zanier reconstructed" ; + rdfs:comment "substantival unblinking bodings nonslip redoubt nonphysiologically drowsier fainer drains chilliest interpreters incubated loganberry planarias outranging legitimation wooshed cruciform ukase gelid tardies weaponless addictively arteries compensations indetermination flinting parring shiksas scag reinvoking specking woollier overrides dayglow facers napalms outsmarted dict consolidators syrian reemphasis terrorist libretti" ; + dc:publisher ; + dc:date "2000-07-18"^^xsd:date . +bsbm-inst:ProductFeature337 + rdf:type bsbm:ProductFeature ; + rdfs:label "presidium sherberts eighties" ; + rdfs:comment "indoctrination imbed skipperage disrespectful aikidos faking compatibilities survived gonadial safaris depictor warrantable ozonization viaticum numbed saving biscuits counselee spectating syphilis agrees preacher interdicted circumambulation elocutionist bulges pities freakout" ; + dc:publisher ; + dc:date "2000-07-15"^^xsd:date . +bsbm-inst:ProductFeature338 + rdf:type bsbm:ProductFeature ; + rdfs:label "schnook exorcised" ; + rdfs:comment "electrodynamic spryest millibars forasmuch celerities stragglier forjudge equational chops valetudinarians inquirer comforting speleologists foretoken prepossessing iambuses lockers flows southers mynahs meltdowns curbstone orbited homesteader lyrebird biggies millstones unshelled recompensive facia violinist" ; + dc:publisher ; + dc:date "2000-06-28"^^xsd:date . +bsbm-inst:ProductFeature339 + rdf:type bsbm:ProductFeature ; + rdfs:label "selfsame" ; + rdfs:comment "brittled doping pygmyism glosses reappeared tines cuts tautologous downtowns tremens runny overtones batholiths socketed penpoints gambian kedged sharped unaccented ducats prorogations allegorical optative wavered techies supposing repapering rewed beryline precised entree orangeades comfits megalopolises shiksas audad undiversified laciness densify unworthier tamest interferences verbified divvying glimmerings snips prescribing" ; + dc:publisher ; + dc:date "2000-07-01"^^xsd:date . +bsbm-inst:ProductFeature340 + rdf:type bsbm:ProductFeature ; + rdfs:label "cutest vignettists" ; + rdfs:comment "heeder hemstitch reechoing flagellates rainout reflowers scything overseers oxtongues stocker fulltime eyepoint sourdoughs pester salivates manipulator ectoplasmic mesmerizes kicked chains innately invisibleness pausers bombardment brutifying sinfully suppuration unwarily troops rancidities hexylresorcinol foreheads ethers sanga gynecologists kinglets roubles boogers spoilsport hoodwinks harking secedes wires trains cuniform" ; + dc:publisher ; + dc:date "2000-06-23"^^xsd:date . +bsbm-inst:ProductFeature341 + rdf:type bsbm:ProductFeature ; + rdfs:label "volumes bebopper astronauts" ; + rdfs:comment "rending figures hecatombs syllogistically summarize credibleness sitcom atheists sparkling weakly disarmament embankments nontransparent luff darkeys retirees redeem troubling narwhal unexpected landscapers presets benefactresses lovebirds heists psychosomatics substantival exogamies expressiveness glitches occlusions indulging antiquing truckage pimplier stubbier arrangers keeps solanums" ; + dc:publisher ; + dc:date "2000-07-04"^^xsd:date . +bsbm-inst:ProductFeature342 + rdf:type bsbm:ProductFeature ; + rdfs:label "bruskness stereoscopical" ; + rdfs:comment "townsfolk heatedly alerters bourbons youthening laying sardinian sweatboxes sensibles improvisers uninformed weeds outfox obnoxiously detrimentalness recoinage flights occultism americas unpatentable earlier meretriciously sunning dodoism electrocute whickered deifying dimmer probably splendider snazzier jollified allocations fewnesses jiggliest commutable fetterer coagulation midsummer protestations" ; + dc:publisher ; + dc:date "2000-07-01"^^xsd:date . +bsbm-inst:ProductFeature343 + rdf:type bsbm:ProductFeature ; + rdfs:label "hurried" ; + rdfs:comment "amebae jejunums disallowing membered thermotropic nonfatal jackhammers articulating internationalizations gaper savageries wirephoto deanship endoscopic acceptees wrasse syndicator rely sortieing withholders authenticators equities formalize anguses barwares prehardened depreciatory belaboring" ; + dc:publisher ; + dc:date "2000-06-30"^^xsd:date . +bsbm-inst:ProductFeature344 + rdf:type bsbm:ProductFeature ; + rdfs:label "edicts sequestering" ; + rdfs:comment "exalted retaliation prefixes ovolo muddiness churlishness mossbacks invaluably plights bicolours rabelaisian coagulations missiles husks mixtures decoct tumblers chints overinclining hymnodies omnium tintless displanted dispatching annunciated flytrap vireos unrevealed intakes lowerclassman relinquisher devitalize ignominy ailerons tarpons forfeitableness epergne angelfishes" ; + dc:publisher ; + dc:date "2000-06-23"^^xsd:date . +bsbm-inst:ProductFeature345 + rdf:type bsbm:ProductFeature ; + rdfs:label "dentals" ; + rdfs:comment "blockaded wirers resolvable eyeholes opening virilities blowhard valences novelist sodding summerier statism brights caulker deactivation cocoas absolutistic permutations perpetuating synchronizing isotopically budgeting apostrophizes remissions shining bulgiest ambitiously peerlessly sentimentalists despairing jackscrew disbursed plunging novas sourer vigorousness sorghums mummed melting redbirds melodiousness antirational inattentively crosser unvexed" ; + dc:publisher ; + dc:date "2000-06-20"^^xsd:date . +bsbm-inst:ProductFeature346 + rdf:type bsbm:ProductFeature ; + rdfs:label "underestimating" ; + rdfs:comment "warrants godliest inflected entropies overawe seabeds extraneousness livelong mutably outshined goitre surrenderor maddish bursal rightest exits plottage aspca color categorizing ullage curber resown" ; + dc:publisher ; + dc:date "2000-07-16"^^xsd:date . +bsbm-inst:ProductFeature347 + rdf:type bsbm:ProductFeature ; + rdfs:label "editions lucubrated quintupling" ; + rdfs:comment "advancements misarrange sweatshop generalissimos decimates named antitoxin prognostic outgrowing swatted prepossessingly larding nonclerical dramatization tariffless microfilm encouraged tamperers exceptions glimmering harries charming" ; + dc:publisher ; + dc:date "2000-07-05"^^xsd:date . +bsbm-inst:ProductFeature348 + rdf:type bsbm:ProductFeature ; + rdfs:label "wakens" ; + rdfs:comment "caricaturing teraphim outweigh dryest groundhog deathblow snorkeling pestilently pantsuit mayoralties sirs labium denotes lummoxes platting leerier furnaces flensers clinicians facileness roubles recast flagellant gooier tailoress unpalatably" ; + dc:publisher ; + dc:date "2000-06-27"^^xsd:date . +bsbm-inst:ProductFeature349 + rdf:type bsbm:ProductFeature ; + rdfs:label "cognized" ; + rdfs:comment "avaunt proclaimed understudying overplays ratfink missions frizzled tweeds forworn roasters celebrationis cosets hipness consenting lining ovulated voteable veriest switchbacks filmily elaborating didies pleading bovid outrank cringles unsolder chickens taurine hognuts congratulates fantastical varnishes sackclothed fumier electrosurgeries wankel glaciating" ; + dc:publisher ; + dc:date "2000-06-26"^^xsd:date . +bsbm-inst:ProductFeature350 + rdf:type bsbm:ProductFeature ; + rdfs:label "byroads" ; + rdfs:comment "sageness radiobiology tensionless polyhedrons paeans slowish hydrotherapeutic maples crocked vivifying desolated domines plainer refining unleash manurer thwacks pickled amplifies oratorios hypocrites cooks foldaway impossibilities hornets anesthesiologies cliquiest preshapes cogitators establishments ditchers gappy sufflated careerers anvilled defenselessness torchbearer warmness" ; + dc:publisher ; + dc:date "2000-07-06"^^xsd:date . +bsbm-inst:ProductFeature351 + rdf:type bsbm:ProductFeature ; + rdfs:label "newswoman" ; + rdfs:comment "ensures emotive easting lariating paratyphoid separates plenishes guitars planetariums literatures melodized playacts arraignments livener prohibiting bonesets pussiest geminating dihedron rezone isolationists beebee undoubtedly bullied interpretable oasts synthesizes maples boff recoil superscription methought migs sumacs" ; + dc:publisher ; + dc:date "2000-07-19"^^xsd:date . +bsbm-inst:ProductFeature352 + rdf:type bsbm:ProductFeature ; + rdfs:label "advocatory ovations heliotropically" ; + rdfs:comment "truckmaster rewording noncontributory compartments sacristry horsehides lucidly rousers sluggardly synovias superlatives stylizing bifold expressions strokers jadedly gamines destitutely uncharged whiffled reinters trey thymey aberrancies shamed seeks disestablishing steeper seasonable congruences accounter presupposed enactment whereunder arches amassers spikily renames assertors holdbacks cowling brownies nazifying smelters instances coarsened quia addles hor reverencer" ; + dc:publisher ; + dc:date "2000-07-03"^^xsd:date . +bsbm-inst:ProductFeature353 + rdf:type bsbm:ProductFeature ; + rdfs:label "pucker premiss untaxed" ; + rdfs:comment "libellees affluxes mislabeling symboled uncomplicated trashiest egocentricity ahems solarizes cyclotrons drovers organists shellier fixup insulation unadvisedly awfulness banking compressions serfs quants intoxicatedly renouncers brayer fluffs dishwares sickbays" ; + dc:publisher ; + dc:date "2000-07-02"^^xsd:date . +bsbm-inst:ProductFeature354 + rdf:type bsbm:ProductFeature ; + rdfs:label "sexiness penetrates miters" ; + rdfs:comment "indicium pastured cutcheries stuccoers capsulation nymphos antecedence bypasses defalcated jackroll sorters leeriness unpacified ceramicists backlist lacks epoxied ambergrease bushier wriggled exploiting nacelle complexity barriers oppugn narcotically starver sconces overripe suborners pickled chastities frisked anteceded lavishness" ; + dc:publisher ; + dc:date "2000-07-01"^^xsd:date . +bsbm-inst:ProductFeature355 + rdf:type bsbm:ProductFeature ; + rdfs:label "culls interbank" ; + rdfs:comment "zionist groggery opposers rollicked diarrhea expectoration thinker hopefully inactivities lengthily enrols macrocyte oversubtle desecrates unquotes clopped darks corpulently opprobrious hikes pressor bedecked solemnest fritterers vouchsafed ritard fantasied bedew regild psychodramas foothills intermitting interlocutors yrs gracilis hoariness fortuned goth burblers manager" ; + dc:publisher ; + dc:date "2000-07-15"^^xsd:date . +bsbm-inst:ProductFeature356 + rdf:type bsbm:ProductFeature ; + rdfs:label "nonnegotiable sanest" ; + rdfs:comment "ablations agamic ejaculators pumicing challenged intercalating rebaptism tamburs rainfalls precalculates undocking antiserums propanol driftpin captaincies unlay stargazes lunes gymnasiums underran imitated forbidder loveliness tufaceous gonophs clarification inactivities hepcats" ; + dc:publisher ; + dc:date "2000-07-11"^^xsd:date . +bsbm-inst:ProductFeature357 + rdf:type bsbm:ProductFeature ; + rdfs:label "keloids" ; + rdfs:comment "ultrared paralyse mammalians maleficently outraces shrubs sections wrangles turnhall bacchants lynching cuniform galores retracts searcher floodway misbehaver prevued graecized tilter martialling drumheads slits purifier forsworn desiccations partaker insanity waterspout hawses bighted renovated watering individualized pregnantly" ; + dc:publisher ; + dc:date "2000-06-27"^^xsd:date . +bsbm-inst:ProductFeature358 + rdf:type bsbm:ProductFeature ; + rdfs:label "patenting" ; + rdfs:comment "glarier authoritarianism catguts mondo shuffler venues fleche charnels calamines bb fanwort surcharger actuaries cursoriness framing unroofed earnings divot redirected bubbliest gesticulating theobromine gravers depletes absconded attachments frumpiest chiropody spaniards celestas esteemed nixie ruiners flooded throwers prorogations snood revulsive ranker rickshaws internationalization drudged rambunctiousness" ; + dc:publisher ; + dc:date "2000-06-23"^^xsd:date . +bsbm-inst:ProductFeature359 + rdf:type bsbm:ProductFeature ; + rdfs:label "misdeals" ; + rdfs:comment "hollooing scandalization enfeeble phalloid hoofer ordinariness rippliest kiting precipiced mumbler mayest pitchiest organizationally spacewalking copyists timesaver grampus trusty menarches differentiation swashbuckler accommodations limping docudrama pars flincher tugs frumps estranges potpie lips generousness clears pasts nubs squintiest sarcomas fryers dekameters surprised subdebutante mitigatory contentedly semiconductors astonishes buckling reletter historiographers fundamentals upbraided" ; + dc:publisher ; + dc:date "2000-07-20"^^xsd:date . +bsbm-inst:ProductFeature360 + rdf:type bsbm:ProductFeature ; + rdfs:label "biol" ; + rdfs:comment "bureaus reglazed amnionic vociferations acrylics gushing reglosses saner looses foodstuffs aerosolized sightless balks excessively cervine kilty advancements laboratorial catalyzes epilepsies pressoreceptor journalizing" ; + dc:publisher ; + dc:date "2000-06-27"^^xsd:date . +bsbm-inst:ProductFeature361 + rdf:type bsbm:ProductFeature ; + rdfs:label "chillum" ; + rdfs:comment "prearrange lusted smothered weirdies cliched pavans twitched uncage troublous twirp corruptibilities skeletomuscular appendages blissfulness propositions sherbert flavour boozily eunuchoid overelaborating predeceasing carefuller bussed" ; + dc:publisher ; + dc:date "2000-07-09"^^xsd:date . +bsbm-inst:ProductFeature362 + rdf:type bsbm:ProductFeature ; + rdfs:label "quitclaim fetted generalissimo" ; + rdfs:comment "lions galatians joints jilting inhalations homiletics comforted sparable tongueless judgmental endocrinic locked menstruated biform parisians perusals oversells oinks overdramatizes ghostliness shapeless intervened fleetness bobbins tonsures denudate fruiterer" ; + dc:publisher ; + dc:date "2000-06-25"^^xsd:date . +bsbm-inst:ProductFeature363 + rdf:type bsbm:ProductFeature ; + rdfs:label "ideogram banterer spellbinds" ; + rdfs:comment "handsbreadth frumpish raindrops sybaritic variabilities dissecting accommodation internally gobbles unroofs woolly blase kinder trephined polarimetry shinsplints rentals parochialism palmy registrations bruising infundibula disclaim psychosocial sextile perpendiculars reapplying stratifies tattooers experimenter hypothesizing alining" ; + dc:publisher ; + dc:date "2000-07-06"^^xsd:date . +bsbm-inst:ProductFeature364 + rdf:type bsbm:ProductFeature ; + rdfs:label "frilliest" ; + rdfs:comment "lifesaving handles ranger krona noncancerous agonist blighters pended isolator glasswork ulcerative foehns beastliest swamies blandishers praised cuboidal snatched pebbly fuming cumulative cinching midbody mossbacks syncope pharyngectomies grievingly" ; + dc:publisher ; + dc:date "2000-06-28"^^xsd:date . +bsbm-inst:ProductFeature365 + rdf:type bsbm:ProductFeature ; + rdfs:label "butted purring" ; + rdfs:comment "perpetrates immunology subdistinction articulating nastiest decadence spangliest sploshes misplacing caddied rcpt anathematize crafted hinting squelching interferers matched larkier flyby cannie hyperglycemia heightens drillers honorers flattered greasing experiencing blazes broacher undiplomatic expatriates colonials metabolized hormones" ; + dc:publisher ; + dc:date "2000-07-13"^^xsd:date . +bsbm-inst:ProductFeature366 + rdf:type bsbm:ProductFeature ; + rdfs:label "gladding generates" ; + rdfs:comment "unhooking reiterated hexapodies complimenting overhastiness cynicism sunbaked obtusely vies inurn deacidified shewn dejects mocks chintz resowing unheard boasted potman householders mendelianist leaguing creditors tussocky intuitions overheat interorbital knavishness electrophoresed salines allogenic sawed anachronisms schmoe didoes dreaming intwisted remunerator sympathizer removes fearer wirepullers mincier thwarters throatiness pseudoscientifically intercalation anointers voyaging irradiations" ; + dc:publisher ; + dc:date "2000-07-02"^^xsd:date . +bsbm-inst:ProductFeature367 + rdf:type bsbm:ProductFeature ; + rdfs:label "nonmeasurable" ; + rdfs:comment "cognised demurrages equivalently unsticks subminiaturizing summating physiological supraorbital leakiest gunless oversea unproportionate fluidic nudeness poems seigniorial plosives polities restrictive tanglers polarimetries tracers casteism retested maleficent ceiler surmisable cooers administrated mensed autographs superimpose valuational angularity schlock dissemblingly cyclos delimiter brewers incidentally medicates touts reproaching etchings somnambulistic speared amniote christens cagers" ; + dc:publisher ; + dc:date "2000-07-06"^^xsd:date . +bsbm-inst:ProductFeature368 + rdf:type bsbm:ProductFeature ; + rdfs:label "physiologist" ; + rdfs:comment "fixations berber unconcerned politely confessable vileness suburbias marguerites goatish stirrers ducking deathful shocks preappoints basinet achingly mignonette schnook rampaged defects multinational dibbing preascertaining petalled uglifiers draughting immunes subtotaled campaigns petnapping competitors nimbly underscore influencing" ; + dc:publisher ; + dc:date "2000-07-15"^^xsd:date . +bsbm-inst:ProductFeature369 + rdf:type bsbm:ProductFeature ; + rdfs:label "rearguing coccygeal dagobas" ; + rdfs:comment "thiamines cryptically subdebutantes putters caucuses resiliently salaaming intersexualities plumpening freebooter bespreads methodologically paralyze thiabendazole stirs disproportions buckaroos hectograms timidness profanes detainee treys sanatory ungallant diapasons drunkometer boggiest provable dabbled frangibility rashes thoroughbreds mecums" ; + dc:publisher ; + dc:date "2000-07-14"^^xsd:date . +bsbm-inst:ProductFeature370 + rdf:type bsbm:ProductFeature ; + rdfs:label "inures" ; + rdfs:comment "schussboomer misspell outmarches apprising underwriters precessing biting furnished retrogressing pretrial pulldown phantomlike tapeline hollies decorating widgets conformations environment ovately vibes manured ineptitude omnivorousness quintals lightfaced vivacities flights reinduced dithered prewashing semipetrified dualizing jerkers gabbled plummy corrupter persecuting arizonans" ; + dc:publisher ; + dc:date "2000-07-09"^^xsd:date . +bsbm-inst:ProductFeature371 + rdf:type bsbm:ProductFeature ; + rdfs:label "overawed" ; + rdfs:comment "flexes watercolors hagridden pragmatically trimness mites tiredly whitening oversights perfectas rungs toughy throatiest cutest pastorates socializers ohmage cameoed industries grides fascinating verbalizing gunwhale minsters glottises damnification thews fictionally sandpapered ironclad erasures" ; + dc:publisher ; + dc:date "2000-06-21"^^xsd:date . +bsbm-inst:ProductFeature372 + rdf:type bsbm:ProductFeature ; + rdfs:label "lucifers yews" ; + rdfs:comment "frillers bailie thirteenths delinquencies tubbers wished warhorse dhotis tuppences whereat effuse premising folder subplots viscose deplorably chillness guarding fumigator fluorination asperities susurrus" ; + dc:publisher ; + dc:date "2000-07-15"^^xsd:date . +bsbm-inst:ProductFeature373 + rdf:type bsbm:ProductFeature ; + rdfs:label "crawdad" ; + rdfs:comment "odeons shindigs electromotive supervision probation profited subsidiaries endeavored yarer unmapped bequeathal fumblers finesses momism jubilates rockworks instituter privater feelings nuthouse" ; + dc:publisher ; + dc:date "2000-06-25"^^xsd:date . +bsbm-inst:ProductFeature374 + rdf:type bsbm:ProductFeature ; + rdfs:label "viridians cardiotherapies" ; + rdfs:comment "torched junto arbores quiverer mimeoed handfuls querns punty recounts pervading hottish pelted reembarking chunked griper videotapes anoint misinstructs precluded bullshit escarped pneumas inclusions jeeringly perforates fishlines midden nuggety overwhelm washrooms reframed uncannily beechiest solderer remained clunking sententious nonproven recrowned" ; + dc:publisher ; + dc:date "2000-06-26"^^xsd:date . +bsbm-inst:ProductFeature375 + rdf:type bsbm:ProductFeature ; + rdfs:label "register residuals" ; + rdfs:comment "communication resows armer mouldering untraveled hennaed decreasing threes pockily meantimes preventability facias possums garroter fatherhood addiction trowel tetra proctorship nickelodeons microanalytic impudently slumbering convalescents coamings laggards fops tendentiously temptingly undisputable requiescat allotments aerodromes brands twigs oppressed heavens immolation cutters biform caudated turbojets sacrilegiously midwifed betatrons tractably extravaganzas masculinization vadis" ; + dc:publisher ; + dc:date "2000-06-21"^^xsd:date . +bsbm-inst:ProductFeature376 + rdf:type bsbm:ProductFeature ; + rdfs:label "redrafting" ; + rdfs:comment "hasenpfeffer nonreflective ululating heros priesthood deaconry unpolluted yachtswoman dimorphous attachments betake feticides hideless whippy renominated devolved elicitation uncontrolled tetryl finalisms barricaded debasement traditional mushes reinterpreting champions imagisms gawkish avatar bamboozler brassiest unobstructed bumpily drolling lucking disputer winks accommodating portending jauntier gripers dairymaid schnaps abreacting reexhibit latinized mucks" ; + dc:publisher ; + dc:date "2000-07-07"^^xsd:date . +bsbm-inst:ProductFeature377 + rdf:type bsbm:ProductFeature ; + rdfs:label "predestinate pard regally" ; + rdfs:comment "reamer sibilates abscam segues southwesterly rectors potpies inconveniences screeners overslips transmigrating punkier housebreaking lutenists aerodynamically gumwood repousses pledging copers litterateurs declassing goldbricks burins scattered catalytically tapestries interpolated subcontinent teasels lycees proselytes droplets rebill remorsefully radiocast gallbladders quatrains lionize daintily biggings prechill pulpwood weaners ovoid productions lugubrious mainliner" ; + dc:publisher ; + dc:date "2000-07-05"^^xsd:date . +bsbm-inst:ProductFeature378 + rdf:type bsbm:ProductFeature ; + rdfs:label "execeptional tarsals unhygienic" ; + rdfs:comment "cafeterias lancelot seminally misnumbering countability preinstructs imbued prename goldbricker distributution propitiating flays quotably saltshaker misdescription cheesecakes subchief agitators redacts prosecutable succouring conglomerates undersell" ; + dc:publisher ; + dc:date "2000-07-07"^^xsd:date . +bsbm-inst:ProductFeature379 + rdf:type bsbm:ProductFeature ; + rdfs:label "wrongheadedly enamoured" ; + rdfs:comment "hungering cavorters hagride distension throwaways relinked nonenforceable tenuity siroccos mulled grippier cuss corned syne overbearingly bruin aurally dissembles sagged bloodstreams metricize typecast bejeweling contaminations diagnosticians dyslectic ionising bonged humanistically hadjes nonviolence statutableness burbly cinques greaves restitutions empowering orientate bullocks rathskellers roofline cleated evangelize" ; + dc:publisher ; + dc:date "2000-06-24"^^xsd:date . +bsbm-inst:ProductFeature380 + rdf:type bsbm:ProductFeature ; + rdfs:label "proneness nasturtiums" ; + rdfs:comment "applauders fascisms steamily astrolabes bequests platy foreshadows saddletree tastelessly fulfillers autogyros wormhole restaffed enjoyably centrums slouched vindicative graphites firetrap slobbery checkroom implementing tything metropolises reinterrogating kitschy tootling borrowers trusses sited anatomically reinvestigations overdefensive frontlets coiffeuses haunters laboriousness hoorays orangier" ; + dc:publisher ; + dc:date "2000-07-14"^^xsd:date . +bsbm-inst:ProductFeature381 + rdf:type bsbm:ProductFeature ; + rdfs:label "scholarship" ; + rdfs:comment "organically kneecaps reddle tempers suavest bibbery greaved expressions cockscombs pulpiest foremen mandalas brooches undesigning strayers pitiableness loginess impermanently surrejoinders semolina cathexes globing admitter cocomat retrievable homespuns baselines concisely penile clarifies euchred gladlier conveyable bluchers lovebirds smiths repentance fubbed inexpressibly autodialled depriving" ; + dc:publisher ; + dc:date "2000-07-16"^^xsd:date . +bsbm-inst:ProductFeature382 + rdf:type bsbm:ProductFeature ; + rdfs:label "gluts barbering sacramental" ; + rdfs:comment "daymare lyrisms hounder snuffs obsoleting stamping demarking eradications supplely garrets fatheads sorghums ethics invalidated chaperons unpopular cowbells gadgeteers ejected displayed exterritoriality arcs pasteboards realignment nimrods stripings diffusers naiveties leafworms gulpers mathematicians townfolk preprocessing satori tauter meadowsweets budgies tipcat flocky fervor vied elmier probates fenestration" ; + dc:publisher ; + dc:date "2000-07-10"^^xsd:date . +bsbm-inst:ProductFeature383 + rdf:type bsbm:ProductFeature ; + rdfs:label "clerestories busted" ; + rdfs:comment "broomsticks condoles anesthetically parked effervesced supports ampuls palpating dirtier droning letches stickpins toepieces acromegalic fakers skyjackers nucleates legation plastics cauldrons askings untraceable asininity crockeries sweating mammalia bitted peristalsis pillowcase unpalatable desisting usherettes" ; + dc:publisher ; + dc:date "2000-06-26"^^xsd:date . +bsbm-inst:ProductFeature384 + rdf:type bsbm:ProductFeature ; + rdfs:label "twins whoring lasciviousness" ; + rdfs:comment "fists totals ransomer reunion semidry webs guardians tapes dupes humanism disinfecting profaned cruzeiros candelabrum storybook valors knappers vested pistachios tribadic rockfalls javelins diagrammer modernization obfuscates macrames obeisances sociologist uncomfortableness disputants waterloos" ; + dc:publisher ; + dc:date "2000-07-15"^^xsd:date . +bsbm-inst:ProductFeature385 + rdf:type bsbm:ProductFeature ; + rdfs:label "marauded rescues uncial" ; + rdfs:comment "shoos jesters failed thumper corruptions circularness plotters niggarded jerkers helmeted vegetates zoopathology forkedly rounder affirmer commentate ricks stapedes consignees erogenous permutationists oftest coiler quotationally temperaments barracudas interrelatedness sudors airmails mattedly belongs cyprians peruser antiacid exfoliate onery arrowheads veinings" ; + dc:publisher ; + dc:date "2000-06-25"^^xsd:date . +bsbm-inst:ProductFeature386 + rdf:type bsbm:ProductFeature ; + rdfs:label "hoopster torchiers contemner" ; + rdfs:comment "forehandedly infirms joisted resemblances electroplated parlours sighting uninvitingly shirks pastellist stuffiest melancholiac prepossesses catchiest yawls druidess seamount hunger conventicles exploded rankness modelled classicist sanity basketries denaturants mellowly filtering taring touted tollgatherer procreated rived healthily thraves noncasual squirmiest unmitigated stigmatized interviewed rehanging thighbone sniping bioastronautics magmatic freebooted" ; + dc:publisher ; + dc:date "2000-06-20"^^xsd:date . +bsbm-inst:ProductFeature387 + rdf:type bsbm:ProductFeature ; + rdfs:label "relieving dissidently tirelessness" ; + rdfs:comment "americanize windages clack flanges sorts pickets caftan blubbers curliest sentences limo coveter spokeswoman pixie scurrility uploadable amplifiable postmarking sparkling affaires irrigator turbidities sunup samoans commingled sloths torrider venezuelan jeweling lozenges reexported reconfiguration reglues gamer amazons dimmable ramblers frizzy dobies enameler cabling checkering annulet synapsis" ; + dc:publisher ; + dc:date "2000-07-08"^^xsd:date . +bsbm-inst:ProductFeature388 + rdf:type bsbm:ProductFeature ; + rdfs:label "pesters brutishness maidhoods" ; + rdfs:comment "laborings patsies maceraters transforming woolmen baldric eminently catenas nightjars beshrew unseen overhurried detesting steadily strabismally communists refunded rostrums regressors luaus chocked physiologists unhip psychoneurotic" ; + dc:publisher ; + dc:date "2000-07-01"^^xsd:date . +bsbm-inst:ProductFeature389 + rdf:type bsbm:ProductFeature ; + rdfs:label "typographers yearling limiteds" ; + rdfs:comment "rattlers chlorates rears trolleys outreaching certificating tumbling garoting judaica occults alcalde sadhus hermaphroditic preestablish thinkers abandoning noter hayrick agapeic gallimaufry pickwickian chining benchmarks corrodibility reservers motorbuses capacities canonizes striating gelees upstages sinker silences yogas heroizes maximite ainus classifier botanists footboards tinworks blockading saccharification quern stylers madcaps warlords acquiesced predator nehemiah" ; + dc:publisher ; + dc:date "2000-07-03"^^xsd:date . +bsbm-inst:ProductFeature390 + rdf:type bsbm:ProductFeature ; + rdfs:label "scallions weaved" ; + rdfs:comment "leaving physiologist prologued kakistocracies staled shaggiest helve dozening freeholder prodder commenting bushed catnaper commits slathers cesurae elfins finagles gloats buffer sapphism momentums shriekier encrypts selectees simmered reproductions homeroom greeting bogles muggily eternizes researchers necrophilous pressurize ambiences" ; + dc:publisher ; + dc:date "2000-07-19"^^xsd:date . +bsbm-inst:ProductFeature391 + rdf:type bsbm:ProductFeature ; + rdfs:label "relegates boer linguinis" ; + rdfs:comment "icecap congealed slues jams vivaciousness pinched consumes apprenticing hrs clonally jabot hiatuses entoiling aleuron deponing disfunction affirmance envisioned tangibles limitless vulcanizes extractive sprawls stockcars invisibly tantalization inofficial brownier coalhole fellate demolitionist uprousing handbooks canonistic irades dominantly requiems inspirationally tissuey sonatinas uncivilly grouped scalper chestier essayer blent optimisms woodworker foresighted nabobisms" ; + dc:publisher ; + dc:date "2000-07-17"^^xsd:date . +bsbm-inst:ProductFeature392 + rdf:type bsbm:ProductFeature ; + rdfs:label "bulletproofs manliest" ; + rdfs:comment "auriform recooks jaywalks corders resubscription lifts indorsees polios deregulations misogynistic beneficiaries dimming owns oceanarium lordship peacher raga bluecap blockbusters commending wifehood chivvied acquirers cozie reprice delist palmistry buncos scrubbers souped outlaw exurb swerves malteds prelimiting icily grainers" ; + dc:publisher ; + dc:date "2000-06-29"^^xsd:date . +bsbm-inst:ProductFeature393 + rdf:type bsbm:ProductFeature ; + rdfs:label "durnedest lops" ; + rdfs:comment "musclebound hellfires wrecking engrained characterized physics bolting snatchers polishing disapprobation clanging demagnetize hosed disjuncts ceiling slits disposer finochios restuffed unlearning conjunctiva exulted exploitations surgeons babies roistered wides medicated" ; + dc:publisher ; + dc:date "2000-07-19"^^xsd:date . +bsbm-inst:ProductFeature394 + rdf:type bsbm:ProductFeature ; + rdfs:label "exhibitionists" ; + rdfs:comment "youthfully boarder brailed premieres hedgerow demagoguery elastically kooky vermouths fleecy fidgeters roentgenometry airheads swallowing complots bumpering promisee mooting creations cubby fanfarons remunerativeness wencher interceder probating philologist hypothetically climatal warranted accenting hypoergic deliberating strep histing empathic deliquesces augurs autonomies menservants dwindles youthens" ; + dc:publisher ; + dc:date "2000-07-04"^^xsd:date . +bsbm-inst:ProductFeature395 + rdf:type bsbm:ProductFeature ; + rdfs:label "geriatrist" ; + rdfs:comment "nonresidents hotfoot demolished hitchhikers bellyful bicarbs farces bailment draggling gonadial rebus teetotals consummately pillorying matchboxes declinature synergist gustation peddling subtractions momentums stockjobbing susurruses democratizing moistened nethermost revenued snuffily aqueously politely spectre genitors unprofitably determinants carbides entertainment imploded numerated unpremeditated remuneratively" ; + dc:publisher ; + dc:date "2000-07-08"^^xsd:date . +bsbm-inst:ProductFeature396 + rdf:type bsbm:ProductFeature ; + rdfs:label "nonoccurrence windjammer" ; + rdfs:comment "phantasmagories thanatoid interlarded preceptress northwards nonconductor invalidating chilliest interned rustlers unaging henbit motiveless dialectal electrification whacks hearthsides bluecoats hydroxides gimbals rehire oversevere penuriously topographies wealthier nonages ambushing shadowless rumoring explanted enterer bucklers" ; + dc:publisher ; + dc:date "2000-06-23"^^xsd:date . +bsbm-inst:ProductFeature397 + rdf:type bsbm:ProductFeature ; + rdfs:label "jessed manganesian" ; + rdfs:comment "unconditional overbid chronological puffers couths fighting bronzing slenderly pacifier handbooks brutalness honors heeders liter unwrap enhanced lieutenancies tektites hawkeys latherer undefeated interlocutors oared bunkhouse inconsistences ataxic litigiosity analog phototropic soubriquet ennui wolverines unabsolved unwoven elaborately alphabetically bluebottle gnoses activists" ; + dc:publisher ; + dc:date "2000-07-06"^^xsd:date . +bsbm-inst:ProductFeature398 + rdf:type bsbm:ProductFeature ; + rdfs:label "duskiest spectaculars" ; + rdfs:comment "titillation brooms romanized obtuseness backbit sawteeth lyrisms prebendary tenoning unstates rockaby emulsifier reinterpreting impersonates grievers batistes humiliation citer crossbones treasures carful weighman pitchmen saddlers seignorage blurter bluffing rulable urogram anybodies churchly subtitle receded hexes balladry spoils rejoicers valuating gonococcus smitheries unconsecrated unalarming gelatins impregnation sulphas warhorse surcharges conjuring antihypertensive forged" ; + dc:publisher ; + dc:date "2000-06-28"^^xsd:date . +bsbm-inst:ProductFeature399 + rdf:type bsbm:ProductFeature ; + rdfs:label "forjudging dichotomies" ; + rdfs:comment "nubilities ichthyologist relegable dibbed studier trickers dramatize perpendicularly misdoing trameling solacers misanthropists gulden stoneworks unstableness penuriously minatory throatily counteraction amnesiac changers eructation kist polyvinyl gimbaled violists elastomeric valuator beautifiers unfulfilled cloudlike servicers longly acetify pitiless dimmest tsars tappings chromatographically potholes sacrolumbar administrational trephines footlessness nondrinker honored" ; + dc:publisher ; + dc:date "2000-06-21"^^xsd:date . +bsbm-inst:ProductFeature400 + rdf:type bsbm:ProductFeature ; + rdfs:label "azurites incontinently pitifuller" ; + rdfs:comment "fussier destructible wavelengths laconism decrypts values micrometer unsuccessfully threescore licit medicines intermediate leachers pourboires sharkers enwrapping limes jell consanguinity unshed hadronic snatcher titters bailsman sextuply simitar limitedness trailer vizors sunups typically avowably intercity bacchic ptomaines engrave resowed postured reprinting crustacea" ; + dc:publisher ; + dc:date "2000-07-10"^^xsd:date . +bsbm-inst:ProductFeature401 + rdf:type bsbm:ProductFeature ; + rdfs:label "spendthrift" ; + rdfs:comment "disadvantageousness exasperating faintest amortizable neology prizewinner gaveler inflicting harshened islanded outrages smasher ormolus revarnishes carelessness pillaging demonstrativeness interweaves tastefully boondoggles pasteurizer mispronounces grafter tonsorial handlebars agglutinatively simonists samurais oscillographic retractile spiritualizing typed falsetto quadruplications eructates remonstrates tightening rekindled glitches unstable posthypnotic garotes props accumulates authenticates hognuts chairladies gastropods luncher" ; + dc:publisher ; + dc:date "2000-06-22"^^xsd:date . +bsbm-inst:ProductFeature402 + rdf:type bsbm:ProductFeature ; + rdfs:label "observingly" ; + rdfs:comment "inflecting shalier spatulas symbiotes sirrahs plastered sudor nonbelligerents skyscrapers handbags staidest conglomerations boyos contraire gulfed adulates payable rauwolfia carbuncles zeniths copula impeachers router rejuvenated thankfully sp reshooting wintergreen chairmaned unled" ; + dc:publisher ; + dc:date "2000-07-06"^^xsd:date . +bsbm-inst:ProductFeature403 + rdf:type bsbm:ProductFeature ; + rdfs:label "prythee semiurban naivest" ; + rdfs:comment "rumored joyfuller peonies fools behaves hygienical adaption roue weatherbound shat unfought miscarries preservers palatinates garths detaches longingly mortification crystallographic advances dews engraves skydived describer arsis footnoting leeched tweets coronachs kinesiology nightshirts aviates adjusted bats" ; + dc:publisher ; + dc:date "2000-07-08"^^xsd:date . +bsbm-inst:ProductFeature404 + rdf:type bsbm:ProductFeature ; + rdfs:label "outskirt" ; + rdfs:comment "suppliers uneven cytologist tweezed feudalism betake boldfacing standouts smuggled longwise queened liberalness lastly rustier referenced digested victorianism unsticking nucleoplasmatic marmites ceaselessness vicarly centrism interoceanic foldable gnawings torridness signaling outgas unstressed chlorinators inefficacious californians biparty" ; + dc:publisher ; + dc:date "2000-07-02"^^xsd:date . +bsbm-inst:ProductFeature405 + rdf:type bsbm:ProductFeature ; + rdfs:label "suzettes" ; + rdfs:comment "resales habitude prodding pointedness obdurateness undertrained parolees anchoring stylists proprieties agglutinatively wantons wigmaker fearfuller acutest arborize buffs intervenes spearing illness oxidizers lib triste radiobroadcaster chronologically obediently recharters nonalignment" ; + dc:publisher ; + dc:date "2000-06-29"^^xsd:date . +bsbm-inst:ProductFeature406 + rdf:type bsbm:ProductFeature ; + rdfs:label "jolty" ; + rdfs:comment "earflaps sheikdom selfsame ploddingly melted blistered scepters ruiners haircaps unfittingly deposited devils pints heinies rejuvenated liberalized elevens fanworts bereavement jettied nonenforceable mezuzahs penalities feinting pleasantness demurely spooking prostration pesticides markets mineralized reddest" ; + dc:publisher ; + dc:date "2000-07-15"^^xsd:date . +bsbm-inst:ProductFeature407 + rdf:type bsbm:ProductFeature ; + rdfs:label "flyleaves" ; + rdfs:comment "brothy moderatorship fragged eighteens cesspools attackingly nets serologically supinates reallocate ridable deemphasizes lovers thole accoutring triangulates chewed ropier muggs magnetometer signorine thymy outdoes remittee foxskin outswims nonzero amassment kinswoman subplots rosewoods tunneling inconceivability individualities accursed unofficial lingers nonpredatory keelless underofficial nosegays finmark realignments fathoms reconsidered distended" ; + dc:publisher ; + dc:date "2000-07-04"^^xsd:date . +bsbm-inst:ProductFeature408 + rdf:type bsbm:ProductFeature ; + rdfs:label "woefulness conditionality" ; + rdfs:comment "tenpin blacker homages forked witticisms regularized elopements casa renotifying ocurred glissandi marinas heteronomy boobs puerility drywalls tsarisms ringlets hulking unanswerable" ; + dc:publisher ; + dc:date "2000-06-27"^^xsd:date . +bsbm-inst:ProductFeature409 + rdf:type bsbm:ProductFeature ; + rdfs:label "shipbuilder uncommoner" ; + rdfs:comment "maestri psst antics secretory lickers dimmed tenty hypothyroids spottiness catastrophes pleas journals waterily segue crenelating focusers bawdier engilding demurest itemizes electorial prognosticators diversionist tinners demonstrably basicity sogginess acidifiable assagai marathons woodsy offcut tramlines primarily tmh valvar castigation disconsolately truckmen jiujitsus pearlites jollied strolled grifter" ; + dc:publisher ; + dc:date "2000-06-28"^^xsd:date . +bsbm-inst:ProductFeature410 + rdf:type bsbm:ProductFeature ; + rdfs:label "drawbridges somersaults chiding" ; + rdfs:comment "tabulable corders monkshoods welches ballasts sauna cockatrice taxed individualize wakeners hemlocks atopic felonries cogitative insolvencies feminacy querulousness mackinaws heatless whipcord exquisiteness hardhearted reencountering compensability unmagnified orogenic rassled unconstitutionally" ; + dc:publisher ; + dc:date "2000-07-14"^^xsd:date . +bsbm-inst:ProductFeature411 + rdf:type bsbm:ProductFeature ; + rdfs:label "rad foggier" ; + rdfs:comment "bucketful auditions integers emptor submergible boxings subjoin extrados scattiest bucktail tendencies sinner enervation bearable kindredless featherier docudrama embowelled voidances heisting feudally coquetries scrunched machree concerning owning instils goglets dredging thereunto" ; + dc:publisher ; + dc:date "2000-07-04"^^xsd:date . +bsbm-inst:ProductFeature412 + rdf:type bsbm:ProductFeature ; + rdfs:label "distentions cameos agglomerations" ; + rdfs:comment "ugliness boding micrometers unsettlement cabooses gamiest cuckold foursomes tableful asymptotically turgidity undisguised disbandments salver pediments reactors crapes flashcube asper conservable enfold crocheting biased lemonades polemicists" ; + dc:publisher ; + dc:date "2000-07-01"^^xsd:date . +bsbm-inst:ProductFeature413 + rdf:type bsbm:ProductFeature ; + rdfs:label "unfederated" ; + rdfs:comment "collisions damnedest scuppered stigmatized constructively summarized chronicling semideserts thalidomide executorship homed resuscitators palanquins recidivous digestibility inarticulately autodidacts lychee wakeners teachings prescribable slavishness" ; + dc:publisher ; + dc:date "2000-06-25"^^xsd:date . +bsbm-inst:ProductFeature414 + rdf:type bsbm:ProductFeature ; + rdfs:label "halyard chalcopyrite fullness" ; + rdfs:comment "muonic unencumbered horsepox vinegars templed spalls unstained panaceas radarscope finites flavored clavicles gibbered congealing philatelist lugubrious unknots hummocky gonged flouring shuffled hadjees lightheartedly screecher botanists toughener airships gorgons gauziest hominoid mothered hooray nabs elucidations sandstones prelimit reinspect putoffs tiled dumbing kindnesses polystyrene bristlier godhood bulldozers engraves decomposed" ; + dc:publisher ; + dc:date "2000-07-14"^^xsd:date . +bsbm-inst:ProductFeature415 + rdf:type bsbm:ProductFeature ; + rdfs:label "isometrical jailer dissipater" ; + rdfs:comment "woolly rusted driftway crowsteps diluvion oceanology reconsecrating detoxicator unpretentiously playsuit dicotyledons malleably endocrinologies abstractly berobed cryotherapies cinematically admirably booting evolved threapers maimedness reinsuring hardening failingly indorsing griot misinformed tomahawks frills jehus squatters barbells pygmies mettles quadrics bowyer unstepping snitchers ultramicroscopic filibusterer virginity vivaciously suspenses" ; + dc:publisher ; + dc:date "2000-07-12"^^xsd:date . +bsbm-inst:ProductFeature416 + rdf:type bsbm:ProductFeature ; + rdfs:label "ensoul cohabited differentiating" ; + rdfs:comment "unscrewing jinnee legalist boluses bustles adjudicature overstrain imbody twelvemos latticed hypoxic instructive reannex repapering sanctifiers overdosed backspins agglutinative thoraces indications saloons flappier moneylenders laicisms maturing papists tonneaus review blasted britons pomegranates chiasma flooring refrigerating bihourly initials polyethylene tannery mastoidal murderees lichee grunter exonerators backfiring disheartenment lispingly massedly barelegged" ; + dc:publisher ; + dc:date "2000-07-07"^^xsd:date . +bsbm-inst:ProductFeature417 + rdf:type bsbm:ProductFeature ; + rdfs:label "bateaux" ; + rdfs:comment "ternaries cumulous televisionally highschool ancientest occulter stylizer homy manifolds rostrums fireworms objurgated unfortified heeling outlivers emaciated foxfires genuflect abridgement clubhauled clutching drowners tsked weirdies incompetency tinny excellencies discrown furthering" ; + dc:publisher ; + dc:date "2000-07-17"^^xsd:date . +bsbm-inst:ProductFeature418 + rdf:type bsbm:ProductFeature ; + rdfs:label "predispositions" ; + rdfs:comment "antihumanism tinting idolise hibernated paraphrased dodgy clamped slipcover ginned fornicates mayoress boomtowns enamoured genocide gipsying phrased doublets toeholds assassinator sillies" ; + dc:publisher ; + dc:date "2000-07-04"^^xsd:date . +bsbm-inst:ProductFeature419 + rdf:type bsbm:ProductFeature ; + rdfs:label "guppy enslaved roader" ; + rdfs:comment "segmental bene unman expressionists scroungers polkaed wieldiest planktonic blucher scholastics fortieths overdress drowsing enlivened running reroutes portaging lotto approbated adumbrates chaldron recompose barkeepers bushman hearthside maraschino unleashing randomly feater karakuls murkiest wheezes clattering resubscribe hymenoptera oscilloscopic wotting invincibly twistable kiloliter reciprocatory" ; + dc:publisher ; + dc:date "2000-07-17"^^xsd:date . +bsbm-inst:ProductFeature420 + rdf:type bsbm:ProductFeature ; + rdfs:label "awacs motormen crunchers" ; + rdfs:comment "seeker stereoisomerism kinswoman preventative horst suspenses obviating japer canneries hatbands versing plumpest gorger tequilas atomical stammering claustrophobiac chivy scorches northeaster extortions foulmouthed segregative vitiating underestimating slackage obliging tensing ruinable encoding tetragons overfurnish ostensibly empyrean remap abscissas impulses incidently transorbital reassign morns forepeaks pattypan ritualism savaging unmannerliness bacchanalia liege intensities dualized" ; + dc:publisher ; + dc:date "2000-06-27"^^xsd:date . +bsbm-inst:ProductFeature421 + rdf:type bsbm:ProductFeature ; + rdfs:label "wists" ; + rdfs:comment "thalamus topographically tapper smoothy peseta curtaining emplaning reviles invocating zoroastrianism radiotherapies impurely bucklers asters fashes federator fatly vapory outlandishness wobbliness volplane odourful catchment presupposed refereed interrogations skeptically intently nonpossessively posits panaceas laboratories challenged prenames nutations molting videlicet studbooks noteworthily bacteriotoxin ninny permanencies photoelectron quitclaim" ; + dc:publisher ; + dc:date "2000-07-12"^^xsd:date . +bsbm-inst:ProductFeature422 + rdf:type bsbm:ProductFeature ; + rdfs:label "inbreeding" ; + rdfs:comment "rebeck demurrers presidents diabetics tenuousness unknits parka escalating kindlier chimaera superstitiously brassie nonpolitically airliner pettiest tweaked nepotisms deionizes overcooled misnumber touches" ; + dc:publisher ; + dc:date "2000-07-07"^^xsd:date . +bsbm-inst:ProductFeature423 + rdf:type bsbm:ProductFeature ; + rdfs:label "registrars foaminess" ; + rdfs:comment "demarches conjugally hoorayed castrato whited recount grigs robed cowcatcher concealed utilization antirevolutionary institutionalist spondaics driveling weasands storytellers apposed swimmingly birdseye truisms lovableness dinners inconclusiveness hoper receptors recognizably counts solider fierceness recks formatter curiosities mandrakes disavowal chirpily deserted dodges innersole layaways counteractions astir toffies ultras divider unbeknown stockpiles" ; + dc:publisher ; + dc:date "2000-07-20"^^xsd:date . +bsbm-inst:ProductFeature424 + rdf:type bsbm:ProductFeature ; + rdfs:label "pulverized deutsche" ; + rdfs:comment "nebulas propagating widdled amirs heating dibbing gaoled virucide depreciatively majoring parapsychologists microradiographical downiest groats doblas carousal disrupting boulevards nonrefillable kipper reunification proceeder subtopic pancakes underdog loser adulterating supportive benightedness spiffiest correlatable fraternities" ; + dc:publisher ; + dc:date "2000-06-27"^^xsd:date . +bsbm-inst:ProductFeature425 + rdf:type bsbm:ProductFeature ; + rdfs:label "incumbently" ; + rdfs:comment "cassis danseuses broods soliloquies peaking overheard collegiality embanking napalms borborygmies lupins funked outargues alienability mutilations photophobia escritoires geometries attached knocked waddles gelees unabbreviated beguilers tollbooths parchment deputes" ; + dc:publisher ; + dc:date "2000-06-29"^^xsd:date . +bsbm-inst:ProductFeature426 + rdf:type bsbm:ProductFeature ; + rdfs:label "shamuses" ; + rdfs:comment "budless loosed potholed incomputably maceration flatteners requiter inculpates snowfield conterminously surmounting disentangled collagens triads methanols rippers osteal incapacitator numerously constitutes retributed foliated snippety incomings elflock grandames boweling bongos altruists incased weekdays enfold carpers maroons oxblood obliteration infarction buggiest cheddars gauntries pounded" ; + dc:publisher ; + dc:date "2000-06-24"^^xsd:date . +bsbm-inst:ProductFeature427 + rdf:type bsbm:ProductFeature ; + rdfs:label "intagli flimsiest vomitive" ; + rdfs:comment "defoamed skewed platers untrod coiffed humorists reinvites accusant sootier boneset unenforced aidful hasting weediness sharkers honeymooning unsnarl loos selection klutzier nonscheduled freshened schismatic microbiology securest inconsolably pacification hassling miotic confiscators pelted enrols ores uncurl rewards supe strengthening acned" ; + dc:publisher ; + dc:date "2000-06-29"^^xsd:date . +bsbm-inst:ProductFeature428 + rdf:type bsbm:ProductFeature ; + rdfs:label "maledictive fertilizer misspending" ; + rdfs:comment "astatines suspected assassins sporule steamers bearable gastrectomy souths bellicosity luffed shunning squatty bauxites subcontracting interrelates variegating contributors bitte fluorites mealworms sentimentalism diemaker pepping disputed thatchers fallowed prophesiers homosexuality bindweeds bisexed synergistical obtrusively unexercised straightener embowers sforzatos baas metaled predispositions charioteers transportable chawed" ; + dc:publisher ; + dc:date "2000-07-04"^^xsd:date . +bsbm-inst:ProductFeature429 + rdf:type bsbm:ProductFeature ; + rdfs:label "idiogram" ; + rdfs:comment "yeasted unheedfully licitation orphaned praetorian unprincipled easter canthal sounder rewarming sociologic jejunely banishment laboratorial rotationally precooking sideward kerns clearheadedness erotogenesis magnetizable capacitating cabling stammerers unprocessed natalities unmentionables uncloaks nobbles alternating transited jauntier mags" ; + dc:publisher ; + dc:date "2000-07-17"^^xsd:date . +bsbm-inst:ProductFeature430 + rdf:type bsbm:ProductFeature ; + rdfs:label "imperiousness bucketing lollygag" ; + rdfs:comment "unacclaimed stalinism carrots serenading thirdly climatologists enervators subsidizing septettes defuses entailing staggered thromboses groundless mazedly savings macrocosmic photoengraved dodders alieners entrenches nightstands peatier antibiotics mimosa reintegrating poler modernizer pennon checkoffs vasodilator heathenism ableness sloucher skycoach cessing" ; + dc:publisher ; + dc:date "2000-07-01"^^xsd:date . +bsbm-inst:ProductFeature431 + rdf:type bsbm:ProductFeature ; + rdfs:label "physiographic chimps" ; + rdfs:comment "expediencies reciprocals unhanged purveys pressurize baldest impregnation unclassifiable exampled chromes hexaploid cringles bulbuls toadies mollifiers terrazzos extolls peepholes holdbacks achievement signaled triggered constrained shepherdesses pommelling recompiled preharden enunciates intestacy veterans intuitiveness vituperated eugenical bounding clerkish" ; + dc:publisher ; + dc:date "2000-06-20"^^xsd:date . +bsbm-inst:ProductFeature432 + rdf:type bsbm:ProductFeature ; + rdfs:label "regrooves biculturalism" ; + rdfs:comment "nervelessly thankyou retinals jacobin hourly niters dendrological cultivates disinterred zingers forlornly kitsch cogitator combed chloral idoliser hitchhiking garrotter reforms carrageenan amatorially hurling bugbears superficialities stringier cordoned suaver dichotomously ofttimes reeker modestest hogger denotive savorous dazzlingly justices stalkiest beautified brimmed conciliations sputters copybooks risings exhuming trunnion swedes wigless coincidentally" ; + dc:publisher ; + dc:date "2000-06-22"^^xsd:date . +bsbm-inst:ProductFeature433 + rdf:type bsbm:ProductFeature ; + rdfs:label "panders freethinker" ; + rdfs:comment "dyeweed intercultural fluty regicides clingers patricians charlatanish pluralizing mascons selectee ballplayer crankily aquatints preadult uncomfortably zucchettos trapper trices burrier automatize lunacies bedazzled priapuses misbelief scintillation overplaying remanding" ; + dc:publisher ; + dc:date "2000-06-30"^^xsd:date . +bsbm-inst:ProductFeature434 + rdf:type bsbm:ProductFeature ; + rdfs:label "crestfallenly comminatory outfielded" ; + rdfs:comment "bussing lentils fertilizable adherers emollient annuler paperer sweetener impala collapsibility cunnilingus underproduces reentrances suddens cardinally perplexities throbbers steamier clomps bestrides eurodollars branchier swisher scorchers airships tactfulness exasperation marrieds carrell cannonade noninterfaced stretchers mummers arguing" ; + dc:publisher ; + dc:date "2000-07-19"^^xsd:date . +bsbm-inst:ProductFeature435 + rdf:type bsbm:ProductFeature ; + rdfs:label "variably" ; + rdfs:comment "leal avouch readable emulated parasitical scorcher reigning potables dips inhabitability unmanliness paladin overdiligent scrappiest mantilla linguistics dashing narcohypnoses misdo scows ambisexuality stylite recapture passersby penciler" ; + dc:publisher ; + dc:date "2000-07-09"^^xsd:date . +bsbm-inst:ProductFeature436 + rdf:type bsbm:ProductFeature ; + rdfs:label "towable" ; + rdfs:comment "centralistic scooted seasides renominate ingots decongestant joyed differences mutably rumples latten eluding anthropoids fortuitously lighthouses summering precipitously fractionalized gasbag shiftlessly trichinosis debatably bullhorn kiloton damageable intensities sonarmen manhandled radixes" ; + dc:publisher ; + dc:date "2000-06-26"^^xsd:date . +bsbm-inst:ProductFeature437 + rdf:type bsbm:ProductFeature ; + rdfs:label "vitalizer" ; + rdfs:comment "homilist grappler coonhound fontina keelage billed mechanisms librating obtruders candlesticks voidableness blockbuster palanquin diversities gymnastically ganglial anthologist optimistical hawkeys undissolved clappers overshoe canners equalizes kindness colonise" ; + dc:publisher ; + dc:date "2000-07-08"^^xsd:date . +bsbm-inst:ProductFeature438 + rdf:type bsbm:ProductFeature ; + rdfs:label "unsatisfied dialers" ; + rdfs:comment "commix redlines solecist perkiest carina eremite demythologizing eftsoon shows fiendishness sunroof manageress enclosers loo aerobiology reminder adumbrations faction deformative anemones geologer tails bechamels vitalising anesthesiologies damps bedders couth asphyxia coking intradermal reproachfully cyclical exposes veronicas marinaded verdure radiancies ignifies biophysiography rarebit jinxes musically luteum vices" ; + dc:publisher ; + dc:date "2000-06-30"^^xsd:date . +bsbm-inst:ProductFeature439 + rdf:type bsbm:ProductFeature ; + rdfs:label "eyeliner" ; + rdfs:comment "dunning waylayers exonerates eyeliner producer fatalness unfamiliarly handcuffed exteriorized unproven wivern loadstar rotundas shewer endowers guerilla roadability uniters vamoosing suddenly" ; + dc:publisher ; + dc:date "2000-07-14"^^xsd:date . +bsbm-inst:ProductFeature440 + rdf:type bsbm:ProductFeature ; + rdfs:label "thematically yawned excites" ; + rdfs:comment "intelligently malays upswollen restrengthens interrogatories offended recriminates scalpel regularly ineptitude massas catnips moulted demonized temperaments gallivanting beans heftiest batts tottery swinged jotted unshod sorrowfully mussels campsites flirtatiousness clued maladjustment oftest seascouts brio autobiographic cappings turfless overbore" ; + dc:publisher ; + dc:date "2000-07-17"^^xsd:date . +bsbm-inst:ProductFeature441 + rdf:type bsbm:ProductFeature ; + rdfs:label "deflower" ; + rdfs:comment "bricking waterskiing acrophobia dialyse mucky condoner unannounced anatomically decriminalization succinctness hepatizes craggily venturesomely inheritabilities unshapely domineers internuncio defat dropkicker buffeted purply repaired nomenclatures bedumb lipase mikvah demographics bookmen absoluter queans harrying abubble smears spokes markdowns dermatitises refueled picturing waggons jerseyed jargoned rcpt biconvexity impermeability cottages remail ghostliness revivalists adversely disseminating" ; + dc:publisher ; + dc:date "2000-07-17"^^xsd:date . +bsbm-inst:ProductFeature442 + rdf:type bsbm:ProductFeature ; + rdfs:label "minsters" ; + rdfs:comment "merriest meandering hitchhiked consecrations lagunas unwon wholeheartedly pourable chemoreceptive engrossment mooncalves uncollected alphorn erecters periodontitis epilogues sued culls overconsiderate craped siting doubler surrealistically marylanders calculating leafs negligently adulteries nitpickers durned bedframe ratable unmolested wordier reexamines repricing legislatrices ratiocinative overextend fashions payee brainwashes exceptions agonic exalter recurrence unrespectfully endocrinologist" ; + dc:publisher ; + dc:date "2000-07-06"^^xsd:date . +bsbm-inst:ProductFeature443 + rdf:type bsbm:ProductFeature ; + rdfs:label "orderings immobilized" ; + rdfs:comment "appearances studbook micrometer straightly coasting playfellows boiled chafer argles homogeneously derailleur semiretired riveted eviscerations assisted allegement laziness fanner polemicist encage hairsplitting easing overeducating waft bopper deaccessions reuse cogito shuffled bullocks reminder mockups aviated tonsorial radiotelephonic signaled confluences unguiltily overreacted premixed giantesses chatting approx snappiness tootsy pepsins promoting imprisonments" ; + dc:publisher ; + dc:date "2000-07-04"^^xsd:date . +bsbm-inst:ProductFeature444 + rdf:type bsbm:ProductFeature ; + rdfs:label "misguide impoundments menologies" ; + rdfs:comment "scolding disarmers disillusions mayvins stencilling volcanologist acidy blandly ghostliest airlessly tootler satirists cubages replacers lavations repatriate virulency whooped hallows woodlander incidence shat archness conflux chitlings gloaters nabobisms darks enticement scandinavian trawlers slicer stogie selection" ; + dc:publisher ; + dc:date "2000-07-12"^^xsd:date . +bsbm-inst:ProductFeature445 + rdf:type bsbm:ProductFeature ; + rdfs:label "riprap velure sugarplums" ; + rdfs:comment "parasiticidal qiana quartering planer tissues multiversity chortlers demonized disarms vapours affrayers luminal choses noncommunicable malnourishment prizefight isms planked pontoons leaner rurally traitress jollified reconcilement antipyretic pepsins manger burnisher dishevelled reintrenched deices hocuses overexercised collop weakhearted processors brassicas" ; + dc:publisher ; + dc:date "2000-07-14"^^xsd:date . +bsbm-inst:ProductFeature446 + rdf:type bsbm:ProductFeature ; + rdfs:label "directors proselytizers quadrupeds" ; + rdfs:comment "thievery drupelet suboxides assessable intrench autobiographers fauvist zairian moisturizing seasonality aunty accomplishment faultfinders beggarly semiconducting monorails reflected fraternization telecasting contentment lenity repeopled sniffles browser screamers warpowers uroliths shoplifted mutterers teenybopper nonscholastic mating unpen manas brassily lurers wassails browny equalises safaris greasily recidivist vended nonconformist" ; + dc:publisher ; + dc:date "2000-07-13"^^xsd:date . +bsbm-inst:ProductFeature447 + rdf:type bsbm:ProductFeature ; + rdfs:label "stutterer" ; + rdfs:comment "mestizas scaped detainees toadfish intwists appriser ministries adjurations bedstand overcooled plighting stockbroking rediscounted quintette trumpeting pronunciations wheelie emergents enflames happened russians mordant penchants located ministrants parasitologies buckras overinflated steeplejacks cubicle thirtieths overcompensators undefined inheritress broaches securing" ; + dc:publisher ; + dc:date "2000-07-10"^^xsd:date . +bsbm-inst:ProductFeature448 + rdf:type bsbm:ProductFeature ; + rdfs:label "primitivity doyennes stakeouts" ; + rdfs:comment "sewed twattle freakiest hymnody poppets elbows bargee scuffles mergansers superficialness rectorate lockups bomber challenged subclassification plumier truncating historians foisting gavots sackbut beadsmen insincerities inebriation trundling clubs" ; + dc:publisher ; + dc:date "2000-07-02"^^xsd:date . +bsbm-inst:ProductFeature449 + rdf:type bsbm:ProductFeature ; + rdfs:label "densest weeds" ; + rdfs:comment "duetted upcurve fullering cortically recrating reinvests cubiform maintainer refinances reasoner whackers bedmakers towelled quietens dynes wordstar sizeable flagons spinny sodomy lexicographically arresting cantrips placidness livelihoods cypresses fossils seppukus fundamentally chafed landlords" ; + dc:publisher ; + dc:date "2000-06-22"^^xsd:date . +bsbm-inst:ProductFeature450 + rdf:type bsbm:ProductFeature ; + rdfs:label "custards" ; + rdfs:comment "nutriments nonacademics borage shirker sated tantalizers pavement realignment decoupage translucently wardenship stepladders oms proofs avifauna mammographic kuchen marketable ableness catcalls neotenies fantails flees sotted" ; + dc:publisher ; + dc:date "2000-07-12"^^xsd:date . +bsbm-inst:ProductFeature451 + rdf:type bsbm:ProductFeature ; + rdfs:label "photometer" ; + rdfs:comment "flipping cellists pukka controverts gravitationally assemblyman adsorbent undifferentiated auricularly rattan indwells passingly metaling haddocks lonely scarifying lightly cringles curber snobs peruvians skitters primmed maenad finochios unionistic pipeages esophagal dreck locoed bight griddled malemutes repins queues melodically hegemonical" ; + dc:publisher ; + dc:date "2000-07-19"^^xsd:date . +bsbm-inst:ProductFeature452 + rdf:type bsbm:ProductFeature ; + rdfs:label "syndicating superciliously" ; + rdfs:comment "moisteners rumrunning kidnapers postboy seatless swankest wobbliness stopple freakily encircle finales marinated cutoffs supplemental pinged mascots disuse resilience clingier temporized iceman nipponese triers journalist xystus nonadjacent ammeters idylists interrogative mpg nijinsky latened isometry cantata tannic skoaled grainer shrimpiest waterproofer hereditarily huddles exuberance" ; + dc:publisher ; + dc:date "2000-07-19"^^xsd:date . +bsbm-inst:ProductFeature453 + rdf:type bsbm:ProductFeature ; + rdfs:label "protestable drover kludging" ; + rdfs:comment "phantasmagories preponderantly cargos accenting deftest journeying bouncier mutilated misdefines slowest describers entwisting plotting gatherers adolescents anilities occluded guileful embanking expo theaters chinning wowser twirls capriole eidola fescues staphs lineament grandad partaken skywriters" ; + dc:publisher ; + dc:date "2000-07-09"^^xsd:date . +bsbm-inst:ProductFeature454 + rdf:type bsbm:ProductFeature ; + rdfs:label "winterkilling tiller" ; + rdfs:comment "commissioners shouters proalliance meteoroid misterms chutes conscripts broadsword effecter clanswomen thieved rutting muddles stingiest sanitaries catalyzes soapwort effulgences henbit solvency earrings carryon totalisms abortionists reordain retailor badman lubrications teaboxes" ; + dc:publisher ; + dc:date "2000-07-02"^^xsd:date . +bsbm-inst:ProductFeature455 + rdf:type bsbm:ProductFeature ; + rdfs:label "diversifying" ; + rdfs:comment "jibbing aerates dados thunderbolts wordplay adeptness sleepers closely safeties delfts unfold propanol rummest jungian prerogatives nonresidual transponders mickle arrestees prouder openworks sculpted clasping opines humanely popularizations pongid blackness recited sibilation studies biorhythmic mosquitoes" ; + dc:publisher ; + dc:date "2000-07-22"^^xsd:date . +bsbm-inst:ProductFeature456 + rdf:type bsbm:ProductFeature ; + rdfs:label "kiloton smearier" ; + rdfs:comment "latino decanter cumulonimbus supplants gerrymandering outstation cowering hangouts triticale bards crowner plunkers guiltlessly mistunes abandoning imbroglios nudnicks illiteracies pigpens throbbing senselessness lyrical eccentricities anarchist toeshoe wheyish vibratory bacchantes tombing scleroid precut coalyards preventions dabbles limbs" ; + dc:publisher ; + dc:date "2000-06-28"^^xsd:date . +bsbm-inst:ProductFeature457 + rdf:type bsbm:ProductFeature ; + rdfs:label "swathed player" ; + rdfs:comment "elongations incommode outdated senates mobilizing chemotherapeutical laminated enslavements ogres martlets playpen ratiocinating dobber blacking cecum bellybuttons generalists despondencies sibyllic hunchbacks nonabrasively debone bombload putrefy cools agaves abjure richness faltering swimming headquartered screener decidedly witnessing predicative revives futurities flirtations metaphysician estonians ambivalence ungenial caned" ; + dc:publisher ; + dc:date "2000-07-20"^^xsd:date . +bsbm-inst:ProductFeature458 + rdf:type bsbm:ProductFeature ; + rdfs:label "kirigamis" ; + rdfs:comment "liberian serviceableness dimness strangely accusable bigamous dormancies stalled morphogenesis summerhouse gemologist mimers pastramis tramping pharisaical amalgamators louisianans resurveying digested ecdysis prevalently stateside pyrenes cannonism bookies stops mounters drooled" ; + dc:publisher ; + dc:date "2000-07-03"^^xsd:date . +bsbm-inst:ProductFeature459 + rdf:type bsbm:ProductFeature ; + rdfs:label "transfigured koans" ; + rdfs:comment "reverb yodhs gassiness chaffiest sensitively vapory lyrics borsch screecher arraignments dronish densest stellas soggier confreres beggared hauberk quintette underlips goofs ramjets oversubscribe punsters glycosides repainting eelgrasses sloucher inverters excitations faxed dismountable soggily momentousness" ; + dc:publisher ; + dc:date "2000-07-21"^^xsd:date . +bsbm-inst:ProductFeature460 + rdf:type bsbm:ProductFeature ; + rdfs:label "alienee moderator" ; + rdfs:comment "saltbushes brisling antinomians kindergartens bursitises freakily porter creator scrubbier certifiable alternateness rewashes refill sandaled stipulations proprietors detractors unproductive unended unwound tzimmes memoirs stele typecase oceangoing aplombs rasped miens resuscitative ceremoniousness discernment coifs epidemiologist expressing elastically aphrodisiacal profanity obesities foreordaining cleansers begorah bolled decontaminating wetting whizzer dudish" ; + dc:publisher ; + dc:date "2000-07-14"^^xsd:date . +bsbm-inst:ProductFeature461 + rdf:type bsbm:ProductFeature ; + rdfs:label "lieges microgram" ; + rdfs:comment "meddler handlooms rustlingly quintains identifying tailing improves pervertedly kevils canneries mapping constructions motiveless stalkier validations tentering lounges anopheles jelled potsy fujis servicer savorer dressage installs magnificoes militancy nasalize tearer rowable lovevines submergible cyan oversimplifications reinjured misdeal furls headgears watermarked" ; + dc:publisher ; + dc:date "2000-06-20"^^xsd:date . +bsbm-inst:ProductFeature462 + rdf:type bsbm:ProductFeature ; + rdfs:label "wrappers wotted" ; + rdfs:comment "cesspits enthrone tooling ironware sensationalist passively expressionist rumors codifications vanillas decompensated oratorian sandbanks faded formable proliferously infiltration foetors heartens chanteuse freeform catching saxhorns grafts celling crinkling unadjudicated neurones postboy shackles procurer rhinos hated steeping incommunicative cervicitis" ; + dc:publisher ; + dc:date "2000-07-04"^^xsd:date . +bsbm-inst:ProductFeature463 + rdf:type bsbm:ProductFeature ; + rdfs:label "peculators ladylove" ; + rdfs:comment "copolymerize atonality zoysia restudying showup inexactitude hillers nimrods leva tokonoma stagnates wisdoms loadstones expatriated faultiest scintilla ungraceful inched brevities unclassifiable adoptions churchier reattached ranged unenterprising subsisting" ; + dc:publisher ; + dc:date "2000-07-21"^^xsd:date . +bsbm-inst:ProductFeature464 + rdf:type bsbm:ProductFeature ; + rdfs:label "pirouetted" ; + rdfs:comment "deutsche cussers megabuck behaver depressively overpast baalism pinioning hankerer holdbacks libidinally curies unshelling coliseums smidgen saltires masturbator reacquainted ufo unicellular calendulas cetologies letter nonhabitual precancels simplicities cautiously baseborn tansies gauderies graben shrieks regenerates paralyzes conjunctive folkloric suggestibility vaqueros discriminates pumicing numberable nobler salvagees prized melanists discoverers frangibility" ; + dc:publisher ; + dc:date "2000-07-04"^^xsd:date . +bsbm-inst:ProductFeature465 + rdf:type bsbm:ProductFeature ; + rdfs:label "ophthalmoscopy" ; + rdfs:comment "opaqued begrudging cranched rupiahs expected obligement liquorice multifunction postulant undertones newscaster asper reinstalling deedier tautologies underfinanced soliloquizing curative probationers whelky disposes fermentations unfurling gesturer eructs frater retractions fearless galleries hoofer glary bidet rearrest gaper deficiencies squelchy romanced accruals vacating galloots wariest studhorses crystalize phallic uncomfortable fluoresced undoings maypole" ; + dc:publisher ; + dc:date "2000-06-30"^^xsd:date . +bsbm-inst:ProductFeature466 + rdf:type bsbm:ProductFeature ; + rdfs:label "subcommander cuds heptarch" ; + rdfs:comment "dicks parsonages gymnasia yoking pollards censurer soapworts guttier dazzled burbling dries punctuation barhops circumnavigation hobbler stenos ephedrine lazarette sending dusters underfinance unmuzzles warmheartedly cheviot mineralogical darkish oblongs cageling hoatzin syndics belabor lushing farces gasifying podgy engrossment declassified quacking transfixing lowerclassman chirpier" ; + dc:publisher ; + dc:date "2000-07-19"^^xsd:date . +bsbm-inst:ProductFeature467 + rdf:type bsbm:ProductFeature ; + rdfs:label "moviedom palmettoes plainsong" ; + rdfs:comment "undo mouthiest roughhews outargued scuffing lief severalizing triumvirate circuiter calorimetry retreating bactericidally detachments demonstrative formulators yeasting gulps tawdriest demobilizes extorsive polonaises flappy restrengthened exempted regathered recon prorogues gangliar reaps baddies" ; + dc:publisher ; + dc:date "2000-07-14"^^xsd:date . +bsbm-inst:ProductFeature468 + rdf:type bsbm:ProductFeature ; + rdfs:label "dieticians cavorted trooper" ; + rdfs:comment "washiest reallotting wellhole suaver thoraces faultlessly iniquitously marquisettes scroggiest medicator saddler blethers totterer noncooperation lunations benefactresses proceeder anticipates tormentingly overeat operably supernatural actuation rapaciousness provable enjoined specialist sepulchrally afters breakers leas sloughs enhaloed cheeps etchings manufacturable dynamometers ephedrins reorganize detents" ; + dc:publisher ; + dc:date "2000-07-18"^^xsd:date . +bsbm-inst:ProductFeature469 + rdf:type bsbm:ProductFeature ; + rdfs:label "mesmerization besmirching cajaputs" ; + rdfs:comment "sidecars serrating cerated zombiisms churner midships kyries disorientation unclogs dromedaries kneaders reelecting valveless specks initiates bypassing rosiny vindictively pointlessness tokenisms rosier stomped ludicrously slantwise zincky arouser practicing regathering humectant heptameters vervet polysyllables octad sublimations gnus oversubtle brims indecenter faithfuls physiognomic ravagers renew cookey particularities fringes enamoured" ; + dc:publisher ; + dc:date "2000-07-13"^^xsd:date . +bsbm-inst:ProductFeature470 + rdf:type bsbm:ProductFeature ; + rdfs:label "lives cyclamens" ; + rdfs:comment "obfuscable rivalries vastest accounters handcrafted equilibrator rigatonis disconcertingly leeriest ineffectualness encapsuling raja fubbing tiller romanizes pythons uneasily narrative refraction tribuneship archimandrites enrobe exceeder westering skiffs rotationally bankings suffixed inaudibly transfrontier narwhales partway cornetists nonrecognition nickeling disfiguringly warranties riled crossbred quibbles saltish balloters unaccounted coliforms conciliar outrunning elastics crisped chaunting" ; + dc:publisher ; + dc:date "2000-06-20"^^xsd:date . +bsbm-inst:ProductFeature471 + rdf:type bsbm:ProductFeature ; + rdfs:label "courser inositols lander" ; + rdfs:comment "concaveness vexing harshened javelined intermeshed reincorporate stranded niceness underscoring heists valancing failing bigmouth sluggers unequivocally gustoes undistressed survivers intercede crunchers diffidence researchers nonformation tempore tentacled preelection palmitate misplayed pseudoscientific transsexual slakable ozonise fictional midwiving minibikes cockscombs devilments bordered kales fortis foolishly skyrocketing hula mediative iller maintenances waits upends" ; + dc:publisher ; + dc:date "2000-06-30"^^xsd:date . +bsbm-inst:ProductFeature472 + rdf:type bsbm:ProductFeature ; + rdfs:label "chinchillas inconsolably betas" ; + rdfs:comment "stammering milages depletable kickshaw algorisms tubercular invalidator unjustness majuscules gonopores preclusively unalarming diaspore breezeways immanently interpreting bangtail raucously programmatic moratoria monogamies habits immobilities dinkum cockiest bursaries refueled clubfooted prescoring digitals drear displays redundances prosecutorial calcined sties hobnail temporalty incredibly" ; + dc:publisher ; + dc:date "2000-06-22"^^xsd:date . +bsbm-inst:ProductFeature473 + rdf:type bsbm:ProductFeature ; + rdfs:label "radicalize" ; + rdfs:comment "honester cantingly baaing manuever gearshifts watersheds regerminates logrolled competitively bodices strapping stillness nonsuccessively desegregated banqueters aulder semipermeability lordship glosses chops selectly flunky hiller reties" ; + dc:publisher ; + dc:date "2000-07-01"^^xsd:date . +bsbm-inst:ProductFeature474 + rdf:type bsbm:ProductFeature ; + rdfs:label "printouts durn" ; + rdfs:comment "spouter coacts embodiments nurseryman cataloger enzymatically disfiguringly rewelded rigorist reinterprets bushfire breakfront burbly pottages tangoed wrangler westings skeins reference somewhats overdiversifies swatted disengagement torii bactericidally piddler cohesions namesakes outcroppings hoses davenports mondays disobey angostura denigrates macadamizing mastiffs collagens coronations" ; + dc:publisher ; + dc:date "2000-07-04"^^xsd:date . +bsbm-inst:ProductFeature475 + rdf:type bsbm:ProductFeature ; + rdfs:label "buboes aerosolize" ; + rdfs:comment "cemeteries sleddings outlays capably orangery clews prepayment budder banquets expertness pinioned rednesses yarest coifs pencilled ganev organically innovating espaliers livability soundproofed shirtings lithographs channels cicatrixes goaled distended tympanum requests subteen proportions shrilled extorsion whumps milady rebops indications livered" ; + dc:publisher ; + dc:date "2000-06-21"^^xsd:date . +bsbm-inst:ProductFeature476 + rdf:type bsbm:ProductFeature ; + rdfs:label "pronghorn tantras" ; + rdfs:comment "advertize conceptional tangled bronziest tunics guilder sightseen obliviously confetti velds wings mille litchi excursionists bedlams sidelines contaminations riptides unfrocks gauderies assailable pulpwood sermonize benefactors pregnantly derogates wrester armer" ; + dc:publisher ; + dc:date "2000-07-06"^^xsd:date . +bsbm-inst:ProductFeature477 + rdf:type bsbm:ProductFeature ; + rdfs:label "inheres vaulty" ; + rdfs:comment "logarithms testation cathedrals workroom godowns remaindering rover punching steerages commanding hominoid undersigned rarify oblongs tardo culotte flitch swallows cherries subnormally humanitarianism reinviting poetized jaggedly faunae tadpoles gurney incarnadine overwrought" ; + dc:publisher ; + dc:date "2000-06-24"^^xsd:date . +bsbm-inst:ProductFeature478 + rdf:type bsbm:ProductFeature ; + rdfs:label "grievances" ; + rdfs:comment "twerp frizziness fluidrams unsteady coredeemed fellies disavow lithuanian cavitates overseeing wisecrackers heckler commending squeakier capableness audient commiseration outyelling disabused pellucidly dunces meanings gnotobiotically assumes breezier purer oncomings sones tendentiousness legwork gibbing deficiencies totes sparser" ; + dc:publisher ; + dc:date "2000-07-16"^^xsd:date . +bsbm-inst:ProductFeature479 + rdf:type bsbm:ProductFeature ; + rdfs:label "argils dissemblingly" ; + rdfs:comment "theistic bimethyls dauntlessly shiftiest goglets negotiants straighter oblivions extremists plucker companionship reclassifications greaten mayorships iciest tissues squinting devoicing swanked tenter raises refuting wrapt wheaties cardiogram inebriated extragalactic emergences squushing decidedly sepulchre jumping bulged canzonas" ; + dc:publisher ; + dc:date "2000-07-16"^^xsd:date . +bsbm-inst:ProductFeature480 + rdf:type bsbm:ProductFeature ; + rdfs:label "mynahs skylarks versatility" ; + rdfs:comment "barkentine wantons flenched ostracizes fatale chambray plummeting glabrous morally salmagundis stabilizes cytological mercurialism nematodes preadjusting previewed castrated depopulation rabbinate disgusted branchings rubdowns fundamentalism crocheting" ; + dc:publisher ; + dc:date "2000-06-26"^^xsd:date . +bsbm-inst:ProductFeature481 + rdf:type bsbm:ProductFeature ; + rdfs:label "bulkier" ; + rdfs:comment "scans plaiters muddled dyed recoiler ladrone assignable phrenologic copters uniformity punisher quietens accentuator reekers rumba perfecters desiccated stays ideologies confuters impliedly ladybug colorist perkier burlier casuist toccatas stabiles knifings pantomiming screenplays noninflammable bicycles berates moralism sadistically authenticator cruzeiros chords dendrites formlessness" ; + dc:publisher ; + dc:date "2000-07-05"^^xsd:date . +bsbm-inst:ProductFeature482 + rdf:type bsbm:ProductFeature ; + rdfs:label "named ears cathect" ; + rdfs:comment "noncorrosive pommel honesties rafters wantonness frivoler helmeted quantize hosannas bagnio disillusionments surmises coalbin astrodome mentioners hotblooded nickelled beautifying unthawed mussiest coaxers penlite batwomen imply caul remonetized shmoes forewing creosoted nonintellectuals blamable slipped valorizations" ; + dc:publisher ; + dc:date "2000-07-12"^^xsd:date . +bsbm-inst:ProductFeature483 + rdf:type bsbm:ProductFeature ; + rdfs:label "turbidness charitableness" ; + rdfs:comment "reabsorb rearmament orcs hollander consolidators detrained wirepuller thirstily knottily sphygmometer triangles unmarried recruited subscriber harborage micrographs poetizes befooling endangering fearer practicality groveler elixirs crimpers adorably keelage inveigles sailing wearish insanities spooring preblesses palpitation ashes laminae watchtower migrates rosettes ballers bonny decaliters gauzy palming mooter chesses amplifiers" ; + dc:publisher ; + dc:date "2000-07-11"^^xsd:date . +bsbm-inst:ProductFeature484 + rdf:type bsbm:ProductFeature ; + rdfs:label "cofeatures" ; + rdfs:comment "tabby misdid dirtily reader mocha gibbousness copydesks bassness grassed seizors circulates froward chics bunging ferrules verbiages palinodes churchwardens tokyoites improperness frowziness detoured candying knits african definitiveness guatemalans blackouts reveries foresaid herniations costers begorrah subjugator tensed smouldered flowing impassible strettos nonsenses sediments reconvert xiii fractures ecumenicity gerunds escalades planed clasper rondeaux" ; + dc:publisher ; + dc:date "2000-06-22"^^xsd:date . +bsbm-inst:ProductFeature485 + rdf:type bsbm:ProductFeature ; + rdfs:label "calibrating overcome" ; + rdfs:comment "knowable bubo perpetuation burgomaster blurrily reconsecrations digraph evicting chirks tendons fascia humours silvan appal propinquity furring authorized baling banjoist insusceptibility secluding ringbolts macrocephalous" ; + dc:publisher ; + dc:date "2000-06-28"^^xsd:date . +bsbm-inst:ProductFeature486 + rdf:type bsbm:ProductFeature ; + rdfs:label "suspends" ; + rdfs:comment "suppliants slapsticks payrolls multilateral bandana urgently tempehs philanthropist barkeeps frenetics alterers pinnacles tiddlywinks correlation sponsors megalomaniacs occasioning quags enchiladas interrogatories weakliest executioner ponderously demurrage audios efts embolism greenishness striping saturants exhumers outpace deisms encouragement preamps tenably" ; + dc:publisher ; + dc:date "2000-06-20"^^xsd:date . +bsbm-inst:ProductFeature487 + rdf:type bsbm:ProductFeature ; + rdfs:label "conceivers" ; + rdfs:comment "challies beakers unquenchable sallowness wandering contagions inversely papaya tinkering chiccory misadvise phalanxes hires overachieved dreamless twangle unstemmed partials tuberous beautifully dualizes revived obfuscates combative pees millenniums liquidation membered" ; + dc:publisher ; + dc:date "2000-06-27"^^xsd:date . +bsbm-inst:ProductFeature488 + rdf:type bsbm:ProductFeature ; + rdfs:label "maturations cinemas zulus" ; + rdfs:comment "japanize merlins clyster undaunted retells obligingly promotable overpowering tribeswomen ultimately splurging herded clingers herpetologic leisures mashers weenies disembodied ravener fanciers unjudicial snuggest spaying pasteurizers egomanias deprogramming pontificating systematization stockyard dishing illiterates trivialities smacking physiopathologic shouldst stadiums tempeh ditcher indigents footy creping auctioned sandhogs presumptively resemblance axonic marines idealogy" ; + dc:publisher ; + dc:date "2000-07-15"^^xsd:date . +bsbm-inst:ProductFeature489 + rdf:type bsbm:ProductFeature ; + rdfs:label "beflags toniest" ; + rdfs:comment "trestles cruelness slumberous lactoprotein curlycues conceptualists margays unclenches disownment officers totting genes polyethylene jolts conjugational habaneras muzzles woodsier ionics seabags" ; + dc:publisher ; + dc:date "2000-07-17"^^xsd:date . +bsbm-inst:ProductFeature490 + rdf:type bsbm:ProductFeature ; + rdfs:label "barbwire" ; + rdfs:comment "endorses neoclassicism pasteurized bullfighting pauses adulatory cybernetician paltrier percolator arguers makes bactericidal unvaryingly registerable oversystematic borzoi skirmishing faqir hearties henbanes hardhead potty bosky toadied tusked reshipped cartoonist obliger actiniums shipwrecking superpower demonstration conceited backspin itched sensorially somniloquist cogging subjected disinclined garnetlike airwoman pilsners aerator ripens foetus radiobiology" ; + dc:publisher ; + dc:date "2000-07-14"^^xsd:date . +bsbm-inst:ProductFeature491 + rdf:type bsbm:ProductFeature ; + rdfs:label "thouing" ; + rdfs:comment "waler viewy priss colognes blubbers tartest matured pirouettes cautery forworn sputterers prefacer lesbianism peachiest fluffily profounder untroubled synchronizer oilcan serapes radicals rejector consorting cuffed reheeling noiselessness bereavement godchild monotremata chills lymphatically bamboozler cheeps pipit standpoints myopically energizers precooked sported remits straightening overarched catches claimed misbestow tamarisk quakiest slangy" ; + dc:publisher ; + dc:date "2000-07-10"^^xsd:date . +bsbm-inst:ProductFeature492 + rdf:type bsbm:ProductFeature ; + rdfs:label "toffies" ; + rdfs:comment "dentals overkill frisbee unsegmented benefactrixes tackify comparisons fritted fallaciously workbenches mischarge sanes circadian redheads preventions tuneable recharting wardrobes divvies rhetorics phantasies lineate yews" ; + dc:publisher ; + dc:date "2000-07-14"^^xsd:date . +bsbm-inst:ProductFeature493 + rdf:type bsbm:ProductFeature ; + rdfs:label "debriefing immixing" ; + rdfs:comment "swilling resorters cluttering mannerisms architecure flense moxas clangored haughtier rascals southerly shirred institutionally windsocks laboring copulations deliverer brogan leaseless lunches" ; + dc:publisher ; + dc:date "2000-07-19"^^xsd:date . +bsbm-inst:ProductFeature494 + rdf:type bsbm:ProductFeature ; + rdfs:label "unaging" ; + rdfs:comment "religionist coached nestler reconciliations jerboa tenderfoots visoring voidance alleviatory polyps abhors aquavits swerves bossisms uncharacteristic bankrolls razorbill impanels problems couther falcons tinier fiches comfiest masterminds sibilation chauvinistic bitting nutting trainload authorizes gnomes miauled localization jammed" ; + dc:publisher ; + dc:date "2000-07-11"^^xsd:date . +bsbm-inst:ProductFeature495 + rdf:type bsbm:ProductFeature ; + rdfs:label "swizzled punts teleview" ; + rdfs:comment "testatum phonogramically affixer barometers phlegms outbluffed pickax quadroon fistulae loaners whereto superposition insiders saner saturdays federalization nanowatt termites finagles primarily quotes weighmaster overconcern reexchanged unsurveyed oatcakes wolfer" ; + dc:publisher ; + dc:date "2000-06-25"^^xsd:date . +bsbm-inst:ProductFeature496 + rdf:type bsbm:ProductFeature ; + rdfs:label "superhighway zeros" ; + rdfs:comment "semimonthly dulcimer wriggles bandwidths disenchantment workboat mistrial coequally avifauna overexciting canonically fertileness dancing permeated davits rehanged closer keypunching bossily disenfranchisement patchiness swordsmanship" ; + dc:publisher ; + dc:date "2000-07-13"^^xsd:date . +bsbm-inst:ProductFeature497 + rdf:type bsbm:ProductFeature ; + rdfs:label "clambers" ; + rdfs:comment "townwears focalize inexpertly angas ciphers absorbencies fizzer stringiest convictions denudations fulnesses vibrational seedcases lowing parsimoniously cellarets unentered smelters smoothness jesters horses alexandrian quaffers debonairly menstruum rebuffed typically thymes ligaturing kanji begrudging diagrammed voce bisexually loveable brackishness" ; + dc:publisher ; + dc:date "2000-07-12"^^xsd:date . +bsbm-inst:ProductFeature498 + rdf:type bsbm:ProductFeature ; + rdfs:label "longer foraged bailiwick" ; + rdfs:comment "allotrophic cuneate pygmies utilize biorhythmic alfalfas junketeers ochers stoicism mephitic caginess squirish bahamas volitions prioresses preschool savagely stinkbugs ghees cetacean patronizers shrivelling flamingly peins sequence opprobriate vireos raggy cityward featured preappointed journalize wainscots lumps stories calamint neatly incinerated arbalests gaggers compassed chicos rebroadcasts stuccoing hawkeys" ; + dc:publisher ; + dc:date "2000-06-27"^^xsd:date . +bsbm-inst:ProductFeature499 + rdf:type bsbm:ProductFeature ; + rdfs:label "decalcifying" ; + rdfs:comment "housemaster sanest socializes uncritical ungenial tickers feasters herpetologist postcards northerners hearing deciders wholesaler ors aggrieved vinos egises epigrammatist redrew underlined asthmatic cosher turned accusable heehawed underway knickers scroungier hypnotism sowbellies" ; + dc:publisher ; + dc:date "2000-07-08"^^xsd:date . +bsbm-inst:ProductFeature500 + rdf:type bsbm:ProductFeature ; + rdfs:label "wrenched braise dallied" ; + rdfs:comment "dugs pangs excrescences rockworks brisker astrophysicists elations chlorines vastier princeliness barristerial snootiness livable slipovers tularemic tambur atomised padishah tissued biotechnology" ; + dc:publisher ; + dc:date "2000-07-10"^^xsd:date . +bsbm-inst:ProductFeature501 + rdf:type bsbm:ProductFeature ; + rdfs:label "horniest sleekly" ; + rdfs:comment "piton adulterating headrest procreative transplanting gainsaying towages entrenchment carefully thatchers postdigestive amebean eggers skirmishes overparticular suboxides pandits mw corsairs akenes birdies electrified empathizing flibbertigibbet unfastened antennas preestablishing internationalize circumlocutory radiotelemetries hotbeds gesso hopper vilifier lexicographer whistlers medullae improvable designment vainest supersedes obnoxiously airfields homering obviates graders decorators" ; + dc:publisher ; + dc:date "2000-06-24"^^xsd:date . +bsbm-inst:ProductFeature502 + rdf:type bsbm:ProductFeature ; + rdfs:label "thymes reassumption" ; + rdfs:comment "shallower pretender periling guffs irregularities bathhouses vaccinotherapy hats estrangement jugula acidifiers quilting openhandedness involuntarily perturbs tiptoed razoring reinters protuberance reties reeked conservatories enormously depicting nutmegs pores bigmouth dotted investigator vocality choleras nonmilitant aluminize activistic squiggle chasuble nomads postulation certainest stooped philtred novena tearstained" ; + dc:publisher ; + dc:date "2000-06-26"^^xsd:date . +bsbm-inst:ProductFeature503 + rdf:type bsbm:ProductFeature ; + rdfs:label "cleverish" ; + rdfs:comment "reframes confirms throstles kinetins semiosis horseflies expositors moronisms gargoyle intercepted presser flaps leasers sinfully recoup clunk shadowgraph tsunamis shocker mummied brasher sullener animas understanding undermanned podgily saleyard optative menstruated flanker slumped disappearing flense thyroidectomized longes podiatrist cornfed caltrops hapless wormier containerize toting garde trigraph chemurgic waistbands agglomerations grunting transients ills" ; + dc:publisher ; + dc:date "2000-07-03"^^xsd:date . +bsbm-inst:ProductFeature504 + rdf:type bsbm:ProductFeature ; + rdfs:label "calpack" ; + rdfs:comment "dimensions preshapes grinners tackets retaliation rewash photochemical triangulating anodal veinlet hugs manicurists furlers grappled girdlers tremulously instants leaved cossets tsimmes dismalness filmography dispossesses relinquishers opaquely drivels personalties dollying variorum faultily wombs caver mahjongs" ; + dc:publisher ; + dc:date "2000-07-14"^^xsd:date . +bsbm-inst:ProductFeature505 + rdf:type bsbm:ProductFeature ; + rdfs:label "abandoners lingers spans" ; + rdfs:comment "ingenues frizzliest wark pinnaces recharts rubes samaritan unsterilized flowerless cooption tramless worthies herniae broidering tediums silhouetting briner pleasuring reexamination obsessively undersecretary uncorking elicitors ixtles apperceiving wort screenwriter detainee unzipped querist clomped rearouse nightwear seamounts charier insigne samurais motordrome reflective unchurched casuists flatulencies improvidently agribusinesses bearskin earthiest tsarinas syllabics sudses unshod" ; + dc:publisher ; + dc:date "2000-07-03"^^xsd:date . +bsbm-inst:ProductFeature506 + rdf:type bsbm:ProductFeature ; + rdfs:label "rotator jettisoned griddling" ; + rdfs:comment "thirstily overbalanced zipper limewater lawfulness doffing cradlesongs lodes swarth substitutabilities luckily shahdom middy connecters refuses cozey drubbed capmakers metalloenzyme issueless meed vanitied surprised irrigation pawnor undenominational screecher" ; + dc:publisher ; + dc:date "2000-06-27"^^xsd:date . +bsbm-inst:ProductFeature507 + rdf:type bsbm:ProductFeature ; + rdfs:label "stipends instancing" ; + rdfs:comment "electrochemistry appointively deveining uncharges rudely extraordinarily mazer ousting coprocessors immotility bearable formally variance illumining coiners preadapted hawkbill bushtit escallop iceboats gemmologists caducei" ; + dc:publisher ; + dc:date "2000-06-27"^^xsd:date . +bsbm-inst:ProductFeature508 + rdf:type bsbm:ProductFeature ; + rdfs:label "goofiness exhibits segregation" ; + rdfs:comment "pooches hydrogens decidable tules scratchiest attractive franchisee solitariness pipier avouchers fortunateness jollifying jackhammer bughouses lactates palsies tempos credentials chemosterilant pieceworkers unfurnished schillings foots reinfused" ; + dc:publisher ; + dc:date "2000-07-10"^^xsd:date . +bsbm-inst:ProductFeature509 + rdf:type bsbm:ProductFeature ; + rdfs:label "beverages winterer marriageability" ; + rdfs:comment "renting orates advertizement yielders slapjack makings surplice undischarged lumper gaveller googol riprapped sacrists hectares probability elegancy faits dialyses kilorad scufflers primings drivels marinates rummies watermarked hesitance chaired sketcher chipper refiners doting anoraks unextended hokums commoners wigwams routes identically liegemen sidesteps congealable saggiest standardize reconcilement" ; + dc:publisher ; + dc:date "2000-06-21"^^xsd:date . +bsbm-inst:ProductFeature510 + rdf:type bsbm:ProductFeature ; + rdfs:label "rescinder" ; + rdfs:comment "tarnally surlier glaziery swishiest prechill flyby turnspits culled avian inessential mercuries prawners remonetization avidities bowsed smatters archfiends streetwalking hectograms mumblers indigestibilty oratresses cupidities footslogs submersing procreated scapulae highbrows handedly bloomiest swordsmen meseemed huller disunion sleekly panels caucussed shucker" ; + dc:publisher ; + dc:date "2000-07-03"^^xsd:date . +bsbm-inst:ProductFeature511 + rdf:type bsbm:ProductFeature ; + rdfs:label "rinks incidentals scalawag" ; + rdfs:comment "linkages bestowed hagglers westers penang overstuff underhandedness observable folioing bellyfuls repertorial tourisms adjustor niters leavings outpayment expiations underpaying charlatan thrumming stockateer exploding aesthesia coloured contumelious appallingly weightily plainly sniffled" ; + dc:publisher ; + dc:date "2000-07-04"^^xsd:date . +bsbm-inst:ProductFeature512 + rdf:type bsbm:ProductFeature ; + rdfs:label "openwork" ; + rdfs:comment "furiously sycamores navigated trustwoman proceeds barbless causally resettlement nard speculator raveled swob yenning outflow garniture raptured trothed strategies personate postural sphygmographic requester linkup ogham decaffeinating hawkweeds" ; + dc:publisher ; + dc:date "2000-06-22"^^xsd:date . +bsbm-inst:ProductFeature513 + rdf:type bsbm:ProductFeature ; + rdfs:label "stems" ; + rdfs:comment "redistrict weekly valerian garrulously wiverns tipoffs honester minced plodding outpoured lanai mg shares evertors ambled dandyish cordialness shortchanging downheartedly vexations" ; + dc:publisher ; + dc:date "2000-07-12"^^xsd:date . +bsbm-inst:ProductFeature514 + rdf:type bsbm:ProductFeature ; + rdfs:label "spattered frostiness defames" ; + rdfs:comment "tufters classicalism disconsolately rancours cosmologists carriages circ aahing canonicals codification cerebrals overbalancing irks connectively trijet outnumbering shillelagh pleadable translucid discovered moonless misbiasing jouncier phonemes corroded defaulted" ; + dc:publisher ; + dc:date "2000-07-15"^^xsd:date . +bsbm-inst:ProductFeature515 + rdf:type bsbm:ProductFeature ; + rdfs:label "endangerment chiffons" ; + rdfs:comment "whiteouts optimists wiser ultraviolet ferried thumbing sweatily fewest matriline colombians decoyer blackly milldams expectance blares insinuator fishtailing seizors wishless fluctuation reassortment metamorphosing squeakier founder distressing guanin baroscope victoriousness resolutive razer automanipulation jauntiest chorial tillered washed interlining juking mercenaries dryrot imperviousness realising lachrymatory fops verses" ; + dc:publisher ; + dc:date "2000-07-07"^^xsd:date . +bsbm-inst:ProductFeature516 + rdf:type bsbm:ProductFeature ; + rdfs:label "coattails" ; + rdfs:comment "disfigurement germaniums fended impertinence lodges noncommunist godly enshrined clambered buddies forebodings carabineer cappy theists dossing whopping lullabies appointively encampment snivelers dissect oenomel" ; + dc:publisher ; + dc:date "2000-07-01"^^xsd:date . +bsbm-inst:ProductFeature517 + rdf:type bsbm:ProductFeature ; + rdfs:label "writable worsted reseeds" ; + rdfs:comment "anguishes appertained slowpokes evildoers sensualize decentest witlessly bolivias minters prows evaporating judiciousness skeletons shagginess quails fraudulentness enchains deciduously overcrowds pureness conjured linesman cyclamen corroborated" ; + dc:publisher ; + dc:date "2000-07-15"^^xsd:date . +bsbm-inst:ProductFeature518 + rdf:type bsbm:ProductFeature ; + rdfs:label "fairyland dacha" ; + rdfs:comment "bohunks colons maliciousness cajoled penner waterbed anomies deicing atolls putrescent microstates attends dressiest seceder interning philosophically mobbing circumventable travellable redeemers apers detoured diffusely outmarches timesaver hexapod dairymaids" ; + dc:publisher ; + dc:date "2000-07-14"^^xsd:date . +bsbm-inst:ProductFeature519 + rdf:type bsbm:ProductFeature ; + rdfs:label "geocentrically handpicks" ; + rdfs:comment "doctorates birdseye morganatic investitures coacted repins driveller manslayer alkalies alludes misnumber overelaborate contraceptives crimsons tatoos piccalilli detoxifying stockinette crisscrossing decadents cussing thro wardership moralizes neologisms repercussive dispraise affirmance subagency" ; + dc:publisher ; + dc:date "2000-07-02"^^xsd:date . +bsbm-inst:ProductFeature520 + rdf:type bsbm:ProductFeature ; + rdfs:label "sportswomen unprofessionally omnific" ; + rdfs:comment "diptych donne tipoffs roped paganists southwesterners denier bicycles veneers supertaxes testatrixes assister forecastles chaplaincies blenny taskwork bleats montes tyro skyed gomorrah podgier" ; + dc:publisher ; + dc:date "2000-06-24"^^xsd:date . +bsbm-inst:ProductFeature521 + rdf:type bsbm:ProductFeature ; + rdfs:label "tomographic" ; + rdfs:comment "muzzler queans hornless hyperacid gargantua lobules lingering potboilers rufflike alarmingly viaducts niblick cuppa tartly inquisitively mottoes acrimonies bridles raper pennons acres distress fanlight decompressive retinues theoretically flatulency opprobriously underlaid anticipating crassest malled brushup siziness peruvians earthlier internships unscratched" ; + dc:publisher ; + dc:date "2000-07-08"^^xsd:date . +bsbm-inst:ProductFeature522 + rdf:type bsbm:ProductFeature ; + rdfs:label "concocts" ; + rdfs:comment "confiscated jestful energizing prelims redistilled warbles hennas sentimentalized interrogatively wowed lynches unbiasedly branched damaged condominiums belling postmistress functions acids reappearing gabby impassionate felonries milfoils malignly slurs areolae braggadocio filibustered slithering coloradans dustpan humankind exorcized pampered bears desexualize boils reiterative legality skydives rains cakewalker unpitying aider yarning derivative" ; + dc:publisher ; + dc:date "2000-06-24"^^xsd:date . +bsbm-inst:ProductFeature523 + rdf:type bsbm:ProductFeature ; + rdfs:label "eyebeams" ; + rdfs:comment "repacifies nankeens hybridizations cosmetics truantries stairwells fronter dolorous mansions skylarkers nirvanas auguster octaval tsktsked augmentations unctions ensamples hydroponic rapeseeds affronted furriner uglis ramping husbanding persevered flosses nutritiousness mescalism miniscule veering disputes ejections unbeholden connecters placentomata remounted ravishment puttier uranian" ; + dc:publisher ; + dc:date "2000-06-22"^^xsd:date . +bsbm-inst:ProductFeature524 + rdf:type bsbm:ProductFeature ; + rdfs:label "galvanizations" ; + rdfs:comment "reendowed wavelets threapers unrighteous envois doubts adjurations shabbily sheather cuppier abbreviations kadishim touchingly submissions displacement raves hoed weightlessness bricky maltreating distr bareness disheartened alternated eudemons thrustor instanter cowcatchers overdrew alleviating craftiness hautboys antedating chemosterilants luau bolloxes biocides cartage preconceptions shrimpers scleral gushes altitudes vivaciousness" ; + dc:publisher ; + dc:date "2000-07-22"^^xsd:date . +bsbm-inst:ProductFeature525 + rdf:type bsbm:ProductFeature ; + rdfs:label "panier intercultural musicologist" ; + rdfs:comment "purest pretenses smutting antiparliamentarian reformation tollman nervate laudably disyoke machete weapons maharanee kettledrum acceleration collaring anteposition gangrene immunologists japanizing tzetze gogos granaries refuters discs eutrophies lumbago panegyrics increased skirtings periwinkles cherisher unforested gallnuts" ; + dc:publisher ; + dc:date "2000-07-02"^^xsd:date . +bsbm-inst:ProductFeature526 + rdf:type bsbm:ProductFeature ; + rdfs:label "hurrahed planktonic bioecologies" ; + rdfs:comment "uncleared lechered buildups foregoer torsions dinky permeated reconsider fencers mooched cabs absurdities drudgeries dodgery retailer mottoes conditione quoter gantries tracheobronchial malignancies magister plater cents motoric brides actable legitimist handsbreadth subsequential auctorial claps beautician meliorating guiltiest weatherstrips vernaculars braining interpolates sleekened rumours fortuning" ; + dc:publisher ; + dc:date "2000-06-20"^^xsd:date . +bsbm-inst:ProductFeature527 + rdf:type bsbm:ProductFeature ; + rdfs:label "microwave factionalism egomanias" ; + rdfs:comment "excavating federals sleazily campiest caterers arthritic collegiums unproductiveness vaporizing harked tableful adjectives subtotaled dismantlement aniseeds despited bulbous bulldogging plushily heliotherapies presbyter spryness shoaly tempi vouchered croaks repasses inhumanly doylies telexed toyed archaeologic spumante scaring interjectionally anguses wizening rankness reform" ; + dc:publisher ; + dc:date "2000-06-29"^^xsd:date . +bsbm-inst:ProductFeature528 + rdf:type bsbm:ProductFeature ; + rdfs:label "unassumingly pigtails festering" ; + rdfs:comment "derogated flashed fuels unalike footboards supplication hyperexcitable dimmer detraining caverning puppetry profanely silkscreens leptonic gloving uninterestedly kingly catered barred immunize estranges capitalism tempi dimensional ceasing narcotherapies dickenses frothier idolisms flawy volatilize supplementals alcoholization palindromically epigrammatize wired designers courters jerseyites earning rigger innerving expedience damps mutuals dentate" ; + dc:publisher ; + dc:date "2000-06-30"^^xsd:date . +bsbm-inst:ProductFeature529 + rdf:type bsbm:ProductFeature ; + rdfs:label "nectarines gutty" ; + rdfs:comment "boonies mews airwaves adjourning psychoanalyzing anticlimactically globalize owlish outdrew swiping featherier snacks epidermoidal reassorted spaniels pinspotter bespake enterer hoarsest monism comically ignitors synodic embonpoint tubulate heeded akenes" ; + dc:publisher ; + dc:date "2000-07-14"^^xsd:date . +bsbm-inst:ProductFeature530 + rdf:type bsbm:ProductFeature ; + rdfs:label "repinned singlets embalmers" ; + rdfs:comment "thymey conchoid dissolve meningitic moldier supersonics minnesotans enumeration jugs sleeker transferror whatnots chancels toenails ingestive suaver mummified disembodied shameless crumbliness expounded twiners globed settled radiographic witticisms interpolating anemones enchant enlivenment hourglasses suborners threnodes amortized" ; + dc:publisher ; + dc:date "2000-06-28"^^xsd:date . +bsbm-inst:ProductFeature531 + rdf:type bsbm:ProductFeature ; + rdfs:label "outcry secondarily sturgeons" ; + rdfs:comment "composting tufters overabounding concretes feaze subdiscipline unmuffle slier highjacks collectivizes postbags necrology nosebags ineffably responders wreaked wrathily pygmalionism caviare tramels caved agreements untactful overthrowing shiploads varlet tektitic logistically utahan moiled boardman dacoit turquoises torched brushers telluric germicides punting betides presells icehouse photomicrograph disembowelments fairer hypodermatically agitato" ; + dc:publisher ; + dc:date "2000-07-14"^^xsd:date . +bsbm-inst:ProductFeature532 + rdf:type bsbm:ProductFeature ; + rdfs:label "neurons wickerwork" ; + rdfs:comment "benzyl impressionists drunkest erased obsessions transcribes intenseness enthralled dumpier fifed nukes eluded reawakening debarking polymorphously primogeniture vulgarizers gussies skidding monkshood turgescence eminences precedable transcendency filename photographed waverers boatyards mailings finaglers limiteds irrelevancies lightfaced figeaters barf phallic quadruplication uneated anticancer otology aquamarine" ; + dc:publisher ; + dc:date "2000-07-11"^^xsd:date . +bsbm-inst:ProductFeature533 + rdf:type bsbm:ProductFeature ; + rdfs:label "siennas gormandizes" ; + rdfs:comment "romanticization castellan imperiums originated trilliums eliminating bullrings clitoridectomy spankings beaconless tuckered barbarization consummately profits hents learns cakewalk tableware oversalts electropositive fieriest blindage whitely turndowns enhancements carroms ketones bambinos droits fines flanged foretokens dimensional industrials remaining phenothiazine symbiotical worrit waul nutted ecologists" ; + dc:publisher ; + dc:date "2000-07-15"^^xsd:date . +bsbm-inst:ProductFeature534 + rdf:type bsbm:ProductFeature ; + rdfs:label "bobbing senilely" ; + rdfs:comment "mikado nuttier shiatsu checkerboards retinued wasters rollover erose fireplugs vessels zonation barhops saprophyte beguiler unexceptionably geometries biddings incendiarism tendentiousness seraphic deprehension tracing anticline defected remanufacture compulsives routes menstruum signifier complect coining piquancies nonperformance recompiling zoomanias odours groaner flinchers torchbearers sandbanks boasts" ; + dc:publisher ; + dc:date "2000-07-03"^^xsd:date . +bsbm-inst:ProductFeature535 + rdf:type bsbm:ProductFeature ; + rdfs:label "sects" ; + rdfs:comment "seigniorage baboonish bosoming divested poxing muzzling caroler rational comedies madders skirled ankh marylander acridest exorciser cst greedily halloos canasta asymptotes aspidistras preparers rationalist wifeliest aulder" ; + dc:publisher ; + dc:date "2000-07-21"^^xsd:date . +bsbm-inst:ProductFeature536 + rdf:type bsbm:ProductFeature ; + rdfs:label "reupholstered ethnicity" ; + rdfs:comment "likens cangues unpopularly mopeds culpability shoaliest sputters faience toxigenicities routeways aswarm convincers grating foreclose toxigenicities barleys smelteries sandbars bootlicks invocated dandies encompass captains remet flagellums unashamed agglutinations nattier freakishly yardmaster cerebrally cuteys dbl directer twiner alienating toras wringing uncaught dogteeth kahuna interfering rinsed beautifiers requite foundational airflows persuades stigmatized" ; + dc:publisher ; + dc:date "2000-06-26"^^xsd:date . +bsbm-inst:ProductFeature537 + rdf:type bsbm:ProductFeature ; + rdfs:label "conservationist celeriac teetered" ; + rdfs:comment "doffed cribworks simplifiers misbestowing finking fuzzed craving nativisms deludes stoppages furrows underlaps imputers etherizing thoughtfulness weekly gerontotherapies constable prescores premixed" ; + dc:publisher ; + dc:date "2000-07-02"^^xsd:date . +bsbm-inst:ProductFeature538 + rdf:type bsbm:ProductFeature ; + rdfs:label "hexarchies" ; + rdfs:comment "coursings amplifiable tawniest chintzy tyred buffable samsaras sightlessness gipsy forspent outfight speechless unscaled cutinizing feeler filthiness bullets rancidification cultist sanitaries semifictionally overdesirous misarranging rotting ravaging worrywart runnings cenacles congos protests joyance apery schmaltzes" ; + dc:publisher ; + dc:date "2000-06-26"^^xsd:date . +bsbm-inst:ProductFeature539 + rdf:type bsbm:ProductFeature ; + rdfs:label "swilling" ; + rdfs:comment "dreamers relapsing skydive perique defaulting corrugation fumaroles transplantations denotes accessoriness compte rotterdam doubler sediments convenes stat dispossesses pushily muddled fopperies" ; + dc:publisher ; + dc:date "2000-07-10"^^xsd:date . +bsbm-inst:ProductFeature540 + rdf:type bsbm:ProductFeature ; + rdfs:label "foredeck decalcifying" ; + rdfs:comment "wurst kegler polities revelers nightcrawlers evictors residua mystical minors towny ejaculator selects proportionally holdfasts causative stripteases haunts navahos disembark windblown frescoists lifetimes dramatizing unobserving acridly vinal regenerator ambrosias wrynecks famously" ; + dc:publisher ; + dc:date "2000-06-29"^^xsd:date . +bsbm-inst:ProductFeature541 + rdf:type bsbm:ProductFeature ; + rdfs:label "poetaster crones steamier" ; + rdfs:comment "peavies pregnancies switchblades warlock jumpoffs mathematical paroxysms jumpingly renovation forefends lineate procedurals rads transportal beanlike sprightliest tormenters unburdened causality deaconed contraindicate suburbanite peelable realizability nonorganic luxes mackinaws nonagon nances adorers procommunism confessable indemnificator commonplaces frustrating cirques endoskeleton monastical rattlebrain outages grounds gastroenterologist despicably lonesomes" ; + dc:publisher ; + dc:date "2000-07-09"^^xsd:date . +bsbm-inst:ProductFeature542 + rdf:type bsbm:ProductFeature ; + rdfs:label "molter conflux" ; + rdfs:comment "luteum paragraphing spearman steppers beretta fatter inversive matrilinearly outage sloper whited functions knotweeds unrelinquished cauldrons responders overarches procrastinator silencing irreformable pocky insulants carromed lumbago unimpeached arteriocapillary celebrator rafters buckskins boulders microfilming" ; + dc:publisher ; + dc:date "2000-06-28"^^xsd:date . +bsbm-inst:ProductFeature543 + rdf:type bsbm:ProductFeature ; + rdfs:label "garrotting crossroads" ; + rdfs:comment "cloyed dismantling furred convivially auditioning wattest entities sailed robberies appliances tallest hurls duratives undraping ensnarement incommoding lino fiscals bulwarks rouens coiling dissents goodwills brooches limply investigating saunas diagraph diphtherial affordable seminudity waxbill nerves biocidal" ; + dc:publisher ; + dc:date "2000-07-02"^^xsd:date . +bsbm-inst:ProductFeature544 + rdf:type bsbm:ProductFeature ; + rdfs:label "toyed" ; + rdfs:comment "downfallen squashes redundancies instantaneously blockades rehandle sphincters bayous severers intrenches reconvey rivaled paster positional accommodatingly whops bodega strangulating watermarking fridays admirations earlships idiocies cads remembrances unwritten magmatic wannest herbicidally hassling mergansers township hairlike trousseaus deices dismembers nonpareils misreporting ceriphs pussycats ageists" ; + dc:publisher ; + dc:date "2000-07-02"^^xsd:date . +bsbm-inst:ProductFeature545 + rdf:type bsbm:ProductFeature ; + rdfs:label "edema endlessness gastroenterologist" ; + rdfs:comment "mothballs crispness resoundingly nonappearance peppertree mystifiers adduced appreciative consummations cenobitical ventless courtesied panamas ethnological bubs peke fattish alleges pervious unpreventable rues rubblier needlessness asterisms thicksets venomer hatpins seraph rinses roebucks" ; + dc:publisher ; + dc:date "2000-07-19"^^xsd:date . +bsbm-inst:ProductFeature546 + rdf:type bsbm:ProductFeature ; + rdfs:label "alternated conniving" ; + rdfs:comment "wifeliest radioactivity inconsistently medullas moochers falteringly gallantries pac steaks muggily piecework countertenor scrapers protectresses vineal quantitatively obligates asymptotical disengage nailset unprocessed" ; + dc:publisher ; + dc:date "2000-07-19"^^xsd:date . +bsbm-inst:ProductFeature547 + rdf:type bsbm:ProductFeature ; + rdfs:label "tollbars retinues borage" ; + rdfs:comment "husbands yanking chainmen unmentionable prescores alienator bevies lightfooted overshooting coincidences disrupting bowingly queriers piquancies redolently negatived droning dietetics cubature draggiest tinged stodgier inbuilt multiplicities undisciplinable griming unaging linked poundals anchovies dickenses gingivae unsilenced repeopled yawp sylvans peachiest craziness sunspots ensnaring mayapples conterminous honan formulary turtledoves moonbeams totems fumets stockpiling creepier" ; + dc:publisher ; + dc:date "2000-06-24"^^xsd:date . +bsbm-inst:ProductFeature548 + rdf:type bsbm:ProductFeature ; + rdfs:label "urbaner" ; + rdfs:comment "unrefined cinematograph population incalculably deoxidizers combatting inserts ritards ambergris sedums appetizer corroboratively cauterization queerish inrushes nubbier retrenchments invincibility flense prognose numbing fosterage sugary bankbooks noncontrastable fille cricketer canters operators deadliness twenties fruiterer grenada remet refolds cybernetical overfilled uncorks tweezes famines millivolts regerminative vandalizes immortalizes thersitical befouling resisters gorblimy humbug aquaplanes" ; + dc:publisher ; + dc:date "2000-06-26"^^xsd:date . +bsbm-inst:ProductFeature549 + rdf:type bsbm:ProductFeature ; + rdfs:label "guitars forgivable teenagers" ; + rdfs:comment "homunculi alienage flourished switchblades petrified irritancies reconstruct storewide fraying timbers convecting miler separator feints conformational wirehaired receptacles novelties reprovers gnotobiology realpolitik ultrafiltration hopelessly" ; + dc:publisher ; + dc:date "2000-07-12"^^xsd:date . +bsbm-inst:ProductFeature550 + rdf:type bsbm:ProductFeature ; + rdfs:label "nutations scrips" ; + rdfs:comment "tridents ineloquently sleazy worts cavitation monarchial cumberers wristlet primitives ethiopian chorizos characterizing rubbernecks believably fevering talcs commonalty keyways remeasures snowed amigas avouches literatures nonverbal" ; + dc:publisher ; + dc:date "2000-07-09"^^xsd:date . +bsbm-inst:ProductFeature551 + rdf:type bsbm:ProductFeature ; + rdfs:label "inkers" ; + rdfs:comment "plateful skittish accessories puttering oklahomans tuber reusable plunderable feedstuff punner proscribing quietudes bellweather railed witherers hilliness shagged reassume abided tarring voiced synthesizing preadult" ; + dc:publisher ; + dc:date "2000-06-30"^^xsd:date . +bsbm-inst:ProductFeature552 + rdf:type bsbm:ProductFeature ; + rdfs:label "etherealness resuscitated" ; + rdfs:comment "goodlier washerwoman variform laicizes appraises lows valva diagrammatical wilted preplanning radiochemist electrostatic chela slakes noncombatant golfer forgathers newfangled gawkiest preferment entertained synergistically" ; + dc:publisher ; + dc:date "2000-07-06"^^xsd:date . +bsbm-inst:ProductFeature553 + rdf:type bsbm:ProductFeature ; + rdfs:label "boxlike" ; + rdfs:comment "occlusions emerged controverting diptera overcloud leprechauns godsends silenced oxidizers sinuate honeybees unsuitably bewrayer puking stabbed inseminators sirree certifies tailcoats charisms summered okras powered locater revolutionaries azoic" ; + dc:publisher ; + dc:date "2000-07-14"^^xsd:date . +bsbm-inst:ProductFeature554 + rdf:type bsbm:ProductFeature ; + rdfs:label "improvises midwived" ; + rdfs:comment "mantes promulgated decertifying enfranchisements prevalently equivocality quizzers pratique zoftig annealing penetrative pansies festal godless slims japes blockbusting paled smackers lurkers blazes jewelries adequateness infrangible sumptuously valances trisaccharide yodeled crumbs spangles radiuses concertmasters jawline pricker inconsistentness hedonisms bathrobes recliner flashlights" ; + dc:publisher ; + dc:date "2000-06-27"^^xsd:date . +bsbm-inst:ProductFeature555 + rdf:type bsbm:ProductFeature ; + rdfs:label "cleavages reconquest exquisiteness" ; + rdfs:comment "triunity cameroonians computing ogresses cert antinomian crawfish measled erat zoning indicatives southwester paginates restless punily pawnbrokers pryers philosophically mohammed unmaskers grapples soupy interregional slayers imponderables plowshares pelage chummed" ; + dc:publisher ; + dc:date "2000-06-22"^^xsd:date . +bsbm-inst:ProductFeature556 + rdf:type bsbm:ProductFeature ; + rdfs:label "alaskan" ; + rdfs:comment "aureate aurochses systematized sweltering unknotting hispaniola noncontrabands ballooner sociologist rereads piracies tolyls subcategories ab scribal guaranteed wisdoms readd packinghouse critiques expulse waiter profounds upturns dabblings interlocutrices grandiosity trimotor fescues generalizing pedestals jewing impassively reacclimating diametrically" ; + dc:publisher ; + dc:date "2000-07-14"^^xsd:date . +bsbm-inst:ProductFeature557 + rdf:type bsbm:ProductFeature ; + rdfs:label "meiotic beanery" ; + rdfs:comment "rearwards wobbliness songstress scorchers peradventure manyfold fleeting evanesced recited pinko wetly pikemen bundlers redbreasts bricky plugger rumbling travelers amnestied telegraphic judicially pimpernel sanitarily beetles stranglers longues dodderer ignitors estimation shirtiest malpracticing fading serener capitulated candescent demeanors solicitousness unsettled" ; + dc:publisher ; + dc:date "2000-07-03"^^xsd:date . +bsbm-inst:ProductFeature558 + rdf:type bsbm:ProductFeature ; + rdfs:label "walkouts" ; + rdfs:comment "citied brainish unroof beggarliness flourished aligners legislatrixes utahan chronically biophysicists collaborationism depends demobilizing masseurs glaceing sonorant bronchodilator penpoint unusable easterly kaffir adoze aquacades agilely shakiness compatibilities antimilitaristic flavour miladies nativism kilters houseboats decapods tuner litheness commissars overloads teacher reconciles seedmen greenback halftime bedwarf weasels adiabatically blackest greaved frighteningly" ; + dc:publisher ; + dc:date "2000-07-22"^^xsd:date . +bsbm-inst:ProductFeature559 + rdf:type bsbm:ProductFeature ; + rdfs:label "fleers reassorted" ; + rdfs:comment "forecasted janizary livability wellholes roadwork gastrology kvetched furrows climaxed conducers photons nightlong rooks chateaus tenderfeet accounting pronate fatherliness talebearing trinary raddles rechartering criticizable disciplines tunefully sketchiness supered boozed" ; + dc:publisher ; + dc:date "2000-06-25"^^xsd:date . +bsbm-inst:ProductFeature560 + rdf:type bsbm:ProductFeature ; + rdfs:label "indicting" ; + rdfs:comment "intransigently reflexives sauciest sideswiping padlocked unsoldered laziest overanalyzing lasting pigsticked averaged crower northeastward refractivities reweld permanencies crunchiest rimrocks fleeced kl ahold dikdik genies poolrooms mesmerizers reverberators talers congealable overruling arteriography berthing interjectionally unwishes bounteous pebbly horrified trending" ; + dc:publisher ; + dc:date "2000-07-13"^^xsd:date . +bsbm-inst:ProductFeature561 + rdf:type bsbm:ProductFeature ; + rdfs:label "intombs underassessment" ; + rdfs:comment "stetting telephones substantiator cigarillo thousandths neurologize ambidextrousness orbing adherence vocabularies transistorized dimes beauticians upraising cashing piquet frustrating folksongs barcaroles grotesques winsomer dehydrogenation tariffs miasms tunny endearing thunderstruck calumnies scintilla vertebrally venules facedown compressions bigeyes suborning vasoinhibitor scrimps razored protested appoints silos oviducts scarab racists baldpates misquotes refuses veepees reposing enslavements" ; + dc:publisher ; + dc:date "2000-07-02"^^xsd:date . +bsbm-inst:ProductFeature562 + rdf:type bsbm:ProductFeature ; + rdfs:label "standishes graveclothes officiousness" ; + rdfs:comment "sirens knobs cuss tonne reallocation wiglike tangler edifying tapes binnacle sized unstandardized derangement nomadisms aerobically widener reapportionment flamboyance reheater crumby hydrogenation enamelled basks revivifies" ; + dc:publisher ; + dc:date "2000-06-21"^^xsd:date . +bsbm-inst:ProductFeature563 + rdf:type bsbm:ProductFeature ; + rdfs:label "mishmoshes astounds" ; + rdfs:comment "yemenite mammon roadways flattering scrimping jerker anemia mentionable salesroom pallidly antirevolutionaries pieceworker goldener codlings gorgets redivided overtured webfoot revolutionist heretics plutocrats smoothers virulencies ventral" ; + dc:publisher ; + dc:date "2000-07-09"^^xsd:date . +bsbm-inst:ProductFeature564 + rdf:type bsbm:ProductFeature ; + rdfs:label "biomicroscope medication" ; + rdfs:comment "enchained absolvers leveeing strongboxes disputed battlegrounds dumpiest trunked painkillers monorails misadjusted egotisms contrived carbons pshawed liturgical scrolling dextral wonts inebriated ratifying grantors snideness ardently drugmaker founders agedly regimental cannonade diets boodler sikhism bacillary withdrawing photosensitizer subindices ferries squabblers" ; + dc:publisher ; + dc:date "2000-07-18"^^xsd:date . +bsbm-inst:ProductFeature565 + rdf:type bsbm:ProductFeature ; + rdfs:label "stintingly reviler solving" ; + rdfs:comment "gonophs dapping creations clatters adieux crappier grouched deputations associating healths dobber hurdlers foins furcated slushily emirates ninepin punning frontager dandler fallibility daubers unsnarled tertiaries lutherans productiveness metred nictitated bisectional homonymic" ; + dc:publisher ; + dc:date "2000-06-30"^^xsd:date . +bsbm-inst:ProductFeature566 + rdf:type bsbm:ProductFeature ; + rdfs:label "defuzing disburses solutions" ; + rdfs:comment "unenvious snapped applies clarkias baalism warhorses wielders chanteuses contacting mortary riffed cesura unlawful regrets clutches indiscriminating fusee alkalinizing postures methadone ordained mothery nudisms bridgings cubature" ; + dc:publisher ; + dc:date "2000-06-24"^^xsd:date . +bsbm-inst:ProductFeature567 + rdf:type bsbm:ProductFeature ; + rdfs:label "bankrupting" ; + rdfs:comment "alloyed sighted refrigerating bleeder benin enroller criminals slavishly occultist abjectly remodel commons nursemaids secessions riving viceregent lawns fates reframing clarifies osmose levitical scathing broods seashell firers slithery blindages husked snugged clergywoman riffles slily cay" ; + dc:publisher ; + dc:date "2000-07-14"^^xsd:date . +bsbm-inst:ProductFeature568 + rdf:type bsbm:ProductFeature ; + rdfs:label "wifed blousily" ; + rdfs:comment "plats garotes pardoning livability ouches tramline unprogressive garbed blasphemously roughers flabbergasting sorrowers connectors adopted rigorism ideologizing loathings reglazing nightwalkers outdodging draughty stoups recuses coughed mickeys turnings bigwigs scrawliest becomes oxidizes investments synods couping pulping" ; + dc:publisher ; + dc:date "2000-07-14"^^xsd:date . +bsbm-inst:ProductFeature569 + rdf:type bsbm:ProductFeature ; + rdfs:label "letters retsinas" ; + rdfs:comment "savourer reiving insidiousness eventualities onrushes misinterpretation soddened bubs transfigurations wiped snarks insupportably macaroons interjections tingles galax reshape egomaniacally programmability gigolos grandioseness haylofts hidalgos intonation rockaways resided expounder reminiscently somesthesises" ; + dc:publisher ; + dc:date "2000-07-05"^^xsd:date . +bsbm-inst:ProductFeature570 + rdf:type bsbm:ProductFeature ; + rdfs:label "sheaving inflated lacquers" ; + rdfs:comment "epeeists shaggily reheated stickiness blowzier ails havocked gogglers imperiling rejecting takable woad touristy noncancerous emulatively bosoming blackly revampers haranguers racer cliches artiest washcloths cajolements polyphonically loosely fringeless trillions revengeful phalluses catnaps motivated kindheartedness abbotship cockades evidenced ecdysis swampland impingers lengthened strengthens autoclaves regularly misappropriating rites cruiser fondue bounties" ; + dc:publisher ; + dc:date "2000-06-28"^^xsd:date . +bsbm-inst:ProductFeature571 + rdf:type bsbm:ProductFeature ; + rdfs:label "jiggles forfeiting sequencing" ; + rdfs:comment "erythrocytes barbarousness bequests cajon lasting confoundedly signiors fending reconfirmed collarless reused farsightedness biosciences disgusts unpicked telephoners rubidiums deux coloraturas disinfect gangplow authoritarianisms reclassify jolter footrest theremins carpenters efts offishness" ; + dc:publisher ; + dc:date "2000-07-04"^^xsd:date . +bsbm-inst:ProductFeature572 + rdf:type bsbm:ProductFeature ; + rdfs:label "dietetics exposes daises" ; + rdfs:comment "convective laster strayed braizes undemonstratively runtiness gracile subsurface coparent moistness dickies reassurances infantilism deans lycees durra hobnails purveyance razed centra seconde integrating" ; + dc:publisher ; + dc:date "2000-07-10"^^xsd:date . +bsbm-inst:ProductFeature573 + rdf:type bsbm:ProductFeature ; + rdfs:label "volante" ; + rdfs:comment "gamines alembics smartly awakeners cooked antihypertensives expectable baccalaureates appeasements wrigglier sounder egomaniac reenlists disappearance blandishment jujus buggering nonspecialist levitations ufos nationally supersaturates coalesced preexpose gutty politesse crabbers enamors omnibuses nonsexually travailed monetarily gamine overanalyzed slackage betraying midair sunlamps neuritic gonoph eggshells chiromancy strenuously intentioned aerodynamics photosensitized larruped" ; + dc:publisher ; + dc:date "2000-07-15"^^xsd:date . +bsbm-inst:ProductFeature574 + rdf:type bsbm:ProductFeature ; + rdfs:label "electrostatic saltpetre poetizer" ; + rdfs:comment "orderer nutgrasses canonizations transacting decomposability tunefully skyjackers vicarage catamounts ravioli burnable fetlocks dissection integrally fishtailed compensations squalliest calipering betas inaugurates sitting analyzer goatee inscrutableness postludes" ; + dc:publisher ; + dc:date "2000-07-11"^^xsd:date . +bsbm-inst:ProductFeature575 + rdf:type bsbm:ProductFeature ; + rdfs:label "frighted" ; + rdfs:comment "getting abeam condensers rescheduled remodeling pended reannexes touchiness rubblier unkinder recounted creameries portiones probers quintar keratoid mountebanks kitharas returnability pellucid toiled phonological amortizable evolves" ; + dc:publisher ; + dc:date "2000-07-07"^^xsd:date . +bsbm-inst:ProductFeature576 + rdf:type bsbm:ProductFeature ; + rdfs:label "doltishly" ; + rdfs:comment "playthings rebind unfree alliums serotypes splotches unholily encampment bustlers whitecap heavyhearted ideates thermonuclear peonism idyl humanistic impossibilities cornstalks goaltenders plausibly toolless forjudge vulgarization bobtailed compartmentalized bearers lexicographer checkpoints pickled undercutting observance alertest blockheads prescriber wordperfect gauges bahamas wives" ; + dc:publisher ; + dc:date "2000-06-27"^^xsd:date . +bsbm-inst:ProductFeature577 + rdf:type bsbm:ProductFeature ; + rdfs:label "hulkier perfectionism castrato" ; + rdfs:comment "interatomic retinted snuggest shiatsu calcimine sensated unwelcome catalogued misadjusting hypnophobia saveable fights sailfishes toeshoe misapprehends berets interrupts costuming unfortified smokily suicidology lapinized halfpenny varier nonmagnetic virilize bloodshedder squanderer baywoods loges travois perchers unaccentuated pock blintze barbarianism downier glares cowled axled barrettes" ; + dc:publisher ; + dc:date "2000-07-01"^^xsd:date . +bsbm-inst:ProductFeature578 + rdf:type bsbm:ProductFeature ; + rdfs:label "supertaxes" ; + rdfs:comment "mediumistic doggonest azote overawe jesuitries cockamamie symbolizations doused interrelationship evanescing unvisited pluralizing fixers disembowelments negative toner lignified safes anecdotist unnoticeable commentators bedfellow attracts vivider accumulating encrypting prejudging brassards koshered spearheads funereally ribalds traction lavages leakiest assonances plunders readdresses tokening preamp ropier rainwear crummie jubilates glacises plashiest resuscitates nonparametric" ; + dc:publisher ; + dc:date "2000-07-05"^^xsd:date . +bsbm-inst:ProductFeature579 + rdf:type bsbm:ProductFeature ; + rdfs:label "purblindness" ; + rdfs:comment "cosier restorable mayflies cosecant lauds chuted earthward criminals contributes creasier magnificently accommodated befoulier patronized schleps jefes mousse showered teazled standardbearers antireligious envoys preslavery circumcising loggings fleshlier bankrolling thymy aeronautics butchered grocers overwork legality cheques liberalize filterable" ; + dc:publisher ; + dc:date "2000-07-06"^^xsd:date . +bsbm-inst:ProductFeature580 + rdf:type bsbm:ProductFeature ; + rdfs:label "acidifier bookkeepers dints" ; + rdfs:comment "toters superscripted straitly saltine swapped jugglings netsukes outlawed concourses sunbeams articulately pandas mendelianism broadaxe compliantly benison portiones negatived hagiography priorities boughed gelee concluding reliantly sullied vaccinations lobbers squawked reactive savors" ; + dc:publisher ; + dc:date "2000-07-05"^^xsd:date . +bsbm-inst:ProductFeature581 + rdf:type bsbm:ProductFeature ; + rdfs:label "nonstriking litanies bibbs" ; + rdfs:comment "integrals platinic ossifications apothems echeloned misapply foeti malingerer eulogise chimaeras puce outdoors hiders megohms nervate bowsed ritualism intelligences misemploys hindus piggins dottily fleetingness snapweed cookey betrayals somnolently tines electrophorese victualed quarreler lanolines kegler overridden unitizes remonstrator unknotted fortuitously discouragingly wagoner monetarily gouache scherzos glowed cuds spinless" ; + dc:publisher ; + dc:date "2000-06-21"^^xsd:date . +bsbm-inst:ProductFeature582 + rdf:type bsbm:ProductFeature ; + rdfs:label "inventer extirpation" ; + rdfs:comment "repels kevels pollack unabsorbed freshest beefburger gilding bloodies amerism calumniating musicologists courting longline minny microcosmic violences irrationalities glitzy ladron twigs bouncing interrelatedness interrelating nuts canniness courageously uneaten archduchesses subleases backhanded monophonically jigsawing affiant creation corrida" ; + dc:publisher ; + dc:date "2000-07-01"^^xsd:date . +bsbm-inst:ProductFeature583 + rdf:type bsbm:ProductFeature ; + rdfs:label "thrusts" ; + rdfs:comment "tariffs sowable obeyers fuehrers pyjamas porgy kneecapping munching soviets reexperienced welladay waylayer ineffectively blows combiner brims stumbled cuboidal lifting bestializes fortuitously coulee polarizing equivalences mores jaygees proprioceptor shelved retrogradely inches cleanest regauges effervesces redresses annihilator segmenting earlships putrescent" ; + dc:publisher ; + dc:date "2000-07-18"^^xsd:date . +bsbm-inst:ProductFeature584 + rdf:type bsbm:ProductFeature ; + rdfs:label "swimmers daubing refractoriness" ; + rdfs:comment "desalinating indentions reekers syndromes bimanual orgeat philosophizes royalisms charbroiling habitants barmaid orris variorums showiness inspiriting phototropic fomentations darkening tories tomorrows caries billowed razzing misstates giantism defecation bights hydrogenates locates surfaced crawled foraying slunk carnality freezed titbits belongings oles" ; + dc:publisher ; + dc:date "2000-06-24"^^xsd:date . +bsbm-inst:ProductFeature585 + rdf:type bsbm:ProductFeature ; + rdfs:label "fibbers listening disembodiment" ; + rdfs:comment "vanquishment merci dismembering irreverence refreshing nictitated arced personality disporting fease seasonings welder purifications mezzos bassness abattoirs sororities prepublication settlings elegance griddling quitclaims" ; + dc:publisher ; + dc:date "2000-06-26"^^xsd:date . +bsbm-inst:ProductFeature586 + rdf:type bsbm:ProductFeature ; + rdfs:label "fellest" ; + rdfs:comment "beneficialness lithotomy carrom spaceship enrobers hydrometers springboards dustrags rehabilitating bided merchantable xmases pauperizes grosz undisclosed steeps bordereau chatelaine vitiating clarifies supernova subnucleuses ventilation croaked abstainer enraptures somnambulator matey surprized mudders xenobiologies bloomery corders criminology weens ethiopian cosiest schedules belting dampest outstands minutes deviltry haircloth combaters smoker unfurnished feeless defats capacitated" ; + dc:publisher ; + dc:date "2000-06-20"^^xsd:date . +bsbm-inst:ProductFeature587 + rdf:type bsbm:ProductFeature ; + rdfs:label "moulters unlaces cinching" ; + rdfs:comment "alteratively libeler downrange dognaping etiolating reverence exhalant bossiness gargles resupplies ignitions concerns defog manilla amanuenses effluvias nonmechanical soubrette smelting multiform syphilizing microprogramming reerecting lusted cans virilize thumbkins myrtles pacified stunned feldspars boules luminously feldspars parkings townfolk transferal monotonousness plainest calderas repents empirically" ; + dc:publisher ; + dc:date "2000-07-12"^^xsd:date . +bsbm-inst:ProductFeature588 + rdf:type bsbm:ProductFeature ; + rdfs:label "implying congestions" ; + rdfs:comment "absolutes amounts catspaw presiding advertized inseparability triumvirate subheads spoony basils stuccoer whiplashes sheafing headband disposals snuggled fileted openable campanologists pschents headlamps undogmatic ablatival tubercles unsupportedly dentures enfolding rancidness" ; + dc:publisher ; + dc:date "2000-06-24"^^xsd:date . +bsbm-inst:ProductFeature589 + rdf:type bsbm:ProductFeature ; + rdfs:label "dehydrogenated" ; + rdfs:comment "heifers fluoresces definitiveness coons whitecap wholes euphemistically carding stunners dynamited seats epilepsies disgusting grammars hodaddy bawdries unobserving ireless disjointedly muddler repaint psychotically perm vaccinators sandworms dudgeons mobbers counterfeiter unpatriotic dosing restores dealer attempered manuever antimonies logically jackal" ; + dc:publisher ; + dc:date "2000-06-21"^^xsd:date . +bsbm-inst:ProductFeature590 + rdf:type bsbm:ProductFeature ; + rdfs:label "guardians" ; + rdfs:comment "ratfinks crawdads foremast government palestinians oligocene recombine enlistee haloed pepsins oafs cashable ordeals assets unmeasured subtraction muenster throttler wholeheartedly incarcerators swifter reboiling briefless enamoring slaughterers cicatrix veers unshelling refrigeration riffraff outreasoning masquerading expansionary preexamined atrip ramie sexiest hardbought itchiest raided westwards ejectum orchardman necks restudied glottises stinter windbags offensives" ; + dc:publisher ; + dc:date "2000-07-09"^^xsd:date . +bsbm-inst:ProductFeature591 + rdf:type bsbm:ProductFeature ; + rdfs:label "messmen flirtations" ; + rdfs:comment "clownish nonresidual emollients libelling chancemen pensioning financing nonsignificant thesauri formful frenched foreseeable transpositions troubleshot saving feminized interlacing squalidest swatting monumentally hypes particularize auriform poleax unimpeached spriggy derails landmasses theatrics lilliputs inundates synchronize exited benefactress libbers matted vim driveled" ; + dc:publisher ; + dc:date "2000-06-21"^^xsd:date . +bsbm-inst:ProductFeature592 + rdf:type bsbm:ProductFeature ; + rdfs:label "kajeputs canvasses" ; + rdfs:comment "tarantulas teaches prebill transcending chrism abounded sprinkled nondisclosure extincts careerers nuttily clues pugnaciously outvote seaming superiorities lewdest sisterly discography voguish offeree babbles apodal alluringly musette readiest havocs almoners frags archaizes winnings bartletts quenches disorientation nubbins adjacency chela icings alphanumerics ardours homesteads gager solves titivated subdepartment rhesuses inheres poled sphered casking" ; + dc:publisher ; + dc:date "2000-07-09"^^xsd:date . +bsbm-inst:ProductFeature593 + rdf:type bsbm:ProductFeature ; + rdfs:label "llamas strewed" ; + rdfs:comment "tare rebilling shushing sylvas indisputably nighness avengingly enjoyably tablefuls gazeboes upcountry apologized tennesseeans guided mortgaged releasible deviator mucuses oncological gripey chiropody clerical snapweed gladder wofully ditching subclause unvoiced twirling inhumes mellifluous approbate anaesthetize ritually reexamines" ; + dc:publisher ; + dc:date "2000-07-07"^^xsd:date . +bsbm-inst:ProductFeature594 + rdf:type bsbm:ProductFeature ; + rdfs:label "glossal collator" ; + rdfs:comment "nepotist applier tummies serenades heatedly enow intones obligability clueing monocotyledons malaysian smiled contentiousness metaphorical explosiveness distiller nethermost taxis veldts reenlistment celebre unrobing boldfaced guilders rooms bilaterally lymphatically reared dicasts" ; + dc:publisher ; + dc:date "2000-07-12"^^xsd:date . +bsbm-inst:ProductFeature595 + rdf:type bsbm:ProductFeature ; + rdfs:label "butterier" ; + rdfs:comment "sorrily bikinied nonpasserine ambivalence bookkeeping montes gaps disgracefully technologically procrastinator inimitably reactive subitem signifying challenging bosks noteworthiness xeric igniting gillnets frigidly intromits inebrious crees corruptness tricentennials discerning formalize radiolucencies squats hypnoid entwists legibleness urchins unhooded gustiest humidities entrails latrines deceptiveness martials enow busywork startling cockcrows counterintelligence firmest lampoonery digitize" ; + dc:publisher ; + dc:date "2000-07-19"^^xsd:date . +bsbm-inst:ProductFeature596 + rdf:type bsbm:ProductFeature ; + rdfs:label "sirupy semivoluntary" ; + rdfs:comment "squalors fatigability bisexually grubbing hopeless dinky weeper swindled hocker absolved cuttled robes parasitization sparked albedos unsettlement played denigrating niblicks peccable jolters techies chequering bemas boons savourers reuse miserable pawing locksmiths eclipsed countersigning zebu rankish charters vivisecting shiftiness revetments ranker embosser survivors mechanizers envision manilla sightly indefiniteness" ; + dc:publisher ; + dc:date "2000-07-17"^^xsd:date . +bsbm-inst:ProductFeature597 + rdf:type bsbm:ProductFeature ; + rdfs:label "canonry slugabeds gracefulness" ; + rdfs:comment "leopards reincorporating cliques pulque diffusing appellors maladjustment flagmen crosier uprooting balloting shovelled reverter phonal fifing choosing guarantors tarrying splits owned speleology seafarers sending privities novelists propinquity rapping leans lickety photostated outfielders outplay pelted reships prostatic anaesthetization chromatically standardizes" ; + dc:publisher ; + dc:date "2000-07-16"^^xsd:date . +bsbm-inst:ProductFeature598 + rdf:type bsbm:ProductFeature ; + rdfs:label "refinancing rubbled canyons" ; + rdfs:comment "letdown chimaeras overexposing hilted inductions quatrefoil emaciating photosensitive recourse feignedly orangeries pullmans demoralizer repellents exiguous expwy gangsters zairians highlanders pitifully meadowlark funicular prostatectomy chromaticity postprocessing feminity insincerely seignory longest rocked chocks hired lithographer warranties sackbut" ; + dc:publisher ; + dc:date "2000-07-04"^^xsd:date . +bsbm-inst:ProductFeature599 + rdf:type bsbm:ProductFeature ; + rdfs:label "bonesets womanizing jacobin" ; + rdfs:comment "overpraises brayer morning infiniteness finalities brines maturating hookworms juxtaposing schwas hammed nicks chuffer winnows hepcats evaporative psalteries invalids plopping romped concussions nontraditional excites secundines ravels scabs memsahibs easements thrip assigner whishts sureness accorders rescinding striating godlings houselights" ; + dc:publisher ; + dc:date "2000-07-17"^^xsd:date . +bsbm-inst:ProductFeature600 + rdf:type bsbm:ProductFeature ; + rdfs:label "microprocessor unrobe indonesians" ; + rdfs:comment "shticks tastable cayennes stereoisomerism cauldrons tittie stockpots coordinations fugging wageless zestfulness osseously chummiest lazars swings decrepit addicted grudger spendable ofay unconsciousness stiffest exorcising tything recoin monitions extraterritorials habitable pennants parable enfranchisement pugilist cometic mitoses biodegradability devoted tomboy escarped intrenched oxygenizing sitarists adjudges frostbit atrophying sunbaked checksums" ; + dc:publisher ; + dc:date "2000-07-13"^^xsd:date . +bsbm-inst:ProductFeature601 + rdf:type bsbm:ProductFeature ; + rdfs:label "mafias" ; + rdfs:comment "ironwoods cryobiologically awardee fatefully defaulted droppers felines flaxes pettier troublemakers besieged shavians fleches beys anglicizing sharkskins alarming covalence remodel bats arf advocates satyrid hogtied soothed nutritionist warehouser conclusiveness killings congruently mimosa superimposition recreants pandering tolerative routinized crevices recaptured reconfirmed intentionally butterfingered reinoculations pronghorns funkiest cinematheque radiuses agaves" ; + dc:publisher ; + dc:date "2000-07-10"^^xsd:date . +bsbm-inst:ProductFeature602 + rdf:type bsbm:ProductFeature ; + rdfs:label "punier" ; + rdfs:comment "divvying grains incising mucilaginously pronghorns irrigated attained hygroscope thickets ornamentations volunteering tibias understating brainsick implanting baronetcies gruel benefactive psalmists liberation arable dryades oversuspicious whined hipbone edifiers celebrating cracklier fingerprinting chantage boxing ganefs froths representations subserviency cummers indefensibility speckles graduand contrives oppugn tsarist noncritical heliport silesia midsummers hyperopic trephining zemstvos" ; + dc:publisher ; + dc:date "2000-06-23"^^xsd:date . +bsbm-inst:ProductFeature603 + rdf:type bsbm:ProductFeature ; + rdfs:label "fierily lavage" ; + rdfs:comment "fakeries meritocracy spectrochemical hypo pardoned fantasizing nonages cigarillos mustered palpitated insularity overflown conjuror ousters variegation mothery unwarrantable delaying contests battlemented redetermine weirs lightfooted mongooses nondepartmental useability paltry tangibleness unwarily hipless securely rejuvenated semidaily monopolizes liturgists syphoned neocolonialism" ; + dc:publisher ; + dc:date "2000-06-29"^^xsd:date . +bsbm-inst:ProductFeature604 + rdf:type bsbm:ProductFeature ; + rdfs:label "sleekness" ; + rdfs:comment "pharmacologic hiring houri ladders broidered besoms shriekiest bostonians outbargaining aguishly daylilies lenities encouragements empurpling lineaments concealment cushy regarding strangely pouffes electing coital veraciousness doughnuts subfloors toffies" ; + dc:publisher ; + dc:date "2000-07-01"^^xsd:date . +bsbm-inst:ProductFeature605 + rdf:type bsbm:ProductFeature ; + rdfs:label "nonmeasurable tormented lanyards" ; + rdfs:comment "oysterwomen shews necropolises expellees parturition bronchodilator hears weathered coastings dedicatory falsifier dieses hubs shamrocks shockproof bathysphere slumbery moonshots avitaminoses pranks scapegoats slabbery skeptics wordperfect relatable grammars disrespectfully disrupter sorriest paralyzed brevetting butchers resettles beclouding leucocyte brachycephalic pressmark chooses pericynthion hoer nonpareils breezier gashouse inhabitancies" ; + dc:publisher ; + dc:date "2000-06-29"^^xsd:date . +bsbm-inst:ProductFeature606 + rdf:type bsbm:ProductFeature ; + rdfs:label "icecaps" ; + rdfs:comment "sterilizes plausive sanguines hemstitch tammy solecists institutes condoling withholdings takable woodsmen censuring retaliation cutup rearing inescapably costumers juxtaposing recollected healers guesses foreordained fingerprinting opacification institutionalize gipping deoxidization blears patcher rooting" ; + dc:publisher ; + dc:date "2000-06-21"^^xsd:date . +bsbm-inst:ProductFeature607 + rdf:type bsbm:ProductFeature ; + rdfs:label "convening" ; + rdfs:comment "tensioned archaizes unbear sprit diffractions ethanols toxicants glarier soarers semiskilled poachers unquoted envelops osmoses deescalate overheated undergone myrmidons swayable parietal ovulations minarets improbabilities concatenations cheeped lacey tocsin vizier venin townwears degreed signifier catchups rewax thataway toning durables thereamong reconstitutes briars apaches plaining sunshines crankest orgeat spending earnests stalkers" ; + dc:publisher ; + dc:date "2000-07-11"^^xsd:date . +bsbm-inst:ProductFeature608 + rdf:type bsbm:ProductFeature ; + rdfs:label "photocomposed" ; + rdfs:comment "torahs prattling outbuildings boomtown paralyses undeterminable bulldogged overprotected assisi subways retesting hypoxemic cemented burses aurate arrogating riderless ropier rehandle siphon uprears" ; + dc:publisher ; + dc:date "2000-06-24"^^xsd:date . +bsbm-inst:ProductFeature609 + rdf:type bsbm:ProductFeature ; + rdfs:label "unconfined" ; + rdfs:comment "prosy princeliness kedged wheelie strictness premix lucubrating smartly insidiousness hammertoes supermen unchecked tallowed appeaser grots unfitting feedbags ticking motorization eroticist nonfascists humanisms erasions bullring fornicatrix constitutes nixy shrews" ; + dc:publisher ; + dc:date "2000-07-04"^^xsd:date . +bsbm-inst:ProductFeature610 + rdf:type bsbm:ProductFeature ; + rdfs:label "pastors pignut goatish" ; + rdfs:comment "decoration brilliancies preexamining congas ponying fagoting donating saddlery spilling kilovolts reconstituted materializes allocating puberties epiphenomenon excoriations refilled dinettes augustinian hayers teazled fanciest hurraying weatherbound eudaemons uncircumstantialy jaunting scatophagous extraneously disturbingly monkshoods caroming stagers sleaziness clienteles" ; + dc:publisher ; + dc:date "2000-07-05"^^xsd:date . +bsbm-inst:ProductFeature611 + rdf:type bsbm:ProductFeature ; + rdfs:label "platinums slightest" ; + rdfs:comment "noninflammatory tureen lectured partiality madeiras coalers lessens swivels magnanimousness decennia sweepstakes effluences unevenest corruptibilities bruisers instrumentary pipage tepidness dimes smooches nobbles worthlessly pipings egregiousness astroid rarely resins" ; + dc:publisher ; + dc:date "2000-06-29"^^xsd:date . +bsbm-inst:ProductFeature612 + rdf:type bsbm:ProductFeature ; + rdfs:label "fleeting refuter" ; + rdfs:comment "carminatives rostral amerinds unrhymed vaster suffixed disembodied affectedness paxes tarnishing embezzlers halls biomicroscopies uncontrolled rebuses prettifier operational bating roosters cinching illegalized unincumbered pungencies cerebrovascular spacewalks reemployment begetter lakers smoothest infold confluences evasiveness crosscuts stubbliest daturas slopers wildest outdistances sociological overcritical piteousness precalculation valse characteristics timpanums reframe" ; + dc:publisher ; + dc:date "2000-07-13"^^xsd:date . +bsbm-inst:ProductFeature613 + rdf:type bsbm:ProductFeature ; + rdfs:label "stingos croakier surprisers" ; + rdfs:comment "impeachable normalize desegregates hackled flatboats creditably buffaloing lavishes palliates hellboxes controverts relieves latests glimpsed lakier prophylactically pardonable malapropisms boatel shiksas dated switched passings spurns maculate nonconflicting tipped doughiest hereon entreats harpsichords nucleonics affirmations voidable thumbtack decrescendos misshaped manubriums borstals rationalizers bloodstones ampoule scapegoatism pocketed caseworker sweepiest wellholes raptured cutoffs" ; + dc:publisher ; + dc:date "2000-06-25"^^xsd:date . +bsbm-inst:ProductFeature614 + rdf:type bsbm:ProductFeature ; + rdfs:label "counted" ; + rdfs:comment "awed alliteratively naphtha feudist footworn forms nonflammable abator editorialize skinhead ekistics rebate flashier pressing breedings silences respirating litterateurs equivalences addles joes likeness" ; + dc:publisher ; + dc:date "2000-06-23"^^xsd:date . +bsbm-inst:ProductFeature615 + rdf:type bsbm:ProductFeature ; + rdfs:label "pintas magistrates" ; + rdfs:comment "leaseholders assuagement triplicated burgundies anticyclones legendarily darers reenlisting sinistrally tasselling ascetically yashmaks urolith pelletizing roamed obliterative pockier bookman breadstuffs queerly fleshly brandishes insurgency ghosts" ; + dc:publisher ; + dc:date "2000-07-16"^^xsd:date . +bsbm-inst:ProductFeature616 + rdf:type bsbm:ProductFeature ; + rdfs:label "repugnantly septaugintal" ; + rdfs:comment "unturned workless schismatically munched circumcised temporizing chemicals misquotes deferrer latents ingraft rampancies glyptics ultrastructure homonymies forelands wiglet malfunctions unobserved intellects cerises pretest stepdaughters oceanologist flemishes cockhorse aleatory hymnody convertibles nullifying rotated squawkers challengers fatted indolence importuned mellowness hockshops vacating scuttler damsels aidful slobbery aryan sluttishness ambles bullweed" ; + dc:publisher ; + dc:date "2000-07-21"^^xsd:date . +bsbm-inst:ProductFeature617 + rdf:type bsbm:ProductFeature ; + rdfs:label "dictions flowcharted solvents" ; + rdfs:comment "defaces sauteing severer dolomites towpaths bedamned codex diminutions appropriateness safeguarded hornbook supremeness layerings audits logrolling intellectuals yogini sestines lores recombed gossipy algicide specifier strikebreaking statutorily gleba stagger chining stymieing" ; + dc:publisher ; + dc:date "2000-06-24"^^xsd:date . +bsbm-inst:ProductFeature618 + rdf:type bsbm:ProductFeature ; + rdfs:label "fathering reekers chamoix" ; + rdfs:comment "pouter semitrailer demurrers splaying hectometers dribbler defective billable ultrafiches insusceptible groundlings scintillometer retransmitting togged coequality ejaculated aeriest actuaries bondless cubicity legends involvements invocational transactional mollies rapper unstabler slugfest scandalize chumping plunging allaying dognapers hermaphrodite socketed assailants ichor tremblier officiants vernalizing squelcher fencers waverers" ; + dc:publisher ; + dc:date "2000-07-07"^^xsd:date . +bsbm-inst:ProductFeature619 + rdf:type bsbm:ProductFeature ; + rdfs:label "cenobite" ; + rdfs:comment "eyehook callback silversmiths maladapted reactivity dismally flexed brunched seasonableness brooklet philtres dottily noninstitutional drollery overmagnifying fends hellene muskiest cordilleras racialists reglazes eyer turbofans retranslate ridable superseding semipros convoluting kinship procrastination anatase uncircumcised rubes tended pebbles sideswiping indenting bezils smoothens navigation wharfages nebulizes vesicle automatically drawer polyphonic marginally" ; + dc:publisher ; + dc:date "2000-07-22"^^xsd:date . +bsbm-inst:ProductFeature620 + rdf:type bsbm:ProductFeature ; + rdfs:label "freakily" ; + rdfs:comment "adenoidal aspirators broiling indefensibility carousals ghat appetizer catboat unctuous yammer concreteness postures waddies compendiums lurcher chaises canalling registries returns sultana musketeers selection recuperates carillonneurs elapsing applicants primo stubbled resectabilities smalls unseated repeatedly dinkiest untraveled cohabitant deponents referencing terraces impoverished beerier quetzals disillusionment envisage parches succulents" ; + dc:publisher ; + dc:date "2000-07-07"^^xsd:date . +bsbm-inst:ProductFeature621 + rdf:type bsbm:ProductFeature ; + rdfs:label "radiotelephonic gastronomically" ; + rdfs:comment "neuropsychiatry maidenheads bechamels denims hookas truckler overpass wolfram camouflaged regales hup keratomas preprints declarer communalization islet isoclines individualizes clearer invalidates nimbused sculleries gearshift" ; + dc:publisher ; + dc:date "2000-07-16"^^xsd:date . +bsbm-inst:ProductFeature622 + rdf:type bsbm:ProductFeature ; + rdfs:label "groveler assignees" ; + rdfs:comment "agency tougher bandaging dozing preselect lamias dismaler microtome roomed mutualism craved derringers wardship sufferers ports deviators forelocks sicker unconvertible kilting womanliest jekyll indicating proportioning suburbias overrank splines spelunker multivariates senna yardbird cassavas parading moolahs nannies pedigreed renig broadlooms deflorescence" ; + dc:publisher ; + dc:date "2000-07-07"^^xsd:date . +bsbm-inst:ProductFeature623 + rdf:type bsbm:ProductFeature ; + rdfs:label "sowbellies" ; + rdfs:comment "discomforted disyoke throwaways dystrophic effloresced capitalizing embellished psychiatrically birdseeds legalized nonvascular discloses scleroid duckweed adjudicated shops herculeses plusses doziest aftermaths pushover parte" ; + dc:publisher ; + dc:date "2000-07-13"^^xsd:date . +bsbm-inst:ProductFeature624 + rdf:type bsbm:ProductFeature ; + rdfs:label "misdraws" ; + rdfs:comment "geoducks campiest hematologies algicides int dewool drowses blacklisted poetaster cavalrymen stodging concretely mononucleoses mandatee vendable paraguayans convertibles peristaltically antiinflammatories owlets autobahnen besting shopkeepers expanding masterminded epizoa cabbala reeducates bootie looter halos dramas whiffle blueberries searchers admonishments woodnote preconcessions overgrowth relented forbids" ; + dc:publisher ; + dc:date "2000-06-21"^^xsd:date . +bsbm-inst:ProductFeature625 + rdf:type bsbm:ProductFeature ; + rdfs:label "shunpikes circumspection" ; + rdfs:comment "bridged saltcellars slatings babying retaliators metastases suicided humphing honkies clamoured overpay gladsomely poppas starching rhumba sophisticator matriculants puttying mislabeled notoriously presentiments wordprocessors chifforobe interchangeably conceited partitive skiis covalence coachers organs scantness photoluminescents balladeer tenses abdicated instrumenting graphically dislocates voce multifactorial satirists ballyhooed sissier bourrees proscriptions" ; + dc:publisher ; + dc:date "2000-07-07"^^xsd:date . +bsbm-inst:ProductFeature626 + rdf:type bsbm:ProductFeature ; + rdfs:label "seborrhoeic hitchhikes" ; + rdfs:comment "dialyze bucksaw autoregulatory kindles percussor sullied autophagy transactions dewclaws dissemination untempting preservers coiffes lousier zingiest thearchy adjurers sanctioner hogsheads prognosed incisory reunified deflation nighttimes jimsonweed tamales howlet hitchers journals troops jillion" ; + dc:publisher ; + dc:date "2000-07-20"^^xsd:date . +bsbm-inst:ProductFeature627 + rdf:type bsbm:ProductFeature ; + rdfs:label "pentagonally canes" ; + rdfs:comment "horal responses preoccupied venges languishing eyestone tractate paterfamilias enormities menstrual voicelessness birthmarks unimpeachability posits reverser thinnest folkmoots jesuitry tarred summerly priceless noncausally bushwack brutalizing" ; + dc:publisher ; + dc:date "2000-07-15"^^xsd:date . +bsbm-inst:ProductFeature628 + rdf:type bsbm:ProductFeature ; + rdfs:label "facileness experienced unwishes" ; + rdfs:comment "galumphed barbarized shepherded humoral feminize metricized manitou gloxinias plagiaristic emended mutilation proselytizers solenoidal contacting paths learnable arduousness godhoods velour accepted pleasured chromizes" ; + dc:publisher ; + dc:date "2000-07-20"^^xsd:date . +bsbm-inst:ProductFeature629 + rdf:type bsbm:ProductFeature ; + rdfs:label "shirker runoffs" ; + rdfs:comment "psychosexually crossings submiss damagingly supplying afflux trips jailbreaker lumberyard retranslation twitted presenter pineal bobsled unpersuaded outswimming misdirecting lantana loquaciously dibblers sterilizing listenings hewed reacting gravely dressmaker investors atelier faerie probating opting rechristening indemnificator waterily famishes contradictive gemologists boll muskily betterment sightliest praxises reportable" ; + dc:publisher ; + dc:date "2000-06-21"^^xsd:date . +bsbm-inst:ProductFeature630 + rdf:type bsbm:ProductFeature ; + rdfs:label "eugenicist debouche contesting" ; + rdfs:comment "interpreter vivified mislaying dispenses containment felons cheque halibuts rededicated deoxygenate discountable apricots parlors interlace physicals analysands thesauri colonials avoidable bulbar unconsidered reattachment lateraled eulogizing circumscribes cushioning fingerboards gussies borated dingus incorrigibleness hombre reradiated representatives vermuth unreported" ; + dc:publisher ; + dc:date "2000-07-22"^^xsd:date . +bsbm-inst:ProductFeature631 + rdf:type bsbm:ProductFeature ; + rdfs:label "cubistic cloys" ; + rdfs:comment "puppetry resharpens tenty jigsawn chronometer triarchy undemonstrable recapitalizes beeper selfless having pronunciations remeets gleaned recordership vinosity coconuts agedness skiddier smirch incurably alated infirmness repertorial hairsbreadth angering hydrotherapeutic dustup annuals fertilizable proboycott" ; + dc:publisher ; + dc:date "2000-06-29"^^xsd:date . +bsbm-inst:ProductFeature632 + rdf:type bsbm:ProductFeature ; + rdfs:label "righter armer nettled" ; + rdfs:comment "bridesmaids sharpshooter solarize cowling cornice mythologies cryosurgery distrusts pederasty farces wiled lucite measureless formality capitulator jugs sidetracked coextensively tacklings masslessness katakanas sharif leprosies astrodynamic tourneyed rendezvoused catalyzed lathered arrayed decasyllables kasha hotdogging primings cowing vulgarer compliments unchastities strafed arguments triodes blains" ; + dc:publisher ; + dc:date "2000-07-05"^^xsd:date . +bsbm-inst:ProductFeature633 + rdf:type bsbm:ProductFeature ; + rdfs:label "tinseled desiccative tipples" ; + rdfs:comment "staphylococcemic leeched skylarking fertilely baalisms inevitably analemmas caponization flavorsome undergarments stilettoes gravimetric parlays buoyage unific shoplifts unswathing grizzles underproduces bluesmen phosphorescently tutrix truffles wishing adjudicative saharan newtons wherry defies minibikes contrapuntal imbalmers grovelling intermarrying upholder chatter poky swatter plugs hiking instructors nymphal impactors befalling" ; + dc:publisher ; + dc:date "2000-06-23"^^xsd:date . +bsbm-inst:ProductFeature634 + rdf:type bsbm:ProductFeature ; + rdfs:label "marshlands" ; + rdfs:comment "agaze battling wots plighted oilier flirtations conspires quaverer biremes rooters licitation standoffish hurdlers ceramist deb deliciousness suppurates simplification unfaithfulness nippily attractiveness acrylics nextdoor gores containerizes swiped mutation migration attractiveness commonalties acerbities mortarless palliations cunningest octogenarians debutant necrology streetwalking blain joyfully syndical sinology flatfeet" ; + dc:publisher ; + dc:date "2000-07-12"^^xsd:date . +bsbm-inst:ProductFeature635 + rdf:type bsbm:ProductFeature ; + rdfs:label "overwhelms" ; + rdfs:comment "bedevils finales survivals butyls unfavorably perceptibly groped saunterers mussier barometrograph unnourished circumstantiated transcripts radiosensitivity syphon condores crushable hyphens hatting tallyhos enjoin tinkering eruptives flattened raglans jerkiness" ; + dc:publisher ; + dc:date "2000-07-13"^^xsd:date . +bsbm-inst:ProductFeature636 + rdf:type bsbm:ProductFeature ; + rdfs:label "motioned" ; + rdfs:comment "damozels violins stomped unthinkable poliomyelitic rostra lineally pyx lousing explored alterant unmolested pedaling darkhaired scuttles lightings monogamist counteracting unmistakably radicalness peahen heartens pewits ryegrass maypoles locknuts trucklers poller imponderably skinless hopers flenches bewildering clobbered urbanely brahmin harebrained chidingly biomes aerometer subregions operational prostyles censing lallygagged blinking boldfacing" ; + dc:publisher ; + dc:date "2000-07-18"^^xsd:date . +bsbm-inst:ProductFeature637 + rdf:type bsbm:ProductFeature ; + rdfs:label "rediscovery outfaces" ; + rdfs:comment "tradeable enamelware toothy oxygenic reglazed ekes inflammations fiestas avionics spinsterhood vainness instinctive sovietizing disinformation alright muckworms prebend encyclical unpolitic wriggly" ; + dc:publisher ; + dc:date "2000-07-05"^^xsd:date . +bsbm-inst:ProductFeature638 + rdf:type bsbm:ProductFeature ; + rdfs:label "paleness" ; + rdfs:comment "hedgy elkhound duplicates indents surrealism clipt perverted quavered vindictively relaxers jumpiest snottily afforests soothly hypertrophic unnerving unimpressive payed psychometries daimyo quarterings foreshown estivating overstimulating magnets polemical heathiest suppliers autumns atomisms theorizing mights translation unbosomed" ; + dc:publisher ; + dc:date "2000-07-22"^^xsd:date . +bsbm-inst:ProductFeature639 + rdf:type bsbm:ProductFeature ; + rdfs:label "rifflers presbyter" ; + rdfs:comment "epithets determinateness ladybug fivepins secreting emblazonment delivers seminated xanthoma cragsman repasting caudillo kulturs boards springed peremptorily cocomats fermentable redactors lacings chapping glacises eroding degrading romanticize protista nocturnally instrumental disagree sailing mortifies unforgivable incog bandages carryout assyrian magnetisms inclusions stays incog" ; + dc:publisher ; + dc:date "2000-06-30"^^xsd:date . +bsbm-inst:ProductFeature640 + rdf:type bsbm:ProductFeature ; + rdfs:label "grippes irritancy" ; + rdfs:comment "cached exactor porches bottoming lactations sprightlier osculant xerophyte microphotograph preassigned macks statuses loginess smelliest rabbinates laxest hyphenating untangles antinovel guiltily midsts zithern mimetically fadable provocations quandaries acceptances nudger moneychangers vertigoes apologies terraced murexes twangiest superposition intriguers notching" ; + dc:publisher ; + dc:date "2000-07-21"^^xsd:date . +bsbm-inst:ProductFeature641 + rdf:type bsbm:ProductFeature ; + rdfs:label "desex slashes" ; + rdfs:comment "autogyro cardinals warmheartedly gaveling asserted putdowns strenuously transverses meshes cousins arranger diplomatically vilifies anodize friended squinty splintering entertainers dudes retracing megalomaniacs famishes flamingoes arith balconies propagators gloxinia" ; + dc:publisher ; + dc:date "2000-07-15"^^xsd:date . +bsbm-inst:ProductFeature642 + rdf:type bsbm:ProductFeature ; + rdfs:label "elitists representable" ; + rdfs:comment "sieging backstretches eeriest winnowed effectually pugilism bunkered landslid waxers accumulator incomprehensibleness lorry patrons vinos controllers wicker pullbacks finagler honeysuckles intermixes dandies futurologist privileging nervelessly typicalness alveolars jackknifes casking stipulation investigatable algid" ; + dc:publisher ; + dc:date "2000-07-04"^^xsd:date . +bsbm-inst:ProductFeature643 + rdf:type bsbm:ProductFeature ; + rdfs:label "duteously" ; + rdfs:comment "levitates squarish burnets celeriac nondetachable yeas outweighs timings permissable procuration venoms squirter boodled tomahawk whiter immediately meow hernial rumrunning whoopers ahimsa sweetmeats autobiographers totters smatterings pleaser sweepings" ; + dc:publisher ; + dc:date "2000-07-13"^^xsd:date . +bsbm-inst:ProductFeature644 + rdf:type bsbm:ProductFeature ; + rdfs:label "squalliest" ; + rdfs:comment "counselors strummer flannels lections breakables virtuosas steadier argal feminise groaners nucleating recooked planetologists republicans blunted barracks anonymously warsaws swigger smirkingly quitclaim rebilled dilapidation gurgling seawater vindicators ridiculed privileges sanitariums embalms bursarial kapoks comfy" ; + dc:publisher ; + dc:date "2000-06-28"^^xsd:date . +bsbm-inst:ProductFeature645 + rdf:type bsbm:ProductFeature ; + rdfs:label "producer hydrotherapies temporizes" ; + rdfs:comment "stubbliest preaching impecuniously unwontedly vestiges imminently unpressed minters antimilitarism peeped officially adjudicating obliquely palls gibbing inhalators seedily gemination overscrupulous anticly vamps hexose areolas prodigiously penknife manufacturers scroungier trillium pantomimists kingships malingered martialists sauceboxes coifs undecayed librettists bitted dependencies pettily downgraded complicated ochered burnouts overelaborate soothes blockades" ; + dc:publisher ; + dc:date "2000-06-28"^^xsd:date . +bsbm-inst:ProductFeature646 + rdf:type bsbm:ProductFeature ; + rdfs:label "skyjacked sublimity brooming" ; + rdfs:comment "oryxes grouses liaisons pronouncedly intertwining hindquarters sorrowfulness multilateral featlier relights finalization pauperizing beddings fragility mineralizes clucking harmonizer symbolization flues revolutionaries stockier devolving embrocates legitimist zany checkouts sniggling starved undertaker laded griddled muncher roulettes nighter bigamized songwriters" ; + dc:publisher ; + dc:date "2000-07-14"^^xsd:date . +bsbm-inst:ProductFeature647 + rdf:type bsbm:ProductFeature ; + rdfs:label "viburnums enamour" ; + rdfs:comment "stager friendly intangibility complexest diagraph encamped skidoo metricized wilting authorize faithfuls dustheap swingiest flagrance unchastened outleapt nubby caboose driftiest psychotics chromas narrows nostrum" ; + dc:publisher ; + dc:date "2000-06-22"^^xsd:date . +bsbm-inst:ProductFeature648 + rdf:type bsbm:ProductFeature ; + rdfs:label "sprinkler" ; + rdfs:comment "preposterousness ratters swimmable photograph opponents pulsers helots strettos hagiography ascorbate motivated prandial ever sloshy curtained closable relapsed underexposed millimeters reinter precociously managerially formulators incages inanity" ; + dc:publisher ; + dc:date "2000-06-21"^^xsd:date . +bsbm-inst:ProductFeature649 + rdf:type bsbm:ProductFeature ; + rdfs:label "borders narcotizes primogenitor" ; + rdfs:comment "escalations ragas unallied inactivity slightness beachcombers misstep devolutive tyrannize unlearns detrains holes temperas clavierist server expressing recompression emblazonments philter wresters nonphysiological choler sluicy" ; + dc:publisher ; + dc:date "2000-07-07"^^xsd:date . +bsbm-inst:ProductFeature650 + rdf:type bsbm:ProductFeature ; + rdfs:label "lycanthropies curiouser" ; + rdfs:comment "truncheon takable blitzkrieging tetrameters bays cento skydiving priapism bantering androids firearms divinely goys adroitest earphones nontraditionally hulkier terras sneakers unpenned unravelled clucked uploadable puffballs creditableness ostensibly actualize weaklings hinges saxhorn mordants richening measurement deadlines recompensive bicentenaries maturated queuing crispens uninterested" ; + dc:publisher ; + dc:date "2000-07-22"^^xsd:date . +bsbm-inst:ProductFeature651 + rdf:type bsbm:ProductFeature ; + rdfs:label "toolholder" ; + rdfs:comment "sculls gombo rehardening abodes emblements braidings uneasiest waffled unofficially gulfier inlets narco piecers salacity cobwebbier reviler misdemeanors mens religionist figuring shiverers encased retouchable sugarier antidepressive favor sniffed straightly typefaces unprocessed odors milking cystectomies revolutionist tameable somberly padding flappers redistricted macrostructural exercised relishing medalling" ; + dc:publisher ; + dc:date "2000-06-21"^^xsd:date . +bsbm-inst:ProductFeature652 + rdf:type bsbm:ProductFeature ; + rdfs:label "cotans perturbational" ; + rdfs:comment "rhymers viands proser appal feedlot saltshaker arraigner distincter corsages jingoistic cardamoms fauve bipartition moderatos friarly gasworks examines bartisans darwinite sousing mandalas imperturbability soporifically lows denicotinize recriminated stumbles remixed brezhnev plumbing shockproof multiracial ostensibilities tallied subassociations nonenforcement humoral useless accidie pawing conveyancing discourteously" ; + dc:publisher ; + dc:date "2000-06-25"^^xsd:date . +bsbm-inst:ProductFeature653 + rdf:type bsbm:ProductFeature ; + rdfs:label "heterosexuals investigations" ; + rdfs:comment "cwt archiepiscopal cutest chromosomic luringly automates stodginess fundamentalism rebbe puddlers pinworm afterwards nonrepresentational incorrigibly disinclinations kebob relist tiled wining horrendously clutching exhausts virginium frostlike hoedown spindled creneled khats intromitter appeased croakers prosed completing stuccoes weirdoes periodontosis nighthawks poolroom orogeny espressos overlooks unawaked" ; + dc:publisher ; + dc:date "2000-07-04"^^xsd:date . +bsbm-inst:ProductFeature654 + rdf:type bsbm:ProductFeature ; + rdfs:label "fleabitten amirate diadic" ; + rdfs:comment "submittance vituperatively retinas unstudied neomorphs individualizes legits subcellular spaceflights alleger hoydening thunderstorms carrels calderas troppo orangeades maypole disclamatory rebinding subprovince paganist drifted zebraic" ; + dc:publisher ; + dc:date "2000-07-10"^^xsd:date . +bsbm-inst:ProductFeature655 + rdf:type bsbm:ProductFeature ; + rdfs:label "sixths inducer" ; + rdfs:comment "vicarly twiggiest simpletons obviousness biofeedback admiralships commandeered tike manubrial defrosted splenification satyrid helping chortles unjointed maidish astroid docimasia elderly supertanker effective hiccough cleaners announcing incaged jives undiscernibly maharaja enscrolls heartland spoonily antielectrons thereamong bedecking divisibility spinals snuffed hometowns hewed erne sensoria misrule receding catabolizing ledgy maids faeries frankly" ; + dc:publisher ; + dc:date "2000-06-27"^^xsd:date . +bsbm-inst:ProductFeature656 + rdf:type bsbm:ProductFeature ; + rdfs:label "mooted heliotherapy" ; + rdfs:comment "effervescence virginals fortified bicycling saprophytic renovation ternate browser stauncher intensification homeopathically garbless fantast appearing rimrock gussies reinformed shipment hairsprings annatto southed contrivers timothies garbs episcopally reencounters tolerative cargos" ; + dc:publisher ; + dc:date "2000-06-25"^^xsd:date . +bsbm-inst:ProductFeature657 + rdf:type bsbm:ProductFeature ; + rdfs:label "preprinted northwardly" ; + rdfs:comment "punctilious ejaculation sidling choline cognizer collecting occasionally flecky yuan promenader skunked aftertastes spoonbill benignantly sniffingly scrutinize dosser doggerels aligners hubbies disillusioned insincerely cruzeiros fubbing affirmable desecrates lienable savourer abattoir vervains preblessing sideslipped tussuck oblately nonconvergent simultaneously queerness predesignate abbacy damneder blackjacks" ; + dc:publisher ; + dc:date "2000-06-23"^^xsd:date . +bsbm-inst:ProductFeature658 + rdf:type bsbm:ProductFeature ; + rdfs:label "ketonuria foremost extremer" ; + rdfs:comment "reties gaolers nightriders postfixed clunks tiles meccas muslims milliammeter absentees gashouses spanned sprits gilders soapstones tapeline thallophytic resow arabs ultraviolet fertilities creeping unreturned cumulative bitte vulgarizations alienability vindicators flashbulbs aeon kryoliths rumples hydrozoan petitions victorias starlets sledging seines destroyers lodgeable potions animalistic plunges inclosing" ; + dc:publisher ; + dc:date "2000-06-23"^^xsd:date . +bsbm-inst:ProductFeature659 + rdf:type bsbm:ProductFeature ; + rdfs:label "fleered" ; + rdfs:comment "disgorged harpists hatracks bialy routinely interleaved endleaves freakily rheostatic depilated muskiness keepings remeasuring burse sleaziness fuller suspenses perigees heirship swooners heedlessly abhorrers frameworks ladders chomping relenting somas hailing unparalleled annunciations sellers tartaric dengue wheedlers foxings planing disbeliever sterilization tester angstroms gushed asphyxiator governments lickety kneeler ladlers zombi assessable hempweed" ; + dc:publisher ; + dc:date "2000-06-20"^^xsd:date . +bsbm-inst:ProductFeature660 + rdf:type bsbm:ProductFeature ; + rdfs:label "uninhabitable sunroom litigiousness" ; + rdfs:comment "foreskin tumults reproducer rubbishy supernatural anatase scummier windsock suspenders recovers triaxial salvoes swannery raftage lollygags townswoman duckweed spurries curator pithier kippers sameness sharks ratiocinated priorate yammerers tingling mischievously absurdities antiquarians overviolent rouble canadians woful autoimmunity cardiological incontrovertibly seashells prizefight polecats peons locoisms" ; + dc:publisher ; + dc:date "2000-07-16"^^xsd:date . +bsbm-inst:ProductFeature661 + rdf:type bsbm:ProductFeature ; + rdfs:label "sportily legacies flinting" ; + rdfs:comment "ugandans slowwitted blitzed reshuffling nitrocellulose impedes fletching debatable habitancies albinisms mittens aesthetics combining sideswipe infamies ergometer versatileness shoetrees scrips obediential racketed inkhorn driers" ; + dc:publisher ; + dc:date "2000-07-20"^^xsd:date . +bsbm-inst:ProductFeature662 + rdf:type bsbm:ProductFeature ; + rdfs:label "donator albumens kaftan" ; + rdfs:comment "requites seiners reissued dighted intruder overgrowing amidship grimaces volcanologist inflating overtook chickasaws beautifully legitimately peccable skags whorehouse befooling sensating dickering cashbooks comparers belfries currish concrescent restack preferment occupations swindlers precedes dielectrics clarifications guzzles antipastos stranglers undrape plantains nonintoxicant assertion perturbational addictives deemphasizing yerbas knobbed postclassical traded tiresomeness demulcents" ; + dc:publisher ; + dc:date "2000-07-01"^^xsd:date . +bsbm-inst:ProductFeature663 + rdf:type bsbm:ProductFeature ; + rdfs:label "frumpish births" ; + rdfs:comment "ratability abstractedness reseeding knighthoods rekindling metaphorically rationalists fishtail exactor inculcating demotic vibrants flimsily dwindling precursory governability prefigured coalitioner euphemisms trotters" ; + dc:publisher ; + dc:date "2000-07-18"^^xsd:date . +bsbm-inst:ProductFeature664 + rdf:type bsbm:ProductFeature ; + rdfs:label "leas" ; + rdfs:comment "intersexualities greatest enspheres metonym pouty eateries matts bootblack relics ricking reinduction insignias scribing leasable saggier tipsier ogrishly gormandized simonist baulkiest acquiescently sopping roughnecks dallier decapitate massaged cautioner punishers septet cyberneticists flexing iscariot covens uninspired schoolchildren meaners hydraulics gnotobiologies deleteriously militarizing enlarger variates chowtimes" ; + dc:publisher ; + dc:date "2000-07-12"^^xsd:date . +bsbm-inst:ProductFeature665 + rdf:type bsbm:ProductFeature ; + rdfs:label "hastiness bortz" ; + rdfs:comment "groaned bunchiest rodders acerbated brighteners crispers pharmacological fraus greeting grainfield flywheel rateably warper feloniously bigwig naphthalene countability superiorities adjusts usableness unfeigned nonracial xeroxing equalizes semiclassical plastrons regales fashionably ratiocinators betels unchaperoned ikebanas regroups bagsful stations epicenter footlessness nervously baulks biohazard elmy axils histamines dresser sashimi" ; + dc:publisher ; + dc:date "2000-07-19"^^xsd:date . +bsbm-inst:ProductFeature666 + rdf:type bsbm:ProductFeature ; + rdfs:label "seasoner wipeouts" ; + rdfs:comment "cluttering diagnoseable lawsuits polydactylies leadworks pineapples bumbling sporter smokiest flangers febrifuge murdering fennec monocrat miscalls temps safeguarding survivals engulfing natureopathy bombardments sampled sediments stoops organophosphate granter recruitment tabletted alliable goitres honked littlish recessed pres payback gallowses canalized hoary eugenists patois disburser concaved testacy jeerers vulturous" ; + dc:publisher ; + dc:date "2000-07-16"^^xsd:date . +bsbm-inst:ProductFeature667 + rdf:type bsbm:ProductFeature ; + rdfs:label "thumbtacks solely succinctness" ; + rdfs:comment "nonhabitable physiognomies affectedly loofah preadjustment skyey nonexistence repossession antimilitaristic guides testators melancholies fattiest practically bifurcated pledgers recite attitudinize madcaply vowelized sundries radiobroadcaster travelable vined alining dauntlessness executional monoxides metrically hippie recycled graftages backwaters brambliest remonetizing homely shams snobbishness jeweling demotic archaizes realigns milfoil reconfirmations" ; + dc:publisher ; + dc:date "2000-07-11"^^xsd:date . +bsbm-inst:ProductFeature668 + rdf:type bsbm:ProductFeature ; + rdfs:label "blunting" ; + rdfs:comment "caber compted stickiness patentable beamless spurries antitoxin unavoidably jewing cantos busing detrain selsyn sapping piggeries bathhouses safegaurds sciences mujik probationers shily fart grotesqueness kajeput snooty assistance fards drollery vinca uncertainly litigations headpin pretensions heavyweights planless temperament aussie sufficing oddments celeb wonky confections" ; + dc:publisher ; + dc:date "2000-07-03"^^xsd:date . +bsbm-inst:ProductFeature669 + rdf:type bsbm:ProductFeature ; + rdfs:label "exporter hatmakers" ; + rdfs:comment "internalization apocynthion trois ratch pairings minors temporization ghastliness fakeries deprived nonhistoric dibbing neutered queening hypothecated stampeding continentally readd pouffs unreceptive handcrafted" ; + dc:publisher ; + dc:date "2000-07-10"^^xsd:date . +bsbm-inst:ProductFeature670 + rdf:type bsbm:ProductFeature ; + rdfs:label "effluvial" ; + rdfs:comment "scintillations oscillations conceivably unsubtly undergirds cityward obtruder continuance dismantles sodded declamations hora chigoe unrule envenomed scalpel darkles cyborgs warned forjudges trading micrograph sinologies greeny austerities kineses" ; + dc:publisher ; + dc:date "2000-06-22"^^xsd:date . +bsbm-inst:ProductFeature671 + rdf:type bsbm:ProductFeature ; + rdfs:label "blunter" ; + rdfs:comment "blubbering opportunistic manuevered slaughterers twitted villainies bimetal trimesters narcolepsies odiousness pontons usurps fecklessly sleetiest remembered albs delphiniums reprieved caddying squooshed conveniently massing individuated interplant mutagenesis bumbles arrowing disability formulates bolts passible timbal prologed waler wrecking worsened floatiest documenter taunts kulaks condores bursted talks noncombustibles" ; + dc:publisher ; + dc:date "2000-06-21"^^xsd:date . +bsbm-inst:ProductFeature672 + rdf:type bsbm:ProductFeature ; + rdfs:label "seatmate" ; + rdfs:comment "catting remarker koppies tetotum beseems indecorously laboriously cankers biding beechen henpecking strategically unplanted galvanizer egises timpanist keltics tapioca sapphist xystus smokestacks doors lover defrocked penology restuffing bitty ceremonials obtrudes neckless beaked congestions chammies conning deism hookeys anglos inurn confidentiality" ; + dc:publisher ; + dc:date "2000-07-21"^^xsd:date . +bsbm-inst:ProductFeature673 + rdf:type bsbm:ProductFeature ; + rdfs:label "abreacting hostly diademed" ; + rdfs:comment "sanctifier hunchback swivelled summable ramies antre selenous rigorously observably splayfoot travelogs geminations wired jills couths vulgarians scorchers solipsist phlegmiest copings puddling nonproduction inoculated adjusts captaincies intersession warner sleetier garbling warper untransferred searchingly encephalogram" ; + dc:publisher ; + dc:date "2000-07-09"^^xsd:date . +bsbm-inst:ProductFeature674 + rdf:type bsbm:ProductFeature ; + rdfs:label "boardmen" ; + rdfs:comment "whys handbooks droughty glassblower eyepoints skirled poverties distinctiveness upstarts poundals towaways bedmakers cinching wetlands freehanded bioclimatologies xyloid sickles spellbinds irreducibilities plaintively ducts spinny cringer dissembled cathexis peristalsis graecizes studhorse remake basifier unskillfulness cordovans cotangents chisellers whiteheads paisleys assisting cobbled devastation throstles" ; + dc:publisher ; + dc:date "2000-06-26"^^xsd:date . +bsbm-inst:ProductFeature675 + rdf:type bsbm:ProductFeature ; + rdfs:label "stimulator fallings" ; + rdfs:comment "underofficials submission accessed chronically leaseholds contemplator indemnificator colorfully shaker heeled slaughterer piles beseeched preheat dissimulates reputedly polders brochette overindustrialize earplugs uncompartmentalizes precancelling pulques puts postmillennial biomicroscopies" ; + dc:publisher ; + dc:date "2000-06-21"^^xsd:date . +bsbm-inst:ProductFeature676 + rdf:type bsbm:ProductFeature ; + rdfs:label "smarmier" ; + rdfs:comment "waterproofer backfire hulloes overbuying mss bobbies spooling sicking playbooks radiographic twiners impishness twittery officiates dimensions frescoists engorgement adjudicature tablecloths pailfuls stonishing bowler sensated woolskin casettes paraphrasing hypotenuses unrentable hairstylist subcontracts scholarship ladler raiser irately disesteem lasses stalkily styler zippier" ; + dc:publisher ; + dc:date "2000-06-20"^^xsd:date . +bsbm-inst:ProductFeature677 + rdf:type bsbm:ProductFeature ; + rdfs:label "whopping cloddishness" ; + rdfs:comment "unpolarized laird bevelling embleming employs parsable streetwalker roarers nullification ostracized calipers greenthumbed brooking emotionalist moaned unkept engirds regionals jacobin echoed besmirching kilovolt unendurably freshener trickly reapplying" ; + dc:publisher ; + dc:date "2000-07-16"^^xsd:date . +bsbm-inst:ProductFeature678 + rdf:type bsbm:ProductFeature ; + rdfs:label "entrancement picketed courtrooms" ; + rdfs:comment "foggiest cannings peristyles decompressed spiller semipro pasted inclosed shanteys liberalizes spiritualists arrayal nickelled stylets dished oklahoman institutionalist heehaw sophisticating defilement aerofoil denudate fraus upbraider upraisers divvied disreputable equations dogear linking strobes votable windrow decors difficulties unacademic cycads chitins adulator isostasy carnaubas" ; + dc:publisher ; + dc:date "2000-07-19"^^xsd:date . +bsbm-inst:ProductFeature679 + rdf:type bsbm:ProductFeature ; + rdfs:label "refed oarsmen" ; + rdfs:comment "matzo lentils foreigner pentadactylate nub weatherworn ideation imam ironweed empyreal axletrees pileate caponization carving bibliotherapist hinterlands inofficious fattily instrokes gads decently unproductively housebreaker crimpy copycats overthrowers millenniums accounters finagles inattentiveness" ; + dc:publisher ; + dc:date "2000-07-03"^^xsd:date . +bsbm-inst:ProductFeature680 + rdf:type bsbm:ProductFeature ; + rdfs:label "cockamamie" ; + rdfs:comment "entitling grabbier viceregents bearberries advancers capitalize daringness restraining recompute unbailable anchoresses microinstructions sacristans micrograms zincoid snorkeled weirdest abides noncom dubiety zucchettos nefariously garbing adulated embar ruefulness baubles ritualized loller repeats coercions snooped lilies purports rehearing exotically pennyroyals nativity unvaried cudgeler alertest careers overheating hotfooted ensnarling acerola protectorates aridest pseudoephedrine filliped" ; + dc:publisher ; + dc:date "2000-07-17"^^xsd:date . +bsbm-inst:ProductFeature681 + rdf:type bsbm:ProductFeature ; + rdfs:label "foreseeability" ; + rdfs:comment "overseas tegument distorts woolman ruinate showoff merrymaker glittering violators netted drowns filterer monthlies antinovel dumpcart worthlessness rescues desperados gibs complexional snarlier parve natatory peewits protractile undutifully reanalysis noumenal attachments canards stateswoman restamps corresponded mildened nonplussing deles menstruated sleeking dismays" ; + dc:publisher ; + dc:date "2000-07-22"^^xsd:date . +bsbm-inst:ProductFeature682 + rdf:type bsbm:ProductFeature ; + rdfs:label "volvox" ; + rdfs:comment "wearisomely dissimulated scholarship redecorates belabored travestied fissured interrelated slyer identifications abominated cannonade neurologized tubulate refires hangnail sleepless petits envisaging melder deftest trampoline gnawer declasse gabbiest mismatch toastmasters spouters iou stumper enervates defrocked regularly pollbook sublimed espalier librettos snooty calx pusses ballasts retrofired reclassifications notches" ; + dc:publisher ; + dc:date "2000-06-20"^^xsd:date . +bsbm-inst:ProductFeature683 + rdf:type bsbm:ProductFeature ; + rdfs:label "sirenomelus" ; + rdfs:comment "queasiness maggots cooers tossing expirations goaled chams brawns playhouses nonactives mannequins plateaued prospectively minorities universes petulantly redemonstrate kills discomposing premedical towerier confirmed hipped potentiality consents" ; + dc:publisher ; + dc:date "2000-06-25"^^xsd:date . +bsbm-inst:ProductFeature684 + rdf:type bsbm:ProductFeature ; + rdfs:label "hippodromes unwon" ; + rdfs:comment "provisions gauzier joyousness reflux laughings earthed malodorousness bruits endangering openest soaker nightspots omnivore restraining pasting caramelizes delivering foxes lavalieres barques" ; + dc:publisher ; + dc:date "2000-07-21"^^xsd:date . +bsbm-inst:ProductFeature685 + rdf:type bsbm:ProductFeature ; + rdfs:label "bast depopulates" ; + rdfs:comment "outgrew larums lankly hillbillies fervid boniest grippiest subdual chicanes unsighting erbiums brutes decontaminator misbehavers abbreviating buddies ribaldry derivations pietist wittier reconsecrated latinize tonsillectomies" ; + dc:publisher ; + dc:date "2000-07-12"^^xsd:date . +bsbm-inst:ProductFeature686 + rdf:type bsbm:ProductFeature ; + rdfs:label "bluesman venerates" ; + rdfs:comment "devilry pilaster mesmerizing nutritionists coalescence releasers stutterers fetters discipleship unflappably novas infanticidal princes crediting untitled trousseaux dampish tokenize cariole dishonored chiropodists eyebolt orthodoxies lockets woolies excommunicators manacle poster centralize decodes abjectness demonstrationists" ; + dc:publisher ; + dc:date "2000-07-09"^^xsd:date . +bsbm-inst:ProductFeature687 + rdf:type bsbm:ProductFeature ; + rdfs:label "beseeches" ; + rdfs:comment "horsiest nonparametric runagates uneasier sherberts alligators graces gambling oscilloscopes equines beans puddings expurgates submerged supplication premeditators amu lamaism gunslinger rumbaed modeller unfeelingly vasoconstrictor unstacks verdures awless skeeters tyrannically photojournalists yawps" ; + dc:publisher ; + dc:date "2000-07-15"^^xsd:date . +bsbm-inst:ProductFeature688 + rdf:type bsbm:ProductFeature ; + rdfs:label "seclusionist quackeries" ; + rdfs:comment "gendarme feathered technocracy underset semirespectability reaching churners trichlorethylene blackener spirochetes infertility blighties extends subjecting latitudinally pekingese raindrops muser hydrotherapeutics taxiways kipskins foresail lashed bedecked delusionist scrumptiousness jacketing fluffiest tentacular fantasists provers chunking staysails" ; + dc:publisher ; + dc:date "2000-07-15"^^xsd:date . +bsbm-inst:ProductFeature689 + rdf:type bsbm:ProductFeature ; + rdfs:label "tendrils biorhythmicity cleavages" ; + rdfs:comment "outstretched pursed osseously jibs preinserts suicidally unpuzzling metagalaxy bower coeducationally disdainfully lutenist daylong wended ladened apprehensiveness silliest slowly barbarizing huzza suppleness comradeship finnicky funiculus consecrator silentness influencing uncial cooper aeration aeons slotbacks duckier ruddle closemouthed pellucid vended notcher drivelers sniggeringly invitations prissier adults militarize mudfishes lavaliere" ; + dc:publisher ; + dc:date "2000-06-28"^^xsd:date . +bsbm-inst:ProductFeature690 + rdf:type bsbm:ProductFeature ; + rdfs:label "desired" ; + rdfs:comment "remittal overconfidently nots prickling fledged lyingly unsaddle darwinians caudate releasible defrauders crests capillarity curbs mechanically deductive mistimes chinkiest woollier rejecters crispers gnomish examiners televisionally dozing" ; + dc:publisher ; + dc:date "2000-06-25"^^xsd:date . +bsbm-inst:ProductFeature691 + rdf:type bsbm:ProductFeature ; + rdfs:label "scarps hemlocks inaudibly" ; + rdfs:comment "ritzes dolours designer donatives plainer resolder plebiscite lateen kaleidoscopic inducing outsets distressing reinter internship duller unmingled guff spastically bodings morphologically avianize laryngology bemusing faxes fieldmice hived irreparably telephotographed inartistically confederates wafers crewels urethras constrictive transpires rehemmed universalizing redeveloping switching jokester cogitation register trickiest desalters razing brin" ; + dc:publisher ; + dc:date "2000-07-10"^^xsd:date . +bsbm-inst:ProductFeature692 + rdf:type bsbm:ProductFeature ; + rdfs:label "permanents" ; + rdfs:comment "starvelings nephritises cooler waggoners predigesting uploading obstructor occupiers neutrophils uraniums albatrosses professedly aport bogyman bulletproofs benumbed seafowls accoutrement microstates tripedal electronically paganist mutagenicities monthlies furor professors rely holeless reprogram shading lunkhead prater swobbed bacca blench undercurrent corroborations slatterns werewolves parities perambulations malayan uncondensed backstretches moralization ellipses quisling elands bowdlerize paisanos" ; + dc:publisher ; + dc:date "2000-06-23"^^xsd:date . +bsbm-inst:ProductFeature693 + rdf:type bsbm:ProductFeature ; + rdfs:label "clack sprightlier" ; + rdfs:comment "dinette depositional hemolyze jabbering shilled recognition realise hatched misalignment outliver numerators garroter enclosing skiffs fascination vertebrated replenishers rapports mesentery undersupply jetport conquerors wryness mystifies guardhouses aureola snapped mantas superseded hows firming mollification astronautics boundless informatively savoriness bigheaded dejected warmongers onside lettered" ; + dc:publisher ; + dc:date "2000-06-28"^^xsd:date . +bsbm-inst:ProductFeature694 + rdf:type bsbm:ProductFeature ; + rdfs:label "views" ; + rdfs:comment "marlinespike meads enchiladas penholder percipience reigns overdrive plausibility electrics rhonchi reciprocities undoubting ringed accedence percusses repapered reshipment wireways diodes bignesses mahjong vadis peskily joyfully villainously stylets priapic suspensions cleaned leaved precented hoarier superimposes darked reseals provider regressiveness marylanders" ; + dc:publisher ; + dc:date "2000-07-08"^^xsd:date . +bsbm-inst:ProductFeature695 + rdf:type bsbm:ProductFeature ; + rdfs:label "alcaldes gerrymander planner" ; + rdfs:comment "intervarsity ars ovulation lightmindedness flageolets overpaying impostors peremptoriness splurged avenues acclaims elevations tabers enlivenments cyanogen displacing fakery assuagable funnelling kaput planers promenader natant redistributes smallest milieus zabaione meekness palates mountebank caesural calcimines avenges orangeade jackers quaveringly rejudges welfares governing polytheistic curter thanker botched unfortified coverers endbrain" ; + dc:publisher ; + dc:date "2000-07-03"^^xsd:date . +bsbm-inst:ProductFeature696 + rdf:type bsbm:ProductFeature ; + rdfs:label "pauperized" ; + rdfs:comment "cellaret endorses antifascism snitches foodstuffs dropping preadapt pseudoprofessional situp nonfat prepay countermaid subunit suckled obsessors aphasias engraves dependently subsonic surpriser teetotals frolickers adhering teslas coinsured bergh antimacassar humorer enframe kinged handwrites swishes ornaments colonizationist insphering falchion slices songfest" ; + dc:publisher ; + dc:date "2000-07-22"^^xsd:date . +bsbm-inst:ProductFeature697 + rdf:type bsbm:ProductFeature ; + rdfs:label "inapposite craggier undraping" ; + rdfs:comment "beadrolls sulphates confluence inartistically subatomic intrudes adored calciums romanesque baal knickknacks reuse fleecy outstare preexposes shirrings sateens impersonally bezels greenbacks fortuitus attentively disavow beaconed knots hydraulics morganatic partiality regretter neuropath hysterias trustiest repels flattering strongyle redolent awardees bobbysoxer reformations interregnal takeovers gallanting inklings maisonettes aspens crumps pickings" ; + dc:publisher ; + dc:date "2000-07-14"^^xsd:date . +bsbm-inst:ProductFeature698 + rdf:type bsbm:ProductFeature ; + rdfs:label "songwriters adjustment" ; + rdfs:comment "liquefactions centrums minister abuser anguished uncorking secretaryship axillae nitrators courser cavalrymen yesses puddled remeasuring nankeen canonise reaccustoms fieldleft haleness mutated spendthriftiness opaquing caricaturing rachitic nibbled thins dropsies bedazzling skilful ratiocinates whicker drilling sustained dreggish pas synchronize reinvolvement shores uninformed pulled telegraphers hydrothermally offered tything helistop" ; + dc:publisher ; + dc:date "2000-06-21"^^xsd:date . +bsbm-inst:ProductFeature699 + rdf:type bsbm:ProductFeature ; + rdfs:label "stewing existence" ; + rdfs:comment "osteotome counterbalanced glummest nighties gamer underbid papally uncharitableness legislatress whimsy conceptualizing tempuras flams swallowtails massedly interlaces narratives agons paroling achievable wabbles subgroups heisting antigens likeness meed inkers tartness tabbed pittance wallets analogousness implosions mayapples russets ontogenically apically whizzed amigas postmenstrual tushed" ; + dc:publisher ; + dc:date "2000-06-28"^^xsd:date . +bsbm-inst:ProductFeature700 + rdf:type bsbm:ProductFeature ; + rdfs:label "countermands" ; + rdfs:comment "macintoshes sidesplitting medicals recapped naif inverts soundproofing seditions woodiest decentralizes winiest competed archaeologist florins tranquilizes chalah vocalizing encountering sporule fruitcake infatuated depopulators profiting plougher irresolutely meshier clarion gonoph rawhides forego" ; + dc:publisher ; + dc:date "2000-07-11"^^xsd:date . +bsbm-inst:ProductFeature701 + rdf:type bsbm:ProductFeature ; + rdfs:label "enginery oilseeds" ; + rdfs:comment "disabler annuls algorithms carrousel retrofiring costumiers eczemas challengingly cupbearers drooling twitted tieclasp valvelet alternatingly transfusing poetizes consonantly surfer straighter bipartisanship dogsbody piggie unexplored skids xylophonists reckless expatriates howled coupled iodines transshipment sandpapering misbehaver treacle sexisms ascendent inflaters supes consensual furnished heptameter refold pluvially cosmonaut vociferousness republica" ; + dc:publisher ; + dc:date "2000-07-08"^^xsd:date . +bsbm-inst:ProductFeature702 + rdf:type bsbm:ProductFeature ; + rdfs:label "loran felloe nakedness" ; + rdfs:comment "catchpenny slacks stalkless understands diapason bereaves crees misadventure dreck backbitten gargler juans sentiently mawkishness defecter renovated refurnished loiterers jehad colonization gilts electuary rheums zucchinis samurais blacklist flatboats perishes underslung heavenlier yardsticks emptiers enshrouded astrologically polymers tartans stickup sacrosanctness preaches alacrities" ; + dc:publisher ; + dc:date "2000-07-02"^^xsd:date . +bsbm-inst:ProductFeature703 + rdf:type bsbm:ProductFeature ; + rdfs:label "rebop" ; + rdfs:comment "scrawlier involuntarily chromosomally defrauded insiders waterfowl ferrets cryotron noninformative antisepticizing ringdove clinkered finer doughier ghat limitlessly wrecked admonishes flambeaux retirement mayest stopper output avoidable dairymaids sequinned chinking forgeries acoustics enscrolls backfiring unobtrusive lucres proprietors warningly postulation candler drippier appreciations corves poky buckskins vestries nepotisms chagrining" ; + dc:publisher ; + dc:date "2000-07-18"^^xsd:date . +bsbm-inst:ProductFeature704 + rdf:type bsbm:ProductFeature ; + rdfs:label "assaulted" ; + rdfs:comment "flaws prewarmed bootlace cosseting lessoned unlevelled trustees coinsurance lugger studiedly gruellers garrotte dubbings cedarwood biomathematics synonymicon promisor interconnection metazoic wheedles autophagy numerated lairing britons thanatoid levitates paced precontrive namesakes woald beanbags taoists smelter poses waggles fanwort innocently haberdasheries guidon secularizes" ; + dc:publisher ; + dc:date "2000-06-30"^^xsd:date . +bsbm-inst:ProductFeature705 + rdf:type bsbm:ProductFeature ; + rdfs:label "palsied unshaken" ; + rdfs:comment "laryngitic peewees bathoses deash sheathes refix chiffons lippiness draftiness deregulations liberalism retributive nondiscrimination bustled discourtesies marxists quartiles encrypt crucifer vivariums vaunting sauropods iffier reloaders miming chuffer preapplications plebs saintliest polynesian retyped garbages catatonias profiling cleanliest adorability debilitating deafened overspecialized wilted qui preelection triadics intercapillary shul disrupts whoso heartless articulateness allopathy" ; + dc:publisher ; + dc:date "2000-07-07"^^xsd:date . +bsbm-inst:ProductFeature706 + rdf:type bsbm:ProductFeature ; + rdfs:label "uplinks calamaries" ; + rdfs:comment "superlatively hushed doorways becalms adenose barehead catchment householders infuriation executes endorsers indefinitely surds remembers airbrush hazarded spinny aligner amusedly campanologists widowerhood monthlies scudded yowing" ; + dc:publisher ; + dc:date "2000-07-05"^^xsd:date . +bsbm-inst:ProductFeature707 + rdf:type bsbm:ProductFeature ; + rdfs:label "reheat friers" ; + rdfs:comment "radicalness packer foregoers exhausted mouther indwelling spiritlessly loosened freightage weakish legroom quilled sunshines hedgers gunnysack diagnostics algonquins license glancing wrongs informality latchstring presanctified preteen eyrir commemorates" ; + dc:publisher ; + dc:date "2000-06-21"^^xsd:date . +bsbm-inst:ProductFeature708 + rdf:type bsbm:ProductFeature ; + rdfs:label "dashiki confounder treader" ; + rdfs:comment "thermoplastic unprofitably canoeing handcuffed swindler kicker named ignitors surgers substations rebaptized megabytes sneezer biophysicists bras castanets fermentative proposes supervention hawkish loaned sevenths" ; + dc:publisher ; + dc:date "2000-06-22"^^xsd:date . +bsbm-inst:ProductFeature709 + rdf:type bsbm:ProductFeature ; + rdfs:label "nonconfidence sistrums brasserie" ; + rdfs:comment "reroute dramatized refrains numskull eponym uncontrovertible trijets sheers timekeepers moussaka attracted participator bingo gleba caterwaul tensionless ascenders weevilly fabaceous nosebags storewide czarinas sassily freshener unquietest stymy mesozoa softness occupative sealable kung selfdom typhous personalty" ; + dc:publisher ; + dc:date "2000-07-02"^^xsd:date . +bsbm-inst:ProductFeature710 + rdf:type bsbm:ProductFeature ; + rdfs:label "eyeballed dockages hijacked" ; + rdfs:comment "rawer raceme matrilinies fleeciest doxology dictaphones boccies hookedness accreting dilettanti braggarts vittle exurbs boohoo illegitimacies ocurred twitchers shakiness excogitating radioelement vivendi benumb outperforming briticism skycaps vol nonconformist colporteur carapaces eyestrain bushes jerkins clattered" ; + dc:publisher ; + dc:date "2000-06-25"^^xsd:date . +bsbm-inst:ProductFeature711 + rdf:type bsbm:ProductFeature ; + rdfs:label "complies" ; + rdfs:comment "scil connecters jolters psyching ecologist besoms remarkers unsurveyed mires typhoons hants ossia foliates ladybugs dopy lichis puddles handicaps oscillographies spokeswoman" ; + dc:publisher ; + dc:date "2000-06-22"^^xsd:date . +bsbm-inst:ProductFeature712 + rdf:type bsbm:ProductFeature ; + rdfs:label "provisionally" ; + rdfs:comment "timeserving clamours excels diminishments erythrocytes vestured lamasery popularity ravishingly fashions tokening gypsums biparted metabolites nosey refrigerated restrictionist interdistrict thrip determinism infatuating fluffs amish submarginal acridities candler satiably checkups wobbly enflamed achievement sneakily kinsmanship raining ciphered" ; + dc:publisher ; + dc:date "2000-06-27"^^xsd:date . +bsbm-inst:ProductFeature713 + rdf:type bsbm:ProductFeature ; + rdfs:label "swapping sundries corruptive" ; + rdfs:comment "fulcrums sphinges colorings softies kinkajou oralities contraindicating lustiest snippets collocates adulterates cacaos furloughed dormouse characterless coalfish pied vamping bodyweight astrologically foregoers marabou dieters tuffets fairyism praxeological conks" ; + dc:publisher ; + dc:date "2000-07-13"^^xsd:date . +bsbm-inst:ProductFeature714 + rdf:type bsbm:ProductFeature ; + rdfs:label "hesitations" ; + rdfs:comment "muzzling candidest parallelograms fungiform plaint quaggiest gests unclassified babbles drumming snippets unmans overcapitalize shorthanded gnotobiotically pertaining whirr scoundrelly accrued littlest chaps creditably overleaf invents amain electrotherapy vespers lins seafloor purposelessly flippantly prefixing creameries gessoes cleaving interagent hamlets wilier penuches poser fieldpiece kwacha cuckolding softballs economists disenchants cortin" ; + dc:publisher ; + dc:date "2000-06-28"^^xsd:date . +bsbm-inst:ProductFeature715 + rdf:type bsbm:ProductFeature ; + rdfs:label "repeatable pores morons" ; + rdfs:comment "whoresons yummiest noisily elks neoplastic inconsiderateness portieres lather phosphates irreducibilities hived condemnations pattypans presences wizened fruiterer pommelled basify abattoir alaskas spiring depraves restriction unhealed subscribe threatful shacking" ; + dc:publisher ; + dc:date "2000-06-22"^^xsd:date . +bsbm-inst:ProductFeature716 + rdf:type bsbm:ProductFeature ; + rdfs:label "uncompleted lbs reliquidation" ; + rdfs:comment "chevrolets eyepoints gaily thereamong cloddier demonstrating derisions moveable stemming eclipses jowlier gimp pharisaical nankeens windlasses homemaker kirtles recooked pricker feudalism aborigines overdoes censorship dandling blabbermouth sedating journalism statists subventions suppliants undermining foreclosures coifs brevetted firearms misadd trompes hts thrower epigrammatically frowns foreigner lightmindedness bodkin headnotes protectionism biffins pugged hungering surfer" ; + dc:publisher ; + dc:date "2000-07-14"^^xsd:date . +bsbm-inst:ProductFeature717 + rdf:type bsbm:ProductFeature ; + rdfs:label "movableness unpuzzling" ; + rdfs:comment "carpals prepaid yabber syphilitics cottoning timbale grapeshot clownishly speculative diazo guar kilovolts calcific carryovers torturedly girders kissers apartments lodestar integration tassels muffs icecap paralyzer disembodying astonishingly gonopores catapults mutters disappear serenest thiamins hemorrhaged resinous declaimer mayan bolsterers lazar contacts mainframe wurzel waking" ; + dc:publisher ; + dc:date "2000-07-07"^^xsd:date . +bsbm-inst:ProductFeature718 + rdf:type bsbm:ProductFeature ; + rdfs:label "mimeographs" ; + rdfs:comment "exploring apprehended springiest frypan korsakow pancaking mignonne dorms falsification pendulums macroscopically equipment sharpest nutrimental marbling nonclinically sartorially inchworms pockily wordlessly zeroed noninjurious regularity boars savvied obviation settlings checkpoints beetroots ulcers drachm kidskin ivories moderator casuistries antiparticle beebees clerkdom ambiguously massacres temblors newly" ; + dc:publisher ; + dc:date "2000-07-22"^^xsd:date . +bsbm-inst:ProductFeature719 + rdf:type bsbm:ProductFeature ; + rdfs:label "vivisectionists nondrying reoccupations" ; + rdfs:comment "roisterous chopped spitting unceasing meeker lacily racehorses mississippians subdistricts avocados distraction banjoes prediction faker redistills moulter supportance adds wideners ammine burnouses" ; + dc:publisher ; + dc:date "2000-07-10"^^xsd:date . +bsbm-inst:ProductFeature720 + rdf:type bsbm:ProductFeature ; + rdfs:label "spinelessly entwines lallygagged" ; + rdfs:comment "birdbrains poorness marinades werewolf orogeny ambushment bobtailing sightliest treatment zillionths philomels nightstands gorgons foxgloves forensically pyritic incapacitator confused empiricists lusher glaceing barks vindictiveness subcategories tempered tuberous thumps maceraters dhotis impacted ukases portieres ozonator cislunar bowling groover emphasizes cichlid" ; + dc:publisher ; + dc:date "2000-07-08"^^xsd:date . +bsbm-inst:ProductFeature721 + rdf:type bsbm:ProductFeature ; + rdfs:label "noir emissions tarzans" ; + rdfs:comment "dirndls heretics enquired subprovinces camps profitableness heaped mummers tourists foxhounds divas maddest aims costively squalls noire vividness substantiations alcazar monstrosities biotins factorship sibilation unprepared logarithms winterized sexists manifestoed tarmac salutatory bedwarf" ; + dc:publisher ; + dc:date "2000-07-10"^^xsd:date . +bsbm-inst:ProductFeature722 + rdf:type bsbm:ProductFeature ; + rdfs:label "unrightful saphead nonreader" ; + rdfs:comment "soaks hingers overfly antimatter alienage effaced incognitos automobilist gipper cuffless fashioners canaller overhands develope malting quirkiness wkly hodad early stuntedness unwieldier semigraphic spartans lichened" ; + dc:publisher ; + dc:date "2000-06-22"^^xsd:date . +bsbm-inst:ProductFeature723 + rdf:type bsbm:ProductFeature ; + rdfs:label "lawmaking humpbacked coaxing" ; + rdfs:comment "loiterer mestizas sheerly cluing presentability knaves pained restyling persisters vulgarized flashbacks encrypting feeling surplice innholder realignments trochee cowpuncher chintz graduating nonaffiliated presentable stuffier benchmarked administerings dynasts snippets dooryards soupier loans monorail rallyists foredoing defrauding barbershops unhand repellency dangerously jell phlegm gormandizing photostating insurrectionary payoffs" ; + dc:publisher ; + dc:date "2000-07-02"^^xsd:date . +bsbm-inst:ProductFeature724 + rdf:type bsbm:ProductFeature ; + rdfs:label "orbited" ; + rdfs:comment "inconsequentially pewits gracile funnelled meniscuses abutment lynched excited preprints photographs queaziest serried hyoglossi formulator distinctively confutator seriating maladapted aggrandizes faithfuls extirpator" ; + dc:publisher ; + dc:date "2000-07-01"^^xsd:date . +bsbm-inst:ProductFeature725 + rdf:type bsbm:ProductFeature ; + rdfs:label "begot" ; + rdfs:comment "misreading rarify pungency mensed overrate constructed nonequivalent complains commandeered bores lacteal embosomed consequentially valorous saree prosecutorial yodlers ludicrously reestablished corralling unabating glistening apologist premierships reconstructed remarry contempts sixteenths binnacle driveways" ; + dc:publisher ; + dc:date "2000-07-05"^^xsd:date . +bsbm-inst:ProductFeature726 + rdf:type bsbm:ProductFeature ; + rdfs:label "linty" ; + rdfs:comment "barouche horded begirt remonstration wens earthier baled seismographs granges combustibly lunet sprier vedantic jeweler girded activistic dammer reservedly politer voces sawboneses copular piddling sectary tabby ledges axonal girdled voting shawn accenting notebooks adages spheral reaccommodates soigne ovoid seatmate blastings frizettes negotiatress premixed chilli" ; + dc:publisher ; + dc:date "2000-07-18"^^xsd:date . +bsbm-inst:ProductFeature727 + rdf:type bsbm:ProductFeature ; + rdfs:label "kyat burster waverer" ; + rdfs:comment "terrifyingly racings glummer scams arrowroots renderer crummier occulter reheel terrazzos templates leviathan prater cerenkov ruralize pebbly proprioceptor chlorinator climbs entraining coccygeal synodal misadvising lanolines pshawed devaluating nonadmission neophytes shamed interbranch foisting outwardly loury disunited participants pinkest" ; + dc:publisher ; + dc:date "2000-06-25"^^xsd:date . +bsbm-inst:ProductFeature728 + rdf:type bsbm:ProductFeature ; + rdfs:label "benzines coder" ; + rdfs:comment "teenaged coloured subterraneously condemnation yarned contracture reconditioning shingly underspends riyal bahamas tweeted tenderheartedly baseboards stitches entrap quadruplicates hymnist paroxysms henceforward flambeau chemosurgery ruins pervertedly miters flaccidity wars compares banknotes germaniums vans cogged extinguishable malpracticing dressiest surveil civilest repaginate coapts unwearying subcommissions colonnades mentionable carnivorous shellfire hypoed" ; + dc:publisher ; + dc:date "2000-07-20"^^xsd:date . +bsbm-inst:ProductFeature729 + rdf:type bsbm:ProductFeature ; + rdfs:label "misidentification" ; + rdfs:comment "unplug univalves weakfishes supplementarily appropriation bespangle shocked mutts jennies solves putouts tenty voyager lifeworks coequating anointer devoutly dinettes calculative blotto misstate margraves flensers conceitedness goddam caveats arduousness sallows lienholder clodhopping rutabagas peened" ; + dc:publisher ; + dc:date "2000-06-20"^^xsd:date . +bsbm-inst:ProductFeature730 + rdf:type bsbm:ProductFeature ; + rdfs:label "collapsibility sheeneys" ; + rdfs:comment "jabs prizing gruffness timeliness dourine diluting seamless damnable phoney mopingly muffing filing dalesman voidness fatsos roisterous creasier stifling mutilation coders pekoe variations towpath impureness shocking indigently polyesters excrescences wrested modernized ignominiously oiled deployed copier legitimated counteraction pouffes units boffo prohibiting smidgens plotting" ; + dc:publisher ; + dc:date "2000-06-20"^^xsd:date . +bsbm-inst:ProductFeature731 + rdf:type bsbm:ProductFeature ; + rdfs:label "unionize" ; + rdfs:comment "gyrocompasses rearer chubbiest girt shrubby xvi caracal parishioners hominoids olfactometer theorizes soberer preppies spectroscopies used mythologists weirdness radome swaggerer implication doubling substructure mongols luges investigations niblicks apprehending corporations foodservices untruest tautness ensue bounteousness drumbeat scepter undervalued blacklists headhunter duotones midges fulfil tovarich careerer hazing stocking undemonstrative wildish thunderclaps unlabeled" ; + dc:publisher ; + dc:date "2000-07-19"^^xsd:date . +bsbm-inst:ProductFeature732 + rdf:type bsbm:ProductFeature ; + rdfs:label "outstripping" ; + rdfs:comment "osteal fresheners untravelled ferments whiskers pacs oleums limos outstrips plaguily virally thrusting homespuns mongoloids ignoramuses maturational nettled soybeans refuting gonocytes sequestratrix overidealistic mosaicism readmittance nondiscriminating avalanches deism glommed germs parsimoniousness custards mismatches dipsomania milking disrupting thinness arguer forelands courteousness precondemn herby ungraded scaffolding" ; + dc:publisher ; + dc:date "2000-07-05"^^xsd:date . +bsbm-inst:ProductFeature733 + rdf:type bsbm:ProductFeature ; + rdfs:label "emaciation" ; + rdfs:comment "placidity nervines dilative thinclad friendlies dastardly poplars sepulchrally insincerity placque antismog flashcubes ginsengs edemas winsomely blowsy postponements oidium murphies archaeologically gasiform logrolls blacktop careening pinworms imitational conformations misnomers" ; + dc:publisher ; + dc:date "2000-06-26"^^xsd:date . +bsbm-inst:ProductFeature734 + rdf:type bsbm:ProductFeature ; + rdfs:label "criticizing" ; + rdfs:comment "indenter kolinskies timbale wincher predictable elds reprehended couples neurosurgery representations pleurisy decrier unwon hunts caves heartwarming rebukers bouts approximating oxalises unsnarl looming answerer relics hypersensitized slinkier" ; + dc:publisher ; + dc:date "2000-07-21"^^xsd:date . +bsbm-inst:ProductFeature735 + rdf:type bsbm:ProductFeature ; + rdfs:label "sightsaw frier cornel" ; + rdfs:comment "sulkier sharpers mezuzas tarter plower reexchanges fifers subdirectory scrubbers hegemonic flutings preteens minxish deregulates tomfool differentia dribbed cursiveness metazoa sirs limping visiting naivest irately remarkable fairing tallyhos wised freakouts chiels" ; + dc:publisher ; + dc:date "2000-07-21"^^xsd:date . +bsbm-inst:ProductFeature736 + rdf:type bsbm:ProductFeature ; + rdfs:label "biters asphyxiating multifactorial" ; + rdfs:comment "choruses entreats unattended ganger hyperextension rehammered unconscionable succulent meaner machinated dingdongs bells lynchings unperfected mandalas tourneying escaroles disillusioned nightstands precipitancy brainstorms fornications imploration anoxic sonorities bloodmobile synchronizes rattier stargazers teensiest hells dei pickpockets preannouncement backboards dualist probationers corsairs oligocene carbons anticlimax electrologists revoking" ; + dc:publisher ; + dc:date "2000-07-14"^^xsd:date . +bsbm-inst:ProductFeature737 + rdf:type bsbm:ProductFeature ; + rdfs:label "gleaners flyby" ; + rdfs:comment "windproof axletree pouting jordanians snickering uprooting spued tobacconists forbears terrains isotopy spleeniest plumages stiffened proselytizes tomcats punters drivers bitterly prepubescent subagency untrodden importable rearranges disentangles accretes disparity hydrogenation uneducable overdresses heterosexuals" ; + dc:publisher ; + dc:date "2000-07-02"^^xsd:date . +bsbm-inst:ProductFeature738 + rdf:type bsbm:ProductFeature ; + rdfs:label "towboats bloaters gelee" ; + rdfs:comment "multipurpose bopped minicar biocatalyst dolled smartie tumbles preapplication reply overgarment overwhelmed flecked wraths butches cannibalizing ormolus glories squiggles constraining lagger sensualness distractedly jurisdictions dalmatian gooky malinger gyving swankest pogroming drachms caucused" ; + dc:publisher ; + dc:date "2000-07-18"^^xsd:date . +bsbm-inst:ProductFeature739 + rdf:type bsbm:ProductFeature ; + rdfs:label "milkily garcons" ; + rdfs:comment "cervices admissive scrimmaged magnificence pleasanter intermix peens baggie reexhibiting petitions nonsymbolic designating maltase autobus accentuator acclivity resolutory cracklier sardonically metazoa unpersuaded midship finings goofiness bitterest favoring puslike bilking noneffervescent unicef doggies reprehension obliterating inventoried bitts lumpily kames incommensurately" ; + dc:publisher ; + dc:date "2000-06-26"^^xsd:date . +bsbm-inst:ProductFeature740 + rdf:type bsbm:ProductFeature ; + rdfs:label "misfortunes" ; + rdfs:comment "lucencies fraus chancing bleaters vituperating deformers singes hearings ubiquities tumulus unscrambles fragmentally whetted nucleated dishevelled toolbox corse spookily tamped chapels tabulation costumers mincing fordid jetty" ; + dc:publisher ; + dc:date "2000-07-22"^^xsd:date . +bsbm-inst:ProductFeature741 + rdf:type bsbm:ProductFeature ; + rdfs:label "darkhaired" ; + rdfs:comment "farinas unquoted aviates subtitling gallinules nips kreuzers sportsmanlike hostlers unthoughtfully reluctancy consignataries tamely medicares uprises swinish frisbee ruthlessness pussies sinusoidally thearchy stockateer dadaisms" ; + dc:publisher ; + dc:date "2000-07-18"^^xsd:date . +bsbm-inst:ProductFeature742 + rdf:type bsbm:ProductFeature ; + rdfs:label "bloodshedding spreadable livened" ; + rdfs:comment "flensers spheres dowse dims undisturbed whipsawn hoedowns thirster discounted wetting combats libitum entities deflowering embows devitalizing cubbyholes deformable edifies granddaughters goalie hovelling cherty pelleted cantilevering seafront unmoored grouting sireless rounded nonimmunity surffish flappier speakable darker accelerated approbative proprietaries reticently vases reinflames" ; + dc:publisher ; + dc:date "2000-07-03"^^xsd:date . +bsbm-inst:ProductFeature743 + rdf:type bsbm:ProductFeature ; + rdfs:label "hemorrhoidectomy" ; + rdfs:comment "vivisect orchestrations knotweed reductions scholastics transportee critters diagnostics luminists cunningly dispossession lib bowwow soigne mulls quadrillionth ultrasuede cavaliers guardians coition congratulates inviolably unillustrated flunkers haleness advisement archeological puniness prehuman remuneration temperer manageress bloodhounds accumulator nonabsorbable lunatically hermeneutically subtreasury publican retraceable tarrying manipulated harems screenwriter adjudicature redfin vegans nobler muezzins polydactylous" ; + dc:publisher ; + dc:date "2000-07-18"^^xsd:date . +bsbm-inst:ProductFeature744 + rdf:type bsbm:ProductFeature ; + rdfs:label "gamester raddled obituaries" ; + rdfs:comment "saracenic ovulating sensualize grifts supermolecule gushily anvils apnoea roamed convalescence enravishes fortifiers rearouses practising annoying boche purchasers nautili reappears pomatums branching attacks bedmaker rampagers sagy redirection splashier stuns dropshots seeings purled" ; + dc:publisher ; + dc:date "2000-06-20"^^xsd:date . +bsbm-inst:ProductFeature745 + rdf:type bsbm:ProductFeature ; + rdfs:label "chitin cobs" ; + rdfs:comment "readmit medicare savorily hards mishandles azures fritterer zooms tractability honeysuckles grasping doers reposeful hearkened talkatively unhesitating pessimists waterlogged atonements hulks undiluted englobement amps dogie wattmeter battiks cruse gunwales congressed overachieve hangdog deposes aspirates jars picketers progenitors purity lutenists twat tending" ; + dc:publisher ; + dc:date "2000-07-12"^^xsd:date . +bsbm-inst:ProductFeature746 + rdf:type bsbm:ProductFeature ; + rdfs:label "romanize malingerers sapheads" ; + rdfs:comment "delicately tuftiest longed incognito corelating countered pallettes milos geared clowns reexperience fleshiness crafting selectees cumulous adaptions lated obstructing preset prevarication vaccinates absurdities fertilely nobeliums diffuses ceders reflowered narrative environmentalist extremer interdiction keyless unpresentably caprine americanizes tuque transfixed limners roads swordmen raftsman alights rockworks" ; + dc:publisher ; + dc:date "2000-06-24"^^xsd:date . +bsbm-inst:ProductFeature747 + rdf:type bsbm:ProductFeature ; + rdfs:label "retracing" ; + rdfs:comment "gloggs tenets papier parching elks imping cymbalists deafens softwares cajun sissyish tutrix microbus prodigiously challie inhered stencils prolabor archaistic dolmen crossness mooncalf languages fitted agrology shareholders mournfully affrighted deformity unhappier foppery quilting unlimited cerebrospinal undeviatingly outreasoned wipers" ; + dc:publisher ; + dc:date "2000-07-20"^^xsd:date . +bsbm-inst:ProductFeature748 + rdf:type bsbm:ProductFeature ; + rdfs:label "unperturbed camouflager" ; + rdfs:comment "reproaching findings groats overexpanded bladders weighage shipways fem lurcher demerited subsisting noninterference threshing jillions astringes gipsy contaminator pavement yokels unstuck taboos ptomaine subbranches vandals californian kinesiology olympiads lambing impoliticly moieties enslave nepotisms" ; + dc:publisher ; + dc:date "2000-07-10"^^xsd:date . +bsbm-inst:ProductFeature749 + rdf:type bsbm:ProductFeature ; + rdfs:label "pentadactyl homiletic" ; + rdfs:comment "damndest aerosolizing deliverer sophistication rockaways bootlicker senoras labially issuances generalizes eugenists posterities musicologist colostrum rainmaker blazoned sunburst exotism desperados catenas staler" ; + dc:publisher ; + dc:date "2000-07-05"^^xsd:date . +bsbm-inst:ProductFeature750 + rdf:type bsbm:ProductFeature ; + rdfs:label "rotifers" ; + rdfs:comment "prostatitis waifs gauntleted imploding townswomen pusher solutes evangelist swooned plasms deafens swoons apertural auburns carrotiest repast dynasties calmative pares plumped marshlands metricating stylize habiliments playbills undiluted blots soliloquies meticulosity demulcents pastina tackets gutsier nebraskans rehanged gangplow patencies calendulas unapparent digesting biodegrade variegation fisticuffs holytide vaulters" ; + dc:publisher ; + dc:date "2000-07-02"^^xsd:date . +bsbm-inst:ProductFeature751 + rdf:type bsbm:ProductFeature ; + rdfs:label "urticaria blends tactics" ; + rdfs:comment "republicanism fatalists bedplates bulgiest senders pledgers freebees tawdriest incarnadine chisels enfolding violoncello fishnets discomforting mispronouncing misguide brainteasers bifold plagiaries aggravations streptococcic wolds individuality fellers individualists unreceptive trickly wornness refurbish protester parenting seceders" ; + dc:publisher ; + dc:date "2000-07-10"^^xsd:date . +bsbm-inst:ProductFeature752 + rdf:type bsbm:ProductFeature ; + rdfs:label "platers agglomeration" ; + rdfs:comment "leaves birdseye triples endocrinologist pleasantries complication concussive danged galleons tautens mech chancellors turbidly wearisomely curdled revolutionizes trollies reignited spreader matzo entrains estonian helmed untreated alienating splosh circumscriptions seaworthy ranchman movability chronicles frowziness insulted" ; + dc:publisher ; + dc:date "2000-06-26"^^xsd:date . +bsbm-inst:ProductFeature753 + rdf:type bsbm:ProductFeature ; + rdfs:label "pygmies" ; + rdfs:comment "klutz ukase hewable portending nematodes beanpole recompensed departmentalism pharyngectomies moralization upheavals remuneratively unpuckered spouting defining unchaste moolah sunups corvine maturated lifts unfearing jewing tatami intel beholder gelts advisories piercingly mayest valva viceregal cleanlier gartered rained deveined spathal jerrycan overfull waitresses zincous rumples nomadically bijoux" ; + dc:publisher ; + dc:date "2000-06-20"^^xsd:date . +bsbm-inst:ProductFeature754 + rdf:type bsbm:ProductFeature ; + rdfs:label "fatalist twirp frequency" ; + rdfs:comment "mating teleological relearning silurian impassibility flatuses installant rebops filmstrips assails hazarding sneezier offshoots bragged genic blazes cackled neuralgic trombonist moony sheols subcommittees elbowroom cunningness swoosh controverts thorax shader backbreaking memorialist lamenting bareness rammed nervines disjointing iciness lacker cutaways hawkbill persevering brevier boondoggled naphtha urushiols edited mums gushing dentally" ; + dc:publisher ; + dc:date "2000-07-05"^^xsd:date . +bsbm-inst:ProductFeature755 + rdf:type bsbm:ProductFeature ; + rdfs:label "tauts simplifiers" ; + rdfs:comment "sorting offers clientless besprinkle messiness borborygmus damner rangiest innovative pinpricks voidances foredo weaselly disparaging jumpingly nebulized playgirl unprogressive gigues wrongdoers infidels ingrowing scanned boysenberry inhibiter enduro razes shoehorns nonclinical castanets dins stronger chugger tolls scalps experts typhuses micromeli" ; + dc:publisher ; + dc:date "2000-06-20"^^xsd:date . +bsbm-inst:ProductFeature756 + rdf:type bsbm:ProductFeature ; + rdfs:label "druggists vinculum" ; + rdfs:comment "navigably casteless ears paraded abbreviating bricky accomplishable peculiarly creakily polishes purpled ruralism levellers seams diggers viaticum criminally unleashing inclinometer froggier cranberries felines tiller" ; + dc:publisher ; + dc:date "2000-06-26"^^xsd:date . +bsbm-inst:ProductFeature757 + rdf:type bsbm:ProductFeature ; + rdfs:label "thinclad latins" ; + rdfs:comment "politics rosewoods amateurism annalists preponderantly mingled conjoined feigning repinned renegading deicer desktop reinoculating doornail pitifully neatly bartended haviour mezquit mountainsides detentes bras noisemaker hoisted bromines scoured floccular vixenly chronol ables tirelessness sourness coasts pastorale vestigially unanswerable intruders centimeters knuckles wallower objurgate" ; + dc:publisher ; + dc:date "2000-06-26"^^xsd:date . +bsbm-inst:ProductFeature758 + rdf:type bsbm:ProductFeature ; + rdfs:label "neutralize" ; + rdfs:comment "agricultures collegium gladiators strew doomsters waybills raggedness jujutsu tantalizing tropisms chirologies couchings hairband multivalent kittening rebuilding synthesizes worths uhs disintegrate defacements kettledrums leant overinsures anisette crabby turnstiles nutter fusil penetrator prizes corrugator yows querier fogbound duelist geometry dubbin straitens craters flatworms menarches" ; + dc:publisher ; + dc:date "2000-07-10"^^xsd:date . +bsbm-inst:ProductFeature759 + rdf:type bsbm:ProductFeature ; + rdfs:label "humbuggers nonattributively" ; + rdfs:comment "redissolving elver kapoks ptarmigans accomplishing darkhaired beeriest antepast sourballs entree copperplate oregonian civiler adequation differentials underset quaked acquits reinvigoration omicrons unhats whitecap trespasses" ; + dc:publisher ; + dc:date "2000-06-30"^^xsd:date . +bsbm-inst:ProductFeature760 + rdf:type bsbm:ProductFeature ; + rdfs:label "smothery" ; + rdfs:comment "remodifying hymeneal recuperation privets cossets timeserving allegorically normatively hypnotherapy travellers mainsprings tarrier potpourris uneducated nibbled reechoes inordinately reenlarges attenuates rediscovered energies mountebank seldomly suffixing logrolling groomsman tepidly revisionism protagonists poulticing rheumic restamp insulated sauntered cyclamate outraging wooliest genteelly nonscheduled gigabits bedumb telegraphists patriots bales jubilated fascia" ; + dc:publisher ; + dc:date "2000-07-19"^^xsd:date . +bsbm-inst:ProductFeature761 + rdf:type bsbm:ProductFeature ; + rdfs:label "sumachs puddler" ; + rdfs:comment "inexpressive relevancy constellation prepubescent varnishy roentgenologist citrates disenchantment blurred bestriding caner verite deserter primmest archaeologically expectorator liverymen satanism pschent despoilments leeriness" ; + dc:publisher ; + dc:date "2000-07-03"^^xsd:date . +bsbm-inst:ProductFeature762 + rdf:type bsbm:ProductFeature ; + rdfs:label "scripting turbocars" ; + rdfs:comment "apically spanglier goers meterological shes frogmen peritoneally subcutaneously combatants misread tempehs smocking subversion perjuring hyssop riping nobblers cursors juxtaposes ached nonaquatic metagalaxy ferryboat capes dischargeable sandfly cementing remoter holograms sacked identifers sideburns carder sophistical playbills woodblocks faunae crocodiles boasted disports climes discharged biodegradable fratriage applauders acquisitions nudging rarefier launders haloids" ; + dc:publisher ; + dc:date "2000-07-15"^^xsd:date . +bsbm-inst:ProductFeature763 + rdf:type bsbm:ProductFeature ; + rdfs:label "dace" ; + rdfs:comment "coveralls mellows lemons decentralize reincarnates kalifs obsessing coxswains rocking crenelated decaliters noncreative bookworms cumbers phial hiccupping doorsteps colorfulness demonian humanistic unartistic overdue hurtles preexpose culotte yardmaster cowherds unweaned detachability inbounds misterms basics eatery ribber scribed armrests spelldown huntable crispiest resurvey tubularly caymans indiscrete ousted devisor" ; + dc:publisher ; + dc:date "2000-07-10"^^xsd:date . +bsbm-inst:ProductFeature764 + rdf:type bsbm:ProductFeature ; + rdfs:label "folios illegally hoosiers" ; + rdfs:comment "amerism yipped stepdowns lanterns nubs fissioning glamorizations emigrants precognition roominess squealing flighting roasting clavichord galleys impecuniosity champer doorsill crusted arduousness meatheads jeerers transported calculations sharpener tiara toners moping complementariness pardoner entangled unenvious outguessed shafting ruiner parakeets carbineers upholsters hinds abductors harebell disentangles supernova frailest" ; + dc:publisher ; + dc:date "2000-07-16"^^xsd:date . +bsbm-inst:ProductFeature765 + rdf:type bsbm:ProductFeature ; + rdfs:label "aligned daybook comparers" ; + rdfs:comment "roomily arthritics gigs fullering grantsman boomtowns panatella envelopment cashews railways composting anorectic pauperizes foredeck heartbroke cassabas milliliters oxidation archly impersonates begrimmed" ; + dc:publisher ; + dc:date "2000-07-15"^^xsd:date . +bsbm-inst:ProductFeature766 + rdf:type bsbm:ProductFeature ; + rdfs:label "gruel" ; + rdfs:comment "figurations nervelessness muckles botanize protected electropositive daftest bubbles woozy misconstrues calorically narrative zanyish vasoconstrictors zippering pageants augustest unobtainable hymnodies longitudinally" ; + dc:publisher ; + dc:date "2000-07-14"^^xsd:date . +bsbm-inst:ProductFeature767 + rdf:type bsbm:ProductFeature ; + rdfs:label "drooped" ; + rdfs:comment "stibium vermifuges resets travelable fakeer spays hedgehop stiffest diphtherial competes unifier numerating rarefies horticulturist rabidity proposed leprosaria grinds guaranteed scampi ecdysis astronautically bigger drowsiness onstage purlieus subtotalled slants dealing" ; + dc:publisher ; + dc:date "2000-07-12"^^xsd:date . +bsbm-inst:ProductFeature768 + rdf:type bsbm:ProductFeature ; + rdfs:label "fulminant zillion intelligence" ; + rdfs:comment "laved salabilities mote wain dobber misfired jumbles whitecap ichthyic venezuelan equivocalness mutilated supermini tinplate bargained womanly formlessness antlions ravager savate lintel trenched clouters caballero marrer feminise suppler bowdlerism masquer tigerish osteotomy bends accidentally gaudery imminently deliberateness flytrap prenatally jumbos dragonet nonsuches gondolas recreational restituted" ; + dc:publisher ; + dc:date "2000-07-01"^^xsd:date . +bsbm-inst:ProductFeature769 + rdf:type bsbm:ProductFeature ; + rdfs:label "blether" ; + rdfs:comment "bugling fleered herbivore straddling honkeys caponizes noncommissioned penes reallotment beliers participates boardings hands manured unworldly development hypnoanalysis sequoias firebrands expediter reapplying guiltily unwove hutting percentages delusionary churlishly benzoates bluer debone kikes friz brayer dictums stubbly laburnum renders laager kinesiological wooled choirmasters pleaters sheerest skeletomuscular offenseless shampooing" ; + dc:publisher ; + dc:date "2000-07-03"^^xsd:date . +bsbm-inst:ProductFeature770 + rdf:type bsbm:ProductFeature ; + rdfs:label "sailable" ; + rdfs:comment "cataleptic tortured friendly unstressed phoenixes enchainment whacky conspirers populated stegosaurs postfixing preexisting capitalizations inalterability overburdensome reappropriating sunglass menus idolatries compensating honcho cruising bunions semimythical durndest oversolicitousness constructive dendrites purposing urgers gormandizers valiants kidnaper manoeuvered caprioles chantries surfeits reencountered hardcovers mystifier toadyisms gracefully spoons orris" ; + dc:publisher ; + dc:date "2000-06-25"^^xsd:date . +bsbm-inst:ProductFeature771 + rdf:type bsbm:ProductFeature ; + rdfs:label "ghettoing cutthroats" ; + rdfs:comment "magistrates repudiations abluted snufflers cliquishness curettes paganish disbanded borderlands aborts cardiograph gweducks earflaps predatorial biomes ferny winks tunings sanseis languishing schoolbooks glimmerings constipated" ; + dc:publisher ; + dc:date "2000-06-28"^^xsd:date . +bsbm-inst:ProductFeature772 + rdf:type bsbm:ProductFeature ; + rdfs:label "revaluating ofter" ; + rdfs:comment "verbifies alarmingly quaintly rte unmilitary demount enunciating blandished sanitorium crowder cashers ambulation slurs swooshes shamefacedness goitre degraded commuting nonprotectively outwear youngest geotropically interpolation" ; + dc:publisher ; + dc:date "2000-07-16"^^xsd:date . +bsbm-inst:ProductFeature773 + rdf:type bsbm:ProductFeature ; + rdfs:label "advises noxiousness knobbier" ; + rdfs:comment "distensions heinously vegetarians chutist lawmakers polyvinyl gasper balminess pouches inhaling expansionists succulently quaveringly pitons erectilities slathering submerging brownout molars radiates melancholically stodgily deponents ionium arrhythmical acerbates multiplexed overdrawing platesful alchemies radiosensitivity compeer wader swishing cantata stacked vittles" ; + dc:publisher ; + dc:date "2000-07-13"^^xsd:date . +bsbm-inst:ProductFeature774 + rdf:type bsbm:ProductFeature ; + rdfs:label "rubes" ; + rdfs:comment "pertussis healed suffused perilling outlives glumly lands incase matchlock refry unseasoned leveled resentments frazzling maximite seventeens overprotected boraxes importable centenarians slushiness becomingly downstroke spectrograms nigritude tardiest electronics certificating slighted maunder surmountable defended cosmopolitans tipsily trustfulness dadoes windpipe celibates apartmental" ; + dc:publisher ; + dc:date "2000-07-02"^^xsd:date . +bsbm-inst:ProductFeature775 + rdf:type bsbm:ProductFeature ; + rdfs:label "frere unpremeditated" ; + rdfs:comment "kivas propulsive agouty converses subrace devolutionary husked periodontal sadiron advancement wedding touchingly kerneled truckers stereoscopical preoccupies forayed anonyma bequeathing mysteriousness overdraft sunbursts miscellaneousness hypertrophying universalize gymnosperms scraps evangelist diffuser subscripts reticular unexcavated" ; + dc:publisher ; + dc:date "2000-07-05"^^xsd:date . +bsbm-inst:ProductFeature776 + rdf:type bsbm:ProductFeature ; + rdfs:label "churchless unstopped" ; + rdfs:comment "unclassified coonhounds rutting oils orificial imprecisely flows reobtainable unhands payed kisses musical shuteye knotter predilections antigene showmanship frowsier birchen didos limy hesitation copulate loppier bioacoustics pudgy vasodepressor bono manchurian crustily cramming carlot skeptically tuxedos lites unfolds wintered cavies hatpin enrobed abstinently birdies mandatorily indexable bathers peppers tendons" ; + dc:publisher ; + dc:date "2000-07-17"^^xsd:date . +bsbm-inst:ProductFeature777 + rdf:type bsbm:ProductFeature ; + rdfs:label "coefficients" ; + rdfs:comment "bacteriologies glads extorter writhes contentiousness tenably nonconforming candidness bourgeon turbidness beelzebub whippersnappers headquartering soubrettes nonfactual tortures vivaciousness chokes featheriness bulletproof physiognomies romanticize scherzi carrions jujubes frumpy combattant radiological devitalize encrypting lianes deadlines revues cassettes triplane recriminations imperceptibility apocynthion demasculinized unhanded binocularly durables crediting ironical caster megalith letups volplane" ; + dc:publisher ; + dc:date "2000-06-22"^^xsd:date . +bsbm-inst:ProductFeature778 + rdf:type bsbm:ProductFeature ; + rdfs:label "rattlebrained" ; + rdfs:comment "lawbreakers understates publishes summerhouse rambler defamingly vocalize clonism inconcealable connected ruefully deluged relates gargles transmigrators construable legitimatize separates proffered undergirded ranger biophysical raped oversouls blackjacked jerks bamboozlers nylons glaciology yakking swings inmost valises enumerations twisting sugariness reinforming taproot violently glistens moralizer megacephalous sultrier inkier" ; + dc:publisher ; + dc:date "2000-07-19"^^xsd:date . +bsbm-inst:ProductFeature779 + rdf:type bsbm:ProductFeature ; + rdfs:label "underlaid" ; + rdfs:comment "fucking prussian curiosa cusped flatulently cascades unimaginably enoughs flummox stumps parliaments ripplets punctilio puzzler toothily clones fins inflows notched injurer" ; + dc:publisher ; + dc:date "2000-06-20"^^xsd:date . +bsbm-inst:ProductFeature780 + rdf:type bsbm:ProductFeature ; + rdfs:label "sublime priggery" ; + rdfs:comment "hypoergic litigates defectiveness enhancing turnups etiolated melanesians whooshed vacated reaccustom overgeneralizes cubbish stored hacking axles soliloquies particularities triggered cuts barbwire cankerworms names boloney babul cactuses scrambled elevon jojoba scowlers tsimmes anthropoid overtured hidable jejunal" ; + dc:publisher ; + dc:date "2000-07-06"^^xsd:date . +bsbm-inst:ProductFeature781 + rdf:type bsbm:ProductFeature ; + rdfs:label "international astrobiologies" ; + rdfs:comment "whodunits congealment expectorating longing punner brassily greasiness reorder coatrack nondairy needier frugging punner hipbones knouting garnishees placates ultrastructure palest yodled pretzel tumours greatening revelator ephedrine enrichment constrainer flamingos ostriches overladen transpires strollers reassure rower venues bandboxes sinters dibbuk manipulatively buncoed windrow flopping feaster badlands powders denigration hellenist secretiveness bargainee" ; + dc:publisher ; + dc:date "2000-06-27"^^xsd:date . +bsbm-inst:ProductFeature782 + rdf:type bsbm:ProductFeature ; + rdfs:label "capitation disannul porns" ; + rdfs:comment "overact pruning awkwarder unsphering idly deepness cooperation unweeded mangers baboos tuberculous midwesterner windier ungodliness stemming heartens curiosities acidifying federates squelches magnesian beltline gyrfalcons crudeness workability superlativeness aperient sculpts appetites unadjourned belonged industrialized benignancy heeder enforcing orgeat spoilsman kitchens" ; + dc:publisher ; + dc:date "2000-07-15"^^xsd:date . +bsbm-inst:ProductFeature783 + rdf:type bsbm:ProductFeature ; + rdfs:label "blundering" ; + rdfs:comment "beckons dichromatic circumstantiated geostationary endue graals tonally violator slush sneezed stomachically salarying evaders complexional potations countersigning battledore cattish scientists skinless kadish unbinds faultfinding overflew resettlement detester decimation motived wats unostentatiously innominate anathematizing sitzmarks gregariousness riposte proteas darter encourage fertilization enfoldings supinely psychical nonvisually guidon hahnium oscillometries samechs xenobiologies repeller" ; + dc:publisher ; + dc:date "2000-07-12"^^xsd:date . +bsbm-inst:ProductFeature784 + rdf:type bsbm:ProductFeature ; + rdfs:label "misapplication" ; + rdfs:comment "infringer recollection subtitling pillowcase polysyllabic haleness predations tupelos kits sandwiching clues lankily piosity mitiest interbank whifflers bravest karts myelitis derogation podded microclimates kilovolts chemoreceptive loathful fluctuates moldering correlations notchers eyeletting incog" ; + dc:publisher ; + dc:date "2000-06-24"^^xsd:date . +bsbm-inst:ProductFeature785 + rdf:type bsbm:ProductFeature ; + rdfs:label "contemplator batmen putridness" ; + rdfs:comment "photosensitizer pecans postdated deducting auroras jotting footpaths symbiotes oldsters wonderers fonded girths derries anciently spawns leered unsolicitous obliger wittiness symblepharon ballistae remeasures choreographs squirreling painfulness" ; + dc:publisher ; + dc:date "2000-06-27"^^xsd:date . +bsbm-inst:ProductFeature786 + rdf:type bsbm:ProductFeature ; + rdfs:label "apocalyptically" ; + rdfs:comment "auditing affirmably rediscovers emir aladdin buncoed macerated costless hatches lapboard disclaim carabineer troppo dollish subtilest pecker apatetic repacked dolmens carts tarbushes cheeked lamia disobeyed ungenially malcontents reshaped patentors deserved amplifies sparrows petites mannishly" ; + dc:publisher ; + dc:date "2000-07-02"^^xsd:date . +bsbm-inst:ProductFeature787 + rdf:type bsbm:ProductFeature ; + rdfs:label "nubs" ; + rdfs:comment "slovaks ornamentations ensouling brilliants charmers vends embrocating kirsches dividends clyster preascertaining occupancies tidemark laywomen auras wider uglifiers nearing dilutors crawled welder amalgamator circumambulated rechristened unclasped sophisticates toroids gawked telluric feelingly buries" ; + dc:publisher ; + dc:date "2000-07-04"^^xsd:date . +bsbm-inst:ProductFeature788 + rdf:type bsbm:ProductFeature ; + rdfs:label "tasking stewardship proteins" ; + rdfs:comment "capitulatory generator hyphening cilantro critiques akvavits obviously platies wholisms sniffily underbred agonises duumvir propagational unloosen reargued immoderacy lumina pectin valorize airings reciprocated redeyes cloned turgidities diversifications invadable trichinous keyman" ; + dc:publisher ; + dc:date "2000-07-16"^^xsd:date . +bsbm-inst:ProductFeature789 + rdf:type bsbm:ProductFeature ; + rdfs:label "equitant" ; + rdfs:comment "camomiles harkened permeated exobiological rawnesses declaimed demonstrates snubby refiles flapped interrogations hedgers solidest dentist limelights subschedule blued oversimplify unartfulness disquietudes intrusts" ; + dc:publisher ; + dc:date "2000-06-29"^^xsd:date . +bsbm-inst:ProductFeature790 + rdf:type bsbm:ProductFeature ; + rdfs:label "provided sacrilegiously whiner" ; + rdfs:comment "nosing saleable uncorroborated vasts opening lionizes climates unsubmissive apprehensible biologics outlives macadamize paragraphs sexist crinkliest nitrification oidium misconstructions lindies bacca coronations variegating swivels dysfunctional lapels zee underpants inducts leeriest exceptionality sparrows rancidity viny demerits presswork varier espanoles whitewashing episcopacy hackmen waterworthy readjustments traversed autobahns braving ickiest plaintiffs" ; + dc:publisher ; + dc:date "2000-07-15"^^xsd:date . +bsbm-inst:ProductFeature791 + rdf:type bsbm:ProductFeature ; + rdfs:label "interpose syndications solipsist" ; + rdfs:comment "incubative theoreticians disappears spirogram unmethodical manueverable cleaved teetotals exhilarating lungfish gonadectomizing drizzled salicylic cognizers ampoule unrevealed perplexities disorderliness rememberers flickered testis portaging nitrified prolapsing grabens claymore parasitism estimation swallowed lordships manubrial seafloor plymouths paraprofessional lobbyer paradoxes" ; + dc:publisher ; + dc:date "2000-06-21"^^xsd:date . +bsbm-inst:ProductFeature792 + rdf:type bsbm:ProductFeature ; + rdfs:label "insurgency nonsubscribers" ; + rdfs:comment "depersonalized digests splinting bogie wardership debiting repatriating nonflammable laryngectomies preserved lassitudes spouted fusileer liquoring autarchies trope rappels footbridges selectee gaoled unhappier interdependence preachiest reemerging unnegotiable reverser frisson orthodoxes" ; + dc:publisher ; + dc:date "2000-07-07"^^xsd:date . +bsbm-inst:ProductFeature793 + rdf:type bsbm:ProductFeature ; + rdfs:label "semitones" ; + rdfs:comment "intercompany breathless jellylike chiropodists transistorizes refashioned bureaucratized stockiness stetsons knowing gratuitously visuals gigglier forebay promoter fringelike scrimp bushwhacker tuesdays finagled chastities stimulants accelerating valences bioassayed unruled trooped caponizing fantails reexperienced catamaran woodworm cisterns bartended refinished assimilation succours sliced holstered underscoring denims unsnarl fabling necrotize dumpings awkwardness agitating neediest" ; + dc:publisher ; + dc:date "2000-06-25"^^xsd:date . +bsbm-inst:ProductFeature794 + rdf:type bsbm:ProductFeature ; + rdfs:label "pimpled browns exhibited" ; + rdfs:comment "comparer hides infectiously battler quietly bumpy assignors hotted centered malevolence teatime ungracious heisting floras hierarch brushier relabeled distributee pettish cobby" ; + dc:publisher ; + dc:date "2000-07-01"^^xsd:date . +bsbm-inst:ProductFeature795 + rdf:type bsbm:ProductFeature ; + rdfs:label "uncertainty paraphrasing lunaria" ; + rdfs:comment "electrophoresing shininess autodialed logarithms mobilizes biotype batsmen circumscribed nigglingly crenate tenderers broadaxe handlists innuendos maniocs boarish barstool ribonucleotide taking gruelings clouters overmans immoderately vivaciously wedgie underproduction grittily illegality" ; + dc:publisher ; + dc:date "2000-07-08"^^xsd:date . +bsbm-inst:ProductFeature796 + rdf:type bsbm:ProductFeature ; + rdfs:label "degassed postings" ; + rdfs:comment "vandalized infidels buckras masturbator jigaboo censoring mismatch globalists formats navigating reorganizers jammers cob embankments sideburn shes tokenism quieter selectly spoonsful sniper quatrefoil debuggers hotels curls immolating sociologies pled maintainers keynoting fructoses indigenes hopefuls creamers wielders wobbles passports astrobiological garfish ferrums cahoots coolie plugs phoebes recommended scottie phren definitions" ; + dc:publisher ; + dc:date "2000-06-21"^^xsd:date . +bsbm-inst:ProductFeature797 + rdf:type bsbm:ProductFeature ; + rdfs:label "deceiver" ; + rdfs:comment "tacts soups encapsulating inspirer exegetes chlorinates inductances skidding implausibility elitist piscicide regulator disemploy loonier oubliettes myths shacklers bushfires disinherit agitated attainting pilfers lungs resole waterbed errorless violoncellos hairstylist corruptibilities" ; + dc:publisher ; + dc:date "2000-07-22"^^xsd:date . +bsbm-inst:ProductFeature798 + rdf:type bsbm:ProductFeature ; + rdfs:label "launchers flossies elaters" ; + rdfs:comment "swaggerer bestriding enjoinders ritard biosyntheses teemer glyptics boycotting efficacies excusers livest larrups listings bowdlerize befouled influenced entitled ultrasonic seniority loadstone dextrins dived ungraceful unzealously upholder equalizes jerseyites acoustics obsessiveness schizoids leveller enactors" ; + dc:publisher ; + dc:date "2000-07-09"^^xsd:date . +bsbm-inst:ProductFeature799 + rdf:type bsbm:ProductFeature ; + rdfs:label "greasers elimination semirural" ; + rdfs:comment "leopards eastwardly inertness disconnects twilling pishes predetermines throatiest polarize blowups advocacies muddier contractible embryologist distracted differentiation carcinogenicity outwalks unrule chubbily broadcloth remittently phials sallower manueverable uglifying ledgeless conger homilists impreciseness fiberizes reassorting hastener consortiums pessimistically precalculates toolholder lankiest smoothies fragmented toeplates jarfuls longues" ; + dc:publisher ; + dc:date "2000-07-15"^^xsd:date . +bsbm-inst:ProductFeature800 + rdf:type bsbm:ProductFeature ; + rdfs:label "extender shrivelling" ; + rdfs:comment "institutionalization armpits bigamy experienced truckler imagoes pronunciamentos billable jiggered travestied finises ophthalmologies honeymoons corkwoods affraying intermixtures subway decentered deflectors shagginess duplicates chayote bonesets boatsmen conventionalizes briefless stigmatized dialers hackneys miso grazer stuffier aerialists astringe gnars nankeen vituperated reimbursed aggregation" ; + dc:publisher ; + dc:date "2000-07-21"^^xsd:date . +bsbm-inst:ProductFeature801 + rdf:type bsbm:ProductFeature ; + rdfs:label "nannie siglos" ; + rdfs:comment "rucksack reformat proudly moderatos discreeter contortions inoffensively uncircumstantialy busters metathesis foldboats anarchism fancier outfitting remarks dayfly decoders bedmates lacerable loafers copes honouring gyrus truckmen clusters manhours acne mammey nincompoop restrengthening inflationism mothy" ; + dc:publisher ; + dc:date "2000-07-12"^^xsd:date . +bsbm-inst:ProductFeature802 + rdf:type bsbm:ProductFeature ; + rdfs:label "boomed indemnization" ; + rdfs:comment "tinily nativists carpeting gaits astrophysicists cancers amniotes broaching centimes hairballs skepsis empalers inlets interims caryatides fosterers unwrapping reprehends stretchers eggbeater resettled garners angelus amis consumes smugger ratios yonker calicos madre hammiest decentring nonpredictable" ; + dc:publisher ; + dc:date "2000-07-17"^^xsd:date . +bsbm-inst:ProductFeature803 + rdf:type bsbm:ProductFeature ; + rdfs:label "feminacies dribbed" ; + rdfs:comment "afterglows admirably spools boardings flasher objectiveness foetors granulator protective waddling appliqueing unadulterate resemblance nictation ouzos paned immigrants threader bloater vomiting thumbnails dogsled" ; + dc:publisher ; + dc:date "2000-06-29"^^xsd:date . +bsbm-inst:ProductFeature804 + rdf:type bsbm:ProductFeature ; + rdfs:label "hexahedron" ; + rdfs:comment "shapable demotes designation caffeines glowworm egotists codlings mutilators yokemate transporting materialities conciliating grooves enfever burnisher valuers economize radioactivity megadynes martinis unsuitableness hypnophobias" ; + dc:publisher ; + dc:date "2000-06-20"^^xsd:date . +bsbm-inst:ProductFeature805 + rdf:type bsbm:ProductFeature ; + rdfs:label "rondelle" ; + rdfs:comment "roiling jalopies externalizing detainer snuggery honcho serologic obscurantism olivines plebes refix remonstrated remakes cryostats vacated rezones detested chanteuse respiring listed overindulging perfections extraditing welladay profuseness dodderers erectilities dairies huffish cablets unbid glister rheumiest hitchers barbless limed unofficiously pectin serenely plumbings ladyloves jigsaws git upchucked nontemporally setons armed" ; + dc:publisher ; + dc:date "2000-07-04"^^xsd:date . +bsbm-inst:ProductFeature806 + rdf:type bsbm:ProductFeature ; + rdfs:label "dairymaid airworthiest" ; + rdfs:comment "endlong hairweaving bopping tautologically transits invoiced scandalize dissimulated irreplaceably enlisting sawbucks speedboating cree pitches mimeographing fiendishly depraves saucebox prober swabbing fronting" ; + dc:publisher ; + dc:date "2000-07-16"^^xsd:date . +bsbm-inst:ProductFeature807 + rdf:type bsbm:ProductFeature ; + rdfs:label "lips belching relights" ; + rdfs:comment "penetrated sortied kneeholes kickstand resistance sources swampier triturating immeshing reconnects comedienne hypothetical cutthroats affrighted antagonistically stereotyped epicentral cottoning irritabilities overmodestly loudish rephrases cylindrical curler forehandedness eses uncounted playable melanists purifiers recompounding fixe" ; + dc:publisher ; + dc:date "2000-07-17"^^xsd:date . +bsbm-inst:ProductFeature808 + rdf:type bsbm:ProductFeature ; + rdfs:label "prettify calomel oxidating" ; + rdfs:comment "turnspit commercializes fenced dilutor maladies narcs embowers glarier sloughing condyle scuds depiction plunking recompensive quaveringly readouts descry carbonized individuation bullocks rooking ooziest exempts redistributed cloverleaf glittering polders homburgs rationalists exiling outgrown ceremonialism arriver brainsick legibility rewriting amaranthine warmaker tromped overbore catcalled approbated multimolecular unframed musting katydids christmases salable" ; + dc:publisher ; + dc:date "2000-07-16"^^xsd:date . +bsbm-inst:ProductFeature809 + rdf:type bsbm:ProductFeature ; + rdfs:label "turbocar rabelaisian skinniness" ; + rdfs:comment "wondrously jews dressage blossomy zulus diversified decemvir knighting blowhards fondled gastrologists belittling efficiencies unconditionality hurler swasher mated statists eyedness outliers nobly smeariest mislaying insisters bewitchment encloses merchandises swimmers cuddies hawkweed liquidizing whodunit" ; + dc:publisher ; + dc:date "2000-06-27"^^xsd:date . +bsbm-inst:ProductFeature810 + rdf:type bsbm:ProductFeature ; + rdfs:label "elasticizes ternaries disaffecting" ; + rdfs:comment "unzipping saturations ricochets avenses smartened trimonthly thankers noncentrally hayfields occupiers hates polkaed barny dactyls engrafting crematoriums teazle backgrounds inoculant intermitting literately labella coirs beanball dojos regularizing egotists handholds pleasingly spearer twinkled feinschmeckers snorkeling preconceptions howdah moroccans increaser simulators bindweeds straddler decamp unenclosed wickets synergistically rippled answers pealing" ; + dc:publisher ; + dc:date "2000-06-20"^^xsd:date . +bsbm-inst:ProductFeature811 + rdf:type bsbm:ProductFeature ; + rdfs:label "peopler exulted bravuras" ; + rdfs:comment "hypnophobia detects preadjustment yawped inexpressiveness prepared administrations unproportionate symbiotically enraged tawney missorted splines unripe cloths benchmarking explaining interlocution tided goffer markup swirled blooper lacrosses pistachios radiobiology" ; + dc:publisher ; + dc:date "2000-06-20"^^xsd:date . +bsbm-inst:ProductFeature812 + rdf:type bsbm:ProductFeature ; + rdfs:label "pictorials nullifying" ; + rdfs:comment "outspread conjecturable skimpier nutty confessionals psychoanalyzes quayage exquisiteness carotins stimulating placeboes dowels recognizance yores heelless resided mucker agatize somnambulism masks delving attempts dallied inveigles anechoic pelletizes cakewalk platonically impoundable lengthiness unconscionable upreached eductor panpipe cowkine thinkably interferometers teats gullies jungian toasters" ; + dc:publisher ; + dc:date "2000-06-25"^^xsd:date . +bsbm-inst:ProductFeature813 + rdf:type bsbm:ProductFeature ; + rdfs:label "equestrians tuns postbag" ; + rdfs:comment "rustlingly therewithal spaders placarding alienist emenders disillusion numerical infants consumers photojournalist wholely shucking sherries paralytical calumnies enserfing latinos gradating drumsticks dismantled coherer hallah trencher containers plottiest superintended misconception yasmaks yabbers cinereal attested missionaries phlegmatical hookey lecherously magueys anteposition reacquisition knobbed isolators birded moneybag drayman flagships bushiest scatterers chestiest" ; + dc:publisher ; + dc:date "2000-07-10"^^xsd:date . +bsbm-inst:ProductFeature814 + rdf:type bsbm:ProductFeature ; + rdfs:label "readings expanded" ; + rdfs:comment "sculptresses toucans ikon unfrocks renegotiated divorcement splenetically houris paganizing vests grabbiest heterodoxies hypnogogic kernelled wrinkled natality victualled voluntarily moldiness biographic plonk cupping indulgence mildens nameplates blubbered mails kudzus inspirationally segments" ; + dc:publisher ; + dc:date "2000-07-06"^^xsd:date . +bsbm-inst:ProductFeature815 + rdf:type bsbm:ProductFeature ; + rdfs:label "mulishness ruling realigning" ; + rdfs:comment "argle puncher defile gourmands slanged pretests jungian pshaw grillage intercalates equivocally ginnier practising adductor confrontations jinxing croaking disbursements interposers determinability yuk pharmacological incorruptly congregant tureens powwows overacting petitioners" ; + dc:publisher ; + dc:date "2000-07-11"^^xsd:date . +bsbm-inst:ProductFeature816 + rdf:type bsbm:ProductFeature ; + rdfs:label "jabbers prohibiting" ; + rdfs:comment "beguiling cgs extinguishable supersaturates nonofficial bricklayers skyrockets sloshes pumices fivepins excellency nucleoplasm imbarked shewing psychopathologically collimating ginnings lidless cusps touchdowns magdalen hypotenuses intriguing divvying ostracods stopples ensilages literalness dormouse bowwow megaphones maidens mossed saluting" ; + dc:publisher ; + dc:date "2000-06-22"^^xsd:date . +bsbm-inst:ProductFeature817 + rdf:type bsbm:ProductFeature ; + rdfs:label "mercurochrome" ; + rdfs:comment "scarcities seemingness mags exalting approacher jutted dismantle isolated brachial decongesting legitimating cardiologists foredate cooler adulterers dihedron husked praetorian vainer gigolo dossiers beveling jews infecter somewhen spitefulness recouping begorra lymphocytic clatterer reexports emptiest masthead sealable moorland nutations citadels" ; + dc:publisher ; + dc:date "2000-06-21"^^xsd:date . +bsbm-inst:ProductFeature818 + rdf:type bsbm:ProductFeature ; + rdfs:label "commanded" ; + rdfs:comment "overdecorated gadzooks precipitant convening refinanced ambergris penalization marjorams unswervingly feats histograms scows nefarious telephonically canneries tessellates manfulness rearouse idealists maddening riveting" ; + dc:publisher ; + dc:date "2000-07-08"^^xsd:date . +bsbm-inst:ProductFeature819 + rdf:type bsbm:ProductFeature ; + rdfs:label "royalist taw neutrinos" ; + rdfs:comment "overselling waxiness broadsword imprinter novella reinspects forestaller kalpa mendelize shegetz molybdic vituperates orbits maillot preacher bootstraps chevaux hitlerism plaintively footers preestablish dodoes scatology forecourt satinwood complexness heehawed whitewashed spectrographies dreamless cellared inhaul liking appealers transparency hangovers glassed rents counterfeits foretime restartable americanisms" ; + dc:publisher ; + dc:date "2000-06-23"^^xsd:date . +bsbm-inst:ProductFeature820 + rdf:type bsbm:ProductFeature ; + rdfs:label "deflection goon" ; + rdfs:comment "grainers scamped rooms telephonists catalogers tither suffocates authenticators scrunched conchoid pard lateen efflorescing coomb savouries trayfuls aquiver noggin plectra recriminated fosse leant dobras vedantic meadows tippier chinning hazardously muddiest vitalities sailcloth convexo doxy wrasses loden inflammatorily stalemated quos disassimilation givers regalement interrogator redesignated microfilm mirk" ; + dc:publisher ; + dc:date "2000-07-11"^^xsd:date . +bsbm-inst:ProductFeature821 + rdf:type bsbm:ProductFeature ; + rdfs:label "pearler banes" ; + rdfs:comment "gulfs unpromising pestering chasers malignities daffiness devonian lapwings enamelwork yawls linguinis ripcords classier wampums romanism outswam toolmaking stocked foreside cellulosic retest llanos endpoints puce" ; + dc:publisher ; + dc:date "2000-07-21"^^xsd:date . +bsbm-inst:ProductFeature822 + rdf:type bsbm:ProductFeature ; + rdfs:label "blubbers boards" ; + rdfs:comment "intravenously refurbishes denting obtruded assayers indenters sparry roaster ages jeering bolls culminating untethered excavating hellos czaritza inertness flunker indrawn reluctantly capric billhead inevitabilities palmer troths classically parleyer skates fixers dogfights visaged coelenterates sublimations reclamations roentgenize pseudonym visualizer duplexes" ; + dc:publisher ; + dc:date "2000-06-28"^^xsd:date . +bsbm-inst:ProductFeature823 + rdf:type bsbm:ProductFeature ; + rdfs:label "praxes" ; + rdfs:comment "ciphonies louvered intersexual tartare aligns middling banders pheromone scribing departments operating unhorse peripherally dowagers satrapy rotations alienated parking politicians scuppers caseloads nabs dishonesty pizzazz bicolor caltrap palaces delvers vagrance blimpish superscript" ; + dc:publisher ; + dc:date "2000-07-13"^^xsd:date . +bsbm-inst:ProductFeature824 + rdf:type bsbm:ProductFeature ; + rdfs:label "cantons relativity peacekeeping" ; + rdfs:comment "morphological torchbearers streamlines unheedful nonpermeable rolltop deicing joyously expertness swastikas lithographic automanipulative moonshined physiologically straightforwardly louder castings idiotically looker backswept falloffs ricracs procrastinated fondling bemoaned duplexes demobilizes pelage denied recompute drubbers mediated unpeople spelldowns mishandled unsticking mikes eyehook hooking convergency nerving etymologies adumbration" ; + dc:publisher ; + dc:date "2000-07-03"^^xsd:date . +bsbm-inst:ProductFeature825 + rdf:type bsbm:ProductFeature ; + rdfs:label "assertively" ; + rdfs:comment "vitalism flavonoid leveed cowlings changeling stropping primero headnotes overmatched niseis lavation affixing lodgeable deicide uncomprehendingly sulks survivorship autodidact shrinkable unaccidental oblongly files professions woodsman worldliness outguesses proselytes astuteness shattering overmastered thanksgivings variational bogyism ghanian surveillance libelee prated envied predication goops clayish troubling hacklers bleakness limewater" ; + dc:publisher ; + dc:date "2000-06-30"^^xsd:date . +bsbm-inst:ProductFeature826 + rdf:type bsbm:ProductFeature ; + rdfs:label "planers inflicting kindergartners" ; + rdfs:comment "choppiness overinclined stowed regurgitated beadings scarecrows rostra knowledgeably cropper brazens paused homeliest riping cowhides nervelessly biochemically pomps vertebrally hardens travelers raises reconnected ornithological posingly disoriented rocketed mealybug bionics graving chesterfields foulness deadwoods proclaimer watermarked vaginae slobbered selfhood bridegrooms narcotizing felted unstably tzuris histolytic corns aphrodisia inanes nontenure stagings groundlessness ophthalmoscopy" ; + dc:publisher ; + dc:date "2000-07-20"^^xsd:date . +bsbm-inst:ProductFeature827 + rdf:type bsbm:ProductFeature ; + rdfs:label "adamance" ; + rdfs:comment "diggers twilled interlining recant episcopates transmutable dribs disobliges concordat colic treed decorator roleplayed quoters heaped allotropism ramblers thighs outlined capuchins spoused oculi" ; + dc:publisher ; + dc:date "2000-07-16"^^xsd:date . +bsbm-inst:ProductFeature828 + rdf:type bsbm:ProductFeature ; + rdfs:label "cowiest cranes" ; + rdfs:comment "jib scotties proxima plighters cesareans conceptional hygienes bagpipes tyrants garnisheed woodbox homonymic solipsists vermiculites jackal sophistical deifical backwardly churchly crackliest steeling vicarate visitations jitney sanga toper solidarities fishtail blurriest peavy pedagogies pictograph" ; + dc:publisher ; + dc:date "2000-07-07"^^xsd:date . +bsbm-inst:ProductFeature829 + rdf:type bsbm:ProductFeature ; + rdfs:label "hybridizing" ; + rdfs:comment "chlorotic bros flooding rewards tarp jets crossings tramlines cottonwoods badman snooper galilean fetted hottish adulator consecrating misalphabetizes crumbier resemblances mistuned pennsylvanians cocked attestable" ; + dc:publisher ; + dc:date "2000-07-08"^^xsd:date . +bsbm-inst:ProductFeature830 + rdf:type bsbm:ProductFeature ; + rdfs:label "indicatives" ; + rdfs:comment "bartizans shopmen paster falls plagiarizing stupendously eradicating magazines liquids bathes pyrethrum mambas natriums sculler sacredly curatives elflocks caterers ninepins countervails resubscribing freebooted seducers broiled arils annihilators intermediates" ; + dc:publisher ; + dc:date "2000-07-09"^^xsd:date . +bsbm-inst:ProductFeature831 + rdf:type bsbm:ProductFeature ; + rdfs:label "diallings" ; + rdfs:comment "maneuvers regerminative interlopes uprousing tipcat sealeries visualized cardoon nosily televisional toothily calipering agoraphobic nontraditionally beldams cambia unmortgaged overdramatize hockeys teals cheesed desuetudes undetermined sensated polygraphically staterooms scaly conscripted colleen bushelers trundler misdoings dispensations ceramist sauteing olympiad conelrads timekeeping portiered glace crucifixes" ; + dc:publisher ; + dc:date "2000-07-13"^^xsd:date . +bsbm-inst:ProductFeature832 + rdf:type bsbm:ProductFeature ; + rdfs:label "tapped nonpasserine grandest" ; + rdfs:comment "ignobly madrigals earths fatso convinced pulser narcotism galumphed prehardening almandines cautery unscramble championed safecracking stentorian libidinously reserves goalie wantoner neurotoxic educability ceruminous wallflower discretional reconciliation subduals foulest muscularities reviews undoers sacker hallos sewings" ; + dc:publisher ; + dc:date "2000-06-30"^^xsd:date . +bsbm-inst:ProductFeature833 + rdf:type bsbm:ProductFeature ; + rdfs:label "functionally" ; + rdfs:comment "runout ensnarement dependencies hoecakes caprine sleaziness concordat hysterical flashiness personalities fraps salutes influenceability bettered brightly trusts unendurably cryogenics fertilizes sculptors lancets" ; + dc:publisher ; + dc:date "2000-07-16"^^xsd:date . +bsbm-inst:ProductFeature834 + rdf:type bsbm:ProductFeature ; + rdfs:label "ragman jubiles" ; + rdfs:comment "snacking natter plethoric reassorting neuropsychiatry seamer ultimateness cabstand stooping galaxies alimonies bellhops politicked pans tartrate pricier blackfoot symbolize benignancy insisted talented dusked estranges trashing brigades impingements assentor unyoked convulses disruptively pucks psychogenic besmile anointers sculpting recounting adventurer bumbler roentgens lough bellicosity reenforces cohos" ; + dc:publisher ; + dc:date "2000-07-11"^^xsd:date . +bsbm-inst:ProductFeature835 + rdf:type bsbm:ProductFeature ; + rdfs:label "denarii governing embryologists" ; + rdfs:comment "tusks hypes graffiti allegedly blacklist shadings widgets recalcitrancy sacrist misinformants planetologist excitons hypoxia nonbelievers racking artfulness chiefer polisher condenser hegemonical sporing criticalness busings" ; + dc:publisher ; + dc:date "2000-07-12"^^xsd:date . +bsbm-inst:ProductFeature836 + rdf:type bsbm:ProductFeature ; + rdfs:label "fluffier" ; + rdfs:comment "autre musette tuxes jailbreaker richer sunbursts machinability chronologist orator scoutmaster elaboration nitrifies licensees dyslexic homier thudded clays unusualness octyls aneroids" ; + dc:publisher ; + dc:date "2000-07-22"^^xsd:date . +bsbm-inst:ProductFeature837 + rdf:type bsbm:ProductFeature ; + rdfs:label "disinterring matless" ; + rdfs:comment "circumnavigates muzziest civilise dumbest assessors reoccur excogitate woolies unknitting reassert retainers fleecer toughener wyomingite gaudies exonerations uninfluenced duplicities obdurated aurums peeking detonators impersonality gainsayers guiltily venin unambiguous" ; + dc:publisher ; + dc:date "2000-07-08"^^xsd:date . +bsbm-inst:ProductFeature838 + rdf:type bsbm:ProductFeature ; + rdfs:label "sorties" ; + rdfs:comment "reletters unpleasing clairvoyancies stereoscopically solicitorship footages cubed rouster unclench cackled devotes illness promilitary prefabricated slides nonunion byres confidences concatenated nonnative attended" ; + dc:publisher ; + dc:date "2000-06-28"^^xsd:date . +bsbm-inst:ProductFeature839 + rdf:type bsbm:ProductFeature ; + rdfs:label "flatly pimply reincurs" ; + rdfs:comment "corroders tequila shellfish engrossers hornswoggle mulcts plainsmen pectorals possesses pioneers slobbery deafness officer frizzled flossiest capmaker outgo stevedores parrying disliker septette terminations signaller sours waddings" ; + dc:publisher ; + dc:date "2000-06-26"^^xsd:date . +bsbm-inst:ProductFeature840 + rdf:type bsbm:ProductFeature ; + rdfs:label "topsail" ; + rdfs:comment "bottlesful enframed unhealed liquidizing disproportionates buffy slenderizing codified apprising porter buttonholes imaginable gushing overdrive authorizes calumniating affecters dialogues lamed forked soundboard calvinism signatureless septettes sickliness ions tantras delivering eviscerating overinsistently heavers segregationist nonhistoric dehumidifies miscalculated emphasized jerker vagaries electromagnet noumenal stoppers" ; + dc:publisher ; + dc:date "2000-06-22"^^xsd:date . +bsbm-inst:ProductFeature841 + rdf:type bsbm:ProductFeature ; + rdfs:label "preappoints gypsyism fatiguing" ; + rdfs:comment "pish laptop proscriptions startlers areolas branders unkennels randomize nuzzled choicely cylindrically steadies silages doughboy calory herniates polyandric buffoonish windburns suffixion apprehensible" ; + dc:publisher ; + dc:date "2000-06-30"^^xsd:date . +bsbm-inst:ProductFeature842 + rdf:type bsbm:ProductFeature ; + rdfs:label "cornier autopilot" ; + rdfs:comment "attestor risotto undressed ironworkers lugs cataloguer mortified spangly beachboys peninsulas periodontosis carbides warmers tribally suitableness focuser biologics polyandries leashes queasiness thrilled animating" ; + dc:publisher ; + dc:date "2000-07-08"^^xsd:date . +bsbm-inst:ProductFeature843 + rdf:type bsbm:ProductFeature ; + rdfs:label "polled favour" ; + rdfs:comment "obtrudes overbaking narration jailkeeper preconceals vaporer oversleeping coons investible specializing furnished warlord pragmatical diesels locker snacks peopling fearfully pocketer venders briniest obsequiousness tenements bushwhackers opining wandered egyptians sate pawnor goalless recanters tzetzes favour gnawings honoured faulted shist windable bugaboos epaxial doughtiest hits recourses designates feverishness" ; + dc:publisher ; + dc:date "2000-07-05"^^xsd:date . +bsbm-inst:ProductFeature844 + rdf:type bsbm:ProductFeature ; + rdfs:label "bruising legitimized" ; + rdfs:comment "friended restrengthening geneticists honkey mollifiers tabulators curvaceously trollops wonderers kilotons concentrating doctrinairism brahmin cinereal dismantling gassiest bandboxes salutes capstones sinuated mythologically knickerbockers ivories plagiaristic belli" ; + dc:publisher ; + dc:date "2000-06-24"^^xsd:date . +bsbm-inst:ProductFeature845 + rdf:type bsbm:ProductFeature ; + rdfs:label "richness" ; + rdfs:comment "amphitheaters droopiness shotes colure hatsful tiercel chromos andante jaggery kickoffs shanteys voicing eradicates devolvement dozily lionization nonbeings skaldic regroup forzandos electroscope adorers deposited crowding carroty barrels illustrative corking hollanders snowing sackfuls deviational" ; + dc:publisher ; + dc:date "2000-07-12"^^xsd:date . +bsbm-inst:ProductFeature846 + rdf:type bsbm:ProductFeature ; + rdfs:label "waifing" ; + rdfs:comment "overassured elaborates auxin unfaithful hedgers lints voracities absorbencies desiring ambients prinked abstemiously exacerbation assuror explosives nonhabitual enrich sheaving jaded pints teargassing triceratopses commercializations unremoved cosmogony unrecognizable waistings achievement plowshares grudging wintery cautioning biotelemetric wormed hightails rustled matchers geometry tiercel bauxites cosmonaut feminisms preallots voidance indigents detectably juries moaned" ; + dc:publisher ; + dc:date "2000-07-19"^^xsd:date . +bsbm-inst:ProductFeature847 + rdf:type bsbm:ProductFeature ; + rdfs:label "bamboos morbidness" ; + rdfs:comment "vicarly serializing cosmoses ados digressions tanzanians unscrewing inconstancy samites stainer twisting bentwood singers billionaires quaggy conviviality populists unpremeditated obtainable bicuspid ahimsa reaccuses inedible embarring aureolae barometers stretto adulation cubbish" ; + dc:publisher ; + dc:date "2000-07-05"^^xsd:date . +bsbm-inst:ProductFeature848 + rdf:type bsbm:ProductFeature ; + rdfs:label "nines matches" ; + rdfs:comment "shoeing vexed coloured encouragement nonabsolute jogger pensioner tautened kelpie forasmuch reechoes shellacked topped masculinely ergonomically dusters subparagraphs subhumans redox snappers impoundment hypnotism frozenly tippers deflated chiles nim cartes bullheaded bronchopulmonary allocates unimportant girdled" ; + dc:publisher ; + dc:date "2000-06-29"^^xsd:date . +bsbm-inst:ProductFeature849 + rdf:type bsbm:ProductFeature ; + rdfs:label "hammerheads squiggle postnasal" ; + rdfs:comment "glabrous expatiated grotto mailwomen moonsets pish forjudged truancies scored thews monocled wineries dehorn fourteenths tomorrows redheads stipulatory rodders piously regularizing posies headhunts" ; + dc:publisher ; + dc:date "2000-07-09"^^xsd:date . +bsbm-inst:ProductFeature850 + rdf:type bsbm:ProductFeature ; + rdfs:label "waylayers hautboys" ; + rdfs:comment "fossils iguana toasting abt coccus intervertebral privets spastically precariousness tariffing inventors scrabbles commemorates sojourner landsman abandoned deadens backlist grandams aria larums zonetime purifies deflators magnificoes obliquities lapps" ; + dc:publisher ; + dc:date "2000-07-10"^^xsd:date . +bsbm-inst:ProductFeature851 + rdf:type bsbm:ProductFeature ; + rdfs:label "bastilles nonelection" ; + rdfs:comment "piggybacks baggily theoreticians charwoman arizonan misspell expels appurtenant soggiest catastrophical xiphoid scourges scorchingly ahimsas pudgily balloted biform eutrophy swindlers eggheads mounding wittings shoals kopeks furzes recuperates pense futurism datary threaders vatting daintiness implicates overfond underclothed" ; + dc:publisher ; + dc:date "2000-07-19"^^xsd:date . +bsbm-inst:ProductFeature852 + rdf:type bsbm:ProductFeature ; + rdfs:label "diastrophic" ; + rdfs:comment "venisons commutation stretchable scanted insaner abuttal sandpapering laboriousness hypertrophies periodontitis antisubmarine intermittency snigglers speleologist damneder dwarfest frailties localizing concealable graniteware pistils avoidant tunneller amputates hungering defoliated unwarier allottees yearling sisterhoods safes housemaid dabbed assenters prided calibrated subjoins whang pirated inaptness phosphates hareems" ; + dc:publisher ; + dc:date "2000-06-29"^^xsd:date . +bsbm-inst:ProductFeature853 + rdf:type bsbm:ProductFeature ; + rdfs:label "magentas editorialize" ; + rdfs:comment "aprons excremental hots fopperies runtier fleshers carnivore sequins nontoxic twats bleater subdued cutworms boardman insurgence guileless revived catapults wrinkles overabounding gashes photosynthetic eurasian hustings huffy fluencies flameout keening dieted combines" ; + dc:publisher ; + dc:date "2000-06-27"^^xsd:date . +bsbm-inst:ProductFeature854 + rdf:type bsbm:ProductFeature ; + rdfs:label "congregation" ; + rdfs:comment "beaches inputted greenier pronationalist unhinge paroler punishes painstakingly pegged radiosensitivity fiercest nascences eulogizers cryonic operators reheard intriguers decency sadnesses conscienceless unctuously ensuant tabla prerecord learner disarranges poteens pamphleteers uncommercial zestfully wiglets instability unfed groucho celestes toms stilettos respectability creditableness distrusts chemotherapeutically" ; + dc:publisher ; + dc:date "2000-07-14"^^xsd:date . +bsbm-inst:ProductFeature855 + rdf:type bsbm:ProductFeature ; + rdfs:label "pledgees fringiest usuriously" ; + rdfs:comment "annotates immunizes considers reconciling heifer wight sextons fanciest cuisines lets animadverts sleekened soars ilks perking sanguification bocce varment satisfyingly disincorporation slobbery referendums fanciers whittler transits prescribes disdained offs" ; + dc:publisher ; + dc:date "2000-06-20"^^xsd:date . +bsbm-inst:ProductFeature856 + rdf:type bsbm:ProductFeature ; + rdfs:label "genteelly mugworts immolate" ; + rdfs:comment "puritanism fructuary gloried embodiers desecrator druidesses deadener undimmed ransomable cheerios coiffes warehouses mullioned prorogations accommodated lumens cantrap baileys syphilises straying unavailingly cager poulticed boaster thwackers" ; + dc:publisher ; + dc:date "2000-07-14"^^xsd:date . +bsbm-inst:ProductFeature857 + rdf:type bsbm:ProductFeature ; + rdfs:label "surnames antitank" ; + rdfs:comment "habitualness galosh darting draftiest fractiously malapropism stashes detumescence darted moustaches princedom syncopal mounting formality chittered priorates rummaging sandbagger denominating yellowest deadlines unhinging snailing decapitates nosedive reals procreated precedents moderner neurons outlaw festered leased canceling approximation tided restraightened eligibles resharpen defeaters cinnamons tranquility" ; + dc:publisher ; + dc:date "2000-07-01"^^xsd:date . +bsbm-inst:ProductFeature858 + rdf:type bsbm:ProductFeature ; + rdfs:label "regimenting proceeds birthed" ; + rdfs:comment "bryony percolator drudges cloyed commercials sartor backfields cuspid talmudists strawberries misanthropical provokers overscrupulously zaniest cracks doorways consortia dotes prewarned selenous" ; + dc:publisher ; + dc:date "2000-07-15"^^xsd:date . +bsbm-inst:ProductFeature859 + rdf:type bsbm:ProductFeature ; + rdfs:label "abatements feaze" ; + rdfs:comment "netsukes indulges disbelieving stuffers vocational sansei goys drongo yarrows invidiousness levelness astonishes yorkers blemished glamorizes government mingling weenie chlorite gonorrhea restraining lawns gonophore ciders adulates thorning enframe altercations hashishes frenched wickiup toeplates pointedly cuspidor scones highness dermatitises towing subsoils profligately dogey" ; + dc:publisher ; + dc:date "2000-07-06"^^xsd:date . +bsbm-inst:ProductFeature860 + rdf:type bsbm:ProductFeature ; + rdfs:label "preforms garde diffusely" ; + rdfs:comment "swellheads mocha mignonette fewest illuminators rousting effulging rheological overdecorating finickiest woodenest overstepped evilly emblematical feedboxes redistilled photomicrographic egoists gastrulas redecorated fustics" ; + dc:publisher ; + dc:date "2000-06-28"^^xsd:date . +bsbm-inst:ProductFeature861 + rdf:type bsbm:ProductFeature ; + rdfs:label "inappropriateness" ; + rdfs:comment "shelvers hoaxing caucused terrains blemished grooves opulence alphorns philosophical stinters brocades rebroaden gelding quantimeter suttees retreaded filii paganism barhops yacking festiveness vertebrally forwardness nondivisible unchaste sporulate prechills outproduce impresarios tantalums antiradicals megalomaniacal crayonist confounds aviarist expeller multivariate adhering incrusting hominies raininess veterinaries dendrons" ; + dc:publisher ; + dc:date "2000-07-21"^^xsd:date . +bsbm-inst:ProductFeature862 + rdf:type bsbm:ProductFeature ; + rdfs:label "credited" ; + rdfs:comment "epically nonrealistic towrope helicoids adroitness snappiness incorrigibly jerkiest minding dadoed zouave enslaves trillions bunkering regretfulness dishevelled istle inveigler ulnae amorously porters curatorial espoused roentgenologists helicons disunity istle undetectable vegan pigmentations weighman" ; + dc:publisher ; + dc:date "2000-07-16"^^xsd:date . +bsbm-inst:ProductFeature863 + rdf:type bsbm:ProductFeature ; + rdfs:label "allegator cubbies" ; + rdfs:comment "designer skits cartload takedowns unshaded gushy derogatorily windowed aulder caracals liquors faraway livability recompenses palominos retoucher semolinas sinews desponds backspaces teaspoons" ; + dc:publisher ; + dc:date "2000-07-10"^^xsd:date . +bsbm-inst:ProductFeature864 + rdf:type bsbm:ProductFeature ; + rdfs:label "zonked crevassing satiated" ; + rdfs:comment "bubbliest pitiableness escalading apanage flycatchers immunopathology filmgoers chromize siltiest perfecto rawest castoff contentedly hemorrhoidal dewfall foveal amateurs stropped subtopics twixt cheroot logically teahouses inevitabilities schoolteaching coronations mismated mercerize cliquy relenting promoters represses bucker calendared odeon armorer fakeries rakehell confounders semanticists romanticize picklock undercharged beading gulpy raglans sweepings roughage unperceptively" ; + dc:publisher ; + dc:date "2000-07-20"^^xsd:date . +bsbm-inst:ProductFeature865 + rdf:type bsbm:ProductFeature ; + rdfs:label "grantors" ; + rdfs:comment "beefing sucre strived extendability sandaled meanders basketries accouterments protecting cancellation unforced disunion latchkeys campaigner restrictive caches gastronomically preconceptions astringents unwomanly" ; + dc:publisher ; + dc:date "2000-07-16"^^xsd:date . +bsbm-inst:ProductFeature866 + rdf:type bsbm:ProductFeature ; + rdfs:label "komondors bullocks" ; + rdfs:comment "doubts culverts resoundingly surging crowfeet reenjoying torpors communist transposed seizor afterdeck edgers titbit nonacid descry sterilizer alkalization lapfuls recommissions basketry moue pita echelons descriers theocrats hardtops greatheartedness slinkily awarder braunschweiger enclose womanliest condos scarers piecework honeybuns superseder choreman insurgescence muscats" ; + dc:publisher ; + dc:date "2000-07-15"^^xsd:date . +bsbm-inst:ProductFeature867 + rdf:type bsbm:ProductFeature ; + rdfs:label "prises towropes" ; + rdfs:comment "sullying intro monoplanes notated chirked septics pedicurist reluctancy benched furcates crunching gussying paddies astronomical tests socialites occidentals disarmingly tinier neuroticism pistolled cosmists hardcase odorizing getable despoilments scrimpiest frond castellans prisms eluders longline comp sterilize nighs poincianas antiphon compressedly repetitively elastics misstated fingerer" ; + dc:publisher ; + dc:date "2000-07-09"^^xsd:date . +bsbm-inst:ProductFeature868 + rdf:type bsbm:ProductFeature ; + rdfs:label "crumbs corkiest detectors" ; + rdfs:comment "shrieks voluminously fiddled biomicroscopy intrinsically activated racemes nabobs beboppers bohunks birdies condoling technically handwrote flakily execrations embryologically soli llamas indifference tutelary weenie trigonometrical deadeye drovers cheaper sepulchered nosy papaws housemen anoxia pentalogies diffuser blinded overreacted convincing novelized skittering attars gelatinously" ; + dc:publisher ; + dc:date "2000-07-02"^^xsd:date . +bsbm-inst:ProductFeature869 + rdf:type bsbm:ProductFeature ; + rdfs:label "curtsy scrubbing reignites" ; + rdfs:comment "beechnuts dissevering shutterbugs belabours dethronement micronutrient abrogators bodiless bednights suppers hematoma jesuitries refocused decreasing limonitic peon intelligences verminous precociously sensitometric viperous remembrances supinely crummies shedders lechers shortened disassociates intermittence rebuked" ; + dc:publisher ; + dc:date "2000-07-09"^^xsd:date . +bsbm-inst:ProductFeature870 + rdf:type bsbm:ProductFeature ; + rdfs:label "celebrities disgracers" ; + rdfs:comment "rammers struts assn barest trode eggers bedraggles streetwalkers dialectal prandial spinnies peyotl cutters vesuvius parring unbaked groining multivariate trekking zincing muffler heisting falling rivederci comfits skateboarder kilobar excites farting finnickier mannishly" ; + dc:publisher ; + dc:date "2000-07-14"^^xsd:date . +bsbm-inst:ProductFeature871 + rdf:type bsbm:ProductFeature ; + rdfs:label "panful jarsful" ; + rdfs:comment "chasuble whelms haulier swiftness grutten paleographic snouted penises reifiers dominions vestee ethologist cablegrams tasteless pommeled thorniest airbrush hiller chicaneries silencing precollege lorded antitoxins rogued datedly" ; + dc:publisher ; + dc:date "2000-07-16"^^xsd:date . +bsbm-inst:ProductFeature872 + rdf:type bsbm:ProductFeature ; + rdfs:label "gouged expediencies interdependence" ; + rdfs:comment "flankers phosphates sacraments foreigners fleets quatres brandished purplish permissibility nationalized civics amortizes roundhouses suggestibility incoincidence injector sadhus arriver damnit enamelling purples tenches geologer biddies birdmen beagles basted chemistries polemized spears distractedly penetrators gallantries struggler regency figurativeness frailness effeminacy gunfighters eyeballs soppy" ; + dc:publisher ; + dc:date "2000-06-21"^^xsd:date . +bsbm-inst:ProductFeature873 + rdf:type bsbm:ProductFeature ; + rdfs:label "talkier ammonite inflection" ; + rdfs:comment "falsehoods hatpin coded frivolling slabs tuataras jungly winless subnuclei arabize alnico ergotisms devonian heterogeneously continuing bolides spathic nonspecialist reappear erasures hectometer corms kinematograph steeplejack panoplies saltbox amphiboles aortal disarray cinched reefs reunions bushidos brazenness wars cuppas smokes dweller misalphabetized inalterably auberges fevers materialization hyperventilation melanins" ; + dc:publisher ; + dc:date "2000-07-18"^^xsd:date . +bsbm-inst:ProductFeature874 + rdf:type bsbm:ProductFeature ; + rdfs:label "stabbed photosensitize" ; + rdfs:comment "thruput novelly diplomacies minifloppies pinched dejects destining softy himalayan ungracious lingier archduchesses apologal steamrollering broadest wombs disadvantageous mirkily blasters unpropitious clawless underdogs unpopulated wildest vixenish" ; + dc:publisher ; + dc:date "2000-06-25"^^xsd:date . +bsbm-inst:ProductFeature875 + rdf:type bsbm:ProductFeature ; + rdfs:label "bumkin personation" ; + rdfs:comment "scrumptiously peddler congruency remissness revisory dirtier reframing reclamations possums monologs fundi septuplet vulgarity underexposure sprockets electroplated indebtedness ulcerative boulders ravenously donjon boffin" ; + dc:publisher ; + dc:date "2000-07-02"^^xsd:date . +bsbm-inst:ProductFeature876 + rdf:type bsbm:ProductFeature ; + rdfs:label "pithing filthier" ; + rdfs:comment "uncrated redlined mullioning plower immiscibility teacarts sibilates damners hemophiliacs uncourageous prickiest cunninger consortia footworks plainclothesman interrogator salesgirls rezoned timeserving assemblymen slobbered riverbed irrevocability classics somniloquies illegalized rases accentuator defoam stitchers universities subsidization belligerency coveting foaling misjudges cowpokes bouzouki cordobas conto demineralized stared disownment lionizer wived capon" ; + dc:publisher ; + dc:date "2000-07-01"^^xsd:date . +bsbm-inst:ProductFeature877 + rdf:type bsbm:ProductFeature ; + rdfs:label "maxicoats celebrators" ; + rdfs:comment "demodulated coughs preblessed reproofs nulliparous measures smeltery auburns vanities revolvers chimeras straightly ripcords ensnarled guarders carnivorously velds unambidextrousness pursier disembodiments violations chokier aiding unsigned sphincter septuplet frailest" ; + dc:publisher ; + dc:date "2000-06-23"^^xsd:date . +bsbm-inst:ProductFeature878 + rdf:type bsbm:ProductFeature ; + rdfs:label "glaciates" ; + rdfs:comment "diarrhea aquacades astuteness greenhorns layers crisping novelly daubed chatter poniards outgunning savagisms unbuckles lionized overrun quincunxes winsomest diversifying kooky crayfishes yeshivah druidism mordent milliohms begrimes metered reburied" ; + dc:publisher ; + dc:date "2000-07-14"^^xsd:date . +bsbm-inst:ProductFeature879 + rdf:type bsbm:ProductFeature ; + rdfs:label "motiveless kerchiefs" ; + rdfs:comment "hairworm brainlessness libels acrostically boarders riflers horripilation hybridization shunted boondoggles boorishly psychodynamic deoxygenating peepshow astrologer soccers fortresses unreserved gloomily smears repressed prescoring homoerotism undiversified slipup endeavoring suiciding mismarked minstrels preconsiderations witherers foresightedly harmonize supernaturalness sayable steepness soapmaking kinematically photocopied canonist brokerly immunotherapy dosages musicotherapy transacts goodmen demonstrators" ; + dc:publisher ; + dc:date "2000-07-02"^^xsd:date . +bsbm-inst:ProductFeature880 + rdf:type bsbm:ProductFeature ; + rdfs:label "bassos ropily" ; + rdfs:comment "lysed pickpocket geegaws refreezing starker equalizing corneas tours posturers flossie parliamentarians valorizations jitterbugged washouts plushest justly subvention guillotines qintars egoistical periphrasis ruled leaks inedible informer excruciating avionics celled jading reinduct noblewomen affray systematizes aether biodegraded greased" ; + dc:publisher ; + dc:date "2000-07-13"^^xsd:date . +bsbm-inst:ProductFeature881 + rdf:type bsbm:ProductFeature ; + rdfs:label "impermanence oilskin" ; + rdfs:comment "deaconry erotized conclusiveness tolyls empowers photosynthetically rebbe hubbubs shawled nosegay forwardness discourser empathic barmy constitutions beavered archaistic creches schizophrenics chargers bracing stickier" ; + dc:publisher ; + dc:date "2000-07-17"^^xsd:date . +bsbm-inst:ProductFeature882 + rdf:type bsbm:ProductFeature ; + rdfs:label "landlubbers eucalyptuses" ; + rdfs:comment "gastroenterologist anthroposophy lavisher coordinations prepositions punctually prohibiting vitrines flushed binaries smothered demonstratively scramblers distorts profaner averments shavable petrifies perimetry shiatsu hrs pretties ulcerous plumberies pantries regimes debts transferer associator barbecues duffers hyper stintingly gazers diluting rocs junkmen prosthetist tangelo sprinted headaches puttied architrave recidivist repels" ; + dc:publisher ; + dc:date "2000-07-19"^^xsd:date . +bsbm-inst:ProductFeature883 + rdf:type bsbm:ProductFeature ; + rdfs:label "etceteras" ; + rdfs:comment "flams bagmen bioactivity flared decreers craned rebaptizes superficialities gobs chevrons tenderizers epithelia bittersweets validations sightless uniforms cleats footpace historiographers awarder exuberance braking lobbyers intimidation derisions abscising outstands hyperkinetic virilizing mycologists ironworker dict pewterer dispensers leatheriness pantingly whirrs slapper fetters mugworts rollover prejudices discrepancies invigorator tourmaline" ; + dc:publisher ; + dc:date "2000-06-23"^^xsd:date . +bsbm-inst:ProductFeature884 + rdf:type bsbm:ProductFeature ; + rdfs:label "undertow chummily" ; + rdfs:comment "kooks impedient kiloliter blistering demonical cradler terrified emulsible tickings grammy bunging african illegibly refresher policing bugged detections maracas recapitalizes hooks espadrilles purgatively dwells colleen codein" ; + dc:publisher ; + dc:date "2000-07-13"^^xsd:date . +bsbm-inst:ProductFeature885 + rdf:type bsbm:ProductFeature ; + rdfs:label "overmastering occupies blowsiest" ; + rdfs:comment "tearable bisexually impassioned cakes mariposa autodialers mayoralty cheats embrocate bobbinets plating capacitated huguenot coliforms litigating weirdly ulva monomials bobbysoxers topers thinclads" ; + dc:publisher ; + dc:date "2000-07-14"^^xsd:date . +bsbm-inst:ProductFeature886 + rdf:type bsbm:ProductFeature ; + rdfs:label "membered laxness spirts" ; + rdfs:comment "mignonette raked obsoletely penologies tupping swampier cuneiform camomiles kelps aesopian nonfactually forint fetishism orbiting theater volumed reservers inadvisability enmeshment browsers" ; + dc:publisher ; + dc:date "2000-07-13"^^xsd:date . +bsbm-inst:ProductFeature887 + rdf:type bsbm:ProductFeature ; + rdfs:label "realization sensibles" ; + rdfs:comment "jottings mercers gloze bassets driers triflers thermotropic friendliest analgia glottic disarticulation procurers italics personals boomtowns sodomies hobbledehoys victualer outrun encounter" ; + dc:publisher ; + dc:date "2000-07-20"^^xsd:date . +bsbm-inst:ProductFeature888 + rdf:type bsbm:ProductFeature ; + rdfs:label "residues" ; + rdfs:comment "saleswomen sorbic payrolls disloyalties detrimentalness unitized forgather unstarched achingly palsying kimonoed uranian disvaluing momisms recomposed libbed gees approved convergency battiness" ; + dc:publisher ; + dc:date "2000-07-10"^^xsd:date . +bsbm-inst:ProductFeature889 + rdf:type bsbm:ProductFeature ; + rdfs:label "nincompoop aeroliths knacking" ; + rdfs:comment "supervisorship falsifier outfields shorthorn ciphonies nixes monastical brigantines unravelling osteitis dizzies amusements polarizations curates bolshevists nimbly interrelationships pollination spectrographer complacence vermifuge asyla eaved horsehide subdistinctions cornflowers diptychs consignees tupped jells scummiest outgoes knacks" ; + dc:publisher ; + dc:date "2000-06-22"^^xsd:date . +bsbm-inst:ProductFeature890 + rdf:type bsbm:ProductFeature ; + rdfs:label "lagunas" ; + rdfs:comment "oralogy lecturing microtome imbarked bibs hymenopteron intrenches endues teamaker whiffles dormers mincier graspable erasures energetically immunoreactive attitudinized vulcanize incase illicitly retrieves rediscounting charlady contemplation methamphetamine unbefitting hawkbills rubberneck disclaimers birched coldly carwashes loathes veronicas dissolves carbonless fruitier outwearing collied shoppes entailments weirder alienable dewfalls chatted inefficaciously" ; + dc:publisher ; + dc:date "2000-07-19"^^xsd:date . +bsbm-inst:ProductFeature891 + rdf:type bsbm:ProductFeature ; + rdfs:label "indigens torsos" ; + rdfs:comment "rearranging predesignation preconstruct equalize frying serviceability villages rootier whites contraire funguses dhole bruskness encourager gasher industrialize pilferer obsoletes chiao conspired angstroms deadbeats decomposer shrugged dismembered tokenize hiddenly cuckolds imperturbability forzando indomitably frizettes cappings cunnilinguism bossisms adverts concelebrations excommunicated backslapping" ; + dc:publisher ; + dc:date "2000-06-21"^^xsd:date . +bsbm-inst:ProductFeature892 + rdf:type bsbm:ProductFeature ; + rdfs:label "spacewalking" ; + rdfs:comment "photocomposed pretentiously diligently expostulated explicator dismemberment simplistically purdas metatheses renegotiation dribbling bonelet enrolled weariness thrummer monosexualities promoters combustive pinocle noncontrollably supposed catafalques communions expounder idolatries gratefulness antienvironmentalists getaways mimosas vindictiveness fingerprints accelerometers conto pedagogues repast birefractive pruderies" ; + dc:publisher ; + dc:date "2000-07-18"^^xsd:date . +bsbm-inst:ProductFeature893 + rdf:type bsbm:ProductFeature ; + rdfs:label "midguts" ; + rdfs:comment "businesswoman genocidal skippered bioscience premenstrual vellicate perfectas belabour reparations bootlickers dyewood resound nonmystically flatter ceramist cutaway tradeoffs boudoir puniness codders" ; + dc:publisher ; + dc:date "2000-07-04"^^xsd:date . +bsbm-inst:ProductFeature894 + rdf:type bsbm:ProductFeature ; + rdfs:label "probing cleanable akvavits" ; + rdfs:comment "deliberations reenslaves perpetuator caveats seers clinged contested treasuring ashtrays pistil evaporative empathetic affluently chandlers unenterprising tutelaries bugling rooters trouped disbeliefs citizenship cummerbund hollowest botanizes lictor briberies entwine stipulator crower terrorization optimize cutlets flooders hitching slues hobbles separations toyer" ; + dc:publisher ; + dc:date "2000-07-17"^^xsd:date . +bsbm-inst:ProductFeature895 + rdf:type bsbm:ProductFeature ; + rdfs:label "slopping insecticidal" ; + rdfs:comment "properitoneal tercentenary hermaphroditically inflammabilities touche cooees regluing alerters bother molesting studios newness unliquidated unsubtly panties averting retreaded faultlessness mullens rocklike scarcest sweatiest aleatory streptobacillus minimize catsups regrows peps hookworms heartburns tiffed gestation benefaction convolvuluses modi socializer vibrator organdie ruminative changeless impowers jetty nickelled presiders" ; + dc:publisher ; + dc:date "2000-06-23"^^xsd:date . +bsbm-inst:ProductFeature896 + rdf:type bsbm:ProductFeature ; + rdfs:label "vesuvius revertible tyrannizer" ; + rdfs:comment "energise vauntful mitiest dias rescuers cumshaws zebrasses ingathers arborize vulva nippily teddies hoagies meanderers clitoridectomy leaguering pollards idolise ranching shills" ; + dc:publisher ; + dc:date "2000-07-18"^^xsd:date . +bsbm-inst:ProductFeature897 + rdf:type bsbm:ProductFeature ; + rdfs:label "befuddling helices asymptotical" ; + rdfs:comment "crumber assigned thumbscrew trode dismantlement yds disapproves suspicions blockier impalpably remelted preteens gyrus apatetic unalterable pounces anoles glassman espied availability unseating purism underlie compunctions skews stroboscopes twiddler colporteur earing dagoba pilchard picaros innervation questionable alkalizing peatier" ; + dc:publisher ; + dc:date "2000-06-27"^^xsd:date . +bsbm-inst:ProductFeature898 + rdf:type bsbm:ProductFeature ; + rdfs:label "ratifying talesman" ; + rdfs:comment "amendable readings trepan waxer cichlidae agitates haler murkier drabness vegetation taciturnly extendibility chorial fourths cyclometer enrapturing camellias creditableness impostors proofing dozy lensed picturer cooping zipping culminations heptagon tiresomely interrupter jumpable stoopingly detracted fossilizes ophthalmoscopies equatable justiciary catenating bemired flivver furbelow wether quays droned unthrifty berthas adjurers subculture" ; + dc:publisher ; + dc:date "2000-06-21"^^xsd:date . +bsbm-inst:ProductFeature899 + rdf:type bsbm:ProductFeature ; + rdfs:label "appetites" ; + rdfs:comment "forecloses liberalism memsahib shahdom bindles undoing menads reckoner hasteful barrages cursing relegates ohioans rivers calabash nighty diag matildas bearskins spatteringly darkrooms garbles dives rocker tans beaters slaphappiest squirmed gibbosity corncob gentleness commensurately plunged constants filing revivified soleplate baffler predicative refutability brashest seduces vagrom unpasteurized dissatisfactions twinkler arisings rhodopsin scarpering palls" ; + dc:publisher ; + dc:date "2000-07-03"^^xsd:date . +bsbm-inst:ProductFeature900 + rdf:type bsbm:ProductFeature ; + rdfs:label "castile eugenism sconce" ; + rdfs:comment "liquify entrusting boudoirs noncriminal burbly horrifies puniest possessing windrow extortioner unremovable maziness blowfishes sophistic obbligati disputants boxers severest barnstormer kilty advertised pridefully picas denouements unmasking canonize antivivisectionist subordinated ruggers stanched" ; + dc:publisher ; + dc:date "2000-06-22"^^xsd:date . +bsbm-inst:ProductFeature901 + rdf:type bsbm:ProductFeature ; + rdfs:label "tined spelunker" ; + rdfs:comment "recoups enhaloing stunting flummox lightering unremembered physiognomically trashes disadvantaged gussying preassigns balding acidosis networking chillums giggliest raunchier enervator monuments darkly ebonizing vitrifying finitely supramental" ; + dc:publisher ; + dc:date "2000-07-03"^^xsd:date . +bsbm-inst:ProductFeature902 + rdf:type bsbm:ProductFeature ; + rdfs:label "enshrouded" ; + rdfs:comment "spleenier nonindulgence danes hydrodynamics inauguration piles youthened expulse peris saddletree cannabism refractive cappy indictments scoutmasters toupee contradicts ambitiousness immensely bushwhackers uninterruptedly vermicide bucks aussie unalienated lollypop brushoff subdues regrading gaffer erective" ; + dc:publisher ; + dc:date "2000-06-30"^^xsd:date . +bsbm-inst:ProductFeature903 + rdf:type bsbm:ProductFeature ; + rdfs:label "hinger" ; + rdfs:comment "dimorphisms onondagas reformability churchier obbligati asterism misleadingly hatcheries dahlias midbrain disarticulation normalize reversionist lowered levered hypnophobia prickliest determents cinquefoils asslike omphali salably rings sized repressiveness ploughs cambial halers mentioned cadencing moieties chloric cranial malingers maoris magnetons ados incurious exhibiters bopped observance louvers detoxifies sheather" ; + dc:publisher ; + dc:date "2000-07-06"^^xsd:date . +bsbm-inst:ProductFeature904 + rdf:type bsbm:ProductFeature ; + rdfs:label "grudged clift instituted" ; + rdfs:comment "retraced relicensing unneedfully overinterest warlock ricochets standardbearer transborder impenetrability spumones airdrops attendants inefficiency recleans pinata dependant rings druidism ploying antipastos grogginess nonadults brochures tricolor awakings elocution untouched equilibrations toniest fronter pawnbroking entombing schtick warehousemen sanctified weighing issued floggings subscribe shabbiest kilty dissociations squinter" ; + dc:publisher ; + dc:date "2000-06-27"^^xsd:date . +bsbm-inst:ProductFeature905 + rdf:type bsbm:ProductFeature ; + rdfs:label "tradership" ; + rdfs:comment "brights coenamored naiades substitutability angriest segued labourer rabbles fifers encasing peskiest grouted judicially callings relocates clamouring snuffling federalists rallies milkers metalized horas pinners concluding vaqueros burped catches copycatted engird praising bantams radiosensitive garnets dehydration recopies" ; + dc:publisher ; + dc:date "2000-07-22"^^xsd:date . +bsbm-inst:ProductFeature906 + rdf:type bsbm:ProductFeature ; + rdfs:label "submersed" ; + rdfs:comment "atrophied campstool clerkly ladens marionettes antiinstitutionalists chronically ungodliness obtainer pokes minyan uncolored milkily vestibules forbearers engird mendicant consulship demised diazo asramas machs carried costers clamorousness hoecakes llanos registerable pothooks homemaking sputterers overreacting disassimilative garbs accommodating obtuser hysterectomizing catchpenny bunchy immunological uncured" ; + dc:publisher ; + dc:date "2000-06-20"^^xsd:date . +bsbm-inst:ProductFeature907 + rdf:type bsbm:ProductFeature ; + rdfs:label "sequency weeping" ; + rdfs:comment "limier ratiocinated hoboisms reburies madams desexualized preceeding liberalism metallurgical phaseout stairways evenfall camphorating minster hypothermal matcher sumpters conventual bellyfulls nope uproars pottering purloins inspirations zn vestries" ; + dc:publisher ; + dc:date "2000-06-28"^^xsd:date . +bsbm-inst:ProductFeature908 + rdf:type bsbm:ProductFeature ; + rdfs:label "atheneum humor" ; + rdfs:comment "tetherball electorally ostracizing passions shackles selects disassembled ratably pejoratively impenetrably rectangularity airbusses diatoms peeks trashman boogyman zigzagged unrehearsed liberalism anviled busheled pullout muscatel traumatologies gigged animists depravities canoeist dopier cowkine englished surprising extrinsically brickier extenuation unfortunateness chargee oolong props cozening sectary abstricts crawliest redos doctorates" ; + dc:publisher ; + dc:date "2000-07-08"^^xsd:date . +bsbm-inst:ProductFeature909 + rdf:type bsbm:ProductFeature ; + rdfs:label "tramways visitants" ; + rdfs:comment "choicer conjuncts unimpressively bottoms cheapie rebuking titbit creditability distasted anonymousness horridly moulder cumulatively converts hotdogging improvements recalculation clop relaxed dignified asphyxiates forgathers pastries fortissimo" ; + dc:publisher ; + dc:date "2000-07-16"^^xsd:date . +bsbm-inst:ProductFeature910 + rdf:type bsbm:ProductFeature ; + rdfs:label "handsprings" ; + rdfs:comment "misreport feater centralizer examined nobby modernization sutures conniving crisscrossed temperamental shooflies polymerize abbess gilly forefend satori wallowed rebaptized carrousels overtechnical switchblades surtaxed birthing thermostable pignet ooziest crossbows silhouetting leasable trothing crinolines etatist fruitlet stinger asper dizzying stripping condensers abstemiousness sequelae soaked eyeliner sociability barked obtains" ; + dc:publisher ; + dc:date "2000-07-10"^^xsd:date . +bsbm-inst:ProductFeature911 + rdf:type bsbm:ProductFeature ; + rdfs:label "evenfalls verbify storehouses" ; + rdfs:comment "colonizationist blonder tole lolls intendeds dominicans youse halest roisterer cajun glamors auroral pupas slakers republication shist docketed tennists unpatriotically keepsake ukrainians bentwoods bibulosities caverns mortifyingly thaws endeavour iodin belittler misses misfortunes fomenting vitaminizing substantiates retie gambian burliness" ; + dc:publisher ; + dc:date "2000-07-10"^^xsd:date . +bsbm-inst:ProductFeature912 + rdf:type bsbm:ProductFeature ; + rdfs:label "evocator skinflint labourers" ; + rdfs:comment "dugongs quietudes laryngitis parlours overthrows unpatentable ethiopian expropriator stablers misinterpreted unsanctioned supports distiller catechizing enabler drawly hopsack reorients nonparliamentary choroid relegated semiconductors corotate amtracks boardmen disports manifestative wintriest unsaved distastes coruscation oviparous misfeasors irreparably relique minaciousness pathogens circumscribed grudging prizefight anklebones singularities transequatorial woodcutters" ; + dc:publisher ; + dc:date "2000-07-07"^^xsd:date . +bsbm-inst:ProductFeature913 + rdf:type bsbm:ProductFeature ; + rdfs:label "bathing ankuses" ; + rdfs:comment "cerates nightwalkers amandine scrod accords recognizes guilelessly varnishes strenuously wagerers distracting feminization toweled indivisibility allegement hires pupa jollify moldered moppet flukey elasticize unrip broadly grouser invocator" ; + dc:publisher ; + dc:date "2000-06-30"^^xsd:date . +bsbm-inst:ProductFeature914 + rdf:type bsbm:ProductFeature ; + rdfs:label "enmeshing suctions stigmatizes" ; + rdfs:comment "simoniac designing obsoletes reendowing eterne hydrated propagandizing waveoff unmercifully quietude goggles pouchiest inconsiderateness propellers deceptions transmarine rectifying subterfuges gutty saccharin charnel archipelagoes disliking rheostatic sinfonia advertize dresses freres refulgent lapboard" ; + dc:publisher ; + dc:date "2000-06-20"^^xsd:date . +bsbm-inst:ProductFeature915 + rdf:type bsbm:ProductFeature ; + rdfs:label "mightiest" ; + rdfs:comment "buckskins threading titillates madams embellishes panier laughably maroons philtered blains sheepishness damselfly digitizes belatedly washbasins specializes kindlier husbander overdramatizing surgy landowning noons remailed fretful egyptians dialings penstock manically boatable workdays boozes hogtieing spawners bonefishes garnished fecundate lr posturer dialyzed collectables telecast embezzles waving nonskilled" ; + dc:publisher ; + dc:date "2000-07-09"^^xsd:date . +bsbm-inst:ProductFeature916 + rdf:type bsbm:ProductFeature ; + rdfs:label "excitant" ; + rdfs:comment "raggeder framer benumb intl rimmed testation omissive philosophizes stops defies shutoffs coequate collators disfavored prehistorically emerita tirades ginnings redoubtable inertias squarest libertines autogyro militias decanted ritzy redrafting austerely imputations liaise sheols comparisons stilts melton zwiebacks earlaps windjammers quadrantal impecuniousness signally extremely nonphysiological waveringly nonexchangeable" ; + dc:publisher ; + dc:date "2000-07-13"^^xsd:date . +bsbm-inst:ProductFeature917 + rdf:type bsbm:ProductFeature ; + rdfs:label "fraternize" ; + rdfs:comment "gymkhanas attenuates decants overexcites overexpansion hellenistic flincher kooky toolbox shelling foreshadowing verseman brooked slipperiest boldness neighboring nonsuccess momentarily typified flowages picks bewailer rechecked linesman porthole pharmacologies poetize marginally patents airheads annihilators blushfully mottoes abstentionism slush sportswriters knees parallelling patents spatulate corrigibility paleness topsoiled bisections stalkily defroster butteries" ; + dc:publisher ; + dc:date "2000-07-07"^^xsd:date . +bsbm-inst:ProductFeature918 + rdf:type bsbm:ProductFeature ; + rdfs:label "prized predicts" ; + rdfs:comment "beetled levees misspell sharps stretched pekoes vitalities linearly remunerators honester filleted expectorations diplopod phosphatic flan reordain positivest linac stakes porn favored ideologize fogie preshape armorer warcraft ninnyish mohammed vibrators sparing etoiles umlauting lodgements quintile spatially gypsyish unedible beano ingested formfeed droshky mortgageable careerer predestination proems preenlistments infective coveys" ; + dc:publisher ; + dc:date "2000-07-13"^^xsd:date . +bsbm-inst:ProductFeature919 + rdf:type bsbm:ProductFeature ; + rdfs:label "wagnerian absconder staccatos" ; + rdfs:comment "militates qts snowfalls neighs unclaimed anglophilia gourmandize shinning snowbushes shellackers ambuscaded venturously circularness bemas neglectfulness omikron unbuckles detoxifies boysenberries megabuck whizzed escalators foreplays overindulged rebroadening literally derats timider ethnologic unesthetic cunners groaned overdecorate oceans reinstructs landfalls midwived speedster cyanosis chagrins skivvies clefts angstroms" ; + dc:publisher ; + dc:date "2000-07-04"^^xsd:date . +bsbm-inst:ProductFeature920 + rdf:type bsbm:ProductFeature ; + rdfs:label "proceeded prettifiers galilei" ; + rdfs:comment "toxicants racker susurrations atriums emergence brio sidelines nocturns anoxic denouements gawker garbo idiosyncrasies osteotomy feaze subschedules oblongata transiencies beaucoup crescents wassail tularemic cashboxes shoppes dining envelopers unconcernedly bromate reseated" ; + dc:publisher ; + dc:date "2000-06-28"^^xsd:date . +bsbm-inst:ProductFeature921 + rdf:type bsbm:ProductFeature ; + rdfs:label "impliedly uvulars widgets" ; + rdfs:comment "ones lovably ascots godmothers raving volkswagens stopwatches pantomiming mildens mushiness rewind defamatory hermitage roomers hatchelled flagship stoker jingled wounding allergist postcardinal lacrosses antiparliamentarians obligato stratification underdresses tantalic declinature insecurities cuddling" ; + dc:publisher ; + dc:date "2000-07-12"^^xsd:date . +bsbm-inst:ProductFeature922 + rdf:type bsbm:ProductFeature ; + rdfs:label "operating smoothened" ; + rdfs:comment "outpour negatively reconversion negative soapbox critters liquidation vino interconnections quilting priming sconcing enchained fullers jerboas rankled nonviolent ridder vulvas sambaed timekeepers laughers consciously bolsterers laten amirs flyspecked pesterer reneging pricier preoccupying postmarks cajoles conservational excellency overlay polished gamily" ; + dc:publisher ; + dc:date "2000-07-05"^^xsd:date . +bsbm-inst:ProductFeature923 + rdf:type bsbm:ProductFeature ; + rdfs:label "unmuffle" ; + rdfs:comment "burnable overbalanced calcimined unarticulated champy snottiest forbode engr swinged sleighers ignitable pekinese sumptuousness waistcoats indentured classily airmailed ineptitude varnishy headfirst daylit blotches peens quadrantal slicks oversimplifying reappearing imbibitional druidesses undersexed fanatical smirks trigonometrical cannabises hornpipe bactericide gnomes casked debugs wingier parmesan steroidal tilling felts ringtails jaggery stimulates retraceable ordos" ; + dc:publisher ; + dc:date "2000-07-15"^^xsd:date . +bsbm-inst:ProductFeature924 + rdf:type bsbm:ProductFeature ; + rdfs:label "sputterer somnolencies renegotiations" ; + rdfs:comment "unexpectedly inures skydives nonmaterial moulters tsarevnas immigrates attainably ravingly climbers tradeoffs humongous dormers germfree argons thicks peignoirs refreshment durances chervil monotonously" ; + dc:publisher ; + dc:date "2000-07-21"^^xsd:date . +bsbm-inst:ProductFeature925 + rdf:type bsbm:ProductFeature ; + rdfs:label "pennyweights" ; + rdfs:comment "nominating resuscitator adolescently reappraises relented drayages mediately preselecting assayer suggestibility turndown froufrou constabulary chasuble miniaturization curvetting vindicated misprision subverting prying differentiates stragglier cephalically sublet colossians degass stridently remounted abusively" ; + dc:publisher ; + dc:date "2000-07-01"^^xsd:date . +bsbm-inst:ProductFeature926 + rdf:type bsbm:ProductFeature ; + rdfs:label "coagulative" ; + rdfs:comment "appositely beldames misspending flirtingly motivating merchandised rubbishes reservedly snicker recallable ordinances nativism fries vagrance relive overjoys quittors somnambulistic outstanding subsisted waddles flowerer rewarder superintendence vegetative empowering kerchiefs unfreeze embosser electrotheraputics balkier circadian fertilizing addressability titaness tenderloins" ; + dc:publisher ; + dc:date "2000-06-24"^^xsd:date . +bsbm-inst:ProductFeature927 + rdf:type bsbm:ProductFeature ; + rdfs:label "reasonableness subsidence" ; + rdfs:comment "klystrons counseled undisclosed descrying argents silencing superposed inhabitress abbotcies proliferated donationes composting propounding hausfraus pubescence dominica vaporize plutonic eczemas sloppily indifferently geniture zymoplastic fetor ivied applies clutchy naturopathy subtracted debouched enforces contextually presider concertizes pushcart nonesuch" ; + dc:publisher ; + dc:date "2000-07-05"^^xsd:date . +bsbm-inst:ProductFeature928 + rdf:type bsbm:ProductFeature ; + rdfs:label "oxidized loudmouths" ; + rdfs:comment "wended twinight stander conventions denuclearizes corsages forgiver verbalize nervosa stinkard houseflies noiselessly earliest surveyable gladsome horary brunets forboding limberness nonaddictive blazoner publications floes aneroids fireball" ; + dc:publisher ; + dc:date "2000-07-20"^^xsd:date . +bsbm-inst:ProductFeature929 + rdf:type bsbm:ProductFeature ; + rdfs:label "effector preexamines millivolts" ; + rdfs:comment "crucialness freshness outface maledicts desires facelift unclerical betrothment bleating statecraft rewarmed ichorous outworks unjoined bloodying drownds calender zealotry boodling scintillometer loftiest hemorrhagic aerogram cymbalists hayers meadowsweets signalizes antidepressant ruralisms moneylenders capitalists pushovers erotizing bantamweight clairvoyantly" ; + dc:publisher ; + dc:date "2000-07-13"^^xsd:date . +bsbm-inst:ProductFeature930 + rdf:type bsbm:ProductFeature ; + rdfs:label "originator" ; + rdfs:comment "conventioneers costs confronted propman shipped immolation kneaded domesticates baulking manumissions rendezvousing amendatory selvedge debilitation directness scrapers covetously spideriest instigated resolutes caudate lipper mirkier unrevoked poetaster prearmed reliableness holistically vaccinating anesthetist elater louie aerier macrobiotic wobbler stander presifted" ; + dc:publisher ; + dc:date "2000-07-01"^^xsd:date . +bsbm-inst:ProductFeature931 + rdf:type bsbm:ProductFeature ; + rdfs:label "conflicting" ; + rdfs:comment "proposals simplisms cribwork cantered finagles assertor unterminated stagey optionees mucous kefirs tutors isotonically founts diabetics underbrush ascertainment forboding scheelite muskier curlers egocentricity" ; + dc:publisher ; + dc:date "2000-07-19"^^xsd:date . +bsbm-inst:ProductFeature932 + rdf:type bsbm:ProductFeature ; + rdfs:label "nonmaliciously" ; + rdfs:comment "cragged shares forums archimandrite reutilized intervertebral lyingly uprooters pricer transformations stipulator intransitively cavie unforeseen quitter deferentially athletes vapouring ticklishness manufacturable hagriding wrapping" ; + dc:publisher ; + dc:date "2000-06-26"^^xsd:date . +bsbm-inst:ProductFeature933 + rdf:type bsbm:ProductFeature ; + rdfs:label "localisms chatter dooms" ; + rdfs:comment "hatemonger shouts discoursing urethras regain lidding peart capes formerly impairer tankards sapiences represent fetor indifference trices catechumens mercifully chanticleers furrowed" ; + dc:publisher ; + dc:date "2000-07-19"^^xsd:date . +bsbm-inst:ProductFeature934 + rdf:type bsbm:ProductFeature ; + rdfs:label "coastwise" ; + rdfs:comment "gents legislatures reciter spearheads celling sueded trustbuster rebutton purples earthliness saltworks mildness transitions snafuing resonants packers ephedrin exultantly teens limpidness kicking metered bawdily appose bedchairs antielectron assaying circuiting sirree lavages preforms takeable cracker stillier pablum photocopiers prognosticator curdling donations preternaturally eviler micromanipulator prerecord misspent" ; + dc:publisher ; + dc:date "2000-07-21"^^xsd:date . +bsbm-inst:ProductFeature935 + rdf:type bsbm:ProductFeature ; + rdfs:label "overloading refreshes" ; + rdfs:comment "nonadults indians turnips bally dispatches bets masquers travesties contentions guns outranked battiest gaud steerable unbruised slopped infective composting poked humidifiers invaded deucedly profusely pulsatory hashhead detailers birdied jackhammer kabalas frothiest enneagons wikiups effemination" ; + dc:publisher ; + dc:date "2000-07-22"^^xsd:date . +bsbm-inst:ProductFeature936 + rdf:type bsbm:ProductFeature ; + rdfs:label "buzzed sexualization swill" ; + rdfs:comment "overmatches rearrangements libertines beastliness weensiest presentment arbitrating websters atomized insinuator kings cocoons profits scrollwork forbidder usufruct pills conjunctivitis aquaplanes crudest overabound sillies retouched musical trekking flagrante romanist lyrical jestful chantries renters franchising swillers gapes satanism microsurgery cicely tasked biotechnological indue pendants sheikdoms grounds diverges squish" ; + dc:publisher ; + dc:date "2000-06-27"^^xsd:date . +bsbm-inst:ProductFeature937 + rdf:type bsbm:ProductFeature ; + rdfs:label "xylose blither" ; + rdfs:comment "impaction mentionable lucifers catchups calfskins misplaying sacredly heroines reconciles cassocks localized arborists irises fielder tackily incurving boer blended liars retracting intermingles grinners daises outgoing dialyzes bimah coati fitnesses ternate postludes mislead riper incapacitating cabalist testosterone sadducee illusions moaned outproduced dekagram tushing fusser" ; + dc:publisher ; + dc:date "2000-06-30"^^xsd:date . +bsbm-inst:ProductFeature938 + rdf:type bsbm:ProductFeature ; + rdfs:label "preventatives waists" ; + rdfs:comment "quakily rafflers terminating sniggeringly gownsman hollo paranormally subtotaled beaded frontally entoils abstractionism upsweep romances rejections galloot kris rondelle creameries volute cockeyed hunker punished securest stompers vertigines mommies" ; + dc:publisher ; + dc:date "2000-06-25"^^xsd:date . +bsbm-inst:ProductFeature939 + rdf:type bsbm:ProductFeature ; + rdfs:label "licencers espoused campaigners" ; + rdfs:comment "deviator glisters depressors inhaling pliability yahooism fundi cowpats panics glossing convictions adversity revising landscapes opaqued unencumbered affection disobliges antacids frenched nonkosher charlatanish hoofed antimilitarism" ; + dc:publisher ; + dc:date "2000-06-27"^^xsd:date . +bsbm-inst:ProductFeature940 + rdf:type bsbm:ProductFeature ; + rdfs:label "whithersoever skiing photosynthetically" ; + rdfs:comment "outshouted dyeable belay referees flowing obligability yelped busybodies solaria esthesias prefixally swellheaded incubation dalmatian blowiness spender gushing exclaims stockpot vizors alphabetization evisceration entombing hencoop vulgarized hazelnuts reawaking erective saloons beautifies legitimated" ; + dc:publisher ; + dc:date "2000-06-30"^^xsd:date . +bsbm-inst:ProductFeature941 + rdf:type bsbm:ProductFeature ; + rdfs:label "silence" ; + rdfs:comment "cinques miserable photocopying brightens emptied warcraft popedoms unities butterflies houseworker serval electromagnet razee paroxysmal broadaxes unchastised precipitancy celeries harmonically defoliating tiepins snappily internship autosuggestions illy piglet capone declassified saltation coons craniate pleasing sots perching typhoidal gelatines slattern towelled" ; + dc:publisher ; + dc:date "2000-07-17"^^xsd:date . +bsbm-inst:ProductFeature942 + rdf:type bsbm:ProductFeature ; + rdfs:label "troths" ; + rdfs:comment "sutta crowing unwholesomely kiloliter grails urologies incorrupt poopsie unpopularly kerosine leafstalk brachycephalic undersigned smidgins verticillate mousey chronicler dianthus adjudging remeets mouthparts wishfully matinees fluffily" ; + dc:publisher ; + dc:date "2000-07-12"^^xsd:date . +bsbm-inst:ProductFeature943 + rdf:type bsbm:ProductFeature ; + rdfs:label "perfecto divisions decides" ; + rdfs:comment "graecizes nicest brawliest vexed helped circulars minifloppies astrologist inbreeds intimaters lollies cubed pealing woodbins slapdash fiscals precipitability slipperiest modernly indefinably openers revue dissented quintiles musting sylvian orderer unconscientiously maisonettes topiaries scallopers durableness dressiness dislike cankerous directorship gymkhana remigrates thicknesses rumblingly yardarm microbiotic controllably endeavors carinas" ; + dc:publisher ; + dc:date "2000-06-26"^^xsd:date . +bsbm-inst:ProductFeature944 + rdf:type bsbm:ProductFeature ; + rdfs:label "mannikin" ; + rdfs:comment "symboling grouty whalebone unbuckled jato finalists talebearing undercoat nailheads kibosh lasagne cohesions hireable fawningly supplanter disgustingly misfortunes streamier accumulativeness friskets shammer semidependent inviolably sanitating waltzed baths exhortations ponytail moped collectivists persecutions injuriously bluebottle guardhouses scampish creaks" ; + dc:publisher ; + dc:date "2000-06-22"^^xsd:date . +bsbm-inst:ProductFeature945 + rdf:type bsbm:ProductFeature ; + rdfs:label "viscounts enrolls compacted" ; + rdfs:comment "bitted headpiece dissolved yawled kicking extractions brewer correctly toking chaffs somnambulating brawnily keying hawkies graveless fusing iridescence catarrhous torsionally orients" ; + dc:publisher ; + dc:date "2000-07-02"^^xsd:date . +bsbm-inst:ProductFeature946 + rdf:type bsbm:ProductFeature ; + rdfs:label "precariousness" ; + rdfs:comment "nonowner whereunder neurologies concussions psychoanalyze psaltry librettists defamer arbitrages embittering variorums prematurely armlessly breakables germaneness punishability affright sludges challenger salespersons uruguayan chivvied issuing spectating exceptionality recoup ripeners coastward bitterer tapiocas armistices overrighteously hugely sectarians uglis fescues mousses mintier evildoers popedoms nighs phonos awacs playfully temporaries inattentiveness warders roadrunners blackest seconded" ; + dc:publisher ; + dc:date "2000-06-28"^^xsd:date . +bsbm-inst:ProductFeature947 + rdf:type bsbm:ProductFeature ; + rdfs:label "interdicting" ; + rdfs:comment "ensky ridable parlours frauds antidotal socializing rubbed optometrists unnerves coloration quitclaim assassinations oxygenates shuteyes caroller foreran leal disowns modeller horsily impaneled aggrandize birching awakenings bondwomen ortolans monogamistic clunk" ; + dc:publisher ; + dc:date "2000-07-01"^^xsd:date . +bsbm-inst:ProductFeature948 + rdf:type bsbm:ProductFeature ; + rdfs:label "gombo contradicting" ; + rdfs:comment "feuding legations contrives undermining slopwork nepalese obstructively decelerated loudliest witlessly computerized pharyngeal limbing viscidity telecasted seafoods valses frow bewitchments knouted ambler redder embracer adoptability vegetative familarity minimals weltered allocatee abridger breaches discriminated macrons goodwills nougats lodicules cigars exonerating janes smilers punctilio" ; + dc:publisher ; + dc:date "2000-07-08"^^xsd:date . +bsbm-inst:ProductFeature949 + rdf:type bsbm:ProductFeature ; + rdfs:label "lathwork" ; + rdfs:comment "feebleminded daredevils atherosclerotic choleric recontrolling extraneously ornamentations reassessment fortis markkaa versify epode vanman felonries notchers legalized reediest unseaworthy insulations kayos catarrhs wackier plows transplants quasars animalism" ; + dc:publisher ; + dc:date "2000-07-03"^^xsd:date . +bsbm-inst:ProductFeature950 + rdf:type bsbm:ProductFeature ; + rdfs:label "panoramically peculations expectance" ; + rdfs:comment "awned humbleness shyers sunbaked curber taskworks snowsuit subfractional wittedness wearer appreciator basts tideways intactness phosphates cringed outdoors plastics falconries kronor selenology researching intellectualizations ores deles clews truncated blacktopped bitted evangelistic nuttily sprayers workless stockpiling upcurve unneedful notating decontaminates quilters undeserved plumbable prophases echoism startlers crabgrass sues frocked anastomoses hydrolyze topotypes" ; + dc:publisher ; + dc:date "2000-07-19"^^xsd:date . +bsbm-inst:ProductFeature951 + rdf:type bsbm:ProductFeature ; + rdfs:label "overconcern solacing" ; + rdfs:comment "bumptiousness comestible spelunk numerated embitterment supervention wellsite birthmark wobbliness tything slums miffs blowiest crustaceans crucifer callusing whopped sequestratrix susurruses isomerize honestest alfa goddamns tattooers surfs mameys mistimed refunder pharynges horseless shacker collat" ; + dc:publisher ; + dc:date "2000-07-15"^^xsd:date . +bsbm-inst:ProductFeature952 + rdf:type bsbm:ProductFeature ; + rdfs:label "tipsters" ; + rdfs:comment "pyorrheas muleys shouldering psaltries archaeology embolisms choreographic orbits ungathered astrological hominies inching slimily morality winesop articulationes contrastable stuffed shareable unfaithfulness separation shiatsu fisher retinues shamelessness chutzpas sites shipbuilders trysting untreading clotures unabsorbed employable decasyllable lynched buckbean observer paganizer" ; + dc:publisher ; + dc:date "2000-07-11"^^xsd:date . +bsbm-inst:ProductFeature953 + rdf:type bsbm:ProductFeature ; + rdfs:label "caesuric bartered hagiography" ; + rdfs:comment "excursive preexposes clop immediacies hypnotics blindness birders nonincriminating briefly stumping newness slackly miseducate demonstrational matriline meniscal protestors loams bayoneting antiinstitutionalist consultatory formations calk elative lithest pumices dentifrices kitsch antigenic digitized soughs heliport dakotans emulsin stubbily phenix catalyzing symblepharon wittiest selsyns antimissile catacomb cattiness bicyclists uncancelled dramatis potties striker lynchings scowls" ; + dc:publisher ; + dc:date "2000-06-27"^^xsd:date . +bsbm-inst:ProductFeature954 + rdf:type bsbm:ProductFeature ; + rdfs:label "squeezers hypoglycemia kinaesthetic" ; + rdfs:comment "tovarishes hairless dressmakers blowiest shoehorns pensioners carpus pipkins staffed daw towboats sveltely vedic corteges hypothesize curiums salver cowboys biconcavity isotopy bestiaries disquietudes corundums xxii netsukes precontrive footway rectifiable hermeneutics narwhal dunked deedless soddies upcoming outliving brassier bootlickers disquietingly littery ladylove determinations deliquesced raves favorable conspiring" ; + dc:publisher ; + dc:date "2000-07-22"^^xsd:date . +bsbm-inst:ProductFeature955 + rdf:type bsbm:ProductFeature ; + rdfs:label "ripens" ; + rdfs:comment "ignitions pampas meningeal puttiers opacifies ukase drifters conveyable solipsists vinaigrettes temblor interfile straddled excerpted sorcerer softie arhats limpness allottees knowinger propositional scarcely snouting lecturer backers unprolific reframe rammer informed helices peasants resettings masses muller tufa hondas creations aircrew staggers patriarchs globalizing sportful citruses watercraft" ; + dc:publisher ; + dc:date "2000-07-13"^^xsd:date . +bsbm-inst:ProductFeature956 + rdf:type bsbm:ProductFeature ; + rdfs:label "muriate" ; + rdfs:comment "tachycardia lubrication allurements corrugation windsock chemoreceptivity mismated joviality freshened eyebolt desensitizer strongbox luxuriation fluidized zimbabwe electromagnetical mama hardened ensorcel defeatism rewakened glaring wingspans abjectly unchastely obeahisms snipping woollies unlikeliness bulgarian commutations adorableness skippering" ; + dc:publisher ; + dc:date "2000-07-09"^^xsd:date . +bsbm-inst:ProductFeature957 + rdf:type bsbm:ProductFeature ; + rdfs:label "doyly" ; + rdfs:comment "unfaded slaters emulative dourer evictors quantities skydiving emaciates scuttlebutt intertwinements octagons preblessing lobelias limeades erogenous governments chumps ergots passageways garroters predacious" ; + dc:publisher ; + dc:date "2000-07-07"^^xsd:date . +bsbm-inst:ProductFeature958 + rdf:type bsbm:ProductFeature ; + rdfs:label "classier cordate" ; + rdfs:comment "thiosulfate anachronistically undeserving recriminates anarchically jobholders townless bombasts rejoicing gunboats endamages deadheaded subdisciplines henting pullers sycophancy lavaliere subscribing vulgarization intertangled campaigning regimenting xylems" ; + dc:publisher ; + dc:date "2000-06-27"^^xsd:date . +bsbm-inst:ProductFeature959 + rdf:type bsbm:ProductFeature ; + rdfs:label "permuted" ; + rdfs:comment "probabilities reptilians manrope xebec accidentals gists encyclical subtraction carotids restating besprinkles diapasons vising ovular uglier hindustan divider nirvanic foresight tranship pinnal" ; + dc:publisher ; + dc:date "2000-06-28"^^xsd:date . +bsbm-inst:ProductFeature960 + rdf:type bsbm:ProductFeature ; + rdfs:label "traveled thymines" ; + rdfs:comment "ferules nasturtiums molester homoerotism redigests drillers personas inurns vegetates flogs flywheel shirkers caponizes cosets secretest entwists unserviceable harmonizing displease relentlessly livelong betrayers allotment mastoidal comprehending repack urethras trumping incessantly genially shins fornicatrix wahines meticulosity foetuses awfuller overlay sages larruper deactivator capitulated hilts allover flowmeter redrills cannoning" ; + dc:publisher ; + dc:date "2000-06-22"^^xsd:date . +bsbm-inst:ProductFeature961 + rdf:type bsbm:ProductFeature ; + rdfs:label "caulking" ; + rdfs:comment "environmentally materializes channelling unpresentably fumitory egoists funerary uncompromisingly celebrator peneplain protoplasmal tickling laccolith chitters sforzatos hemodialysis stirring stewpan prognosticates sigher determining haunted calorimetrically transactional brut huckstered lempiras coronach minsters kens cuttlefishes affray arizonan mineralize commiserates whacks tarsus" ; + dc:publisher ; + dc:date "2000-07-08"^^xsd:date . +bsbm-inst:ProductFeature962 + rdf:type bsbm:ProductFeature ; + rdfs:label "baywood revamper congratulates" ; + rdfs:comment "capturer unreeling foremast mephitic propagandize teaware magnifiers adders spinnakers abeyancies caramelizing pitter whomps wadable rewires cockerels eructing vestment bedewed souled appurtenance mfg kishkes" ; + dc:publisher ; + dc:date "2000-07-02"^^xsd:date . +bsbm-inst:ProductFeature963 + rdf:type bsbm:ProductFeature ; + rdfs:label "coincidences" ; + rdfs:comment "belittler nonextant blackouts pigpens backbencher multiples highhandedness antislavery primordially overflies reroute courtrooms shots banking somnambulating sibylic billers argufy gimpier dimorph subcutaneously cantinas striation swiftian amtrac chondrule electrolytes writhers steppingstone doughty poising looker eutrophy misgovernment rationalize clapboards burghs thermostatic" ; + dc:publisher ; + dc:date "2000-07-22"^^xsd:date . +bsbm-inst:ProductFeature964 + rdf:type bsbm:ProductFeature ; + rdfs:label "gazetteers commutative" ; + rdfs:comment "nonmechanistic turnarounds flyman outstations intercalated repudiates asphyxiating hurtless webs sellouts overdecorated ingrained haircloth reconstitute gated whilom hallos moistened cyberculture incas sketchily steels perfectest tomomania defrosters rands golem melton sinicized ovulate terser equinoxes appreciatively bedwarfs attitudinized engramme internment pronged accoutres swooshed leavens channelling droopily slakable theres strangeness siloed frenching" ; + dc:publisher ; + dc:date "2000-07-03"^^xsd:date . +bsbm-inst:ProductFeature965 + rdf:type bsbm:ProductFeature ; + rdfs:label "vaulty" ; + rdfs:comment "interbranch defogged entering devoirs elans cutlasses dickeys cartooning wheal likens wettings bisects perambulating attests burliest mantes auxin dowsing handiest realize bedbugs multiparty oohing jus splenitises jefe misaddressed guttiest fujis repertories pyxies realisers palefaces deacidification snuffles waddler" ; + dc:publisher ; + dc:date "2000-07-08"^^xsd:date . +bsbm-inst:ProductFeature966 + rdf:type bsbm:ProductFeature ; + rdfs:label "dethroner" ; + rdfs:comment "radiotherapists welched graphing unshaken shilled biogeographical airstream subitem nomads affections woken whipt fart geoscientist rekindled tangibleness presets diplomas wolver atomical minglers purgatories predictors" ; + dc:publisher ; + dc:date "2000-07-10"^^xsd:date . +bsbm-inst:ProductFeature967 + rdf:type bsbm:ProductFeature ; + rdfs:label "palled proliferous unrevoked" ; + rdfs:comment "overproduce stubbled chordates powerlessly holographs wineskins leaking impracticability yammering landlordism rattler somnambulant shrinking xanthous dills preexamines aggrandizement reunifying gratefully antiwar thereout protista ablatively streets scalpers frisbee panthers" ; + dc:publisher ; + dc:date "2000-07-15"^^xsd:date . +bsbm-inst:ProductFeature968 + rdf:type bsbm:ProductFeature ; + rdfs:label "unusually bluepoint briars" ; + rdfs:comment "buckler perusers pretties exposal reinduced avifauna carousers handled pigeons devastations advertizing weavers intrust wows ionizer animadverted admitter atonement resistibility gleesome" ; + dc:publisher ; + dc:date "2000-07-18"^^xsd:date . +bsbm-inst:ProductFeature969 + rdf:type bsbm:ProductFeature ; + rdfs:label "babushka unlatches logrolling" ; + rdfs:comment "warns linac requisites combes succinctly sprinklings noughts wrier steelyards urologists physiques rewarming ducal gelders choreographed empathetic pianic inelasticity blizzards accoutred humidity shapelessness kilorad weigher corgis pathways insheathed banjoists intersexuality creaming tastes vivifying collectively nonsexists tommyrot demurs untouchable spookish wiriness ratline granulating twilit archetypal uncouples shahdoms hammocks reviles inimically fusibleness" ; + dc:publisher ; + dc:date "2000-07-18"^^xsd:date . +bsbm-inst:ProductFeature970 + rdf:type bsbm:ProductFeature ; + rdfs:label "unconceded coils" ; + rdfs:comment "establismentarianism dehumidifying unawareness tarragon diners dewax handselling massages burghers bridegrooms stimied endeared septets blackeners pleasingness hereditariness zimbabwe lyricist obstructionist nonstop sleazy unclean filmcards overweening sociologies pecked nosh angularly writing brayed preappearances adjudicative foddering distrust intromittent featheriness" ; + dc:publisher ; + dc:date "2000-06-20"^^xsd:date . +bsbm-inst:ProductFeature971 + rdf:type bsbm:ProductFeature ; + rdfs:label "unionizes drips" ; + rdfs:comment "unimportance saviors baywoods reacted prelimit djinny reinvestigated carbuncles congratulation hysterectomizes photosphere quackier lengtheners misplace recondenses idiocratic sketched educating hypnoanalysis tabletting invigorates castellated revivals dinkum traduce pouty passel" ; + dc:publisher ; + dc:date "2000-07-03"^^xsd:date . +bsbm-inst:ProductFeature972 + rdf:type bsbm:ProductFeature ; + rdfs:label "platers" ; + rdfs:comment "fluorescence barehead ostentatiously manus delineation alohas jaggedest diallage goalie curtsy shyest venalities ombre polygamists blubberer outfielder convalescing closers halfpennies kronur extemporizing dibbled disowning transmissive baronets housemaid halter" ; + dc:publisher ; + dc:date "2000-06-22"^^xsd:date . +bsbm-inst:ProductFeature973 + rdf:type bsbm:ProductFeature ; + rdfs:label "lovemaking sashimi completes" ; + rdfs:comment "infolder signifying contributories cementation endeavor glorifications kielbasa abstracts rockaways emmets nationals foins potentiator outdodges flutist weensiest conciliations surnames headfirst pericynthion teaspoonfuls crowded anaesthetic consonances quietened dilated inchoately adoration cowhided capablest embers dunces metricated encloses continentally silex imposting gawkies astrolabe insurgency gelatinized bugler nationless deifies" ; + dc:publisher ; + dc:date "2000-07-08"^^xsd:date . +bsbm-inst:ProductFeature974 + rdf:type bsbm:ProductFeature ; + rdfs:label "medusan bawdier frillers" ; + rdfs:comment "diverted nonyielding serialists overcooking endows velour mineralogic renewable brahmin ceramists rubbed runways posttreatment shyers zebras hangars douche cateresses lactationally sonorities comprehends masterfully underpayment basters revenges insaner inkiness misplays dwarfisms phonetician latitudinarian goddam beths reexpression looped mulberries evokers brags sited earthman tommyrot disintegrates hulloes gayly carhops undersigned incrusting desensitize civilising" ; + dc:publisher ; + dc:date "2000-07-05"^^xsd:date . +bsbm-inst:ProductFeature975 + rdf:type bsbm:ProductFeature ; + rdfs:label "hurrayed wafter" ; + rdfs:comment "indecenter bakeries excluders ferny cosigning soreheads resurgence passiveness muffled adulated syphilized onstage lapper rewrought scribes unzealous porphyries enumerator aneroids steepness individualizing antimilitarism wye threatful livability casqued foiling asyndeta" ; + dc:publisher ; + dc:date "2000-06-22"^^xsd:date . +bsbm-inst:ProductFeature976 + rdf:type bsbm:ProductFeature ; + rdfs:label "expectance distinguishes" ; + rdfs:comment "bicultural placements ryegrass inkhorns dicotyledons obstreperous talers detractors addictives disembarkation cheaply glorifiers endpoints reverting comforting xmases epigrapher waddles dynamiting sectioning unnaturalness ordains triplicates ordered scything peacing doglegging robs knolly identifiers quean adjuror scurf raiser suzette ensnarer battling overbought" ; + dc:publisher ; + dc:date "2000-07-12"^^xsd:date . +bsbm-inst:ProductFeature977 + rdf:type bsbm:ProductFeature ; + rdfs:label "histologists grimacing" ; + rdfs:comment "renominations visionaries murexes confutative blockers harpooner reapportioned canopying aphrodisiacal flintiest leafstalks octogenarians choreographic retrograded ultracentrifuge aliners carwash sidepieces twinkled insisters structurally unbecomingly resets" ; + dc:publisher ; + dc:date "2000-06-28"^^xsd:date . +bsbm-inst:ProductFeature978 + rdf:type bsbm:ProductFeature ; + rdfs:label "idling humpier" ; + rdfs:comment "slipshod coonhounds cinematographic viscoid ethologists wurst chirpy kilometer profiled forager slalom cento tweaking tining basement dong malthusianism covalence menacers haughtiest scrupulosities anesthetically parasitologist unpunished blenches dulling overstatement extruding deification flummox reexchanging" ; + dc:publisher ; + dc:date "2000-07-18"^^xsd:date . +bsbm-inst:ProductFeature979 + rdf:type bsbm:ProductFeature ; + rdfs:label "desiccations mitts terrenes" ; + rdfs:comment "roscoe semens enemies luces ideologist steamboats naturalization carcinogens tractable proceeding wastepaper colonnaded anthropomorphically brackens restage hairlike rowdies gussy autodialled preestablished adversative spinals pressurizes handstands blackmails singing rotting circularizers" ; + dc:publisher ; + dc:date "2000-06-29"^^xsd:date . +bsbm-inst:ProductFeature980 + rdf:type bsbm:ProductFeature ; + rdfs:label "farewells skalds" ; + rdfs:comment "pragmatical multiplicities vacuousness ethylenes phantasmagorias resided melanoids steeped wiseliest detours mercantilistic accumulativeness rejecting ecocide resettles alls nonnative resurged darkeners aunthoods rewinders cabals rummiest relocate defamers vinaigrette hominoid uncut transected submitter contributions giggler remorsefully smoothing nightcaps chronicler prised balkily devised accoutered fabricated healable octuply interrogatories sparkling octanes foreteller chuffer velured copiously" ; + dc:publisher ; + dc:date "2000-06-21"^^xsd:date . +bsbm-inst:ProductFeature981 + rdf:type bsbm:ProductFeature ; + rdfs:label "bumpkin jigger dignities" ; + rdfs:comment "quarantined costliness scapulae educator adulteration truthfully probing ransomable mulching compensator twinklers concussions auscultated youngling oppositionist cabriolet mollycoddled cheque bossisms traditionalist unbrotherly cravingly reprinted deposits posed bedazzlement" ; + dc:publisher ; + dc:date "2000-06-28"^^xsd:date . +bsbm-inst:ProductFeature982 + rdf:type bsbm:ProductFeature ; + rdfs:label "guardians planetesimals regrowth" ; + rdfs:comment "helpmeets tertial hydrofoils crankcases materialistically overstimulates bluings stockholders alliterates blacklists marketplaces umbellate mouthily interracial amish sunrises sealable tramps chivied impoundable townies hybridizer considered whits sonnies analyzable incapacitation parring daisied redeploy harmer coffeehouse reliefs wishes perambulations neutralization roomily nonlocals buggery recourse toxicant moneymaking twiddler embodies" ; + dc:publisher ; + dc:date "2000-07-15"^^xsd:date . +bsbm-inst:ProductFeature983 + rdf:type bsbm:ProductFeature ; + rdfs:label "cytoplasmic hobnailed eulogize" ; + rdfs:comment "heaviness sacrum sedums nonflowering lavations happens backmost burners dorsa owllike tarzans researchers ensilage henpecked assembled concisely shopped paratrooper noticed hexers photosynthesizes reassigns fluorination vincas excluded orts bicultural marvelling climaxed appetizers colorism mashie logicizes dribbed refolding reproachingly typhoidal hiking bibliomania fealties preceeding arrives syringes behaves" ; + dc:publisher ; + dc:date "2000-07-13"^^xsd:date . +bsbm-inst:ProductFeature984 + rdf:type bsbm:ProductFeature ; + rdfs:label "hailstones tenuousness" ; + rdfs:comment "herpetologist benumbed weaknesses scabbards variers testatum feeders rotaries flameouts revisionism suavities altars haymows savor agouty nonlocals combs hasidim interposed pleaters overpower moulds moonily sanely evens rotationally mooted dearness pectinous megadeath trashily soundness disassembling montes censoriousness ingrained insolubilities moistener indictees examiner" ; + dc:publisher ; + dc:date "2000-07-02"^^xsd:date . +bsbm-inst:ProductFeature985 + rdf:type bsbm:ProductFeature ; + rdfs:label "flyleaves nulling" ; + rdfs:comment "fuzziest suffixing kingfishes crassness asymptotical desensitizer venalness lilliput deodorizes roiling muffed timidities penetrative shinnies begird flensers obsolescently mignonne peristalses curlier overpriced fresher unbuttoned cullied appreciates reglaze divinize fattening kvetches surfings coveralls westernized insistence amniotic unlearn federational aerophobia knockwursts oohs pastors scattiest polyester" ; + dc:publisher ; + dc:date "2000-07-22"^^xsd:date . +bsbm-inst:ProductFeature986 + rdf:type bsbm:ProductFeature ; + rdfs:label "borderlands" ; + rdfs:comment "ichthyologists monads declaims cabalist spinnies unshipping diestocks decorator tickings glary skeeing usability propulsive pushover backbiter legitimizations reclined supersaturated stifled reenlightening abbes accepted" ; + dc:publisher ; + dc:date "2000-06-30"^^xsd:date . +bsbm-inst:ProductFeature987 + rdf:type bsbm:ProductFeature ; + rdfs:label "kl magnanimously securely" ; + rdfs:comment "poultices crested licentiously dominated shoed requisitioner colorimetry weakness malachite crestless vulgarization monopolist flouncy authoritatively wetbacks figeater aestivates caffeines skydivers demimondaine arraignments quintal subraces galosh joblessness nonowners wriggling" ; + dc:publisher ; + dc:date "2000-07-09"^^xsd:date . +bsbm-inst:ProductFeature988 + rdf:type bsbm:ProductFeature ; + rdfs:label "mullers nymphos sourballs" ; + rdfs:comment "biretta toweled crankiness chronicity squanderers greyish deathcups impassivity librettists inheritable peripherally stilbestrol aroint bottled niggarding monotonies horselaughs pastorale basicity examining monomanias logicizes undergird unavailing papist avions felled furcates" ; + dc:publisher ; + dc:date "2000-07-21"^^xsd:date . +bsbm-inst:ProductFeature989 + rdf:type bsbm:ProductFeature ; + rdfs:label "errantries" ; + rdfs:comment "admiring galipot tinkling roughages minicars briefness librates joggling washiest cerises jolter scottie exosphere sawbones richer sawteeth adulteress interfered plagiaries opticians unmuzzle threated jardinieres removers reliquidating unconsolidated tolled expatiators grubstaked brighteners hullos deformable hailstones criticizes lardier videos soapily gangplow whicker shuffles cams" ; + dc:publisher ; + dc:date "2000-06-25"^^xsd:date . +bsbm-inst:ProductFeature990 + rdf:type bsbm:ProductFeature ; + rdfs:label "toothpicks commonly" ; + rdfs:comment "graces clifts mucilages quintiles saturants crassness bonders leagues cindery multiinfection supervisorship prejudicing goop oftener liaise guilders widest incisiveness shaping hearsed housecleaning protrudes raters syncing hydroelectricity convicts bucko variorums outshone" ; + dc:publisher ; + dc:date "2000-07-01"^^xsd:date . +bsbm-inst:ProductFeature991 + rdf:type bsbm:ProductFeature ; + rdfs:label "recept pneumatically statist" ; + rdfs:comment "epistles lapped incinerating nonsectarian squirts corrosively cashable tantalization poisoners solubilized unceasing gangrening sheriffs panics scilicet tanbarks clingers legislatress announcements groundsheet hoax craggier hydrocephali grafting maidenhood shimmered lentando easements cafes gigawatts actinides invoices bullhorns overreact harrumphed electromotive embroils setons" ; + dc:publisher ; + dc:date "2000-07-19"^^xsd:date . +bsbm-inst:ProductFeature992 + rdf:type bsbm:ProductFeature ; + rdfs:label "hardily authoress" ; + rdfs:comment "hotheadedly sluices restorers bestiality malapertness seasoned resistent valets dislocating songwriter unlucky symbioses lavage upgrades decentralize joisting bunkmates weathercocks mites leapfrogged quoited chino curiosa bleeders ports sitter unremitting incompliancies demandingly wirehair" ; + dc:publisher ; + dc:date "2000-06-26"^^xsd:date . +bsbm-inst:ProductFeature993 + rdf:type bsbm:ProductFeature ; + rdfs:label "terraced" ; + rdfs:comment "sacheted clergies duplicated relies unexpected ceremonialist sadomasochism refuter allelic wavelengths tireder abhorrences reexaminations naturalness honeycombs peridot cutaneously deli pupillary sloshed voiceful obscurities polariscopic caboodle embroiling sprawliest mopier deadwoods informally trenchancy sunroof resupplying heartwood" ; + dc:publisher ; + dc:date "2000-07-10"^^xsd:date . +bsbm-inst:ProductFeature994 + rdf:type bsbm:ProductFeature ; + rdfs:label "brier development scrutinizingly" ; + rdfs:comment "ululations humidification dilatoriness resubscribed thwacked delimitative kingfish intravenously delectably baaing redundantly embalming hedges amenities notochordal letup noncombining polarimetric excogitates grittily eulogists bookworm cleverest dialyzer behaver regulates firebombs semimythical greenrooms perfusing harbored uprousing incivilities plashiest rowed citers tanning razes mineralogical moderators dons daubs sumach" ; + dc:publisher ; + dc:date "2000-07-14"^^xsd:date . +bsbm-inst:ProductFeature995 + rdf:type bsbm:ProductFeature ; + rdfs:label "toplessness apnea landing" ; + rdfs:comment "jiggers screecher ingathers puttered nanowatts canaries swankiest sedgier barbels luringly rankles mercery autobiographies spacers muckrakes invalidates balladeer hydrocephaloid emotionalize moguls cheetahs requisitioner staves pursuers reunify bruiter discomfits valvelets unclothed undersized dogfight attesters shelffuls errs topkicks gearings hectically" ; + dc:publisher ; + dc:date "2000-07-06"^^xsd:date . +bsbm-inst:ProductFeature996 + rdf:type bsbm:ProductFeature ; + rdfs:label "shins metatarsi" ; + rdfs:comment "ahorse inexactness olivinic depths sacrificer omnivores bottlesful piecrust jawbones meditated abbreviates egresses buffaloing slabs suaver enthusiasts fratricides wavelengths manslaughters mucilages adz okaying" ; + dc:publisher ; + dc:date "2000-07-10"^^xsd:date . +bsbm-inst:ProductFeature997 + rdf:type bsbm:ProductFeature ; + rdfs:label "disgustingly whitings engrossers" ; + rdfs:comment "neckless conquering enveloper juggling interlocutress heliotropes undermost activations trunnels multilingual inconsiderateness screecher cliquiest chronics labelled emblazonment exhibitant remoras monistic fameless aigrets saddhu maximizers gunbarrel disassociate dislocates chomps sepaloid emendating abuttals skyscraper adhesiveness digamy uncensured unwillingly fastidiously louisianan winnable fretsaws devastating orangey gunnings tacked bedsore" ; + dc:publisher ; + dc:date "2000-07-18"^^xsd:date . +bsbm-inst:ProductFeature998 + rdf:type bsbm:ProductFeature ; + rdfs:label "downtime corruptness infos" ; + rdfs:comment "braincase gilly breasts inhalers electronics simonizing outswims heckles workhorses rewrapped illiterateness faunally godly highroads inweaves anciens taunting inscrutably toyers shredder noncompliance browniest murexes proas molesters retransmissions ecumenicism agog chippewa stitches phlegm dualistic bioactivity outwear margent hasheeshes plutonic meekest luna ornamenting reassimilate foamers lairdly" ; + dc:publisher ; + dc:date "2000-07-17"^^xsd:date . +bsbm-inst:ProductFeature999 + rdf:type bsbm:ProductFeature ; + rdfs:label "flumped dimmable" ; + rdfs:comment "shoguns spiritualizes swellest lauding retroactivity sapiences floaty housesit suffragans halidoms saxonies havocs lineament mutters bareness admonisher sacristan persecuting immersing stockading linnet creative oarsmen eloper deprogrammed scares unravelling exploiter repellant" ; + dc:publisher ; + dc:date "2000-06-25"^^xsd:date . +dataFromProducer1:Producer1 + rdf:type bsbm:Producer ; + rdfs:label "desensitizations bleachers gentries" ; + rdfs:comment "journalism tramroads chemoreceptive pipets wordless accumulated finches grazed packers eggbeater feebler epileptoid monadism sickened vexes mensas marimbas christianizing leary snowbound" ; + foaf:homepage ; + bsbm:country ; + dc:publisher dataFromProducer1:Producer1 ; + dc:date "2003-06-15"^^xsd:date . +dataFromProducer1:Product1 + rdf:type bsbm:Product ; + rdfs:label "turgescence retrospection" ; + rdfs:comment "attaining requirement legitimately overfatigue blancmange pedestrians druidisms commonwealths woofs hippie muddled livest upstages entourages denominations agrees salves perched theatergoers rigorists nae archimandrite cherty bingos hobnobbed praxeological parsable tetralogy imputers altruisms erecters assegais insinuator overwhelming homemaker conjunctiva filespec adaptability ionizes monogrammed moisteners unburdening walkings invocations riffled salaaming pedantically footworn semplice potholders flasks loopholes actually gushes coworkers cheapening beadroll immensely sibilance ombres stifling extremists" ; + rdf:type bsbm-inst:ProductType11 ; + rdf:type bsbm-inst:ProductType3 ; + rdf:type bsbm-inst:ProductType1 ; + bsbm:productPropertyNumeric1 "831"^^xsd:integer ; + bsbm:productPropertyNumeric2 "312"^^xsd:integer ; + bsbm:productPropertyNumeric3 "735"^^xsd:integer ; + bsbm:productPropertyNumeric5 "150"^^xsd:integer ; + bsbm:productPropertyTextual1 "nontenure declined grubs graybacks barmiest reflective flinching staffs spieler pittance underlips gainsays subcompact"^^xsd:string ; + bsbm:productPropertyTextual2 "anymore alternation alchemies unplugs almshouses obdurately cattish triskaidekaphobe heroics"^^xsd:string ; + bsbm:productPropertyTextual3 "tempers addresses sprinklers disabuses posterities phosgenes evacuation gaudies downer appeared quadrics disguisements fatalism"^^xsd:string ; + bsbm:productPropertyTextual4 "moppers ghostwrites semicivilized knowingly"^^xsd:string ; + bsbm:productFeature bsbm-inst:ProductFeature416 ; + bsbm:productFeature bsbm-inst:ProductFeature418 ; + bsbm:productFeature bsbm-inst:ProductFeature428 ; + bsbm:productFeature bsbm-inst:ProductFeature430 ; + bsbm:productFeature bsbm-inst:ProductFeature432 ; + bsbm:productFeature bsbm-inst:ProductFeature433 ; + bsbm:productFeature bsbm-inst:ProductFeature445 ; + bsbm:productFeature bsbm-inst:ProductFeature449 ; + bsbm:productFeature bsbm-inst:ProductFeature451 ; + bsbm:productFeature bsbm-inst:ProductFeature452 ; + bsbm:productFeature bsbm-inst:ProductFeature38 ; + bsbm:productFeature bsbm-inst:ProductFeature44 ; + bsbm:productFeature bsbm-inst:ProductFeature45 ; + bsbm:productFeature bsbm-inst:ProductFeature57 ; + bsbm:productFeature bsbm-inst:ProductFeature63 ; + bsbm:productFeature bsbm-inst:ProductFeature66 ; + bsbm:productFeature bsbm-inst:ProductFeature69 ; + bsbm:productFeature bsbm-inst:ProductFeature75 ; + bsbm:productFeature bsbm-inst:ProductFeature76 ; + bsbm:producer dataFromProducer1:Producer1 ; + dc:publisher dataFromProducer1:Producer1 ; + dc:date "2000-11-01"^^xsd:date . +dataFromProducer1:Product2 + rdf:type bsbm:Product ; + rdfs:label "anglians" ; + rdfs:comment "yachtswomen waddles hygienes braced thrifts generosities extravagance kefir spermicide preexamination derris jimsonweed carnaubas pleases bullfighting extraterritoriality hugely shakespeareans megalomaniacal gristle reinterpreted ovules jinnee strangulates audiological fatigability unextravagant immanently touzles basketful defoamer crotchet illiterateness savanna ferriage presaging furloughs omahas antedating offishness jailer indecorousness nonferrous scintillating pentagonally hedonic bestialized flatted cocobolo mnemic destructive metatarsally twitching apologize wrecked succeeders circled grips strangulating somewhats fortnightly rencounters clotting barracks polynomials scowlers disavowed rentals fifes stationer bradded matrilineage huddlers graperies disbarment contingency hands metalworking deliriousness avowers duratives retreats georgian backspins lavaliere laughers cannibalize julienne pledgees aught minibus blooped blackish endamages burier accountably moralist overassertively typal reconfirmations reglosses masterfulness wren situational floozy prelimit barrenness decibels expands insults potables romper paleontologists dazzling stipendless slugfest sockeyes enkindled steeplechases unesthetic formulated classifier shouted lutists masses glazieries incompletely talkers scrods insanity unsystematical hickories undress scrumptiously surceased sunrises wagged badinaged scintilla mishearing onenesses" ; + rdf:type bsbm-inst:ProductType15 ; + rdf:type bsbm-inst:ProductType4 ; + rdf:type bsbm-inst:ProductType1 ; + bsbm:productPropertyNumeric1 "1891"^^xsd:integer ; + bsbm:productPropertyNumeric2 "1040"^^xsd:integer ; + bsbm:productPropertyNumeric3 "1731"^^xsd:integer ; + bsbm:productPropertyTextual1 "commercializations pullet comedones demolishing nescients jewelers turtlenecks siblings defoamer"^^xsd:string ; + bsbm:productPropertyTextual2 "columbines perceptivity pulsejet horsefeathers mechanics anaerobe beginners sundowns ichthyophagous ripcord filicide enuretic mallards eelier"^^xsd:string ; + bsbm:productPropertyTextual3 "sophisticates encage masturbatory dollied catalyses deploying transmigrations autobiographic scholarship"^^xsd:string ; + bsbm:productPropertyTextual5 "forums eversions exhibitions liberians vermonters"^^xsd:string ; + bsbm:productFeature bsbm-inst:ProductFeature616 ; + bsbm:productFeature bsbm-inst:ProductFeature620 ; + bsbm:productFeature bsbm-inst:ProductFeature623 ; + bsbm:productFeature bsbm-inst:ProductFeature629 ; + bsbm:productFeature bsbm-inst:ProductFeature633 ; + bsbm:productFeature bsbm-inst:ProductFeature636 ; + bsbm:productFeature bsbm-inst:ProductFeature641 ; + bsbm:productFeature bsbm-inst:ProductFeature644 ; + bsbm:productFeature bsbm-inst:ProductFeature646 ; + bsbm:productFeature bsbm-inst:ProductFeature648 ; + bsbm:productFeature bsbm-inst:ProductFeature662 ; + bsbm:productFeature bsbm-inst:ProductFeature663 ; + bsbm:productFeature bsbm-inst:ProductFeature665 ; + bsbm:productFeature bsbm-inst:ProductFeature666 ; + bsbm:productFeature bsbm-inst:ProductFeature670 ; + bsbm:productFeature bsbm-inst:ProductFeature671 ; + bsbm:productFeature bsbm-inst:ProductFeature673 ; + bsbm:productFeature bsbm-inst:ProductFeature678 ; + bsbm:productFeature bsbm-inst:ProductFeature680 ; + bsbm:productFeature bsbm-inst:ProductFeature78 ; + bsbm:productFeature bsbm-inst:ProductFeature80 ; + bsbm:productFeature bsbm-inst:ProductFeature84 ; + bsbm:productFeature bsbm-inst:ProductFeature87 ; + bsbm:productFeature bsbm-inst:ProductFeature89 ; + bsbm:productFeature bsbm-inst:ProductFeature95 ; + bsbm:productFeature bsbm-inst:ProductFeature96 ; + bsbm:productFeature bsbm-inst:ProductFeature102 ; + bsbm:productFeature bsbm-inst:ProductFeature105 ; + bsbm:productFeature bsbm-inst:ProductFeature123 ; + bsbm:productFeature bsbm-inst:ProductFeature125 ; + bsbm:productFeature bsbm-inst:ProductFeature127 ; + bsbm:productFeature bsbm-inst:ProductFeature129 ; + bsbm:productFeature bsbm-inst:ProductFeature135 ; + bsbm:productFeature bsbm-inst:ProductFeature139 ; + bsbm:producer dataFromProducer1:Producer1 ; + dc:publisher dataFromProducer1:Producer1 ; + dc:date "2005-03-08"^^xsd:date . +dataFromProducer1:Product3 + rdf:type bsbm:Product ; + rdfs:label "tripart" ; + rdfs:comment "caudate plying pedestrians douser outdistanced dingbat disclosures artistries writing versifies premieres transcribed dished instructions proreform chuggers roaster beldames imports indites peacher emperors dismantle pumas speleology conjugation deathtrap predestined absconds auf bollards libre materialized enlistee feelers infancies flummery ringtosses tamboura accedence perkily prerequisites solicitousness rumpuses pistache woosh conjuration benefactrixes integrates scapegraces humidor choppily waspily thrumming resubmission elfishly mangos dirgeful gospels perfuming stockier etherify semimystical herefords doters shoelaces parameciums conned whitsunday imperception desensitizations pathologically glinting bathhouses scrapes porticoes uniforms empiricism shuted tunably ratability reasons stiletted ureas babyhoods invoicing battles thinness recumbencies tops fawner embosoming hacker lasted closest restraightened paramour unfortunately hazier rulings hybridism difficultly chinning roentgenologies retrospection kampuchea abeyancy twofer amenders pyx fraps ai tzardom jelling doggerels diodes roughnesses honcho jaspers tins denigrations soaring tentering encrypts multimillion clamored sippets" ; + rdf:type bsbm-inst:ProductType11 ; + rdf:type bsbm-inst:ProductType3 ; + rdf:type bsbm-inst:ProductType1 ; + bsbm:productPropertyNumeric1 "992"^^xsd:integer ; + bsbm:productPropertyNumeric2 "594"^^xsd:integer ; + bsbm:productPropertyNumeric3 "434"^^xsd:integer ; + bsbm:productPropertyTextual1 "dished vaginae flagpoles hah blurrily pimento blathered antinationalist seamiest"^^xsd:string ; + bsbm:productPropertyTextual2 "frisker indicatives misrepresents nicking outwaited duettist intersexually saddhu unhandier proclamations toreadors towelling haitians pinioning inhumer"^^xsd:string ; + bsbm:productPropertyTextual3 "inkiness suckle commercializations saccharinity baluster cottoning pipers exhalants broomsticks upkeeps jigger"^^xsd:string ; + bsbm:productPropertyTextual5 "tyrannous disallows courages"^^xsd:string ; + bsbm:productFeature bsbm-inst:ProductFeature416 ; + bsbm:productFeature bsbm-inst:ProductFeature419 ; + bsbm:productFeature bsbm-inst:ProductFeature427 ; + bsbm:productFeature bsbm-inst:ProductFeature434 ; + bsbm:productFeature bsbm-inst:ProductFeature436 ; + bsbm:productFeature bsbm-inst:ProductFeature438 ; + bsbm:productFeature bsbm-inst:ProductFeature442 ; + bsbm:productFeature bsbm-inst:ProductFeature51 ; + bsbm:productFeature bsbm-inst:ProductFeature53 ; + bsbm:productFeature bsbm-inst:ProductFeature62 ; + bsbm:productFeature bsbm-inst:ProductFeature69 ; + bsbm:productFeature bsbm-inst:ProductFeature71 ; + bsbm:productFeature bsbm-inst:ProductFeature75 ; + bsbm:producer dataFromProducer1:Producer1 ; + dc:publisher dataFromProducer1:Producer1 ; + dc:date "2001-05-18"^^xsd:date . +dataFromProducer1:Product4 + rdf:type bsbm:Product ; + rdfs:label "feistiest horst keepsake" ; + rdfs:comment "spindled builder solemnizing bismuthic terrified multipliers unobtrusiveness mushily unchastened recompilation spired seaworthy entail wallah karakul horsier emulated gloriously shrimpiest direfully roasts linters bedsides nubilities perukes acetaminophen regauge skivvies widish hideousness unlearning minuted troubles sheepfold semirespectable sitting rephrases hiccup prepositional beseems invading gyre upload ventrals depoliticized battings valvar intensiveness disestablished tragicomedy incriminatory moulted mousses tarsus dismast massacrers spanner jingoists plaits phototropism habituation thunderclaps focalizes moldier dinners officialities centrally sacredly retaker rototills voucher refry windscreen underwrite floatages swerves pricer destroyers coryzal annihilating arras affectations vulgarizes grooming booths grubstaker sportsmanship gunfires hexahedral intermediaries requirement sheepman amerce knighthoods criterions curators illustriously coquets encampments cushioning measlier refinancing detoxicated parenthetical metalized skald phosphorescence tradename resalable prearrangement capable sassies damnify thankyou granulations paramecia warfares defiling earless actualize foetid lamias compted highhandedness paddling seismographs sharpness disharmonies vaunting pared reprehensibly sharkskins blonds rancour salmagundi armories hitchhiker charnels poetries" ; + rdf:type bsbm-inst:ProductType15 ; + rdf:type bsbm-inst:ProductType4 ; + rdf:type bsbm-inst:ProductType1 ; + bsbm:productPropertyNumeric1 "227"^^xsd:integer ; + bsbm:productPropertyNumeric2 "940"^^xsd:integer ; + bsbm:productPropertyNumeric3 "290"^^xsd:integer ; + bsbm:productPropertyNumeric6 "1788"^^xsd:integer ; + bsbm:productPropertyTextual1 "kopecks backdate vivacities restrictionism dozens stickman vandals nuncupative coordinative ponces pulsator incumbrance"^^xsd:string ; + bsbm:productPropertyTextual2 "luxuriantly pennon multiples undid flatfeet rhumbaed"^^xsd:string ; + bsbm:productPropertyTextual3 "trickingly mangrove opposes inventors undisputable tinfuls ursiform forsaking uncouple whirlers stacked dreads dynamisms"^^xsd:string ; + bsbm:productPropertyTextual6 "washstand sideswiper superposes unmanageable noncausal squadroned lemur husbanded moneymaking sextons scissoring disembark parlor"^^xsd:string ; + bsbm:productFeature bsbm-inst:ProductFeature617 ; + bsbm:productFeature bsbm-inst:ProductFeature618 ; + bsbm:productFeature bsbm-inst:ProductFeature619 ; + bsbm:productFeature bsbm-inst:ProductFeature629 ; + bsbm:productFeature bsbm-inst:ProductFeature631 ; + bsbm:productFeature bsbm-inst:ProductFeature634 ; + bsbm:productFeature bsbm-inst:ProductFeature637 ; + bsbm:productFeature bsbm-inst:ProductFeature642 ; + bsbm:productFeature bsbm-inst:ProductFeature643 ; + bsbm:productFeature bsbm-inst:ProductFeature644 ; + bsbm:productFeature bsbm-inst:ProductFeature646 ; + bsbm:productFeature bsbm-inst:ProductFeature650 ; + bsbm:productFeature bsbm-inst:ProductFeature653 ; + bsbm:productFeature bsbm-inst:ProductFeature655 ; + bsbm:productFeature bsbm-inst:ProductFeature656 ; + bsbm:productFeature bsbm-inst:ProductFeature657 ; + bsbm:productFeature bsbm-inst:ProductFeature668 ; + bsbm:productFeature bsbm-inst:ProductFeature669 ; + bsbm:productFeature bsbm-inst:ProductFeature676 ; + bsbm:productFeature bsbm-inst:ProductFeature679 ; + bsbm:productFeature bsbm-inst:ProductFeature79 ; + bsbm:productFeature bsbm-inst:ProductFeature83 ; + bsbm:productFeature bsbm-inst:ProductFeature86 ; + bsbm:productFeature bsbm-inst:ProductFeature93 ; + bsbm:productFeature bsbm-inst:ProductFeature95 ; + bsbm:productFeature bsbm-inst:ProductFeature104 ; + bsbm:productFeature bsbm-inst:ProductFeature113 ; + bsbm:productFeature bsbm-inst:ProductFeature116 ; + bsbm:productFeature bsbm-inst:ProductFeature119 ; + bsbm:productFeature bsbm-inst:ProductFeature121 ; + bsbm:productFeature bsbm-inst:ProductFeature125 ; + bsbm:productFeature bsbm-inst:ProductFeature128 ; + bsbm:productFeature bsbm-inst:ProductFeature139 ; + bsbm:producer dataFromProducer1:Producer1 ; + dc:publisher dataFromProducer1:Producer1 ; + dc:date "2006-09-01"^^xsd:date . +dataFromProducer1:Product5 + rdf:type bsbm:Product ; + rdfs:label "optimizes earthily" ; + rdfs:comment "anonymously incinerator mamboing analogues intimation punched unacceptance reechoes fortunetelling lengtheners collectedly soarings distracted gatefold prankish calved feists ecru sanctions chemotropism nonbelligerents hypnotically frumpily hippos bauds feoff viragoes scamping objects voiders disentangles californian bioluminescence toothpicks gaseously sphinxes prefigured robes nictitating honorifically conciliations daturas holystones grubber serrating draper consolidated schnauzer homolog ghettoize woeness surplices acumens dinners khakis perkiness preconstruct blacking scoriae imperialism anywheres palpitated ultimacies unsnaps unequalled scorepad gabbiness retrorockets yabbers koppies obsoleted variably muzzy booms tossup tabling uncoil dammer grassers tutorages salvable trinitarianism harpist vaultings untying caracal flavonol dandled spavined preamplifiers perspires sagy backbitten recollection insurgences sacramentally messing chalcedonies permutational thefts possessively dons polit leucocyte disarming dermatologist posthypnotic fichus psychologizing hobbled instigators distillers revivers korean addiction translative muches" ; + rdf:type bsbm-inst:ProductType10 ; + rdf:type bsbm-inst:ProductType3 ; + rdf:type bsbm-inst:ProductType1 ; + bsbm:productPropertyNumeric1 "1920"^^xsd:integer ; + bsbm:productPropertyNumeric2 "834"^^xsd:integer ; + bsbm:productPropertyNumeric3 "450"^^xsd:integer ; + bsbm:productPropertyNumeric4 "736"^^xsd:integer ; + bsbm:productPropertyTextual1 "formalized preconsultation skirled pretaste winchers repast yeti tickings untimely bilobed fundi stealers linnets"^^xsd:string ; + bsbm:productPropertyTextual2 "syphiloid helpings prudence systemize"^^xsd:string ; + bsbm:productPropertyTextual3 "polyesters telephotographing defoliator permissiveness digits leachy hackworks ontogenetically agitation avast geoids trendier skilled capacitances switchblades"^^xsd:string ; + bsbm:productFeature bsbm-inst:ProductFeature373 ; + bsbm:productFeature bsbm-inst:ProductFeature375 ; + bsbm:productFeature bsbm-inst:ProductFeature376 ; + bsbm:productFeature bsbm-inst:ProductFeature382 ; + bsbm:productFeature bsbm-inst:ProductFeature387 ; + bsbm:productFeature bsbm-inst:ProductFeature393 ; + bsbm:productFeature bsbm-inst:ProductFeature394 ; + bsbm:productFeature bsbm-inst:ProductFeature397 ; + bsbm:productFeature bsbm-inst:ProductFeature410 ; + bsbm:productFeature bsbm-inst:ProductFeature413 ; + bsbm:productFeature bsbm-inst:ProductFeature37 ; + bsbm:productFeature bsbm-inst:ProductFeature39 ; + bsbm:productFeature bsbm-inst:ProductFeature43 ; + bsbm:productFeature bsbm-inst:ProductFeature52 ; + bsbm:productFeature bsbm-inst:ProductFeature61 ; + bsbm:productFeature bsbm-inst:ProductFeature64 ; + bsbm:productFeature bsbm-inst:ProductFeature66 ; + bsbm:productFeature bsbm-inst:ProductFeature67 ; + bsbm:productFeature bsbm-inst:ProductFeature69 ; + bsbm:productFeature bsbm-inst:ProductFeature70 ; + bsbm:productFeature bsbm-inst:ProductFeature72 ; + bsbm:productFeature bsbm-inst:ProductFeature73 ; + bsbm:productFeature bsbm-inst:ProductFeature75 ; + bsbm:producer dataFromProducer1:Producer1 ; + dc:publisher dataFromProducer1:Producer1 ; + dc:date "2001-09-16"^^xsd:date . +dataFromProducer1:Product6 + rdf:type bsbm:Product ; + rdfs:label "whistling usurers carried" ; + rdfs:comment "redoubled uninstructed cameras buffy gnarls vacillations inspiriting warmths outspelling reworks vesperal woolliest nohow titillation perturbational invader reassertion choired administratrices imagines rewound dealers invocated regathering carryovers archaeologists overinsure staphylococci inscrutability ephesians dabbling brassies monozygotic pointillist vialled tinily reacceding noncohesiveness shrined constituents collared extrication overdressed salvagees ringsides supercedes demount sauropods gastronomic genitals cannulas gutlike thudding wetting cicatrices finns retaliators yeastiest attiring witchings nontemporally localizing eradicates canalise formalizes forestalling reinscribe manuals marrowing infamies shepherdess tortuosity retroactivity insensately viviparously dishonorableness animalistic signories danged browbeat systemizes" ; + rdf:type bsbm-inst:ProductType17 ; + rdf:type bsbm-inst:ProductType4 ; + rdf:type bsbm-inst:ProductType1 ; + bsbm:productPropertyNumeric1 "202"^^xsd:integer ; + bsbm:productPropertyNumeric2 "27"^^xsd:integer ; + bsbm:productPropertyNumeric3 "374"^^xsd:integer ; + bsbm:productPropertyNumeric4 "536"^^xsd:integer ; + bsbm:productPropertyTextual1 "measled paganize disgruntling labelers xenoliths idlest sampan giddiest heartwood accelerando armatures forejudge sayable oms unshaded"^^xsd:string ; + bsbm:productPropertyTextual2 "suppertime crossways feeding teratism venisons rictus classily fills abnegators aversely spades expandable commodiousness"^^xsd:string ; + bsbm:productPropertyTextual3 "unfaithfulness overfeed trotted nettliest exertive extendibility upchuck massless busyworks cauls spoilages enchiladas"^^xsd:string ; + bsbm:productPropertyTextual4 "morphogenesis coaevals hydrangeas muffs grot lobotomies jockeying pigheadedness axolotls emeries rebellions comprehensibility hasidic valedictorians tonger"^^xsd:string ; + bsbm:productPropertyTextual5 "centenaries endorsement heterodox patted cameroonians operatively normed openendedness embalmers dinners"^^xsd:string ; + bsbm:productFeature bsbm-inst:ProductFeature749 ; + bsbm:productFeature bsbm-inst:ProductFeature752 ; + bsbm:productFeature bsbm-inst:ProductFeature754 ; + bsbm:productFeature bsbm-inst:ProductFeature755 ; + bsbm:productFeature bsbm-inst:ProductFeature761 ; + bsbm:productFeature bsbm-inst:ProductFeature762 ; + bsbm:productFeature bsbm-inst:ProductFeature769 ; + bsbm:productFeature bsbm-inst:ProductFeature771 ; + bsbm:productFeature bsbm-inst:ProductFeature772 ; + bsbm:productFeature bsbm-inst:ProductFeature773 ; + bsbm:productFeature bsbm-inst:ProductFeature774 ; + bsbm:productFeature bsbm-inst:ProductFeature778 ; + bsbm:productFeature bsbm-inst:ProductFeature782 ; + bsbm:productFeature bsbm-inst:ProductFeature786 ; + bsbm:productFeature bsbm-inst:ProductFeature788 ; + bsbm:productFeature bsbm-inst:ProductFeature791 ; + bsbm:productFeature bsbm-inst:ProductFeature792 ; + bsbm:productFeature bsbm-inst:ProductFeature795 ; + bsbm:productFeature bsbm-inst:ProductFeature798 ; + bsbm:productFeature bsbm-inst:ProductFeature801 ; + bsbm:productFeature bsbm-inst:ProductFeature802 ; + bsbm:productFeature bsbm-inst:ProductFeature810 ; + bsbm:productFeature bsbm-inst:ProductFeature87 ; + bsbm:productFeature bsbm-inst:ProductFeature88 ; + bsbm:productFeature bsbm-inst:ProductFeature89 ; + bsbm:productFeature bsbm-inst:ProductFeature94 ; + bsbm:productFeature bsbm-inst:ProductFeature97 ; + bsbm:productFeature bsbm-inst:ProductFeature98 ; + bsbm:productFeature bsbm-inst:ProductFeature102 ; + bsbm:productFeature bsbm-inst:ProductFeature106 ; + bsbm:productFeature bsbm-inst:ProductFeature115 ; + bsbm:productFeature bsbm-inst:ProductFeature119 ; + bsbm:productFeature bsbm-inst:ProductFeature122 ; + bsbm:productFeature bsbm-inst:ProductFeature127 ; + bsbm:productFeature bsbm-inst:ProductFeature130 ; + bsbm:productFeature bsbm-inst:ProductFeature131 ; + bsbm:productFeature bsbm-inst:ProductFeature135 ; + bsbm:productFeature bsbm-inst:ProductFeature137 ; + bsbm:producer dataFromProducer1:Producer1 ; + dc:publisher dataFromProducer1:Producer1 ; + dc:date "2004-07-20"^^xsd:date . +dataFromProducer1:Product7 + rdf:type bsbm:Product ; + rdfs:label "pillions covenanting economies" ; + rdfs:comment "twopence pickling cyclicly warthog inconvertibility incorrigibly reasserting nightclothes prodigies quieten esquiring gregorian simpatico melanesians wholewheat scoutmasters noncentral bassoon nondivisible manifolds matriculation sepalous reexpression overrules preschool recapitulations unrest ployed smirkers finochio unaccountably colts disport dankly hummable abscam enjoyably veils mockups revisionism airheads simonist anaemia dipped calipering zizzles valuably pressurize unswervingly ie conniptions deplorer colitises devas gravimeters nightshades totaling fabling thumped liturgies crushing graphology waffling providently redded lampooner" ; + rdf:type bsbm-inst:ProductType14 ; + rdf:type bsbm-inst:ProductType4 ; + rdf:type bsbm-inst:ProductType1 ; + bsbm:productPropertyNumeric1 "1567"^^xsd:integer ; + bsbm:productPropertyNumeric2 "813"^^xsd:integer ; + bsbm:productPropertyNumeric3 "1900"^^xsd:integer ; + bsbm:productPropertyNumeric5 "774"^^xsd:integer ; + bsbm:productPropertyTextual1 "simplemindedness remedying pennon benefactrix blooper artiness tillage folksongs devised gormandized"^^xsd:string ; + bsbm:productPropertyTextual2 "hurts unriddling antiacid modishly lopped refractionist wenny comminatory koshering abolisher loitered unverifiable vouchees recessional misprisions"^^xsd:string ; + bsbm:productPropertyTextual3 "calibrated refractor pandowdies mantelpiece felloe hypothermal"^^xsd:string ; + bsbm:productPropertyTextual5 "ohing incitants vitiation transfusers unapt recites pongee sensuousness"^^xsd:string ; + bsbm:productFeature bsbm-inst:ProductFeature572 ; + bsbm:productFeature bsbm-inst:ProductFeature578 ; + bsbm:productFeature bsbm-inst:ProductFeature581 ; + bsbm:productFeature bsbm-inst:ProductFeature591 ; + bsbm:productFeature bsbm-inst:ProductFeature593 ; + bsbm:productFeature bsbm-inst:ProductFeature594 ; + bsbm:productFeature bsbm-inst:ProductFeature595 ; + bsbm:productFeature bsbm-inst:ProductFeature598 ; + bsbm:productFeature bsbm-inst:ProductFeature600 ; + bsbm:productFeature bsbm-inst:ProductFeature601 ; + bsbm:productFeature bsbm-inst:ProductFeature606 ; + bsbm:productFeature bsbm-inst:ProductFeature611 ; + bsbm:productFeature bsbm-inst:ProductFeature78 ; + bsbm:productFeature bsbm-inst:ProductFeature83 ; + bsbm:productFeature bsbm-inst:ProductFeature84 ; + bsbm:productFeature bsbm-inst:ProductFeature86 ; + bsbm:productFeature bsbm-inst:ProductFeature90 ; + bsbm:productFeature bsbm-inst:ProductFeature94 ; + bsbm:productFeature bsbm-inst:ProductFeature97 ; + bsbm:productFeature bsbm-inst:ProductFeature101 ; + bsbm:productFeature bsbm-inst:ProductFeature106 ; + bsbm:productFeature bsbm-inst:ProductFeature110 ; + bsbm:productFeature bsbm-inst:ProductFeature112 ; + bsbm:productFeature bsbm-inst:ProductFeature114 ; + bsbm:productFeature bsbm-inst:ProductFeature119 ; + bsbm:productFeature bsbm-inst:ProductFeature122 ; + bsbm:productFeature bsbm-inst:ProductFeature123 ; + bsbm:productFeature bsbm-inst:ProductFeature130 ; + bsbm:productFeature bsbm-inst:ProductFeature134 ; + bsbm:productFeature bsbm-inst:ProductFeature135 ; + bsbm:productFeature bsbm-inst:ProductFeature136 ; + bsbm:productFeature bsbm-inst:ProductFeature137 ; + bsbm:producer dataFromProducer1:Producer1 ; + dc:publisher dataFromProducer1:Producer1 ; + dc:date "2004-09-03"^^xsd:date . +dataFromProducer1:Product8 + rdf:type bsbm:Product ; + rdfs:label "stringless dentine installment" ; + rdfs:comment "spathed inverters enclosing steads whiny radioisotopic seduces alongshore lexicographical terminally teamworks candidly wisting deckhands overeating gastronomes wholesomely subsequent refined liberators unquieter epitaphs purveyed gaffers praiseworthily monkeys detractors insides graphology orlon immunosuppressants polygram moodiest thereamong pirated reverberant connective sackbuts relegable preexposure intercommunication consultations glads encouragements ceaseless inhabits immenser sweatily wolfers plaids exploiter bloodsuckers fleshers teazled decentralizes airdrome coquettishly artillerist martialed mazel prated visited fineness cockspurs gullable splasher accelerating khedive traceries dethrones crudded quilters poisoned prounion woodnotes inhaled additionally fourteens discotheques trysting ravens weeviled disparaging eructed tacker unregimented antispasmodics commons normals existences narwal ammonite filtered mezuza stabilizers insemination bones smashable pares granulators reinflaming oceanauts ambushment retiringly punters lakeports flinting senates gullies cadets slaw logicizing stodgily parser drawers nonprofessional swordsman acrimoniously cables epistolary corned lethalities kiboshes routinizing suitings subway vertebrated unpitied kl mononucleoses pathfinders stammered laster equivalences overambitiously droner effecters shekel songbirds" ; + rdf:type bsbm-inst:ProductType16 ; + rdf:type bsbm-inst:ProductType4 ; + rdf:type bsbm-inst:ProductType1 ; + bsbm:productPropertyNumeric1 "66"^^xsd:integer ; + bsbm:productPropertyNumeric2 "1743"^^xsd:integer ; + bsbm:productPropertyNumeric3 "136"^^xsd:integer ; + bsbm:productPropertyNumeric5 "867"^^xsd:integer ; + bsbm:productPropertyTextual1 "reignited retrace quadrennials monkshoods warring"^^xsd:string ; + bsbm:productPropertyTextual2 "screening venosities oxbloods befuddlers taphole husbandlike howbeit loadings hydrotherapist baggies seadogs sassily"^^xsd:string ; + bsbm:productPropertyTextual3 "recouping marvelling smilingly machinized corslets reshipping wainscots xanthippe misapplier"^^xsd:string ; + bsbm:productFeature bsbm-inst:ProductFeature685 ; + bsbm:productFeature bsbm-inst:ProductFeature689 ; + bsbm:productFeature bsbm-inst:ProductFeature690 ; + bsbm:productFeature bsbm-inst:ProductFeature692 ; + bsbm:productFeature bsbm-inst:ProductFeature693 ; + bsbm:productFeature bsbm-inst:ProductFeature694 ; + bsbm:productFeature bsbm-inst:ProductFeature695 ; + bsbm:productFeature bsbm-inst:ProductFeature700 ; + bsbm:productFeature bsbm-inst:ProductFeature711 ; + bsbm:productFeature bsbm-inst:ProductFeature715 ; + bsbm:productFeature bsbm-inst:ProductFeature718 ; + bsbm:productFeature bsbm-inst:ProductFeature728 ; + bsbm:productFeature bsbm-inst:ProductFeature735 ; + bsbm:productFeature bsbm-inst:ProductFeature738 ; + bsbm:productFeature bsbm-inst:ProductFeature743 ; + bsbm:productFeature bsbm-inst:ProductFeature744 ; + bsbm:productFeature bsbm-inst:ProductFeature746 ; + bsbm:productFeature bsbm-inst:ProductFeature77 ; + bsbm:productFeature bsbm-inst:ProductFeature81 ; + bsbm:productFeature bsbm-inst:ProductFeature85 ; + bsbm:productFeature bsbm-inst:ProductFeature86 ; + bsbm:productFeature bsbm-inst:ProductFeature88 ; + bsbm:productFeature bsbm-inst:ProductFeature100 ; + bsbm:productFeature bsbm-inst:ProductFeature101 ; + bsbm:productFeature bsbm-inst:ProductFeature104 ; + bsbm:productFeature bsbm-inst:ProductFeature106 ; + bsbm:productFeature bsbm-inst:ProductFeature109 ; + bsbm:productFeature bsbm-inst:ProductFeature111 ; + bsbm:productFeature bsbm-inst:ProductFeature114 ; + bsbm:productFeature bsbm-inst:ProductFeature125 ; + bsbm:productFeature bsbm-inst:ProductFeature129 ; + bsbm:productFeature bsbm-inst:ProductFeature139 ; + bsbm:producer dataFromProducer1:Producer1 ; + dc:publisher dataFromProducer1:Producer1 ; + dc:date "2003-07-23"^^xsd:date . +dataFromProducer1:Product9 + rdf:type bsbm:Product ; + rdfs:label "anytime conservators flivver" ; + rdfs:comment "buttons enigmata prizewinner gelder tartrated grilling flatfishes anxieties diestocks spectres pentateuchal directs boutonnieres baldachins preemptions waterborne libbing snuggest conjunctiva unsuited besmoke curvedly sesterce impotency pygmyism prohibiting presences federations flounces exigencies philosophized contrariness haruspex chutnees numerically monkery intercommunicate jackknifing egoisms slugs grimed cleaved demoralize streamlined emollient vendettas describing drawstring clarifier farewells towline fructoses repaint volleys harpers wifedoms gunnings allocations dermatologists ineffectiveness drownds bihourly agelong preachiest batteau graphs cuteys scrambled fermentable monetizes croaky ectomorph offeror harkener waterworthy totipotencies darters diatribes catheters expediencies existentialist prowesses contradistinctive chromospheres fileted emulsifies teratism spuming unease burbles turfed coalers bywords empaneled misguides leaching foolisher emotionless staffer pulsars ours dayroom" ; + rdf:type bsbm-inst:ProductType9 ; + rdf:type bsbm-inst:ProductType2 ; + rdf:type bsbm-inst:ProductType1 ; + bsbm:productPropertyNumeric1 "1504"^^xsd:integer ; + bsbm:productPropertyNumeric2 "1010"^^xsd:integer ; + bsbm:productPropertyNumeric3 "1517"^^xsd:integer ; + bsbm:productPropertyNumeric4 "90"^^xsd:integer ; + bsbm:productPropertyNumeric5 "1980"^^xsd:integer ; + bsbm:productPropertyTextual1 "antirust brainwashers lisping tarantulas mortarboard incinerating introspection steamer concussing chronological troublemakers notables conformationally engulfed pesticidal"^^xsd:string ; + bsbm:productPropertyTextual2 "tireless jackroll sheafed jimmies potlucks houseful"^^xsd:string ; + bsbm:productPropertyTextual3 "peewits mediately tamable lullingly preempted swagged refunder submachine eclecticism"^^xsd:string ; + bsbm:productPropertyTextual4 "unfavorably algebras primordially biotelemetries lippers spatulas illegitimated validation sucks profligates shellacks mainstays hijacked titty"^^xsd:string ; + bsbm:productPropertyTextual5 "carbuncular zealousness imperiled roguishness hosteler trudged imitating outfield"^^xsd:string ; + bsbm:productFeature bsbm-inst:ProductFeature327 ; + bsbm:productFeature bsbm-inst:ProductFeature330 ; + bsbm:productFeature bsbm-inst:ProductFeature340 ; + bsbm:productFeature bsbm-inst:ProductFeature357 ; + bsbm:productFeature bsbm-inst:ProductFeature3 ; + bsbm:productFeature bsbm-inst:ProductFeature5 ; + bsbm:productFeature bsbm-inst:ProductFeature8 ; + bsbm:productFeature bsbm-inst:ProductFeature9 ; + bsbm:productFeature bsbm-inst:ProductFeature19 ; + bsbm:productFeature bsbm-inst:ProductFeature22 ; + bsbm:productFeature bsbm-inst:ProductFeature28 ; + bsbm:productFeature bsbm-inst:ProductFeature31 ; + bsbm:productFeature bsbm-inst:ProductFeature34 ; + bsbm:productFeature bsbm-inst:ProductFeature36 ; + bsbm:producer dataFromProducer1:Producer1 ; + dc:publisher dataFromProducer1:Producer1 ; + dc:date "2005-07-22"^^xsd:date . +dataFromProducer1:Product10 + rdf:type bsbm:Product ; + rdfs:label "merer" ; + rdfs:comment "bluegum aboded cohering undercover limousines treated bedumbs chummily rambunctiousness paunchier atomize congee underbidding mephitis cascades asserted governableness amidship confection suborned transferer middays escudos aromas diagraphs budders bushelers pastilles foreboder stormily likest shipyards tamboura cadgers trusteeship specificized bondmaids pinky introverted mandible bashfulness disposition crudeness pretesting achiest antiparticles palookas cryonics supraliminal encouraging blackmails immenser draws bedspreads jimsonweed birdman facers babblings indiscretions misruling possessions oversalts naturalizing chatting helved divulgement symptomatological argentic impressibility gracioso serigrapher reaper slinger threatening tattooed consortia soapbark electing ethylated armistices hermitic squib erased sedative suicidally craftsmanship shammies arises greasily deoxidizer enveloper miscellaneousness anglicizes khedive commissioned belligerently crashers quitter fleetingness abnegations engirdled zyzzyva bulletproof purulency ploughing frailness deliverers preadjustable donnish portly infinitesimals prospectors mobbish freshest revering motorcade" ; + rdf:type bsbm-inst:ProductType11 ; + rdf:type bsbm-inst:ProductType3 ; + rdf:type bsbm-inst:ProductType1 ; + bsbm:productPropertyNumeric1 "133"^^xsd:integer ; + bsbm:productPropertyNumeric2 "141"^^xsd:integer ; + bsbm:productPropertyNumeric3 "1580"^^xsd:integer ; + bsbm:productPropertyNumeric4 "1194"^^xsd:integer ; + bsbm:productPropertyNumeric5 "525"^^xsd:integer ; + bsbm:productPropertyTextual1 "recollected plenipotentiaries unbelievable bigamies mossiness droners"^^xsd:string ; + bsbm:productPropertyTextual2 "unfroze paisanos intertangle lintier retrogressions wooly bathrobes endplates surceasing franchiser saltworks unrestored crudded prescriptions forelands"^^xsd:string ; + bsbm:productPropertyTextual3 "winnowed frankincense unsatisfiable homeopathically jeweller expediters"^^xsd:string ; + bsbm:productPropertyTextual4 "relinked lignitic pyromaniacs shutterbugs ribbony dismissing"^^xsd:string ; + bsbm:productPropertyTextual5 "climatotherapy immorality banjos shortcuts idolizers coplots"^^xsd:string ; + bsbm:productFeature bsbm-inst:ProductFeature418 ; + bsbm:productFeature bsbm-inst:ProductFeature420 ; + bsbm:productFeature bsbm-inst:ProductFeature421 ; + bsbm:productFeature bsbm-inst:ProductFeature431 ; + bsbm:productFeature bsbm-inst:ProductFeature433 ; + bsbm:productFeature bsbm-inst:ProductFeature436 ; + bsbm:productFeature bsbm-inst:ProductFeature444 ; + bsbm:productFeature bsbm-inst:ProductFeature451 ; + bsbm:productFeature bsbm-inst:ProductFeature48 ; + bsbm:productFeature bsbm-inst:ProductFeature49 ; + bsbm:productFeature bsbm-inst:ProductFeature54 ; + bsbm:productFeature bsbm-inst:ProductFeature55 ; + bsbm:productFeature bsbm-inst:ProductFeature56 ; + bsbm:productFeature bsbm-inst:ProductFeature63 ; + bsbm:productFeature bsbm-inst:ProductFeature64 ; + bsbm:productFeature bsbm-inst:ProductFeature67 ; + bsbm:productFeature bsbm-inst:ProductFeature72 ; + bsbm:producer dataFromProducer1:Producer1 ; + dc:publisher dataFromProducer1:Producer1 ; + dc:date "2005-09-29"^^xsd:date . +dataFromProducer1:Product11 + rdf:type bsbm:Product ; + rdfs:label "absolvers pomades" ; + rdfs:comment "hardwoods eagerly handrail germinations rudely tunnellers apothecaries smites deathless slipways colorful cosiest plats appositive rests reemploying roadways withes collectedly rearers reaccept timer calmant omnivorously controllably mailwoman preaffirm downlinking insanity recompute electrochemically annuities ungathered bestiary swash misanthropies talebearers guffaws bespoken tricolor laboredly blueprinted fairyland jillions yearners incidence phonetics legitimizes chaconnes alienates courante antimissile toppled deselects fruiting disputants rotifer ringmasters aggrandizing capuchins swamped conjecturable rebbes watchfully mercenarily emboweling anopheles apologists cookable clunking conformism sledded cajaput disengages scarfpins hieratically weatherworn encrypting bereaving recane gecks silesia hormonal powerlessly bowered miscarried decomposed firth fallowed invokers gypped landownership dehumidified gladding capsuling confiscations bandmaster" ; + rdf:type bsbm-inst:ProductType6 ; + rdf:type bsbm-inst:ProductType2 ; + rdf:type bsbm-inst:ProductType1 ; + bsbm:productPropertyNumeric1 "58"^^xsd:integer ; + bsbm:productPropertyNumeric2 "365"^^xsd:integer ; + bsbm:productPropertyNumeric3 "838"^^xsd:integer ; + bsbm:productPropertyNumeric6 "1242"^^xsd:integer ; + bsbm:productPropertyTextual1 "yearbooks carburizes fibrinous croqueted misfile furnaced maturely surrendering plugged eternise woodsiest freestanding"^^xsd:string ; + bsbm:productPropertyTextual2 "mooring funneled momentoes scythes loins potshard scantier animist necropolises revolver jugulars"^^xsd:string ; + bsbm:productPropertyTextual3 "acquits lumpen refurnish breeched detaching cowries visored rebater rakes reactionaries gasher liftman saprophyte predigest cockatoos"^^xsd:string ; + bsbm:productFeature bsbm-inst:ProductFeature185 ; + bsbm:productFeature bsbm-inst:ProductFeature186 ; + bsbm:productFeature bsbm-inst:ProductFeature189 ; + bsbm:productFeature bsbm-inst:ProductFeature193 ; + bsbm:productFeature bsbm-inst:ProductFeature199 ; + bsbm:productFeature bsbm-inst:ProductFeature200 ; + bsbm:productFeature bsbm-inst:ProductFeature201 ; + bsbm:productFeature bsbm-inst:ProductFeature203 ; + bsbm:productFeature bsbm-inst:ProductFeature206 ; + bsbm:productFeature bsbm-inst:ProductFeature207 ; + bsbm:productFeature bsbm-inst:ProductFeature209 ; + bsbm:productFeature bsbm-inst:ProductFeature215 ; + bsbm:productFeature bsbm-inst:ProductFeature216 ; + bsbm:productFeature bsbm-inst:ProductFeature220 ; + bsbm:productFeature bsbm-inst:ProductFeature9 ; + bsbm:productFeature bsbm-inst:ProductFeature11 ; + bsbm:productFeature bsbm-inst:ProductFeature14 ; + bsbm:productFeature bsbm-inst:ProductFeature16 ; + bsbm:productFeature bsbm-inst:ProductFeature19 ; + bsbm:productFeature bsbm-inst:ProductFeature25 ; + bsbm:productFeature bsbm-inst:ProductFeature27 ; + bsbm:producer dataFromProducer1:Producer1 ; + dc:publisher dataFromProducer1:Producer1 ; + dc:date "2002-03-12"^^xsd:date . +dataFromProducer1:Product12 + rdf:type bsbm:Product ; + rdfs:label "swells" ; + rdfs:comment "placably journalism laxness foreclosure auditing intromittent cyanosis knacks transoms stepfather rockeries membranously intoning darkies suspends spoored heartrending listings reenlighten gulled distortional violences shingly icehouse disconcertingly zippers syphoning misnumbers devoted uncork grislier tanbarks entrain loathes approx housewifely capper incurious ichorous replenished si distension suspectedness eyespots threshes pryer bariums orientates loitering skits scampering skilful coruscating harelipped annealers frailest nitwits playgoer acorns maladjusted fawningly wonkier flutier erections kapoks unpledged tallness knouted contrarily perches remunerates portaged praus hispanics toppings negotiability razoring mezquites despoilments sixteens chitters herniation marshalls satirized fopperies dalles poetaster gripple subdialect stained germinated victors glowfly jumbler revealing hotheaded screes adaptableness offensiveness overwrite plyers standardizing precisest gentrification contractually unfolding gravitationally" ; + rdf:type bsbm-inst:ProductType6 ; + rdf:type bsbm-inst:ProductType2 ; + rdf:type bsbm-inst:ProductType1 ; + bsbm:productPropertyNumeric1 "1722"^^xsd:integer ; + bsbm:productPropertyNumeric2 "779"^^xsd:integer ; + bsbm:productPropertyNumeric3 "540"^^xsd:integer ; + bsbm:productPropertyNumeric4 "1213"^^xsd:integer ; + bsbm:productPropertyNumeric5 "556"^^xsd:integer ; + bsbm:productPropertyTextual1 "furrowed unkennels promonarchist podgy pitchmen smoothie"^^xsd:string ; + bsbm:productPropertyTextual2 "recross huckstering punisher outyell wardenship chloroforming steppingstones dallying gulden"^^xsd:string ; + bsbm:productPropertyTextual3 "complimenting cannabinol fundament"^^xsd:string ; + bsbm:productPropertyTextual4 "jumpingly circularizes accessability decompressive fragments geoids toothaches ados rocketry sweetbrier leis monochromatically hopsacks anticyclones ferrying"^^xsd:string ; + bsbm:productPropertyTextual5 "huzzahs offtrack customshouse chuggers fuzzily blessers fineries loamiest hauled pule tantras"^^xsd:string ; + bsbm:productFeature bsbm-inst:ProductFeature185 ; + bsbm:productFeature bsbm-inst:ProductFeature191 ; + bsbm:productFeature bsbm-inst:ProductFeature201 ; + bsbm:productFeature bsbm-inst:ProductFeature203 ; + bsbm:productFeature bsbm-inst:ProductFeature207 ; + bsbm:productFeature bsbm-inst:ProductFeature216 ; + bsbm:productFeature bsbm-inst:ProductFeature218 ; + bsbm:productFeature bsbm-inst:ProductFeature219 ; + bsbm:productFeature bsbm-inst:ProductFeature3 ; + bsbm:productFeature bsbm-inst:ProductFeature6 ; + bsbm:productFeature bsbm-inst:ProductFeature7 ; + bsbm:productFeature bsbm-inst:ProductFeature9 ; + bsbm:productFeature bsbm-inst:ProductFeature17 ; + bsbm:productFeature bsbm-inst:ProductFeature20 ; + bsbm:productFeature bsbm-inst:ProductFeature27 ; + bsbm:productFeature bsbm-inst:ProductFeature34 ; + bsbm:producer dataFromProducer1:Producer1 ; + dc:publisher dataFromProducer1:Producer1 ; + dc:date "2003-02-16"^^xsd:date . +dataFromProducer1:Product13 + rdf:type bsbm:Product ; + rdfs:label "intercepted" ; + rdfs:comment "cascaded deeding balladeer festooned elitisms following swill eurodollars hoaxed sorrier ionises hemmed striped brocoli pyorrheas outwardly gatherings barrios profitless replans penciler lotting unhats linkups dehydrogenates extemporized discordance undivided markup aretes boomy descried earners microdissection crueler attn outstrips pensiones sympathizes inmeshing quorums elisions prowls metamorphous menstruated affectivity informational subdialects actuated reproacher ravenousness catted overmodify weltanschauung porker curatrices buffier zees sightsaw offings citizenship disputation proles cosmonaut triglycerides curtesies tragical ethiopians cloistral clueing inundated synchro reefing naivetes ambushed reifiers outdid coronaries papists obtained paler pewit occulters mammies cans notepad numerousness effulging yammers discounted slashings experted excising dominus braying moxies wantonness sterols stooging intakes typographers extenuations teaboxes capaciously restuffing cockups unfathomable signposted dryads antiseptically unfurnished currycombing finances permissibleness" ; + rdf:type bsbm-inst:ProductType6 ; + rdf:type bsbm-inst:ProductType2 ; + rdf:type bsbm-inst:ProductType1 ; + bsbm:productPropertyNumeric1 "226"^^xsd:integer ; + bsbm:productPropertyNumeric2 "336"^^xsd:integer ; + bsbm:productPropertyNumeric3 "970"^^xsd:integer ; + bsbm:productPropertyNumeric4 "296"^^xsd:integer ; + bsbm:productPropertyTextual1 "clambering rosily diam egoism kalifate medusas salaciousness unplowed foretimes"^^xsd:string ; + bsbm:productPropertyTextual2 "shovelsful unconditional tapes gentling rile protesters tokenism hairline preforming rebroadcast splutters poppet undergrowth sizier nipples"^^xsd:string ; + bsbm:productPropertyTextual3 "retributing meanie presider overslept splurged parimutuels autogiros covenanted majestically closets chumped hejira"^^xsd:string ; + bsbm:productPropertyTextual4 "flammed electricity spanking seizures evolver nonverbal reaccredit celandines fishlines sleuths"^^xsd:string ; + bsbm:productFeature bsbm-inst:ProductFeature203 ; + bsbm:productFeature bsbm-inst:ProductFeature205 ; + bsbm:productFeature bsbm-inst:ProductFeature207 ; + bsbm:productFeature bsbm-inst:ProductFeature212 ; + bsbm:productFeature bsbm-inst:ProductFeature220 ; + bsbm:productFeature bsbm-inst:ProductFeature221 ; + bsbm:productFeature bsbm-inst:ProductFeature222 ; + bsbm:productFeature bsbm-inst:ProductFeature1 ; + bsbm:productFeature bsbm-inst:ProductFeature4 ; + bsbm:productFeature bsbm-inst:ProductFeature23 ; + bsbm:productFeature bsbm-inst:ProductFeature25 ; + bsbm:productFeature bsbm-inst:ProductFeature26 ; + bsbm:producer dataFromProducer1:Producer1 ; + dc:publisher dataFromProducer1:Producer1 ; + dc:date "2006-11-14"^^xsd:date . +dataFromProducer1:Product14 + rdf:type bsbm:Product ; + rdfs:label "nonplusing browns cubing" ; + rdfs:comment "pronging disrobers piteousness nonchalantly rejudge waddings pufferies testee outbound ethicalness misidentify needfulness antilogs giveaways nonliving placement moralize dumbed vignettist cortin connects storminess angas fluidics sheeniest underfoot bravoing anytime elevenths journalism tallies maturating environmental repellant sillies razzes polices hyperbaric jiggles notates shortwave wirable wagon rottener hangdog adumbrating noiselessly goodly noneffervescently dwarfisms psychotogen jeans talesmen corkage answered forebrain telegraphs soapers knifed mayhap redundancy pleasureful nonconciliatory biogeographer abased shouldered civitas cellaring regulator geoidal damagers tumefied parader humbling downpours uprousing shelves heartless odder zinky cachets feelingly psychotherapists baddie bibberies disillusion rebroadened undebatable besprinkles crones barbarizes designates orangs penalize scowlingly unobliged turnabouts variables sorrowed deformers miscasts reapplying polities cashews briner broodiest enow snood flenses tames cabobs resituated tearstain" ; + rdf:type bsbm-inst:ProductType16 ; + rdf:type bsbm-inst:ProductType4 ; + rdf:type bsbm-inst:ProductType1 ; + bsbm:productPropertyNumeric1 "39"^^xsd:integer ; + bsbm:productPropertyNumeric2 "1058"^^xsd:integer ; + bsbm:productPropertyNumeric3 "1230"^^xsd:integer ; + bsbm:productPropertyNumeric4 "247"^^xsd:integer ; + bsbm:productPropertyNumeric5 "78"^^xsd:integer ; + bsbm:productPropertyTextual1 "copied gerontologists proposer goggles liquefier emptiers aphelian jotty brattling souths jostlers corollas unset curates iguanians"^^xsd:string ; + bsbm:productPropertyTextual2 "crowns presoak chauffer hispanics intransitiveness"^^xsd:string ; + bsbm:productPropertyTextual3 "roaming elaborately bouncing pressingness unequipped openable fatiguabilities cordate mortalities"^^xsd:string ; + bsbm:productPropertyTextual4 "reabsorb sleeting unerring saltish goods megadyne mapmakers cachalots truants comsat untether overstated"^^xsd:string ; + bsbm:productPropertyTextual5 "paralytic mowers priors alerter gaugers"^^xsd:string ; + bsbm:productFeature bsbm-inst:ProductFeature682 ; + bsbm:productFeature bsbm-inst:ProductFeature684 ; + bsbm:productFeature bsbm-inst:ProductFeature685 ; + bsbm:productFeature bsbm-inst:ProductFeature687 ; + bsbm:productFeature bsbm-inst:ProductFeature700 ; + bsbm:productFeature bsbm-inst:ProductFeature701 ; + bsbm:productFeature bsbm-inst:ProductFeature705 ; + bsbm:productFeature bsbm-inst:ProductFeature707 ; + bsbm:productFeature bsbm-inst:ProductFeature712 ; + bsbm:productFeature bsbm-inst:ProductFeature714 ; + bsbm:productFeature bsbm-inst:ProductFeature715 ; + bsbm:productFeature bsbm-inst:ProductFeature720 ; + bsbm:productFeature bsbm-inst:ProductFeature721 ; + bsbm:productFeature bsbm-inst:ProductFeature726 ; + bsbm:productFeature bsbm-inst:ProductFeature728 ; + bsbm:productFeature bsbm-inst:ProductFeature729 ; + bsbm:productFeature bsbm-inst:ProductFeature731 ; + bsbm:productFeature bsbm-inst:ProductFeature735 ; + bsbm:productFeature bsbm-inst:ProductFeature747 ; + bsbm:productFeature bsbm-inst:ProductFeature92 ; + bsbm:productFeature bsbm-inst:ProductFeature93 ; + bsbm:productFeature bsbm-inst:ProductFeature101 ; + bsbm:productFeature bsbm-inst:ProductFeature115 ; + bsbm:productFeature bsbm-inst:ProductFeature116 ; + bsbm:productFeature bsbm-inst:ProductFeature125 ; + bsbm:productFeature bsbm-inst:ProductFeature126 ; + bsbm:productFeature bsbm-inst:ProductFeature127 ; + bsbm:productFeature bsbm-inst:ProductFeature132 ; + bsbm:productFeature bsbm-inst:ProductFeature137 ; + bsbm:productFeature bsbm-inst:ProductFeature139 ; + bsbm:producer dataFromProducer1:Producer1 ; + dc:publisher dataFromProducer1:Producer1 ; + dc:date "2002-10-14"^^xsd:date . +dataFromProducer1:Product15 + rdf:type bsbm:Product ; + rdfs:label "intomb" ; + rdfs:comment "idlest departed bulgiest rantingly humanism seismicity mintiest flophouse wanter tiddly patting twitters versing bombardiers enhancement substantially abbotship pseudophilosophical multiplexer clinked birdhouses buoyance slicks wooler eversions occupier centralists calculational curare barwares gladioli bitched ceramist derivatives beachcombers scanned hoboing attractants brushier pupils reconveyed outlaw pharmacologies quisling emceeing begum slovenly conterminously bittier brailles reminiscence wandering precessional eductors jumbler palpitate effacement chandeliers fisting decahedrons materialness overdecorating leathers protectiveness jurist impersonations twiny avatars journals cornices masculinization inconclusively aswirl readmission archives cheaps hotly dismally savoys schilling indicative chivalrousness secularized demurer traceableness conus equinoxes staggered estoppage nimbler delineates salvoing condoned wholeheartedly pricks panicking rejuvenating undeceiving rarefied monkhood enravished alexia" ; + rdf:type bsbm-inst:ProductType10 ; + rdf:type bsbm-inst:ProductType3 ; + rdf:type bsbm-inst:ProductType1 ; + bsbm:productPropertyNumeric1 "824"^^xsd:integer ; + bsbm:productPropertyNumeric2 "726"^^xsd:integer ; + bsbm:productPropertyNumeric3 "227"^^xsd:integer ; + bsbm:productPropertyTextual1 "attainting gawkish seawards viceregents"^^xsd:string ; + bsbm:productPropertyTextual2 "realigning alterers bluffed"^^xsd:string ; + bsbm:productPropertyTextual3 "professed putterer rimrocks surpasses ads epics loafed demimonde corves hatchable tamals sponsorships incorruptibility bastioned"^^xsd:string ; + bsbm:productFeature bsbm-inst:ProductFeature375 ; + bsbm:productFeature bsbm-inst:ProductFeature379 ; + bsbm:productFeature bsbm-inst:ProductFeature381 ; + bsbm:productFeature bsbm-inst:ProductFeature388 ; + bsbm:productFeature bsbm-inst:ProductFeature390 ; + bsbm:productFeature bsbm-inst:ProductFeature399 ; + bsbm:productFeature bsbm-inst:ProductFeature402 ; + bsbm:productFeature bsbm-inst:ProductFeature403 ; + bsbm:productFeature bsbm-inst:ProductFeature412 ; + bsbm:productFeature bsbm-inst:ProductFeature414 ; + bsbm:productFeature bsbm-inst:ProductFeature37 ; + bsbm:productFeature bsbm-inst:ProductFeature39 ; + bsbm:productFeature bsbm-inst:ProductFeature41 ; + bsbm:productFeature bsbm-inst:ProductFeature42 ; + bsbm:productFeature bsbm-inst:ProductFeature44 ; + bsbm:productFeature bsbm-inst:ProductFeature47 ; + bsbm:productFeature bsbm-inst:ProductFeature48 ; + bsbm:productFeature bsbm-inst:ProductFeature50 ; + bsbm:productFeature bsbm-inst:ProductFeature51 ; + bsbm:productFeature bsbm-inst:ProductFeature70 ; + bsbm:productFeature bsbm-inst:ProductFeature72 ; + bsbm:producer dataFromProducer1:Producer1 ; + dc:publisher dataFromProducer1:Producer1 ; + dc:date "2007-01-04"^^xsd:date . +dataFromProducer1:Product16 + rdf:type bsbm:Product ; + rdfs:label "puppydoms" ; + rdfs:comment "repellently ensued sugars morningstar abiotic sciatics painstakingly adsorbing precelebration cowpat hegemonies respired handball whoosis retrials minicars hospitium leapfrogged blowsily septal expunger fugging inalterably viragoes canning affixal horselaughs disregardful secretariats prehensile pacer revolting privateer hocuses motherboard mummied teamworks bespoken centrally precancerous mosser uptime signification allopathies slashed engrailed hemiola surnamer priceless ferniest unescapably goiter homographs mesmerizing parities arousers regales misadministration shames hydrations unpreventable disporting gismos drolleries reappointment filings congas mountings unawares sherds betokening steeplejack xxi unclothing libitum regauged lama dovecote jollifications reroll tuberose thanking iranians explaining pabulum suaveness laicisms figurativeness protectiveness roentgenometry bookrest sponsorship learnedness captaining covetousness runnel reduplicating beguiled residences semiconductor blockhouses absconds footlockers embezzlements amorously meanies whaled disemploys nonzebra calculabilities olympus loitered megabuck reloaders ceaselessly riffs microfiches gagged headpiece predicting bequeathed ensign headmistresses laming melanomata" ; + rdf:type bsbm-inst:ProductType7 ; + rdf:type bsbm-inst:ProductType2 ; + rdf:type bsbm-inst:ProductType1 ; + bsbm:productPropertyNumeric1 "969"^^xsd:integer ; + bsbm:productPropertyNumeric2 "360"^^xsd:integer ; + bsbm:productPropertyNumeric3 "24"^^xsd:integer ; + bsbm:productPropertyNumeric4 "35"^^xsd:integer ; + bsbm:productPropertyNumeric5 "641"^^xsd:integer ; + bsbm:productPropertyTextual1 "marl forester relined deific fantasies inappropriately tenuousness finalizing twiggy"^^xsd:string ; + bsbm:productPropertyTextual2 "circumstantiated presbyters cantilevering fallopian ironings bucklers herder eyebolt calluses reintegrating carnelian adventitiously unwarily inquisitional"^^xsd:string ; + bsbm:productPropertyTextual3 "quale griminess smacker crooking rimmer madly disproved toyed ternaries vomiter condoner guerre skilled unwind"^^xsd:string ; + bsbm:productPropertyTextual4 "surprize tempos grandstands knells epeeist juiced designedly maligns gutless nill circumambulating chomped oxygens jolliness cowiest"^^xsd:string ; + bsbm:productPropertyTextual5 "clarksville bas defender preamp iceman ethics underbidding qaid skink inexactitude"^^xsd:string ; + bsbm:productFeature bsbm-inst:ProductFeature225 ; + bsbm:productFeature bsbm-inst:ProductFeature229 ; + bsbm:productFeature bsbm-inst:ProductFeature230 ; + bsbm:productFeature bsbm-inst:ProductFeature235 ; + bsbm:productFeature bsbm-inst:ProductFeature236 ; + bsbm:productFeature bsbm-inst:ProductFeature237 ; + bsbm:productFeature bsbm-inst:ProductFeature240 ; + bsbm:productFeature bsbm-inst:ProductFeature243 ; + bsbm:productFeature bsbm-inst:ProductFeature245 ; + bsbm:productFeature bsbm-inst:ProductFeature252 ; + bsbm:productFeature bsbm-inst:ProductFeature254 ; + bsbm:productFeature bsbm-inst:ProductFeature256 ; + bsbm:productFeature bsbm-inst:ProductFeature259 ; + bsbm:productFeature bsbm-inst:ProductFeature262 ; + bsbm:productFeature bsbm-inst:ProductFeature263 ; + bsbm:productFeature bsbm-inst:ProductFeature266 ; + bsbm:productFeature bsbm-inst:ProductFeature276 ; + bsbm:productFeature bsbm-inst:ProductFeature279 ; + bsbm:productFeature bsbm-inst:ProductFeature280 ; + bsbm:productFeature bsbm-inst:ProductFeature287 ; + bsbm:productFeature bsbm-inst:ProductFeature12 ; + bsbm:productFeature bsbm-inst:ProductFeature26 ; + bsbm:productFeature bsbm-inst:ProductFeature28 ; + bsbm:productFeature bsbm-inst:ProductFeature32 ; + bsbm:productFeature bsbm-inst:ProductFeature36 ; + bsbm:producer dataFromProducer1:Producer1 ; + dc:publisher dataFromProducer1:Producer1 ; + dc:date "2001-06-30"^^xsd:date . +dataFromProducer1:Product17 + rdf:type bsbm:Product ; + rdfs:label "commonplaces" ; + rdfs:comment "fabled riprap southeastward nourishes kiln aviator papyral donned illumines gasiform minutial cayenned cardiopulmonary handsaw hydrographer biogeography valutas rototills overproducing repressed curtained craziest senseful clannishness staunchness dishy remelted larboards voyageur hornpipe reified unabated xebecs commuted zeds spherically collectives measuring tongues floorings conjunctive vising ruralities eligibly coadjutors nonmagnetic tabulated reaccompanies absurdness suttees awning eatings sales pillowslips sestine refortifies anemic appending nonideological skidooing anarchism noiselessness glutting suckles sopranos sawdusts" ; + rdf:type bsbm-inst:ProductType21 ; + rdf:type bsbm-inst:ProductType5 ; + rdf:type bsbm-inst:ProductType1 ; + bsbm:productPropertyNumeric1 "993"^^xsd:integer ; + bsbm:productPropertyNumeric2 "412"^^xsd:integer ; + bsbm:productPropertyNumeric3 "786"^^xsd:integer ; + bsbm:productPropertyNumeric4 "135"^^xsd:integer ; + bsbm:productPropertyNumeric5 "73"^^xsd:integer ; + bsbm:productPropertyTextual1 "condoning crampons landfall cerebellums"^^xsd:string ; + bsbm:productPropertyTextual2 "licht manglers seemlier expandible jittering livered popularize otoscope defeminize reinvestigating"^^xsd:string ; + bsbm:productPropertyTextual3 "volunteering uprightness coshes variants musts unclassified screeched hillocky albinos softbound"^^xsd:string ; + bsbm:productPropertyTextual4 "unkissed nudeness ululate iraqi hermeneutical hoaxes wrigglers"^^xsd:string ; + bsbm:productPropertyTextual5 "underflow lecturer aberrational aigrette dhoti governs passerine lanes diverticula flecked botching lanthorns faux inlier religiousness"^^xsd:string ; + bsbm:productFeature bsbm-inst:ProductFeature947 ; + bsbm:productFeature bsbm-inst:ProductFeature949 ; + bsbm:productFeature bsbm-inst:ProductFeature950 ; + bsbm:productFeature bsbm-inst:ProductFeature951 ; + bsbm:productFeature bsbm-inst:ProductFeature952 ; + bsbm:productFeature bsbm-inst:ProductFeature958 ; + bsbm:productFeature bsbm-inst:ProductFeature964 ; + bsbm:productFeature bsbm-inst:ProductFeature965 ; + bsbm:productFeature bsbm-inst:ProductFeature972 ; + bsbm:productFeature bsbm-inst:ProductFeature989 ; + bsbm:productFeature bsbm-inst:ProductFeature998 ; + bsbm:productFeature bsbm-inst:ProductFeature145 ; + bsbm:productFeature bsbm-inst:ProductFeature153 ; + bsbm:productFeature bsbm-inst:ProductFeature155 ; + bsbm:productFeature bsbm-inst:ProductFeature163 ; + bsbm:productFeature bsbm-inst:ProductFeature168 ; + bsbm:productFeature bsbm-inst:ProductFeature173 ; + bsbm:productFeature bsbm-inst:ProductFeature175 ; + bsbm:productFeature bsbm-inst:ProductFeature176 ; + bsbm:productFeature bsbm-inst:ProductFeature180 ; + bsbm:productFeature bsbm-inst:ProductFeature181 ; + bsbm:producer dataFromProducer1:Producer1 ; + dc:publisher dataFromProducer1:Producer1 ; + dc:date "2004-01-21"^^xsd:date . +dataFromProducer1:Product18 + rdf:type bsbm:Product ; + rdfs:label "liter" ; + rdfs:comment "wanning prebill homer cringes slobbish awol nonparasitic anoints wellhead propanol dosimetries bonjour overabundant pressroom coagula dishonoring scratchpad taxidermy toiler flayer bridgeheads devisor deludingly gorgonzola overborne loverly councilor hawser proffers overhauls oxygenous beagles disproportion zests spectated voiced pellucidly wharfmaster misalliance communed mouldiest honeying arborescent reoccupy slashers instincts regerminatively sledging myriapods bacchic shies duces neuters curds embrocation yipes avascular generalization forbearingly banqueters interlocutrice trumps durning perfectest plottages noumenon obtainment heather backlogging outstation rejoicer motorcar trickles nonmeasurable halibuts unworkable clipsheet hashes nucleolar swaying encapsules scholarship uvulars semiaquatic paunchiest whoopees climatological hems herbier gardening avenged celt lowest competitiveness defies reelected humbling admonished terminuses" ; + rdf:type bsbm-inst:ProductType6 ; + rdf:type bsbm-inst:ProductType2 ; + rdf:type bsbm-inst:ProductType1 ; + bsbm:productPropertyNumeric1 "968"^^xsd:integer ; + bsbm:productPropertyNumeric2 "388"^^xsd:integer ; + bsbm:productPropertyNumeric3 "147"^^xsd:integer ; + bsbm:productPropertyNumeric4 "300"^^xsd:integer ; + bsbm:productPropertyNumeric5 "546"^^xsd:integer ; + bsbm:productPropertyTextual1 "protocols combos cheated defeater thrills counterpoising reachable submersed bireme hazily eviler"^^xsd:string ; + bsbm:productPropertyTextual2 "spiritually wining subclause vindictively submembers devastates whitest pussyfooted titter"^^xsd:string ; + bsbm:productPropertyTextual3 "gummites preoccupation winnowing asininely pipers millwrights plowed"^^xsd:string ; + bsbm:productPropertyTextual4 "jewellers fistfuls sovietizes flowered queues rubens typecast sereneness unimpaired arraignment tureens moppet earns"^^xsd:string ; + bsbm:productPropertyTextual5 "agars imperishably slathering monos asphyxiated beefcakes kieselguhr destinations leasing expediting unconvertible"^^xsd:string ; + bsbm:productFeature bsbm-inst:ProductFeature187 ; + bsbm:productFeature bsbm-inst:ProductFeature190 ; + bsbm:productFeature bsbm-inst:ProductFeature195 ; + bsbm:productFeature bsbm-inst:ProductFeature197 ; + bsbm:productFeature bsbm-inst:ProductFeature202 ; + bsbm:productFeature bsbm-inst:ProductFeature209 ; + bsbm:productFeature bsbm-inst:ProductFeature217 ; + bsbm:productFeature bsbm-inst:ProductFeature218 ; + bsbm:productFeature bsbm-inst:ProductFeature223 ; + bsbm:productFeature bsbm-inst:ProductFeature224 ; + bsbm:productFeature bsbm-inst:ProductFeature3 ; + bsbm:productFeature bsbm-inst:ProductFeature7 ; + bsbm:productFeature bsbm-inst:ProductFeature12 ; + bsbm:productFeature bsbm-inst:ProductFeature13 ; + bsbm:productFeature bsbm-inst:ProductFeature24 ; + bsbm:productFeature bsbm-inst:ProductFeature26 ; + bsbm:productFeature bsbm-inst:ProductFeature27 ; + bsbm:productFeature bsbm-inst:ProductFeature29 ; + bsbm:productFeature bsbm-inst:ProductFeature33 ; + bsbm:productFeature bsbm-inst:ProductFeature36 ; + bsbm:producer dataFromProducer1:Producer1 ; + dc:publisher dataFromProducer1:Producer1 ; + dc:date "2004-02-14"^^xsd:date . +dataFromProducer1:Product19 + rdf:type bsbm:Product ; + rdfs:label "openings gentled" ; + rdfs:comment "worms manatees notifiable valium piracies overscrupulously hebrews recessional convocations subjugates pinocchio odorize navajos sucks rules osteitis rhetorics redistricted calumniated nihility laces merchandized pentarch encages relocate paltrily domesticates indoctrinations cunningly intergalactic spreadsheets redundantly titer early gnocchi heftier bypassed nitros authenticating gamic alternateness dentition cussedly nicker unmolested palmer traducements economizes unawaked jogger fitting" ; + rdf:type bsbm-inst:ProductType6 ; + rdf:type bsbm-inst:ProductType2 ; + rdf:type bsbm-inst:ProductType1 ; + bsbm:productPropertyNumeric1 "727"^^xsd:integer ; + bsbm:productPropertyNumeric2 "875"^^xsd:integer ; + bsbm:productPropertyNumeric3 "159"^^xsd:integer ; + bsbm:productPropertyNumeric4 "6"^^xsd:integer ; + bsbm:productPropertyNumeric5 "576"^^xsd:integer ; + bsbm:productPropertyTextual1 "menacer drubber amylases"^^xsd:string ; + bsbm:productPropertyTextual2 "depreciatively presifts simplicities focusers"^^xsd:string ; + bsbm:productPropertyTextual3 "babyish lording separator unamusing ensky firry outstripped weeweed abscessed merchantmen"^^xsd:string ; + bsbm:productPropertyTextual4 "dreamland gonad pyrites enigmatically annihilators predicts"^^xsd:string ; + bsbm:productPropertyTextual5 "unabashed barbwires maoists"^^xsd:string ; + bsbm:productFeature bsbm-inst:ProductFeature184 ; + bsbm:productFeature bsbm-inst:ProductFeature192 ; + bsbm:productFeature bsbm-inst:ProductFeature194 ; + bsbm:productFeature bsbm-inst:ProductFeature199 ; + bsbm:productFeature bsbm-inst:ProductFeature201 ; + bsbm:productFeature bsbm-inst:ProductFeature202 ; + bsbm:productFeature bsbm-inst:ProductFeature203 ; + bsbm:productFeature bsbm-inst:ProductFeature4 ; + bsbm:productFeature bsbm-inst:ProductFeature16 ; + bsbm:productFeature bsbm-inst:ProductFeature19 ; + bsbm:productFeature bsbm-inst:ProductFeature26 ; + bsbm:productFeature bsbm-inst:ProductFeature29 ; + bsbm:productFeature bsbm-inst:ProductFeature32 ; + bsbm:productFeature bsbm-inst:ProductFeature36 ; + bsbm:producer dataFromProducer1:Producer1 ; + dc:publisher dataFromProducer1:Producer1 ; + dc:date "2001-08-16"^^xsd:date . +dataFromProducer1:Product20 + rdf:type bsbm:Product ; + rdfs:label "caribous clients" ; + rdfs:comment "undersupplied renegotiator strikebreakers postmortems midlines nixy mayfly promontory eateries enraged fiducially obis tiltyards rutabagas wingier unfrequented smirched barracked townlets lionizers forbiddingly unshelled choosers organizations locknuts legislators slubbering autographed delimiting aeries candour necrotize computed pieced nitrites introversive wastery viaticums kidding estops perishability wagerers topologically nonsmoker incumbencies septaugintal basement absorbed reflexed superintended" ; + rdf:type bsbm-inst:ProductType7 ; + rdf:type bsbm-inst:ProductType2 ; + rdf:type bsbm-inst:ProductType1 ; + bsbm:productPropertyNumeric1 "68"^^xsd:integer ; + bsbm:productPropertyNumeric2 "474"^^xsd:integer ; + bsbm:productPropertyNumeric3 "719"^^xsd:integer ; + bsbm:productPropertyTextual1 "jibs taffies bugged chasses accusatrixes microstructure relational scoutings rusting morbidly latinize beadsman pawnees mycelium unimpeached"^^xsd:string ; + bsbm:productPropertyTextual2 "ligatures cricks violets"^^xsd:string ; + bsbm:productPropertyTextual3 "cutpurse pervasiveness nonmen boozy troglodytes"^^xsd:string ; + bsbm:productFeature bsbm-inst:ProductFeature226 ; + bsbm:productFeature bsbm-inst:ProductFeature227 ; + bsbm:productFeature bsbm-inst:ProductFeature238 ; + bsbm:productFeature bsbm-inst:ProductFeature240 ; + bsbm:productFeature bsbm-inst:ProductFeature242 ; + bsbm:productFeature bsbm-inst:ProductFeature243 ; + bsbm:productFeature bsbm-inst:ProductFeature247 ; + bsbm:productFeature bsbm-inst:ProductFeature251 ; + bsbm:productFeature bsbm-inst:ProductFeature254 ; + bsbm:productFeature bsbm-inst:ProductFeature262 ; + bsbm:productFeature bsbm-inst:ProductFeature263 ; + bsbm:productFeature bsbm-inst:ProductFeature264 ; + bsbm:productFeature bsbm-inst:ProductFeature266 ; + bsbm:productFeature bsbm-inst:ProductFeature267 ; + bsbm:productFeature bsbm-inst:ProductFeature272 ; + bsbm:productFeature bsbm-inst:ProductFeature276 ; + bsbm:productFeature bsbm-inst:ProductFeature277 ; + bsbm:productFeature bsbm-inst:ProductFeature279 ; + bsbm:productFeature bsbm-inst:ProductFeature282 ; + bsbm:productFeature bsbm-inst:ProductFeature284 ; + bsbm:productFeature bsbm-inst:ProductFeature7 ; + bsbm:productFeature bsbm-inst:ProductFeature9 ; + bsbm:productFeature bsbm-inst:ProductFeature14 ; + bsbm:productFeature bsbm-inst:ProductFeature17 ; + bsbm:productFeature bsbm-inst:ProductFeature21 ; + bsbm:productFeature bsbm-inst:ProductFeature24 ; + bsbm:productFeature bsbm-inst:ProductFeature25 ; + bsbm:productFeature bsbm-inst:ProductFeature29 ; + bsbm:productFeature bsbm-inst:ProductFeature31 ; + bsbm:productFeature bsbm-inst:ProductFeature35 ; + bsbm:productFeature bsbm-inst:ProductFeature36 ; + bsbm:producer dataFromProducer1:Producer1 ; + dc:publisher dataFromProducer1:Producer1 ; + dc:date "2006-07-06"^^xsd:date . +dataFromProducer1:Product21 + rdf:type bsbm:Product ; + rdfs:label "burrowers accommodations" ; + rdfs:comment "regimented abstaining unscholarly functions saddling cullers heaved fabricators creeks brittled toils rectifiable oleos immunology feisty dolefully carvers octaves concussive cuirassed singularly gardening jaunt stolidity greats gooneys microwave lifeboats earpiece nahuatl fugatos byelorussians expectorations socials wantoned doggoner enfevered clinched clinkering boater forecastles conducing matricide humpier bastardization wildish juts defacing eses misreads ovines epicycles coagulation praxes coverture administration fumeless erotizing larums sanitarian generals sirs shines annealing cannonry reglue baguets masculinity quadricentennials" ; + rdf:type bsbm-inst:ProductType21 ; + rdf:type bsbm-inst:ProductType5 ; + rdf:type bsbm-inst:ProductType1 ; + bsbm:productPropertyNumeric1 "794"^^xsd:integer ; + bsbm:productPropertyNumeric2 "462"^^xsd:integer ; + bsbm:productPropertyNumeric3 "1483"^^xsd:integer ; + bsbm:productPropertyNumeric4 "631"^^xsd:integer ; + bsbm:productPropertyNumeric5 "292"^^xsd:integer ; + bsbm:productPropertyTextual1 "balusters revenuer placidity guiltily saltness marvelously flatworks demotist barbecuing stomachers ropily"^^xsd:string ; + bsbm:productPropertyTextual2 "waiving nobeliums biotelemetry borscht dodoisms utopists valence formulating fending"^^xsd:string ; + bsbm:productPropertyTextual3 "armadillos dioramas satanists turbots jangles sustaining alnico necrologies"^^xsd:string ; + bsbm:productPropertyTextual4 "goods metallurgically falcons enormities burse wainwrights exalting rewarding motivation gaveler downplays"^^xsd:string ; + bsbm:productPropertyTextual5 "redwings hemstitch chewy heightening bros"^^xsd:string ; + bsbm:productFeature bsbm-inst:ProductFeature946 ; + bsbm:productFeature bsbm-inst:ProductFeature950 ; + bsbm:productFeature bsbm-inst:ProductFeature953 ; + bsbm:productFeature bsbm-inst:ProductFeature955 ; + bsbm:productFeature bsbm-inst:ProductFeature959 ; + bsbm:productFeature bsbm-inst:ProductFeature964 ; + bsbm:productFeature bsbm-inst:ProductFeature969 ; + bsbm:productFeature bsbm-inst:ProductFeature970 ; + bsbm:productFeature bsbm-inst:ProductFeature971 ; + bsbm:productFeature bsbm-inst:ProductFeature974 ; + bsbm:productFeature bsbm-inst:ProductFeature976 ; + bsbm:productFeature bsbm-inst:ProductFeature977 ; + bsbm:productFeature bsbm-inst:ProductFeature988 ; + bsbm:productFeature bsbm-inst:ProductFeature993 ; + bsbm:productFeature bsbm-inst:ProductFeature997 ; + bsbm:productFeature bsbm-inst:ProductFeature999 ; + bsbm:productFeature bsbm-inst:ProductFeature144 ; + bsbm:productFeature bsbm-inst:ProductFeature149 ; + bsbm:productFeature bsbm-inst:ProductFeature155 ; + bsbm:productFeature bsbm-inst:ProductFeature174 ; + bsbm:productFeature bsbm-inst:ProductFeature176 ; + bsbm:productFeature bsbm-inst:ProductFeature178 ; + bsbm:productFeature bsbm-inst:ProductFeature181 ; + bsbm:productFeature bsbm-inst:ProductFeature183 ; + bsbm:producer dataFromProducer1:Producer1 ; + dc:publisher dataFromProducer1:Producer1 ; + dc:date "2004-03-07"^^xsd:date . +dataFromProducer1:Product22 + rdf:type bsbm:Product ; + rdfs:label "empyrean separately" ; + rdfs:comment "swagmen noninterfaced combatants juggling cognoscing recognitions surveyance mortuaries backstay squeezed unfruitful instrumentations alumines airports bikeway supper searer pretentiousness aortal listed dumbest fumigator eking dripper pygmoid adsorptiveness brooks mushily outsell spouseless ejected canaller whooshes dolours burrowing discombobulate impenetrableness mismanages escalading innovates brochette foxholes dustpan dechlorination vialling talesman roasted adeptness retranslated declarations giddiest dolts sideboards truckload similarities warships spaces desiccating calks clanked nonimmunity airer dynamos trimness lanker megacephalous garnisheeing peasants treating sapless porkers cenotaphic sputtering felinely drily flaked excrescence miniskirt deserting incarnation edgily indefinitely workboxes manfulness weatherboard simplemindedly floodgates noisemaker domestications reappraiser canard roguish ostmark bassoonists meaningfulness accommodates insulins periodicals transdesert sensitizing serenest circularized aminity conceptional unabsorbed drowners lawings" ; + rdf:type bsbm-inst:ProductType16 ; + rdf:type bsbm-inst:ProductType4 ; + rdf:type bsbm-inst:ProductType1 ; + bsbm:productPropertyNumeric1 "1734"^^xsd:integer ; + bsbm:productPropertyNumeric2 "91"^^xsd:integer ; + bsbm:productPropertyNumeric3 "1182"^^xsd:integer ; + bsbm:productPropertyNumeric4 "446"^^xsd:integer ; + bsbm:productPropertyNumeric5 "270"^^xsd:integer ; + bsbm:productPropertyTextual1 "schizoids pardoning reposer sightsees outgunning rabic impatience refreshing surfier gawkers"^^xsd:string ; + bsbm:productPropertyTextual2 "sowers penology atomising wingspread terrors intruder misted wangler enthroning styleless shoveler jolting sauteed agglomerations spiraeas"^^xsd:string ; + bsbm:productPropertyTextual3 "equerries cobblers throbbing chatelaines quadrilles"^^xsd:string ; + bsbm:productPropertyTextual4 "eruct tensed amatively"^^xsd:string ; + bsbm:productPropertyTextual5 "turnoffs invigorates aureolas tends bra warrantees guidances"^^xsd:string ; + bsbm:productFeature bsbm-inst:ProductFeature688 ; + bsbm:productFeature bsbm-inst:ProductFeature695 ; + bsbm:productFeature bsbm-inst:ProductFeature701 ; + bsbm:productFeature bsbm-inst:ProductFeature708 ; + bsbm:productFeature bsbm-inst:ProductFeature711 ; + bsbm:productFeature bsbm-inst:ProductFeature714 ; + bsbm:productFeature bsbm-inst:ProductFeature716 ; + bsbm:productFeature bsbm-inst:ProductFeature719 ; + bsbm:productFeature bsbm-inst:ProductFeature724 ; + bsbm:productFeature bsbm-inst:ProductFeature727 ; + bsbm:productFeature bsbm-inst:ProductFeature730 ; + bsbm:productFeature bsbm-inst:ProductFeature731 ; + bsbm:productFeature bsbm-inst:ProductFeature733 ; + bsbm:productFeature bsbm-inst:ProductFeature734 ; + bsbm:productFeature bsbm-inst:ProductFeature745 ; + bsbm:productFeature bsbm-inst:ProductFeature746 ; + bsbm:productFeature bsbm-inst:ProductFeature81 ; + bsbm:productFeature bsbm-inst:ProductFeature83 ; + bsbm:productFeature bsbm-inst:ProductFeature89 ; + bsbm:productFeature bsbm-inst:ProductFeature90 ; + bsbm:productFeature bsbm-inst:ProductFeature99 ; + bsbm:productFeature bsbm-inst:ProductFeature100 ; + bsbm:productFeature bsbm-inst:ProductFeature101 ; + bsbm:productFeature bsbm-inst:ProductFeature113 ; + bsbm:productFeature bsbm-inst:ProductFeature115 ; + bsbm:productFeature bsbm-inst:ProductFeature122 ; + bsbm:productFeature bsbm-inst:ProductFeature123 ; + bsbm:productFeature bsbm-inst:ProductFeature127 ; + bsbm:productFeature bsbm-inst:ProductFeature132 ; + bsbm:productFeature bsbm-inst:ProductFeature133 ; + bsbm:productFeature bsbm-inst:ProductFeature138 ; + bsbm:producer dataFromProducer1:Producer1 ; + dc:publisher dataFromProducer1:Producer1 ; + dc:date "2002-07-10"^^xsd:date . +dataFromProducer1:Product23 + rdf:type bsbm:Product ; + rdfs:label "crosier expwy snagged" ; + rdfs:comment "massing heartier driveled espaliered stockbroking viselike mispronouncing gars saunterers sate niched beltlines musingly authoring holists weirdy viewless sidler acidities debauchee inspirited intermarried buggers justifiable blocks technics termites ultramicroscopic downloadable vertiginous letting digitized foulness italics replying agglutinated offhanded heathy wetlands circumstantially unhorsed fauvism heterodoxies featuring subminiaturized gloving masqueraded cantonment hoboism orderers thinkers gaud unguentary cornetist monochrome shrivers screenplays teetering splasher creasy bestride rhythmically released rarest reelers gitanos barracks bedsores exacerbatingly divergence thermostats watching tyrannical caramelized calcspar canoeist foreignness intramural scullery aristocratically bugbane turtlenecks manufactories tunics inhibitive stevedoring crafting unled nonmaterialistic cedes sportsmanlike gravies amyl idealism seeped advisatory bandits umpired anecdotic tannable misbehavior portliest ravener fortes misdefining excitations preconditioned linier hookless realistic jibbing airily randiest shires timidness interweaved hygeist peppers" ; + rdf:type bsbm-inst:ProductType14 ; + rdf:type bsbm-inst:ProductType4 ; + rdf:type bsbm-inst:ProductType1 ; + bsbm:productPropertyNumeric1 "214"^^xsd:integer ; + bsbm:productPropertyNumeric2 "846"^^xsd:integer ; + bsbm:productPropertyNumeric3 "698"^^xsd:integer ; + bsbm:productPropertyTextual1 "senti drainpipes phosphorescence dight intermezzo"^^xsd:string ; + bsbm:productPropertyTextual2 "whiffled fixative exoterically commination retitling urethral milldam progresses grabbing manillas forefather"^^xsd:string ; + bsbm:productPropertyTextual3 "peristaltically sucklers changeling localizations creepers musicologist parleyer nondelivery christianity predigestion"^^xsd:string ; + bsbm:productPropertyTextual5 "kopeck whirlies preadjustments ascensions prevented stodge fanaticized shovelers"^^xsd:string ; + bsbm:productFeature bsbm-inst:ProductFeature570 ; + bsbm:productFeature bsbm-inst:ProductFeature571 ; + bsbm:productFeature bsbm-inst:ProductFeature576 ; + bsbm:productFeature bsbm-inst:ProductFeature583 ; + bsbm:productFeature bsbm-inst:ProductFeature594 ; + bsbm:productFeature bsbm-inst:ProductFeature597 ; + bsbm:productFeature bsbm-inst:ProductFeature605 ; + bsbm:productFeature bsbm-inst:ProductFeature606 ; + bsbm:productFeature bsbm-inst:ProductFeature608 ; + bsbm:productFeature bsbm-inst:ProductFeature609 ; + bsbm:productFeature bsbm-inst:ProductFeature610 ; + bsbm:productFeature bsbm-inst:ProductFeature79 ; + bsbm:productFeature bsbm-inst:ProductFeature80 ; + bsbm:productFeature bsbm-inst:ProductFeature85 ; + bsbm:productFeature bsbm-inst:ProductFeature87 ; + bsbm:productFeature bsbm-inst:ProductFeature89 ; + bsbm:productFeature bsbm-inst:ProductFeature96 ; + bsbm:productFeature bsbm-inst:ProductFeature103 ; + bsbm:productFeature bsbm-inst:ProductFeature114 ; + bsbm:productFeature bsbm-inst:ProductFeature120 ; + bsbm:productFeature bsbm-inst:ProductFeature124 ; + bsbm:productFeature bsbm-inst:ProductFeature125 ; + bsbm:productFeature bsbm-inst:ProductFeature130 ; + bsbm:productFeature bsbm-inst:ProductFeature132 ; + bsbm:productFeature bsbm-inst:ProductFeature140 ; + bsbm:producer dataFromProducer1:Producer1 ; + dc:publisher dataFromProducer1:Producer1 ; + dc:date "2004-02-12"^^xsd:date . +dataFromProducer1:Product24 + rdf:type bsbm:Product ; + rdfs:label "deliquescence" ; + rdfs:comment "cogs legalistically rampagers encephalography quoins knifing wombed penney fissioning heartache balks darkens tarmac yanquis bloating erose dhow unsubtle uncloak deaning enjoined bestrewed printable hypnogogic masticate bosomy disapprove moistful airliners undersurface remarkers tyrannously roquefort knitted fessed vaporer muscled campanili inserter applaudable sociopathic vizards stratifying unpaying mucking flameproof condensing cockneys augers urethral woeness riffed yashmac maven postmistress interrogational hitchhiking dogteeth sidekick reexperienced vole spaceman aviatrices wireways sutta rhesuses craziness incaged determining irreversibly climatologists aweigh copartners punts" ; + rdf:type bsbm-inst:ProductType18 ; + rdf:type bsbm-inst:ProductType5 ; + rdf:type bsbm-inst:ProductType1 ; + bsbm:productPropertyNumeric1 "214"^^xsd:integer ; + bsbm:productPropertyNumeric2 "40"^^xsd:integer ; + bsbm:productPropertyNumeric3 "279"^^xsd:integer ; + bsbm:productPropertyTextual1 "astringed copperplate selenology plantations disbar"^^xsd:string ; + bsbm:productPropertyTextual2 "devoured elasticizing homosexuality yokemates countercurrent overexercised uncountable lightfingered hairsplitter adepter yardmaster gainsays"^^xsd:string ; + bsbm:productPropertyTextual3 "murmurs packaged ochery designer catagories shriver apostatized purgatories abridgments bedamn uncured selectively impassioned windjammer conductors"^^xsd:string ; + bsbm:productPropertyTextual4 "natalities implausibleness accorders counteracts reducibility lambent snowcapped conductivity blastier gutters pitilessness poisoners truants nipples"^^xsd:string ; + bsbm:productFeature bsbm-inst:ProductFeature816 ; + bsbm:productFeature bsbm-inst:ProductFeature817 ; + bsbm:productFeature bsbm-inst:ProductFeature823 ; + bsbm:productFeature bsbm-inst:ProductFeature825 ; + bsbm:productFeature bsbm-inst:ProductFeature827 ; + bsbm:productFeature bsbm-inst:ProductFeature833 ; + bsbm:productFeature bsbm-inst:ProductFeature838 ; + bsbm:productFeature bsbm-inst:ProductFeature839 ; + bsbm:productFeature bsbm-inst:ProductFeature844 ; + bsbm:productFeature bsbm-inst:ProductFeature850 ; + bsbm:productFeature bsbm-inst:ProductFeature855 ; + bsbm:productFeature bsbm-inst:ProductFeature148 ; + bsbm:productFeature bsbm-inst:ProductFeature149 ; + bsbm:productFeature bsbm-inst:ProductFeature150 ; + bsbm:productFeature bsbm-inst:ProductFeature151 ; + bsbm:productFeature bsbm-inst:ProductFeature170 ; + bsbm:productFeature bsbm-inst:ProductFeature175 ; + bsbm:productFeature bsbm-inst:ProductFeature178 ; + bsbm:productFeature bsbm-inst:ProductFeature179 ; + bsbm:productFeature bsbm-inst:ProductFeature180 ; + bsbm:productFeature bsbm-inst:ProductFeature182 ; + bsbm:productFeature bsbm-inst:ProductFeature183 ; + bsbm:producer dataFromProducer1:Producer1 ; + dc:publisher dataFromProducer1:Producer1 ; + dc:date "2004-04-27"^^xsd:date . +dataFromProducer1:Product25 + rdf:type bsbm:Product ; + rdfs:label "boundaries proselyted" ; + rdfs:comment "oats sibylline tarsal adhesives ailanthuses redistributed wherefrom undertook ringlike clonk heterosexually saltcellars discontent sembling chicks linguinis outreasoned theatergoers systemics unhelm sharesman inventively nonfactually snafued creamier nooky feoff degradedness dakoit conquistadors nightcrawlers flightiness propinquity irreclaimably snuffles alliterations titrates dominos phalluses orris sparring peacekeeper toasting beebee barny outstay factories underrate sharps spleenish agronomists purulent correction sniffles precut gouramis backwoods detoxicator aramaic necklines flutings outbalances scorched distasteful adoration officer arrangement penicillium mummify pennate encamp decals vanquishing scavenger epigon dishabille objectional privies solacing tutoyered distractions daytimes degauss daces composing casettes prenticing sallying refrangibility packager broadswords petrologic interpersonal menus misinstruct complexional convoying truer clanked arts freeloading biaxal magistral enriching lownesses liftoff lineny soapboxes wotting equerry wonderer scriber broncobuster isopropyl sunniest mousses sluggardly pullouts redelivers tankship dottels unhampered broideries chattier inundations" ; + rdf:type bsbm-inst:ProductType15 ; + rdf:type bsbm-inst:ProductType4 ; + rdf:type bsbm-inst:ProductType1 ; + bsbm:productPropertyNumeric1 "524"^^xsd:integer ; + bsbm:productPropertyNumeric2 "84"^^xsd:integer ; + bsbm:productPropertyNumeric3 "540"^^xsd:integer ; + bsbm:productPropertyNumeric5 "194"^^xsd:integer ; + bsbm:productPropertyTextual1 "propmistress jorum poinciana warworn vulgarizer bugged lades casked unevenly massless foolfish experimental peopling"^^xsd:string ; + bsbm:productPropertyTextual2 "miring drivelling punishments globules semipublic"^^xsd:string ; + bsbm:productPropertyTextual3 "vacuums walkings whaling pulsator guitarist dreggiest enlarge optometries cosponsoring"^^xsd:string ; + bsbm:productFeature bsbm-inst:ProductFeature616 ; + bsbm:productFeature bsbm-inst:ProductFeature617 ; + bsbm:productFeature bsbm-inst:ProductFeature619 ; + bsbm:productFeature bsbm-inst:ProductFeature622 ; + bsbm:productFeature bsbm-inst:ProductFeature623 ; + bsbm:productFeature bsbm-inst:ProductFeature625 ; + bsbm:productFeature bsbm-inst:ProductFeature627 ; + bsbm:productFeature bsbm-inst:ProductFeature628 ; + bsbm:productFeature bsbm-inst:ProductFeature629 ; + bsbm:productFeature bsbm-inst:ProductFeature631 ; + bsbm:productFeature bsbm-inst:ProductFeature635 ; + bsbm:productFeature bsbm-inst:ProductFeature641 ; + bsbm:productFeature bsbm-inst:ProductFeature642 ; + bsbm:productFeature bsbm-inst:ProductFeature643 ; + bsbm:productFeature bsbm-inst:ProductFeature645 ; + bsbm:productFeature bsbm-inst:ProductFeature647 ; + bsbm:productFeature bsbm-inst:ProductFeature650 ; + bsbm:productFeature bsbm-inst:ProductFeature653 ; + bsbm:productFeature bsbm-inst:ProductFeature669 ; + bsbm:productFeature bsbm-inst:ProductFeature672 ; + bsbm:productFeature bsbm-inst:ProductFeature678 ; + bsbm:productFeature bsbm-inst:ProductFeature80 ; + bsbm:productFeature bsbm-inst:ProductFeature82 ; + bsbm:productFeature bsbm-inst:ProductFeature83 ; + bsbm:productFeature bsbm-inst:ProductFeature85 ; + bsbm:productFeature bsbm-inst:ProductFeature99 ; + bsbm:productFeature bsbm-inst:ProductFeature102 ; + bsbm:productFeature bsbm-inst:ProductFeature113 ; + bsbm:productFeature bsbm-inst:ProductFeature118 ; + bsbm:productFeature bsbm-inst:ProductFeature124 ; + bsbm:productFeature bsbm-inst:ProductFeature126 ; + bsbm:productFeature bsbm-inst:ProductFeature134 ; + bsbm:productFeature bsbm-inst:ProductFeature137 ; + bsbm:productFeature bsbm-inst:ProductFeature139 ; + bsbm:producer dataFromProducer1:Producer1 ; + dc:publisher dataFromProducer1:Producer1 ; + dc:date "2006-06-02"^^xsd:date . +dataFromProducer1:Product26 + rdf:type bsbm:Product ; + rdfs:label "vulgarizes asserter" ; + rdfs:comment "sunbathing brutifies tracts rubberizes unrewarded bouse overpaying supes wriggly minxes malls goodby titillatingly materialistically doffs lintels packsaddles opportunely noncontagious undestroyed pliancies moves fornicates cathodes plunks refrigeration refolds froggy abbacy bejewelled chefdom aclu sarape leukemics eluders bonefishes crowders daturas demoralize toxicity unchanging fellers retrieved sentimentalists enthrallingly sensorial preformed reawakened gnarls coparent innately alack stereotypers interferer skirmishers pinking bakers thready ratline genteelly flecked singes anachronistical gumweeds geophysicists autoclaves downtimes exclamations lancing concertedly girthing earful pneumonitis clamminess smoothy maunderer cupolaed aligning lama nautili vestural bogies wifedom parsimoniously tethered antagonists unscented sexily stubbed frivolled gypsyisms garbs mislabeling hunted goulash prizefights globularity homogenization wickedness" ; + rdf:type bsbm-inst:ProductType8 ; + rdf:type bsbm-inst:ProductType2 ; + rdf:type bsbm-inst:ProductType1 ; + bsbm:productPropertyNumeric1 "711"^^xsd:integer ; + bsbm:productPropertyNumeric2 "1292"^^xsd:integer ; + bsbm:productPropertyNumeric3 "1238"^^xsd:integer ; + bsbm:productPropertyTextual1 "dynatrons renouncing pieties unfixes"^^xsd:string ; + bsbm:productPropertyTextual2 "retrogressively rickey concrescences snored frizettes hampering bangers"^^xsd:string ; + bsbm:productPropertyTextual3 "guileless boilers briefcases tumoral labored hanking"^^xsd:string ; + bsbm:productFeature bsbm-inst:ProductFeature291 ; + bsbm:productFeature bsbm-inst:ProductFeature294 ; + bsbm:productFeature bsbm-inst:ProductFeature295 ; + bsbm:productFeature bsbm-inst:ProductFeature304 ; + bsbm:productFeature bsbm-inst:ProductFeature309 ; + bsbm:productFeature bsbm-inst:ProductFeature310 ; + bsbm:productFeature bsbm-inst:ProductFeature323 ; + bsbm:productFeature bsbm-inst:ProductFeature324 ; + bsbm:productFeature bsbm-inst:ProductFeature1 ; + bsbm:productFeature bsbm-inst:ProductFeature3 ; + bsbm:productFeature bsbm-inst:ProductFeature7 ; + bsbm:productFeature bsbm-inst:ProductFeature14 ; + bsbm:productFeature bsbm-inst:ProductFeature16 ; + bsbm:productFeature bsbm-inst:ProductFeature17 ; + bsbm:productFeature bsbm-inst:ProductFeature21 ; + bsbm:productFeature bsbm-inst:ProductFeature24 ; + bsbm:productFeature bsbm-inst:ProductFeature35 ; + bsbm:productFeature bsbm-inst:ProductFeature36 ; + bsbm:producer dataFromProducer1:Producer1 ; + dc:publisher dataFromProducer1:Producer1 ; + dc:date "2001-11-12"^^xsd:date . +dataFromProducer1:Product27 + rdf:type bsbm:Product ; + rdfs:label "resoluteness" ; + rdfs:comment "unfeasible spelunker soaking ceremonialist otolaryngologies inveigles basalts telephones jaunting devoicing rubidiums acidulousness clemency misdoubted overcrowded daring idealisms passings fleer acromegalies allows foaling agglomerations purls primas soybeans pars submarines goalposts ponderers erective nonmilitant airmailed refracts lunkhead informs nullificator lobbied retaining genteelest effigy outmaneuvering inebriety demurest plurality nonprofessional rethreaded bunted faroff undergrounder nictitated aroids unadorned perpetually spenders airhead awning posthypnotically caroling lancets relinquishes vampers hemodialyses saws dwarfisms tawdrily evoking planetariums bartends reinspects nix harnessing comte sculleries outbid poachiest maneuvers metaphase accordance fourposter cheekbones confidentialness saddest floppies nonhabituating yammering pseudomodern boggled politicked whamming alienees copular attractions nope vicariates waspishly salter dicotyledonous repudiating stanched lallygagging devolvements repast clarifiable improperness blunts unemployed violinists yogas snatchers replenisher dismals unconfirmed caesuric skiwears lightener nonstructural dodgers corroboratory designations shakeout optimeter declassified monosyllable ensnarers supinating soonest dumplings escapist" ; + rdf:type bsbm-inst:ProductType16 ; + rdf:type bsbm-inst:ProductType4 ; + rdf:type bsbm-inst:ProductType1 ; + bsbm:productPropertyNumeric1 "266"^^xsd:integer ; + bsbm:productPropertyNumeric2 "1145"^^xsd:integer ; + bsbm:productPropertyNumeric3 "939"^^xsd:integer ; + bsbm:productPropertyNumeric4 "601"^^xsd:integer ; + bsbm:productPropertyNumeric5 "402"^^xsd:integer ; + bsbm:productPropertyTextual1 "lek firehalls ears"^^xsd:string ; + bsbm:productPropertyTextual2 "tuberosity bystreet tilths psalteries eyewashes speakers reweds surnaming outstations payolas unships pinnacled carnivorous"^^xsd:string ; + bsbm:productPropertyTextual3 "praying capitalization lummoxes"^^xsd:string ; + bsbm:productPropertyTextual4 "resituate environs deforming trilogies unaccountably retrospection intertwine"^^xsd:string ; + bsbm:productPropertyTextual5 "weenies nobs altimeters pauperized polytheism fiddler wyomingite dandify liberators ganef"^^xsd:string ; + bsbm:productFeature bsbm-inst:ProductFeature686 ; + bsbm:productFeature bsbm-inst:ProductFeature693 ; + bsbm:productFeature bsbm-inst:ProductFeature696 ; + bsbm:productFeature bsbm-inst:ProductFeature697 ; + bsbm:productFeature bsbm-inst:ProductFeature701 ; + bsbm:productFeature bsbm-inst:ProductFeature704 ; + bsbm:productFeature bsbm-inst:ProductFeature714 ; + bsbm:productFeature bsbm-inst:ProductFeature716 ; + bsbm:productFeature bsbm-inst:ProductFeature721 ; + bsbm:productFeature bsbm-inst:ProductFeature727 ; + bsbm:productFeature bsbm-inst:ProductFeature729 ; + bsbm:productFeature bsbm-inst:ProductFeature731 ; + bsbm:productFeature bsbm-inst:ProductFeature736 ; + bsbm:productFeature bsbm-inst:ProductFeature741 ; + bsbm:productFeature bsbm-inst:ProductFeature744 ; + bsbm:productFeature bsbm-inst:ProductFeature78 ; + bsbm:productFeature bsbm-inst:ProductFeature79 ; + bsbm:productFeature bsbm-inst:ProductFeature82 ; + bsbm:productFeature bsbm-inst:ProductFeature84 ; + bsbm:productFeature bsbm-inst:ProductFeature87 ; + bsbm:productFeature bsbm-inst:ProductFeature92 ; + bsbm:productFeature bsbm-inst:ProductFeature104 ; + bsbm:productFeature bsbm-inst:ProductFeature106 ; + bsbm:productFeature bsbm-inst:ProductFeature110 ; + bsbm:productFeature bsbm-inst:ProductFeature111 ; + bsbm:productFeature bsbm-inst:ProductFeature112 ; + bsbm:productFeature bsbm-inst:ProductFeature113 ; + bsbm:productFeature bsbm-inst:ProductFeature120 ; + bsbm:productFeature bsbm-inst:ProductFeature125 ; + bsbm:productFeature bsbm-inst:ProductFeature126 ; + bsbm:productFeature bsbm-inst:ProductFeature127 ; + bsbm:productFeature bsbm-inst:ProductFeature129 ; + bsbm:productFeature bsbm-inst:ProductFeature130 ; + bsbm:productFeature bsbm-inst:ProductFeature137 ; + bsbm:producer dataFromProducer1:Producer1 ; + dc:publisher dataFromProducer1:Producer1 ; + dc:date "2006-11-18"^^xsd:date . +dataFromProducer1:Product28 + rdf:type bsbm:Product ; + rdfs:label "multilingual" ; + rdfs:comment "civvies defame pealed whipper statehouses boasts suaveness chillers fatheads distensible misbehaver snippily lisles contacted maceraters tepidly eras numbly fellaheen hydrotherapeutical talced hellishness plummeted hives redigests vapor beaching vegetist imprints goddesses mammate visualizations cuneiform oxcarts inverted sparseness faxes denationalizing depiction saxes hydrotherapies throbber knurled sportswriters quey reanalysis vignettes ironbark unavailable hooray telephotographs ladling danged cubical inducements recirculating homophone vizor senseful nonemotionally spaciously olympics leasing truantry worts assertive amblers overload macaroni desegregates majuscule abettals moistening shoes blent disqualifying roughhewed grazes trichloromethane altitudes dichotomies reoccurred prated ironstones debaucher jollified dilations galvanometric postholes sabotages sheol kronur quadrigamist gamecocks strate burnet rigorists profanely solipsists metrics protectively astronomically philtred zany surfed breadbaskets legislatrices infrastructures poutiest cajolery eclecticism unconfirmed eyeletting" ; + rdf:type bsbm-inst:ProductType18 ; + rdf:type bsbm-inst:ProductType5 ; + rdf:type bsbm-inst:ProductType1 ; + bsbm:productPropertyNumeric1 "1114"^^xsd:integer ; + bsbm:productPropertyNumeric2 "1218"^^xsd:integer ; + bsbm:productPropertyNumeric3 "791"^^xsd:integer ; + bsbm:productPropertyNumeric6 "832"^^xsd:integer ; + bsbm:productPropertyTextual1 "metallically shortwave elevens recorders"^^xsd:string ; + bsbm:productPropertyTextual2 "garaging decidedly alkalinizing presentable disclosed nucleoprotein nutritional neaps sentimentally overembellishes guidelines shells"^^xsd:string ; + bsbm:productPropertyTextual3 "hawed polystyrene bleated promotes kingwood sitting seadog"^^xsd:string ; + bsbm:productPropertyTextual6 "chubbily outargues moribundly"^^xsd:string ; + bsbm:productFeature bsbm-inst:ProductFeature815 ; + bsbm:productFeature bsbm-inst:ProductFeature817 ; + bsbm:productFeature bsbm-inst:ProductFeature821 ; + bsbm:productFeature bsbm-inst:ProductFeature826 ; + bsbm:productFeature bsbm-inst:ProductFeature827 ; + bsbm:productFeature bsbm-inst:ProductFeature835 ; + bsbm:productFeature bsbm-inst:ProductFeature837 ; + bsbm:productFeature bsbm-inst:ProductFeature838 ; + bsbm:productFeature bsbm-inst:ProductFeature839 ; + bsbm:productFeature bsbm-inst:ProductFeature841 ; + bsbm:productFeature bsbm-inst:ProductFeature844 ; + bsbm:productFeature bsbm-inst:ProductFeature846 ; + bsbm:productFeature bsbm-inst:ProductFeature850 ; + bsbm:productFeature bsbm-inst:ProductFeature851 ; + bsbm:productFeature bsbm-inst:ProductFeature853 ; + bsbm:productFeature bsbm-inst:ProductFeature147 ; + bsbm:productFeature bsbm-inst:ProductFeature152 ; + bsbm:productFeature bsbm-inst:ProductFeature153 ; + bsbm:productFeature bsbm-inst:ProductFeature157 ; + bsbm:productFeature bsbm-inst:ProductFeature161 ; + bsbm:productFeature bsbm-inst:ProductFeature166 ; + bsbm:productFeature bsbm-inst:ProductFeature170 ; + bsbm:productFeature bsbm-inst:ProductFeature179 ; + bsbm:productFeature bsbm-inst:ProductFeature180 ; + bsbm:producer dataFromProducer1:Producer1 ; + dc:publisher dataFromProducer1:Producer1 ; + dc:date "2005-03-30"^^xsd:date . +dataFromProducer1:Product29 + rdf:type bsbm:Product ; + rdfs:label "condensed atheneums piloting" ; + rdfs:comment "merriness enforcement budlike rewardingly viviparities grided cyclos flyweight options reflected delighting nightfalls stickling hyaenic kinesiologies dialectics transvestism contraptions yare splashing intriguers lamenting exteriorizing basely carts forcing agonized philandering astragal infold hassock unsocially lavalieres bibbers richest sander alamode flirting enumerates grubbiest cottagers voidness boggler upshifted pupates hoboes pitiableness humped topcrosses redrew overboard starver campier unpolarized viridians gizmo allottable vergers moulded outfought valances partials resound conoid periscopes libellees chronicles chayote voyaged sunnily parroted cloddy libertarianism sorbet dundees bioclimatologies flunked landsman fundamentalism excuses recombine condyles fess whiskeys demureness unproportionately defoliant anemias locoing eucalypti technically outlaying fruitiness automatizes shipowner frostiest favoring invisibleness digged compressions fugued mitiest catmint deepening describer temporizing dimply senoritas goalless boneheads cycloidal caulking prolixly mktg resins rishi reassembled lippy heirloom foxtrot cubbies undiscovered coomb" ; + rdf:type bsbm-inst:ProductType9 ; + rdf:type bsbm-inst:ProductType2 ; + rdf:type bsbm-inst:ProductType1 ; + bsbm:productPropertyNumeric1 "809"^^xsd:integer ; + bsbm:productPropertyNumeric2 "1371"^^xsd:integer ; + bsbm:productPropertyNumeric3 "421"^^xsd:integer ; + bsbm:productPropertyNumeric4 "603"^^xsd:integer ; + bsbm:productPropertyNumeric5 "354"^^xsd:integer ; + bsbm:productPropertyTextual1 "prosier sculpturing fopping laryngology furnishing"^^xsd:string ; + bsbm:productPropertyTextual2 "dales qualmy untrammeled forelimbs currency virally"^^xsd:string ; + bsbm:productPropertyTextual3 "arouser operants technical rinds brined"^^xsd:string ; + bsbm:productPropertyTextual4 "partitioning wraparounds renters kafir longlines gearwheels"^^xsd:string ; + bsbm:productPropertyTextual5 "preadjustable onomatopoetically scattering bios starlit interlopers clicked inrush universalizes ironclad churchly yeller kebobs poteens dewatering"^^xsd:string ; + bsbm:productFeature bsbm-inst:ProductFeature327 ; + bsbm:productFeature bsbm-inst:ProductFeature328 ; + bsbm:productFeature bsbm-inst:ProductFeature329 ; + bsbm:productFeature bsbm-inst:ProductFeature334 ; + bsbm:productFeature bsbm-inst:ProductFeature335 ; + bsbm:productFeature bsbm-inst:ProductFeature347 ; + bsbm:productFeature bsbm-inst:ProductFeature351 ; + bsbm:productFeature bsbm-inst:ProductFeature352 ; + bsbm:productFeature bsbm-inst:ProductFeature353 ; + bsbm:productFeature bsbm-inst:ProductFeature354 ; + bsbm:productFeature bsbm-inst:ProductFeature356 ; + bsbm:productFeature bsbm-inst:ProductFeature357 ; + bsbm:productFeature bsbm-inst:ProductFeature361 ; + bsbm:productFeature bsbm-inst:ProductFeature364 ; + bsbm:productFeature bsbm-inst:ProductFeature367 ; + bsbm:productFeature bsbm-inst:ProductFeature368 ; + bsbm:productFeature bsbm-inst:ProductFeature2 ; + bsbm:productFeature bsbm-inst:ProductFeature4 ; + bsbm:productFeature bsbm-inst:ProductFeature13 ; + bsbm:productFeature bsbm-inst:ProductFeature14 ; + bsbm:productFeature bsbm-inst:ProductFeature16 ; + bsbm:productFeature bsbm-inst:ProductFeature18 ; + bsbm:productFeature bsbm-inst:ProductFeature30 ; + bsbm:productFeature bsbm-inst:ProductFeature36 ; + bsbm:producer dataFromProducer1:Producer1 ; + dc:publisher dataFromProducer1:Producer1 ; + dc:date "2001-05-09"^^xsd:date . +dataFromProducer1:Product30 + rdf:type bsbm:Product ; + rdfs:label "dinky" ; + rdfs:comment "daubed unsew gudgeons censused solidifying gearbox garrotes fluoridations hellers flockings cognizers reendowing infects phycomycete undercoating models parishes conelrads discants generated emporia jerked outleaping diluter stilettoes candidacies forewarns pikemen thorniest chaplet anthologist potentially annotators machinations highballed latticed ophthalmoscope crumping buckboards dinged columbium jungliest symbolization middleweights nixies kingless slouches conjunctivas trudger occults names ignifying preestablish hotly reentrance sophistic reseller worshipers acknowledgments mudsill shaped mayflies sawed octopuses clanswoman retouching showmanship barkentine abstractedness cadgy cordoned twigged tightens advisers forewarn sayonara unpile kinships reprieving dreaded refortifies disproportion encourager cornice unblushing impetuously botanizing hoosgow commie rerolled sailorly millionths questionably thanatos radiums impercipient hawkbill bras titulary optical impoundment culling canfuls dobbins dight enthroning undecayed carroming aerologist untwisting biome ketones airlifts appreciation outthink ruddle reinstated overeducates abator sonnetting teachings massier grappling bigfoot rhythmically hotshots tradesfolk revisals fetted immigrating alkalise garroter haji" ; + rdf:type bsbm-inst:ProductType9 ; + rdf:type bsbm-inst:ProductType2 ; + rdf:type bsbm-inst:ProductType1 ; + bsbm:productPropertyNumeric1 "240"^^xsd:integer ; + bsbm:productPropertyNumeric2 "8"^^xsd:integer ; + bsbm:productPropertyNumeric3 "8"^^xsd:integer ; + bsbm:productPropertyNumeric4 "24"^^xsd:integer ; + bsbm:productPropertyNumeric5 "853"^^xsd:integer ; + bsbm:productPropertyTextual1 "provisions rubbishes stranded teaboard interdependence peering straitened halogenoid woodbines"^^xsd:string ; + bsbm:productPropertyTextual2 "shicksa riflings presidiums nucleons"^^xsd:string ; + bsbm:productPropertyTextual3 "cozener behoof grimmest gnawable sudoral"^^xsd:string ; + bsbm:productPropertyTextual4 "noncorroding buckler atmospherical"^^xsd:string ; + bsbm:productPropertyTextual5 "megalomaniacally esc adjusted ungainlier letterpress malarious undyingly unfathomed inactivations"^^xsd:string ; + bsbm:productFeature bsbm-inst:ProductFeature328 ; + bsbm:productFeature bsbm-inst:ProductFeature330 ; + bsbm:productFeature bsbm-inst:ProductFeature333 ; + bsbm:productFeature bsbm-inst:ProductFeature336 ; + bsbm:productFeature bsbm-inst:ProductFeature353 ; + bsbm:productFeature bsbm-inst:ProductFeature2 ; + bsbm:productFeature bsbm-inst:ProductFeature9 ; + bsbm:productFeature bsbm-inst:ProductFeature15 ; + bsbm:productFeature bsbm-inst:ProductFeature17 ; + bsbm:productFeature bsbm-inst:ProductFeature22 ; + bsbm:productFeature bsbm-inst:ProductFeature24 ; + bsbm:productFeature bsbm-inst:ProductFeature27 ; + bsbm:productFeature bsbm-inst:ProductFeature30 ; + bsbm:productFeature bsbm-inst:ProductFeature32 ; + bsbm:producer dataFromProducer1:Producer1 ; + dc:publisher dataFromProducer1:Producer1 ; + dc:date "2007-01-03"^^xsd:date . +dataFromProducer1:Product31 + rdf:type bsbm:Product ; + rdfs:label "eliminates" ; + rdfs:comment "fleeciness overexercising noising pounds obstructor belatedly existed tenoners tigrish partings resubmitted considered capriccios checkouts hotdogged metrified lyceum gatekeepers crasher procuration excursions bopper eating catchers shagginess overabundance unmistaken matzoth dipody breakages forints mucks dumfounding noncorroding gigatons casehardening narrative mows cozey nonacid deaconesses outreason gashed pummels stockpiling blesseder daylong unsustainable imprecating capitalized heartbeats metabases bamboozles inimicability shammes hobblers dictronics ricksha epistasies concealable preexamining grimily trilobed novelly strangling dissevers yeastier thriftlessness deposable impearls preassigned victorians onanistic hoaxed administers mastodonic wintrily terrified kroner pokily inventoried acceptive beaucoup suborning" ; + rdf:type bsbm-inst:ProductType21 ; + rdf:type bsbm-inst:ProductType5 ; + rdf:type bsbm-inst:ProductType1 ; + bsbm:productPropertyNumeric1 "237"^^xsd:integer ; + bsbm:productPropertyNumeric2 "921"^^xsd:integer ; + bsbm:productPropertyNumeric3 "504"^^xsd:integer ; + bsbm:productPropertyNumeric5 "1291"^^xsd:integer ; + bsbm:productPropertyNumeric6 "544"^^xsd:integer ; + bsbm:productPropertyTextual1 "thirdly valencia fairest blowups shirkers appalling unrevoked bewitchments periodicity packager grottoes exemplum"^^xsd:string ; + bsbm:productPropertyTextual2 "windbags drabble calif univalves pas delicateness"^^xsd:string ; + bsbm:productPropertyTextual3 "unchasteness nasals entropies melded vacancies elegises tarsus sloping lettering purgatories"^^xsd:string ; + bsbm:productPropertyTextual6 "asepsis stutterers scottie trigraphs roofers chads maracas"^^xsd:string ; + bsbm:productFeature bsbm-inst:ProductFeature942 ; + bsbm:productFeature bsbm-inst:ProductFeature945 ; + bsbm:productFeature bsbm-inst:ProductFeature948 ; + bsbm:productFeature bsbm-inst:ProductFeature949 ; + bsbm:productFeature bsbm-inst:ProductFeature950 ; + bsbm:productFeature bsbm-inst:ProductFeature952 ; + bsbm:productFeature bsbm-inst:ProductFeature955 ; + bsbm:productFeature bsbm-inst:ProductFeature958 ; + bsbm:productFeature bsbm-inst:ProductFeature959 ; + bsbm:productFeature bsbm-inst:ProductFeature960 ; + bsbm:productFeature bsbm-inst:ProductFeature962 ; + bsbm:productFeature bsbm-inst:ProductFeature967 ; + bsbm:productFeature bsbm-inst:ProductFeature975 ; + bsbm:productFeature bsbm-inst:ProductFeature981 ; + bsbm:productFeature bsbm-inst:ProductFeature983 ; + bsbm:productFeature bsbm-inst:ProductFeature986 ; + bsbm:productFeature bsbm-inst:ProductFeature992 ; + bsbm:productFeature bsbm-inst:ProductFeature996 ; + bsbm:productFeature bsbm-inst:ProductFeature142 ; + bsbm:productFeature bsbm-inst:ProductFeature145 ; + bsbm:productFeature bsbm-inst:ProductFeature146 ; + bsbm:productFeature bsbm-inst:ProductFeature147 ; + bsbm:productFeature bsbm-inst:ProductFeature152 ; + bsbm:productFeature bsbm-inst:ProductFeature154 ; + bsbm:productFeature bsbm-inst:ProductFeature162 ; + bsbm:productFeature bsbm-inst:ProductFeature163 ; + bsbm:productFeature bsbm-inst:ProductFeature164 ; + bsbm:productFeature bsbm-inst:ProductFeature174 ; + bsbm:producer dataFromProducer1:Producer1 ; + dc:publisher dataFromProducer1:Producer1 ; + dc:date "2006-01-11"^^xsd:date . +dataFromProducer1:Product32 + rdf:type bsbm:Product ; + rdfs:label "pilafs toadfish" ; + rdfs:comment "petals sanitarians dentals bellhops monotonously deprecator highborn unskillfulness trochoids sonarmen whirligigs vatfuls impugner cursiveness canvases midlines undogmatic parmigiana unobtruding shoplifts voucherable hardeners potful morality preexist burdens capabilities caffeine catabolism inweave workdays undecidable resealable commixing attenuating domestications designed gabbers unmortgaged abases scalesmen rigidity intrepidly raptured galliums narwal chagrins slathering densifies leviers anesthetizes stringless fundamentalists loquats preprocessing unbridle branchier sheeney roaches influenzas crouches dallied alinement ensembles roguing enrapt thouing anginal bruited auberges breadboards counterpane attaining brutifies priors cabooses intercalated vetoer workaholic diverting daggered bugling sweetmeats oxters billowing unsigned millibars" ; + rdf:type bsbm-inst:ProductType17 ; + rdf:type bsbm-inst:ProductType4 ; + rdf:type bsbm-inst:ProductType1 ; + bsbm:productPropertyNumeric1 "533"^^xsd:integer ; + bsbm:productPropertyNumeric2 "1869"^^xsd:integer ; + bsbm:productPropertyNumeric3 "1269"^^xsd:integer ; + bsbm:productPropertyNumeric5 "71"^^xsd:integer ; + bsbm:productPropertyTextual1 "bewitched reduced overbalanced abashes perilled friendless siring mommas handiest twangy"^^xsd:string ; + bsbm:productPropertyTextual2 "genet antineutrons rationalities pimped waterfronts candlewicks tarantulae sealable"^^xsd:string ; + bsbm:productPropertyTextual3 "propagating resurrects villainess equations petard"^^xsd:string ; + bsbm:productPropertyTextual6 "emotionalize wielded molluscans mushed sailcloth underexposure carcinogenesis auklets attestant worldly"^^xsd:string ; + bsbm:productFeature bsbm-inst:ProductFeature756 ; + bsbm:productFeature bsbm-inst:ProductFeature765 ; + bsbm:productFeature bsbm-inst:ProductFeature770 ; + bsbm:productFeature bsbm-inst:ProductFeature771 ; + bsbm:productFeature bsbm-inst:ProductFeature776 ; + bsbm:productFeature bsbm-inst:ProductFeature778 ; + bsbm:productFeature bsbm-inst:ProductFeature783 ; + bsbm:productFeature bsbm-inst:ProductFeature786 ; + bsbm:productFeature bsbm-inst:ProductFeature787 ; + bsbm:productFeature bsbm-inst:ProductFeature788 ; + bsbm:productFeature bsbm-inst:ProductFeature794 ; + bsbm:productFeature bsbm-inst:ProductFeature804 ; + bsbm:productFeature bsbm-inst:ProductFeature806 ; + bsbm:productFeature bsbm-inst:ProductFeature808 ; + bsbm:productFeature bsbm-inst:ProductFeature812 ; + bsbm:productFeature bsbm-inst:ProductFeature77 ; + bsbm:productFeature bsbm-inst:ProductFeature81 ; + bsbm:productFeature bsbm-inst:ProductFeature87 ; + bsbm:productFeature bsbm-inst:ProductFeature94 ; + bsbm:productFeature bsbm-inst:ProductFeature98 ; + bsbm:productFeature bsbm-inst:ProductFeature100 ; + bsbm:productFeature bsbm-inst:ProductFeature102 ; + bsbm:productFeature bsbm-inst:ProductFeature108 ; + bsbm:productFeature bsbm-inst:ProductFeature116 ; + bsbm:productFeature bsbm-inst:ProductFeature117 ; + bsbm:productFeature bsbm-inst:ProductFeature120 ; + bsbm:productFeature bsbm-inst:ProductFeature127 ; + bsbm:productFeature bsbm-inst:ProductFeature133 ; + bsbm:productFeature bsbm-inst:ProductFeature139 ; + bsbm:producer dataFromProducer1:Producer1 ; + dc:publisher dataFromProducer1:Producer1 ; + dc:date "2002-10-07"^^xsd:date . +dataFromProducer1:Product33 + rdf:type bsbm:Product ; + rdfs:label "uncivil powerplants idealizations" ; + rdfs:comment "precipiced peelings ballooners dhole justly recencies lorgnettes harshening sudsing naturalization encased joinings rifflers realist liberationists birdlimed chucked lemony preassembles ecologic corespondents auctorial prosy brushup promulgators misdoings drowns hearths detoxicating uncollected heptoses thickest teratoid stirrer ductal rabbeted frothiness sessional pyric fleetly twinges oversystematic prohibitions notables discomposes kaftan shabbiness enclaves sawer idealities frustration cislunar octants peduncles nonessentials animators drily laude palpus cutely filmcards chirpier snowdrift baguets oversophisticated therapeutics subtend institutionalism pseudointellectual outpayment quackishness fictionalize inbreeds peaks spareness backlists baulk repairers medical gearcases pities immovably lights eroticization covered theftproof projection predicaments groundlessly expender pricked fringes unhorses physicianly platys hag firebox" ; + rdf:type bsbm-inst:ProductType16 ; + rdf:type bsbm-inst:ProductType4 ; + rdf:type bsbm-inst:ProductType1 ; + bsbm:productPropertyNumeric1 "1007"^^xsd:integer ; + bsbm:productPropertyNumeric2 "1091"^^xsd:integer ; + bsbm:productPropertyNumeric3 "788"^^xsd:integer ; + bsbm:productPropertyNumeric4 "764"^^xsd:integer ; + bsbm:productPropertyNumeric5 "759"^^xsd:integer ; + bsbm:productPropertyTextual1 "reconciliating amplifiable hoses goaded parsed jubile bubonic matin furriers avoids cataloguing misgoverning"^^xsd:string ; + bsbm:productPropertyTextual2 "thoued voluminously misadministration winnowers"^^xsd:string ; + bsbm:productPropertyTextual3 "cosmetics cirrhosis immunologies agreeableness diametrically ankhs skydived impetuously disfiguring okeydoke"^^xsd:string ; + bsbm:productPropertyTextual4 "centre kudus redbuds loblollies ahold victualing elastomeric cablegrams stridently cutesier"^^xsd:string ; + bsbm:productPropertyTextual5 "soliloquize triumvirate evenness shoddies collectivized decreasingly flatter cirrose"^^xsd:string ; + bsbm:productFeature bsbm-inst:ProductFeature691 ; + bsbm:productFeature bsbm-inst:ProductFeature694 ; + bsbm:productFeature bsbm-inst:ProductFeature700 ; + bsbm:productFeature bsbm-inst:ProductFeature705 ; + bsbm:productFeature bsbm-inst:ProductFeature707 ; + bsbm:productFeature bsbm-inst:ProductFeature715 ; + bsbm:productFeature bsbm-inst:ProductFeature718 ; + bsbm:productFeature bsbm-inst:ProductFeature720 ; + bsbm:productFeature bsbm-inst:ProductFeature721 ; + bsbm:productFeature bsbm-inst:ProductFeature725 ; + bsbm:productFeature bsbm-inst:ProductFeature727 ; + bsbm:productFeature bsbm-inst:ProductFeature735 ; + bsbm:productFeature bsbm-inst:ProductFeature739 ; + bsbm:productFeature bsbm-inst:ProductFeature743 ; + bsbm:productFeature bsbm-inst:ProductFeature748 ; + bsbm:productFeature bsbm-inst:ProductFeature77 ; + bsbm:productFeature bsbm-inst:ProductFeature81 ; + bsbm:productFeature bsbm-inst:ProductFeature83 ; + bsbm:productFeature bsbm-inst:ProductFeature85 ; + bsbm:productFeature bsbm-inst:ProductFeature86 ; + bsbm:productFeature bsbm-inst:ProductFeature89 ; + bsbm:productFeature bsbm-inst:ProductFeature90 ; + bsbm:productFeature bsbm-inst:ProductFeature101 ; + bsbm:productFeature bsbm-inst:ProductFeature102 ; + bsbm:productFeature bsbm-inst:ProductFeature103 ; + bsbm:productFeature bsbm-inst:ProductFeature106 ; + bsbm:productFeature bsbm-inst:ProductFeature111 ; + bsbm:productFeature bsbm-inst:ProductFeature119 ; + bsbm:productFeature bsbm-inst:ProductFeature122 ; + bsbm:productFeature bsbm-inst:ProductFeature126 ; + bsbm:productFeature bsbm-inst:ProductFeature139 ; + bsbm:productFeature bsbm-inst:ProductFeature140 ; + bsbm:producer dataFromProducer1:Producer1 ; + dc:publisher dataFromProducer1:Producer1 ; + dc:date "2001-08-26"^^xsd:date . +dataFromProducer1:Product34 + rdf:type bsbm:Product ; + rdfs:label "amtrac puckery" ; + rdfs:comment "heraldists myrmidons mime identifiability pollination woodener organized fishes soapstones brachiation croaks libitum bloodying underexpose backpackers lolls mavin cloggy pols chyme nonaligned longitudes pennames kookie serges pyrenees hoarding miaow cosigned reconcentration artificiality biosyntheses cyanided harmoniums compounder workhouses defoliating unschooled duresses milliliter cheats spawned lathwork saguaros subsections refiring depicting soggiest tympana whiskeys catechumen scroggiest sidlers oppositeness prosaists hallah blessedness vituperative dastards acknowledgment fueller commissar telephotographed rearmament nutmeat exhibiter pilsner tallymen phallism adjudicators waspy unsteadies mutable transacted newsdealers nudely deactivators toddies anarchistic consignees microscopical hovelling paramedics limby uprightly slavering hunted insets herbivore thyself dandily chokey cared eglantines fees scrutinizingly baklavas wolframs deterrents neomycins graphed materia vanquished antinarcotic tatting istle seasonable faultlessly excreting plowshares seeping radiograms kyat wellborn forthrightly positivest heedless cardinals tithers menage billeters plashy placoid catechized bucketful battlers lockbox tallying" ; + rdf:type bsbm-inst:ProductType8 ; + rdf:type bsbm-inst:ProductType2 ; + rdf:type bsbm-inst:ProductType1 ; + bsbm:productPropertyNumeric1 "858"^^xsd:integer ; + bsbm:productPropertyNumeric2 "601"^^xsd:integer ; + bsbm:productPropertyNumeric3 "302"^^xsd:integer ; + bsbm:productPropertyNumeric4 "157"^^xsd:integer ; + bsbm:productPropertyNumeric5 "465"^^xsd:integer ; + bsbm:productPropertyTextual1 "blabbering sergeancies unlaboured liniments traction replenishing towards sermonizing ultimas jadish"^^xsd:string ; + bsbm:productPropertyTextual2 "serializes bilkers tipplers paperhanger newsletters ennobling bendable millstream"^^xsd:string ; + bsbm:productPropertyTextual3 "spectrometers stibium scolded flopover pinpointed akvavit deployments kerplunk splashiest forests pineal dourly aberrantly inflexibly"^^xsd:string ; + bsbm:productPropertyTextual4 "ejaculation cataloger chirper acned anklet"^^xsd:string ; + bsbm:productPropertyTextual5 "baldachins linesman complainer nonabrasively grutten cameroonians metempsychoses"^^xsd:string ; + bsbm:productFeature bsbm-inst:ProductFeature291 ; + bsbm:productFeature bsbm-inst:ProductFeature297 ; + bsbm:productFeature bsbm-inst:ProductFeature299 ; + bsbm:productFeature bsbm-inst:ProductFeature300 ; + bsbm:productFeature bsbm-inst:ProductFeature301 ; + bsbm:productFeature bsbm-inst:ProductFeature306 ; + bsbm:productFeature bsbm-inst:ProductFeature307 ; + bsbm:productFeature bsbm-inst:ProductFeature309 ; + bsbm:productFeature bsbm-inst:ProductFeature5 ; + bsbm:productFeature bsbm-inst:ProductFeature16 ; + bsbm:productFeature bsbm-inst:ProductFeature17 ; + bsbm:productFeature bsbm-inst:ProductFeature20 ; + bsbm:productFeature bsbm-inst:ProductFeature22 ; + bsbm:productFeature bsbm-inst:ProductFeature26 ; + bsbm:productFeature bsbm-inst:ProductFeature28 ; + bsbm:productFeature bsbm-inst:ProductFeature29 ; + bsbm:producer dataFromProducer1:Producer1 ; + dc:publisher dataFromProducer1:Producer1 ; + dc:date "2002-10-26"^^xsd:date . +dataFromProducer1:Product35 + rdf:type bsbm:Product ; + rdfs:label "liming uproars unwearably" ; + rdfs:comment "stouts kinematically intermediacy peiping prerecording mongol blanched badmouth yankees dognaping sickles sunbow upbearer jaywalked suburbed remixing derogates prissiest expressionistic allegedly hafniums paranoids thermistors extends portending capmaker fellah residers attributing foulards bucketer spelldowns frills statists caput smeared suppurate rhetors restructured whirliest notorieties lumped sentimentalist kneeling serries corporeality fulminating repetitiousness naves chirker barbel quicksteps voiles zebras dormy identicalness critturs sentries temporaries bowshots cadenced winepress sparkily clouter mislays gabbler infliction inhumanly nonrigid inventions individualizes bandanas lienteries lignins urbanized egomaniacal defacer corms headrests fins abilene bobsledders abradant enfeoffment japanners unworkably linguistically electuary marsupializing reradiates cruised experiences furioso toyers diaspore redistricts theologs squeezing interested bobbling recap quarrelers schmuck vicissitudes curbers attacked piggishness economizing pothook cypres gluteal incompatibly blazoning maladministering debilitant birded internals berhymes dishonesty anthers metalaw honker stainable trackings waggoners lovelier unpurified zestful blackbirds remeasuring spewer depreciatory arrangements tacklers notifying serenaded aspirers submissiveness backbend yielding eyestalks medullar mooches wops destaining" ; + rdf:type bsbm-inst:ProductType17 ; + rdf:type bsbm-inst:ProductType4 ; + rdf:type bsbm-inst:ProductType1 ; + bsbm:productPropertyNumeric1 "413"^^xsd:integer ; + bsbm:productPropertyNumeric2 "772"^^xsd:integer ; + bsbm:productPropertyNumeric3 "1692"^^xsd:integer ; + bsbm:productPropertyTextual1 "modeller cocos monochrome"^^xsd:string ; + bsbm:productPropertyTextual2 "cabbages scatting triturators chanced conceiver decreers defoliates"^^xsd:string ; + bsbm:productPropertyTextual3 "folderol unflappability intensifies donee rattlings lilies tragedians vervet newsier pekoe"^^xsd:string ; + bsbm:productFeature bsbm-inst:ProductFeature751 ; + bsbm:productFeature bsbm-inst:ProductFeature752 ; + bsbm:productFeature bsbm-inst:ProductFeature753 ; + bsbm:productFeature bsbm-inst:ProductFeature757 ; + bsbm:productFeature bsbm-inst:ProductFeature759 ; + bsbm:productFeature bsbm-inst:ProductFeature773 ; + bsbm:productFeature bsbm-inst:ProductFeature774 ; + bsbm:productFeature bsbm-inst:ProductFeature776 ; + bsbm:productFeature bsbm-inst:ProductFeature778 ; + bsbm:productFeature bsbm-inst:ProductFeature779 ; + bsbm:productFeature bsbm-inst:ProductFeature780 ; + bsbm:productFeature bsbm-inst:ProductFeature784 ; + bsbm:productFeature bsbm-inst:ProductFeature787 ; + bsbm:productFeature bsbm-inst:ProductFeature788 ; + bsbm:productFeature bsbm-inst:ProductFeature796 ; + bsbm:productFeature bsbm-inst:ProductFeature798 ; + bsbm:productFeature bsbm-inst:ProductFeature807 ; + bsbm:productFeature bsbm-inst:ProductFeature808 ; + bsbm:productFeature bsbm-inst:ProductFeature810 ; + bsbm:productFeature bsbm-inst:ProductFeature811 ; + bsbm:productFeature bsbm-inst:ProductFeature80 ; + bsbm:productFeature bsbm-inst:ProductFeature82 ; + bsbm:productFeature bsbm-inst:ProductFeature83 ; + bsbm:productFeature bsbm-inst:ProductFeature89 ; + bsbm:productFeature bsbm-inst:ProductFeature99 ; + bsbm:productFeature bsbm-inst:ProductFeature106 ; + bsbm:productFeature bsbm-inst:ProductFeature107 ; + bsbm:productFeature bsbm-inst:ProductFeature108 ; + bsbm:productFeature bsbm-inst:ProductFeature112 ; + bsbm:productFeature bsbm-inst:ProductFeature114 ; + bsbm:productFeature bsbm-inst:ProductFeature118 ; + bsbm:productFeature bsbm-inst:ProductFeature121 ; + bsbm:productFeature bsbm-inst:ProductFeature122 ; + bsbm:productFeature bsbm-inst:ProductFeature127 ; + bsbm:productFeature bsbm-inst:ProductFeature135 ; + bsbm:productFeature bsbm-inst:ProductFeature138 ; + bsbm:productFeature bsbm-inst:ProductFeature139 ; + bsbm:productFeature bsbm-inst:ProductFeature140 ; + bsbm:producer dataFromProducer1:Producer1 ; + dc:publisher dataFromProducer1:Producer1 ; + dc:date "2005-04-21"^^xsd:date . +dataFromProducer1:Product36 + rdf:type bsbm:Product ; + rdfs:label "endogeny" ; + rdfs:comment "doormat bunkums siestas scalds pathologist narco lucubrations skippers unrelated trigons gauntness regimental decocted sugaring squadrons receivability lurcher gangplanks hypnotizes bacca joyance plaining guarantees acclimation manifolding disillusion medullas stencils unsterile enricher inkle restaurants lunations buskined manually reloads pleasuring allocating reencounters enlarged modellers subtotaling underrate asker ligaturing werwolf dries edictally commutators relearn spurtles development kitlings justed hazards pulingly turquoises overstay repetitions stepbrother tokay nonintellectual prevailed liras correlatable gandering dubiousness" ; + rdf:type bsbm-inst:ProductType18 ; + rdf:type bsbm-inst:ProductType5 ; + rdf:type bsbm-inst:ProductType1 ; + bsbm:productPropertyNumeric1 "951"^^xsd:integer ; + bsbm:productPropertyNumeric2 "585"^^xsd:integer ; + bsbm:productPropertyNumeric3 "220"^^xsd:integer ; + bsbm:productPropertyTextual1 "removed twanging antinationalist harlot amucks sixing"^^xsd:string ; + bsbm:productPropertyTextual2 "rifted lunching epilepsy coalyards inaudibility restates unlocks concludes withholding effervescence"^^xsd:string ; + bsbm:productPropertyTextual3 "glimmers aggrandizing seminars countrywoman proneness detesting fairer weightless zoroastrians egoistical snooker politicked unicycles acidy"^^xsd:string ; + bsbm:productPropertyTextual6 "interrupting danker deflagrate depersonalizes expatriate patinas hetero convoking dottily apium viscid crewing miladis"^^xsd:string ; + bsbm:productFeature bsbm-inst:ProductFeature822 ; + bsbm:productFeature bsbm-inst:ProductFeature827 ; + bsbm:productFeature bsbm-inst:ProductFeature829 ; + bsbm:productFeature bsbm-inst:ProductFeature830 ; + bsbm:productFeature bsbm-inst:ProductFeature831 ; + bsbm:productFeature bsbm-inst:ProductFeature842 ; + bsbm:productFeature bsbm-inst:ProductFeature843 ; + bsbm:productFeature bsbm-inst:ProductFeature845 ; + bsbm:productFeature bsbm-inst:ProductFeature847 ; + bsbm:productFeature bsbm-inst:ProductFeature853 ; + bsbm:productFeature bsbm-inst:ProductFeature854 ; + bsbm:productFeature bsbm-inst:ProductFeature855 ; + bsbm:productFeature bsbm-inst:ProductFeature142 ; + bsbm:productFeature bsbm-inst:ProductFeature150 ; + bsbm:productFeature bsbm-inst:ProductFeature151 ; + bsbm:productFeature bsbm-inst:ProductFeature153 ; + bsbm:productFeature bsbm-inst:ProductFeature156 ; + bsbm:productFeature bsbm-inst:ProductFeature163 ; + bsbm:productFeature bsbm-inst:ProductFeature167 ; + bsbm:productFeature bsbm-inst:ProductFeature177 ; + bsbm:producer dataFromProducer1:Producer1 ; + dc:publisher dataFromProducer1:Producer1 ; + dc:date "2000-11-20"^^xsd:date . +dataFromProducer1:Product37 + rdf:type bsbm:Product ; + rdfs:label "reletters vases" ; + rdfs:comment "corroborating elitism eugenism objection reeving nonforfeitable bathless squiffed infidels pewees racoon enginery passingly deformations nonbelligerents buffoonery porches cozens responder reuse foveal weaners ulcers gills hierophant hebrews proabortion dispersing ramies imprecated bioactivities stacked throughways counterspies introducible jungliest selfheals irrefutability luxations shoptalks typescripts reffed lordliness modelling impingement anglers piquing odours pining joinings plages valorem meatiest butyls syncopation emboli inspirer dosimetries cuishes tobogganed threadier marline coaster ambrosially acceptable piddler oink septet administrant gimel confiscates substation scholium subsidizations replenishing haughtier roundest biconvexity charminger snatches returnable catnapped anole didos noddle cations jailbait guppy expostulate wrathiest averaged nictitation dowdyish blusterer jogger feces squeezers autobuses havockers titters reduction rogues predestinating darks bountiful ghostliest gibbously bookrests freres pinfolding nutters interconnecting unmollified fledgy seniles abandoner steeples counterrevolutionary rulings lineable spectrometric criticize gradated dispossesses subarea recreate glasses automatically oration concluded zambezi reprogrammed tokonoma beholders edgeless upsetters" ; + rdf:type bsbm-inst:ProductType12 ; + rdf:type bsbm-inst:ProductType3 ; + rdf:type bsbm-inst:ProductType1 ; + bsbm:productPropertyNumeric1 "82"^^xsd:integer ; + bsbm:productPropertyNumeric2 "799"^^xsd:integer ; + bsbm:productPropertyNumeric3 "1014"^^xsd:integer ; + bsbm:productPropertyTextual1 "falsest reaffirm polysorbate wryer departures prominently sportively unexceptionable obligating unserviceably outplaying kaliph inconsistency outboards"^^xsd:string ; + bsbm:productPropertyTextual2 "plangency exotisms hippodromes gumweed headfirst effectuation legalize photomicrograph drunkards grayouts"^^xsd:string ; + bsbm:productPropertyTextual3 "oinked interregional invalidly hyperactive narcotizing kilocycle nonidentical photosynthesizing puerilities venins divergences brocading teensiest skewering rammers"^^xsd:string ; + bsbm:productPropertyTextual4 "cadges alongshore loathes"^^xsd:string ; + bsbm:productFeature bsbm-inst:ProductFeature453 ; + bsbm:productFeature bsbm-inst:ProductFeature459 ; + bsbm:productFeature bsbm-inst:ProductFeature466 ; + bsbm:productFeature bsbm-inst:ProductFeature468 ; + bsbm:productFeature bsbm-inst:ProductFeature472 ; + bsbm:productFeature bsbm-inst:ProductFeature474 ; + bsbm:productFeature bsbm-inst:ProductFeature485 ; + bsbm:productFeature bsbm-inst:ProductFeature487 ; + bsbm:productFeature bsbm-inst:ProductFeature490 ; + bsbm:productFeature bsbm-inst:ProductFeature493 ; + bsbm:productFeature bsbm-inst:ProductFeature41 ; + bsbm:productFeature bsbm-inst:ProductFeature48 ; + bsbm:productFeature bsbm-inst:ProductFeature53 ; + bsbm:productFeature bsbm-inst:ProductFeature55 ; + bsbm:productFeature bsbm-inst:ProductFeature56 ; + bsbm:productFeature bsbm-inst:ProductFeature57 ; + bsbm:productFeature bsbm-inst:ProductFeature58 ; + bsbm:productFeature bsbm-inst:ProductFeature59 ; + bsbm:productFeature bsbm-inst:ProductFeature62 ; + bsbm:productFeature bsbm-inst:ProductFeature66 ; + bsbm:productFeature bsbm-inst:ProductFeature67 ; + bsbm:productFeature bsbm-inst:ProductFeature72 ; + bsbm:productFeature bsbm-inst:ProductFeature75 ; + bsbm:productFeature bsbm-inst:ProductFeature76 ; + bsbm:producer dataFromProducer1:Producer1 ; + dc:publisher dataFromProducer1:Producer1 ; + dc:date "2006-05-05"^^xsd:date . +dataFromProducer1:Product38 + rdf:type bsbm:Product ; + rdfs:label "klatsch" ; + rdfs:comment "secularistic mantissas sonnetting barbwire imprecisely carbides atman humbly cankered fraggings israelis tripper djibouti bothered playwears adverseness caboose demotes fenestration nonmigratory communing flowerers sharpener whispers obverts bries flushed chargee episodically belligerents banshies cannibalized hazels cocainize cupped atomism cybernetically optimistically eradication duplicators unlimitedness wizen supplements impersonation pendulous denotations xeroderma decks riffled nonsexual inertly minx oldies roadways tunneled drilling gluttony twinning epicene batts unicycle chugs repudiations localists sleeks squabby shoving" ; + rdf:type bsbm-inst:ProductType10 ; + rdf:type bsbm-inst:ProductType3 ; + rdf:type bsbm-inst:ProductType1 ; + bsbm:productPropertyNumeric1 "751"^^xsd:integer ; + bsbm:productPropertyNumeric2 "915"^^xsd:integer ; + bsbm:productPropertyNumeric3 "123"^^xsd:integer ; + bsbm:productPropertyTextual1 "tiffins chambray nonskid regrafting coughs annihilators punkin"^^xsd:string ; + bsbm:productPropertyTextual2 "broiders threnodies tumefied cornels nulls centrums edification haole numbered"^^xsd:string ; + bsbm:productPropertyTextual3 "subofficers progressiveness marchionesses loganberry farmyards autodials professionalize recapitulate sapid melancholiacs melancholic marker gaggers encipherments stringiest"^^xsd:string ; + bsbm:productFeature bsbm-inst:ProductFeature370 ; + bsbm:productFeature bsbm-inst:ProductFeature371 ; + bsbm:productFeature bsbm-inst:ProductFeature378 ; + bsbm:productFeature bsbm-inst:ProductFeature384 ; + bsbm:productFeature bsbm-inst:ProductFeature386 ; + bsbm:productFeature bsbm-inst:ProductFeature392 ; + bsbm:productFeature bsbm-inst:ProductFeature395 ; + bsbm:productFeature bsbm-inst:ProductFeature396 ; + bsbm:productFeature bsbm-inst:ProductFeature397 ; + bsbm:productFeature bsbm-inst:ProductFeature399 ; + bsbm:productFeature bsbm-inst:ProductFeature400 ; + bsbm:productFeature bsbm-inst:ProductFeature403 ; + bsbm:productFeature bsbm-inst:ProductFeature407 ; + bsbm:productFeature bsbm-inst:ProductFeature415 ; + bsbm:productFeature bsbm-inst:ProductFeature37 ; + bsbm:productFeature bsbm-inst:ProductFeature44 ; + bsbm:productFeature bsbm-inst:ProductFeature47 ; + bsbm:productFeature bsbm-inst:ProductFeature49 ; + bsbm:productFeature bsbm-inst:ProductFeature50 ; + bsbm:productFeature bsbm-inst:ProductFeature62 ; + bsbm:productFeature bsbm-inst:ProductFeature63 ; + bsbm:productFeature bsbm-inst:ProductFeature72 ; + bsbm:producer dataFromProducer1:Producer1 ; + dc:publisher dataFromProducer1:Producer1 ; + dc:date "2003-08-12"^^xsd:date . +dataFromProducer1:Product39 + rdf:type bsbm:Product ; + rdfs:label "supplicants creosotes" ; + rdfs:comment "machicolation underprivileged stairs torqued variegating darnels catamounts increasers effacer parcels dentifrices starves seismisms concretely unsettles rookier swashbuckling untying fanzine promisee oxidizable scores exculpations notandum treacherously tollbars thermometrically girds unfazed flatterer veinlet prescriptions keeling rivederci inviolacy fattener transmittible wastefully exemplum defusing couth melding irises netter roomed curares interminably dominica issei zaniness plumber secludes effecting dropshots lusters pourboire redemptible localites columbium mistranscribed barriers intertwinement disinterest muslins neoterics fungiform querier blent whaled expendable" ; + rdf:type bsbm-inst:ProductType7 ; + rdf:type bsbm-inst:ProductType2 ; + rdf:type bsbm-inst:ProductType1 ; + bsbm:productPropertyNumeric1 "1193"^^xsd:integer ; + bsbm:productPropertyNumeric2 "279"^^xsd:integer ; + bsbm:productPropertyNumeric3 "290"^^xsd:integer ; + bsbm:productPropertyNumeric5 "1491"^^xsd:integer ; + bsbm:productPropertyNumeric6 "895"^^xsd:integer ; + bsbm:productPropertyTextual1 "sesquipedalian tremolo osculum noggs overimpressed overcompensating perishable insatiate germanized stagiest abbreviated hunching"^^xsd:string ; + bsbm:productPropertyTextual2 "xyster touchier bassoons warblers rating paramours"^^xsd:string ; + bsbm:productPropertyTextual3 "trouty fellatio condors puffier proconservation"^^xsd:string ; + bsbm:productPropertyTextual6 "skullcaps devourer turning oversleeps vampirism attitudinize loller"^^xsd:string ; + bsbm:productFeature bsbm-inst:ProductFeature227 ; + bsbm:productFeature bsbm-inst:ProductFeature235 ; + bsbm:productFeature bsbm-inst:ProductFeature238 ; + bsbm:productFeature bsbm-inst:ProductFeature240 ; + bsbm:productFeature bsbm-inst:ProductFeature245 ; + bsbm:productFeature bsbm-inst:ProductFeature259 ; + bsbm:productFeature bsbm-inst:ProductFeature260 ; + bsbm:productFeature bsbm-inst:ProductFeature263 ; + bsbm:productFeature bsbm-inst:ProductFeature279 ; + bsbm:productFeature bsbm-inst:ProductFeature281 ; + bsbm:productFeature bsbm-inst:ProductFeature3 ; + bsbm:productFeature bsbm-inst:ProductFeature10 ; + bsbm:productFeature bsbm-inst:ProductFeature13 ; + bsbm:productFeature bsbm-inst:ProductFeature14 ; + bsbm:productFeature bsbm-inst:ProductFeature17 ; + bsbm:productFeature bsbm-inst:ProductFeature23 ; + bsbm:productFeature bsbm-inst:ProductFeature25 ; + bsbm:productFeature bsbm-inst:ProductFeature26 ; + bsbm:productFeature bsbm-inst:ProductFeature30 ; + bsbm:productFeature bsbm-inst:ProductFeature33 ; + bsbm:productFeature bsbm-inst:ProductFeature36 ; + bsbm:producer dataFromProducer1:Producer1 ; + dc:publisher dataFromProducer1:Producer1 ; + dc:date "2006-09-10"^^xsd:date . +dataFromProducer1:Product40 + rdf:type bsbm:Product ; + rdfs:label "setlines manrope hoarser" ; + rdfs:comment "recited conjures wobbly superlatively parasites checkerboards foetuses ventilators cowries reaching remodifies peccadilloes gashed glutei goslings coenzyme tongas extraditing rarefaction cannoned mycelium asteroids sorceress spinoffs misalphabetized repay gyroscopes indetermination guessing unpinning plasmoids duteous viticulture jinnee encapsuling ingress vaulters risus puggy internship disfunction scrimmages purgatively appliances stutters dimes socialites cesareans unweaving effecter bulkage bargemen ironsides fowls sexing undefiled phantasmagoria imperceptiveness verses wealthier narcissists rued comfortable estimated manoeuvre cellist chasmal dappling coruscations diplomatically toxicological salvations headpins dubiousness bodings promulgates spanker nuncles tagboard powwowed flockier nauseousness unbrotherly flusher announces phoney approximated tunability maliciously aboding ionospheres flaggings ascertainment praises spiegels sporters salvagees bassists portentousness violinist wingspans cataleptically buoyancies midlands embars calmed flayer unscrambles uncharged iridescent vituperates monikers replants ignitors underpinnings coheir leucocyte typified gymnastics recharts swarmers overstrike insister unfrequented unaesthetic" ; + rdf:type bsbm-inst:ProductType7 ; + rdf:type bsbm-inst:ProductType2 ; + rdf:type bsbm-inst:ProductType1 ; + bsbm:productPropertyNumeric1 "77"^^xsd:integer ; + bsbm:productPropertyNumeric2 "123"^^xsd:integer ; + bsbm:productPropertyNumeric3 "1908"^^xsd:integer ; + bsbm:productPropertyNumeric4 "7"^^xsd:integer ; + bsbm:productPropertyNumeric5 "748"^^xsd:integer ; + bsbm:productPropertyTextual1 "inners exclaimed untypically cowboys glorying"^^xsd:string ; + bsbm:productPropertyTextual2 "procurators scantier garbing scarfed secularize recoiler scripturally loftily bedcovers reefy equilibrates"^^xsd:string ; + bsbm:productPropertyTextual3 "fatuousness teenful bellied bugged indefeasible foreswear brooded baggies gassed miseducation"^^xsd:string ; + bsbm:productPropertyTextual4 "deteriorated alkalinization sectaries"^^xsd:string ; + bsbm:productPropertyTextual5 "angers bowling disassimilative responders repaginated quarriers"^^xsd:string ; + bsbm:productFeature bsbm-inst:ProductFeature230 ; + bsbm:productFeature bsbm-inst:ProductFeature234 ; + bsbm:productFeature bsbm-inst:ProductFeature252 ; + bsbm:productFeature bsbm-inst:ProductFeature253 ; + bsbm:productFeature bsbm-inst:ProductFeature261 ; + bsbm:productFeature bsbm-inst:ProductFeature266 ; + bsbm:productFeature bsbm-inst:ProductFeature270 ; + bsbm:productFeature bsbm-inst:ProductFeature271 ; + bsbm:productFeature bsbm-inst:ProductFeature277 ; + bsbm:productFeature bsbm-inst:ProductFeature281 ; + bsbm:productFeature bsbm-inst:ProductFeature282 ; + bsbm:productFeature bsbm-inst:ProductFeature1 ; + bsbm:productFeature bsbm-inst:ProductFeature9 ; + bsbm:productFeature bsbm-inst:ProductFeature16 ; + bsbm:productFeature bsbm-inst:ProductFeature21 ; + bsbm:productFeature bsbm-inst:ProductFeature24 ; + bsbm:productFeature bsbm-inst:ProductFeature27 ; + bsbm:productFeature bsbm-inst:ProductFeature32 ; + bsbm:productFeature bsbm-inst:ProductFeature34 ; + bsbm:producer dataFromProducer1:Producer1 ; + dc:publisher dataFromProducer1:Producer1 ; + dc:date "2005-05-21"^^xsd:date . +dataFromProducer1:Product41 + rdf:type bsbm:Product ; + rdfs:label "accrued" ; + rdfs:comment "wienies dissuades numerates shunpiked velvets wyomingite lovesick shorthorn parasitization outwit captured anesthetization transited propagation bowdlerized semiresolute setting razzes unrisen tenpins franked frazzled habituated smokers bodysurfs flappiest alehouses nonferrous pantomimists ruins warmaker touchily speckled tzigane reaves prosers helping needily electrocute scrived troublers attractable antagonizes bobbins inactions lowermost suet prosthetist debatable timpanum subbreeds tumbleweeds yowed igniting cloggier standpat morning tinseling sheerness twistable denounces heartiness elations adorners reporting pasteurizer peas absorbability coper looked brachydactyly corrective embroiderer strictly logways betakes openings westering overheaped gummiest annuities sets searchlights dumbbells dampening representation lukewarmness bowering quadroons drowners yugoslavians modestly halter dozier redoubling contriver affirmers amrita modernizers treasuryship detesters looses monologists stoned mildewy cooperativeness ditchless megadyne blindfolds cycles telephotograph numbering thoughtlessly cabalists mer buffoonery highbinder adjoins acrostic splaying hallos conjecturing defying timpanists twelvemo underestimations pans charmer vagabondage chromos misericordia occasioning bortz poolhalls reconsignment unpretending cactuses saddling psychosexuality antitank undertone calculates tallboys unfasten faultfinder perseveres recomposing" ; + rdf:type bsbm-inst:ProductType12 ; + rdf:type bsbm-inst:ProductType3 ; + rdf:type bsbm-inst:ProductType1 ; + bsbm:productPropertyNumeric1 "27"^^xsd:integer ; + bsbm:productPropertyNumeric2 "1492"^^xsd:integer ; + bsbm:productPropertyNumeric3 "1407"^^xsd:integer ; + bsbm:productPropertyTextual1 "scarier weeded pronounces tenemented congruities uncheerfully sanctioning reawakening mellifluent jewfishes federatively developer documenting tantra"^^xsd:string ; + bsbm:productPropertyTextual2 "deleting bristles flied illy assizes bouldery corrections compere controversially"^^xsd:string ; + bsbm:productPropertyTextual3 "fooled naivest limitless onside sunburned occurrences"^^xsd:string ; + bsbm:productFeature bsbm-inst:ProductFeature455 ; + bsbm:productFeature bsbm-inst:ProductFeature456 ; + bsbm:productFeature bsbm-inst:ProductFeature458 ; + bsbm:productFeature bsbm-inst:ProductFeature462 ; + bsbm:productFeature bsbm-inst:ProductFeature473 ; + bsbm:productFeature bsbm-inst:ProductFeature476 ; + bsbm:productFeature bsbm-inst:ProductFeature489 ; + bsbm:productFeature bsbm-inst:ProductFeature490 ; + bsbm:productFeature bsbm-inst:ProductFeature46 ; + bsbm:productFeature bsbm-inst:ProductFeature50 ; + bsbm:productFeature bsbm-inst:ProductFeature54 ; + bsbm:productFeature bsbm-inst:ProductFeature57 ; + bsbm:productFeature bsbm-inst:ProductFeature58 ; + bsbm:productFeature bsbm-inst:ProductFeature60 ; + bsbm:productFeature bsbm-inst:ProductFeature62 ; + bsbm:productFeature bsbm-inst:ProductFeature63 ; + bsbm:productFeature bsbm-inst:ProductFeature68 ; + bsbm:productFeature bsbm-inst:ProductFeature73 ; + bsbm:productFeature bsbm-inst:ProductFeature74 ; + bsbm:producer dataFromProducer1:Producer1 ; + dc:publisher dataFromProducer1:Producer1 ; + dc:date "2003-06-10"^^xsd:date . +dataFromProducer1:Product42 + rdf:type bsbm:Product ; + rdfs:label "scows foldable encysts" ; + rdfs:comment "undercurrent birdcalls elastins trouty timing matter leisured appareled indurated preterit doters begrimmed slatier flaggier sparable flashflood shipping polynomials bloodily indicters uninhibited decimalize kernelled unflaggingly inveigler toxify whereunto categorize rimiest airspeeds ultrasuede inebriate unimaginably bavarian toxical carnie oars ninon precontriving reconsolidates pudgy deplored pretests brachial jihads womanlier oswego bureaux sapphics amendments disfigurement slipup decontamination nonmember crucifies battings manageability deterrer fighting reannexing argylls sweetener circularized entente sorels delimitative reappraises paraplegics semites hawkshaw misrules wahoo lindens originals inveighed vitalization pseudoparalysis engineering systematized spleeniest glimmerings decolonized voicelessly eulogiums alienator chichis platypi ghastful shindies outgo cackles enquirer interludes helicoidal underflow asseverations spherics unctions melba kampuchea dholes ungrounded hilled unfriendly reverberators vauntful cavorter withholds sandpapers sadhu pomegranates fairest sorceresses" ; + rdf:type bsbm-inst:ProductType13 ; + rdf:type bsbm-inst:ProductType3 ; + rdf:type bsbm-inst:ProductType1 ; + bsbm:productPropertyNumeric1 "107"^^xsd:integer ; + bsbm:productPropertyNumeric2 "1369"^^xsd:integer ; + bsbm:productPropertyNumeric3 "1277"^^xsd:integer ; + bsbm:productPropertyNumeric5 "123"^^xsd:integer ; + bsbm:productPropertyTextual1 "tracheas palmers fragmentariness greyest berm materiality whittlers phaser jackroll epee"^^xsd:string ; + bsbm:productPropertyTextual2 "psyched brownstone reproducers"^^xsd:string ; + bsbm:productPropertyTextual3 "equivocation outboxing naiveness sniffing antonymies inalterableness medicator smooches latening advents calorimetry"^^xsd:string ; + bsbm:productPropertyTextual4 "mobbing horrified tarts turks recalcitrancy prewarm ambiences hardtops contrapuntal"^^xsd:string ; + bsbm:productFeature bsbm-inst:ProductFeature507 ; + bsbm:productFeature bsbm-inst:ProductFeature516 ; + bsbm:productFeature bsbm-inst:ProductFeature519 ; + bsbm:productFeature bsbm-inst:ProductFeature525 ; + bsbm:productFeature bsbm-inst:ProductFeature528 ; + bsbm:productFeature bsbm-inst:ProductFeature529 ; + bsbm:productFeature bsbm-inst:ProductFeature537 ; + bsbm:productFeature bsbm-inst:ProductFeature543 ; + bsbm:productFeature bsbm-inst:ProductFeature547 ; + bsbm:productFeature bsbm-inst:ProductFeature548 ; + bsbm:productFeature bsbm-inst:ProductFeature558 ; + bsbm:productFeature bsbm-inst:ProductFeature566 ; + bsbm:productFeature bsbm-inst:ProductFeature38 ; + bsbm:productFeature bsbm-inst:ProductFeature40 ; + bsbm:productFeature bsbm-inst:ProductFeature42 ; + bsbm:productFeature bsbm-inst:ProductFeature43 ; + bsbm:productFeature bsbm-inst:ProductFeature49 ; + bsbm:productFeature bsbm-inst:ProductFeature54 ; + bsbm:productFeature bsbm-inst:ProductFeature56 ; + bsbm:productFeature bsbm-inst:ProductFeature59 ; + bsbm:productFeature bsbm-inst:ProductFeature60 ; + bsbm:productFeature bsbm-inst:ProductFeature72 ; + bsbm:productFeature bsbm-inst:ProductFeature75 ; + bsbm:productFeature bsbm-inst:ProductFeature76 ; + bsbm:producer dataFromProducer1:Producer1 ; + dc:publisher dataFromProducer1:Producer1 ; + dc:date "2006-09-26"^^xsd:date . +dataFromProducer1:Product43 + rdf:type bsbm:Product ; + rdfs:label "manometries killjoys" ; + rdfs:comment "herbariums recti subtasks teenier miladies nonfascists orcas fenced natriums decaffeinated karst degenerations buckled convokes unutterably interjectional hometowns looney goony bulgarian gothicist dandification hiraganas notarizing factorials republics trawls warps troughs resuscitation overtop refrigerants butchered battener espresso refold zouave fulfills unconscionable minyan valorous tubbier vodkas horseshoers liberality scraggy ethnical allows overweight conventions effervescently reflective legislator fathead picaro plebescite floppies tapeline stabilizer knifer incages ambuscading usefulness acquaintanceships payback hygroscope tsking fleas thunderclouds overprotecting fridges reloan interceptive pourboire bootlegs abyssinian crispening anticipates arcked jumbos overqualified burse spikes funereally biographic tendered milliner disenfranchisements corneous hurriedness giantisms flowerer thriven lumbago spaceships tautening vasty prizefights perspicuously cyclicly" ; + rdf:type bsbm-inst:ProductType17 ; + rdf:type bsbm-inst:ProductType4 ; + rdf:type bsbm-inst:ProductType1 ; + bsbm:productPropertyNumeric1 "1416"^^xsd:integer ; + bsbm:productPropertyNumeric2 "442"^^xsd:integer ; + bsbm:productPropertyNumeric3 "802"^^xsd:integer ; + bsbm:productPropertyTextual1 "growlier undershorts surly oysters pined leukemics widower patting versifications entrusting arcadias ulcerative"^^xsd:string ; + bsbm:productPropertyTextual2 "methodically noncyclical jinni deteriorations hyperactivity irreplaceably cosmological cellarers filar surfeits"^^xsd:string ; + bsbm:productPropertyTextual3 "byelorussian naturalness valetudinarianism rerolls atherosclerotic"^^xsd:string ; + bsbm:productPropertyTextual5 "contendere protist harmless scandalize nonsalable nictation gleaners rebuilds leafworm guerdons clemencies"^^xsd:string ; + bsbm:productPropertyTextual6 "unproposed haring urinogenital scrapping invisibleness refracture brisket raids dodged bewails liquefies"^^xsd:string ; + bsbm:productFeature bsbm-inst:ProductFeature749 ; + bsbm:productFeature bsbm-inst:ProductFeature750 ; + bsbm:productFeature bsbm-inst:ProductFeature751 ; + bsbm:productFeature bsbm-inst:ProductFeature753 ; + bsbm:productFeature bsbm-inst:ProductFeature756 ; + bsbm:productFeature bsbm-inst:ProductFeature759 ; + bsbm:productFeature bsbm-inst:ProductFeature766 ; + bsbm:productFeature bsbm-inst:ProductFeature767 ; + bsbm:productFeature bsbm-inst:ProductFeature770 ; + bsbm:productFeature bsbm-inst:ProductFeature771 ; + bsbm:productFeature bsbm-inst:ProductFeature776 ; + bsbm:productFeature bsbm-inst:ProductFeature786 ; + bsbm:productFeature bsbm-inst:ProductFeature790 ; + bsbm:productFeature bsbm-inst:ProductFeature796 ; + bsbm:productFeature bsbm-inst:ProductFeature806 ; + bsbm:productFeature bsbm-inst:ProductFeature808 ; + bsbm:productFeature bsbm-inst:ProductFeature78 ; + bsbm:productFeature bsbm-inst:ProductFeature79 ; + bsbm:productFeature bsbm-inst:ProductFeature91 ; + bsbm:productFeature bsbm-inst:ProductFeature92 ; + bsbm:productFeature bsbm-inst:ProductFeature96 ; + bsbm:productFeature bsbm-inst:ProductFeature97 ; + bsbm:productFeature bsbm-inst:ProductFeature107 ; + bsbm:productFeature bsbm-inst:ProductFeature111 ; + bsbm:productFeature bsbm-inst:ProductFeature117 ; + bsbm:productFeature bsbm-inst:ProductFeature127 ; + bsbm:productFeature bsbm-inst:ProductFeature129 ; + bsbm:productFeature bsbm-inst:ProductFeature132 ; + bsbm:productFeature bsbm-inst:ProductFeature133 ; + bsbm:producer dataFromProducer1:Producer1 ; + dc:publisher dataFromProducer1:Producer1 ; + dc:date "2002-06-12"^^xsd:date . +dataFromProducer1:Product44 + rdf:type bsbm:Product ; + rdfs:label "openhanded babus" ; + rdfs:comment "topographer ambers winterer thrives damsels midiron tricks nock neighs mightiest misconceptions hinges cutaway umpteen abscessing shanked clanked heliotropism finders accosting fretfully sprawly shortener radiological fertilizing mercurochrome nobbier catkins swordmen vaginated unpleased cofeatures shoals uncertain dismemberments lisped indonesians ricocheting irrupting costliest draining unacquainted marbleizes reawakens remonstrator morning trimonthly intermediately ragbags manifested debauchee nannies lividness screeching earmarks katrina melchizedek supes beebreads mayhemming mediacy snobs kabobs bovid mourned repositories sheriffdom patois magnificently priedieux scuttles chastening unlettered turgidity" ; + rdf:type bsbm-inst:ProductType17 ; + rdf:type bsbm-inst:ProductType4 ; + rdf:type bsbm-inst:ProductType1 ; + bsbm:productPropertyNumeric1 "1225"^^xsd:integer ; + bsbm:productPropertyNumeric2 "801"^^xsd:integer ; + bsbm:productPropertyNumeric3 "807"^^xsd:integer ; + bsbm:productPropertyNumeric5 "1188"^^xsd:integer ; + bsbm:productPropertyTextual1 "soughing phenobarbital wifely resubmission asymptotes obsesses"^^xsd:string ; + bsbm:productPropertyTextual2 "bejewels frouncing cuppas fortuneteller ikons loesses easterner conceding toked wrongheadedly malled whoremaster cubicly"^^xsd:string ; + bsbm:productPropertyTextual3 "oatmeals witlessness marquises blacktopped aggrieving mathematicians honeymooner"^^xsd:string ; + bsbm:productFeature bsbm-inst:ProductFeature749 ; + bsbm:productFeature bsbm-inst:ProductFeature752 ; + bsbm:productFeature bsbm-inst:ProductFeature755 ; + bsbm:productFeature bsbm-inst:ProductFeature760 ; + bsbm:productFeature bsbm-inst:ProductFeature761 ; + bsbm:productFeature bsbm-inst:ProductFeature770 ; + bsbm:productFeature bsbm-inst:ProductFeature771 ; + bsbm:productFeature bsbm-inst:ProductFeature775 ; + bsbm:productFeature bsbm-inst:ProductFeature781 ; + bsbm:productFeature bsbm-inst:ProductFeature784 ; + bsbm:productFeature bsbm-inst:ProductFeature794 ; + bsbm:productFeature bsbm-inst:ProductFeature795 ; + bsbm:productFeature bsbm-inst:ProductFeature797 ; + bsbm:productFeature bsbm-inst:ProductFeature810 ; + bsbm:productFeature bsbm-inst:ProductFeature811 ; + bsbm:productFeature bsbm-inst:ProductFeature82 ; + bsbm:productFeature bsbm-inst:ProductFeature86 ; + bsbm:productFeature bsbm-inst:ProductFeature95 ; + bsbm:productFeature bsbm-inst:ProductFeature99 ; + bsbm:productFeature bsbm-inst:ProductFeature100 ; + bsbm:productFeature bsbm-inst:ProductFeature101 ; + bsbm:productFeature bsbm-inst:ProductFeature113 ; + bsbm:productFeature bsbm-inst:ProductFeature116 ; + bsbm:productFeature bsbm-inst:ProductFeature124 ; + bsbm:productFeature bsbm-inst:ProductFeature138 ; + bsbm:producer dataFromProducer1:Producer1 ; + dc:publisher dataFromProducer1:Producer1 ; + dc:date "2003-12-06"^^xsd:date . +dataFromProducer1:Product45 + rdf:type bsbm:Product ; + rdfs:label "unstacks" ; + rdfs:comment "recommitted reappearing knowing ramifications pettifoggers intercessional mod prodigals clarinets inshrines litigating semipros demonstrator lentils identified ailments harassers hooknoses kidders yeastier favorite thanes liens carpetbagged unaccountability copulates forgeries heartrending optimeter handlooms translucency areolae elephantiases spunky frivolers flaker toadish nescient landowners disciplinarians recharting kidneys dusked wizens mistreatment mahoganies weatherproofing sampled prover disorders hogtieing dovecotes zilches earing yawed exquisitely marlinespike tattletales harrier bethink hawkeye resistors mutining replaced legators aseptically meows perusing upheaved gastroscopy pokeweeds misgovern afreets radiograms avast excitable sorrowfulness offeror tastier bohunk laborite unreasoned trellised rustless facers bipod goatskin kip oysterwoman confiners navahos bismuths interfaces freakouts clacked crazed whoopla concelebrations rummier gigglers endogenously venerated sikh citied annealing weevily totally intellectualist nickeling scandalmonger enjoining supporting immotility hampshireman nabobisms pheromone politicos ablations regilded underneath dissuadable chukka" ; + rdf:type bsbm-inst:ProductType7 ; + rdf:type bsbm-inst:ProductType2 ; + rdf:type bsbm-inst:ProductType1 ; + bsbm:productPropertyNumeric1 "1091"^^xsd:integer ; + bsbm:productPropertyNumeric2 "145"^^xsd:integer ; + bsbm:productPropertyNumeric3 "113"^^xsd:integer ; + bsbm:productPropertyNumeric4 "271"^^xsd:integer ; + bsbm:productPropertyNumeric5 "97"^^xsd:integer ; + bsbm:productPropertyTextual1 "corder vaccinator ramblers groundlessness latticework habiliments"^^xsd:string ; + bsbm:productPropertyTextual2 "superimposition taunting burler relishable"^^xsd:string ; + bsbm:productPropertyTextual3 "constellations guarantied grieved substance retrospective referrals"^^xsd:string ; + bsbm:productPropertyTextual4 "supplies returner shetland plebe apteryxes overflew"^^xsd:string ; + bsbm:productPropertyTextual5 "muscles nebulas arcs toniest liquidized boules nursed crewed flotillas"^^xsd:string ; + bsbm:productFeature bsbm-inst:ProductFeature236 ; + bsbm:productFeature bsbm-inst:ProductFeature240 ; + bsbm:productFeature bsbm-inst:ProductFeature241 ; + bsbm:productFeature bsbm-inst:ProductFeature242 ; + bsbm:productFeature bsbm-inst:ProductFeature243 ; + bsbm:productFeature bsbm-inst:ProductFeature250 ; + bsbm:productFeature bsbm-inst:ProductFeature262 ; + bsbm:productFeature bsbm-inst:ProductFeature265 ; + bsbm:productFeature bsbm-inst:ProductFeature268 ; + bsbm:productFeature bsbm-inst:ProductFeature286 ; + bsbm:productFeature bsbm-inst:ProductFeature289 ; + bsbm:productFeature bsbm-inst:ProductFeature1 ; + bsbm:productFeature bsbm-inst:ProductFeature4 ; + bsbm:productFeature bsbm-inst:ProductFeature7 ; + bsbm:productFeature bsbm-inst:ProductFeature20 ; + bsbm:productFeature bsbm-inst:ProductFeature30 ; + bsbm:producer dataFromProducer1:Producer1 ; + dc:publisher dataFromProducer1:Producer1 ; + dc:date "2001-04-05"^^xsd:date . +dataFromProducer1:Product46 + rdf:type bsbm:Product ; + rdfs:label "hatreds waft sneerer" ; + rdfs:comment "troth subdivided jurist bracer regimens pontificated plackets overweigh predestination neutralizes reamed maunderers ataxic cordlessly feinted protozoology airstrips veganism balms unshifting soothers environmentally recalling racketeering modernistic hatmakers eyelids sympathize heliotropes winterize skiddoos intellectualist accusatives scarlets clitoridectomy triangles welds chirker alliterating catatonics foregoes fletches waxes grandparents pensioners jiggliest stomachic spotless oversolicitousness cutaways pyrenees weighs reinducting vitalized mastoid potation deflecting supernationalism sorel idolize misadded duskiness mullioned amusement misfiled negativistic tintings fragmental chivvies sissier scannings losses supplementally heptoses discoursing schoolmarms whinnies inscrutably unfounded activator optometries alas strabismally olfactometer sucker clayware legitimatize traduces outrage reprieves priesthood zoftig brutalized daubier legislatrices easterners embalming laborite convolvuluses remonstrated occupiable hallucinosis proxies fighter undersigned viridian dungs coronas exactingly ballottable immolate prefacing staring bespangles biodegradation microbars barbered aconite esse bosks pollers" ; + rdf:type bsbm-inst:ProductType8 ; + rdf:type bsbm-inst:ProductType2 ; + rdf:type bsbm-inst:ProductType1 ; + bsbm:productPropertyNumeric1 "749"^^xsd:integer ; + bsbm:productPropertyNumeric2 "770"^^xsd:integer ; + bsbm:productPropertyNumeric3 "607"^^xsd:integer ; + bsbm:productPropertyNumeric4 "531"^^xsd:integer ; + bsbm:productPropertyTextual1 "trebling voce elicited meditates vexing krill howdies sedates exiled agora conation indictee reminisces mordantly"^^xsd:string ; + bsbm:productPropertyTextual2 "jimmying emblements aerolith extraterrestrials humiliations endures contestants exemplifies imbrication"^^xsd:string ; + bsbm:productPropertyTextual3 "revers wishes socialist adversaries ramps feeder"^^xsd:string ; + bsbm:productPropertyTextual5 "natters peke deemphasis vocalizations apiarist"^^xsd:string ; + bsbm:productFeature bsbm-inst:ProductFeature291 ; + bsbm:productFeature bsbm-inst:ProductFeature299 ; + bsbm:productFeature bsbm-inst:ProductFeature307 ; + bsbm:productFeature bsbm-inst:ProductFeature308 ; + bsbm:productFeature bsbm-inst:ProductFeature310 ; + bsbm:productFeature bsbm-inst:ProductFeature311 ; + bsbm:productFeature bsbm-inst:ProductFeature312 ; + bsbm:productFeature bsbm-inst:ProductFeature319 ; + bsbm:productFeature bsbm-inst:ProductFeature325 ; + bsbm:productFeature bsbm-inst:ProductFeature3 ; + bsbm:productFeature bsbm-inst:ProductFeature5 ; + bsbm:productFeature bsbm-inst:ProductFeature8 ; + bsbm:productFeature bsbm-inst:ProductFeature10 ; + bsbm:productFeature bsbm-inst:ProductFeature13 ; + bsbm:productFeature bsbm-inst:ProductFeature15 ; + bsbm:productFeature bsbm-inst:ProductFeature17 ; + bsbm:productFeature bsbm-inst:ProductFeature22 ; + bsbm:productFeature bsbm-inst:ProductFeature27 ; + bsbm:productFeature bsbm-inst:ProductFeature29 ; + bsbm:productFeature bsbm-inst:ProductFeature30 ; + bsbm:productFeature bsbm-inst:ProductFeature36 ; + bsbm:producer dataFromProducer1:Producer1 ; + dc:publisher dataFromProducer1:Producer1 ; + dc:date "2004-02-01"^^xsd:date . +dataFromProducer1:Product47 + rdf:type bsbm:Product ; + rdfs:label "swang sissies" ; + rdfs:comment "nondemonstrable superscribed flippancies frothily protist comedown jujubes rem funicular mooch wracking asthmas koruna drogues whippoorwill tunnelers romanizes marching buckbeans lustre meas infesters baptises bot portholes yours irregulars redistricting ambulators vixenish rebop hotness lotuses reconciliator firstlings eversion vilifies engirdles buckeyes variegated haggles farces exalters kaffirs repented semitrailers assays asbestosis totalling lispingly deaccessions disbelief assertors terrorizes ascender golfings defiling transfiguring hetero breadboards calderas amiably statued conniving dizzies strikers aphoristic hunched goldenrods chivy pawner argufying crapshooter enmesh thermometry outtrumped luckiness sanitarians anglings unlovely sheepish encampments huaraches involves dumpiness riser accelerometers capitulary socketed reseating voluptuary outwearing silencer trusts spiciest lader appropriated drownding relet venturing melanesians excellences perpetuities annihilating adsorbing mama puled outguessing jocundities fawned paganists plenarily carnalities delivers clonism folkish stabilize desexes cavalrymen tiltyards services horrific desireable kitling saintdom logjams manus wadable dogfishes soarer siberians pinecone caucussing holograph multiform bonesetter fustic accruing murdered chorded causticity augustness manhandled" ; + rdf:type bsbm-inst:ProductType18 ; + rdf:type bsbm-inst:ProductType5 ; + rdf:type bsbm-inst:ProductType1 ; + bsbm:productPropertyNumeric1 "408"^^xsd:integer ; + bsbm:productPropertyNumeric2 "1355"^^xsd:integer ; + bsbm:productPropertyNumeric3 "733"^^xsd:integer ; + bsbm:productPropertyNumeric4 "1335"^^xsd:integer ; + bsbm:productPropertyNumeric5 "1922"^^xsd:integer ; + bsbm:productPropertyTextual1 "omniscience quai demagnetizing boluses immatures unethically jellifies"^^xsd:string ; + bsbm:productPropertyTextual2 "unpoetical remittently acnes freshest foliated orangery checker officiary gripier whoredoms finickiest proponents quoters thiosulfates"^^xsd:string ; + bsbm:productPropertyTextual3 "subclerks melodramatics deistic bicorporal ignobly calves vocalist ungodliness succorers cartoning deciliter jimmying receiving bustling copiously"^^xsd:string ; + bsbm:productPropertyTextual4 "lorn muckluck terminological plated chiffons"^^xsd:string ; + bsbm:productPropertyTextual5 "gnarling tided dolorous adagios countervailed watermarks deciares fireboxes overdosing afters intoner dyewood"^^xsd:string ; + bsbm:productFeature bsbm-inst:ProductFeature815 ; + bsbm:productFeature bsbm-inst:ProductFeature817 ; + bsbm:productFeature bsbm-inst:ProductFeature819 ; + bsbm:productFeature bsbm-inst:ProductFeature820 ; + bsbm:productFeature bsbm-inst:ProductFeature821 ; + bsbm:productFeature bsbm-inst:ProductFeature825 ; + bsbm:productFeature bsbm-inst:ProductFeature826 ; + bsbm:productFeature bsbm-inst:ProductFeature835 ; + bsbm:productFeature bsbm-inst:ProductFeature837 ; + bsbm:productFeature bsbm-inst:ProductFeature838 ; + bsbm:productFeature bsbm-inst:ProductFeature843 ; + bsbm:productFeature bsbm-inst:ProductFeature848 ; + bsbm:productFeature bsbm-inst:ProductFeature851 ; + bsbm:productFeature bsbm-inst:ProductFeature853 ; + bsbm:productFeature bsbm-inst:ProductFeature144 ; + bsbm:productFeature bsbm-inst:ProductFeature150 ; + bsbm:productFeature bsbm-inst:ProductFeature151 ; + bsbm:productFeature bsbm-inst:ProductFeature153 ; + bsbm:productFeature bsbm-inst:ProductFeature161 ; + bsbm:productFeature bsbm-inst:ProductFeature162 ; + bsbm:productFeature bsbm-inst:ProductFeature163 ; + bsbm:productFeature bsbm-inst:ProductFeature164 ; + bsbm:productFeature bsbm-inst:ProductFeature167 ; + bsbm:productFeature bsbm-inst:ProductFeature182 ; + bsbm:producer dataFromProducer1:Producer1 ; + dc:publisher dataFromProducer1:Producer1 ; + dc:date "2004-02-03"^^xsd:date . +dataFromProducer1:Product48 + rdf:type bsbm:Product ; + rdfs:label "incitory removes" ; + rdfs:comment "matched giggling cozening doubtfulness daringly quieter flossier macadamizes opinionatedly unconsumed unpractical wanly ammine tomes tramlines cenobite swagging democratizes impugner plunker baptisteries interviews ahorse corms clasping scraggliest birthdays mesmerized hareems transisthmian malamute vivisectionists sailing grandstander ricking rusticate tormenting successional seedcakes handloom fungoids unjustifiable tetchiest subraces plenums marshaled uncomplicated regularizing aerobics bigwig shops abnegators satanisms editress overripe photosynthesizing soothest tiering steeps aggravations barbs axiality aspiration semivowel monochrome chauvinistically yodels procreation mauls crossly frivolities predations garglers stepdown bulimiac debilitations mexicans definitiveness bastian aery eightieths trader sufficer tierces ravishers fleshly premieres interscholastic cinematograph milkmen blurbs reciprocities patriotism dicks phenocopies exorcises scrota murthered ballutes saltest issuably pegbox sailorly insusceptibilities declassified edifies trundlers" ; + rdf:type bsbm-inst:ProductType11 ; + rdf:type bsbm-inst:ProductType3 ; + rdf:type bsbm-inst:ProductType1 ; + bsbm:productPropertyNumeric1 "258"^^xsd:integer ; + bsbm:productPropertyNumeric2 "1012"^^xsd:integer ; + bsbm:productPropertyNumeric3 "700"^^xsd:integer ; + bsbm:productPropertyTextual1 "servicer reannexes observational disinherits catalepsies previews"^^xsd:string ; + bsbm:productPropertyTextual2 "fared phallically orogenic folkways reuseable hunches blameless wiglets knobbiness"^^xsd:string ; + bsbm:productPropertyTextual3 "puffiest piney peyotyls mollycoddling dispassion soothed phonies sepalous"^^xsd:string ; + bsbm:productPropertyTextual6 "tsarists bathetic snugged acquiring usufructuary workfolk polarizer hepatized lymphomas shuted"^^xsd:string ; + bsbm:productFeature bsbm-inst:ProductFeature421 ; + bsbm:productFeature bsbm-inst:ProductFeature422 ; + bsbm:productFeature bsbm-inst:ProductFeature424 ; + bsbm:productFeature bsbm-inst:ProductFeature427 ; + bsbm:productFeature bsbm-inst:ProductFeature429 ; + bsbm:productFeature bsbm-inst:ProductFeature430 ; + bsbm:productFeature bsbm-inst:ProductFeature431 ; + bsbm:productFeature bsbm-inst:ProductFeature434 ; + bsbm:productFeature bsbm-inst:ProductFeature435 ; + bsbm:productFeature bsbm-inst:ProductFeature436 ; + bsbm:productFeature bsbm-inst:ProductFeature438 ; + bsbm:productFeature bsbm-inst:ProductFeature439 ; + bsbm:productFeature bsbm-inst:ProductFeature444 ; + bsbm:productFeature bsbm-inst:ProductFeature446 ; + bsbm:productFeature bsbm-inst:ProductFeature448 ; + bsbm:productFeature bsbm-inst:ProductFeature450 ; + bsbm:productFeature bsbm-inst:ProductFeature451 ; + bsbm:productFeature bsbm-inst:ProductFeature44 ; + bsbm:productFeature bsbm-inst:ProductFeature46 ; + bsbm:productFeature bsbm-inst:ProductFeature47 ; + bsbm:productFeature bsbm-inst:ProductFeature48 ; + bsbm:productFeature bsbm-inst:ProductFeature50 ; + bsbm:productFeature bsbm-inst:ProductFeature54 ; + bsbm:productFeature bsbm-inst:ProductFeature67 ; + bsbm:productFeature bsbm-inst:ProductFeature69 ; + bsbm:productFeature bsbm-inst:ProductFeature70 ; + bsbm:productFeature bsbm-inst:ProductFeature76 ; + bsbm:producer dataFromProducer1:Producer1 ; + dc:publisher dataFromProducer1:Producer1 ; + dc:date "2002-09-15"^^xsd:date . +dataFromProducer1:Product49 + rdf:type bsbm:Product ; + rdfs:label "camporee" ; + rdfs:comment "subbing contenting wight storybooks bluey packaging medicare unrecompensed twins clamour kettledrums profiled vengeant freakouts bunkoing signs detailers strivers dressage reoccurs collaborates reintegration rebinding beltways utilize dissipator hungers scandalizer aggress statuses doddering tacks antedates nestlike disappointed reaccepted grungiest chiromancy disjoint blancmanges weskits zircons malevolently sploshed dovecote revalidation subcranial countersignature caliphates aimlessly ballutes melanic aquatints furring explicator wiglet munitioned predicator flabs muzzily gliding binomials wouldest carcase salted bolivars treating bundling jazzer conjugant auditive jinns rinks profiter glittered preaches scheduling parliamentarians hotshots notifies refunder lubricated hamlets nervosa proration metalaw cardinality cerebella" ; + rdf:type bsbm-inst:ProductType10 ; + rdf:type bsbm-inst:ProductType3 ; + rdf:type bsbm-inst:ProductType1 ; + bsbm:productPropertyNumeric1 "663"^^xsd:integer ; + bsbm:productPropertyNumeric2 "39"^^xsd:integer ; + bsbm:productPropertyNumeric3 "236"^^xsd:integer ; + bsbm:productPropertyNumeric5 "1282"^^xsd:integer ; + bsbm:productPropertyNumeric6 "1093"^^xsd:integer ; + bsbm:productPropertyTextual1 "submitter cyclonic physicists"^^xsd:string ; + bsbm:productPropertyTextual2 "interned blushful chowchow aminic consummately frostbites impugns stalagmites philander"^^xsd:string ; + bsbm:productPropertyTextual3 "enterers aflatoxin abortionist meagerness understructures rotatively"^^xsd:string ; + bsbm:productFeature bsbm-inst:ProductFeature374 ; + bsbm:productFeature bsbm-inst:ProductFeature378 ; + bsbm:productFeature bsbm-inst:ProductFeature381 ; + bsbm:productFeature bsbm-inst:ProductFeature383 ; + bsbm:productFeature bsbm-inst:ProductFeature388 ; + bsbm:productFeature bsbm-inst:ProductFeature390 ; + bsbm:productFeature bsbm-inst:ProductFeature395 ; + bsbm:productFeature bsbm-inst:ProductFeature408 ; + bsbm:productFeature bsbm-inst:ProductFeature38 ; + bsbm:productFeature bsbm-inst:ProductFeature43 ; + bsbm:productFeature bsbm-inst:ProductFeature44 ; + bsbm:productFeature bsbm-inst:ProductFeature57 ; + bsbm:productFeature bsbm-inst:ProductFeature59 ; + bsbm:productFeature bsbm-inst:ProductFeature63 ; + bsbm:productFeature bsbm-inst:ProductFeature66 ; + bsbm:productFeature bsbm-inst:ProductFeature69 ; + bsbm:productFeature bsbm-inst:ProductFeature72 ; + bsbm:productFeature bsbm-inst:ProductFeature75 ; + bsbm:productFeature bsbm-inst:ProductFeature76 ; + bsbm:producer dataFromProducer1:Producer1 ; + dc:publisher dataFromProducer1:Producer1 ; + dc:date "2004-09-01"^^xsd:date . +dataFromProducer1:Product50 + rdf:type bsbm:Product ; + rdfs:label "cavie misleader" ; + rdfs:comment "substituter psychokinesis oculists glanced cognizers hypothesized recallers embarking shewing humidly abettals brigandage deices packeting chollas wednesdays cranks roller unphotographic typhous fencers seppuku underpay mediative veinings anticipation pulmonic nonevent creation restrictiveness booklets eruptively suckle physiopathologic prebends coveted flimsiest cymbals nonviolation nettlier misreport glamourous twitting turbofans nonexisting severability overbids fusileer garbanzo fishbone decimation fowling reimprisoning joysticks molested rifler effluence irreducibility sidewalks pullouts reorientations souchong midleg falsifies parred ophthalmoscopies contradicting biological irregularly cruised volleying wrecked aerolith porks flowerless conoidal dandelions firewater tinmen phylum proctoscope fleetingness nevoid atoners hee retaliating potentiates epical nucleations guardianship desires" ; + rdf:type bsbm-inst:ProductType8 ; + rdf:type bsbm-inst:ProductType2 ; + rdf:type bsbm-inst:ProductType1 ; + bsbm:productPropertyNumeric1 "1956"^^xsd:integer ; + bsbm:productPropertyNumeric2 "48"^^xsd:integer ; + bsbm:productPropertyNumeric3 "336"^^xsd:integer ; + bsbm:productPropertyTextual1 "nonemotionally fads simulative disconnect bastardly exorcisers organdie telecast straightforwardly aphasiacs lobotomies redecorating loosely"^^xsd:string ; + bsbm:productPropertyTextual2 "wrens dissuasions omnium buffets reassumed gloaters racketed"^^xsd:string ; + bsbm:productPropertyTextual3 "endeavour redries overintensely indecisively superannuated duddy necks ungainly"^^xsd:string ; + bsbm:productPropertyTextual5 "vichyssoise kiloliter pyric moratoriums redresser twangles revivify conduction prodigally gouramis actors galvanized upcoming vitamins enthuses"^^xsd:string ; + bsbm:productFeature bsbm-inst:ProductFeature291 ; + bsbm:productFeature bsbm-inst:ProductFeature294 ; + bsbm:productFeature bsbm-inst:ProductFeature298 ; + bsbm:productFeature bsbm-inst:ProductFeature306 ; + bsbm:productFeature bsbm-inst:ProductFeature308 ; + bsbm:productFeature bsbm-inst:ProductFeature314 ; + bsbm:productFeature bsbm-inst:ProductFeature317 ; + bsbm:productFeature bsbm-inst:ProductFeature318 ; + bsbm:productFeature bsbm-inst:ProductFeature323 ; + bsbm:productFeature bsbm-inst:ProductFeature2 ; + bsbm:productFeature bsbm-inst:ProductFeature14 ; + bsbm:productFeature bsbm-inst:ProductFeature16 ; + bsbm:productFeature bsbm-inst:ProductFeature24 ; + bsbm:productFeature bsbm-inst:ProductFeature27 ; + bsbm:productFeature bsbm-inst:ProductFeature28 ; + bsbm:productFeature bsbm-inst:ProductFeature32 ; + bsbm:producer dataFromProducer1:Producer1 ; + dc:publisher dataFromProducer1:Producer1 ; + dc:date "2003-08-10"^^xsd:date . +dataFromProducer1:Product51 + rdf:type bsbm:Product ; + rdfs:label "effervescently infecter rubberneck" ; + rdfs:comment "emersion chicaneries crower unmuzzle overfatigue denotes maladjustive cachalots submember outguesses quatorzes reattaining eyeshot farthings perplexedly oleoresin worries crampon nonplus preps rancidity mindfulness ancestresses wholeheartedness anointments obtaining embarks fibbers secretaries abdomens supplicated woozily interceding virologists acceptance satisfactions reimposing roughhewing systemized commercialism eruptional unlanded gynecologies hogweeds miaows nonparticipant despisers glands pretensed clarkia stretchers lactobacillus partizans rulable geum expropriation doer treasured stockinette manoeuvreing noncommercial photographs assessments ultimo sawflies bloused distrait mortality assurers routinizes numeration fleshiness transmutes filtrating inexactness fakers punsters nickelodeons scums" ; + rdf:type bsbm-inst:ProductType9 ; + rdf:type bsbm-inst:ProductType2 ; + rdf:type bsbm-inst:ProductType1 ; + bsbm:productPropertyNumeric1 "222"^^xsd:integer ; + bsbm:productPropertyNumeric2 "451"^^xsd:integer ; + bsbm:productPropertyNumeric3 "753"^^xsd:integer ; + bsbm:productPropertyNumeric4 "1145"^^xsd:integer ; + bsbm:productPropertyNumeric5 "828"^^xsd:integer ; + bsbm:productPropertyTextual1 "impingements tribally undenominational mauves creeks canzona"^^xsd:string ; + bsbm:productPropertyTextual2 "neptunian ejaculator semipro devolutionary equability overmodestly effervesced ardencies nominators sherpas reproductive neurophysiologic"^^xsd:string ; + bsbm:productPropertyTextual3 "gravest coverer seducement quickest adjudging programer tubal punishes grampus harked absorptions batching lignifies"^^xsd:string ; + bsbm:productPropertyTextual4 "rushings reschedules subcommissioners coupons unvoiced centres"^^xsd:string ; + bsbm:productPropertyTextual5 "rapacities hometowns mutilators gombroons hibernators fuzing collections prolapsed vibrantly peckier deliciousness trucker oiliest aggregating"^^xsd:string ; + bsbm:productFeature bsbm-inst:ProductFeature332 ; + bsbm:productFeature bsbm-inst:ProductFeature336 ; + bsbm:productFeature bsbm-inst:ProductFeature337 ; + bsbm:productFeature bsbm-inst:ProductFeature339 ; + bsbm:productFeature bsbm-inst:ProductFeature346 ; + bsbm:productFeature bsbm-inst:ProductFeature347 ; + bsbm:productFeature bsbm-inst:ProductFeature348 ; + bsbm:productFeature bsbm-inst:ProductFeature350 ; + bsbm:productFeature bsbm-inst:ProductFeature354 ; + bsbm:productFeature bsbm-inst:ProductFeature363 ; + bsbm:productFeature bsbm-inst:ProductFeature366 ; + bsbm:productFeature bsbm-inst:ProductFeature4 ; + bsbm:productFeature bsbm-inst:ProductFeature6 ; + bsbm:productFeature bsbm-inst:ProductFeature12 ; + bsbm:productFeature bsbm-inst:ProductFeature14 ; + bsbm:productFeature bsbm-inst:ProductFeature17 ; + bsbm:productFeature bsbm-inst:ProductFeature18 ; + bsbm:productFeature bsbm-inst:ProductFeature20 ; + bsbm:productFeature bsbm-inst:ProductFeature22 ; + bsbm:productFeature bsbm-inst:ProductFeature24 ; + bsbm:productFeature bsbm-inst:ProductFeature25 ; + bsbm:productFeature bsbm-inst:ProductFeature32 ; + bsbm:producer dataFromProducer1:Producer1 ; + dc:publisher dataFromProducer1:Producer1 ; + dc:date "2001-04-26"^^xsd:date . +dataFromProducer1:Product52 + rdf:type bsbm:Product ; + rdfs:label "sleighed flannelled traitorism" ; + rdfs:comment "catguts skylarkers yearnings confirms hiragana nodus ultramicroscopically blighting elevating rivaled plying kayaker biogenies deferential overpassed brinks poses intermixtures negotiated nonabstainer overfed brights quarantines wallas egomaniac sickouts eyedropperful electrotheraputic redone smilaxes lewises loftless principals youthens rumrunners disenfranchisement unlicensed motorized leaflets xiphosuran melancholies retractor controverted astonishments slivovic disreputable knolls despotisms conciliator whiffs hairwork aspirated reachable sherbert editorializing sternums scalelike smuggler vaccinates guiro gimleting spoonily defeater axone spanks influenced undulates koppies ballrooms alaskan unproportionately deles anoles looms hastier warehoused revives rewire datedly gustless hoorahs unacclaimate piggybacks fellatios simians crumping pedagogies unjustifiable nonmoral sheriffcies beakless deoxidize diestocks impressionable liars scrappy haggled haji nijinsky misheard milkiness unwisest unswerving banqueter electioneers lads lawbreakers wrenching scofflaws" ; + rdf:type bsbm-inst:ProductType8 ; + rdf:type bsbm-inst:ProductType2 ; + rdf:type bsbm-inst:ProductType1 ; + bsbm:productPropertyNumeric1 "779"^^xsd:integer ; + bsbm:productPropertyNumeric2 "138"^^xsd:integer ; + bsbm:productPropertyNumeric3 "1649"^^xsd:integer ; + bsbm:productPropertyNumeric4 "535"^^xsd:integer ; + bsbm:productPropertyNumeric5 "1315"^^xsd:integer ; + bsbm:productPropertyTextual1 "orbited autographs feigned crunches africans fracas uncannier perihelia"^^xsd:string ; + bsbm:productPropertyTextual2 "joints textures statuaries flamed sprinted convoked satisfied technologist grots outpourings midgets elmier finnan erotically"^^xsd:string ; + bsbm:productPropertyTextual3 "riddling philosophizes pseudoscientifically shortness ekistics"^^xsd:string ; + bsbm:productPropertyTextual4 "chivying uncles noter cooers unseeingly exculpations ratable indirectness nonmetallic remet paganism sunniness"^^xsd:string ; + bsbm:productPropertyTextual5 "polarize rootier clumpier auxiliaries polysorbate rathskeller subfreezing dobbins rapturous ensconcing dogsbody disorientating slapped"^^xsd:string ; + bsbm:productFeature bsbm-inst:ProductFeature290 ; + bsbm:productFeature bsbm-inst:ProductFeature293 ; + bsbm:productFeature bsbm-inst:ProductFeature306 ; + bsbm:productFeature bsbm-inst:ProductFeature308 ; + bsbm:productFeature bsbm-inst:ProductFeature310 ; + bsbm:productFeature bsbm-inst:ProductFeature311 ; + bsbm:productFeature bsbm-inst:ProductFeature314 ; + bsbm:productFeature bsbm-inst:ProductFeature315 ; + bsbm:productFeature bsbm-inst:ProductFeature317 ; + bsbm:productFeature bsbm-inst:ProductFeature321 ; + bsbm:productFeature bsbm-inst:ProductFeature322 ; + bsbm:productFeature bsbm-inst:ProductFeature2 ; + bsbm:productFeature bsbm-inst:ProductFeature4 ; + bsbm:productFeature bsbm-inst:ProductFeature6 ; + bsbm:productFeature bsbm-inst:ProductFeature21 ; + bsbm:productFeature bsbm-inst:ProductFeature22 ; + bsbm:productFeature bsbm-inst:ProductFeature23 ; + bsbm:productFeature bsbm-inst:ProductFeature25 ; + bsbm:productFeature bsbm-inst:ProductFeature28 ; + bsbm:producer dataFromProducer1:Producer1 ; + dc:publisher dataFromProducer1:Producer1 ; + dc:date "2005-07-31"^^xsd:date . +dataFromProducer1:Product53 + rdf:type bsbm:Product ; + rdfs:label "catarrhally valedictions" ; + rdfs:comment "relativistically omnisciently unhitch trackmen hierarchically haleness anoints philtered squelches feltings transgresses menthols whetter doubling liberalism outputted theorising tacksman invincibility huts monetize sealskin birthstones abusers lasagna reminded butyls dogfight sizes embryologist bomber doggie scroungy interviewing unctuous hijackers captivating galumphed buster denudate complicator masker leftovers wirehair faintish cystectomies overprints talcs unripe hearers unconcern envois aw aptly" ; + rdf:type bsbm-inst:ProductType7 ; + rdf:type bsbm-inst:ProductType2 ; + rdf:type bsbm-inst:ProductType1 ; + bsbm:productPropertyNumeric1 "47"^^xsd:integer ; + bsbm:productPropertyNumeric2 "1557"^^xsd:integer ; + bsbm:productPropertyNumeric3 "375"^^xsd:integer ; + bsbm:productPropertyNumeric4 "254"^^xsd:integer ; + bsbm:productPropertyNumeric5 "82"^^xsd:integer ; + bsbm:productPropertyTextual1 "caver exegetic doyennes porcelains cryptographers saltbushes"^^xsd:string ; + bsbm:productPropertyTextual2 "misprinting converged replicas overzealously pulque groundmass livers disembodiments otolithic"^^xsd:string ; + bsbm:productPropertyTextual3 "bowlers nickelodeons risking"^^xsd:string ; + bsbm:productPropertyTextual4 "stampers middlers tenancy partitas hektares"^^xsd:string ; + bsbm:productPropertyTextual5 "prostitutes shote rattlings argues counterfeiting remedially intermissions bioecologies reseeds dangered immuring sybarites gayly"^^xsd:string ; + bsbm:productFeature bsbm-inst:ProductFeature225 ; + bsbm:productFeature bsbm-inst:ProductFeature229 ; + bsbm:productFeature bsbm-inst:ProductFeature231 ; + bsbm:productFeature bsbm-inst:ProductFeature235 ; + bsbm:productFeature bsbm-inst:ProductFeature236 ; + bsbm:productFeature bsbm-inst:ProductFeature238 ; + bsbm:productFeature bsbm-inst:ProductFeature244 ; + bsbm:productFeature bsbm-inst:ProductFeature254 ; + bsbm:productFeature bsbm-inst:ProductFeature255 ; + bsbm:productFeature bsbm-inst:ProductFeature259 ; + bsbm:productFeature bsbm-inst:ProductFeature261 ; + bsbm:productFeature bsbm-inst:ProductFeature266 ; + bsbm:productFeature bsbm-inst:ProductFeature273 ; + bsbm:productFeature bsbm-inst:ProductFeature277 ; + bsbm:productFeature bsbm-inst:ProductFeature282 ; + bsbm:productFeature bsbm-inst:ProductFeature286 ; + bsbm:productFeature bsbm-inst:ProductFeature7 ; + bsbm:productFeature bsbm-inst:ProductFeature8 ; + bsbm:productFeature bsbm-inst:ProductFeature16 ; + bsbm:productFeature bsbm-inst:ProductFeature21 ; + bsbm:productFeature bsbm-inst:ProductFeature27 ; + bsbm:productFeature bsbm-inst:ProductFeature28 ; + bsbm:productFeature bsbm-inst:ProductFeature29 ; + bsbm:productFeature bsbm-inst:ProductFeature30 ; + bsbm:producer dataFromProducer1:Producer1 ; + dc:publisher dataFromProducer1:Producer1 ; + dc:date "2006-02-01"^^xsd:date . +dataFromProducer1:Product54 + rdf:type bsbm:Product ; + rdfs:label "chateaus headlands ventilatory" ; + rdfs:comment "overachieved forswears platting irritabilities endeavor aerolites pearliest copings terraria frets nulled cenotaph carless hoaxes vixenish possessible schoolmistress kilns motorist dreading linacs engirding constituting opals mislays dishonors mikados axillas clitoridectomies chaconne suably trucks tunings poteen profligately penalize abbr scherzos cameos meditating starting bawdily pastiest ennobler disrespectfully finalizing worsteds feticide vicarates rapping crumpled dialogs programmers centralizes osiers confused accelerant naturopathy speculator upchuck supernumeraries pinnacled tenemented uncompounded voidable embarrassingly flamed labella disparately donation pennsylvanian slatting lithos compiler potsherd asphyxiates gougers skewering revolted cinchona barely oppressively impassible waistings sighers funnymen" ; + rdf:type bsbm-inst:ProductType8 ; + rdf:type bsbm-inst:ProductType2 ; + rdf:type bsbm-inst:ProductType1 ; + bsbm:productPropertyNumeric1 "880"^^xsd:integer ; + bsbm:productPropertyNumeric2 "1665"^^xsd:integer ; + bsbm:productPropertyNumeric3 "967"^^xsd:integer ; + bsbm:productPropertyNumeric4 "1496"^^xsd:integer ; + bsbm:productPropertyTextual1 "hosteled pigheaded ballerinas disassimilative lateen prodigiousness countdowns gloving doles"^^xsd:string ; + bsbm:productPropertyTextual2 "mullioned precessions disengaged discourteous bigamize"^^xsd:string ; + bsbm:productPropertyTextual3 "ultimacy ratch impalpably multiradial checker skylarked debriefs nudities"^^xsd:string ; + bsbm:productPropertyTextual4 "activator bejeweled regauge prickling"^^xsd:string ; + bsbm:productFeature bsbm-inst:ProductFeature291 ; + bsbm:productFeature bsbm-inst:ProductFeature300 ; + bsbm:productFeature bsbm-inst:ProductFeature302 ; + bsbm:productFeature bsbm-inst:ProductFeature305 ; + bsbm:productFeature bsbm-inst:ProductFeature308 ; + bsbm:productFeature bsbm-inst:ProductFeature315 ; + bsbm:productFeature bsbm-inst:ProductFeature323 ; + bsbm:productFeature bsbm-inst:ProductFeature324 ; + bsbm:productFeature bsbm-inst:ProductFeature325 ; + bsbm:productFeature bsbm-inst:ProductFeature6 ; + bsbm:productFeature bsbm-inst:ProductFeature9 ; + bsbm:productFeature bsbm-inst:ProductFeature11 ; + bsbm:productFeature bsbm-inst:ProductFeature19 ; + bsbm:productFeature bsbm-inst:ProductFeature22 ; + bsbm:productFeature bsbm-inst:ProductFeature23 ; + bsbm:productFeature bsbm-inst:ProductFeature25 ; + bsbm:productFeature bsbm-inst:ProductFeature30 ; + bsbm:producer dataFromProducer1:Producer1 ; + dc:publisher dataFromProducer1:Producer1 ; + dc:date "2003-01-19"^^xsd:date . +dataFromProducer1:Product55 + rdf:type bsbm:Product ; + rdfs:label "prevalently bunko" ; + rdfs:comment "premeditatedness ineptly smockings conjurors anesthetics imponderability playwear privileging underpins bleaker wrestler curtly wagoned fictions preboils dueler comelier acclimatizer vertexes competently loggia osmic darkling pacemaking dungeons couther helper bathyscaph kiboshing ironstones sidesaddles blowiness arthrography flatways rescissions rugged parmigiana vermonter agonizing blusher hiatuses plaguers cockatoos hexone wains assonantly famously saclike nonelectrically orrises tawnies duckweeds maupassant deoxygenate recurrences invertors jugular forlorner stooged contemplating prinks fauvism overwealthy pointing rumba cortin flagitious waterproofer sensualists allheals gentlewoman hungrily humpy disemploy omits furrieries tequilas entangler dhole cutes bingos lignifying sneezes blowhards inflammatorily sophists reconvey books noneducational reversionary sandhogs offerings goutiness extinctions lobotomized" ; + rdf:type bsbm-inst:ProductType6 ; + rdf:type bsbm-inst:ProductType2 ; + rdf:type bsbm-inst:ProductType1 ; + bsbm:productPropertyNumeric1 "536"^^xsd:integer ; + bsbm:productPropertyNumeric2 "1289"^^xsd:integer ; + bsbm:productPropertyNumeric3 "288"^^xsd:integer ; + bsbm:productPropertyNumeric4 "1235"^^xsd:integer ; + bsbm:productPropertyNumeric5 "653"^^xsd:integer ; + bsbm:productPropertyTextual1 "serer noodled pantaloons maligned"^^xsd:string ; + bsbm:productPropertyTextual2 "psalters clients dollies lodged noddle earshots economizers timidly misereres clotheshorses quotationally reattaining statecraft exporter noncontrollably"^^xsd:string ; + bsbm:productPropertyTextual3 "liquidly customhouses ceaseless surfeited seasonings"^^xsd:string ; + bsbm:productPropertyTextual4 "passkeys mycologists cajaput ascendancy poiser herbal appropriative sanctimoniousness artfully arced aground"^^xsd:string ; + bsbm:productFeature bsbm-inst:ProductFeature185 ; + bsbm:productFeature bsbm-inst:ProductFeature188 ; + bsbm:productFeature bsbm-inst:ProductFeature191 ; + bsbm:productFeature bsbm-inst:ProductFeature192 ; + bsbm:productFeature bsbm-inst:ProductFeature194 ; + bsbm:productFeature bsbm-inst:ProductFeature200 ; + bsbm:productFeature bsbm-inst:ProductFeature204 ; + bsbm:productFeature bsbm-inst:ProductFeature205 ; + bsbm:productFeature bsbm-inst:ProductFeature211 ; + bsbm:productFeature bsbm-inst:ProductFeature212 ; + bsbm:productFeature bsbm-inst:ProductFeature213 ; + bsbm:productFeature bsbm-inst:ProductFeature220 ; + bsbm:productFeature bsbm-inst:ProductFeature1 ; + bsbm:productFeature bsbm-inst:ProductFeature7 ; + bsbm:productFeature bsbm-inst:ProductFeature9 ; + bsbm:productFeature bsbm-inst:ProductFeature13 ; + bsbm:productFeature bsbm-inst:ProductFeature17 ; + bsbm:productFeature bsbm-inst:ProductFeature21 ; + bsbm:productFeature bsbm-inst:ProductFeature23 ; + bsbm:productFeature bsbm-inst:ProductFeature24 ; + bsbm:productFeature bsbm-inst:ProductFeature25 ; + bsbm:productFeature bsbm-inst:ProductFeature29 ; + bsbm:productFeature bsbm-inst:ProductFeature30 ; + bsbm:productFeature bsbm-inst:ProductFeature31 ; + bsbm:productFeature bsbm-inst:ProductFeature33 ; + bsbm:producer dataFromProducer1:Producer1 ; + dc:publisher dataFromProducer1:Producer1 ; + dc:date "2001-03-12"^^xsd:date . +dataFromProducer1:Product56 + rdf:type bsbm:Product ; + rdfs:label "pseudointellectuals" ; + rdfs:comment "forequarters exhibited abrupter chuckling dumbs unrated hardbought unwonted rooms dryly sugars premierships glutted caulkers learns concrescences hotbeds stippling loather thatches elects staphs archeozoic buckeroos flashbulb hanger gossipped hardbought demobbing hypochondria signors expeditionary oldstyles newswomen blears dulcets extenuating privies overestimate detrimentalness violoncellist peevishness peregrinations supraorbital skeletons axletree gastronomic reinvolve dementias fortunately baccalaureates baulk charladies levying plaguer cupolas settings unfinished scrims archon homoeroticism gens hardbacks subsumes refly palmyras reposed urologies witched tatter simpleness appellants redemonstrated rangiest prosthetically scorers foggily legionnaires underdrawers" ; + rdf:type bsbm-inst:ProductType9 ; + rdf:type bsbm-inst:ProductType2 ; + rdf:type bsbm-inst:ProductType1 ; + bsbm:productPropertyNumeric1 "825"^^xsd:integer ; + bsbm:productPropertyNumeric2 "834"^^xsd:integer ; + bsbm:productPropertyNumeric3 "1663"^^xsd:integer ; + bsbm:productPropertyTextual1 "enchant drizzled noncontributing"^^xsd:string ; + bsbm:productPropertyTextual2 "neoclassically transporters outfielders counterculture hawked charcoaled antibusing sudses"^^xsd:string ; + bsbm:productPropertyTextual3 "downtrod awninged interbred overassertiveness paramours realign ergonomically"^^xsd:string ; + bsbm:productFeature bsbm-inst:ProductFeature330 ; + bsbm:productFeature bsbm-inst:ProductFeature333 ; + bsbm:productFeature bsbm-inst:ProductFeature338 ; + bsbm:productFeature bsbm-inst:ProductFeature341 ; + bsbm:productFeature bsbm-inst:ProductFeature343 ; + bsbm:productFeature bsbm-inst:ProductFeature346 ; + bsbm:productFeature bsbm-inst:ProductFeature348 ; + bsbm:productFeature bsbm-inst:ProductFeature349 ; + bsbm:productFeature bsbm-inst:ProductFeature351 ; + bsbm:productFeature bsbm-inst:ProductFeature352 ; + bsbm:productFeature bsbm-inst:ProductFeature354 ; + bsbm:productFeature bsbm-inst:ProductFeature355 ; + bsbm:productFeature bsbm-inst:ProductFeature358 ; + bsbm:productFeature bsbm-inst:ProductFeature359 ; + bsbm:productFeature bsbm-inst:ProductFeature2 ; + bsbm:productFeature bsbm-inst:ProductFeature5 ; + bsbm:productFeature bsbm-inst:ProductFeature9 ; + bsbm:productFeature bsbm-inst:ProductFeature11 ; + bsbm:productFeature bsbm-inst:ProductFeature12 ; + bsbm:productFeature bsbm-inst:ProductFeature15 ; + bsbm:productFeature bsbm-inst:ProductFeature20 ; + bsbm:productFeature bsbm-inst:ProductFeature24 ; + bsbm:productFeature bsbm-inst:ProductFeature25 ; + bsbm:productFeature bsbm-inst:ProductFeature26 ; + bsbm:producer dataFromProducer1:Producer1 ; + dc:publisher dataFromProducer1:Producer1 ; + dc:date "2004-03-19"^^xsd:date . +dataFromProducer1:Product57 + rdf:type bsbm:Product ; + rdfs:label "diopters" ; + rdfs:comment "damnableness incapacious centerfolds preternatural townsfolk foodstuffs uptightness diarrhea notecases gringo lignums accounts broadtail obsidians biorhythmicities moronism wades cremating dutifulness exalts contended generics frequented ss receivables ginsengs hunchbacks humuses merchantman huddler recurving chillum embossing disheartening numbed numbest puckery chippies surtaxing sowable patens repairable visualization unmemorized malevolently fluctuation repacifying poachers vexingly yummier spumone sapidity grimacer fanners excused excavated unrecoverable unacademic spindles complicatedness preformed bombsights unpredicted imitator overcast fecundating poisoners drudging reattain facetted bilker reptiles squadrons peachiest proclaims marts chairmanship bouquets impounded placement archimedean ensue reconfirmations potting chowing" ; + rdf:type bsbm-inst:ProductType10 ; + rdf:type bsbm-inst:ProductType3 ; + rdf:type bsbm-inst:ProductType1 ; + bsbm:productPropertyNumeric1 "124"^^xsd:integer ; + bsbm:productPropertyNumeric2 "685"^^xsd:integer ; + bsbm:productPropertyNumeric3 "1700"^^xsd:integer ; + bsbm:productPropertyNumeric6 "747"^^xsd:integer ; + bsbm:productPropertyTextual1 "beginners biddies seawater awesomeness stenciled peppercorn impaler"^^xsd:string ; + bsbm:productPropertyTextual2 "kielbasy stages fazes insurrectionist trencher cabala"^^xsd:string ; + bsbm:productPropertyTextual3 "scabbed ganglia isomorphs toeplates obscenely thumbprint mellows"^^xsd:string ; + bsbm:productPropertyTextual5 "asphalted embezzler mangier"^^xsd:string ; + bsbm:productFeature bsbm-inst:ProductFeature376 ; + bsbm:productFeature bsbm-inst:ProductFeature379 ; + bsbm:productFeature bsbm-inst:ProductFeature383 ; + bsbm:productFeature bsbm-inst:ProductFeature384 ; + bsbm:productFeature bsbm-inst:ProductFeature396 ; + bsbm:productFeature bsbm-inst:ProductFeature401 ; + bsbm:productFeature bsbm-inst:ProductFeature406 ; + bsbm:productFeature bsbm-inst:ProductFeature411 ; + bsbm:productFeature bsbm-inst:ProductFeature412 ; + bsbm:productFeature bsbm-inst:ProductFeature415 ; + bsbm:productFeature bsbm-inst:ProductFeature37 ; + bsbm:productFeature bsbm-inst:ProductFeature38 ; + bsbm:productFeature bsbm-inst:ProductFeature46 ; + bsbm:productFeature bsbm-inst:ProductFeature52 ; + bsbm:productFeature bsbm-inst:ProductFeature53 ; + bsbm:productFeature bsbm-inst:ProductFeature54 ; + bsbm:productFeature bsbm-inst:ProductFeature62 ; + bsbm:productFeature bsbm-inst:ProductFeature66 ; + bsbm:productFeature bsbm-inst:ProductFeature68 ; + bsbm:productFeature bsbm-inst:ProductFeature70 ; + bsbm:productFeature bsbm-inst:ProductFeature72 ; + bsbm:productFeature bsbm-inst:ProductFeature74 ; + bsbm:producer dataFromProducer1:Producer1 ; + dc:publisher dataFromProducer1:Producer1 ; + dc:date "2004-07-12"^^xsd:date . +dataFromProducer1:Product58 + rdf:type bsbm:Product ; + rdfs:label "bettas swerved deflea" ; + rdfs:comment "oryx kitschy gaoler fishtails universalization outtakes stoned haunter shockers agreements hurraying flavorers genomes athletes rekey daydreamt sibilating daubes reforests hausfrau foliaged apium worshiper rabelais mullioning fantail mump satins twiggiest preappointing pygmalionism infection demilitarized summerier chillingly unnoticed jestful mainmast sopor gigabytes tights retraction plateaued hypersonic backspaced investigated biophysiography gratae flickered attendants moorlands pumicites bootlaces hoggish gerardias hurdled dicker lode punker interface shared belletrists influences janisary cartooning ashless nuncles uneventfully urgencies swaybacks photoplays kelpie patrilinies recompounding unconsoled grunter encored shodden engulfing torero bannock resumed monkeyshine sutures battalions aureolas ogles byways prowar proctoring competency outsells segos noondays treaders dated caviling dulls defalcate" ; + rdf:type bsbm-inst:ProductType12 ; + rdf:type bsbm-inst:ProductType3 ; + rdf:type bsbm-inst:ProductType1 ; + bsbm:productPropertyNumeric1 "498"^^xsd:integer ; + bsbm:productPropertyNumeric2 "1845"^^xsd:integer ; + bsbm:productPropertyNumeric3 "856"^^xsd:integer ; + bsbm:productPropertyTextual1 "gangrenes tzardoms rungless preexposed sunbaked precautions burlesquing walkable eardrums"^^xsd:string ; + bsbm:productPropertyTextual2 "bunged inhabitance circumlocutions lisping bechamels undermentioned soppier reelers dilations racecourse extinction"^^xsd:string ; + bsbm:productPropertyTextual3 "scurrility hotnesses exurbanite interpreter audiences unpaved ovally gaynesses boats teethes preadapting stoicisms grinder prolapsed infrangible"^^xsd:string ; + bsbm:productFeature bsbm-inst:ProductFeature458 ; + bsbm:productFeature bsbm-inst:ProductFeature461 ; + bsbm:productFeature bsbm-inst:ProductFeature462 ; + bsbm:productFeature bsbm-inst:ProductFeature464 ; + bsbm:productFeature bsbm-inst:ProductFeature466 ; + bsbm:productFeature bsbm-inst:ProductFeature467 ; + bsbm:productFeature bsbm-inst:ProductFeature470 ; + bsbm:productFeature bsbm-inst:ProductFeature475 ; + bsbm:productFeature bsbm-inst:ProductFeature478 ; + bsbm:productFeature bsbm-inst:ProductFeature481 ; + bsbm:productFeature bsbm-inst:ProductFeature483 ; + bsbm:productFeature bsbm-inst:ProductFeature485 ; + bsbm:productFeature bsbm-inst:ProductFeature489 ; + bsbm:productFeature bsbm-inst:ProductFeature490 ; + bsbm:productFeature bsbm-inst:ProductFeature42 ; + bsbm:productFeature bsbm-inst:ProductFeature46 ; + bsbm:productFeature bsbm-inst:ProductFeature52 ; + bsbm:productFeature bsbm-inst:ProductFeature55 ; + bsbm:productFeature bsbm-inst:ProductFeature60 ; + bsbm:productFeature bsbm-inst:ProductFeature61 ; + bsbm:productFeature bsbm-inst:ProductFeature62 ; + bsbm:productFeature bsbm-inst:ProductFeature71 ; + bsbm:producer dataFromProducer1:Producer1 ; + dc:publisher dataFromProducer1:Producer1 ; + dc:date "2002-10-28"^^xsd:date . +dataFromProducer1:Product59 + rdf:type bsbm:Product ; + rdfs:label "hajjis postglacial" ; + rdfs:comment "custodians tutti speculator blabbering uncondoned battling foolishest wiredraws unliveable eponymies contemplating coagulative rewelded ratifies enters squealing vivification widely operculated pasta tetanized dastardliness slummer egoists bifurcations telephonists emeer inflammabilities panes zigs prestigiously evenings rearrangements immunities concertized vatful portables skydiver freewheeling unconventionalizes jolters cuckolding eases submergibility staffs shrieky woolens leadenly timelessness conservational couths splining foldboat heliographs iscose extrapolation ethicizing canebrakes nonscientific nepotism wheezes cps discontent incumbrance littery intercalation unmasker superintending ankuses hermaphroditically ovoid dermatologies expiatory portioning longes worshiping phantasmagoric hypersexuality subabbot stragglier luffs processing cannibalize disciples overtly parries inhumed seige injustices complemental charing unfailingness limestones virago scapulas undemonstratively crankiness ruins inapplicability plyer ceremonially wassailed idem fleshed reglaze crocked chops bedevilled reinstatements skimps beechnut hognoses seeings technicians heavyweights climacterics colored hefter initialled buckler neologies masslessness nonprofit tweeter dashpots proindustry conterminous postmortems enfin frankness backrests" ; + rdf:type bsbm-inst:ProductType10 ; + rdf:type bsbm-inst:ProductType3 ; + rdf:type bsbm-inst:ProductType1 ; + bsbm:productPropertyNumeric1 "150"^^xsd:integer ; + bsbm:productPropertyNumeric2 "1714"^^xsd:integer ; + bsbm:productPropertyNumeric3 "143"^^xsd:integer ; + bsbm:productPropertyTextual1 "staggering imperia misogynic factful femurs unmanliness nomography squeezes astringents calcining sanctioner jejunity"^^xsd:string ; + bsbm:productPropertyTextual2 "hedgehops depraving peyotyl spiriting futileness serging briskest peppier trochoid bathyspheres irradiates squushing recoverer jayvee hopefulness"^^xsd:string ; + bsbm:productPropertyTextual3 "using corselets depilate impermanently polymorphous underlaps spending totipotencies notal hyphenating dubio intermediating hundredths mirkest"^^xsd:string ; + bsbm:productFeature bsbm-inst:ProductFeature378 ; + bsbm:productFeature bsbm-inst:ProductFeature380 ; + bsbm:productFeature bsbm-inst:ProductFeature385 ; + bsbm:productFeature bsbm-inst:ProductFeature387 ; + bsbm:productFeature bsbm-inst:ProductFeature394 ; + bsbm:productFeature bsbm-inst:ProductFeature403 ; + bsbm:productFeature bsbm-inst:ProductFeature405 ; + bsbm:productFeature bsbm-inst:ProductFeature406 ; + bsbm:productFeature bsbm-inst:ProductFeature38 ; + bsbm:productFeature bsbm-inst:ProductFeature40 ; + bsbm:productFeature bsbm-inst:ProductFeature41 ; + bsbm:productFeature bsbm-inst:ProductFeature44 ; + bsbm:productFeature bsbm-inst:ProductFeature51 ; + bsbm:productFeature bsbm-inst:ProductFeature55 ; + bsbm:productFeature bsbm-inst:ProductFeature56 ; + bsbm:productFeature bsbm-inst:ProductFeature57 ; + bsbm:productFeature bsbm-inst:ProductFeature60 ; + bsbm:productFeature bsbm-inst:ProductFeature61 ; + bsbm:productFeature bsbm-inst:ProductFeature63 ; + bsbm:productFeature bsbm-inst:ProductFeature64 ; + bsbm:productFeature bsbm-inst:ProductFeature66 ; + bsbm:productFeature bsbm-inst:ProductFeature71 ; + bsbm:productFeature bsbm-inst:ProductFeature75 ; + bsbm:productFeature bsbm-inst:ProductFeature76 ; + bsbm:producer dataFromProducer1:Producer1 ; + dc:publisher dataFromProducer1:Producer1 ; + dc:date "2004-02-06"^^xsd:date . +dataFromProducer2:Producer2 + rdf:type bsbm:Producer ; + rdfs:label "decaffeinates beslime" ; + rdfs:comment "perineum lubricator wonky lidless favouring dehorner bathless vaunty fillable ditties microcomputer underdevelopment yes basset wanning cottiers bellyaches noggins larks palettes palimpsest magnifier luxuries warworks preamplifiers melanogen sandbaggers sulphured inattentively sarcophaguses doter spattered beguines malevolently glamorizer regimenting dabbed ornamented baronetcies roots disaffiliation applications pandowdies outracing hearths yeggman tougher cockish rehashes" ; + foaf:homepage ; + bsbm:country ; + dc:publisher dataFromProducer2:Producer2 ; + dc:date "2001-10-13"^^xsd:date . +dataFromProducer2:Product60 + rdf:type bsbm:Product ; + rdfs:label "tornadoes clouts" ; + rdfs:comment "prismoid suggests insecurities bagful sobbers incursions rehashing straightly mapmakers prickly operants legitimation edifier underestimation castigating curlicues bechamels thrivers salves stockmen celled outtakes imperialist casebooks raisons endlessly derisible medicals overflowing crankest figureheads agamic nontransparent ironbound modesties mightier searchers chimeras braying chiseller arcs outvotes quadruplicated ghastful polygamous encrypted milady snifters fancies reheeled spouting laboratorial rabbinates boughten repatriates sensing accenting yurt gimmicky sylphic fanaticized fumettes appellor isolable tingler blubbers surprised whapped erin steerage ballads purports" ; + rdf:type bsbm-inst:ProductType12 ; + rdf:type bsbm-inst:ProductType3 ; + rdf:type bsbm-inst:ProductType1 ; + bsbm:productPropertyNumeric1 "339"^^xsd:integer ; + bsbm:productPropertyNumeric2 "537"^^xsd:integer ; + bsbm:productPropertyNumeric3 "919"^^xsd:integer ; + bsbm:productPropertyNumeric4 "870"^^xsd:integer ; + bsbm:productPropertyNumeric5 "272"^^xsd:integer ; + bsbm:productPropertyTextual1 "cuttle midships naturalists respectively enquired putterer electrotype stalkless fille kepi"^^xsd:string ; + bsbm:productPropertyTextual2 "ganglial unacademic misconceived nondependence calx snits"^^xsd:string ; + bsbm:productPropertyTextual3 "ponied adumbratively probationers whinnies flume imam outrange imbruing inspiring healths caperer piggery"^^xsd:string ; + bsbm:productPropertyTextual4 "revolutionizer misapprehends longing counterinsurgency intervened unreadable unsorted"^^xsd:string ; + bsbm:productPropertyTextual5 "jellies unforgivably hoops lowliness flanked rapturously alacrities twisters rutabagas berm"^^xsd:string ; + bsbm:productFeature bsbm-inst:ProductFeature454 ; + bsbm:productFeature bsbm-inst:ProductFeature455 ; + bsbm:productFeature bsbm-inst:ProductFeature457 ; + bsbm:productFeature bsbm-inst:ProductFeature465 ; + bsbm:productFeature bsbm-inst:ProductFeature467 ; + bsbm:productFeature bsbm-inst:ProductFeature468 ; + bsbm:productFeature bsbm-inst:ProductFeature474 ; + bsbm:productFeature bsbm-inst:ProductFeature478 ; + bsbm:productFeature bsbm-inst:ProductFeature484 ; + bsbm:productFeature bsbm-inst:ProductFeature485 ; + bsbm:productFeature bsbm-inst:ProductFeature488 ; + bsbm:productFeature bsbm-inst:ProductFeature489 ; + bsbm:productFeature bsbm-inst:ProductFeature491 ; + bsbm:productFeature bsbm-inst:ProductFeature42 ; + bsbm:productFeature bsbm-inst:ProductFeature46 ; + bsbm:productFeature bsbm-inst:ProductFeature47 ; + bsbm:productFeature bsbm-inst:ProductFeature50 ; + bsbm:productFeature bsbm-inst:ProductFeature51 ; + bsbm:productFeature bsbm-inst:ProductFeature52 ; + bsbm:productFeature bsbm-inst:ProductFeature54 ; + bsbm:productFeature bsbm-inst:ProductFeature55 ; + bsbm:productFeature bsbm-inst:ProductFeature59 ; + bsbm:productFeature bsbm-inst:ProductFeature60 ; + bsbm:productFeature bsbm-inst:ProductFeature61 ; + bsbm:productFeature bsbm-inst:ProductFeature65 ; + bsbm:productFeature bsbm-inst:ProductFeature70 ; + bsbm:productFeature bsbm-inst:ProductFeature72 ; + bsbm:productFeature bsbm-inst:ProductFeature74 ; + bsbm:productFeature bsbm-inst:ProductFeature76 ; + bsbm:producer dataFromProducer2:Producer2 ; + dc:publisher dataFromProducer2:Producer2 ; + dc:date "2001-11-23"^^xsd:date . +dataFromProducer2:Product61 + rdf:type bsbm:Product ; + rdfs:label "doctrines agoras axil" ; + rdfs:comment "gatekeepers liturgist demonetized softs contaminants exogamic allegeable uncork languors undershot hardboots pekingese homoeroticism reordain prawn rivetting phallist desuetudes gardening galenic indispensably folios placarding relinquishes jiff sticking withered maims overreachers gaged prodders marsupia prompters chlorides rideable squelchier ganser ameliorates reeler academical curari plunked phrenologist liberationists implied pinstriped rollway cutlas townsite chuckies whittled dialing debaucher nephron fondling bedevilling artifacts negation filthier incoincident rec holdovers feticide firebirds elucidation duettists inflictions belongings mediated stultifying subdialects prissiness hoisters bloodfins syllabled virtues malfunctions sudsers christianized truckloads recaller slithers governableness kidded evincible whining tented tutored peas dimities" ; + rdf:type bsbm-inst:ProductType7 ; + rdf:type bsbm-inst:ProductType2 ; + rdf:type bsbm-inst:ProductType1 ; + bsbm:productPropertyNumeric1 "977"^^xsd:integer ; + bsbm:productPropertyNumeric2 "330"^^xsd:integer ; + bsbm:productPropertyNumeric3 "21"^^xsd:integer ; + bsbm:productPropertyNumeric4 "621"^^xsd:integer ; + bsbm:productPropertyNumeric5 "208"^^xsd:integer ; + bsbm:productPropertyTextual1 "sulfuring soupy aggrandizer swaddles debunker boors"^^xsd:string ; + bsbm:productPropertyTextual2 "gelatinously chasers ankhs ordinates morns infanticidal dependabilities setae spokes seizes ludicrously lyre augmenter recriminated arbored"^^xsd:string ; + bsbm:productPropertyTextual3 "illuminates walking scorchers smeary outbidden chemoreceptivities dubbers interlope fubsier imprimaturs veilings pietists plumbers saleyard quiescency"^^xsd:string ; + bsbm:productPropertyTextual4 "wackiest aggressing maligning caterpillars gearboxes triads misc shopbreaker foreswear intricately licensors"^^xsd:string ; + bsbm:productPropertyTextual5 "hoax vernalizing disgruntled accumulable euphemistically extirpates intervertebral textbooks outbalancing prats verdancy negating handwrote"^^xsd:string ; + bsbm:productFeature bsbm-inst:ProductFeature227 ; + bsbm:productFeature bsbm-inst:ProductFeature228 ; + bsbm:productFeature bsbm-inst:ProductFeature234 ; + bsbm:productFeature bsbm-inst:ProductFeature240 ; + bsbm:productFeature bsbm-inst:ProductFeature243 ; + bsbm:productFeature bsbm-inst:ProductFeature247 ; + bsbm:productFeature bsbm-inst:ProductFeature250 ; + bsbm:productFeature bsbm-inst:ProductFeature251 ; + bsbm:productFeature bsbm-inst:ProductFeature259 ; + bsbm:productFeature bsbm-inst:ProductFeature262 ; + bsbm:productFeature bsbm-inst:ProductFeature263 ; + bsbm:productFeature bsbm-inst:ProductFeature265 ; + bsbm:productFeature bsbm-inst:ProductFeature275 ; + bsbm:productFeature bsbm-inst:ProductFeature277 ; + bsbm:productFeature bsbm-inst:ProductFeature280 ; + bsbm:productFeature bsbm-inst:ProductFeature285 ; + bsbm:productFeature bsbm-inst:ProductFeature286 ; + bsbm:productFeature bsbm-inst:ProductFeature1 ; + bsbm:productFeature bsbm-inst:ProductFeature6 ; + bsbm:productFeature bsbm-inst:ProductFeature7 ; + bsbm:productFeature bsbm-inst:ProductFeature11 ; + bsbm:productFeature bsbm-inst:ProductFeature12 ; + bsbm:productFeature bsbm-inst:ProductFeature14 ; + bsbm:productFeature bsbm-inst:ProductFeature20 ; + bsbm:productFeature bsbm-inst:ProductFeature24 ; + bsbm:productFeature bsbm-inst:ProductFeature25 ; + bsbm:productFeature bsbm-inst:ProductFeature29 ; + bsbm:productFeature bsbm-inst:ProductFeature33 ; + bsbm:productFeature bsbm-inst:ProductFeature36 ; + bsbm:producer dataFromProducer2:Producer2 ; + dc:publisher dataFromProducer2:Producer2 ; + dc:date "2005-05-17"^^xsd:date . +dataFromProducer2:Product62 + rdf:type bsbm:Product ; + rdfs:label "dagos" ; + rdfs:comment "silex monsoonal stagnating welched preventively translatable unsegregated imploding carnally yowl rankling accommodational romped antigene manfulness monetarily apprehensibly reloaders absolutistic spraining trophies cordless schmoozing decongest fiddlers helicoidal racetracks thimblefuls nutrients workstations inoculant decasyllables shortchange butterfishes tiring felicitation castellated sands paintiest revengeful sportiest eggcup aphanites involvers moods mikrons misconstruction shrimpers vaporousness measurability distressfully deciphering colonelcies daunters nonplusses exteriorize rockfall derma goddesses physicochemical andesyte adequateness antiseptic immensest duffels jargonize speedings expressionist wahines largish reendowed rejuvenations defining furrings inlaying thralled overparticular undemonstratively icings banqueters spinelessness endangering semicrystalline contrastingly reedited mappable ocularly semiconducting reverifying dietitian painter tarting spicule jugs driftway toadflax sentimentalized christianize mulled rubbing lavalieres brittled thankfulness questioning steadfastly dandelions boweling westerns monolithic bombardment scumming contes millibar respectively thraldom fiber detester autoinoculation popularizations baggily scantlings relinquishing punctualness spookish astatines underplayed wotted tonsillar rurally incidentals grannie tapping hellenistic" ; + rdf:type bsbm-inst:ProductType7 ; + rdf:type bsbm-inst:ProductType2 ; + rdf:type bsbm-inst:ProductType1 ; + bsbm:productPropertyNumeric1 "829"^^xsd:integer ; + bsbm:productPropertyNumeric2 "62"^^xsd:integer ; + bsbm:productPropertyNumeric3 "1313"^^xsd:integer ; + bsbm:productPropertyNumeric6 "1041"^^xsd:integer ; + bsbm:productPropertyTextual1 "thunderstorms tieback twinborn trothing jaywalked"^^xsd:string ; + bsbm:productPropertyTextual2 "sprained geotropic thumbtacked churchyards payable cottons vocalist demurs lechers mastication goofs involucres"^^xsd:string ; + bsbm:productPropertyTextual3 "tosh baboos enumerator"^^xsd:string ; + bsbm:productFeature bsbm-inst:ProductFeature225 ; + bsbm:productFeature bsbm-inst:ProductFeature226 ; + bsbm:productFeature bsbm-inst:ProductFeature228 ; + bsbm:productFeature bsbm-inst:ProductFeature231 ; + bsbm:productFeature bsbm-inst:ProductFeature232 ; + bsbm:productFeature bsbm-inst:ProductFeature233 ; + bsbm:productFeature bsbm-inst:ProductFeature238 ; + bsbm:productFeature bsbm-inst:ProductFeature239 ; + bsbm:productFeature bsbm-inst:ProductFeature243 ; + bsbm:productFeature bsbm-inst:ProductFeature252 ; + bsbm:productFeature bsbm-inst:ProductFeature254 ; + bsbm:productFeature bsbm-inst:ProductFeature256 ; + bsbm:productFeature bsbm-inst:ProductFeature258 ; + bsbm:productFeature bsbm-inst:ProductFeature271 ; + bsbm:productFeature bsbm-inst:ProductFeature272 ; + bsbm:productFeature bsbm-inst:ProductFeature273 ; + bsbm:productFeature bsbm-inst:ProductFeature274 ; + bsbm:productFeature bsbm-inst:ProductFeature281 ; + bsbm:productFeature bsbm-inst:ProductFeature282 ; + bsbm:productFeature bsbm-inst:ProductFeature5 ; + bsbm:productFeature bsbm-inst:ProductFeature9 ; + bsbm:productFeature bsbm-inst:ProductFeature13 ; + bsbm:productFeature bsbm-inst:ProductFeature15 ; + bsbm:productFeature bsbm-inst:ProductFeature18 ; + bsbm:productFeature bsbm-inst:ProductFeature23 ; + bsbm:productFeature bsbm-inst:ProductFeature26 ; + bsbm:productFeature bsbm-inst:ProductFeature29 ; + bsbm:producer dataFromProducer2:Producer2 ; + dc:publisher dataFromProducer2:Producer2 ; + dc:date "2002-12-25"^^xsd:date . +dataFromProducer2:Product63 + rdf:type bsbm:Product ; + rdfs:label "defused botanies" ; + rdfs:comment "inexperienced spunkily excuses exaggerative medicating chertier twining swooshes lapwings enchanters modeled hugest regulates potage felonries curares paxes subtopics chromaticism easers bumpier microscopies proves devolves parceling witling hinnies misdescription examining collodion playsuit sanctimony demolishes froggy advancement reactance imparter im aftershave draggling notions escarping moonstone disturbingly piedmonts bittersweets potboys jotted buckskins disincorporate equippers thrustor fubbing eau pigmentations sparked recontracts phenologically malignancies mezuzas cloying preinserts gourds toughies ionospheres lecithins malarias manlier stayers shrived stroked viaducts normed unman sintering antifreeze nestler antipollution overlaying ratification endlong compos plumbers woodruffs overbooks donees bibbed florets unheeded spawning joined syphilizing tabard taskmasters gunwales unacclimated eternized uptime endoderms penances dumfounding beautifier nonbeliever frustrates incinerating animadverted preacceptance antlions raga mounded guitarist rived unholy resaw plusses monomolecularly cowbane pleurisies hardshell climacteric ideals idolizer denicotinizing gypsies adjured disaffiliates rehems lowermost unhelm caribous torchbearer rehanging forenames unscholarly inverts evaluations brawlingly southerly thermodynamic bipartisanship appropriator tautologous totaled enface boundaries geneses" ; + rdf:type bsbm-inst:ProductType13 ; + rdf:type bsbm-inst:ProductType3 ; + rdf:type bsbm-inst:ProductType1 ; + bsbm:productPropertyNumeric1 "425"^^xsd:integer ; + bsbm:productPropertyNumeric2 "441"^^xsd:integer ; + bsbm:productPropertyNumeric3 "57"^^xsd:integer ; + bsbm:productPropertyTextual1 "mousey litchis annelids indicative security"^^xsd:string ; + bsbm:productPropertyTextual2 "snaky buttoners continuos sluices acacias"^^xsd:string ; + bsbm:productPropertyTextual3 "distinguishes bunted manometry befalls jamborees cautions lurked multilingual personified maupassant steamboats"^^xsd:string ; + bsbm:productFeature bsbm-inst:ProductFeature499 ; + bsbm:productFeature bsbm-inst:ProductFeature504 ; + bsbm:productFeature bsbm-inst:ProductFeature512 ; + bsbm:productFeature bsbm-inst:ProductFeature513 ; + bsbm:productFeature bsbm-inst:ProductFeature518 ; + bsbm:productFeature bsbm-inst:ProductFeature519 ; + bsbm:productFeature bsbm-inst:ProductFeature520 ; + bsbm:productFeature bsbm-inst:ProductFeature527 ; + bsbm:productFeature bsbm-inst:ProductFeature529 ; + bsbm:productFeature bsbm-inst:ProductFeature530 ; + bsbm:productFeature bsbm-inst:ProductFeature531 ; + bsbm:productFeature bsbm-inst:ProductFeature533 ; + bsbm:productFeature bsbm-inst:ProductFeature536 ; + bsbm:productFeature bsbm-inst:ProductFeature537 ; + bsbm:productFeature bsbm-inst:ProductFeature538 ; + bsbm:productFeature bsbm-inst:ProductFeature540 ; + bsbm:productFeature bsbm-inst:ProductFeature547 ; + bsbm:productFeature bsbm-inst:ProductFeature548 ; + bsbm:productFeature bsbm-inst:ProductFeature555 ; + bsbm:productFeature bsbm-inst:ProductFeature556 ; + bsbm:productFeature bsbm-inst:ProductFeature559 ; + bsbm:productFeature bsbm-inst:ProductFeature38 ; + bsbm:productFeature bsbm-inst:ProductFeature42 ; + bsbm:productFeature bsbm-inst:ProductFeature46 ; + bsbm:productFeature bsbm-inst:ProductFeature54 ; + bsbm:productFeature bsbm-inst:ProductFeature56 ; + bsbm:productFeature bsbm-inst:ProductFeature60 ; + bsbm:productFeature bsbm-inst:ProductFeature67 ; + bsbm:productFeature bsbm-inst:ProductFeature73 ; + bsbm:producer dataFromProducer2:Producer2 ; + dc:publisher dataFromProducer2:Producer2 ; + dc:date "2005-12-21"^^xsd:date . +dataFromProducer2:Product64 + rdf:type bsbm:Product ; + rdfs:label "niters abetters" ; + rdfs:comment "chimer motorbus eves cobwebby manlike radiographies deploys chunking reuses clover narratives reinviting facies gapingly airbrushes eminences antigravity cutter unscientifically relativity seeings shortener overdress antidisestablishmentarianism beats retches atomisms sinecure blamed mitts astrobiologies tempore woodcarvers prorated mitochondrion sphygmomanometer mafioso addends seceder insulating altarpieces wields marrieds sissified omelette enhaloing embosser reeks toupee dockhands califate quoth" ; + rdf:type bsbm-inst:ProductType7 ; + rdf:type bsbm-inst:ProductType2 ; + rdf:type bsbm-inst:ProductType1 ; + bsbm:productPropertyNumeric1 "509"^^xsd:integer ; + bsbm:productPropertyNumeric2 "1366"^^xsd:integer ; + bsbm:productPropertyNumeric3 "590"^^xsd:integer ; + bsbm:productPropertyNumeric6 "184"^^xsd:integer ; + bsbm:productPropertyTextual1 "thinning tweeds blatting uric"^^xsd:string ; + bsbm:productPropertyTextual2 "unprogressive hashhead premised smothers unprized laborsaving unsurprised liquidizes fouling jogged cowbells vulcanizer"^^xsd:string ; + bsbm:productPropertyTextual3 "splashing tempus migrations tabard adhesively crawlier"^^xsd:string ; + bsbm:productPropertyTextual5 "kerchiefs inoculating reverification bristled sleepers commonweals clomped taro guzzles androgenic copolymerization speeder jaggs attested"^^xsd:string ; + bsbm:productPropertyTextual6 "univ glaucomatous undercapitalized disaffiliating exactness deductibles depredatory tearoom rechristens denigrators wicked usurps dictaphone"^^xsd:string ; + bsbm:productFeature bsbm-inst:ProductFeature227 ; + bsbm:productFeature bsbm-inst:ProductFeature228 ; + bsbm:productFeature bsbm-inst:ProductFeature231 ; + bsbm:productFeature bsbm-inst:ProductFeature237 ; + bsbm:productFeature bsbm-inst:ProductFeature239 ; + bsbm:productFeature bsbm-inst:ProductFeature244 ; + bsbm:productFeature bsbm-inst:ProductFeature246 ; + bsbm:productFeature bsbm-inst:ProductFeature256 ; + bsbm:productFeature bsbm-inst:ProductFeature259 ; + bsbm:productFeature bsbm-inst:ProductFeature263 ; + bsbm:productFeature bsbm-inst:ProductFeature268 ; + bsbm:productFeature bsbm-inst:ProductFeature272 ; + bsbm:productFeature bsbm-inst:ProductFeature273 ; + bsbm:productFeature bsbm-inst:ProductFeature275 ; + bsbm:productFeature bsbm-inst:ProductFeature286 ; + bsbm:productFeature bsbm-inst:ProductFeature287 ; + bsbm:productFeature bsbm-inst:ProductFeature288 ; + bsbm:productFeature bsbm-inst:ProductFeature1 ; + bsbm:productFeature bsbm-inst:ProductFeature3 ; + bsbm:productFeature bsbm-inst:ProductFeature5 ; + bsbm:productFeature bsbm-inst:ProductFeature6 ; + bsbm:productFeature bsbm-inst:ProductFeature10 ; + bsbm:productFeature bsbm-inst:ProductFeature13 ; + bsbm:productFeature bsbm-inst:ProductFeature16 ; + bsbm:productFeature bsbm-inst:ProductFeature20 ; + bsbm:productFeature bsbm-inst:ProductFeature21 ; + bsbm:productFeature bsbm-inst:ProductFeature22 ; + bsbm:productFeature bsbm-inst:ProductFeature30 ; + bsbm:producer dataFromProducer2:Producer2 ; + dc:publisher dataFromProducer2:Producer2 ; + dc:date "2002-06-25"^^xsd:date . +dataFromProducer2:Product65 + rdf:type bsbm:Product ; + rdfs:label "illuminator demeanor henhouses" ; + rdfs:comment "niggled deleteriousness ambushes pc chorded organics appeared preferrers shavians impassability evidences dignified fervors stuns outbursts likers chemics antifascism contaminator subserviently maunderer yuan billheads latinizes ferrum sourness spectrums polios penults mealies qophs substituting shipbuilders spinnings topful manfully kris rinks surefootedness bedazzlement rhapsodist naphthous croaking snootier alans quags equated markdowns cameralism realizing ignifying revaluated hymenopteran mockable bennies orbing adhesively soudan intercessory wittier guested avengingly prink inclinometer decomposability gulpy curatively beans remounts reappraise minoring clustering interments mansard lilliputians" ; + rdf:type bsbm-inst:ProductType10 ; + rdf:type bsbm-inst:ProductType3 ; + rdf:type bsbm-inst:ProductType1 ; + bsbm:productPropertyNumeric1 "1964"^^xsd:integer ; + bsbm:productPropertyNumeric2 "473"^^xsd:integer ; + bsbm:productPropertyNumeric3 "96"^^xsd:integer ; + bsbm:productPropertyNumeric5 "691"^^xsd:integer ; + bsbm:productPropertyTextual1 "fistic erupting presidios cassabas recommences"^^xsd:string ; + bsbm:productPropertyTextual2 "bootyless simp hewers"^^xsd:string ; + bsbm:productPropertyTextual3 "exogamic scrambler tourisms administerial instated palings cloistral tucked"^^xsd:string ; + bsbm:productPropertyTextual6 "convener tawdrier morphologies peppily etherify emasculates alongshore disappointing incorrupt contortive unphotographic"^^xsd:string ; + bsbm:productFeature bsbm-inst:ProductFeature369 ; + bsbm:productFeature bsbm-inst:ProductFeature373 ; + bsbm:productFeature bsbm-inst:ProductFeature386 ; + bsbm:productFeature bsbm-inst:ProductFeature391 ; + bsbm:productFeature bsbm-inst:ProductFeature392 ; + bsbm:productFeature bsbm-inst:ProductFeature399 ; + bsbm:productFeature bsbm-inst:ProductFeature405 ; + bsbm:productFeature bsbm-inst:ProductFeature409 ; + bsbm:productFeature bsbm-inst:ProductFeature414 ; + bsbm:productFeature bsbm-inst:ProductFeature40 ; + bsbm:productFeature bsbm-inst:ProductFeature44 ; + bsbm:productFeature bsbm-inst:ProductFeature46 ; + bsbm:productFeature bsbm-inst:ProductFeature49 ; + bsbm:productFeature bsbm-inst:ProductFeature51 ; + bsbm:productFeature bsbm-inst:ProductFeature52 ; + bsbm:productFeature bsbm-inst:ProductFeature55 ; + bsbm:productFeature bsbm-inst:ProductFeature59 ; + bsbm:productFeature bsbm-inst:ProductFeature61 ; + bsbm:productFeature bsbm-inst:ProductFeature64 ; + bsbm:productFeature bsbm-inst:ProductFeature69 ; + bsbm:productFeature bsbm-inst:ProductFeature75 ; + bsbm:productFeature bsbm-inst:ProductFeature76 ; + bsbm:producer dataFromProducer2:Producer2 ; + dc:publisher dataFromProducer2:Producer2 ; + dc:date "2006-02-03"^^xsd:date . +dataFromProducer2:Product66 + rdf:type bsbm:Product ; + rdfs:label "kissably zouave spherically" ; + rdfs:comment "murderers dichotic pokier minuends gushes histing orangeades following teensiest shoelaces quaggier arbitrager gutted bigmouthed honeys unprolific fades strongly cows shoddies osiers exploiting officiary illiteracies cuprites rampages cowages unobscured ordination piney gyrus extinguishing pumpkins triturators prodigies ascending nestled gateways confectioneries dankness carer loather shoppers pretrial evocators haughtily schwa ugsome popcorns donee podgier devolving reneged orbited savaged steerers blamelessness impermeability siameses xenoliths predictability weeded fascial lunatics unsatisfied seducing stinting events imagism shamefacedness tampering currency friskiness misadjusted directing utilise claustrophobe recollections constituencies skimpily bullhorns" ; + rdf:type bsbm-inst:ProductType13 ; + rdf:type bsbm-inst:ProductType3 ; + rdf:type bsbm-inst:ProductType1 ; + bsbm:productPropertyNumeric1 "171"^^xsd:integer ; + bsbm:productPropertyNumeric2 "481"^^xsd:integer ; + bsbm:productPropertyNumeric3 "634"^^xsd:integer ; + bsbm:productPropertyNumeric5 "1013"^^xsd:integer ; + bsbm:productPropertyNumeric6 "897"^^xsd:integer ; + bsbm:productPropertyTextual1 "collarbones destroyers gilds exuding"^^xsd:string ; + bsbm:productPropertyTextual2 "marquees poppets uncovers carobs anchors meatiness porose mispronouncing disapprove recounted dissatisfy yawned poolroom"^^xsd:string ; + bsbm:productPropertyTextual3 "peatier purity baselessly hulloes datelines baler logarithmical rathskeller wingover brittleness psychopathologically aha succumber"^^xsd:string ; + bsbm:productPropertyTextual5 "parables luff reprobes shebangs undiscerning scalpel crawdads poller cowskins"^^xsd:string ; + bsbm:productPropertyTextual6 "resubscribes coted patching aghas quietened"^^xsd:string ; + bsbm:productFeature bsbm-inst:ProductFeature501 ; + bsbm:productFeature bsbm-inst:ProductFeature502 ; + bsbm:productFeature bsbm-inst:ProductFeature508 ; + bsbm:productFeature bsbm-inst:ProductFeature515 ; + bsbm:productFeature bsbm-inst:ProductFeature519 ; + bsbm:productFeature bsbm-inst:ProductFeature520 ; + bsbm:productFeature bsbm-inst:ProductFeature521 ; + bsbm:productFeature bsbm-inst:ProductFeature523 ; + bsbm:productFeature bsbm-inst:ProductFeature524 ; + bsbm:productFeature bsbm-inst:ProductFeature525 ; + bsbm:productFeature bsbm-inst:ProductFeature528 ; + bsbm:productFeature bsbm-inst:ProductFeature529 ; + bsbm:productFeature bsbm-inst:ProductFeature536 ; + bsbm:productFeature bsbm-inst:ProductFeature541 ; + bsbm:productFeature bsbm-inst:ProductFeature542 ; + bsbm:productFeature bsbm-inst:ProductFeature547 ; + bsbm:productFeature bsbm-inst:ProductFeature549 ; + bsbm:productFeature bsbm-inst:ProductFeature553 ; + bsbm:productFeature bsbm-inst:ProductFeature554 ; + bsbm:productFeature bsbm-inst:ProductFeature555 ; + bsbm:productFeature bsbm-inst:ProductFeature557 ; + bsbm:productFeature bsbm-inst:ProductFeature560 ; + bsbm:productFeature bsbm-inst:ProductFeature561 ; + bsbm:productFeature bsbm-inst:ProductFeature564 ; + bsbm:productFeature bsbm-inst:ProductFeature565 ; + bsbm:productFeature bsbm-inst:ProductFeature37 ; + bsbm:productFeature bsbm-inst:ProductFeature39 ; + bsbm:productFeature bsbm-inst:ProductFeature42 ; + bsbm:productFeature bsbm-inst:ProductFeature45 ; + bsbm:productFeature bsbm-inst:ProductFeature55 ; + bsbm:productFeature bsbm-inst:ProductFeature62 ; + bsbm:productFeature bsbm-inst:ProductFeature73 ; + bsbm:productFeature bsbm-inst:ProductFeature76 ; + bsbm:producer dataFromProducer2:Producer2 ; + dc:publisher dataFromProducer2:Producer2 ; + dc:date "2003-02-23"^^xsd:date . +dataFromProducer2:Product67 + rdf:type bsbm:Product ; + rdfs:label "manliest polyethylene cullied" ; + rdfs:comment "mangrove wangler thanatology benchmarked attractants freeboots molded belated montane yardbirds gammas wrongest seamiest butcheries forfeiting jiggling blotters debugs jubilated requiems dalmatian ignorantly nominator acrimonies laundromats romping subsurfaces cotyledonary converts tinkers methinks frenzies blushers twister carbohydrates disassembled titania budless synchronizer plusses incitant sugarcane appointive transgresses portals revolvers superstructures campstools ceremonially ripped fated therapies plugged microbic jiminy creditabilities pederast gospels nearsightedly quitclaimed cellulitis beefsteaks limed citrines reciprocator geomancy scrutinizer mitring stupas sahibs fulfils approves trips portents widowed begriming basses manuevered narcissistically frostings amerce furores pilfering hustled modeller" ; + rdf:type bsbm-inst:ProductType13 ; + rdf:type bsbm-inst:ProductType3 ; + rdf:type bsbm-inst:ProductType1 ; + bsbm:productPropertyNumeric1 "306"^^xsd:integer ; + bsbm:productPropertyNumeric2 "451"^^xsd:integer ; + bsbm:productPropertyNumeric3 "237"^^xsd:integer ; + bsbm:productPropertyTextual1 "victualling bednights fruitless overcautious driveller taiga tiara kismets"^^xsd:string ; + bsbm:productPropertyTextual2 "paganist debrided knucklebone falloffs effortlessness"^^xsd:string ; + bsbm:productPropertyTextual3 "nonfactual cinematographies gadgety scrappiest deviltries interventionism barker potentials"^^xsd:string ; + bsbm:productFeature bsbm-inst:ProductFeature500 ; + bsbm:productFeature bsbm-inst:ProductFeature502 ; + bsbm:productFeature bsbm-inst:ProductFeature509 ; + bsbm:productFeature bsbm-inst:ProductFeature510 ; + bsbm:productFeature bsbm-inst:ProductFeature524 ; + bsbm:productFeature bsbm-inst:ProductFeature534 ; + bsbm:productFeature bsbm-inst:ProductFeature538 ; + bsbm:productFeature bsbm-inst:ProductFeature545 ; + bsbm:productFeature bsbm-inst:ProductFeature546 ; + bsbm:productFeature bsbm-inst:ProductFeature547 ; + bsbm:productFeature bsbm-inst:ProductFeature550 ; + bsbm:productFeature bsbm-inst:ProductFeature551 ; + bsbm:productFeature bsbm-inst:ProductFeature556 ; + bsbm:productFeature bsbm-inst:ProductFeature566 ; + bsbm:productFeature bsbm-inst:ProductFeature567 ; + bsbm:productFeature bsbm-inst:ProductFeature568 ; + bsbm:productFeature bsbm-inst:ProductFeature37 ; + bsbm:productFeature bsbm-inst:ProductFeature38 ; + bsbm:productFeature bsbm-inst:ProductFeature40 ; + bsbm:productFeature bsbm-inst:ProductFeature43 ; + bsbm:productFeature bsbm-inst:ProductFeature46 ; + bsbm:productFeature bsbm-inst:ProductFeature58 ; + bsbm:productFeature bsbm-inst:ProductFeature59 ; + bsbm:productFeature bsbm-inst:ProductFeature74 ; + bsbm:producer dataFromProducer2:Producer2 ; + dc:publisher dataFromProducer2:Producer2 ; + dc:date "2005-11-16"^^xsd:date . +dataFromProducer2:Product68 + rdf:type bsbm:Product ; + rdfs:label "leeched primers" ; + rdfs:comment "bedeviling roofings phonos eulogizing fazing rheological potsherds jingler fiscally triplications morasses aborting intervened lumbers answered fatsoes footlessness pooches salaaming countervails washstands sportier submergence elses alertly suing faucets murderess overages psychotherapies balalaikas bandoleers rugging outnumbering bitters nervousness nondiscriminatory informality misidentified pettifogging impoverisher unprohibited backfills seagoing dishpans lusting smarts cupolaed folks charring inkle anions knighthood lemonades crowbar columbic costumey manometers dualities inexpressiveness blazer untempted gearshifts grizzliest rehinges subtonic acne entre bagworm redistilling identifier marrows psychokineses chorused gelatinously bromidic inherited upreaches girlfriends burliest ireless noncasual automatons crystallographic sacbut infantilism confutable monopolism relics permeating interlaced reformats" ; + rdf:type bsbm-inst:ProductType7 ; + rdf:type bsbm-inst:ProductType2 ; + rdf:type bsbm-inst:ProductType1 ; + bsbm:productPropertyNumeric1 "741"^^xsd:integer ; + bsbm:productPropertyNumeric2 "1885"^^xsd:integer ; + bsbm:productPropertyNumeric3 "166"^^xsd:integer ; + bsbm:productPropertyTextual1 "congregants agitation middens"^^xsd:string ; + bsbm:productPropertyTextual2 "reinfusion fishnet tomtits blustered quipped coevally environmental nonstructural undeclared"^^xsd:string ; + bsbm:productPropertyTextual3 "quizzed intermitting taters bleakness donjons lances amidships exceedingly scaring bookbinder floodplain succor"^^xsd:string ; + bsbm:productPropertyTextual5 "senhor unsurpassable intermezzos blushes"^^xsd:string ; + bsbm:productFeature bsbm-inst:ProductFeature229 ; + bsbm:productFeature bsbm-inst:ProductFeature230 ; + bsbm:productFeature bsbm-inst:ProductFeature232 ; + bsbm:productFeature bsbm-inst:ProductFeature233 ; + bsbm:productFeature bsbm-inst:ProductFeature235 ; + bsbm:productFeature bsbm-inst:ProductFeature252 ; + bsbm:productFeature bsbm-inst:ProductFeature255 ; + bsbm:productFeature bsbm-inst:ProductFeature257 ; + bsbm:productFeature bsbm-inst:ProductFeature258 ; + bsbm:productFeature bsbm-inst:ProductFeature261 ; + bsbm:productFeature bsbm-inst:ProductFeature263 ; + bsbm:productFeature bsbm-inst:ProductFeature264 ; + bsbm:productFeature bsbm-inst:ProductFeature267 ; + bsbm:productFeature bsbm-inst:ProductFeature277 ; + bsbm:productFeature bsbm-inst:ProductFeature283 ; + bsbm:productFeature bsbm-inst:ProductFeature285 ; + bsbm:productFeature bsbm-inst:ProductFeature289 ; + bsbm:productFeature bsbm-inst:ProductFeature1 ; + bsbm:productFeature bsbm-inst:ProductFeature3 ; + bsbm:productFeature bsbm-inst:ProductFeature9 ; + bsbm:productFeature bsbm-inst:ProductFeature11 ; + bsbm:productFeature bsbm-inst:ProductFeature14 ; + bsbm:productFeature bsbm-inst:ProductFeature22 ; + bsbm:productFeature bsbm-inst:ProductFeature23 ; + bsbm:productFeature bsbm-inst:ProductFeature32 ; + bsbm:productFeature bsbm-inst:ProductFeature34 ; + bsbm:producer dataFromProducer2:Producer2 ; + dc:publisher dataFromProducer2:Producer2 ; + dc:date "2006-08-15"^^xsd:date . +dataFromProducer2:Product69 + rdf:type bsbm:Product ; + rdfs:label "spheroids spelunks" ; + rdfs:comment "dismemberment disowning remunerative saris gristlier bung meanies ingulf sultanic demobs lucubrations squirmier joyfullest voodooing guilds basking jointure clinger grapples bastardized aryls transparently scamper conserves humpbacked lividly exalter plumbery zymogenic shorebirds clocks edgily despatcher certainest abased foreigner mannas cheroot binds rebirths sportsmanship seconder louvers tentages malodor pricked supervisal masculinity seismisms spathed interchanging sweatbox indemnitee aphotic embitterments swordsman recalled reversed chapping vizor gabbier curatrices sojourners unknotting conveners unpiling preceptresses reenlistment towboats trots centerfold cambium tarmac postulator photoelectrically haggis deprogrammer sexing readapting northeastward smoothies rehearses hexaploid easing nagger blinked scherzi chestfuls grandmothers intensely laves chiles reconditely plains squooshes guidon rusticly heeled clubfoot reciting zillionth nutrias removable bumboat riprapping oscule versicolored unconscious undulated caraculs cellaret cartographies allurements scalene fluoroscope dopants midgut maps searer boxier reinflames pilfers trowel clinger unvendible enrages recruiting ledgy swearword galumphed ranchman feedlots cliquing flatfeet" ; + rdf:type bsbm-inst:ProductType13 ; + rdf:type bsbm-inst:ProductType3 ; + rdf:type bsbm-inst:ProductType1 ; + bsbm:productPropertyNumeric1 "793"^^xsd:integer ; + bsbm:productPropertyNumeric2 "1322"^^xsd:integer ; + bsbm:productPropertyNumeric3 "756"^^xsd:integer ; + bsbm:productPropertyNumeric6 "130"^^xsd:integer ; + bsbm:productPropertyTextual1 "whoso nudum postorbital triers shapable platesful adman sidlers overdoing melancholiac unfeigned gobbled"^^xsd:string ; + bsbm:productPropertyTextual2 "oversteps chromizing rotgut longes intervals sublimest"^^xsd:string ; + bsbm:productPropertyTextual3 "assigns bits mulched curator banksides gorging pogroming hearsed frug frugality"^^xsd:string ; + bsbm:productFeature bsbm-inst:ProductFeature504 ; + bsbm:productFeature bsbm-inst:ProductFeature511 ; + bsbm:productFeature bsbm-inst:ProductFeature512 ; + bsbm:productFeature bsbm-inst:ProductFeature519 ; + bsbm:productFeature bsbm-inst:ProductFeature525 ; + bsbm:productFeature bsbm-inst:ProductFeature527 ; + bsbm:productFeature bsbm-inst:ProductFeature529 ; + bsbm:productFeature bsbm-inst:ProductFeature531 ; + bsbm:productFeature bsbm-inst:ProductFeature533 ; + bsbm:productFeature bsbm-inst:ProductFeature535 ; + bsbm:productFeature bsbm-inst:ProductFeature539 ; + bsbm:productFeature bsbm-inst:ProductFeature546 ; + bsbm:productFeature bsbm-inst:ProductFeature552 ; + bsbm:productFeature bsbm-inst:ProductFeature558 ; + bsbm:productFeature bsbm-inst:ProductFeature563 ; + bsbm:productFeature bsbm-inst:ProductFeature564 ; + bsbm:productFeature bsbm-inst:ProductFeature46 ; + bsbm:productFeature bsbm-inst:ProductFeature50 ; + bsbm:productFeature bsbm-inst:ProductFeature60 ; + bsbm:productFeature bsbm-inst:ProductFeature64 ; + bsbm:productFeature bsbm-inst:ProductFeature65 ; + bsbm:productFeature bsbm-inst:ProductFeature66 ; + bsbm:productFeature bsbm-inst:ProductFeature69 ; + bsbm:producer dataFromProducer2:Producer2 ; + dc:publisher dataFromProducer2:Producer2 ; + dc:date "2005-01-26"^^xsd:date . +dataFromProducer2:Product70 + rdf:type bsbm:Product ; + rdfs:label "lettering sardonyxes" ; + rdfs:comment "pockmarks counterbalances cupbearer nonpareils utilizer mutining pourers garnishable disrespectfully upshifts electroscope escallops flushing frustration autoclaves champs leninists hussar complicated mumper microprogram anastomoses hogfish bicyclists blowguns washers wails spiritually sequencing mulcts frowsty telemetries wackily pentathlons wellness frisson anatomizes sociopaths obstetrician biasedly adeptness invented overcommon anodynes coxwaining furriners uncontestable eaglets arcadias tarter invalidates ampulla auditioning hoboism certainest garottes misanthropy hammer consummatory packagers taximen anodyne tattooing bahts longhaired abstractionists escalators exordium subspace wavily freakier concaves disavowals unexpectedly spelldowns huckstered timbales refinished financing hotfoot eugenicist preassigned grits metals decameters selfs erigerons keloids recommend" ; + rdf:type bsbm-inst:ProductType15 ; + rdf:type bsbm-inst:ProductType4 ; + rdf:type bsbm-inst:ProductType1 ; + bsbm:productPropertyNumeric1 "294"^^xsd:integer ; + bsbm:productPropertyNumeric2 "961"^^xsd:integer ; + bsbm:productPropertyNumeric3 "239"^^xsd:integer ; + bsbm:productPropertyNumeric5 "310"^^xsd:integer ; + bsbm:productPropertyTextual1 "seduced internationals unmollified gavots tempters"^^xsd:string ; + bsbm:productPropertyTextual2 "ideation localizing gushy commanded inebrious snarled unendangered purism betting mortification"^^xsd:string ; + bsbm:productPropertyTextual3 "theatricals complimenting caudillo skippering injuring gastight blasphemers arsenous intercepted volleyers lineable"^^xsd:string ; + bsbm:productPropertyTextual4 "yews auberges crudity quintillionths chemotropism"^^xsd:string ; + bsbm:productFeature bsbm-inst:ProductFeature616 ; + bsbm:productFeature bsbm-inst:ProductFeature622 ; + bsbm:productFeature bsbm-inst:ProductFeature625 ; + bsbm:productFeature bsbm-inst:ProductFeature632 ; + bsbm:productFeature bsbm-inst:ProductFeature639 ; + bsbm:productFeature bsbm-inst:ProductFeature640 ; + bsbm:productFeature bsbm-inst:ProductFeature643 ; + bsbm:productFeature bsbm-inst:ProductFeature644 ; + bsbm:productFeature bsbm-inst:ProductFeature646 ; + bsbm:productFeature bsbm-inst:ProductFeature653 ; + bsbm:productFeature bsbm-inst:ProductFeature655 ; + bsbm:productFeature bsbm-inst:ProductFeature658 ; + bsbm:productFeature bsbm-inst:ProductFeature664 ; + bsbm:productFeature bsbm-inst:ProductFeature665 ; + bsbm:productFeature bsbm-inst:ProductFeature668 ; + bsbm:productFeature bsbm-inst:ProductFeature669 ; + bsbm:productFeature bsbm-inst:ProductFeature673 ; + bsbm:productFeature bsbm-inst:ProductFeature677 ; + bsbm:productFeature bsbm-inst:ProductFeature678 ; + bsbm:productFeature bsbm-inst:ProductFeature679 ; + bsbm:productFeature bsbm-inst:ProductFeature680 ; + bsbm:productFeature bsbm-inst:ProductFeature79 ; + bsbm:productFeature bsbm-inst:ProductFeature81 ; + bsbm:productFeature bsbm-inst:ProductFeature87 ; + bsbm:productFeature bsbm-inst:ProductFeature88 ; + bsbm:productFeature bsbm-inst:ProductFeature90 ; + bsbm:productFeature bsbm-inst:ProductFeature97 ; + bsbm:productFeature bsbm-inst:ProductFeature103 ; + bsbm:productFeature bsbm-inst:ProductFeature106 ; + bsbm:productFeature bsbm-inst:ProductFeature107 ; + bsbm:productFeature bsbm-inst:ProductFeature111 ; + bsbm:productFeature bsbm-inst:ProductFeature113 ; + bsbm:productFeature bsbm-inst:ProductFeature120 ; + bsbm:productFeature bsbm-inst:ProductFeature123 ; + bsbm:productFeature bsbm-inst:ProductFeature127 ; + bsbm:productFeature bsbm-inst:ProductFeature128 ; + bsbm:productFeature bsbm-inst:ProductFeature135 ; + bsbm:productFeature bsbm-inst:ProductFeature137 ; + bsbm:producer dataFromProducer2:Producer2 ; + dc:publisher dataFromProducer2:Producer2 ; + dc:date "2002-08-26"^^xsd:date . +dataFromProducer2:Product71 + rdf:type bsbm:Product ; + rdfs:label "anesthesiologist" ; + rdfs:comment "twiddling broils hindi prodigally siltiest fuller banditries anticyclonic indign shirking antihypertensive coiffes campagne distributorship prophesiers pumas pacer arboreta dieback defibrillate seventies rehinging fores lachrymator middlebrow cockscombs coastwise answerer ureters quotations geodesists uncongenial sibilantly avoids asps papuan overtime horah displeases tores boomeranged conflicts skink crawfishes predispositions virology pupils renewability whap enraptures unconnected besmeared performable shadows flatness cursed ejaculation scabbiness carnelian growling routinizing philtering elucidations" ; + rdf:type bsbm-inst:ProductType11 ; + rdf:type bsbm-inst:ProductType3 ; + rdf:type bsbm-inst:ProductType1 ; + bsbm:productPropertyNumeric1 "413"^^xsd:integer ; + bsbm:productPropertyNumeric2 "637"^^xsd:integer ; + bsbm:productPropertyNumeric3 "590"^^xsd:integer ; + bsbm:productPropertyNumeric6 "20"^^xsd:integer ; + bsbm:productPropertyTextual1 "excreted libbing hoofbeats thirdly shunpike wondering perishability"^^xsd:string ; + bsbm:productPropertyTextual2 "skilful predictability incommunicative invocator bights subverters"^^xsd:string ; + bsbm:productPropertyTextual3 "tressy undermost cosies backstrokes plazas conventionalized ninon handwheel overgarment arbitrates bypasses dunnage"^^xsd:string ; + bsbm:productFeature bsbm-inst:ProductFeature426 ; + bsbm:productFeature bsbm-inst:ProductFeature432 ; + bsbm:productFeature bsbm-inst:ProductFeature436 ; + bsbm:productFeature bsbm-inst:ProductFeature441 ; + bsbm:productFeature bsbm-inst:ProductFeature445 ; + bsbm:productFeature bsbm-inst:ProductFeature447 ; + bsbm:productFeature bsbm-inst:ProductFeature448 ; + bsbm:productFeature bsbm-inst:ProductFeature449 ; + bsbm:productFeature bsbm-inst:ProductFeature40 ; + bsbm:productFeature bsbm-inst:ProductFeature57 ; + bsbm:productFeature bsbm-inst:ProductFeature58 ; + bsbm:productFeature bsbm-inst:ProductFeature60 ; + bsbm:productFeature bsbm-inst:ProductFeature63 ; + bsbm:productFeature bsbm-inst:ProductFeature64 ; + bsbm:productFeature bsbm-inst:ProductFeature66 ; + bsbm:productFeature bsbm-inst:ProductFeature68 ; + bsbm:productFeature bsbm-inst:ProductFeature73 ; + bsbm:productFeature bsbm-inst:ProductFeature74 ; + bsbm:productFeature bsbm-inst:ProductFeature75 ; + bsbm:producer dataFromProducer2:Producer2 ; + dc:publisher dataFromProducer2:Producer2 ; + dc:date "2006-01-18"^^xsd:date . +dataFromProducer2:Product72 + rdf:type bsbm:Product ; + rdfs:label "preadolescents unlettable flexibly" ; + rdfs:comment "hilariousness bowwows tweezes jatos premarital importable mammae overpay loanable xylography welter hackling recognitions maleness aggrieving antiquely passaged atween unwillingness thrillers tillers shocker enflaming gemmologist invasions latencies colouring honorifics idealogue pennyweight trois sieges tiglon soundness anklet facets recelebrated egis fibbers unpedigreed tactfully throttling maligners decrowns scrimpy regardful uncannily replay hibiscuses togglers nonfascists beefeaters sponsorship tautly candying lumbering foresee inflection decoyers satirizer rumoring wifehood donned infernally buxomer belittling accuser kneaders" ; + rdf:type bsbm-inst:ProductType8 ; + rdf:type bsbm-inst:ProductType2 ; + rdf:type bsbm-inst:ProductType1 ; + bsbm:productPropertyNumeric1 "1381"^^xsd:integer ; + bsbm:productPropertyNumeric2 "150"^^xsd:integer ; + bsbm:productPropertyNumeric3 "1907"^^xsd:integer ; + bsbm:productPropertyTextual1 "montanan corotate easters witticism psychomotor"^^xsd:string ; + bsbm:productPropertyTextual2 "precleans admirable excommunications unconstitutionally succeeding evolutions slopes stilton renewers readiest falsifications fidgeter modula applauded"^^xsd:string ; + bsbm:productPropertyTextual3 "squabbles xylotomy submerges swahilian adsorbing incapacious skimming symbolize objective haloing"^^xsd:string ; + bsbm:productPropertyTextual4 "unpacked miterer misadvised plucker"^^xsd:string ; + bsbm:productFeature bsbm-inst:ProductFeature291 ; + bsbm:productFeature bsbm-inst:ProductFeature294 ; + bsbm:productFeature bsbm-inst:ProductFeature296 ; + bsbm:productFeature bsbm-inst:ProductFeature297 ; + bsbm:productFeature bsbm-inst:ProductFeature298 ; + bsbm:productFeature bsbm-inst:ProductFeature309 ; + bsbm:productFeature bsbm-inst:ProductFeature312 ; + bsbm:productFeature bsbm-inst:ProductFeature313 ; + bsbm:productFeature bsbm-inst:ProductFeature314 ; + bsbm:productFeature bsbm-inst:ProductFeature317 ; + bsbm:productFeature bsbm-inst:ProductFeature321 ; + bsbm:productFeature bsbm-inst:ProductFeature322 ; + bsbm:productFeature bsbm-inst:ProductFeature324 ; + bsbm:productFeature bsbm-inst:ProductFeature5 ; + bsbm:productFeature bsbm-inst:ProductFeature8 ; + bsbm:productFeature bsbm-inst:ProductFeature11 ; + bsbm:productFeature bsbm-inst:ProductFeature14 ; + bsbm:productFeature bsbm-inst:ProductFeature19 ; + bsbm:productFeature bsbm-inst:ProductFeature22 ; + bsbm:productFeature bsbm-inst:ProductFeature30 ; + bsbm:productFeature bsbm-inst:ProductFeature31 ; + bsbm:producer dataFromProducer2:Producer2 ; + dc:publisher dataFromProducer2:Producer2 ; + dc:date "2006-11-22"^^xsd:date . +dataFromProducer2:Product73 + rdf:type bsbm:Product ; + rdfs:label "undervalue hydraulically litmuses" ; + rdfs:comment "curdier gofers boodled dulcetly wheelers brainwashing tuxes stagnates spinners euphemistically telesis rudest pilaf civilly accordionists cerebrally toboggans abyssal parents jagged promenader precipitously clocked parfaits unendingly supper napery boatable balked cartooned newsrooms ariose cogwheel radiolucencies worded noncohesiveness conformism loveably eyelashes jobs systematize thermoses speedster unpremeditated customhouses deliberation reviler testifier concatenating minorities acidifiable tumidity surfboard unipod ladled dorsals natalities prizing baileys emanator nonpareil cosmochemistry seemly feyer rearouses lutherans ululation bookracks fertilize coequally holily silently hod grafter times croaks crayoned gonadal ingrafted arcadians deficiently" ; + rdf:type bsbm-inst:ProductType11 ; + rdf:type bsbm-inst:ProductType3 ; + rdf:type bsbm-inst:ProductType1 ; + bsbm:productPropertyNumeric1 "26"^^xsd:integer ; + bsbm:productPropertyNumeric2 "1330"^^xsd:integer ; + bsbm:productPropertyNumeric3 "1495"^^xsd:integer ; + bsbm:productPropertyNumeric4 "1180"^^xsd:integer ; + bsbm:productPropertyNumeric5 "49"^^xsd:integer ; + bsbm:productPropertyTextual1 "chastises callbacks quahaugs tartuffe unburned"^^xsd:string ; + bsbm:productPropertyTextual2 "induration ceased salivates bronchopneumonia itching continuousness spikiest exterminating"^^xsd:string ; + bsbm:productPropertyTextual3 "modernly knowers reconditioning bluebooks maniples jingoes infecters settlements woefulness presences manifoldness frond subpoenal imbrued baryon"^^xsd:string ; + bsbm:productPropertyTextual4 "reinvigorated laminating editorials nosebands chaines brads"^^xsd:string ; + bsbm:productPropertyTextual5 "daubs toupees collapses taunter cordilleras diagnosticians staleness optical neonatology rinks gangrel fawns reinfusion"^^xsd:string ; + bsbm:productFeature bsbm-inst:ProductFeature420 ; + bsbm:productFeature bsbm-inst:ProductFeature422 ; + bsbm:productFeature bsbm-inst:ProductFeature429 ; + bsbm:productFeature bsbm-inst:ProductFeature430 ; + bsbm:productFeature bsbm-inst:ProductFeature438 ; + bsbm:productFeature bsbm-inst:ProductFeature440 ; + bsbm:productFeature bsbm-inst:ProductFeature442 ; + bsbm:productFeature bsbm-inst:ProductFeature443 ; + bsbm:productFeature bsbm-inst:ProductFeature445 ; + bsbm:productFeature bsbm-inst:ProductFeature446 ; + bsbm:productFeature bsbm-inst:ProductFeature450 ; + bsbm:productFeature bsbm-inst:ProductFeature452 ; + bsbm:productFeature bsbm-inst:ProductFeature42 ; + bsbm:productFeature bsbm-inst:ProductFeature53 ; + bsbm:productFeature bsbm-inst:ProductFeature55 ; + bsbm:productFeature bsbm-inst:ProductFeature60 ; + bsbm:producer dataFromProducer2:Producer2 ; + dc:publisher dataFromProducer2:Producer2 ; + dc:date "2002-11-04"^^xsd:date . +dataFromProducer2:Product74 + rdf:type bsbm:Product ; + rdfs:label "embow" ; + rdfs:comment "chortler firebox unweaving stators fluffiest tasselled mollified potfuls moonstone landslid subliminally flockings nonfactually altars hybridism sardinian invertors cuspidated languished worrier caking tramell fumbling minify compoundable metricized yeomen unmuzzles manifestoed spectrometries misheard publishers spreads palps communing algonquins rushingly incitants modulated skydivers trestles provoked wisecrackers sateen signalling callboy prepacked flyweights meritable tidiest spilling seige" ; + rdf:type bsbm-inst:ProductType7 ; + rdf:type bsbm-inst:ProductType2 ; + rdf:type bsbm-inst:ProductType1 ; + bsbm:productPropertyNumeric1 "653"^^xsd:integer ; + bsbm:productPropertyNumeric2 "1293"^^xsd:integer ; + bsbm:productPropertyNumeric3 "1265"^^xsd:integer ; + bsbm:productPropertyNumeric6 "297"^^xsd:integer ; + bsbm:productPropertyTextual1 "festoon leverages hugs disburdened recalculation huzza valency divorceable tartuffes diviner overfly politicoes"^^xsd:string ; + bsbm:productPropertyTextual2 "trichloromethanes alliterations cornels scatophagies enflame sabering wholisms calfs hotfoots natively"^^xsd:string ; + bsbm:productPropertyTextual3 "midiron honkie nearliest liberties snugging dognap occiputs"^^xsd:string ; + bsbm:productFeature bsbm-inst:ProductFeature225 ; + bsbm:productFeature bsbm-inst:ProductFeature227 ; + bsbm:productFeature bsbm-inst:ProductFeature237 ; + bsbm:productFeature bsbm-inst:ProductFeature238 ; + bsbm:productFeature bsbm-inst:ProductFeature248 ; + bsbm:productFeature bsbm-inst:ProductFeature258 ; + bsbm:productFeature bsbm-inst:ProductFeature260 ; + bsbm:productFeature bsbm-inst:ProductFeature263 ; + bsbm:productFeature bsbm-inst:ProductFeature264 ; + bsbm:productFeature bsbm-inst:ProductFeature266 ; + bsbm:productFeature bsbm-inst:ProductFeature267 ; + bsbm:productFeature bsbm-inst:ProductFeature270 ; + bsbm:productFeature bsbm-inst:ProductFeature274 ; + bsbm:productFeature bsbm-inst:ProductFeature282 ; + bsbm:productFeature bsbm-inst:ProductFeature4 ; + bsbm:productFeature bsbm-inst:ProductFeature16 ; + bsbm:productFeature bsbm-inst:ProductFeature17 ; + bsbm:productFeature bsbm-inst:ProductFeature23 ; + bsbm:productFeature bsbm-inst:ProductFeature26 ; + bsbm:producer dataFromProducer2:Producer2 ; + dc:publisher dataFromProducer2:Producer2 ; + dc:date "2001-01-08"^^xsd:date . +dataFromProducer2:Product75 + rdf:type bsbm:Product ; + rdfs:label "anoxias fruiter" ; + rdfs:comment "umiaks robed banderole papistry brownout counselled sublevels punker distinctively lithologic haver kitsch validations monograph dangerously ghastliness bouncer overfanciful watered paternalistic chewers legislates mashies sublets senilities reinvestigating sutler quadrillionths ubiquitously exercising luckies capableness vaginally coarsest disequilibria diagrammed shiftily septaugintal purities gambians fertilities muffed haunches crazies remunerative dusks clayware winkers smouldered plagiarizers disburses lollygag jettied assuagements hostilities micros openwork disentailment teasingly sergeantship gulling regionalist consumes hurdles unwrinkles oswego ruiner" ; + rdf:type bsbm-inst:ProductType11 ; + rdf:type bsbm-inst:ProductType3 ; + rdf:type bsbm-inst:ProductType1 ; + bsbm:productPropertyNumeric1 "294"^^xsd:integer ; + bsbm:productPropertyNumeric2 "1138"^^xsd:integer ; + bsbm:productPropertyNumeric3 "580"^^xsd:integer ; + bsbm:productPropertyNumeric5 "443"^^xsd:integer ; + bsbm:productPropertyTextual1 "foaling sects twinned audiometry musters"^^xsd:string ; + bsbm:productPropertyTextual2 "electroencephalograms copartner rattled calcined tinkerers ouzos nepotisms throated nonmoral"^^xsd:string ; + bsbm:productPropertyTextual3 "foresightedly glared clouts malignity reappoints drubber wafter heirloom cornucopiate copolymerizing plotter underbidder unresponsive admirations"^^xsd:string ; + bsbm:productPropertyTextual6 "excommunicators poperies revaluated idiomatically cecum hyperkinesia propellent spillways"^^xsd:string ; + bsbm:productFeature bsbm-inst:ProductFeature417 ; + bsbm:productFeature bsbm-inst:ProductFeature418 ; + bsbm:productFeature bsbm-inst:ProductFeature419 ; + bsbm:productFeature bsbm-inst:ProductFeature426 ; + bsbm:productFeature bsbm-inst:ProductFeature428 ; + bsbm:productFeature bsbm-inst:ProductFeature429 ; + bsbm:productFeature bsbm-inst:ProductFeature432 ; + bsbm:productFeature bsbm-inst:ProductFeature438 ; + bsbm:productFeature bsbm-inst:ProductFeature440 ; + bsbm:productFeature bsbm-inst:ProductFeature441 ; + bsbm:productFeature bsbm-inst:ProductFeature449 ; + bsbm:productFeature bsbm-inst:ProductFeature450 ; + bsbm:productFeature bsbm-inst:ProductFeature451 ; + bsbm:productFeature bsbm-inst:ProductFeature38 ; + bsbm:productFeature bsbm-inst:ProductFeature39 ; + bsbm:productFeature bsbm-inst:ProductFeature51 ; + bsbm:productFeature bsbm-inst:ProductFeature54 ; + bsbm:productFeature bsbm-inst:ProductFeature57 ; + bsbm:productFeature bsbm-inst:ProductFeature58 ; + bsbm:producer dataFromProducer2:Producer2 ; + dc:publisher dataFromProducer2:Producer2 ; + dc:date "2001-05-05"^^xsd:date . +dataFromProducer2:Product76 + rdf:type bsbm:Product ; + rdfs:label "channels programme" ; + rdfs:comment "vaulting chowdered vuggs knottily beddable misdealt peanuts watcher hatpin stodging jerseyed retrievable brackets cabala doily soliloquies sedation shadings forints intensely kepi unrewarded nonresistants sheeter spellbinding pettifog cattiest ochres reenlarges qualification coitus readmittance minder mesmerized damosel lauras rankings solicitors submissively promodern tautened cathouse visitational arbitrational louses dismortgage nevadians weskit advantaging concordats mansards disorganizes gerontological balking microstate adorers annotating cogitative obligee desponds poisers wiled besmear honeydews mammy steno muscats quarreled imprimaturs emblazoning bearded slopping rebait specification diademed inoculations scantiness banditries archings unsurprised thunderclouds cuckoos coaxes impeachers soleprint henbits depolarizers distinctly reverberates retranslated botanized ravishments" ; + rdf:type bsbm-inst:ProductType18 ; + rdf:type bsbm-inst:ProductType5 ; + rdf:type bsbm-inst:ProductType1 ; + bsbm:productPropertyNumeric1 "244"^^xsd:integer ; + bsbm:productPropertyNumeric2 "9"^^xsd:integer ; + bsbm:productPropertyNumeric3 "562"^^xsd:integer ; + bsbm:productPropertyNumeric4 "855"^^xsd:integer ; + bsbm:productPropertyNumeric5 "873"^^xsd:integer ; + bsbm:productPropertyTextual1 "homeopathic monikers marimbas oolongs cageyness cementation gimcrack"^^xsd:string ; + bsbm:productPropertyTextual2 "careering engorging greco subcellar brachydactylia"^^xsd:string ; + bsbm:productPropertyTextual3 "masoned exhumes causticity tactical sweatshops tediums"^^xsd:string ; + bsbm:productPropertyTextual4 "ontogenesis immaterialness forefeet teargassed dressmaking parlayer sensoriums reconverted preadjustments disinters disordered undecayed"^^xsd:string ; + bsbm:productPropertyTextual5 "frisian chamfering drownds narcissistic countersigning drachms astounded pegmatite vituperative activated philosophers privately inerts slue"^^xsd:string ; + bsbm:productFeature bsbm-inst:ProductFeature822 ; + bsbm:productFeature bsbm-inst:ProductFeature827 ; + bsbm:productFeature bsbm-inst:ProductFeature831 ; + bsbm:productFeature bsbm-inst:ProductFeature850 ; + bsbm:productFeature bsbm-inst:ProductFeature852 ; + bsbm:productFeature bsbm-inst:ProductFeature854 ; + bsbm:productFeature bsbm-inst:ProductFeature855 ; + bsbm:productFeature bsbm-inst:ProductFeature142 ; + bsbm:productFeature bsbm-inst:ProductFeature145 ; + bsbm:productFeature bsbm-inst:ProductFeature146 ; + bsbm:productFeature bsbm-inst:ProductFeature147 ; + bsbm:productFeature bsbm-inst:ProductFeature150 ; + bsbm:productFeature bsbm-inst:ProductFeature157 ; + bsbm:productFeature bsbm-inst:ProductFeature160 ; + bsbm:productFeature bsbm-inst:ProductFeature170 ; + bsbm:productFeature bsbm-inst:ProductFeature176 ; + bsbm:productFeature bsbm-inst:ProductFeature177 ; + bsbm:productFeature bsbm-inst:ProductFeature178 ; + bsbm:productFeature bsbm-inst:ProductFeature179 ; + bsbm:productFeature bsbm-inst:ProductFeature180 ; + bsbm:producer dataFromProducer2:Producer2 ; + dc:publisher dataFromProducer2:Producer2 ; + dc:date "2003-04-12"^^xsd:date . +dataFromProducer2:Product77 + rdf:type bsbm:Product ; + rdfs:label "mistaker impieties homeliest" ; + rdfs:comment "milkiest copilots manuevers afferently vascularities overbite alluvia misdemeanant serologic jingoes widgets skidooed resonates lissomely ariel nucleoprotein forksful decrees forgoer dubbed recheck hymnaries instating dibber dissociated underemphasizing impersonality tacked rioting surreptitiously years whisky lunarians troopers warheads pontius toothsomeness lingeries undershot twirled chainlike rodenticide escaloped cockier etagere disrobers histamins analysed immunologists lands glops calliopes sagos misadventure tenderize filmcards agglutinating coronets surcharged deleted leeches overtakes overtaxed monetized embezzlement annat frighteningly beanies excogitate transmits decriminalization underparts menacers tuns blubbering defunctness marshaling subsidizes plannings webfeet proprietorships diagramed bandwidths modernest credentials unappealing eclats mechanists termers neckerchiefs sociologically florists trends vatting grittiness elvish starkly plotters herniating tincting apes perfections elaborations snaffles forgathered drifty lunets laserjet redemptional bollix docksides aggressed golgothas languished slipup smeller confessional juxtapositions individuals terrorization disturbers jazzer macadams rustics nonethically preestimates prancing plumped overeating bullpen wearable nonofficially loathsomeness inexpressibility dovish bayoneting apostasy interloper savageness driftpins pumper rebec boggling dinkies lunation vignettists seriating perceptually floaty" ; + rdf:type bsbm-inst:ProductType17 ; + rdf:type bsbm-inst:ProductType4 ; + rdf:type bsbm-inst:ProductType1 ; + bsbm:productPropertyNumeric1 "904"^^xsd:integer ; + bsbm:productPropertyNumeric2 "1038"^^xsd:integer ; + bsbm:productPropertyNumeric3 "429"^^xsd:integer ; + bsbm:productPropertyNumeric4 "1813"^^xsd:integer ; + bsbm:productPropertyNumeric5 "322"^^xsd:integer ; + bsbm:productPropertyTextual1 "affirmably aimlessness saccharin beloved unpiles peons shoots intolerance haver vivisection schizoidism talebearer brevier oxymoron"^^xsd:string ; + bsbm:productPropertyTextual2 "stoats regulators quarrelling articulations settings silkscreened"^^xsd:string ; + bsbm:productPropertyTextual3 "denouncement enfranchisements heliotherapies unwieldier cosmopolis subdistrict daytimes gams fungiform traitoress"^^xsd:string ; + bsbm:productPropertyTextual4 "amaranths crawlier gravitated hewable honeyed somewhats"^^xsd:string ; + bsbm:productPropertyTextual5 "souchong wardships prefigured gigatons boldest tillable yamuns saree xanthates demos sternest"^^xsd:string ; + bsbm:productFeature bsbm-inst:ProductFeature750 ; + bsbm:productFeature bsbm-inst:ProductFeature751 ; + bsbm:productFeature bsbm-inst:ProductFeature752 ; + bsbm:productFeature bsbm-inst:ProductFeature753 ; + bsbm:productFeature bsbm-inst:ProductFeature754 ; + bsbm:productFeature bsbm-inst:ProductFeature758 ; + bsbm:productFeature bsbm-inst:ProductFeature762 ; + bsbm:productFeature bsbm-inst:ProductFeature767 ; + bsbm:productFeature bsbm-inst:ProductFeature768 ; + bsbm:productFeature bsbm-inst:ProductFeature770 ; + bsbm:productFeature bsbm-inst:ProductFeature773 ; + bsbm:productFeature bsbm-inst:ProductFeature781 ; + bsbm:productFeature bsbm-inst:ProductFeature782 ; + bsbm:productFeature bsbm-inst:ProductFeature791 ; + bsbm:productFeature bsbm-inst:ProductFeature794 ; + bsbm:productFeature bsbm-inst:ProductFeature795 ; + bsbm:productFeature bsbm-inst:ProductFeature796 ; + bsbm:productFeature bsbm-inst:ProductFeature802 ; + bsbm:productFeature bsbm-inst:ProductFeature804 ; + bsbm:productFeature bsbm-inst:ProductFeature805 ; + bsbm:productFeature bsbm-inst:ProductFeature806 ; + bsbm:productFeature bsbm-inst:ProductFeature810 ; + bsbm:productFeature bsbm-inst:ProductFeature83 ; + bsbm:productFeature bsbm-inst:ProductFeature86 ; + bsbm:productFeature bsbm-inst:ProductFeature87 ; + bsbm:productFeature bsbm-inst:ProductFeature90 ; + bsbm:productFeature bsbm-inst:ProductFeature91 ; + bsbm:productFeature bsbm-inst:ProductFeature95 ; + bsbm:productFeature bsbm-inst:ProductFeature96 ; + bsbm:productFeature bsbm-inst:ProductFeature97 ; + bsbm:productFeature bsbm-inst:ProductFeature98 ; + bsbm:productFeature bsbm-inst:ProductFeature100 ; + bsbm:productFeature bsbm-inst:ProductFeature101 ; + bsbm:productFeature bsbm-inst:ProductFeature102 ; + bsbm:productFeature bsbm-inst:ProductFeature104 ; + bsbm:productFeature bsbm-inst:ProductFeature106 ; + bsbm:productFeature bsbm-inst:ProductFeature108 ; + bsbm:productFeature bsbm-inst:ProductFeature121 ; + bsbm:productFeature bsbm-inst:ProductFeature127 ; + bsbm:productFeature bsbm-inst:ProductFeature134 ; + bsbm:productFeature bsbm-inst:ProductFeature140 ; + bsbm:producer dataFromProducer2:Producer2 ; + dc:publisher dataFromProducer2:Producer2 ; + dc:date "2005-09-09"^^xsd:date . +dataFromProducer2:Product78 + rdf:type bsbm:Product ; + rdfs:label "tremulously adores enspheres" ; + rdfs:comment "validated metazoan anchorites preempted logicians parities postured underexposing mussing reforest resettings abuttals deterrer purebred precesses quae substituting subsets amender spellbind tidally outfighting discord leafworms refiltering maladministration appealingly overgrow motionlessness unaimed dotards moseying contingence upcurve extortionists eternally moilers obtained thrummy chafferers wedder turtledoves mushed undecayed mesomorphic transitional disencumber overclouding minuets sequestrated mycelial invigorator vers quantifying schooldays encoder jackeroo fricassee burbled excommunicators newspeak caravansary ideations foaled squirmed occultly aviates premeditates marries fractions foundlings beanie commencements superfluities alleviation fifthly cacciatore burners bombs reenlisted moderately hatefulness preponderates pertussis spearman confirmor tugger curseder refuter puppetries eclecticism hallucinative horned exclusivity nickles baulkier hasta pinnace gatepost bristly empires tameness prefabricates drupelet tenoned eglantines unrighteous nonodorous perspiratory smoggy swanned redistrict dulcets hydrologic profanations baptise fixative fragmented contentions leaseless hunched shifts adjoints bugs earnests adaptors" ; + rdf:type bsbm-inst:ProductType7 ; + rdf:type bsbm-inst:ProductType2 ; + rdf:type bsbm-inst:ProductType1 ; + bsbm:productPropertyNumeric1 "1279"^^xsd:integer ; + bsbm:productPropertyNumeric2 "1182"^^xsd:integer ; + bsbm:productPropertyNumeric3 "432"^^xsd:integer ; + bsbm:productPropertyTextual1 "degrades dialogged presentence photostat consumptively mummify missus snorting tupped"^^xsd:string ; + bsbm:productPropertyTextual2 "ope unreproved determinants spacewalker shakily illiteracies stylizers spired deciduously winepress semiyearly adjustor loutish"^^xsd:string ; + bsbm:productPropertyTextual3 "tortures rikshaw dockages"^^xsd:string ; + bsbm:productFeature bsbm-inst:ProductFeature226 ; + bsbm:productFeature bsbm-inst:ProductFeature227 ; + bsbm:productFeature bsbm-inst:ProductFeature229 ; + bsbm:productFeature bsbm-inst:ProductFeature230 ; + bsbm:productFeature bsbm-inst:ProductFeature237 ; + bsbm:productFeature bsbm-inst:ProductFeature242 ; + bsbm:productFeature bsbm-inst:ProductFeature244 ; + bsbm:productFeature bsbm-inst:ProductFeature278 ; + bsbm:productFeature bsbm-inst:ProductFeature281 ; + bsbm:productFeature bsbm-inst:ProductFeature285 ; + bsbm:productFeature bsbm-inst:ProductFeature286 ; + bsbm:productFeature bsbm-inst:ProductFeature289 ; + bsbm:productFeature bsbm-inst:ProductFeature3 ; + bsbm:productFeature bsbm-inst:ProductFeature4 ; + bsbm:productFeature bsbm-inst:ProductFeature6 ; + bsbm:productFeature bsbm-inst:ProductFeature15 ; + bsbm:productFeature bsbm-inst:ProductFeature22 ; + bsbm:productFeature bsbm-inst:ProductFeature24 ; + bsbm:productFeature bsbm-inst:ProductFeature25 ; + bsbm:productFeature bsbm-inst:ProductFeature29 ; + bsbm:productFeature bsbm-inst:ProductFeature32 ; + bsbm:productFeature bsbm-inst:ProductFeature33 ; + bsbm:producer dataFromProducer2:Producer2 ; + dc:publisher dataFromProducer2:Producer2 ; + dc:date "2004-12-04"^^xsd:date . +dataFromProducer2:Product79 + rdf:type bsbm:Product ; + rdfs:label "extincting" ; + rdfs:comment "congruence applaudable chimps horseflies fanes sudsy battleship bespattered manful blanketing woeness totting bestializing encystments seared melodizing brownout hopeless scholium witnessable ancients coeducationally boonies intimidated oneness hosts fricasseed wagoner gabling inspires cooperator unacceptable thonged furbishes imperiously stalag usurping flacon interregnums desolating uncleaned centavo coombs adiposity junkers kerns vaunty electorally gelled longhaired falcons tryingly geologist inexpertly antitrust pestering underproduction downpours neonatally refresher palps infections gemology interpretative novae besieges dewier subtreasuries felicitation yugoslavian cubby bamboozler nailer excursiveness avidness stateless disputed harmonizes volvox pulsed trackers coprocessing hepatic pc revisals moonshots slummiest hebraists enlighten pommels reacquisition pulpiest castles grafting recaller indigoes irredeemability splitting sportier schoolmistresses castrati trimorphs shiatsu abuzz fireworm prints bopper radarscopes ductility heatable tangents tricorns miscopy anachronisms oozier enskying oesophagus" ; + rdf:type bsbm-inst:ProductType10 ; + rdf:type bsbm-inst:ProductType3 ; + rdf:type bsbm-inst:ProductType1 ; + bsbm:productPropertyNumeric1 "291"^^xsd:integer ; + bsbm:productPropertyNumeric2 "1572"^^xsd:integer ; + bsbm:productPropertyNumeric3 "109"^^xsd:integer ; + bsbm:productPropertyNumeric4 "1561"^^xsd:integer ; + bsbm:productPropertyTextual1 "asphodel papayas sporulate strappers smidgeon aquiculture withering unloosened uplinked ciliates"^^xsd:string ; + bsbm:productPropertyTextual2 "overachieving wardership milliners subtotaling mono overdramatize interferer"^^xsd:string ; + bsbm:productPropertyTextual3 "inhibitors palliatively umpires"^^xsd:string ; + bsbm:productPropertyTextual4 "penalties successfully boating ejaculators"^^xsd:string ; + bsbm:productPropertyTextual5 "fervour awakenings reheat unpenned subclan broncobusters cliffhanger spicers"^^xsd:string ; + bsbm:productFeature bsbm-inst:ProductFeature372 ; + bsbm:productFeature bsbm-inst:ProductFeature375 ; + bsbm:productFeature bsbm-inst:ProductFeature378 ; + bsbm:productFeature bsbm-inst:ProductFeature379 ; + bsbm:productFeature bsbm-inst:ProductFeature383 ; + bsbm:productFeature bsbm-inst:ProductFeature388 ; + bsbm:productFeature bsbm-inst:ProductFeature391 ; + bsbm:productFeature bsbm-inst:ProductFeature395 ; + bsbm:productFeature bsbm-inst:ProductFeature397 ; + bsbm:productFeature bsbm-inst:ProductFeature399 ; + bsbm:productFeature bsbm-inst:ProductFeature403 ; + bsbm:productFeature bsbm-inst:ProductFeature404 ; + bsbm:productFeature bsbm-inst:ProductFeature405 ; + bsbm:productFeature bsbm-inst:ProductFeature408 ; + bsbm:productFeature bsbm-inst:ProductFeature411 ; + bsbm:productFeature bsbm-inst:ProductFeature413 ; + bsbm:productFeature bsbm-inst:ProductFeature415 ; + bsbm:productFeature bsbm-inst:ProductFeature37 ; + bsbm:productFeature bsbm-inst:ProductFeature40 ; + bsbm:productFeature bsbm-inst:ProductFeature47 ; + bsbm:productFeature bsbm-inst:ProductFeature50 ; + bsbm:productFeature bsbm-inst:ProductFeature54 ; + bsbm:productFeature bsbm-inst:ProductFeature57 ; + bsbm:productFeature bsbm-inst:ProductFeature67 ; + bsbm:productFeature bsbm-inst:ProductFeature69 ; + bsbm:productFeature bsbm-inst:ProductFeature74 ; + bsbm:producer dataFromProducer2:Producer2 ; + dc:publisher dataFromProducer2:Producer2 ; + dc:date "2003-08-29"^^xsd:date . +dataFromProducer2:Product80 + rdf:type bsbm:Product ; + rdfs:label "tutors animists rocs" ; + rdfs:comment "embroiling borons damps strongboxes universality stranglings sympathizing browniest razzed steadier idling eristics managemental combater damages satisfied encrypting whereat supersession preamp outboxed recombing photoelectricity gallic fettlings identifies subtreasuries nervation tyrannizer incubation somebodies reiving ytterbic drinkers identifers undersheriff pawnee prewarming instruction appeasers rebops yardmasters pronounces americas scurrility abubble gaudery poleaxe clangorously panniers divisibilities laggings sanguification gibbeted crusados beleaguer calamar immobilization chromiums japingly uprising seminally dancers laceration repowering canebrake vialled painfully irrefutably slimes panegyrics irregularity dramamine telepathies drowsier girting outmaneuvering altruisms license uncoordinated medicably retesting thirstiest arbitrational slipovers subchiefs noddles disgracefulness reproached ducked nippers careering quandaries darwinist allotments plainer elevons enthused atheists redirecting cosily bitters wormholes" ; + rdf:type bsbm-inst:ProductType7 ; + rdf:type bsbm-inst:ProductType2 ; + rdf:type bsbm-inst:ProductType1 ; + bsbm:productPropertyNumeric1 "635"^^xsd:integer ; + bsbm:productPropertyNumeric2 "1402"^^xsd:integer ; + bsbm:productPropertyNumeric3 "1792"^^xsd:integer ; + bsbm:productPropertyNumeric4 "646"^^xsd:integer ; + bsbm:productPropertyNumeric5 "249"^^xsd:integer ; + bsbm:productPropertyTextual1 "dissuaded motorboat gees enormousness laminas athenaeums lounging comprehendible topflight sniggle hempy"^^xsd:string ; + bsbm:productPropertyTextual2 "ferrules disputants apologias vroomed squab funerals maybushes swordsmen comedo crawling saharan"^^xsd:string ; + bsbm:productPropertyTextual3 "floodlighted politicians restorations malarias"^^xsd:string ; + bsbm:productPropertyTextual4 "garrottes encapsules unholiest contraindication theocratically amreeta assignor toggler dilemmas overcoming"^^xsd:string ; + bsbm:productPropertyTextual5 "endocrinous curtness dict unrepentingly fetted pignorated biddably mucous"^^xsd:string ; + bsbm:productFeature bsbm-inst:ProductFeature225 ; + bsbm:productFeature bsbm-inst:ProductFeature230 ; + bsbm:productFeature bsbm-inst:ProductFeature231 ; + bsbm:productFeature bsbm-inst:ProductFeature232 ; + bsbm:productFeature bsbm-inst:ProductFeature238 ; + bsbm:productFeature bsbm-inst:ProductFeature239 ; + bsbm:productFeature bsbm-inst:ProductFeature240 ; + bsbm:productFeature bsbm-inst:ProductFeature245 ; + bsbm:productFeature bsbm-inst:ProductFeature249 ; + bsbm:productFeature bsbm-inst:ProductFeature251 ; + bsbm:productFeature bsbm-inst:ProductFeature252 ; + bsbm:productFeature bsbm-inst:ProductFeature254 ; + bsbm:productFeature bsbm-inst:ProductFeature266 ; + bsbm:productFeature bsbm-inst:ProductFeature269 ; + bsbm:productFeature bsbm-inst:ProductFeature274 ; + bsbm:productFeature bsbm-inst:ProductFeature280 ; + bsbm:productFeature bsbm-inst:ProductFeature281 ; + bsbm:productFeature bsbm-inst:ProductFeature286 ; + bsbm:productFeature bsbm-inst:ProductFeature289 ; + bsbm:productFeature bsbm-inst:ProductFeature3 ; + bsbm:productFeature bsbm-inst:ProductFeature10 ; + bsbm:productFeature bsbm-inst:ProductFeature12 ; + bsbm:productFeature bsbm-inst:ProductFeature14 ; + bsbm:productFeature bsbm-inst:ProductFeature32 ; + bsbm:producer dataFromProducer2:Producer2 ; + dc:publisher dataFromProducer2:Producer2 ; + dc:date "2005-12-23"^^xsd:date . +dataFromProducer2:Product81 + rdf:type bsbm:Product ; + rdfs:label "iguanas semiautonomous uncounted" ; + rdfs:comment "sawflies judos wennish pattypan scientistic affaire throats publicly moderates reprobates steroids colinear defats lusciousness tanner marking wolfsbane sustenant retreads semirespectability frothily badging dicotyledonous playthings demandingly apprehended overcompensators scepter preestablish dens scurf freebee dolours evacuation heehawed reflexively wicking sulkily belongs hepatized equinoxes enameled bourbons phenotypical gonifs monosodium ritzily deadbeat zouaves synods mibs skylarker placentas halter alphanumerics cricketer deselecting metrologies asseverate antiknocks dropkicker litigator untangles regloss abrasives tex dawdle recapitulations tocsins rarities laders reeker starer improviser nonempirical cajoler trollops hingeless luny irrigators mitigator dynamistic quickies writhers rationalities misappropriating chasubles designative kolinsky sapper scroungy crossest headgears doblas sniffler shepherdess radicalizes cottonwoods tranships candlesticks emersion governorships korunas tenterhook retrocede encumbered synchronized overstate spiralled touche pillowing signories renunciatory reginal offerable afternoons dewaxes interminableness twined realisms boatel childless" ; + rdf:type bsbm-inst:ProductType10 ; + rdf:type bsbm-inst:ProductType3 ; + rdf:type bsbm-inst:ProductType1 ; + bsbm:productPropertyNumeric1 "653"^^xsd:integer ; + bsbm:productPropertyNumeric2 "423"^^xsd:integer ; + bsbm:productPropertyNumeric3 "373"^^xsd:integer ; + bsbm:productPropertyNumeric4 "933"^^xsd:integer ; + bsbm:productPropertyNumeric5 "579"^^xsd:integer ; + bsbm:productPropertyTextual1 "gutlike enkindling returned"^^xsd:string ; + bsbm:productPropertyTextual2 "motorized phlegmatical dolefully adjudicators horning peripherally careening regressiveness beheading breached vatfuls goodnight rulership banditti"^^xsd:string ; + bsbm:productPropertyTextual3 "whetting instigation uxorial abated incarnadine biologics outmaneuvering opulently medias ambulates patellas relettered"^^xsd:string ; + bsbm:productPropertyTextual4 "effulge kryptons valvelet recuperating splining huggermugger threads unload unloosen nonzebra scathes safetying gems mystifying"^^xsd:string ; + bsbm:productPropertyTextual5 "undependable photoinduced gamekeeper degeneracies chichi underdoes courtly quaverer omelets"^^xsd:string ; + bsbm:productFeature bsbm-inst:ProductFeature371 ; + bsbm:productFeature bsbm-inst:ProductFeature379 ; + bsbm:productFeature bsbm-inst:ProductFeature380 ; + bsbm:productFeature bsbm-inst:ProductFeature383 ; + bsbm:productFeature bsbm-inst:ProductFeature387 ; + bsbm:productFeature bsbm-inst:ProductFeature389 ; + bsbm:productFeature bsbm-inst:ProductFeature390 ; + bsbm:productFeature bsbm-inst:ProductFeature393 ; + bsbm:productFeature bsbm-inst:ProductFeature399 ; + bsbm:productFeature bsbm-inst:ProductFeature408 ; + bsbm:productFeature bsbm-inst:ProductFeature37 ; + bsbm:productFeature bsbm-inst:ProductFeature38 ; + bsbm:productFeature bsbm-inst:ProductFeature43 ; + bsbm:productFeature bsbm-inst:ProductFeature45 ; + bsbm:productFeature bsbm-inst:ProductFeature52 ; + bsbm:productFeature bsbm-inst:ProductFeature60 ; + bsbm:productFeature bsbm-inst:ProductFeature63 ; + bsbm:productFeature bsbm-inst:ProductFeature66 ; + bsbm:productFeature bsbm-inst:ProductFeature70 ; + bsbm:productFeature bsbm-inst:ProductFeature74 ; + bsbm:producer dataFromProducer2:Producer2 ; + dc:publisher dataFromProducer2:Producer2 ; + dc:date "2001-09-16"^^xsd:date . +dataFromProducer2:Product82 + rdf:type bsbm:Product ; + rdfs:label "reformable" ; + rdfs:comment "whines regarded outstretched batteries mushroomed occupied delayers psychos gloving jemmies conformism polit oozed audiometry granularly bistros laminating outlives capabler rallyists bounteousness fillets tenderer menageries spaceship ululates sheathers toolrooms courtyards perfumeries welcomed sentiments paratroops ruers coachers ungentle excreters learnings walleye demagoguery anticyclones bobbed scarified uncritically hauberks lakiest menstruant gravestones retreaded mantelet heroize rereads thouing trinal dingus atomizing unchain trolled pseudophilosophical blithering davenports fringed resigning monocled dimmed medevacs viscoid metempsychoses manicures gimlets stumbler biosensor toploftier scrubber xviii sensitivities" ; + rdf:type bsbm-inst:ProductType15 ; + rdf:type bsbm-inst:ProductType4 ; + rdf:type bsbm-inst:ProductType1 ; + bsbm:productPropertyNumeric1 "129"^^xsd:integer ; + bsbm:productPropertyNumeric2 "772"^^xsd:integer ; + bsbm:productPropertyNumeric3 "141"^^xsd:integer ; + bsbm:productPropertyNumeric4 "76"^^xsd:integer ; + bsbm:productPropertyNumeric5 "127"^^xsd:integer ; + bsbm:productPropertyTextual1 "constituted bactericides collocates knows glorifier spewing condores maxillary wingless antiproton frazzling"^^xsd:string ; + bsbm:productPropertyTextual2 "toothing contiguousness reservers syllabub frogs portending wrings tolerantly"^^xsd:string ; + bsbm:productPropertyTextual3 "kelping basketries sinology sulkier evolvement unwon symboling effacer captans etherish mournfully realized gregariously"^^xsd:string ; + bsbm:productPropertyTextual4 "pattering tickers vowelize"^^xsd:string ; + bsbm:productPropertyTextual5 "schmaltziest overpowering antibodies desolateness shatters monetarily enframe guardhouses scrubbing"^^xsd:string ; + bsbm:productFeature bsbm-inst:ProductFeature627 ; + bsbm:productFeature bsbm-inst:ProductFeature636 ; + bsbm:productFeature bsbm-inst:ProductFeature637 ; + bsbm:productFeature bsbm-inst:ProductFeature641 ; + bsbm:productFeature bsbm-inst:ProductFeature649 ; + bsbm:productFeature bsbm-inst:ProductFeature653 ; + bsbm:productFeature bsbm-inst:ProductFeature654 ; + bsbm:productFeature bsbm-inst:ProductFeature656 ; + bsbm:productFeature bsbm-inst:ProductFeature659 ; + bsbm:productFeature bsbm-inst:ProductFeature667 ; + bsbm:productFeature bsbm-inst:ProductFeature671 ; + bsbm:productFeature bsbm-inst:ProductFeature91 ; + bsbm:productFeature bsbm-inst:ProductFeature94 ; + bsbm:productFeature bsbm-inst:ProductFeature98 ; + bsbm:productFeature bsbm-inst:ProductFeature99 ; + bsbm:productFeature bsbm-inst:ProductFeature100 ; + bsbm:productFeature bsbm-inst:ProductFeature103 ; + bsbm:productFeature bsbm-inst:ProductFeature104 ; + bsbm:productFeature bsbm-inst:ProductFeature105 ; + bsbm:productFeature bsbm-inst:ProductFeature107 ; + bsbm:productFeature bsbm-inst:ProductFeature112 ; + bsbm:productFeature bsbm-inst:ProductFeature115 ; + bsbm:productFeature bsbm-inst:ProductFeature117 ; + bsbm:productFeature bsbm-inst:ProductFeature120 ; + bsbm:productFeature bsbm-inst:ProductFeature130 ; + bsbm:productFeature bsbm-inst:ProductFeature133 ; + bsbm:productFeature bsbm-inst:ProductFeature134 ; + bsbm:productFeature bsbm-inst:ProductFeature135 ; + bsbm:productFeature bsbm-inst:ProductFeature137 ; + bsbm:productFeature bsbm-inst:ProductFeature139 ; + bsbm:producer dataFromProducer2:Producer2 ; + dc:publisher dataFromProducer2:Producer2 ; + dc:date "2005-06-18"^^xsd:date . +dataFromProducer2:Product83 + rdf:type bsbm:Product ; + rdfs:label "dodos eviler decently" ; + rdfs:comment "nonproportional toadstools malaprops whilst haunted unexceptionably mins zymogenic craftiest encoding isolationist nostalgically precipitancy amorists improviser psychiatries overachieving tabbed whodunit winish substanceless dizziest mizens outleaping fileted draughting bacteriological abilities avidity totaled enigmata comparer chugger convecting zoned marling tubework gambles hypoxemic rewind lumbars stated admonished lyrically valiants alphabetization unveil taboos heterosis supporter spittoon gorged spontaneously revisiting practiced hotdogged understudying preregistration ecumenical cozened unbalance fuzziest empathies icecap sternness transonic diverseness rafter cotter rigmarole crepey sterilize unlocks mocker immobilizer pricks flamethrower confucians monism rebukers larkier knuckliest topologically spelling loses unrobed selvage boogers mealworm disemploy gainfulness dialyze quintillions unseams adsorbents nonprejudicially nosepiece wheelings asian grantsmen annexations devisors gaps debunking happening gasoliers terrorized nondeductible neurosurgeries heritor aerofoils inviolability vividness blazing censes banishing scrimp dines salivates graduates allocator wisecrackers" ; + rdf:type bsbm-inst:ProductType7 ; + rdf:type bsbm-inst:ProductType2 ; + rdf:type bsbm-inst:ProductType1 ; + bsbm:productPropertyNumeric1 "433"^^xsd:integer ; + bsbm:productPropertyNumeric2 "36"^^xsd:integer ; + bsbm:productPropertyNumeric3 "1324"^^xsd:integer ; + bsbm:productPropertyNumeric4 "91"^^xsd:integer ; + bsbm:productPropertyNumeric5 "1263"^^xsd:integer ; + bsbm:productPropertyTextual1 "dispensatory godding avidly signalers"^^xsd:string ; + bsbm:productPropertyTextual2 "meted officiality nictitating hassels ladyship seascape abandons smartie osmiums"^^xsd:string ; + bsbm:productPropertyTextual3 "intertwining bhaktas snowbound judice postfaces scrabbled panhandlers"^^xsd:string ; + bsbm:productPropertyTextual4 "indentations serener compiling cribbage palpators restacked spareness moonbeams strutted sirups debilities naiads negativistic"^^xsd:string ; + bsbm:productPropertyTextual5 "beriberis glyptic pneumococci justified abatis shrivers stowable handcuffed"^^xsd:string ; + bsbm:productFeature bsbm-inst:ProductFeature228 ; + bsbm:productFeature bsbm-inst:ProductFeature230 ; + bsbm:productFeature bsbm-inst:ProductFeature231 ; + bsbm:productFeature bsbm-inst:ProductFeature234 ; + bsbm:productFeature bsbm-inst:ProductFeature238 ; + bsbm:productFeature bsbm-inst:ProductFeature240 ; + bsbm:productFeature bsbm-inst:ProductFeature241 ; + bsbm:productFeature bsbm-inst:ProductFeature243 ; + bsbm:productFeature bsbm-inst:ProductFeature244 ; + bsbm:productFeature bsbm-inst:ProductFeature245 ; + bsbm:productFeature bsbm-inst:ProductFeature246 ; + bsbm:productFeature bsbm-inst:ProductFeature250 ; + bsbm:productFeature bsbm-inst:ProductFeature252 ; + bsbm:productFeature bsbm-inst:ProductFeature254 ; + bsbm:productFeature bsbm-inst:ProductFeature260 ; + bsbm:productFeature bsbm-inst:ProductFeature274 ; + bsbm:productFeature bsbm-inst:ProductFeature279 ; + bsbm:productFeature bsbm-inst:ProductFeature284 ; + bsbm:productFeature bsbm-inst:ProductFeature287 ; + bsbm:productFeature bsbm-inst:ProductFeature2 ; + bsbm:productFeature bsbm-inst:ProductFeature8 ; + bsbm:productFeature bsbm-inst:ProductFeature19 ; + bsbm:productFeature bsbm-inst:ProductFeature21 ; + bsbm:productFeature bsbm-inst:ProductFeature23 ; + bsbm:productFeature bsbm-inst:ProductFeature27 ; + bsbm:productFeature bsbm-inst:ProductFeature29 ; + bsbm:productFeature bsbm-inst:ProductFeature32 ; + bsbm:productFeature bsbm-inst:ProductFeature35 ; + bsbm:productFeature bsbm-inst:ProductFeature36 ; + bsbm:producer dataFromProducer2:Producer2 ; + dc:publisher dataFromProducer2:Producer2 ; + dc:date "2001-12-23"^^xsd:date . +dataFromProducer2:Product84 + rdf:type bsbm:Product ; + rdfs:label "acclimating" ; + rdfs:comment "ructious softbound desexing antecede moratoria loquats regresses gummed rayons liberalities endorses notaryship rewiring bovid desirer ingested filmography mistitles primuses subscripted neomycin walkaways upcurved logarithmical bb fickler mobbing lavishest awless medicable electrocardiography dextrin savagism proceeding flumes naturalized domineered alluringly chutnees reexamining spectroscopist tourniquet quittance bravoing commiseration smells decocted rhinitis ruinate topographies conjoints unbruised decrials" ; + rdf:type bsbm-inst:ProductType6 ; + rdf:type bsbm-inst:ProductType2 ; + rdf:type bsbm-inst:ProductType1 ; + bsbm:productPropertyNumeric1 "353"^^xsd:integer ; + bsbm:productPropertyNumeric2 "1197"^^xsd:integer ; + bsbm:productPropertyNumeric3 "934"^^xsd:integer ; + bsbm:productPropertyNumeric6 "1517"^^xsd:integer ; + bsbm:productPropertyTextual1 "mads petitions binomials automating"^^xsd:string ; + bsbm:productPropertyTextual2 "coops guising stockbrokerage bumper supermarkets recaptured bespangling classifiable vamoosing circumstantiations impounded reducers"^^xsd:string ; + bsbm:productPropertyTextual3 "idealism alterable fearers commandment bronchopneumonia brainish disrespectful fustian mooncalf damselfly nota screwer crusades"^^xsd:string ; + bsbm:productPropertyTextual6 "issueless roughhewing picketing"^^xsd:string ; + bsbm:productFeature bsbm-inst:ProductFeature184 ; + bsbm:productFeature bsbm-inst:ProductFeature203 ; + bsbm:productFeature bsbm-inst:ProductFeature213 ; + bsbm:productFeature bsbm-inst:ProductFeature223 ; + bsbm:productFeature bsbm-inst:ProductFeature224 ; + bsbm:productFeature bsbm-inst:ProductFeature2 ; + bsbm:productFeature bsbm-inst:ProductFeature19 ; + bsbm:productFeature bsbm-inst:ProductFeature23 ; + bsbm:productFeature bsbm-inst:ProductFeature25 ; + bsbm:productFeature bsbm-inst:ProductFeature27 ; + bsbm:productFeature bsbm-inst:ProductFeature28 ; + bsbm:productFeature bsbm-inst:ProductFeature33 ; + bsbm:productFeature bsbm-inst:ProductFeature35 ; + bsbm:producer dataFromProducer2:Producer2 ; + dc:publisher dataFromProducer2:Producer2 ; + dc:date "2005-11-12"^^xsd:date . +dataFromProducer2:Product85 + rdf:type bsbm:Product ; + rdfs:label "podiatric tallest cabinetmaker" ; + rdfs:comment "leaning hoister triangulation enjoyably urethras australians grounding squids oligocene discommode noncausally overspread matriculated migrational isomorphism unpredictability ofay preluder communicativeness scrappier profitably permuted destinations scrawling despoilments succors barometrically saclike stacks rewritten tediums flavour arbour talkatively pricked commuter anaerobes airdropping liquidly overintense smashed hitcher ionics gangplanks awesomeness ordinates brooch trisection contriteness comfortingly moulders legations paginating panged gallicisms spick hautboys tryster scaring approbative resumptions icbm percussions junto blandly revelator cardholder cocains gasper birefractive cocainized transactional cresting unionized hillsides wildcatted reverters timbered transcending noblewomen" ; + rdf:type bsbm-inst:ProductType12 ; + rdf:type bsbm-inst:ProductType3 ; + rdf:type bsbm-inst:ProductType1 ; + bsbm:productPropertyNumeric1 "1224"^^xsd:integer ; + bsbm:productPropertyNumeric2 "412"^^xsd:integer ; + bsbm:productPropertyNumeric3 "552"^^xsd:integer ; + bsbm:productPropertyNumeric4 "1265"^^xsd:integer ; + bsbm:productPropertyNumeric5 "41"^^xsd:integer ; + bsbm:productPropertyTextual1 "campings stuffiness apodal viewing tortuosities forewarns materialities carapaces"^^xsd:string ; + bsbm:productPropertyTextual2 "clacker ambulances irascible ungenteel trivalves blowfishes metronomes gravestones plonk mutualities dramatizations"^^xsd:string ; + bsbm:productPropertyTextual3 "thermosetting receiver splenectomize titbits"^^xsd:string ; + bsbm:productPropertyTextual4 "unstressed clingier dewlapped silversmiths lithias grownups housemen"^^xsd:string ; + bsbm:productPropertyTextual5 "sandier rhumbaed zebecs natureopathy puberties"^^xsd:string ; + bsbm:productFeature bsbm-inst:ProductFeature459 ; + bsbm:productFeature bsbm-inst:ProductFeature462 ; + bsbm:productFeature bsbm-inst:ProductFeature464 ; + bsbm:productFeature bsbm-inst:ProductFeature472 ; + bsbm:productFeature bsbm-inst:ProductFeature474 ; + bsbm:productFeature bsbm-inst:ProductFeature480 ; + bsbm:productFeature bsbm-inst:ProductFeature483 ; + bsbm:productFeature bsbm-inst:ProductFeature486 ; + bsbm:productFeature bsbm-inst:ProductFeature490 ; + bsbm:productFeature bsbm-inst:ProductFeature491 ; + bsbm:productFeature bsbm-inst:ProductFeature495 ; + bsbm:productFeature bsbm-inst:ProductFeature39 ; + bsbm:productFeature bsbm-inst:ProductFeature42 ; + bsbm:productFeature bsbm-inst:ProductFeature44 ; + bsbm:productFeature bsbm-inst:ProductFeature46 ; + bsbm:productFeature bsbm-inst:ProductFeature50 ; + bsbm:productFeature bsbm-inst:ProductFeature52 ; + bsbm:productFeature bsbm-inst:ProductFeature55 ; + bsbm:productFeature bsbm-inst:ProductFeature59 ; + bsbm:productFeature bsbm-inst:ProductFeature62 ; + bsbm:productFeature bsbm-inst:ProductFeature63 ; + bsbm:productFeature bsbm-inst:ProductFeature72 ; + bsbm:productFeature bsbm-inst:ProductFeature75 ; + bsbm:productFeature bsbm-inst:ProductFeature76 ; + bsbm:producer dataFromProducer2:Producer2 ; + dc:publisher dataFromProducer2:Producer2 ; + dc:date "2001-10-22"^^xsd:date . +dataFromProducer2:Product86 + rdf:type bsbm:Product ; + rdfs:label "anodizes expender elaborately" ; + rdfs:comment "direful preblessing goggly chlorous sanctions reimported oceanographic harridan blockaders homesite repayments containable gravamen elegies slurried arsonous personifications rasers lifework sloshiest kilned bureaucratization captainships shatters promulgates knouts storekeeper contraceptives glockenspiel aligning nazifying recirculating padshah turks temperer swayed supportable resalable telekineses rockabyes possessives paled equestrianism outlines smasher redivides entoils appurtenances secretariats bridgeheads financially booger lumbago abstentions tubings solecized themes backlashed jasmines snivelers scrutinise uncompartmentalizes tutors thumbscrews topsails jeepers starching wolver dreariness wickyup plushly subordinations deploring noncompeting souvenirs nonviable antigravity aphasiacs vizard drumbeats subcivilizations staminal boxfish refracturing jaws randomizes ilks predomination tepidities ridged gawkily disillusioned vends ionised freewheelers cockled pulpwoods mumps airing expulsed cookable provinces electrophoreses photosynthesizing thusly slumberers distributee bongoist goals waterfowls potholed affiancing byroads vacation hoping cliffhanging superabundantly gnomic splosh freckles outstretched irrepatriable isthmuses entwined loathers imperceptive deviancy detestable reglosses shinleaf girlhoods repulsively ie substituter rider radiator disequilibrium voracities votable vulcanize readouts detonated encirclements cosponsors semirespectability marauder selenographers idyls squawkers reaccede" ; + rdf:type bsbm-inst:ProductType9 ; + rdf:type bsbm-inst:ProductType2 ; + rdf:type bsbm-inst:ProductType1 ; + bsbm:productPropertyNumeric1 "1539"^^xsd:integer ; + bsbm:productPropertyNumeric2 "197"^^xsd:integer ; + bsbm:productPropertyNumeric3 "99"^^xsd:integer ; + bsbm:productPropertyNumeric5 "563"^^xsd:integer ; + bsbm:productPropertyNumeric6 "590"^^xsd:integer ; + bsbm:productPropertyTextual1 "overrank lactoses yangtze decenaries pointblank mezuza interjections ahimsas undersea angularity circularness adjudicates"^^xsd:string ; + bsbm:productPropertyTextual2 "idealistic archaist unstopped retouchers lignites navigates deserter amphorae tabulations heather mopeder burdened outperforms unbelievers transected"^^xsd:string ; + bsbm:productPropertyTextual3 "bucketing ands sexless lavendered blinded stupefying oilily unerased"^^xsd:string ; + bsbm:productPropertyTextual6 "mosquitoes sniffing loadstar harmonizations lollies equities fellatrix"^^xsd:string ; + bsbm:productFeature bsbm-inst:ProductFeature327 ; + bsbm:productFeature bsbm-inst:ProductFeature328 ; + bsbm:productFeature bsbm-inst:ProductFeature334 ; + bsbm:productFeature bsbm-inst:ProductFeature340 ; + bsbm:productFeature bsbm-inst:ProductFeature346 ; + bsbm:productFeature bsbm-inst:ProductFeature351 ; + bsbm:productFeature bsbm-inst:ProductFeature352 ; + bsbm:productFeature bsbm-inst:ProductFeature357 ; + bsbm:productFeature bsbm-inst:ProductFeature359 ; + bsbm:productFeature bsbm-inst:ProductFeature360 ; + bsbm:productFeature bsbm-inst:ProductFeature364 ; + bsbm:productFeature bsbm-inst:ProductFeature367 ; + bsbm:productFeature bsbm-inst:ProductFeature2 ; + bsbm:productFeature bsbm-inst:ProductFeature12 ; + bsbm:productFeature bsbm-inst:ProductFeature16 ; + bsbm:productFeature bsbm-inst:ProductFeature18 ; + bsbm:productFeature bsbm-inst:ProductFeature25 ; + bsbm:productFeature bsbm-inst:ProductFeature26 ; + bsbm:productFeature bsbm-inst:ProductFeature32 ; + bsbm:productFeature bsbm-inst:ProductFeature34 ; + bsbm:producer dataFromProducer2:Producer2 ; + dc:publisher dataFromProducer2:Producer2 ; + dc:date "2005-10-24"^^xsd:date . +dataFromProducer2:Product87 + rdf:type bsbm:Product ; + rdfs:label "gunned" ; + rdfs:comment "manorialism maculating negus kiting transferal canniest chantors anoia longwise electrosurgically chiffons academical citable hastily foreseers cowhands occasionally implausibility claiming aleatory fixer disorients watercraft shuting ensnared garments spectating beefed faithfuls braggiest claques mixer snidest staggerer resuscitator baked denim skeletons fainted exacerbations appendectomy banqueter technocracy indexation differentiations mildly sinkable infirmness saphead delist suiting easiest galvanizers booteries classifications innervated xerophilous associations snafued teak helistops repellant anticyclones ruralism goatee asexuality impossibleness nonidiomatic reinfects downshifting rummies" ; + rdf:type bsbm-inst:ProductType12 ; + rdf:type bsbm-inst:ProductType3 ; + rdf:type bsbm-inst:ProductType1 ; + bsbm:productPropertyNumeric1 "436"^^xsd:integer ; + bsbm:productPropertyNumeric2 "627"^^xsd:integer ; + bsbm:productPropertyNumeric3 "95"^^xsd:integer ; + bsbm:productPropertyNumeric4 "1290"^^xsd:integer ; + bsbm:productPropertyNumeric5 "1339"^^xsd:integer ; + bsbm:productPropertyTextual1 "detoured cornute uneducated caverned predatorial whalebone deeps sunbaths"^^xsd:string ; + bsbm:productPropertyTextual2 "attaining nectarines flattop desensitizes parsed pointiest excommunication goaded nodus recrated"^^xsd:string ; + bsbm:productPropertyTextual3 "repatriates beebees punctilio economizing sawyers unsteady nacre billeters"^^xsd:string ; + bsbm:productPropertyTextual4 "drainpipe pyromania ichors treatments"^^xsd:string ; + bsbm:productPropertyTextual5 "egyptians ostriches monotheism turquoises"^^xsd:string ; + bsbm:productFeature bsbm-inst:ProductFeature454 ; + bsbm:productFeature bsbm-inst:ProductFeature455 ; + bsbm:productFeature bsbm-inst:ProductFeature458 ; + bsbm:productFeature bsbm-inst:ProductFeature459 ; + bsbm:productFeature bsbm-inst:ProductFeature466 ; + bsbm:productFeature bsbm-inst:ProductFeature467 ; + bsbm:productFeature bsbm-inst:ProductFeature480 ; + bsbm:productFeature bsbm-inst:ProductFeature481 ; + bsbm:productFeature bsbm-inst:ProductFeature482 ; + bsbm:productFeature bsbm-inst:ProductFeature489 ; + bsbm:productFeature bsbm-inst:ProductFeature493 ; + bsbm:productFeature bsbm-inst:ProductFeature495 ; + bsbm:productFeature bsbm-inst:ProductFeature497 ; + bsbm:productFeature bsbm-inst:ProductFeature38 ; + bsbm:productFeature bsbm-inst:ProductFeature40 ; + bsbm:productFeature bsbm-inst:ProductFeature43 ; + bsbm:productFeature bsbm-inst:ProductFeature54 ; + bsbm:productFeature bsbm-inst:ProductFeature60 ; + bsbm:productFeature bsbm-inst:ProductFeature62 ; + bsbm:productFeature bsbm-inst:ProductFeature68 ; + bsbm:productFeature bsbm-inst:ProductFeature70 ; + bsbm:productFeature bsbm-inst:ProductFeature71 ; + bsbm:productFeature bsbm-inst:ProductFeature73 ; + bsbm:productFeature bsbm-inst:ProductFeature75 ; + bsbm:producer dataFromProducer2:Producer2 ; + dc:publisher dataFromProducer2:Producer2 ; + dc:date "2003-04-16"^^xsd:date . +dataFromProducer2:Product88 + rdf:type bsbm:Product ; + rdfs:label "ghostiest anoraks mousses" ; + rdfs:comment "benefactions combing marling finickiest bewig jaegars comedians titaniums rustable schools riposted dismissing essayists serfs tawdrier downpours ament unlocked improvisors drabbets gazetting creaking attenuates ordainer biocatalyst cruncher seine trapshooting epilepsy goosed incumbrance cyclized sweets dismount kopecks applying transfiguring malayans settles trigonometrical culpae dipt meringues refinements narratives wasted recovered antiheroic mascon clues amazonian outranges swathers inhumanly diking subunits bordereau summarizes steerages shabbiness alopecic familiarize lacier vasectomies terrestrially preaxially enroot spiritualists strongmen kinaesthetic dauntlessly consecutively untangled percussed cosmopolis disguises anemia immured salons unreservedly sapor decoded nifty ekistics procapitalist stoles unpardoned caribous jubilation virological impoundments reeved aeries sauntering statuses dacron anisic disrobe tubed cocain favorable arsonists dribblets sanitizes protestants momentoes hundredweight remarry ladder preached trembly photosynthesized conventional receivable supraliminally daimyo uppish cunts antemortem sloshes ponying surplices coming frizzlers trembles sociability pentagons violinists overwhelmingly" ; + rdf:type bsbm-inst:ProductType14 ; + rdf:type bsbm-inst:ProductType4 ; + rdf:type bsbm-inst:ProductType1 ; + bsbm:productPropertyNumeric1 "371"^^xsd:integer ; + bsbm:productPropertyNumeric2 "511"^^xsd:integer ; + bsbm:productPropertyNumeric3 "78"^^xsd:integer ; + bsbm:productPropertyNumeric4 "1009"^^xsd:integer ; + bsbm:productPropertyNumeric5 "148"^^xsd:integer ; + bsbm:productPropertyTextual1 "salutations sox photographic perplexedly incus lores shorebirds saddletree feyer cookshop requisitioned"^^xsd:string ; + bsbm:productPropertyTextual2 "unproclaimed unsuitability supposers symbiont completers abridging laplanders finest"^^xsd:string ; + bsbm:productPropertyTextual3 "nahuatls hornets extrudes confluence latticework costliest dazzler clowned remove grenades plateaued"^^xsd:string ; + bsbm:productPropertyTextual4 "transduce leaguers unperturbably"^^xsd:string ; + bsbm:productPropertyTextual5 "washing dependently unraveling restates"^^xsd:string ; + bsbm:productFeature bsbm-inst:ProductFeature577 ; + bsbm:productFeature bsbm-inst:ProductFeature581 ; + bsbm:productFeature bsbm-inst:ProductFeature587 ; + bsbm:productFeature bsbm-inst:ProductFeature588 ; + bsbm:productFeature bsbm-inst:ProductFeature592 ; + bsbm:productFeature bsbm-inst:ProductFeature596 ; + bsbm:productFeature bsbm-inst:ProductFeature604 ; + bsbm:productFeature bsbm-inst:ProductFeature605 ; + bsbm:productFeature bsbm-inst:ProductFeature612 ; + bsbm:productFeature bsbm-inst:ProductFeature82 ; + bsbm:productFeature bsbm-inst:ProductFeature84 ; + bsbm:productFeature bsbm-inst:ProductFeature85 ; + bsbm:productFeature bsbm-inst:ProductFeature93 ; + bsbm:productFeature bsbm-inst:ProductFeature94 ; + bsbm:productFeature bsbm-inst:ProductFeature99 ; + bsbm:productFeature bsbm-inst:ProductFeature111 ; + bsbm:productFeature bsbm-inst:ProductFeature118 ; + bsbm:productFeature bsbm-inst:ProductFeature120 ; + bsbm:productFeature bsbm-inst:ProductFeature122 ; + bsbm:productFeature bsbm-inst:ProductFeature123 ; + bsbm:productFeature bsbm-inst:ProductFeature124 ; + bsbm:productFeature bsbm-inst:ProductFeature135 ; + bsbm:productFeature bsbm-inst:ProductFeature137 ; + bsbm:productFeature bsbm-inst:ProductFeature140 ; + bsbm:producer dataFromProducer2:Producer2 ; + dc:publisher dataFromProducer2:Producer2 ; + dc:date "2006-11-14"^^xsd:date . +dataFromProducer2:Product89 + rdf:type bsbm:Product ; + rdfs:label "reechoed" ; + rdfs:comment "carcinogens minder prattlers reforesting neckerchiefs commemorating unknotted illogically globoid ranted tonights percussor wennier sawn nailheads braises flagellators proofed canines goldurns withes unsuggestive serfhood medevacs dispossesses mails omelettes pours bayonetted amucks ontogenetically graveyards cliquier misproportion consigns fierily radiosensitivities bombards footstools forged bowdlerism colorant locket tanzanian nevermore monomials porno separately correlates diopters sward unrolled eustachian blanketing obsoleteness murdering galvanize funds unpited growlers entanglers melodists ruinating polyploid zoster playbooks mammons quayside cornrow largesses implacentalia neocolonialism philander parasitical interstellar forjudge statistical naturopathic" ; + rdf:type bsbm-inst:ProductType16 ; + rdf:type bsbm-inst:ProductType4 ; + rdf:type bsbm-inst:ProductType1 ; + bsbm:productPropertyNumeric1 "115"^^xsd:integer ; + bsbm:productPropertyNumeric2 "66"^^xsd:integer ; + bsbm:productPropertyNumeric3 "875"^^xsd:integer ; + bsbm:productPropertyNumeric4 "1254"^^xsd:integer ; + bsbm:productPropertyNumeric5 "1727"^^xsd:integer ; + bsbm:productPropertyTextual1 "procrastinated greenthumbed wirephotos extinguishing"^^xsd:string ; + bsbm:productPropertyTextual2 "depravities sageness discrepancies adsorptiveness amnion sewers pallettes dumpcart waifs insinuation overlying brashiest enlarges deific logicize"^^xsd:string ; + bsbm:productPropertyTextual3 "cadges ultimo pupping clutched unblocking mascon competitors methought nightjar blockbusters isomerize hugs"^^xsd:string ; + bsbm:productPropertyTextual4 "panzers inoculation metatarsus revictualing stowed"^^xsd:string ; + bsbm:productPropertyTextual5 "crackly agglomerated drest sanded trackers clangored guidelines underpricing swopped museful"^^xsd:string ; + bsbm:productFeature bsbm-inst:ProductFeature682 ; + bsbm:productFeature bsbm-inst:ProductFeature685 ; + bsbm:productFeature bsbm-inst:ProductFeature686 ; + bsbm:productFeature bsbm-inst:ProductFeature697 ; + bsbm:productFeature bsbm-inst:ProductFeature703 ; + bsbm:productFeature bsbm-inst:ProductFeature704 ; + bsbm:productFeature bsbm-inst:ProductFeature708 ; + bsbm:productFeature bsbm-inst:ProductFeature711 ; + bsbm:productFeature bsbm-inst:ProductFeature715 ; + bsbm:productFeature bsbm-inst:ProductFeature723 ; + bsbm:productFeature bsbm-inst:ProductFeature726 ; + bsbm:productFeature bsbm-inst:ProductFeature727 ; + bsbm:productFeature bsbm-inst:ProductFeature730 ; + bsbm:productFeature bsbm-inst:ProductFeature739 ; + bsbm:productFeature bsbm-inst:ProductFeature740 ; + bsbm:productFeature bsbm-inst:ProductFeature747 ; + bsbm:productFeature bsbm-inst:ProductFeature80 ; + bsbm:productFeature bsbm-inst:ProductFeature101 ; + bsbm:productFeature bsbm-inst:ProductFeature103 ; + bsbm:productFeature bsbm-inst:ProductFeature104 ; + bsbm:productFeature bsbm-inst:ProductFeature109 ; + bsbm:productFeature bsbm-inst:ProductFeature110 ; + bsbm:productFeature bsbm-inst:ProductFeature111 ; + bsbm:productFeature bsbm-inst:ProductFeature114 ; + bsbm:productFeature bsbm-inst:ProductFeature127 ; + bsbm:productFeature bsbm-inst:ProductFeature128 ; + bsbm:productFeature bsbm-inst:ProductFeature132 ; + bsbm:productFeature bsbm-inst:ProductFeature138 ; + bsbm:productFeature bsbm-inst:ProductFeature141 ; + bsbm:producer dataFromProducer2:Producer2 ; + dc:publisher dataFromProducer2:Producer2 ; + dc:date "2002-11-17"^^xsd:date . +dataFromProducer2:Product90 + rdf:type bsbm:Product ; + rdfs:label "readdressed grainers" ; + rdfs:comment "gores shipwrecks paunchier nutshells palpably recriminating sapphics imitational rustily shoplifted exited purebred equates spearing combers slush yelpers denouncing walloping publics anchoritic liquidly bordels uprooted tumid monos spectrometric impieties banalities envisions vagueness rainout bipartition conservationism leaking legitimize glaringly extrapolations nullifiers outspread weaned tindery outyells clipsheet faugh moochers blesses dory rains tiptops procreator heresies wrathy erupting cheateries funked recopied incumbencies bolivias outreached mayhemming entombments noddle immortalities" ; + rdf:type bsbm-inst:ProductType13 ; + rdf:type bsbm-inst:ProductType3 ; + rdf:type bsbm-inst:ProductType1 ; + bsbm:productPropertyNumeric1 "749"^^xsd:integer ; + bsbm:productPropertyNumeric2 "437"^^xsd:integer ; + bsbm:productPropertyNumeric3 "1483"^^xsd:integer ; + bsbm:productPropertyNumeric4 "665"^^xsd:integer ; + bsbm:productPropertyNumeric5 "1877"^^xsd:integer ; + bsbm:productPropertyTextual1 "tureen agons earing profiling wallas gunks declasse portrays diapason variableness chelation recounted stipulatory"^^xsd:string ; + bsbm:productPropertyTextual2 "faggot gridlock mandrills iguanians carports impudently unstirred bocce musics flicks"^^xsd:string ; + bsbm:productPropertyTextual3 "surveyed sawbucks unaccountable"^^xsd:string ; + bsbm:productPropertyTextual4 "oxygenizing fierily scalars waterfronts ungraciousness ruttier xvi stimy decomposability cs coastguardsman"^^xsd:string ; + bsbm:productPropertyTextual5 "ballplayer redescribing doc"^^xsd:string ; + bsbm:productFeature bsbm-inst:ProductFeature502 ; + bsbm:productFeature bsbm-inst:ProductFeature505 ; + bsbm:productFeature bsbm-inst:ProductFeature512 ; + bsbm:productFeature bsbm-inst:ProductFeature516 ; + bsbm:productFeature bsbm-inst:ProductFeature517 ; + bsbm:productFeature bsbm-inst:ProductFeature531 ; + bsbm:productFeature bsbm-inst:ProductFeature540 ; + bsbm:productFeature bsbm-inst:ProductFeature542 ; + bsbm:productFeature bsbm-inst:ProductFeature544 ; + bsbm:productFeature bsbm-inst:ProductFeature548 ; + bsbm:productFeature bsbm-inst:ProductFeature549 ; + bsbm:productFeature bsbm-inst:ProductFeature550 ; + bsbm:productFeature bsbm-inst:ProductFeature551 ; + bsbm:productFeature bsbm-inst:ProductFeature555 ; + bsbm:productFeature bsbm-inst:ProductFeature556 ; + bsbm:productFeature bsbm-inst:ProductFeature557 ; + bsbm:productFeature bsbm-inst:ProductFeature559 ; + bsbm:productFeature bsbm-inst:ProductFeature566 ; + bsbm:productFeature bsbm-inst:ProductFeature37 ; + bsbm:productFeature bsbm-inst:ProductFeature46 ; + bsbm:productFeature bsbm-inst:ProductFeature47 ; + bsbm:productFeature bsbm-inst:ProductFeature53 ; + bsbm:productFeature bsbm-inst:ProductFeature61 ; + bsbm:producer dataFromProducer2:Producer2 ; + dc:publisher dataFromProducer2:Producer2 ; + dc:date "2001-08-03"^^xsd:date . +dataFromProducer2:Product91 + rdf:type bsbm:Product ; + rdfs:label "prelate" ; + rdfs:comment "solidifying semiagricultural eluding spews mutating tapirs whangs shadowed supervise queues ungathered actresses vealy sequestrates pinches doddering radiogenic acoustical spikiest bestialities legibly morphinic cassava goldbricker keyster unedited affirmativeness cocobolo boatable uptilts steatite skews trampers physically catagories grounders melanizes squelcher joshing squalling combo gorsier decreer embosoming misnomers mesquites planed headmen martyries underseas vicarage demographer circumventions upriser frosts noninstinctive kinematics deposited phloxes issuances aggie oppressing likelihood empyreal despairs plentifully bemata intreating demotes wether semipermanent influenzas churched maidenhood slinger neptunian determinants" ; + rdf:type bsbm-inst:ProductType18 ; + rdf:type bsbm-inst:ProductType5 ; + rdf:type bsbm-inst:ProductType1 ; + bsbm:productPropertyNumeric1 "1817"^^xsd:integer ; + bsbm:productPropertyNumeric2 "283"^^xsd:integer ; + bsbm:productPropertyNumeric3 "4"^^xsd:integer ; + bsbm:productPropertyNumeric6 "649"^^xsd:integer ; + bsbm:productPropertyTextual1 "barny semanticists nooning"^^xsd:string ; + bsbm:productPropertyTextual2 "glasses viscosities mutuels sheeter enroller sagas reversionary oblations environmentalists waitings downer lichting"^^xsd:string ; + bsbm:productPropertyTextual3 "delimited arrestee dualist scute neighborhood legitimizer undercooked thwarting beeswings nonlocals solvers terraria"^^xsd:string ; + bsbm:productPropertyTextual5 "corselet transcribers impingement trotlines crinoline cheeped moiling koshers"^^xsd:string ; + bsbm:productPropertyTextual6 "gombos endocrinologists nameplates"^^xsd:string ; + bsbm:productFeature bsbm-inst:ProductFeature815 ; + bsbm:productFeature bsbm-inst:ProductFeature816 ; + bsbm:productFeature bsbm-inst:ProductFeature817 ; + bsbm:productFeature bsbm-inst:ProductFeature821 ; + bsbm:productFeature bsbm-inst:ProductFeature829 ; + bsbm:productFeature bsbm-inst:ProductFeature830 ; + bsbm:productFeature bsbm-inst:ProductFeature836 ; + bsbm:productFeature bsbm-inst:ProductFeature839 ; + bsbm:productFeature bsbm-inst:ProductFeature844 ; + bsbm:productFeature bsbm-inst:ProductFeature849 ; + bsbm:productFeature bsbm-inst:ProductFeature855 ; + bsbm:productFeature bsbm-inst:ProductFeature856 ; + bsbm:productFeature bsbm-inst:ProductFeature142 ; + bsbm:productFeature bsbm-inst:ProductFeature143 ; + bsbm:productFeature bsbm-inst:ProductFeature146 ; + bsbm:productFeature bsbm-inst:ProductFeature147 ; + bsbm:productFeature bsbm-inst:ProductFeature148 ; + bsbm:productFeature bsbm-inst:ProductFeature158 ; + bsbm:productFeature bsbm-inst:ProductFeature161 ; + bsbm:productFeature bsbm-inst:ProductFeature163 ; + bsbm:productFeature bsbm-inst:ProductFeature168 ; + bsbm:productFeature bsbm-inst:ProductFeature176 ; + bsbm:productFeature bsbm-inst:ProductFeature178 ; + bsbm:productFeature bsbm-inst:ProductFeature181 ; + bsbm:producer dataFromProducer2:Producer2 ; + dc:publisher dataFromProducer2:Producer2 ; + dc:date "2006-06-11"^^xsd:date . +dataFromProducer2:Product92 + rdf:type bsbm:Product ; + rdfs:label "stopovers" ; + rdfs:comment "glooming wharfages legislatrices schooling concentrating jackanapeses biologic nonplussing redolent garottes libertines separably subverts exasperated utilise conversationally sonneting quarte sequins supplementer shattering diluvium organizers apprehensions fishers accepted clearinghouses refrainment geometrically flenched consistorial unpen conferment unhabituated implicitness splendors nourishment maximizes midriff grating detouring duffer deluded ciceros spermatocidal flashlamp bournes resummons audiences chiropraxis imploring depilatories languisher ayatollah overcapitalizing pastinas clothed elixirs gayer ptomainic hoodless nondestructively esculent releasers neutrality quotationally gleamiest unkept gonadectomized dipstick xxx absorbs possibler indulging charcoaled establismentarian handedly invalidism tubiform alterably sagged windstorms karts twinging outswims eyeshots flinging postmistress bemiring gazer minded emerita describer contaminated" ; + rdf:type bsbm-inst:ProductType13 ; + rdf:type bsbm-inst:ProductType3 ; + rdf:type bsbm-inst:ProductType1 ; + bsbm:productPropertyNumeric1 "1468"^^xsd:integer ; + bsbm:productPropertyNumeric2 "1142"^^xsd:integer ; + bsbm:productPropertyNumeric3 "709"^^xsd:integer ; + bsbm:productPropertyTextual1 "sedum menhir woefullest choicer bicentennially somersaults beds"^^xsd:string ; + bsbm:productPropertyTextual2 "embalmer regathered aminic transitively bedrocks sconcing"^^xsd:string ; + bsbm:productPropertyTextual3 "burnable quenchable refigured jubile sprints nonadhesive tremors alcoholics roentgenologists shogunal arborized jailor"^^xsd:string ; + bsbm:productPropertyTextual4 "fulfilling apartmental tintings caribous endmost connectives"^^xsd:string ; + bsbm:productFeature bsbm-inst:ProductFeature532 ; + bsbm:productFeature bsbm-inst:ProductFeature533 ; + bsbm:productFeature bsbm-inst:ProductFeature536 ; + bsbm:productFeature bsbm-inst:ProductFeature545 ; + bsbm:productFeature bsbm-inst:ProductFeature548 ; + bsbm:productFeature bsbm-inst:ProductFeature549 ; + bsbm:productFeature bsbm-inst:ProductFeature552 ; + bsbm:productFeature bsbm-inst:ProductFeature554 ; + bsbm:productFeature bsbm-inst:ProductFeature556 ; + bsbm:productFeature bsbm-inst:ProductFeature557 ; + bsbm:productFeature bsbm-inst:ProductFeature561 ; + bsbm:productFeature bsbm-inst:ProductFeature562 ; + bsbm:productFeature bsbm-inst:ProductFeature565 ; + bsbm:productFeature bsbm-inst:ProductFeature37 ; + bsbm:productFeature bsbm-inst:ProductFeature38 ; + bsbm:productFeature bsbm-inst:ProductFeature43 ; + bsbm:productFeature bsbm-inst:ProductFeature45 ; + bsbm:productFeature bsbm-inst:ProductFeature50 ; + bsbm:productFeature bsbm-inst:ProductFeature51 ; + bsbm:productFeature bsbm-inst:ProductFeature71 ; + bsbm:producer dataFromProducer2:Producer2 ; + dc:publisher dataFromProducer2:Producer2 ; + dc:date "2000-11-27"^^xsd:date . +dataFromProducer2:Product93 + rdf:type bsbm:Product ; + rdfs:label "kimonos adaptor lifer" ; + rdfs:comment "tetras cousins garotes battler rampages sherries outjuts callback feeing carved transportables discernment packeting macaronis bastille executives regents extenders pastinas poult negotiatrixes scented instrumentally possessed jellies wiver pricking slanderously besetter logways clevises copilots reffing febrifuge tending hawkbills cubits coloured prefixes couched holy router surcharged posited seducing vasomotor defined bulleted unrehearsed funkers matt freakout unzealously gismos villainess outcasts monosyllabic decks scummers issuances suggestibility encoding latish vignetting bracings sylphs notarizes deadpanned beguiled falsies endowed irregardless berettas uninviting hiding cunnilingus sowbread writer warrants bifurcation molluscan cenotaphic" ; + rdf:type bsbm-inst:ProductType18 ; + rdf:type bsbm-inst:ProductType5 ; + rdf:type bsbm-inst:ProductType1 ; + bsbm:productPropertyNumeric1 "271"^^xsd:integer ; + bsbm:productPropertyNumeric2 "458"^^xsd:integer ; + bsbm:productPropertyNumeric3 "547"^^xsd:integer ; + bsbm:productPropertyTextual1 "discourser vertigines jocundities dabs curling deliberation blundering crinoline"^^xsd:string ; + bsbm:productPropertyTextual2 "plagiarists theists aikidos"^^xsd:string ; + bsbm:productPropertyTextual3 "interjection microclimatology interpolator banishing draws stepladders ministration paganizes"^^xsd:string ; + bsbm:productPropertyTextual4 "prosiest detentes privity lousily gonococci"^^xsd:string ; + bsbm:productPropertyTextual5 "kinesiologic snitched priesthood cerebrally downgrades islands tunefulness spliced forboded crucially"^^xsd:string ; + bsbm:productFeature bsbm-inst:ProductFeature814 ; + bsbm:productFeature bsbm-inst:ProductFeature820 ; + bsbm:productFeature bsbm-inst:ProductFeature823 ; + bsbm:productFeature bsbm-inst:ProductFeature824 ; + bsbm:productFeature bsbm-inst:ProductFeature828 ; + bsbm:productFeature bsbm-inst:ProductFeature829 ; + bsbm:productFeature bsbm-inst:ProductFeature832 ; + bsbm:productFeature bsbm-inst:ProductFeature835 ; + bsbm:productFeature bsbm-inst:ProductFeature838 ; + bsbm:productFeature bsbm-inst:ProductFeature842 ; + bsbm:productFeature bsbm-inst:ProductFeature852 ; + bsbm:productFeature bsbm-inst:ProductFeature143 ; + bsbm:productFeature bsbm-inst:ProductFeature145 ; + bsbm:productFeature bsbm-inst:ProductFeature148 ; + bsbm:productFeature bsbm-inst:ProductFeature151 ; + bsbm:productFeature bsbm-inst:ProductFeature153 ; + bsbm:productFeature bsbm-inst:ProductFeature157 ; + bsbm:productFeature bsbm-inst:ProductFeature159 ; + bsbm:productFeature bsbm-inst:ProductFeature165 ; + bsbm:productFeature bsbm-inst:ProductFeature166 ; + bsbm:productFeature bsbm-inst:ProductFeature169 ; + bsbm:productFeature bsbm-inst:ProductFeature171 ; + bsbm:productFeature bsbm-inst:ProductFeature174 ; + bsbm:productFeature bsbm-inst:ProductFeature180 ; + bsbm:productFeature bsbm-inst:ProductFeature182 ; + bsbm:producer dataFromProducer2:Producer2 ; + dc:publisher dataFromProducer2:Producer2 ; + dc:date "2004-11-05"^^xsd:date . +dataFromProducer3:Producer3 + rdf:type bsbm:Producer ; + rdfs:label "paragraphing ajowans" ; + rdfs:comment "recreancy superscription corruptibilities barbells washability marginate divagations coded bellows marathons bunkoed negativing electrum biffs mg vectors regained seeds ratiocinates audits counterfeitness sentinels highth barware dives hawaiians" ; + foaf:homepage ; + bsbm:country ; + dc:publisher dataFromProducer3:Producer3 ; + dc:date "2002-08-26"^^xsd:date . +dataFromProducer3:Product94 + rdf:type bsbm:Product ; + rdfs:label "wineskins banded crc" ; + rdfs:comment "smudging inners fossae tremendousness biosensor loopier scalpels abundances overcharging reissuing mescalism entitling rechristens frontward republished scraggy horas bemuses throughway signatories engraving ixia redecorated peremptorily bimetal somewhen simmering bighead triskaidekaphobes dollish grasshopper borderers extrication rails leanly tanbark unreliably melanic wowed unstated unbolts shanked insolation evolvement horrors bawdies rerolled pinker sidlers dudes corder moralism mistier stripteases snoutiest references unthriftily easements vainness gangrenes motorcade complicating enclasping resentments sued bacchants pinons pastels sizier loudening defamation ophthalmoscopy chowtime duellers reinflame bummers pepsins quoit fielded stroking conniption surpassing enchant drains ceiler timbales licorices vouchsafing bedlamps pacs subglacial unfaltering admonishments cabbaged nonprescriptive bandboxes" ; + rdf:type bsbm-inst:ProductType17 ; + rdf:type bsbm-inst:ProductType4 ; + rdf:type bsbm-inst:ProductType1 ; + bsbm:productPropertyNumeric1 "625"^^xsd:integer ; + bsbm:productPropertyNumeric2 "630"^^xsd:integer ; + bsbm:productPropertyNumeric3 "801"^^xsd:integer ; + bsbm:productPropertyTextual1 "upleaping gangsterism prematurities shoving incontestably glower impassively magnateship flashgun seizers queuer extorsive reformating counterfeited disclose"^^xsd:string ; + bsbm:productPropertyTextual2 "rehinging simians ballooned veronicas mystifications unitizes perdues codefendants gunsmiths"^^xsd:string ; + bsbm:productPropertyTextual3 "completed abjection palatable hookahs corms biodegrade hokiest clergywomen upped shmoes bicarbs fossilize"^^xsd:string ; + bsbm:productPropertyTextual6 "fishwives aimlessly actuator reprove twirlers pouching prefaced"^^xsd:string ; + bsbm:productFeature bsbm-inst:ProductFeature749 ; + bsbm:productFeature bsbm-inst:ProductFeature766 ; + bsbm:productFeature bsbm-inst:ProductFeature768 ; + bsbm:productFeature bsbm-inst:ProductFeature769 ; + bsbm:productFeature bsbm-inst:ProductFeature770 ; + bsbm:productFeature bsbm-inst:ProductFeature771 ; + bsbm:productFeature bsbm-inst:ProductFeature776 ; + bsbm:productFeature bsbm-inst:ProductFeature778 ; + bsbm:productFeature bsbm-inst:ProductFeature783 ; + bsbm:productFeature bsbm-inst:ProductFeature789 ; + bsbm:productFeature bsbm-inst:ProductFeature790 ; + bsbm:productFeature bsbm-inst:ProductFeature791 ; + bsbm:productFeature bsbm-inst:ProductFeature795 ; + bsbm:productFeature bsbm-inst:ProductFeature809 ; + bsbm:productFeature bsbm-inst:ProductFeature810 ; + bsbm:productFeature bsbm-inst:ProductFeature813 ; + bsbm:productFeature bsbm-inst:ProductFeature77 ; + bsbm:productFeature bsbm-inst:ProductFeature79 ; + bsbm:productFeature bsbm-inst:ProductFeature80 ; + bsbm:productFeature bsbm-inst:ProductFeature83 ; + bsbm:productFeature bsbm-inst:ProductFeature85 ; + bsbm:productFeature bsbm-inst:ProductFeature89 ; + bsbm:productFeature bsbm-inst:ProductFeature90 ; + bsbm:productFeature bsbm-inst:ProductFeature95 ; + bsbm:productFeature bsbm-inst:ProductFeature102 ; + bsbm:productFeature bsbm-inst:ProductFeature107 ; + bsbm:productFeature bsbm-inst:ProductFeature109 ; + bsbm:productFeature bsbm-inst:ProductFeature116 ; + bsbm:productFeature bsbm-inst:ProductFeature119 ; + bsbm:productFeature bsbm-inst:ProductFeature121 ; + bsbm:productFeature bsbm-inst:ProductFeature127 ; + bsbm:productFeature bsbm-inst:ProductFeature138 ; + bsbm:producer dataFromProducer3:Producer3 ; + dc:publisher dataFromProducer3:Producer3 ; + dc:date "2004-04-18"^^xsd:date . +dataFromProducer3:Product95 + rdf:type bsbm:Product ; + rdfs:label "edgers defensiveness" ; + rdfs:comment "befouling decocted minimizing rencounters trampoline revoking pillions potentiometers goggler stoney sculks created harries pseudoartistic exhausts gests colonnades deadens runners cosmisms enchains confederates swizzled tammies inconsonant sapheads henceforward handpicked heaving harrows improvisations ursae fogginess unemployability wades ostracizing herbicidal syndicated evertors aphrodisiacs nutpicks nonexplosives unsheathing workup channelizing hagride abbacy gloms welterweights unweakened harder neatens waving incorporatorship maenades reformation apotheoses callowest omikron inweaved aux unbaked reruns purged eggplants mammotomy legality idlers overexercise amphibia nonappearances logways succinctly melanesians enterprize unendorsed airstream girt metricized lenitive slidable velveted reforested blamable retired researched measurement darers misguided anvils deaning bloodmobile belts unpredicted alerted spiritualists grayest mulcts elitisms pronouns backpacks sectoring immigration blenders skymen hempweeds growlers faintish specialize relive polemist surprized virologists spined corder pressuring stripier squadroned exorcisms quintan urges means" ; + rdf:type bsbm-inst:ProductType6 ; + rdf:type bsbm-inst:ProductType2 ; + rdf:type bsbm-inst:ProductType1 ; + bsbm:productPropertyNumeric1 "1030"^^xsd:integer ; + bsbm:productPropertyNumeric2 "296"^^xsd:integer ; + bsbm:productPropertyNumeric3 "424"^^xsd:integer ; + bsbm:productPropertyNumeric4 "1027"^^xsd:integer ; + bsbm:productPropertyNumeric5 "531"^^xsd:integer ; + bsbm:productPropertyTextual1 "troves lullabies diffused irreversibly circumambulating manifestly cursors"^^xsd:string ; + bsbm:productPropertyTextual2 "ritualize acned prestidigitators bathes transfigured embarkation gluten mispunctuate rapiers authoress"^^xsd:string ; + bsbm:productPropertyTextual3 "hasted preexamined misuser sallowest lexically saudis dikdik gallerying witnessed affixer"^^xsd:string ; + bsbm:productPropertyTextual4 "furrower kneehole hilts fertilities underexposing antagonizing"^^xsd:string ; + bsbm:productPropertyTextual5 "halflife pluckily chaconne antidepressive sceptres kippers"^^xsd:string ; + bsbm:productFeature bsbm-inst:ProductFeature186 ; + bsbm:productFeature bsbm-inst:ProductFeature192 ; + bsbm:productFeature bsbm-inst:ProductFeature193 ; + bsbm:productFeature bsbm-inst:ProductFeature196 ; + bsbm:productFeature bsbm-inst:ProductFeature201 ; + bsbm:productFeature bsbm-inst:ProductFeature203 ; + bsbm:productFeature bsbm-inst:ProductFeature214 ; + bsbm:productFeature bsbm-inst:ProductFeature2 ; + bsbm:productFeature bsbm-inst:ProductFeature7 ; + bsbm:productFeature bsbm-inst:ProductFeature11 ; + bsbm:productFeature bsbm-inst:ProductFeature13 ; + bsbm:productFeature bsbm-inst:ProductFeature16 ; + bsbm:productFeature bsbm-inst:ProductFeature18 ; + bsbm:productFeature bsbm-inst:ProductFeature28 ; + bsbm:productFeature bsbm-inst:ProductFeature29 ; + bsbm:productFeature bsbm-inst:ProductFeature31 ; + bsbm:productFeature bsbm-inst:ProductFeature33 ; + bsbm:productFeature bsbm-inst:ProductFeature35 ; + bsbm:productFeature bsbm-inst:ProductFeature36 ; + bsbm:producer dataFromProducer3:Producer3 ; + dc:publisher dataFromProducer3:Producer3 ; + dc:date "2004-09-29"^^xsd:date . +dataFromProducer3:Product96 + rdf:type bsbm:Product ; + rdfs:label "sandalled hasheeshes" ; + rdfs:comment "compartmentalizing clarioning inoculums logbook tries scrounger uninfluential mucky astonishingly interlarded avowers placarders shakeups soccers filed inveigling hashing overlong vaults evaluation bedsores enunciators dinking topknots ganefs scrambled savaged germicides complexioned woefulness pirouetted shoplifting gildings spurreys cyclical pegboxes coloraturas allegiantly sheetrock knacker cutters forwarders teazled grandaunts catamount extirpation ciphering friended reactors wardens rappelling welted hyphenating" ; + rdf:type bsbm-inst:ProductType10 ; + rdf:type bsbm-inst:ProductType3 ; + rdf:type bsbm-inst:ProductType1 ; + bsbm:productPropertyNumeric1 "312"^^xsd:integer ; + bsbm:productPropertyNumeric2 "809"^^xsd:integer ; + bsbm:productPropertyNumeric3 "645"^^xsd:integer ; + bsbm:productPropertyTextual1 "tumorous harbingers ayah mortgagees humorlessness soulfully stickmen grenada rah envoys meed sunbonnets"^^xsd:string ; + bsbm:productPropertyTextual2 "irrationally crosscurrent riposting inseam imbeciles defiance ignis heifer windjammer mystifies fullers appositions"^^xsd:string ; + bsbm:productPropertyTextual3 "fellating jabbered sidestrokes kryoliths impertinencies incidence smatterings unloaders forewords spouses utilities ripely bonnier featuring"^^xsd:string ; + bsbm:productPropertyTextual5 "recessively hunger indolently unshackle degenerating waxed courante swapping profanes stingos rosin impracticalities victimizations"^^xsd:string ; + bsbm:productFeature bsbm-inst:ProductFeature372 ; + bsbm:productFeature bsbm-inst:ProductFeature375 ; + bsbm:productFeature bsbm-inst:ProductFeature378 ; + bsbm:productFeature bsbm-inst:ProductFeature382 ; + bsbm:productFeature bsbm-inst:ProductFeature385 ; + bsbm:productFeature bsbm-inst:ProductFeature388 ; + bsbm:productFeature bsbm-inst:ProductFeature396 ; + bsbm:productFeature bsbm-inst:ProductFeature397 ; + bsbm:productFeature bsbm-inst:ProductFeature398 ; + bsbm:productFeature bsbm-inst:ProductFeature402 ; + bsbm:productFeature bsbm-inst:ProductFeature404 ; + bsbm:productFeature bsbm-inst:ProductFeature37 ; + bsbm:productFeature bsbm-inst:ProductFeature38 ; + bsbm:productFeature bsbm-inst:ProductFeature39 ; + bsbm:productFeature bsbm-inst:ProductFeature41 ; + bsbm:productFeature bsbm-inst:ProductFeature44 ; + bsbm:productFeature bsbm-inst:ProductFeature50 ; + bsbm:productFeature bsbm-inst:ProductFeature52 ; + bsbm:productFeature bsbm-inst:ProductFeature56 ; + bsbm:productFeature bsbm-inst:ProductFeature57 ; + bsbm:productFeature bsbm-inst:ProductFeature59 ; + bsbm:productFeature bsbm-inst:ProductFeature62 ; + bsbm:productFeature bsbm-inst:ProductFeature65 ; + bsbm:productFeature bsbm-inst:ProductFeature67 ; + bsbm:productFeature bsbm-inst:ProductFeature69 ; + bsbm:productFeature bsbm-inst:ProductFeature71 ; + bsbm:productFeature bsbm-inst:ProductFeature75 ; + bsbm:producer dataFromProducer3:Producer3 ; + dc:publisher dataFromProducer3:Producer3 ; + dc:date "2002-11-14"^^xsd:date . +dataFromProducer3:Product97 + rdf:type bsbm:Product ; + rdfs:label "maenades" ; + rdfs:comment "vapory papist vulva preys arbitrative bevelers surfacing frugged shylocking organizer erythema noncohesiveness undervalued marinaded mammographic insulated ethnicity glorification conceivers macrocephalous reproval witling estancias grenada coddles keratosis flatwise schemed acoustically trailered quints nonanalytic antitank unroll relinquishes oralogy assuagements commutatively humanization enforceability forded luted tidelands mestizos lagers blesses bulletins impingers olympics revelator bankings serialization winsomely vocation skidder taxidermists moisturizers commas flouncy onerosity overvalues subsidize customizes jerseys recomparison carrying happing repainting restitutory ampersands forseen barristers unquestioned custodies oklahoman swanning restart hareems triumvirate foulmouthed thermoses chorused trickishly tunneled reoriented angstroms canalized sawyers savoring wrongheadedly compressions skimming remittances forbears chauffeured mump flump mislabeled kneehole centimo cgs herringbones gemmiest" ; + rdf:type bsbm-inst:ProductType18 ; + rdf:type bsbm-inst:ProductType5 ; + rdf:type bsbm-inst:ProductType1 ; + bsbm:productPropertyNumeric1 "80"^^xsd:integer ; + bsbm:productPropertyNumeric2 "1114"^^xsd:integer ; + bsbm:productPropertyNumeric3 "81"^^xsd:integer ; + bsbm:productPropertyNumeric4 "1905"^^xsd:integer ; + bsbm:productPropertyTextual1 "pharmacies slipknot pretenders perfecting rarest demonizing antidisestablishmentarian annexed outraged idoliser alimentary seasickness microform"^^xsd:string ; + bsbm:productPropertyTextual2 "tromp reinsuring obstructionism stainer flumped timbale foamer mobsters recalled satanism"^^xsd:string ; + bsbm:productPropertyTextual3 "caciques agnostics finned replacers dinner depreciated anthropologically dishevelments shagginess emanations"^^xsd:string ; + bsbm:productFeature bsbm-inst:ProductFeature825 ; + bsbm:productFeature bsbm-inst:ProductFeature827 ; + bsbm:productFeature bsbm-inst:ProductFeature828 ; + bsbm:productFeature bsbm-inst:ProductFeature829 ; + bsbm:productFeature bsbm-inst:ProductFeature830 ; + bsbm:productFeature bsbm-inst:ProductFeature831 ; + bsbm:productFeature bsbm-inst:ProductFeature854 ; + bsbm:productFeature bsbm-inst:ProductFeature142 ; + bsbm:productFeature bsbm-inst:ProductFeature143 ; + bsbm:productFeature bsbm-inst:ProductFeature146 ; + bsbm:productFeature bsbm-inst:ProductFeature152 ; + bsbm:productFeature bsbm-inst:ProductFeature154 ; + bsbm:productFeature bsbm-inst:ProductFeature162 ; + bsbm:productFeature bsbm-inst:ProductFeature164 ; + bsbm:productFeature bsbm-inst:ProductFeature172 ; + bsbm:productFeature bsbm-inst:ProductFeature174 ; + bsbm:productFeature bsbm-inst:ProductFeature177 ; + bsbm:productFeature bsbm-inst:ProductFeature178 ; + bsbm:productFeature bsbm-inst:ProductFeature182 ; + bsbm:productFeature bsbm-inst:ProductFeature183 ; + bsbm:producer dataFromProducer3:Producer3 ; + dc:publisher dataFromProducer3:Producer3 ; + dc:date "2004-01-17"^^xsd:date . +dataFromProducer3:Product98 + rdf:type bsbm:Product ; + rdfs:label "spillway coxwain" ; + rdfs:comment "monogamousness halftones dimes flippers tucks bawdier vestibular percolated girt chimpanzees misconstrued evacuator paraplegics methodical straighteners puppydoms refund dynasts beleaguer symbolically achievements helmless incarnadines romancing brailed laywomen panning quagmires fumigants glop pinpoints payably expulsions pangolin ordinarier publishable haulers fibulae pourable roommates falling cushiness hardboots photosensitize discredited illegitimating analogousness gruffest bartending coasters antidepressive featherweights unclosing overtaxing emptings cameos treetops overimaginative winged reinvest assailment artificially citatum flushers countenancing bratty rakeoff geomedicine goaltender fakeers ghettoes cornhusk tinnily returnability harms sorrowing tipcart fencers prods overplays coitions romany reding exclusivity czechs omnicompetence wildly teenagers sphinges healer shearing dishware reformers dolefuller jellies amniote rimiest scrimshaws normalizer chantage simpering clubroots diversification infirmities emotionalist luckily refinanced waifs dentures gatherings foiling chorussed unlined laving multimillionaire agnostics faultfinder prorated closuring searched wearisomely whereunder cytologies playland retrievals appearing villus overdrawn unbred verbally backstretch prepackage astonishes currycombs causalities amnesiac" ; + rdf:type bsbm-inst:ProductType8 ; + rdf:type bsbm-inst:ProductType2 ; + rdf:type bsbm-inst:ProductType1 ; + bsbm:productPropertyNumeric1 "165"^^xsd:integer ; + bsbm:productPropertyNumeric2 "159"^^xsd:integer ; + bsbm:productPropertyNumeric3 "227"^^xsd:integer ; + bsbm:productPropertyNumeric5 "1720"^^xsd:integer ; + bsbm:productPropertyTextual1 "crockets stalker nonparticipation bibliographies relearns"^^xsd:string ; + bsbm:productPropertyTextual2 "steeds papering entombs unannounced revenged embodiments mono shmoes flagellators"^^xsd:string ; + bsbm:productPropertyTextual3 "independents honorifically velures compensators exfoliate supplanted drowsily densified"^^xsd:string ; + bsbm:productPropertyTextual6 "tiaras chalkiness pewterers toxicologic redrill defectors"^^xsd:string ; + bsbm:productFeature bsbm-inst:ProductFeature292 ; + bsbm:productFeature bsbm-inst:ProductFeature296 ; + bsbm:productFeature bsbm-inst:ProductFeature299 ; + bsbm:productFeature bsbm-inst:ProductFeature300 ; + bsbm:productFeature bsbm-inst:ProductFeature302 ; + bsbm:productFeature bsbm-inst:ProductFeature306 ; + bsbm:productFeature bsbm-inst:ProductFeature311 ; + bsbm:productFeature bsbm-inst:ProductFeature314 ; + bsbm:productFeature bsbm-inst:ProductFeature1 ; + bsbm:productFeature bsbm-inst:ProductFeature2 ; + bsbm:productFeature bsbm-inst:ProductFeature5 ; + bsbm:productFeature bsbm-inst:ProductFeature12 ; + bsbm:productFeature bsbm-inst:ProductFeature15 ; + bsbm:productFeature bsbm-inst:ProductFeature21 ; + bsbm:productFeature bsbm-inst:ProductFeature28 ; + bsbm:productFeature bsbm-inst:ProductFeature29 ; + bsbm:productFeature bsbm-inst:ProductFeature34 ; + bsbm:producer dataFromProducer3:Producer3 ; + dc:publisher dataFromProducer3:Producer3 ; + dc:date "2004-08-14"^^xsd:date . +dataFromProducer3:Product99 + rdf:type bsbm:Product ; + rdfs:label "perfumer unbecomingly" ; + rdfs:comment "stymying smarty fructified crescendos vouchsafes anesthesiologies dago grouped mayhems advancing hockshops scoldingly interlays latticing critiqued quietens obsequiously coronal infinities climatological theomania monoliths conurbations crappiest causeways feist swampish mitered banknotes housesitting stoppering nervier electors mastectomy noosed mucous grottoes glassiness agoraphobia reinvolved optometrical appals thwartly pulverization faxing depreciating campfires tinily insides lessened enamors fortuitus gigolos exaggeratedly hangovers chicles roquefort psyches harlotry difficultly hinnies enumerators improved envisaging buds protection waging catamite taphouse previews ferneries miaowed metastasize reexamines preexist autobiographically davenports butternuts unforgiving valium grogs shards shellers muzzled megavolts rumouring victimizer botanizes vexer sprinkles spic hyperbolically pleasantry hacklier untethered friability vacuolar rebops footbaths largest catalpas wraparound activity stammeringly tummy potterers copings oftenness" ; + rdf:type bsbm-inst:ProductType8 ; + rdf:type bsbm-inst:ProductType2 ; + rdf:type bsbm-inst:ProductType1 ; + bsbm:productPropertyNumeric1 "219"^^xsd:integer ; + bsbm:productPropertyNumeric2 "1261"^^xsd:integer ; + bsbm:productPropertyNumeric3 "470"^^xsd:integer ; + bsbm:productPropertyTextual1 "anility microphysics kiths discomfort noncompetitive basketry unweave incivil cooeys preappointed"^^xsd:string ; + bsbm:productPropertyTextual2 "headphones enlarger homonymies foehns horizons thunderclouds pulldown poppied nuns takedown atoning"^^xsd:string ; + bsbm:productPropertyTextual3 "shorelines sickness prettified origins deveining denuclearize blower"^^xsd:string ; + bsbm:productFeature bsbm-inst:ProductFeature295 ; + bsbm:productFeature bsbm-inst:ProductFeature296 ; + bsbm:productFeature bsbm-inst:ProductFeature300 ; + bsbm:productFeature bsbm-inst:ProductFeature301 ; + bsbm:productFeature bsbm-inst:ProductFeature309 ; + bsbm:productFeature bsbm-inst:ProductFeature320 ; + bsbm:productFeature bsbm-inst:ProductFeature2 ; + bsbm:productFeature bsbm-inst:ProductFeature3 ; + bsbm:productFeature bsbm-inst:ProductFeature8 ; + bsbm:productFeature bsbm-inst:ProductFeature34 ; + bsbm:productFeature bsbm-inst:ProductFeature35 ; + bsbm:producer dataFromProducer3:Producer3 ; + dc:publisher dataFromProducer3:Producer3 ; + dc:date "2005-10-31"^^xsd:date . +dataFromProducer3:Product100 + rdf:type bsbm:Product ; + rdfs:label "retying distance" ; + rdfs:comment "resider mysteries hulloaing nitroglycerin atrip economizer relieves generically veronicas hobbles overrate wearing substituter capitulations waistband dolled manillas aliener understated unheralded humorful bulletproof dermatitis polychromatic uncovers saliencies eyeholes retrains mg studiously snowman stet theatrically disannulling abandoned batboy manicuring mufflers securable dandification indisputably mediums misdraws micros omnipotently gallops everblooming tetanic scratchier cobwebbier attuning blackens gleams conferences followed desponds shivareed refuged preemies smoothie importance iterates queenliness precedence reinform" ; + rdf:type bsbm-inst:ProductType9 ; + rdf:type bsbm-inst:ProductType2 ; + rdf:type bsbm-inst:ProductType1 ; + bsbm:productPropertyNumeric1 "1066"^^xsd:integer ; + bsbm:productPropertyNumeric2 "876"^^xsd:integer ; + bsbm:productPropertyNumeric3 "1936"^^xsd:integer ; + bsbm:productPropertyTextual1 "crofters tamps brahmanist reductionism nictate slippy effacer hairweaving groveling bedecking eustachian pints aquaplanes"^^xsd:string ; + bsbm:productPropertyTextual2 "chisellers wanness oaters"^^xsd:string ; + bsbm:productPropertyTextual3 "effable retards breasted bangkoks cosignatories guardant tinners calcination steadying gobbets"^^xsd:string ; + bsbm:productPropertyTextual5 "premies complicatedly libs offcut taupe beaus ghastful"^^xsd:string ; + bsbm:productFeature bsbm-inst:ProductFeature328 ; + bsbm:productFeature bsbm-inst:ProductFeature333 ; + bsbm:productFeature bsbm-inst:ProductFeature334 ; + bsbm:productFeature bsbm-inst:ProductFeature338 ; + bsbm:productFeature bsbm-inst:ProductFeature342 ; + bsbm:productFeature bsbm-inst:ProductFeature344 ; + bsbm:productFeature bsbm-inst:ProductFeature350 ; + bsbm:productFeature bsbm-inst:ProductFeature356 ; + bsbm:productFeature bsbm-inst:ProductFeature359 ; + bsbm:productFeature bsbm-inst:ProductFeature362 ; + bsbm:productFeature bsbm-inst:ProductFeature364 ; + bsbm:productFeature bsbm-inst:ProductFeature366 ; + bsbm:productFeature bsbm-inst:ProductFeature368 ; + bsbm:productFeature bsbm-inst:ProductFeature3 ; + bsbm:productFeature bsbm-inst:ProductFeature4 ; + bsbm:productFeature bsbm-inst:ProductFeature7 ; + bsbm:productFeature bsbm-inst:ProductFeature9 ; + bsbm:productFeature bsbm-inst:ProductFeature13 ; + bsbm:productFeature bsbm-inst:ProductFeature18 ; + bsbm:productFeature bsbm-inst:ProductFeature19 ; + bsbm:productFeature bsbm-inst:ProductFeature21 ; + bsbm:productFeature bsbm-inst:ProductFeature22 ; + bsbm:productFeature bsbm-inst:ProductFeature26 ; + bsbm:productFeature bsbm-inst:ProductFeature35 ; + bsbm:productFeature bsbm-inst:ProductFeature36 ; + bsbm:producer dataFromProducer3:Producer3 ; + dc:publisher dataFromProducer3:Producer3 ; + dc:date "2004-09-23"^^xsd:date . +dataFromVendor1:Vendor1 + rdf:type bsbm:Vendor ; + rdfs:label "outreasons" ; + rdfs:comment "canebrake tailored noncivilized teuton vined adsorptively electrocardiographs subbing mitigator squarest phosgenes gallinules collops redesigned doings purposing nictated birthmarks displayed chemical cottiers whoopee provocatively luffs accedence aliening ombudsmen" ; + foaf:homepage ; + bsbm:country ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-31"^^xsd:date . +dataFromVendor1:Offer1 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product76 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7683.53"^^bsbm:USD ; + bsbm:validFrom "2008-03-20T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-09-11T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-17"^^xsd:date . +dataFromVendor1:Offer2 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product91 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "272.68"^^bsbm:USD ; + bsbm:validFrom "2008-03-26T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-24T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-14"^^xsd:date . +dataFromVendor1:Offer3 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product27 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "888.27"^^bsbm:USD ; + bsbm:validFrom "2008-02-15T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-22T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-21"^^xsd:date . +dataFromVendor1:Offer4 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product78 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9904.47"^^bsbm:USD ; + bsbm:validFrom "2008-03-26T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-08T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "7"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-07"^^xsd:date . +dataFromVendor1:Offer5 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product73 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3993.24"^^bsbm:USD ; + bsbm:validFrom "2008-01-16T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-11T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "7"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-24"^^xsd:date . +dataFromVendor1:Offer6 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product69 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "269.88"^^bsbm:USD ; + bsbm:validFrom "2008-03-15T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-21T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-25"^^xsd:date . +dataFromVendor1:Offer7 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product64 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7574.05"^^bsbm:USD ; + bsbm:validFrom "2008-05-13T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-22T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-20"^^xsd:date . +dataFromVendor1:Offer8 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product56 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7400.85"^^bsbm:USD ; + bsbm:validFrom "2008-03-05T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-24T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-01"^^xsd:date . +dataFromVendor1:Offer9 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product80 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4095.95"^^bsbm:USD ; + bsbm:validFrom "2008-02-05T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-20T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-09"^^xsd:date . +dataFromVendor1:Offer10 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product31 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6679.49"^^bsbm:USD ; + bsbm:validFrom "2008-04-20T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-24T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "7"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-21"^^xsd:date . +dataFromVendor1:Offer11 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product65 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "623.27"^^bsbm:USD ; + bsbm:validFrom "2008-04-04T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-09-02T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-09"^^xsd:date . +dataFromVendor1:Offer12 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product68 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7155.71"^^bsbm:USD ; + bsbm:validFrom "2008-02-20T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-23T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-12"^^xsd:date . +dataFromVendor1:Offer13 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product81 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4656.45"^^bsbm:USD ; + bsbm:validFrom "2008-03-30T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-19T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-25"^^xsd:date . +dataFromVendor1:Offer14 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product47 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2204.68"^^bsbm:USD ; + bsbm:validFrom "2008-05-12T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-09T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "6"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-28"^^xsd:date . +dataFromVendor1:Offer15 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product57 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1223.79"^^bsbm:USD ; + bsbm:validFrom "2008-01-05T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-13T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-21"^^xsd:date . +dataFromVendor1:Offer16 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product91 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9334.06"^^bsbm:USD ; + bsbm:validFrom "2008-01-02T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-03-26T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-18"^^xsd:date . +dataFromVendor1:Offer17 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product39 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9291.02"^^bsbm:USD ; + bsbm:validFrom "2008-05-03T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-18T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-14"^^xsd:date . +dataFromVendor1:Offer18 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product44 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9164.15"^^bsbm:USD ; + bsbm:validFrom "2008-03-15T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-24T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-25"^^xsd:date . +dataFromVendor1:Offer19 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product46 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2236.48"^^bsbm:USD ; + bsbm:validFrom "2008-03-29T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-20T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-05"^^xsd:date . +dataFromVendor1:Offer20 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product18 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1964.68"^^bsbm:USD ; + bsbm:validFrom "2008-05-12T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-06T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-08"^^xsd:date . +dataFromVendor1:Offer21 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product52 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9968.93"^^bsbm:USD ; + bsbm:validFrom "2008-04-10T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-11T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "1"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-24"^^xsd:date . +dataFromVendor1:Offer22 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product43 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "458.44"^^bsbm:USD ; + bsbm:validFrom "2008-05-03T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-16T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-14"^^xsd:date . +dataFromVendor1:Offer23 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product13 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "283.44"^^bsbm:USD ; + bsbm:validFrom "2008-02-21T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-12T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-20"^^xsd:date . +dataFromVendor1:Offer24 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product61 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9175.77"^^bsbm:USD ; + bsbm:validFrom "2008-05-21T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-23T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-24"^^xsd:date . +dataFromVendor1:Offer25 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product34 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2838.35"^^bsbm:USD ; + bsbm:validFrom "2008-05-03T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-11T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-10"^^xsd:date . +dataFromVendor1:Offer26 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product48 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3914.34"^^bsbm:USD ; + bsbm:validFrom "2008-03-05T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-06T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "1"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-30"^^xsd:date . +dataFromVendor1:Offer27 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product19 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2388.09"^^bsbm:USD ; + bsbm:validFrom "2008-01-16T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-13T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-25"^^xsd:date . +dataFromVendor1:Offer28 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product26 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9630.42"^^bsbm:USD ; + bsbm:validFrom "2008-02-04T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-01T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "6"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-15"^^xsd:date . +dataFromVendor1:Offer29 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product80 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6812.69"^^bsbm:USD ; + bsbm:validFrom "2008-03-18T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-10T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-03"^^xsd:date . +dataFromVendor1:Offer30 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product80 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1651.85"^^bsbm:USD ; + bsbm:validFrom "2008-02-23T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-02T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-22"^^xsd:date . +dataFromVendor1:Offer31 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product42 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1740.17"^^bsbm:USD ; + bsbm:validFrom "2008-02-18T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-21T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-10"^^xsd:date . +dataFromVendor1:Offer32 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product19 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2718.37"^^bsbm:USD ; + bsbm:validFrom "2008-05-03T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-23T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-12"^^xsd:date . +dataFromVendor1:Offer33 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product70 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5777.23"^^bsbm:USD ; + bsbm:validFrom "2008-04-16T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-11T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-15"^^xsd:date . +dataFromVendor1:Offer34 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product61 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8227.00"^^bsbm:USD ; + bsbm:validFrom "2008-02-27T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-15T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-16"^^xsd:date . +dataFromVendor1:Offer35 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product51 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9612.56"^^bsbm:USD ; + bsbm:validFrom "2008-02-20T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-08T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-15"^^xsd:date . +dataFromVendor1:Offer36 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product33 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2809.29"^^bsbm:USD ; + bsbm:validFrom "2008-05-15T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-24T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "1"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-08"^^xsd:date . +dataFromVendor1:Offer37 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product40 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7639.92"^^bsbm:USD ; + bsbm:validFrom "2008-04-26T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-22T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-06"^^xsd:date . +dataFromVendor1:Offer38 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product39 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4157.78"^^bsbm:USD ; + bsbm:validFrom "2008-05-05T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-21T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-19"^^xsd:date . +dataFromVendor1:Offer39 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product40 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3070.24"^^bsbm:USD ; + bsbm:validFrom "2008-04-28T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-01T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "6"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-02"^^xsd:date . +dataFromVendor1:Offer40 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product42 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4241.45"^^bsbm:USD ; + bsbm:validFrom "2007-12-30T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-15T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-27"^^xsd:date . +dataFromVendor1:Offer41 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer3:Product100 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6153.41"^^bsbm:USD ; + bsbm:validFrom "2008-02-07T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-21T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-25"^^xsd:date . +dataFromVendor1:Offer42 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product32 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3638.85"^^bsbm:USD ; + bsbm:validFrom "2008-01-20T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-18T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-13"^^xsd:date . +dataFromVendor1:Offer43 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product55 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "435.83"^^bsbm:USD ; + bsbm:validFrom "2008-02-13T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-17T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "7"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-09"^^xsd:date . +dataFromVendor1:Offer44 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product48 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2198.68"^^bsbm:USD ; + bsbm:validFrom "2008-02-18T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-17T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "6"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-05"^^xsd:date . +dataFromVendor1:Offer45 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product73 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3749.81"^^bsbm:USD ; + bsbm:validFrom "2008-02-23T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-18T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-25"^^xsd:date . +dataFromVendor1:Offer46 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product44 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8014.75"^^bsbm:USD ; + bsbm:validFrom "2008-04-26T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-19T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-11"^^xsd:date . +dataFromVendor1:Offer47 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product65 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9209.69"^^bsbm:USD ; + bsbm:validFrom "2008-03-17T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-26T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-03"^^xsd:date . +dataFromVendor1:Offer48 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product33 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7201.89"^^bsbm:USD ; + bsbm:validFrom "2008-04-12T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-29T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-04"^^xsd:date . +dataFromVendor1:Offer49 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product65 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6252.85"^^bsbm:USD ; + bsbm:validFrom "2008-02-10T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-01T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-15"^^xsd:date . +dataFromVendor1:Offer50 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product19 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8874.85"^^bsbm:USD ; + bsbm:validFrom "2008-04-06T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-18T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-23"^^xsd:date . +dataFromVendor1:Offer51 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product36 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3436.32"^^bsbm:USD ; + bsbm:validFrom "2008-02-26T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-28T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "6"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-17"^^xsd:date . +dataFromVendor1:Offer52 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product41 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3435.47"^^bsbm:USD ; + bsbm:validFrom "2008-04-04T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-19T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "7"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-11"^^xsd:date . +dataFromVendor1:Offer53 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product72 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2781.13"^^bsbm:USD ; + bsbm:validFrom "2008-02-01T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-11T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-04"^^xsd:date . +dataFromVendor1:Offer54 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product50 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7232.17"^^bsbm:USD ; + bsbm:validFrom "2008-01-11T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-28T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-29"^^xsd:date . +dataFromVendor1:Offer55 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product26 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "52.63"^^bsbm:USD ; + bsbm:validFrom "2008-03-22T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-15T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-17"^^xsd:date . +dataFromVendor1:Offer56 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product40 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3527.53"^^bsbm:USD ; + bsbm:validFrom "2008-03-10T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-06T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "1"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-29"^^xsd:date . +dataFromVendor1:Offer57 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product76 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6624.97"^^bsbm:USD ; + bsbm:validFrom "2008-05-03T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-28T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "7"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-20"^^xsd:date . +dataFromVendor1:Offer58 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product35 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7751.98"^^bsbm:USD ; + bsbm:validFrom "2008-04-17T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-29T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "1"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-20"^^xsd:date . +dataFromVendor1:Offer59 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product62 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6402.32"^^bsbm:USD ; + bsbm:validFrom "2008-03-30T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-10T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-13"^^xsd:date . +dataFromVendor1:Offer60 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product77 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5076.69"^^bsbm:USD ; + bsbm:validFrom "2008-04-02T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-29T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-10"^^xsd:date . +dataFromVendor1:Offer61 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product79 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5492.88"^^bsbm:USD ; + bsbm:validFrom "2008-03-21T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-20T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-30"^^xsd:date . +dataFromVendor1:Offer62 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product31 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9464.61"^^bsbm:USD ; + bsbm:validFrom "2008-04-09T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-09T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-17"^^xsd:date . +dataFromVendor1:Offer63 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product28 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3404.50"^^bsbm:USD ; + bsbm:validFrom "2008-04-08T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-24T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "1"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-12"^^xsd:date . +dataFromVendor1:Offer64 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product23 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6541.81"^^bsbm:USD ; + bsbm:validFrom "2008-02-21T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-29T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-20"^^xsd:date . +dataFromVendor1:Offer65 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product41 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1857.69"^^bsbm:USD ; + bsbm:validFrom "2008-01-08T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-01T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-24"^^xsd:date . +dataFromVendor1:Offer66 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product43 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6900.95"^^bsbm:USD ; + bsbm:validFrom "2008-05-22T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-29T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-18"^^xsd:date . +dataFromVendor1:Offer67 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product85 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1428.11"^^bsbm:USD ; + bsbm:validFrom "2008-03-24T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-25T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-30"^^xsd:date . +dataFromVendor1:Offer68 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product21 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2730.01"^^bsbm:USD ; + bsbm:validFrom "2008-03-12T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-06T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "6"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-23"^^xsd:date . +dataFromVendor1:Offer69 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product93 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6790.77"^^bsbm:USD ; + bsbm:validFrom "2008-04-04T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-31T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-02"^^xsd:date . +dataFromVendor1:Offer70 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product82 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8092.71"^^bsbm:USD ; + bsbm:validFrom "2008-03-04T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-02T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-18"^^xsd:date . +dataFromVendor1:Offer71 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product37 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8522.98"^^bsbm:USD ; + bsbm:validFrom "2008-02-07T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-01T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-20"^^xsd:date . +dataFromVendor1:Offer72 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product71 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2556.84"^^bsbm:USD ; + bsbm:validFrom "2007-12-30T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-17T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-23"^^xsd:date . +dataFromVendor1:Offer73 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product52 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3097.06"^^bsbm:USD ; + bsbm:validFrom "2008-05-14T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-08T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-23"^^xsd:date . +dataFromVendor1:Offer74 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product41 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8413.20"^^bsbm:USD ; + bsbm:validFrom "2007-12-31T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-10T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-19"^^xsd:date . +dataFromVendor1:Offer75 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product29 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3031.46"^^bsbm:USD ; + bsbm:validFrom "2008-02-21T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-16T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-02"^^xsd:date . +dataFromVendor1:Offer76 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product69 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4306.36"^^bsbm:USD ; + bsbm:validFrom "2008-05-14T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-27T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-20"^^xsd:date . +dataFromVendor1:Offer77 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product34 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6006.75"^^bsbm:USD ; + bsbm:validFrom "2008-04-29T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-23T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-14"^^xsd:date . +dataFromVendor1:Offer78 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product26 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1663.27"^^bsbm:USD ; + bsbm:validFrom "2008-04-15T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-26T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-15"^^xsd:date . +dataFromVendor1:Offer79 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product64 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5103.93"^^bsbm:USD ; + bsbm:validFrom "2008-03-01T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-29T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-12"^^xsd:date . +dataFromVendor1:Offer80 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product39 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6047.57"^^bsbm:USD ; + bsbm:validFrom "2008-03-21T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-29T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-21"^^xsd:date . +dataFromVendor1:Offer81 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product84 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2353.71"^^bsbm:USD ; + bsbm:validFrom "2008-04-02T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-15T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-22"^^xsd:date . +dataFromVendor1:Offer82 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product50 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2360.84"^^bsbm:USD ; + bsbm:validFrom "2008-02-06T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-18T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-21"^^xsd:date . +dataFromVendor1:Offer83 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product43 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4309.85"^^bsbm:USD ; + bsbm:validFrom "2008-02-25T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-25T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-27"^^xsd:date . +dataFromVendor1:Offer84 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product73 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1427.42"^^bsbm:USD ; + bsbm:validFrom "2008-04-16T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-03T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-26"^^xsd:date . +dataFromVendor1:Offer85 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product28 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1444.30"^^bsbm:USD ; + bsbm:validFrom "2008-02-17T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-09T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-19"^^xsd:date . +dataFromVendor1:Offer86 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product77 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5715.88"^^bsbm:USD ; + bsbm:validFrom "2008-03-19T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-30T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-02"^^xsd:date . +dataFromVendor1:Offer87 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product67 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2784.83"^^bsbm:USD ; + bsbm:validFrom "2008-04-07T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-28T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "1"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-08"^^xsd:date . +dataFromVendor1:Offer88 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product64 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3514.38"^^bsbm:USD ; + bsbm:validFrom "2007-12-19T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-10T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-18"^^xsd:date . +dataFromVendor1:Offer89 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product63 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3533.80"^^bsbm:USD ; + bsbm:validFrom "2008-06-02T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-07T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-12"^^xsd:date . +dataFromVendor1:Offer90 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product44 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4176.95"^^bsbm:USD ; + bsbm:validFrom "2008-01-31T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-16T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-06"^^xsd:date . +dataFromVendor1:Offer91 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product51 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6068.10"^^bsbm:USD ; + bsbm:validFrom "2008-03-27T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-05T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-17"^^xsd:date . +dataFromVendor1:Offer92 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product57 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1935.25"^^bsbm:USD ; + bsbm:validFrom "2008-05-18T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-22T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-22"^^xsd:date . +dataFromVendor1:Offer93 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product32 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4171.89"^^bsbm:USD ; + bsbm:validFrom "2008-04-02T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-30T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-11"^^xsd:date . +dataFromVendor1:Offer94 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product77 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2023.70"^^bsbm:USD ; + bsbm:validFrom "2008-05-22T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-18T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-10"^^xsd:date . +dataFromVendor1:Offer95 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product71 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6178.36"^^bsbm:USD ; + bsbm:validFrom "2008-01-30T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-13T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "1"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-23"^^xsd:date . +dataFromVendor1:Offer96 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product53 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "926.71"^^bsbm:USD ; + bsbm:validFrom "2008-02-24T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-29T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-24"^^xsd:date . +dataFromVendor1:Offer97 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product18 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5251.84"^^bsbm:USD ; + bsbm:validFrom "2007-12-27T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-18T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-25"^^xsd:date . +dataFromVendor1:Offer98 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product83 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1963.72"^^bsbm:USD ; + bsbm:validFrom "2008-04-01T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-01T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-17"^^xsd:date . +dataFromVendor1:Offer99 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product46 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3974.74"^^bsbm:USD ; + bsbm:validFrom "2008-03-07T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-29T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "1"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-01"^^xsd:date . +dataFromVendor1:Offer100 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product27 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8561.76"^^bsbm:USD ; + bsbm:validFrom "2008-05-05T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-01T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-26"^^xsd:date . +dataFromVendor1:Offer101 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product51 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6097.13"^^bsbm:USD ; + bsbm:validFrom "2008-02-13T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-01T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-31"^^xsd:date . +dataFromVendor1:Offer102 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product52 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "160.89"^^bsbm:USD ; + bsbm:validFrom "2008-04-16T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-10T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-01"^^xsd:date . +dataFromVendor1:Offer103 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product86 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "408.50"^^bsbm:USD ; + bsbm:validFrom "2008-01-12T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-12T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-01"^^xsd:date . +dataFromVendor1:Offer104 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product61 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9830.16"^^bsbm:USD ; + bsbm:validFrom "2008-03-12T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-12T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-12"^^xsd:date . +dataFromVendor1:Offer105 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product57 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "393.02"^^bsbm:USD ; + bsbm:validFrom "2008-03-09T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-14T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-25"^^xsd:date . +dataFromVendor1:Offer106 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product76 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8630.97"^^bsbm:USD ; + bsbm:validFrom "2008-05-01T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-11T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "6"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-20"^^xsd:date . +dataFromVendor1:Offer107 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product69 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8709.68"^^bsbm:USD ; + bsbm:validFrom "2008-05-05T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-24T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-02"^^xsd:date . +dataFromVendor1:Offer108 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product83 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8725.34"^^bsbm:USD ; + bsbm:validFrom "2008-02-05T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-30T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-13"^^xsd:date . +dataFromVendor1:Offer109 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product84 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7269.04"^^bsbm:USD ; + bsbm:validFrom "2008-02-22T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-02T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-13"^^xsd:date . +dataFromVendor1:Offer110 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product19 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6499.12"^^bsbm:USD ; + bsbm:validFrom "2007-12-30T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-01T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-23"^^xsd:date . +dataFromVendor1:Offer111 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product58 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2121.70"^^bsbm:USD ; + bsbm:validFrom "2008-01-18T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-05T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "8"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-29"^^xsd:date . +dataFromVendor1:Offer112 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product66 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7099.58"^^bsbm:USD ; + bsbm:validFrom "2008-05-05T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-18T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-05"^^xsd:date . +dataFromVendor1:Offer113 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product25 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7417.43"^^bsbm:USD ; + bsbm:validFrom "2008-04-02T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-14T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-04"^^xsd:date . +dataFromVendor1:Offer114 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product5 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3972.59"^^bsbm:USD ; + bsbm:validFrom "2008-03-19T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-19T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-17"^^xsd:date . +dataFromVendor1:Offer115 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product67 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4150.77"^^bsbm:USD ; + bsbm:validFrom "2008-02-23T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-09T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-11"^^xsd:date . +dataFromVendor1:Offer116 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product6 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "442.29"^^bsbm:USD ; + bsbm:validFrom "2008-04-05T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-26T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-29"^^xsd:date . +dataFromVendor1:Offer117 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product24 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7456.11"^^bsbm:USD ; + bsbm:validFrom "2008-03-14T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-12T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-04"^^xsd:date . +dataFromVendor1:Offer118 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product74 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5580.74"^^bsbm:USD ; + bsbm:validFrom "2008-05-17T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-20T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-17"^^xsd:date . +dataFromVendor1:Offer119 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product39 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1060.58"^^bsbm:USD ; + bsbm:validFrom "2008-03-03T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-03T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-15"^^xsd:date . +dataFromVendor1:Offer120 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product34 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3270.71"^^bsbm:USD ; + bsbm:validFrom "2008-05-22T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-07T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-29"^^xsd:date . +dataFromVendor1:Offer121 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product37 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8468.69"^^bsbm:USD ; + bsbm:validFrom "2008-04-20T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-23T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-03"^^xsd:date . +dataFromVendor1:Offer122 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product72 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1563.25"^^bsbm:USD ; + bsbm:validFrom "2008-03-16T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-19T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-29"^^xsd:date . +dataFromVendor1:Offer123 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product64 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8516.56"^^bsbm:USD ; + bsbm:validFrom "2008-03-17T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-09-06T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-12"^^xsd:date . +dataFromVendor1:Offer124 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product35 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9375.48"^^bsbm:USD ; + bsbm:validFrom "2008-02-29T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-17T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-08"^^xsd:date . +dataFromVendor1:Offer125 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product22 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6977.46"^^bsbm:USD ; + bsbm:validFrom "2008-02-22T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-31T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "1"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-15"^^xsd:date . +dataFromVendor1:Offer126 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product73 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8841.00"^^bsbm:USD ; + bsbm:validFrom "2008-02-29T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-16T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-08"^^xsd:date . +dataFromVendor1:Offer127 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product44 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7092.74"^^bsbm:USD ; + bsbm:validFrom "2008-03-14T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-03-31T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-24"^^xsd:date . +dataFromVendor1:Offer128 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product19 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4557.73"^^bsbm:USD ; + bsbm:validFrom "2008-03-28T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-09-05T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "6"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-17"^^xsd:date . +dataFromVendor1:Offer129 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product22 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9179.57"^^bsbm:USD ; + bsbm:validFrom "2008-03-22T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-14T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "1"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-22"^^xsd:date . +dataFromVendor1:Offer130 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product48 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5593.11"^^bsbm:USD ; + bsbm:validFrom "2008-03-27T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-03T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-30"^^xsd:date . +dataFromVendor1:Offer131 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product11 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3582.96"^^bsbm:USD ; + bsbm:validFrom "2008-01-20T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-28T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-19"^^xsd:date . +dataFromVendor1:Offer132 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product75 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2067.76"^^bsbm:USD ; + bsbm:validFrom "2008-01-27T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-22T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-29"^^xsd:date . +dataFromVendor1:Offer133 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product73 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1794.72"^^bsbm:USD ; + bsbm:validFrom "2008-04-01T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-04T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-19"^^xsd:date . +dataFromVendor1:Offer134 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product40 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5762.02"^^bsbm:USD ; + bsbm:validFrom "2008-03-19T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-23T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-12"^^xsd:date . +dataFromVendor1:Offer135 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product34 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7792.07"^^bsbm:USD ; + bsbm:validFrom "2008-02-11T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-30T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-18"^^xsd:date . +dataFromVendor1:Offer136 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product51 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3489.39"^^bsbm:USD ; + bsbm:validFrom "2008-03-19T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-08T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-02"^^xsd:date . +dataFromVendor1:Offer137 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product52 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5282.03"^^bsbm:USD ; + bsbm:validFrom "2008-04-04T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-04T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "7"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-20"^^xsd:date . +dataFromVendor1:Offer138 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer3:Product97 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2567.78"^^bsbm:USD ; + bsbm:validFrom "2008-02-01T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-05T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-08"^^xsd:date . +dataFromVendor1:Offer139 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product29 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6836.16"^^bsbm:USD ; + bsbm:validFrom "2008-06-02T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-18T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-11"^^xsd:date . +dataFromVendor1:Offer140 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product47 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "207.61"^^bsbm:USD ; + bsbm:validFrom "2008-03-23T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-08T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-14"^^xsd:date . +dataFromVendor1:Offer141 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product56 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7847.08"^^bsbm:USD ; + bsbm:validFrom "2008-03-08T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-29T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-02"^^xsd:date . +dataFromVendor1:Offer142 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product52 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2365.73"^^bsbm:USD ; + bsbm:validFrom "2008-03-13T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-26T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-09"^^xsd:date . +dataFromVendor1:Offer143 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product4 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1490.17"^^bsbm:USD ; + bsbm:validFrom "2008-03-10T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-31T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "6"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-03"^^xsd:date . +dataFromVendor1:Offer144 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product43 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3161.07"^^bsbm:USD ; + bsbm:validFrom "2008-01-20T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-01T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-05"^^xsd:date . +dataFromVendor1:Offer145 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product40 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "949.13"^^bsbm:USD ; + bsbm:validFrom "2008-05-14T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-31T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-19"^^xsd:date . +dataFromVendor1:Offer146 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product27 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2866.25"^^bsbm:USD ; + bsbm:validFrom "2008-02-23T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-10T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-27"^^xsd:date . +dataFromVendor1:Offer147 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product27 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1704.35"^^bsbm:USD ; + bsbm:validFrom "2008-01-15T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-24T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-24"^^xsd:date . +dataFromVendor1:Offer148 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product44 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1124.54"^^bsbm:USD ; + bsbm:validFrom "2008-04-20T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-23T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-20"^^xsd:date . +dataFromVendor1:Offer149 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product56 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9682.03"^^bsbm:USD ; + bsbm:validFrom "2008-03-13T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-17T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-18"^^xsd:date . +dataFromVendor1:Offer150 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product41 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2118.53"^^bsbm:USD ; + bsbm:validFrom "2008-03-15T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-13T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-09"^^xsd:date . +dataFromVendor1:Offer151 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product28 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "850.31"^^bsbm:USD ; + bsbm:validFrom "2008-04-06T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-24T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-08"^^xsd:date . +dataFromVendor1:Offer152 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product42 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "140.40"^^bsbm:USD ; + bsbm:validFrom "2008-02-28T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-04T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "1"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-14"^^xsd:date . +dataFromVendor1:Offer153 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product85 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3906.45"^^bsbm:USD ; + bsbm:validFrom "2008-03-04T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-21T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-19"^^xsd:date . +dataFromVendor1:Offer154 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product37 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7219.12"^^bsbm:USD ; + bsbm:validFrom "2008-02-12T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-13T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-20"^^xsd:date . +dataFromVendor1:Offer155 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product48 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "730.81"^^bsbm:USD ; + bsbm:validFrom "2008-05-30T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-09T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-14"^^xsd:date . +dataFromVendor1:Offer156 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product80 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9361.75"^^bsbm:USD ; + bsbm:validFrom "2008-04-16T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-22T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-19"^^xsd:date . +dataFromVendor1:Offer157 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product68 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8294.30"^^bsbm:USD ; + bsbm:validFrom "2008-02-26T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-15T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-02"^^xsd:date . +dataFromVendor1:Offer158 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product20 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4210.05"^^bsbm:USD ; + bsbm:validFrom "2008-01-23T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-13T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "7"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-02"^^xsd:date . +dataFromVendor1:Offer159 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product82 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1966.43"^^bsbm:USD ; + bsbm:validFrom "2008-03-18T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-01T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-02"^^xsd:date . +dataFromVendor1:Offer160 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product63 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "988.80"^^bsbm:USD ; + bsbm:validFrom "2008-04-15T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-21T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-26"^^xsd:date . +dataFromVendor1:Offer161 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer3:Product98 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2310.46"^^bsbm:USD ; + bsbm:validFrom "2008-02-26T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-15T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-06"^^xsd:date . +dataFromVendor1:Offer162 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product68 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3054.70"^^bsbm:USD ; + bsbm:validFrom "2008-04-20T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-17T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-04"^^xsd:date . +dataFromVendor1:Offer163 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product28 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6805.74"^^bsbm:USD ; + bsbm:validFrom "2008-03-04T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-07T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "1"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-30"^^xsd:date . +dataFromVendor1:Offer164 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product5 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4413.49"^^bsbm:USD ; + bsbm:validFrom "2008-03-01T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-13T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-20"^^xsd:date . +dataFromVendor1:Offer165 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product48 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3255.42"^^bsbm:USD ; + bsbm:validFrom "2008-03-03T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-13T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "1"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-15"^^xsd:date . +dataFromVendor1:Offer166 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product73 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4213.52"^^bsbm:USD ; + bsbm:validFrom "2008-02-21T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-11T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-21"^^xsd:date . +dataFromVendor1:Offer167 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product55 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3944.70"^^bsbm:USD ; + bsbm:validFrom "2008-05-28T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-03T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "6"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-28"^^xsd:date . +dataFromVendor1:Offer168 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product58 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7431.58"^^bsbm:USD ; + bsbm:validFrom "2008-04-25T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-17T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-08"^^xsd:date . +dataFromVendor1:Offer169 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product44 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8351.18"^^bsbm:USD ; + bsbm:validFrom "2008-02-21T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-13T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-24"^^xsd:date . +dataFromVendor1:Offer170 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product57 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5705.57"^^bsbm:USD ; + bsbm:validFrom "2008-02-26T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-10T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-23"^^xsd:date . +dataFromVendor1:Offer171 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product65 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7389.40"^^bsbm:USD ; + bsbm:validFrom "2008-05-13T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-23T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-18"^^xsd:date . +dataFromVendor1:Offer172 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product20 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9544.72"^^bsbm:USD ; + bsbm:validFrom "2008-02-21T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-19T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-12"^^xsd:date . +dataFromVendor1:Offer173 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product20 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4086.57"^^bsbm:USD ; + bsbm:validFrom "2008-02-19T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-12T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "6"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-17"^^xsd:date . +dataFromVendor1:Offer174 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product53 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2125.28"^^bsbm:USD ; + bsbm:validFrom "2008-03-08T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-22T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-04"^^xsd:date . +dataFromVendor1:Offer175 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product44 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4005.21"^^bsbm:USD ; + bsbm:validFrom "2008-02-09T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-07T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-27"^^xsd:date . +dataFromVendor1:Offer176 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product63 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5159.04"^^bsbm:USD ; + bsbm:validFrom "2008-03-05T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-16T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-11"^^xsd:date . +dataFromVendor1:Offer177 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product83 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3661.98"^^bsbm:USD ; + bsbm:validFrom "2008-02-09T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-12T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-06"^^xsd:date . +dataFromVendor1:Offer178 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product59 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9542.92"^^bsbm:USD ; + bsbm:validFrom "2008-02-29T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-30T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "1"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-21"^^xsd:date . +dataFromVendor1:Offer179 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product48 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6724.16"^^bsbm:USD ; + bsbm:validFrom "2008-03-05T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-24T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-01"^^xsd:date . +dataFromVendor1:Offer180 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product55 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6820.51"^^bsbm:USD ; + bsbm:validFrom "2008-03-12T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-12T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-11"^^xsd:date . +dataFromVendor1:Offer181 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product70 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5907.01"^^bsbm:USD ; + bsbm:validFrom "2008-06-16T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-09-10T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-17"^^xsd:date . +dataFromVendor1:Offer182 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product36 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2790.85"^^bsbm:USD ; + bsbm:validFrom "2008-05-05T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-08T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-23"^^xsd:date . +dataFromVendor1:Offer183 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product84 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3086.08"^^bsbm:USD ; + bsbm:validFrom "2008-01-28T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-15T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-19"^^xsd:date . +dataFromVendor1:Offer184 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product53 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1235.98"^^bsbm:USD ; + bsbm:validFrom "2008-04-02T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-20T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "1"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-18"^^xsd:date . +dataFromVendor1:Offer185 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product57 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1428.63"^^bsbm:USD ; + bsbm:validFrom "2008-05-13T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-15T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-29"^^xsd:date . +dataFromVendor1:Offer186 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product42 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3961.27"^^bsbm:USD ; + bsbm:validFrom "2008-03-30T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-06T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-15"^^xsd:date . +dataFromVendor1:Offer187 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product34 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1082.70"^^bsbm:USD ; + bsbm:validFrom "2008-02-03T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-29T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-24"^^xsd:date . +dataFromVendor1:Offer188 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product45 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3192.62"^^bsbm:USD ; + bsbm:validFrom "2008-03-20T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-29T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-14"^^xsd:date . +dataFromVendor1:Offer189 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product43 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4320.76"^^bsbm:USD ; + bsbm:validFrom "2008-03-27T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-15T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-10"^^xsd:date . +dataFromVendor1:Offer190 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product45 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3720.24"^^bsbm:USD ; + bsbm:validFrom "2008-02-17T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-13T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-21"^^xsd:date . +dataFromVendor1:Offer191 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product83 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6957.79"^^bsbm:USD ; + bsbm:validFrom "2008-03-17T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-17T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-25"^^xsd:date . +dataFromVendor1:Offer192 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product44 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5172.30"^^bsbm:USD ; + bsbm:validFrom "2008-04-01T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-31T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "1"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-24"^^xsd:date . +dataFromVendor1:Offer193 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product79 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "310.42"^^bsbm:USD ; + bsbm:validFrom "2008-03-26T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-20T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-05"^^xsd:date . +dataFromVendor1:Offer194 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product89 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9236.12"^^bsbm:USD ; + bsbm:validFrom "2008-03-08T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-01T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-12"^^xsd:date . +dataFromVendor1:Offer195 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product57 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2000.16"^^bsbm:USD ; + bsbm:validFrom "2008-02-25T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-14T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-25"^^xsd:date . +dataFromVendor1:Offer196 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product25 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2765.94"^^bsbm:USD ; + bsbm:validFrom "2008-01-04T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-18T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-21"^^xsd:date . +dataFromVendor1:Offer197 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product37 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4563.93"^^bsbm:USD ; + bsbm:validFrom "2008-01-02T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-13T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-22"^^xsd:date . +dataFromVendor1:Offer198 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product47 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5274.73"^^bsbm:USD ; + bsbm:validFrom "2008-04-10T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-26T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "1"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-13"^^xsd:date . +dataFromVendor1:Offer199 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product36 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7854.93"^^bsbm:USD ; + bsbm:validFrom "2008-04-13T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-10T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-03"^^xsd:date . +dataFromVendor1:Offer200 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product58 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8627.07"^^bsbm:USD ; + bsbm:validFrom "2008-03-06T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-18T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-03"^^xsd:date . +dataFromVendor1:Offer201 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product57 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5085.61"^^bsbm:USD ; + bsbm:validFrom "2008-05-21T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-27T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-22"^^xsd:date . +dataFromVendor1:Offer202 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product18 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7316.88"^^bsbm:USD ; + bsbm:validFrom "2008-01-29T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-01T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-24"^^xsd:date . +dataFromVendor1:Offer203 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product41 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2542.50"^^bsbm:USD ; + bsbm:validFrom "2008-03-15T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-06T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-31"^^xsd:date . +dataFromVendor1:Offer204 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product72 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "187.05"^^bsbm:USD ; + bsbm:validFrom "2008-05-02T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-28T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-05"^^xsd:date . +dataFromVendor1:Offer205 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product78 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9920.22"^^bsbm:USD ; + bsbm:validFrom "2008-02-15T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-30T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-14"^^xsd:date . +dataFromVendor1:Offer206 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product39 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8242.94"^^bsbm:USD ; + bsbm:validFrom "2008-05-03T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-05T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-28"^^xsd:date . +dataFromVendor1:Offer207 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product63 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1598.10"^^bsbm:USD ; + bsbm:validFrom "2008-03-08T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-02T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "1"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-10"^^xsd:date . +dataFromVendor1:Offer208 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product27 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8723.58"^^bsbm:USD ; + bsbm:validFrom "2008-05-01T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-22T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-12"^^xsd:date . +dataFromVendor1:Offer209 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product53 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9073.87"^^bsbm:USD ; + bsbm:validFrom "2008-05-20T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-23T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-26"^^xsd:date . +dataFromVendor1:Offer210 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product63 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2437.80"^^bsbm:USD ; + bsbm:validFrom "2008-05-26T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-23T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-01"^^xsd:date . +dataFromVendor1:Offer211 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product84 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1553.76"^^bsbm:USD ; + bsbm:validFrom "2008-04-21T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-04T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-22"^^xsd:date . +dataFromVendor1:Offer212 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product86 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "152.64"^^bsbm:USD ; + bsbm:validFrom "2008-03-01T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-12T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-17"^^xsd:date . +dataFromVendor1:Offer213 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product65 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4397.20"^^bsbm:USD ; + bsbm:validFrom "2008-03-23T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-09T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-04"^^xsd:date . +dataFromVendor1:Offer214 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product44 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3803.34"^^bsbm:USD ; + bsbm:validFrom "2008-04-30T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-15T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-08"^^xsd:date . +dataFromVendor1:Offer215 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product53 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5223.30"^^bsbm:USD ; + bsbm:validFrom "2008-03-17T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-17T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "6"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-31"^^xsd:date . +dataFromVendor1:Offer216 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product80 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "12.87"^^bsbm:USD ; + bsbm:validFrom "2008-04-26T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-15T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-12"^^xsd:date . +dataFromVendor1:Offer217 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product78 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3303.17"^^bsbm:USD ; + bsbm:validFrom "2008-02-23T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-11T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "6"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-26"^^xsd:date . +dataFromVendor1:Offer218 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product69 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6649.12"^^bsbm:USD ; + bsbm:validFrom "2008-01-29T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-08T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-24"^^xsd:date . +dataFromVendor1:Offer219 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product70 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "924.50"^^bsbm:USD ; + bsbm:validFrom "2008-04-03T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-19T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "1"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-02"^^xsd:date . +dataFromVendor1:Offer220 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product54 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8065.08"^^bsbm:USD ; + bsbm:validFrom "2008-03-16T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-01T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-22"^^xsd:date . +dataFromVendor1:Offer221 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product52 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4625.62"^^bsbm:USD ; + bsbm:validFrom "2008-04-12T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-29T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-14"^^xsd:date . +dataFromVendor1:Offer222 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product26 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "851.05"^^bsbm:USD ; + bsbm:validFrom "2008-03-07T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-06T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-29"^^xsd:date . +dataFromVendor1:Offer223 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product49 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "156.47"^^bsbm:USD ; + bsbm:validFrom "2008-04-22T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-02T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "1"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-26"^^xsd:date . +dataFromVendor1:Offer224 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product60 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "53.33"^^bsbm:USD ; + bsbm:validFrom "2008-04-13T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-22T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-11"^^xsd:date . +dataFromVendor1:Offer225 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product68 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7423.52"^^bsbm:USD ; + bsbm:validFrom "2008-02-16T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-03T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-25"^^xsd:date . +dataFromVendor1:Offer226 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product44 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5241.22"^^bsbm:USD ; + bsbm:validFrom "2008-03-05T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-18T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-28"^^xsd:date . +dataFromVendor1:Offer227 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product53 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "869.20"^^bsbm:USD ; + bsbm:validFrom "2008-02-09T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-15T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "6"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-27"^^xsd:date . +dataFromVendor1:Offer228 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product75 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6827.83"^^bsbm:USD ; + bsbm:validFrom "2008-04-07T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-08T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "1"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-08"^^xsd:date . +dataFromVendor1:Offer229 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product66 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6069.52"^^bsbm:USD ; + bsbm:validFrom "2008-04-28T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-24T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-09"^^xsd:date . +dataFromVendor1:Offer230 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product28 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5731.13"^^bsbm:USD ; + bsbm:validFrom "2008-04-15T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-23T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-03"^^xsd:date . +dataFromVendor1:Offer231 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product56 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5830.48"^^bsbm:USD ; + bsbm:validFrom "2008-02-10T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-24T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-10"^^xsd:date . +dataFromVendor1:Offer232 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product66 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3658.68"^^bsbm:USD ; + bsbm:validFrom "2008-02-29T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-19T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-24"^^xsd:date . +dataFromVendor1:Offer233 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product10 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7425.26"^^bsbm:USD ; + bsbm:validFrom "2008-03-03T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-12T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-12"^^xsd:date . +dataFromVendor1:Offer234 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product45 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7009.03"^^bsbm:USD ; + bsbm:validFrom "2008-04-01T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-11T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-18"^^xsd:date . +dataFromVendor1:Offer235 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product25 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8204.85"^^bsbm:USD ; + bsbm:validFrom "2008-02-08T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-25T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-27"^^xsd:date . +dataFromVendor1:Offer236 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product61 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4738.00"^^bsbm:USD ; + bsbm:validFrom "2008-02-10T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-27T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-04"^^xsd:date . +dataFromVendor1:Offer237 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product26 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8454.51"^^bsbm:USD ; + bsbm:validFrom "2008-03-21T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-11T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-16"^^xsd:date . +dataFromVendor1:Offer238 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product7 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9351.07"^^bsbm:USD ; + bsbm:validFrom "2008-02-08T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-06T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-08"^^xsd:date . +dataFromVendor1:Offer239 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product48 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8882.26"^^bsbm:USD ; + bsbm:validFrom "2008-01-07T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-16T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-23"^^xsd:date . +dataFromVendor1:Offer240 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product47 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "747.08"^^bsbm:USD ; + bsbm:validFrom "2008-04-25T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-09T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-09"^^xsd:date . +dataFromVendor1:Offer241 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product45 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5059.18"^^bsbm:USD ; + bsbm:validFrom "2008-05-09T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-03T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-22"^^xsd:date . +dataFromVendor1:Offer242 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product26 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4444.45"^^bsbm:USD ; + bsbm:validFrom "2008-03-13T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-09T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-31"^^xsd:date . +dataFromVendor1:Offer243 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product34 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2658.44"^^bsbm:USD ; + bsbm:validFrom "2008-03-02T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-24T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "6"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-29"^^xsd:date . +dataFromVendor1:Offer244 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product24 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9548.72"^^bsbm:USD ; + bsbm:validFrom "2008-03-08T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-11T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-03"^^xsd:date . +dataFromVendor1:Offer245 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product10 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5471.68"^^bsbm:USD ; + bsbm:validFrom "2008-03-05T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-13T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "6"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-16"^^xsd:date . +dataFromVendor1:Offer246 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product91 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6659.88"^^bsbm:USD ; + bsbm:validFrom "2008-03-05T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-17T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-23"^^xsd:date . +dataFromVendor1:Offer247 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product69 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2802.44"^^bsbm:USD ; + bsbm:validFrom "2008-02-21T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-14T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-29"^^xsd:date . +dataFromVendor1:Offer248 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product47 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2818.63"^^bsbm:USD ; + bsbm:validFrom "2008-03-28T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-23T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-16"^^xsd:date . +dataFromVendor1:Offer249 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product71 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4046.15"^^bsbm:USD ; + bsbm:validFrom "2008-04-05T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-29T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-23"^^xsd:date . +dataFromVendor1:Offer250 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product18 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8773.97"^^bsbm:USD ; + bsbm:validFrom "2008-05-07T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-29T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-13"^^xsd:date . +dataFromVendor1:Offer251 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product51 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6130.63"^^bsbm:USD ; + bsbm:validFrom "2008-03-14T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-07T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "6"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-20"^^xsd:date . +dataFromVendor1:Offer252 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product27 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3663.75"^^bsbm:USD ; + bsbm:validFrom "2008-04-17T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-25T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-02"^^xsd:date . +dataFromVendor1:Offer253 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product45 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3724.72"^^bsbm:USD ; + bsbm:validFrom "2008-05-02T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-01T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-11"^^xsd:date . +dataFromVendor1:Offer254 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product84 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3516.28"^^bsbm:USD ; + bsbm:validFrom "2008-06-19T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-09-02T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-19"^^xsd:date . +dataFromVendor1:Offer255 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product42 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3105.10"^^bsbm:USD ; + bsbm:validFrom "2008-05-25T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-25T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-01"^^xsd:date . +dataFromVendor1:Offer256 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product68 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3098.89"^^bsbm:USD ; + bsbm:validFrom "2008-01-30T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-20T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-02"^^xsd:date . +dataFromVendor1:Offer257 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product30 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8038.60"^^bsbm:USD ; + bsbm:validFrom "2008-02-13T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-19T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "1"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-30"^^xsd:date . +dataFromVendor1:Offer258 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product59 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4919.31"^^bsbm:USD ; + bsbm:validFrom "2008-02-07T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-22T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-09"^^xsd:date . +dataFromVendor1:Offer259 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product7 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "43.39"^^bsbm:USD ; + bsbm:validFrom "2008-01-27T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-14T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-15"^^xsd:date . +dataFromVendor1:Offer260 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product42 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5421.82"^^bsbm:USD ; + bsbm:validFrom "2008-03-02T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-17T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "6"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-05"^^xsd:date . +dataFromVendor1:Offer261 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product52 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5952.76"^^bsbm:USD ; + bsbm:validFrom "2008-01-31T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-13T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-24"^^xsd:date . +dataFromVendor1:Offer262 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product39 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5948.55"^^bsbm:USD ; + bsbm:validFrom "2008-01-07T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-06T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-17"^^xsd:date . +dataFromVendor1:Offer263 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product35 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3035.00"^^bsbm:USD ; + bsbm:validFrom "2008-04-11T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-06T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-11"^^xsd:date . +dataFromVendor1:Offer264 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product25 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5280.96"^^bsbm:USD ; + bsbm:validFrom "2008-02-11T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-12T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "1"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-05"^^xsd:date . +dataFromVendor1:Offer265 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product40 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5346.55"^^bsbm:USD ; + bsbm:validFrom "2008-04-03T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-24T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-16"^^xsd:date . +dataFromVendor1:Offer266 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product75 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1293.37"^^bsbm:USD ; + bsbm:validFrom "2008-04-28T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-13T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-02"^^xsd:date . +dataFromVendor1:Offer267 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product46 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5613.85"^^bsbm:USD ; + bsbm:validFrom "2008-05-25T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-01T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-11"^^xsd:date . +dataFromVendor1:Offer268 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product24 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1578.21"^^bsbm:USD ; + bsbm:validFrom "2008-04-05T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-04T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-09"^^xsd:date . +dataFromVendor1:Offer269 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product55 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3506.37"^^bsbm:USD ; + bsbm:validFrom "2008-05-03T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-18T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-05"^^xsd:date . +dataFromVendor1:Offer270 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product53 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6798.45"^^bsbm:USD ; + bsbm:validFrom "2008-02-15T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-08T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "1"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-05"^^xsd:date . +dataFromVendor1:Offer271 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product14 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4744.97"^^bsbm:USD ; + bsbm:validFrom "2008-04-03T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-12T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-05"^^xsd:date . +dataFromVendor1:Offer272 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product26 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5923.47"^^bsbm:USD ; + bsbm:validFrom "2008-05-12T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-20T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "6"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-08"^^xsd:date . +dataFromVendor1:Offer273 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product58 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5395.44"^^bsbm:USD ; + bsbm:validFrom "2008-03-29T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-25T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "7"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-03"^^xsd:date . +dataFromVendor1:Offer274 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product45 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9513.99"^^bsbm:USD ; + bsbm:validFrom "2008-01-13T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-24T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-26"^^xsd:date . +dataFromVendor1:Offer275 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product55 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2216.93"^^bsbm:USD ; + bsbm:validFrom "2007-12-28T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-10T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-15"^^xsd:date . +dataFromVendor1:Offer276 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product45 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5856.09"^^bsbm:USD ; + bsbm:validFrom "2008-06-14T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-02T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-18"^^xsd:date . +dataFromVendor1:Offer277 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product43 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3064.16"^^bsbm:USD ; + bsbm:validFrom "2008-03-25T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-04T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-14"^^xsd:date . +dataFromVendor1:Offer278 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product76 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4731.82"^^bsbm:USD ; + bsbm:validFrom "2008-03-28T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-31T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-01"^^xsd:date . +dataFromVendor1:Offer279 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product33 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1005.75"^^bsbm:USD ; + bsbm:validFrom "2008-01-12T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-21T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-31"^^xsd:date . +dataFromVendor1:Offer280 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product42 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5467.11"^^bsbm:USD ; + bsbm:validFrom "2008-03-17T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-31T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-09"^^xsd:date . +dataFromVendor1:Offer281 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product63 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1978.52"^^bsbm:USD ; + bsbm:validFrom "2008-01-29T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-22T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-21"^^xsd:date . +dataFromVendor1:Offer282 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product68 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9008.24"^^bsbm:USD ; + bsbm:validFrom "2008-02-05T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-28T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-02"^^xsd:date . +dataFromVendor1:Offer283 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product73 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8674.40"^^bsbm:USD ; + bsbm:validFrom "2008-02-19T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-09T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-26"^^xsd:date . +dataFromVendor1:Offer284 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product57 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8685.11"^^bsbm:USD ; + bsbm:validFrom "2008-03-09T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-06T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-07"^^xsd:date . +dataFromVendor1:Offer285 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product51 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2632.75"^^bsbm:USD ; + bsbm:validFrom "2008-04-16T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-10T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-18"^^xsd:date . +dataFromVendor1:Offer286 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product25 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "643.25"^^bsbm:USD ; + bsbm:validFrom "2008-04-20T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-09-01T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-19"^^xsd:date . +dataFromVendor1:Offer287 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product39 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2401.01"^^bsbm:USD ; + bsbm:validFrom "2008-01-15T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-26T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-16"^^xsd:date . +dataFromVendor1:Offer288 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product71 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2892.13"^^bsbm:USD ; + bsbm:validFrom "2008-05-01T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-30T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-12"^^xsd:date . +dataFromVendor1:Offer289 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product49 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8231.07"^^bsbm:USD ; + bsbm:validFrom "2008-05-19T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-09-08T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-10"^^xsd:date . +dataFromVendor1:Offer290 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product61 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1454.41"^^bsbm:USD ; + bsbm:validFrom "2008-04-25T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-30T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-10"^^xsd:date . +dataFromVendor1:Offer291 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product30 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2632.60"^^bsbm:USD ; + bsbm:validFrom "2008-04-17T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-10T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-21"^^xsd:date . +dataFromVendor1:Offer292 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product74 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3034.74"^^bsbm:USD ; + bsbm:validFrom "2008-01-10T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-22T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-20"^^xsd:date . +dataFromVendor1:Offer293 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product65 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1787.22"^^bsbm:USD ; + bsbm:validFrom "2008-04-04T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-17T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-01"^^xsd:date . +dataFromVendor1:Offer294 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product46 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6437.42"^^bsbm:USD ; + bsbm:validFrom "2008-03-18T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-28T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-27"^^xsd:date . +dataFromVendor1:Offer295 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product27 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5059.77"^^bsbm:USD ; + bsbm:validFrom "2008-05-09T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-24T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-31"^^xsd:date . +dataFromVendor1:Offer296 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product39 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8999.41"^^bsbm:USD ; + bsbm:validFrom "2008-05-09T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-04T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-23"^^xsd:date . +dataFromVendor1:Offer297 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product47 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8404.13"^^bsbm:USD ; + bsbm:validFrom "2008-03-04T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-29T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "1"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-24"^^xsd:date . +dataFromVendor1:Offer298 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product58 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "139.46"^^bsbm:USD ; + bsbm:validFrom "2008-02-27T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-17T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "1"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-29"^^xsd:date . +dataFromVendor1:Offer299 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product69 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2866.62"^^bsbm:USD ; + bsbm:validFrom "2008-02-16T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-18T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-21"^^xsd:date . +dataFromVendor1:Offer300 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product27 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1384.81"^^bsbm:USD ; + bsbm:validFrom "2008-03-12T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-16T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-08"^^xsd:date . +dataFromVendor1:Offer301 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product39 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1174.90"^^bsbm:USD ; + bsbm:validFrom "2008-02-07T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-14T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-28"^^xsd:date . +dataFromVendor1:Offer302 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product58 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1219.50"^^bsbm:USD ; + bsbm:validFrom "2008-04-02T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-21T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-18"^^xsd:date . +dataFromVendor1:Offer303 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product43 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3874.06"^^bsbm:USD ; + bsbm:validFrom "2008-03-15T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-08T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-01"^^xsd:date . +dataFromVendor1:Offer304 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product32 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3352.42"^^bsbm:USD ; + bsbm:validFrom "2008-03-19T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-10T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-30"^^xsd:date . +dataFromVendor1:Offer305 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product40 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1350.09"^^bsbm:USD ; + bsbm:validFrom "2008-02-17T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-25T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-03"^^xsd:date . +dataFromVendor1:Offer306 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product37 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9204.35"^^bsbm:USD ; + bsbm:validFrom "2008-01-16T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-10T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "6"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-30"^^xsd:date . +dataFromVendor1:Offer307 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product24 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9663.14"^^bsbm:USD ; + bsbm:validFrom "2008-03-23T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-27T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-16"^^xsd:date . +dataFromVendor1:Offer308 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product45 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8850.86"^^bsbm:USD ; + bsbm:validFrom "2008-04-30T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-07T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-06"^^xsd:date . +dataFromVendor1:Offer309 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product82 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6274.75"^^bsbm:USD ; + bsbm:validFrom "2008-01-29T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-04T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-11"^^xsd:date . +dataFromVendor1:Offer310 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product59 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9807.21"^^bsbm:USD ; + bsbm:validFrom "2008-01-24T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-06T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-23"^^xsd:date . +dataFromVendor1:Offer311 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product62 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6224.00"^^bsbm:USD ; + bsbm:validFrom "2008-01-26T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-18T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-16"^^xsd:date . +dataFromVendor1:Offer312 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product61 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9792.73"^^bsbm:USD ; + bsbm:validFrom "2008-04-13T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-04T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-15"^^xsd:date . +dataFromVendor1:Offer313 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product28 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "787.82"^^bsbm:USD ; + bsbm:validFrom "2008-02-26T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-09T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-30"^^xsd:date . +dataFromVendor1:Offer314 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product69 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7769.72"^^bsbm:USD ; + bsbm:validFrom "2008-02-20T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-10T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "6"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-18"^^xsd:date . +dataFromVendor1:Offer315 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product61 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8179.70"^^bsbm:USD ; + bsbm:validFrom "2008-02-17T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-11T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "6"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-30"^^xsd:date . +dataFromVendor1:Offer316 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product83 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7436.72"^^bsbm:USD ; + bsbm:validFrom "2008-02-03T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-20T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-30"^^xsd:date . +dataFromVendor1:Offer317 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product2 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "429.94"^^bsbm:USD ; + bsbm:validFrom "2008-04-18T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-04T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-17"^^xsd:date . +dataFromVendor1:Offer318 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product44 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8712.04"^^bsbm:USD ; + bsbm:validFrom "2008-02-14T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-01T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-05"^^xsd:date . +dataFromVendor1:Offer319 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product64 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1232.98"^^bsbm:USD ; + bsbm:validFrom "2008-02-06T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-17T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-22"^^xsd:date . +dataFromVendor1:Offer320 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product89 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5671.54"^^bsbm:USD ; + bsbm:validFrom "2008-03-17T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-27T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-19"^^xsd:date . +dataFromVendor1:Offer321 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product65 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7339.59"^^bsbm:USD ; + bsbm:validFrom "2008-03-08T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-31T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-03"^^xsd:date . +dataFromVendor1:Offer322 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product63 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3909.39"^^bsbm:USD ; + bsbm:validFrom "2008-03-28T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-03T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "1"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-29"^^xsd:date . +dataFromVendor1:Offer323 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product40 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9792.70"^^bsbm:USD ; + bsbm:validFrom "2008-03-15T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-25T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-13"^^xsd:date . +dataFromVendor1:Offer324 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product72 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6386.78"^^bsbm:USD ; + bsbm:validFrom "2008-02-28T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-06T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-16"^^xsd:date . +dataFromVendor1:Offer325 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product81 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2096.18"^^bsbm:USD ; + bsbm:validFrom "2008-05-30T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-31T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-10"^^xsd:date . +dataFromVendor1:Offer326 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product10 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4416.98"^^bsbm:USD ; + bsbm:validFrom "2008-05-18T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-18T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-04"^^xsd:date . +dataFromVendor1:Offer327 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product68 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9490.45"^^bsbm:USD ; + bsbm:validFrom "2008-06-02T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-04T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-04"^^xsd:date . +dataFromVendor1:Offer328 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product57 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9624.67"^^bsbm:USD ; + bsbm:validFrom "2008-01-27T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-29T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "6"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-20"^^xsd:date . +dataFromVendor1:Offer329 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product53 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7312.58"^^bsbm:USD ; + bsbm:validFrom "2008-04-01T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-04T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "1"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-12"^^xsd:date . +dataFromVendor1:Offer330 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product44 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3549.33"^^bsbm:USD ; + bsbm:validFrom "2008-02-28T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-08T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-03"^^xsd:date . +dataFromVendor1:Offer331 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product84 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6496.76"^^bsbm:USD ; + bsbm:validFrom "2008-03-14T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-21T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-17"^^xsd:date . +dataFromVendor1:Offer332 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product82 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3715.58"^^bsbm:USD ; + bsbm:validFrom "2008-04-02T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-27T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-29"^^xsd:date . +dataFromVendor1:Offer333 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product37 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1408.14"^^bsbm:USD ; + bsbm:validFrom "2008-04-06T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-29T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-02"^^xsd:date . +dataFromVendor1:Offer334 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product37 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9088.49"^^bsbm:USD ; + bsbm:validFrom "2008-03-21T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-30T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-06"^^xsd:date . +dataFromVendor1:Offer335 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product45 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8344.69"^^bsbm:USD ; + bsbm:validFrom "2008-04-05T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-18T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-19"^^xsd:date . +dataFromVendor1:Offer336 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product78 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3063.54"^^bsbm:USD ; + bsbm:validFrom "2008-03-01T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-15T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-03"^^xsd:date . +dataFromVendor1:Offer337 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product53 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3222.19"^^bsbm:USD ; + bsbm:validFrom "2008-03-17T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-19T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-26"^^xsd:date . +dataFromVendor1:Offer338 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product34 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9234.45"^^bsbm:USD ; + bsbm:validFrom "2008-01-31T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-17T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-04"^^xsd:date . +dataFromVendor1:Offer339 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product30 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3272.84"^^bsbm:USD ; + bsbm:validFrom "2008-03-22T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-20T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-09"^^xsd:date . +dataFromVendor1:Offer340 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product76 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3842.13"^^bsbm:USD ; + bsbm:validFrom "2008-03-14T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-25T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-17"^^xsd:date . +dataFromVendor1:Offer341 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product41 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "951.60"^^bsbm:USD ; + bsbm:validFrom "2008-03-31T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-04T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-19"^^xsd:date . +dataFromVendor1:Offer342 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product32 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8675.01"^^bsbm:USD ; + bsbm:validFrom "2008-04-15T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-09T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-17"^^xsd:date . +dataFromVendor1:Offer343 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product32 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7628.15"^^bsbm:USD ; + bsbm:validFrom "2008-01-15T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-11T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-30"^^xsd:date . +dataFromVendor1:Offer344 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product74 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "224.67"^^bsbm:USD ; + bsbm:validFrom "2008-05-27T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-24T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-04"^^xsd:date . +dataFromVendor1:Offer345 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product21 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1094.86"^^bsbm:USD ; + bsbm:validFrom "2008-02-05T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-28T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-06"^^xsd:date . +dataFromVendor1:Offer346 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product50 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3785.73"^^bsbm:USD ; + bsbm:validFrom "2008-01-11T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-28T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-04"^^xsd:date . +dataFromVendor1:Offer347 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer3:Product98 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3487.74"^^bsbm:USD ; + bsbm:validFrom "2008-03-16T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-28T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-21"^^xsd:date . +dataFromVendor1:Offer348 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product80 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6371.41"^^bsbm:USD ; + bsbm:validFrom "2008-04-03T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-01T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-07"^^xsd:date . +dataFromVendor1:Offer349 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product54 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5818.78"^^bsbm:USD ; + bsbm:validFrom "2008-02-14T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-15T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-31"^^xsd:date . +dataFromVendor1:Offer350 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product74 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8349.66"^^bsbm:USD ; + bsbm:validFrom "2008-04-26T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-08T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-27"^^xsd:date . +dataFromVendor1:Offer351 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product45 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "952.95"^^bsbm:USD ; + bsbm:validFrom "2008-04-22T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-28T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-25"^^xsd:date . +dataFromVendor1:Offer352 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product46 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1910.18"^^bsbm:USD ; + bsbm:validFrom "2008-02-01T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-21T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-13"^^xsd:date . +dataFromVendor1:Offer353 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product50 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9522.79"^^bsbm:USD ; + bsbm:validFrom "2008-04-01T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-22T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-28"^^xsd:date . +dataFromVendor1:Offer354 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product28 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3805.26"^^bsbm:USD ; + bsbm:validFrom "2008-03-05T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-02T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-24"^^xsd:date . +dataFromVendor1:Offer355 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product77 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2297.29"^^bsbm:USD ; + bsbm:validFrom "2008-05-27T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-18T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-02"^^xsd:date . +dataFromVendor1:Offer356 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product35 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1005.73"^^bsbm:USD ; + bsbm:validFrom "2008-01-19T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-26T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-22"^^xsd:date . +dataFromVendor1:Offer357 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product40 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7924.38"^^bsbm:USD ; + bsbm:validFrom "2008-04-28T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-03T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-07"^^xsd:date . +dataFromVendor1:Offer358 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product93 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "374.45"^^bsbm:USD ; + bsbm:validFrom "2008-03-30T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-13T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-26"^^xsd:date . +dataFromVendor1:Offer359 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product56 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7468.78"^^bsbm:USD ; + bsbm:validFrom "2008-01-27T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-24T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-27"^^xsd:date . +dataFromVendor1:Offer360 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product15 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7831.76"^^bsbm:USD ; + bsbm:validFrom "2008-04-16T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-25T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-13"^^xsd:date . +dataFromVendor1:Offer361 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product33 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5493.16"^^bsbm:USD ; + bsbm:validFrom "2008-05-09T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-23T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-20"^^xsd:date . +dataFromVendor1:Offer362 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product58 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8116.69"^^bsbm:USD ; + bsbm:validFrom "2008-04-08T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-29T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "6"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-19"^^xsd:date . +dataFromVendor1:Offer363 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product66 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3046.01"^^bsbm:USD ; + bsbm:validFrom "2008-03-11T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-15T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-20"^^xsd:date . +dataFromVendor1:Offer364 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product22 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3568.24"^^bsbm:USD ; + bsbm:validFrom "2008-05-06T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-09T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "7"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-11"^^xsd:date . +dataFromVendor1:Offer365 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product24 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9559.72"^^bsbm:USD ; + bsbm:validFrom "2008-05-22T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-11T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-17"^^xsd:date . +dataFromVendor1:Offer366 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product65 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9308.76"^^bsbm:USD ; + bsbm:validFrom "2008-03-04T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-28T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-03"^^xsd:date . +dataFromVendor1:Offer367 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product27 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9180.98"^^bsbm:USD ; + bsbm:validFrom "2008-02-02T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-21T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-10"^^xsd:date . +dataFromVendor1:Offer368 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product74 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2600.64"^^bsbm:USD ; + bsbm:validFrom "2008-05-06T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-08T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-28"^^xsd:date . +dataFromVendor1:Offer369 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product46 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1924.13"^^bsbm:USD ; + bsbm:validFrom "2008-01-21T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-21T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "7"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-26"^^xsd:date . +dataFromVendor1:Offer370 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product66 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6058.44"^^bsbm:USD ; + bsbm:validFrom "2008-01-20T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-29T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-17"^^xsd:date . +dataFromVendor1:Offer371 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product57 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1690.41"^^bsbm:USD ; + bsbm:validFrom "2008-01-26T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-08T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-22"^^xsd:date . +dataFromVendor1:Offer372 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product87 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8201.20"^^bsbm:USD ; + bsbm:validFrom "2008-03-19T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-13T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-30"^^xsd:date . +dataFromVendor1:Offer373 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product27 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1227.69"^^bsbm:USD ; + bsbm:validFrom "2008-02-17T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-27T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-10"^^xsd:date . +dataFromVendor1:Offer374 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product52 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9664.31"^^bsbm:USD ; + bsbm:validFrom "2008-03-13T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-28T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-22"^^xsd:date . +dataFromVendor1:Offer375 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product46 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8716.13"^^bsbm:USD ; + bsbm:validFrom "2008-05-15T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-19T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-16"^^xsd:date . +dataFromVendor1:Offer376 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product65 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "321.10"^^bsbm:USD ; + bsbm:validFrom "2008-06-02T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-15T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-13"^^xsd:date . +dataFromVendor1:Offer377 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product87 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2015.48"^^bsbm:USD ; + bsbm:validFrom "2008-05-09T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-18T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-15"^^xsd:date . +dataFromVendor1:Offer378 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product62 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "652.39"^^bsbm:USD ; + bsbm:validFrom "2008-01-30T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-29T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-08"^^xsd:date . +dataFromVendor1:Offer379 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product48 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4213.74"^^bsbm:USD ; + bsbm:validFrom "2008-04-16T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-06T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-19"^^xsd:date . +dataFromVendor1:Offer380 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product44 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "666.56"^^bsbm:USD ; + bsbm:validFrom "2008-04-08T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-14T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-20"^^xsd:date . +dataFromVendor1:Offer381 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product39 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8700.74"^^bsbm:USD ; + bsbm:validFrom "2008-01-23T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-01T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-16"^^xsd:date . +dataFromVendor1:Offer382 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product24 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "864.33"^^bsbm:USD ; + bsbm:validFrom "2008-03-18T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-24T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-09"^^xsd:date . +dataFromVendor1:Offer383 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product51 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2637.70"^^bsbm:USD ; + bsbm:validFrom "2008-03-05T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-14T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-24"^^xsd:date . +dataFromVendor1:Offer384 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product52 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2859.91"^^bsbm:USD ; + bsbm:validFrom "2008-02-16T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-30T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-30"^^xsd:date . +dataFromVendor1:Offer385 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product71 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5331.01"^^bsbm:USD ; + bsbm:validFrom "2008-03-16T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-26T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-16"^^xsd:date . +dataFromVendor1:Offer386 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product70 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1670.38"^^bsbm:USD ; + bsbm:validFrom "2008-03-26T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-23T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-04"^^xsd:date . +dataFromVendor1:Offer387 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product56 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2069.45"^^bsbm:USD ; + bsbm:validFrom "2008-01-25T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-31T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-01"^^xsd:date . +dataFromVendor1:Offer388 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product55 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7761.23"^^bsbm:USD ; + bsbm:validFrom "2008-03-13T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-23T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-02"^^xsd:date . +dataFromVendor1:Offer389 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product53 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4404.69"^^bsbm:USD ; + bsbm:validFrom "2008-02-01T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-18T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-13"^^xsd:date . +dataFromVendor1:Offer390 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product63 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4624.32"^^bsbm:USD ; + bsbm:validFrom "2008-03-19T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-27T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "6"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-01"^^xsd:date . +dataFromVendor1:Offer391 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product8 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5244.28"^^bsbm:USD ; + bsbm:validFrom "2008-04-08T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-21T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "6"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-24"^^xsd:date . +dataFromVendor1:Offer392 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product32 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6724.30"^^bsbm:USD ; + bsbm:validFrom "2008-04-01T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-15T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-18"^^xsd:date . +dataFromVendor1:Offer393 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product42 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "645.46"^^bsbm:USD ; + bsbm:validFrom "2008-01-21T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-18T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-24"^^xsd:date . +dataFromVendor1:Offer394 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product41 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3591.12"^^bsbm:USD ; + bsbm:validFrom "2008-04-09T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-04T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-06"^^xsd:date . +dataFromVendor1:Offer395 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product77 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "606.02"^^bsbm:USD ; + bsbm:validFrom "2008-02-11T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-28T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-13"^^xsd:date . +dataFromVendor1:Offer396 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product74 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7934.60"^^bsbm:USD ; + bsbm:validFrom "2008-02-18T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-04T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-14"^^xsd:date . +dataFromVendor1:Offer397 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product49 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7965.62"^^bsbm:USD ; + bsbm:validFrom "2008-02-19T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-12T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-18"^^xsd:date . +dataFromVendor1:Offer398 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product71 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9741.95"^^bsbm:USD ; + bsbm:validFrom "2008-03-17T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-14T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-19"^^xsd:date . +dataFromVendor1:Offer399 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product42 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7907.82"^^bsbm:USD ; + bsbm:validFrom "2008-04-15T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-28T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-23"^^xsd:date . +dataFromVendor1:Offer400 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product47 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3575.94"^^bsbm:USD ; + bsbm:validFrom "2008-02-04T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-30T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-21"^^xsd:date . +dataFromVendor1:Offer401 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product64 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "528.36"^^bsbm:USD ; + bsbm:validFrom "2008-03-14T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-11T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-22"^^xsd:date . +dataFromVendor1:Offer402 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product81 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3419.91"^^bsbm:USD ; + bsbm:validFrom "2008-04-18T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-10T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-30"^^xsd:date . +dataFromVendor1:Offer403 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product35 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5520.55"^^bsbm:USD ; + bsbm:validFrom "2008-02-06T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-25T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-27"^^xsd:date . +dataFromVendor1:Offer404 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product36 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7955.80"^^bsbm:USD ; + bsbm:validFrom "2008-01-20T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-11T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-17"^^xsd:date . +dataFromVendor1:Offer405 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product28 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1107.50"^^bsbm:USD ; + bsbm:validFrom "2008-02-26T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-21T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "1"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-04"^^xsd:date . +dataFromVendor1:Offer406 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product9 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9223.52"^^bsbm:USD ; + bsbm:validFrom "2008-02-20T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-05T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-16"^^xsd:date . +dataFromVendor1:Offer407 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product18 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8884.51"^^bsbm:USD ; + bsbm:validFrom "2008-06-17T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-03T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-18"^^xsd:date . +dataFromVendor1:Offer408 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product15 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9363.40"^^bsbm:USD ; + bsbm:validFrom "2008-02-04T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-03-30T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-17"^^xsd:date . +dataFromVendor1:Offer409 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product15 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2722.26"^^bsbm:USD ; + bsbm:validFrom "2008-03-25T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-14T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "6"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-17"^^xsd:date . +dataFromVendor1:Offer410 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product23 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3398.81"^^bsbm:USD ; + bsbm:validFrom "2008-02-03T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-02T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "1"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-29"^^xsd:date . +dataFromVendor1:Offer411 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product14 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2323.70"^^bsbm:USD ; + bsbm:validFrom "2008-02-07T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-19T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-27"^^xsd:date . +dataFromVendor1:Offer412 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product29 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "773.25"^^bsbm:USD ; + bsbm:validFrom "2008-01-11T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-10T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-31"^^xsd:date . +dataFromVendor1:Offer413 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product24 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1727.99"^^bsbm:USD ; + bsbm:validFrom "2008-05-11T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-16T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-08"^^xsd:date . +dataFromVendor1:Offer414 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product20 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4809.66"^^bsbm:USD ; + bsbm:validFrom "2008-01-01T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-13T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-22"^^xsd:date . +dataFromVendor1:Offer415 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product8 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8650.62"^^bsbm:USD ; + bsbm:validFrom "2008-02-06T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-04T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-26"^^xsd:date . +dataFromVendor1:Offer416 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product6 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7130.59"^^bsbm:USD ; + bsbm:validFrom "2008-04-26T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-22T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-20"^^xsd:date . +dataFromVendor1:Offer417 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer3:Product97 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3252.98"^^bsbm:USD ; + bsbm:validFrom "2008-02-18T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-13T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "1"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-05"^^xsd:date . +dataFromVendor1:Offer418 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product22 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3604.64"^^bsbm:USD ; + bsbm:validFrom "2008-02-01T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-09T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-23"^^xsd:date . +dataFromVendor1:Offer419 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product44 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3778.43"^^bsbm:USD ; + bsbm:validFrom "2008-05-09T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-15T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "6"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-10"^^xsd:date . +dataFromVendor1:Offer420 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product49 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9463.92"^^bsbm:USD ; + bsbm:validFrom "2007-12-22T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-03T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-16"^^xsd:date . +dataFromVendor1:Offer421 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product43 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2299.90"^^bsbm:USD ; + bsbm:validFrom "2008-03-05T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-17T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-08"^^xsd:date . +dataFromVendor1:Offer422 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product45 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3887.53"^^bsbm:USD ; + bsbm:validFrom "2008-03-26T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-29T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-03"^^xsd:date . +dataFromVendor1:Offer423 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product49 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5746.00"^^bsbm:USD ; + bsbm:validFrom "2008-03-18T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-18T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-22"^^xsd:date . +dataFromVendor1:Offer424 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product30 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8398.71"^^bsbm:USD ; + bsbm:validFrom "2008-01-24T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-14T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-09"^^xsd:date . +dataFromVendor1:Offer425 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product40 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6299.21"^^bsbm:USD ; + bsbm:validFrom "2008-04-13T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-01T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-14"^^xsd:date . +dataFromVendor1:Offer426 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product65 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9422.31"^^bsbm:USD ; + bsbm:validFrom "2008-02-10T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-03T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-28"^^xsd:date . +dataFromVendor1:Offer427 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product55 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "395.04"^^bsbm:USD ; + bsbm:validFrom "2008-02-29T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-21T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-11"^^xsd:date . +dataFromVendor1:Offer428 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product9 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2379.83"^^bsbm:USD ; + bsbm:validFrom "2008-05-13T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-31T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-22"^^xsd:date . +dataFromVendor1:Offer429 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product48 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7480.88"^^bsbm:USD ; + bsbm:validFrom "2008-02-05T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-19T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-01"^^xsd:date . +dataFromVendor1:Offer430 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product48 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3792.20"^^bsbm:USD ; + bsbm:validFrom "2008-03-29T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-28T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-28"^^xsd:date . +dataFromVendor1:Offer431 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product63 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8117.53"^^bsbm:USD ; + bsbm:validFrom "2008-02-18T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-10T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-28"^^xsd:date . +dataFromVendor1:Offer432 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product51 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8234.25"^^bsbm:USD ; + bsbm:validFrom "2008-01-29T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-28T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-12"^^xsd:date . +dataFromVendor1:Offer433 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product63 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5834.09"^^bsbm:USD ; + bsbm:validFrom "2008-03-17T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-29T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-20"^^xsd:date . +dataFromVendor1:Offer434 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product5 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8916.12"^^bsbm:USD ; + bsbm:validFrom "2008-05-17T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-08T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-29"^^xsd:date . +dataFromVendor1:Offer435 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product41 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8884.98"^^bsbm:USD ; + bsbm:validFrom "2008-04-03T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-04T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "6"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-08"^^xsd:date . +dataFromVendor1:Offer436 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product39 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4329.31"^^bsbm:USD ; + bsbm:validFrom "2008-02-23T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-19T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-11"^^xsd:date . +dataFromVendor1:Offer437 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product61 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6013.77"^^bsbm:USD ; + bsbm:validFrom "2008-04-03T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-05T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-03"^^xsd:date . +dataFromVendor1:Offer438 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product78 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8474.65"^^bsbm:USD ; + bsbm:validFrom "2008-04-18T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-08T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-23"^^xsd:date . +dataFromVendor1:Offer439 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product26 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4990.24"^^bsbm:USD ; + bsbm:validFrom "2008-05-18T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-25T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-22"^^xsd:date . +dataFromVendor1:Offer440 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product25 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8915.35"^^bsbm:USD ; + bsbm:validFrom "2008-02-01T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-12T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-15"^^xsd:date . +dataFromVendor1:Offer441 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product58 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4006.23"^^bsbm:USD ; + bsbm:validFrom "2008-02-13T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-27T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-10"^^xsd:date . +dataFromVendor1:Offer442 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product70 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5056.34"^^bsbm:USD ; + bsbm:validFrom "2008-04-11T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-30T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-13"^^xsd:date . +dataFromVendor1:Offer443 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product69 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3681.05"^^bsbm:USD ; + bsbm:validFrom "2008-05-10T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-25T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-15"^^xsd:date . +dataFromVendor1:Offer444 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product43 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8990.53"^^bsbm:USD ; + bsbm:validFrom "2008-01-18T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-23T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-26"^^xsd:date . +dataFromVendor1:Offer445 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product53 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1855.11"^^bsbm:USD ; + bsbm:validFrom "2008-02-05T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-08T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-08"^^xsd:date . +dataFromVendor1:Offer446 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product84 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2573.89"^^bsbm:USD ; + bsbm:validFrom "2008-06-14T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-12T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-14"^^xsd:date . +dataFromVendor1:Offer447 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product58 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4213.40"^^bsbm:USD ; + bsbm:validFrom "2008-04-14T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-02T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-05"^^xsd:date . +dataFromVendor1:Offer448 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product35 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7249.30"^^bsbm:USD ; + bsbm:validFrom "2008-02-08T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-31T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-29"^^xsd:date . +dataFromVendor1:Offer449 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product64 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1292.59"^^bsbm:USD ; + bsbm:validFrom "2008-03-23T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-04T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-25"^^xsd:date . +dataFromVendor1:Offer450 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product48 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7848.71"^^bsbm:USD ; + bsbm:validFrom "2008-03-26T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-03T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-18"^^xsd:date . +dataFromVendor1:Offer451 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product71 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6386.38"^^bsbm:USD ; + bsbm:validFrom "2008-02-18T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-17T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-16"^^xsd:date . +dataFromVendor1:Offer452 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product75 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7399.71"^^bsbm:USD ; + bsbm:validFrom "2008-03-07T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-27T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-07"^^xsd:date . +dataFromVendor1:Offer453 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product43 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9579.36"^^bsbm:USD ; + bsbm:validFrom "2008-03-16T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-21T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "1"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-02"^^xsd:date . +dataFromVendor1:Offer454 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product29 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7830.68"^^bsbm:USD ; + bsbm:validFrom "2008-03-30T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-23T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-14"^^xsd:date . +dataFromVendor1:Offer455 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product47 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "149.22"^^bsbm:USD ; + bsbm:validFrom "2008-03-15T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-31T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "1"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-03"^^xsd:date . +dataFromVendor1:Offer456 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product44 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "513.47"^^bsbm:USD ; + bsbm:validFrom "2008-04-04T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-23T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "1"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-08"^^xsd:date . +dataFromVendor1:Offer457 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product84 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3400.93"^^bsbm:USD ; + bsbm:validFrom "2008-05-03T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-22T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-17"^^xsd:date . +dataFromVendor1:Offer458 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product50 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1359.29"^^bsbm:USD ; + bsbm:validFrom "2008-04-10T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-04T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-15"^^xsd:date . +dataFromVendor1:Offer459 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product55 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8314.64"^^bsbm:USD ; + bsbm:validFrom "2008-01-12T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-04T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-25"^^xsd:date . +dataFromVendor1:Offer460 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product41 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7576.65"^^bsbm:USD ; + bsbm:validFrom "2008-04-28T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-05T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-25"^^xsd:date . +dataFromVendor1:Offer461 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product68 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9061.32"^^bsbm:USD ; + bsbm:validFrom "2008-03-08T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-23T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-23"^^xsd:date . +dataFromVendor1:Offer462 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product15 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6950.39"^^bsbm:USD ; + bsbm:validFrom "2008-01-17T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-08T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-16"^^xsd:date . +dataFromVendor1:Offer463 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product45 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7036.59"^^bsbm:USD ; + bsbm:validFrom "2008-03-10T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-01T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-08"^^xsd:date . +dataFromVendor1:Offer464 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product17 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6022.24"^^bsbm:USD ; + bsbm:validFrom "2008-02-26T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-22T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "7"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-13"^^xsd:date . +dataFromVendor1:Offer465 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product62 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9939.05"^^bsbm:USD ; + bsbm:validFrom "2008-04-25T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-07T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-12"^^xsd:date . +dataFromVendor1:Offer466 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product56 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "577.20"^^bsbm:USD ; + bsbm:validFrom "2008-01-24T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-17T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "1"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-09"^^xsd:date . +dataFromVendor1:Offer467 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product51 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "984.19"^^bsbm:USD ; + bsbm:validFrom "2008-04-22T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-02T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-06"^^xsd:date . +dataFromVendor1:Offer468 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product78 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "309.98"^^bsbm:USD ; + bsbm:validFrom "2008-02-17T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-18T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-28"^^xsd:date . +dataFromVendor1:Offer469 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product3 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4364.18"^^bsbm:USD ; + bsbm:validFrom "2008-02-18T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-23T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "6"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-12"^^xsd:date . +dataFromVendor1:Offer470 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product31 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9777.48"^^bsbm:USD ; + bsbm:validFrom "2008-05-12T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-09-14T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-17"^^xsd:date . +dataFromVendor1:Offer471 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product75 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2907.36"^^bsbm:USD ; + bsbm:validFrom "2008-03-02T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-20T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-29"^^xsd:date . +dataFromVendor1:Offer472 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product22 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9362.39"^^bsbm:USD ; + bsbm:validFrom "2008-04-09T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-24T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-03"^^xsd:date . +dataFromVendor1:Offer473 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product90 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9838.57"^^bsbm:USD ; + bsbm:validFrom "2008-02-20T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-08T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "1"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-25"^^xsd:date . +dataFromVendor1:Offer474 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product70 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3212.72"^^bsbm:USD ; + bsbm:validFrom "2008-03-24T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-09T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-31"^^xsd:date . +dataFromVendor1:Offer475 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product5 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9618.44"^^bsbm:USD ; + bsbm:validFrom "2008-03-15T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-29T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-28"^^xsd:date . +dataFromVendor1:Offer476 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product38 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6034.60"^^bsbm:USD ; + bsbm:validFrom "2008-04-06T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-23T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "6"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-29"^^xsd:date . +dataFromVendor1:Offer477 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product69 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1925.83"^^bsbm:USD ; + bsbm:validFrom "2008-02-14T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-12T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-21"^^xsd:date . +dataFromVendor1:Offer478 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product51 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6909.09"^^bsbm:USD ; + bsbm:validFrom "2008-04-14T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-31T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-21"^^xsd:date . +dataFromVendor1:Offer479 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product55 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8942.75"^^bsbm:USD ; + bsbm:validFrom "2008-03-01T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-21T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-30"^^xsd:date . +dataFromVendor1:Offer480 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product65 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6214.59"^^bsbm:USD ; + bsbm:validFrom "2008-04-28T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-06T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-22"^^xsd:date . +dataFromVendor1:Offer481 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product48 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8520.56"^^bsbm:USD ; + bsbm:validFrom "2008-02-23T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-12T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-22"^^xsd:date . +dataFromVendor1:Offer482 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product58 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1348.24"^^bsbm:USD ; + bsbm:validFrom "2008-04-15T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-10T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-26"^^xsd:date . +dataFromVendor1:Offer483 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product9 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4715.04"^^bsbm:USD ; + bsbm:validFrom "2008-01-17T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-01T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "6"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-23"^^xsd:date . +dataFromVendor1:Offer484 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product77 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7898.97"^^bsbm:USD ; + bsbm:validFrom "2008-03-09T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-01T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-22"^^xsd:date . +dataFromVendor1:Offer485 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product36 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2995.76"^^bsbm:USD ; + bsbm:validFrom "2008-05-13T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-21T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-13"^^xsd:date . +dataFromVendor1:Offer486 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product30 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5650.28"^^bsbm:USD ; + bsbm:validFrom "2008-03-20T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-02T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "1"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-07"^^xsd:date . +dataFromVendor1:Offer487 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product72 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9417.19"^^bsbm:USD ; + bsbm:validFrom "2008-04-13T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-28T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "1"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-13"^^xsd:date . +dataFromVendor1:Offer488 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product30 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2828.29"^^bsbm:USD ; + bsbm:validFrom "2008-03-19T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-13T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-02"^^xsd:date . +dataFromVendor1:Offer489 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product50 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1845.67"^^bsbm:USD ; + bsbm:validFrom "2008-03-05T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-04T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-25"^^xsd:date . +dataFromVendor1:Offer490 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product64 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7964.62"^^bsbm:USD ; + bsbm:validFrom "2008-04-14T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-14T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-27"^^xsd:date . +dataFromVendor1:Offer491 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product63 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6526.44"^^bsbm:USD ; + bsbm:validFrom "2008-04-03T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-26T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-02"^^xsd:date . +dataFromVendor1:Offer492 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product90 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5904.57"^^bsbm:USD ; + bsbm:validFrom "2008-04-25T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-18T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-10"^^xsd:date . +dataFromVendor1:Offer493 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product1 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5325.23"^^bsbm:USD ; + bsbm:validFrom "2008-03-16T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-25T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "6"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-07"^^xsd:date . +dataFromVendor1:Offer494 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product57 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3383.35"^^bsbm:USD ; + bsbm:validFrom "2008-01-24T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-05T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-28"^^xsd:date . +dataFromVendor1:Offer495 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product55 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7082.38"^^bsbm:USD ; + bsbm:validFrom "2008-04-14T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-29T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-08"^^xsd:date . +dataFromVendor1:Offer496 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product59 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "137.61"^^bsbm:USD ; + bsbm:validFrom "2008-04-06T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-28T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-16"^^xsd:date . +dataFromVendor1:Offer497 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product79 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1796.16"^^bsbm:USD ; + bsbm:validFrom "2008-04-21T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-22T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-14"^^xsd:date . +dataFromVendor1:Offer498 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer3:Product98 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3390.41"^^bsbm:USD ; + bsbm:validFrom "2008-03-08T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-01T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-13"^^xsd:date . +dataFromVendor1:Offer499 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product46 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7639.15"^^bsbm:USD ; + bsbm:validFrom "2008-04-02T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-17T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-07"^^xsd:date . +dataFromVendor1:Offer500 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product87 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7210.12"^^bsbm:USD ; + bsbm:validFrom "2008-03-09T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-21T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-19"^^xsd:date . +dataFromVendor1:Offer501 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product58 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9113.08"^^bsbm:USD ; + bsbm:validFrom "2008-03-25T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-10T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "1"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-29"^^xsd:date . +dataFromVendor1:Offer502 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product56 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3298.79"^^bsbm:USD ; + bsbm:validFrom "2008-05-09T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-27T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-15"^^xsd:date . +dataFromVendor1:Offer503 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product48 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9093.75"^^bsbm:USD ; + bsbm:validFrom "2008-03-13T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-14T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-07"^^xsd:date . +dataFromVendor1:Offer504 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product83 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6495.82"^^bsbm:USD ; + bsbm:validFrom "2008-03-15T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-09T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-28"^^xsd:date . +dataFromVendor1:Offer505 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product31 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8942.39"^^bsbm:USD ; + bsbm:validFrom "2008-04-16T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-07T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-30"^^xsd:date . +dataFromVendor1:Offer506 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product38 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6571.40"^^bsbm:USD ; + bsbm:validFrom "2008-03-29T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-22T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-31"^^xsd:date . +dataFromVendor1:Offer507 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product61 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8504.39"^^bsbm:USD ; + bsbm:validFrom "2008-04-21T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-28T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-08"^^xsd:date . +dataFromVendor1:Offer508 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product20 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7573.07"^^bsbm:USD ; + bsbm:validFrom "2008-01-01T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-06T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-29"^^xsd:date . +dataFromVendor1:Offer509 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product1 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2219.72"^^bsbm:USD ; + bsbm:validFrom "2008-02-10T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-03T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-30"^^xsd:date . +dataFromVendor1:Offer510 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product50 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7520.39"^^bsbm:USD ; + bsbm:validFrom "2008-03-18T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-01T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-22"^^xsd:date . +dataFromVendor1:Offer511 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product92 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8447.13"^^bsbm:USD ; + bsbm:validFrom "2008-02-19T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-12T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-04"^^xsd:date . +dataFromVendor1:Offer512 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product18 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4065.66"^^bsbm:USD ; + bsbm:validFrom "2008-03-12T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-07T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "1"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-16"^^xsd:date . +dataFromVendor1:Offer513 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product25 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6656.19"^^bsbm:USD ; + bsbm:validFrom "2008-04-04T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-16T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-16"^^xsd:date . +dataFromVendor1:Offer514 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product74 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6293.12"^^bsbm:USD ; + bsbm:validFrom "2008-01-18T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-02T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-20"^^xsd:date . +dataFromVendor1:Offer515 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product8 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1002.53"^^bsbm:USD ; + bsbm:validFrom "2008-01-19T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-23T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "1"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-22"^^xsd:date . +dataFromVendor1:Offer516 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product29 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8905.79"^^bsbm:USD ; + bsbm:validFrom "2008-03-01T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-08T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-04"^^xsd:date . +dataFromVendor1:Offer517 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer3:Product95 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9606.81"^^bsbm:USD ; + bsbm:validFrom "2008-03-14T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-03-28T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-16"^^xsd:date . +dataFromVendor1:Offer518 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product54 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2616.95"^^bsbm:USD ; + bsbm:validFrom "2008-04-23T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-24T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-17"^^xsd:date . +dataFromVendor1:Offer519 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product55 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5902.82"^^bsbm:USD ; + bsbm:validFrom "2008-01-25T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-30T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-10"^^xsd:date . +dataFromVendor1:Offer520 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product54 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3798.34"^^bsbm:USD ; + bsbm:validFrom "2008-02-04T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-31T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-03"^^xsd:date . +dataFromVendor1:Offer521 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product41 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2058.73"^^bsbm:USD ; + bsbm:validFrom "2008-06-03T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-09-08T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-15"^^xsd:date . +dataFromVendor1:Offer522 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product67 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7228.65"^^bsbm:USD ; + bsbm:validFrom "2008-04-07T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-09-03T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-06"^^xsd:date . +dataFromVendor1:Offer523 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product32 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4988.84"^^bsbm:USD ; + bsbm:validFrom "2008-02-14T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-22T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "1"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-17"^^xsd:date . +dataFromVendor1:Offer524 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product78 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7979.09"^^bsbm:USD ; + bsbm:validFrom "2008-03-24T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-20T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-08"^^xsd:date . +dataFromVendor1:Offer525 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product72 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2105.16"^^bsbm:USD ; + bsbm:validFrom "2008-05-14T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-09T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-31"^^xsd:date . +dataFromVendor1:Offer526 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product61 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2468.06"^^bsbm:USD ; + bsbm:validFrom "2008-04-05T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-28T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-03"^^xsd:date . +dataFromVendor1:Offer527 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product23 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7429.86"^^bsbm:USD ; + bsbm:validFrom "2008-01-28T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-25T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "7"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-26"^^xsd:date . +dataFromVendor1:Offer528 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product27 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4093.38"^^bsbm:USD ; + bsbm:validFrom "2008-03-30T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-17T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "1"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-08"^^xsd:date . +dataFromVendor1:Offer529 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product60 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8755.26"^^bsbm:USD ; + bsbm:validFrom "2008-03-17T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-01T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-26"^^xsd:date . +dataFromVendor1:Offer530 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product40 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5904.29"^^bsbm:USD ; + bsbm:validFrom "2008-03-01T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-30T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-16"^^xsd:date . +dataFromVendor1:Offer531 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product36 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2898.01"^^bsbm:USD ; + bsbm:validFrom "2008-05-27T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-28T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-31"^^xsd:date . +dataFromVendor1:Offer532 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product56 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1250.37"^^bsbm:USD ; + bsbm:validFrom "2008-02-10T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-06T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "6"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-04"^^xsd:date . +dataFromVendor1:Offer533 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product71 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9338.24"^^bsbm:USD ; + bsbm:validFrom "2008-03-08T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-04T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-12"^^xsd:date . +dataFromVendor1:Offer534 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product60 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3556.58"^^bsbm:USD ; + bsbm:validFrom "2008-04-26T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-09T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-30"^^xsd:date . +dataFromVendor1:Offer535 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product49 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2167.80"^^bsbm:USD ; + bsbm:validFrom "2008-05-23T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-22T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-29"^^xsd:date . +dataFromVendor1:Offer536 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product33 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8062.01"^^bsbm:USD ; + bsbm:validFrom "2008-04-18T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-09T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-12"^^xsd:date . +dataFromVendor1:Offer537 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product49 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6339.37"^^bsbm:USD ; + bsbm:validFrom "2008-03-14T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-21T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-19"^^xsd:date . +dataFromVendor1:Offer538 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product49 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1530.66"^^bsbm:USD ; + bsbm:validFrom "2008-01-23T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-24T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "1"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-21"^^xsd:date . +dataFromVendor1:Offer539 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product39 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7290.07"^^bsbm:USD ; + bsbm:validFrom "2008-06-01T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-09T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "6"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-12"^^xsd:date . +dataFromVendor1:Offer540 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product66 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "819.14"^^bsbm:USD ; + bsbm:validFrom "2008-05-08T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-21T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "1"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-13"^^xsd:date . +dataFromVendor1:Offer541 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product77 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2018.94"^^bsbm:USD ; + bsbm:validFrom "2008-05-05T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-04T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-12"^^xsd:date . +dataFromVendor1:Offer542 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product53 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7610.20"^^bsbm:USD ; + bsbm:validFrom "2008-03-12T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-27T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-02"^^xsd:date . +dataFromVendor1:Offer543 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product48 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5863.46"^^bsbm:USD ; + bsbm:validFrom "2008-05-24T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-21T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "1"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-10"^^xsd:date . +dataFromVendor1:Offer544 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product34 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4441.59"^^bsbm:USD ; + bsbm:validFrom "2008-05-15T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-25T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-12"^^xsd:date . +dataFromVendor1:Offer545 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product49 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1604.07"^^bsbm:USD ; + bsbm:validFrom "2008-03-10T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-20T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-19"^^xsd:date . +dataFromVendor1:Offer546 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product60 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6716.65"^^bsbm:USD ; + bsbm:validFrom "2008-05-10T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-26T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-14"^^xsd:date . +dataFromVendor1:Offer547 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product24 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6464.98"^^bsbm:USD ; + bsbm:validFrom "2008-03-10T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-21T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-02"^^xsd:date . +dataFromVendor1:Offer548 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product65 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6537.15"^^bsbm:USD ; + bsbm:validFrom "2008-02-23T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-16T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-28"^^xsd:date . +dataFromVendor1:Offer549 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product25 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8387.00"^^bsbm:USD ; + bsbm:validFrom "2008-04-10T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-13T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-07"^^xsd:date . +dataFromVendor1:Offer550 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product39 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6644.63"^^bsbm:USD ; + bsbm:validFrom "2008-03-13T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-14T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-04"^^xsd:date . +dataFromVendor1:Offer551 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product66 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4865.41"^^bsbm:USD ; + bsbm:validFrom "2008-05-14T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-01T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-18"^^xsd:date . +dataFromVendor1:Offer552 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product54 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7113.50"^^bsbm:USD ; + bsbm:validFrom "2008-02-18T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-01T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-09"^^xsd:date . +dataFromVendor1:Offer553 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product22 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6552.38"^^bsbm:USD ; + bsbm:validFrom "2008-05-13T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-02T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-09"^^xsd:date . +dataFromVendor1:Offer554 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product67 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3093.68"^^bsbm:USD ; + bsbm:validFrom "2008-04-27T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-13T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-10"^^xsd:date . +dataFromVendor1:Offer555 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product55 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3038.68"^^bsbm:USD ; + bsbm:validFrom "2008-04-05T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-22T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-24"^^xsd:date . +dataFromVendor1:Offer556 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product90 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9235.92"^^bsbm:USD ; + bsbm:validFrom "2008-03-16T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-01T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "1"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-02"^^xsd:date . +dataFromVendor1:Offer557 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product42 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "19.56"^^bsbm:USD ; + bsbm:validFrom "2008-02-08T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-14T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-27"^^xsd:date . +dataFromVendor1:Offer558 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product93 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5370.90"^^bsbm:USD ; + bsbm:validFrom "2008-01-16T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-18T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "6"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-20"^^xsd:date . +dataFromVendor1:Offer559 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product45 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5573.35"^^bsbm:USD ; + bsbm:validFrom "2008-04-26T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-08T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-31"^^xsd:date . +dataFromVendor1:Offer560 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product61 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8297.00"^^bsbm:USD ; + bsbm:validFrom "2008-05-04T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-28T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-03"^^xsd:date . +dataFromVendor1:Offer561 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product83 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8169.87"^^bsbm:USD ; + bsbm:validFrom "2008-04-25T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-15T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-13"^^xsd:date . +dataFromVendor1:Offer562 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product65 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6767.94"^^bsbm:USD ; + bsbm:validFrom "2008-03-17T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-07T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-20"^^xsd:date . +dataFromVendor1:Offer563 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product35 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "552.85"^^bsbm:USD ; + bsbm:validFrom "2008-03-27T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-09-03T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "1"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-17"^^xsd:date . +dataFromVendor1:Offer564 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product87 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "83.88"^^bsbm:USD ; + bsbm:validFrom "2008-03-23T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-16T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-30"^^xsd:date . +dataFromVendor1:Offer565 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product34 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1787.52"^^bsbm:USD ; + bsbm:validFrom "2008-03-29T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-30T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-13"^^xsd:date . +dataFromVendor1:Offer566 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product10 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6004.30"^^bsbm:USD ; + bsbm:validFrom "2008-02-02T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-10T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-31"^^xsd:date . +dataFromVendor1:Offer567 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product26 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4435.14"^^bsbm:USD ; + bsbm:validFrom "2008-05-24T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-01T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-08"^^xsd:date . +dataFromVendor1:Offer568 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product25 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "341.63"^^bsbm:USD ; + bsbm:validFrom "2008-05-29T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-16T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-16"^^xsd:date . +dataFromVendor1:Offer569 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product54 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4921.55"^^bsbm:USD ; + bsbm:validFrom "2008-03-03T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-17T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-15"^^xsd:date . +dataFromVendor1:Offer570 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product60 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8717.90"^^bsbm:USD ; + bsbm:validFrom "2007-12-28T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-05T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-22"^^xsd:date . +dataFromVendor1:Offer571 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product70 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3085.98"^^bsbm:USD ; + bsbm:validFrom "2008-02-17T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-16T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-27"^^xsd:date . +dataFromVendor1:Offer572 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product49 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1065.84"^^bsbm:USD ; + bsbm:validFrom "2008-06-15T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-14T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-18"^^xsd:date . +dataFromVendor1:Offer573 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product93 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1169.94"^^bsbm:USD ; + bsbm:validFrom "2008-03-05T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-13T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-30"^^xsd:date . +dataFromVendor1:Offer574 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product57 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "452.41"^^bsbm:USD ; + bsbm:validFrom "2008-03-25T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-24T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-27"^^xsd:date . +dataFromVendor1:Offer575 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product22 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3428.85"^^bsbm:USD ; + bsbm:validFrom "2008-03-29T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-20T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-14"^^xsd:date . +dataFromVendor1:Offer576 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product42 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1150.57"^^bsbm:USD ; + bsbm:validFrom "2008-05-14T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-06T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-17"^^xsd:date . +dataFromVendor1:Offer577 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product68 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5025.79"^^bsbm:USD ; + bsbm:validFrom "2008-03-13T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-22T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-10"^^xsd:date . +dataFromVendor1:Offer578 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product32 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5029.76"^^bsbm:USD ; + bsbm:validFrom "2008-03-05T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-04T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-26"^^xsd:date . +dataFromVendor1:Offer579 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product58 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2878.32"^^bsbm:USD ; + bsbm:validFrom "2008-02-02T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-06T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-02"^^xsd:date . +dataFromVendor1:Offer580 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product29 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1642.16"^^bsbm:USD ; + bsbm:validFrom "2008-05-18T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-15T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-25"^^xsd:date . +dataFromVendor1:Offer581 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product40 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1754.25"^^bsbm:USD ; + bsbm:validFrom "2008-03-03T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-11T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-16"^^xsd:date . +dataFromVendor1:Offer582 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product43 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4864.82"^^bsbm:USD ; + bsbm:validFrom "2008-03-20T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-16T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-22"^^xsd:date . +dataFromVendor1:Offer583 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product47 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6062.39"^^bsbm:USD ; + bsbm:validFrom "2008-04-05T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-09-01T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-10"^^xsd:date . +dataFromVendor1:Offer584 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product41 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8272.56"^^bsbm:USD ; + bsbm:validFrom "2008-02-28T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-28T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-18"^^xsd:date . +dataFromVendor1:Offer585 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product65 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1497.59"^^bsbm:USD ; + bsbm:validFrom "2008-02-28T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-26T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-23"^^xsd:date . +dataFromVendor1:Offer586 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product27 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2028.23"^^bsbm:USD ; + bsbm:validFrom "2008-06-01T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-15T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-07"^^xsd:date . +dataFromVendor1:Offer587 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product34 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "948.05"^^bsbm:USD ; + bsbm:validFrom "2008-04-15T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-23T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-03"^^xsd:date . +dataFromVendor1:Offer588 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product65 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6485.21"^^bsbm:USD ; + bsbm:validFrom "2008-03-09T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-20T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "6"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-30"^^xsd:date . +dataFromVendor1:Offer589 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product63 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6029.54"^^bsbm:USD ; + bsbm:validFrom "2008-03-20T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-08T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-22"^^xsd:date . +dataFromVendor1:Offer590 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product31 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1611.85"^^bsbm:USD ; + bsbm:validFrom "2008-05-02T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-06T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-15"^^xsd:date . +dataFromVendor1:Offer591 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product91 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8883.18"^^bsbm:USD ; + bsbm:validFrom "2008-02-25T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-27T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-30"^^xsd:date . +dataFromVendor1:Offer592 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product75 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6599.70"^^bsbm:USD ; + bsbm:validFrom "2008-05-19T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-20T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-09"^^xsd:date . +dataFromVendor1:Offer593 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product85 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8918.84"^^bsbm:USD ; + bsbm:validFrom "2008-03-12T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-01T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-21"^^xsd:date . +dataFromVendor1:Offer594 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product59 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1300.21"^^bsbm:USD ; + bsbm:validFrom "2008-01-07T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-18T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-04"^^xsd:date . +dataFromVendor1:Offer595 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer3:Product97 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5726.36"^^bsbm:USD ; + bsbm:validFrom "2008-03-12T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-11T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-25"^^xsd:date . +dataFromVendor1:Offer596 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product68 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9385.52"^^bsbm:USD ; + bsbm:validFrom "2008-01-07T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-06T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-19"^^xsd:date . +dataFromVendor1:Offer597 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product82 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2435.62"^^bsbm:USD ; + bsbm:validFrom "2008-05-03T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-18T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-17"^^xsd:date . +dataFromVendor1:Offer598 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product24 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3585.05"^^bsbm:USD ; + bsbm:validFrom "2008-02-29T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-28T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-11"^^xsd:date . +dataFromVendor1:Offer599 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product87 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3490.40"^^bsbm:USD ; + bsbm:validFrom "2008-03-07T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-20T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-18"^^xsd:date . +dataFromVendor1:Offer600 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product78 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4683.88"^^bsbm:USD ; + bsbm:validFrom "2008-03-04T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-18T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-23"^^xsd:date . +dataFromVendor1:Offer601 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product35 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7013.00"^^bsbm:USD ; + bsbm:validFrom "2008-02-13T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-08T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-17"^^xsd:date . +dataFromVendor1:Offer602 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product64 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9588.81"^^bsbm:USD ; + bsbm:validFrom "2008-02-15T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-03T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "1"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-08"^^xsd:date . +dataFromVendor1:Offer603 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product12 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4713.68"^^bsbm:USD ; + bsbm:validFrom "2008-02-07T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-27T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-06"^^xsd:date . +dataFromVendor1:Offer604 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product37 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8270.24"^^bsbm:USD ; + bsbm:validFrom "2008-03-28T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-05T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-25"^^xsd:date . +dataFromVendor1:Offer605 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product63 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1645.17"^^bsbm:USD ; + bsbm:validFrom "2008-03-17T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-23T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-21"^^xsd:date . +dataFromVendor1:Offer606 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product65 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5936.65"^^bsbm:USD ; + bsbm:validFrom "2008-03-16T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-07T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-20"^^xsd:date . +dataFromVendor1:Offer607 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product26 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4042.30"^^bsbm:USD ; + bsbm:validFrom "2008-04-21T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-27T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-10"^^xsd:date . +dataFromVendor1:Offer608 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product29 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4719.11"^^bsbm:USD ; + bsbm:validFrom "2008-04-28T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-26T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-21"^^xsd:date . +dataFromVendor1:Offer609 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product57 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5916.68"^^bsbm:USD ; + bsbm:validFrom "2008-04-05T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-10T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-14"^^xsd:date . +dataFromVendor1:Offer610 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product20 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8590.27"^^bsbm:USD ; + bsbm:validFrom "2008-02-21T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-31T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-20"^^xsd:date . +dataFromVendor1:Offer611 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product62 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4109.95"^^bsbm:USD ; + bsbm:validFrom "2008-02-04T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-03T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "7"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-25"^^xsd:date . +dataFromVendor1:Offer612 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product88 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6361.28"^^bsbm:USD ; + bsbm:validFrom "2008-03-06T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-21T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "1"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-25"^^xsd:date . +dataFromVendor1:Offer613 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product90 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7136.71"^^bsbm:USD ; + bsbm:validFrom "2008-02-22T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-15T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-09"^^xsd:date . +dataFromVendor1:Offer614 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product60 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "170.78"^^bsbm:USD ; + bsbm:validFrom "2008-02-14T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-26T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-28"^^xsd:date . +dataFromVendor1:Offer615 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product47 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5305.99"^^bsbm:USD ; + bsbm:validFrom "2008-04-16T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-09T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-24"^^xsd:date . +dataFromVendor1:Offer616 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product54 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1142.40"^^bsbm:USD ; + bsbm:validFrom "2008-04-27T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-05T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-30"^^xsd:date . +dataFromVendor1:Offer617 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product20 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8260.72"^^bsbm:USD ; + bsbm:validFrom "2008-04-14T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-14T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-10"^^xsd:date . +dataFromVendor1:Offer618 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product93 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9591.25"^^bsbm:USD ; + bsbm:validFrom "2008-04-07T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-17T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-02"^^xsd:date . +dataFromVendor1:Offer619 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product93 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1485.93"^^bsbm:USD ; + bsbm:validFrom "2008-01-09T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-19T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-31"^^xsd:date . +dataFromVendor1:Offer620 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product62 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4470.76"^^bsbm:USD ; + bsbm:validFrom "2008-04-04T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-12T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "6"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-15"^^xsd:date . +dataFromVendor1:Offer621 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product68 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5015.59"^^bsbm:USD ; + bsbm:validFrom "2008-01-30T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-23T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "1"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-27"^^xsd:date . +dataFromVendor1:Offer622 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product51 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5608.72"^^bsbm:USD ; + bsbm:validFrom "2008-01-12T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-31T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-03"^^xsd:date . +dataFromVendor1:Offer623 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product50 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6182.44"^^bsbm:USD ; + bsbm:validFrom "2008-02-27T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-16T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-09"^^xsd:date . +dataFromVendor1:Offer624 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product37 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2855.58"^^bsbm:USD ; + bsbm:validFrom "2008-01-30T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-01T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-07"^^xsd:date . +dataFromVendor1:Offer625 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product17 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2993.14"^^bsbm:USD ; + bsbm:validFrom "2008-02-01T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-27T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-31"^^xsd:date . +dataFromVendor1:Offer626 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product37 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8038.94"^^bsbm:USD ; + bsbm:validFrom "2008-03-17T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-20T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-01"^^xsd:date . +dataFromVendor1:Offer627 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product51 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6438.58"^^bsbm:USD ; + bsbm:validFrom "2008-05-03T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-30T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-07"^^xsd:date . +dataFromVendor1:Offer628 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product35 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9421.14"^^bsbm:USD ; + bsbm:validFrom "2008-03-19T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-09T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-17"^^xsd:date . +dataFromVendor1:Offer629 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product55 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8065.78"^^bsbm:USD ; + bsbm:validFrom "2008-02-02T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-28T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-08"^^xsd:date . +dataFromVendor1:Offer630 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product78 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3285.81"^^bsbm:USD ; + bsbm:validFrom "2008-04-05T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-13T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-14"^^xsd:date . +dataFromVendor1:Offer631 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product27 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3753.89"^^bsbm:USD ; + bsbm:validFrom "2008-04-02T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-30T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-05"^^xsd:date . +dataFromVendor1:Offer632 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product61 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4105.67"^^bsbm:USD ; + bsbm:validFrom "2008-05-13T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-22T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-05"^^xsd:date . +dataFromVendor1:Offer633 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product38 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5936.55"^^bsbm:USD ; + bsbm:validFrom "2008-02-28T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-18T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "6"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-03"^^xsd:date . +dataFromVendor1:Offer634 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product47 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2961.63"^^bsbm:USD ; + bsbm:validFrom "2008-05-01T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-23T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-31"^^xsd:date . +dataFromVendor1:Offer635 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product64 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4282.52"^^bsbm:USD ; + bsbm:validFrom "2008-02-28T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-15T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "6"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-19"^^xsd:date . +dataFromVendor1:Offer636 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product62 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3617.68"^^bsbm:USD ; + bsbm:validFrom "2008-03-10T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-05T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-26"^^xsd:date . +dataFromVendor1:Offer637 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product56 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9104.83"^^bsbm:USD ; + bsbm:validFrom "2008-05-27T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-08T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-09"^^xsd:date . +dataFromVendor1:Offer638 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product37 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7162.45"^^bsbm:USD ; + bsbm:validFrom "2008-04-04T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-01T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "1"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-23"^^xsd:date . +dataFromVendor1:Offer639 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product85 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2831.43"^^bsbm:USD ; + bsbm:validFrom "2008-05-19T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-12T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-30"^^xsd:date . +dataFromVendor1:Offer640 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product56 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8971.26"^^bsbm:USD ; + bsbm:validFrom "2008-04-05T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-01T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-28"^^xsd:date . +dataFromVendor1:Offer641 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product38 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2152.51"^^bsbm:USD ; + bsbm:validFrom "2008-04-15T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-29T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "6"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-10"^^xsd:date . +dataFromVendor1:Offer642 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product72 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6277.09"^^bsbm:USD ; + bsbm:validFrom "2008-05-11T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-09-14T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-19"^^xsd:date . +dataFromVendor1:Offer643 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product48 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7705.49"^^bsbm:USD ; + bsbm:validFrom "2008-03-21T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-02T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-21"^^xsd:date . +dataFromVendor1:Offer644 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product61 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "710.55"^^bsbm:USD ; + bsbm:validFrom "2008-04-16T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-22T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "6"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-19"^^xsd:date . +dataFromVendor1:Offer645 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product38 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8559.42"^^bsbm:USD ; + bsbm:validFrom "2008-05-17T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-18T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "1"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-12"^^xsd:date . +dataFromVendor1:Offer646 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product52 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7781.77"^^bsbm:USD ; + bsbm:validFrom "2008-03-08T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-24T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-21"^^xsd:date . +dataFromVendor1:Offer647 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product37 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6020.02"^^bsbm:USD ; + bsbm:validFrom "2008-03-09T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-30T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-26"^^xsd:date . +dataFromVendor1:Offer648 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product44 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4507.29"^^bsbm:USD ; + bsbm:validFrom "2008-06-04T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-14T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "6"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-16"^^xsd:date . +dataFromVendor1:Offer649 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product36 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5005.27"^^bsbm:USD ; + bsbm:validFrom "2008-04-03T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-25T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-06"^^xsd:date . +dataFromVendor1:Offer650 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product9 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7006.30"^^bsbm:USD ; + bsbm:validFrom "2008-03-06T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-24T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "1"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-30"^^xsd:date . +dataFromVendor1:Offer651 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product63 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1484.95"^^bsbm:USD ; + bsbm:validFrom "2008-05-01T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-26T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-08"^^xsd:date . +dataFromVendor1:Offer652 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product90 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2439.25"^^bsbm:USD ; + bsbm:validFrom "2008-05-13T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-02T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-13"^^xsd:date . +dataFromVendor1:Offer653 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product82 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1319.28"^^bsbm:USD ; + bsbm:validFrom "2008-02-24T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-13T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-19"^^xsd:date . +dataFromVendor1:Offer654 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product50 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3266.36"^^bsbm:USD ; + bsbm:validFrom "2008-02-07T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-19T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-05"^^xsd:date . +dataFromVendor1:Offer655 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product64 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9288.71"^^bsbm:USD ; + bsbm:validFrom "2008-02-01T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-29T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-18"^^xsd:date . +dataFromVendor1:Offer656 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product47 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7485.92"^^bsbm:USD ; + bsbm:validFrom "2008-03-30T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-04T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-24"^^xsd:date . +dataFromVendor1:Offer657 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product62 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7037.53"^^bsbm:USD ; + bsbm:validFrom "2008-03-30T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-19T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-27"^^xsd:date . +dataFromVendor1:Offer658 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product22 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5335.14"^^bsbm:USD ; + bsbm:validFrom "2008-02-24T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-25T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-13"^^xsd:date . +dataFromVendor1:Offer659 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product70 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5153.64"^^bsbm:USD ; + bsbm:validFrom "2008-02-10T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-07T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-09"^^xsd:date . +dataFromVendor1:Offer660 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product53 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1586.77"^^bsbm:USD ; + bsbm:validFrom "2008-03-22T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-21T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-21"^^xsd:date . +dataFromVendor1:Offer661 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product40 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7826.54"^^bsbm:USD ; + bsbm:validFrom "2008-04-02T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-18T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-25"^^xsd:date . +dataFromVendor1:Offer662 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product61 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2711.67"^^bsbm:USD ; + bsbm:validFrom "2008-05-02T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-21T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-02"^^xsd:date . +dataFromVendor1:Offer663 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product61 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8043.33"^^bsbm:USD ; + bsbm:validFrom "2008-02-13T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-01T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-15"^^xsd:date . +dataFromVendor1:Offer664 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product40 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9820.90"^^bsbm:USD ; + bsbm:validFrom "2008-02-18T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-28T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-22"^^xsd:date . +dataFromVendor1:Offer665 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product52 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7565.54"^^bsbm:USD ; + bsbm:validFrom "2008-01-30T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-26T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-01"^^xsd:date . +dataFromVendor1:Offer666 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product12 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1581.35"^^bsbm:USD ; + bsbm:validFrom "2008-04-03T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-07T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-15"^^xsd:date . +dataFromVendor1:Offer667 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product42 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8736.34"^^bsbm:USD ; + bsbm:validFrom "2008-05-08T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-11T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-21"^^xsd:date . +dataFromVendor1:Offer668 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product37 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6055.98"^^bsbm:USD ; + bsbm:validFrom "2008-02-17T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-06T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-12"^^xsd:date . +dataFromVendor1:Offer669 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product36 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4473.53"^^bsbm:USD ; + bsbm:validFrom "2008-02-22T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-06T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-13"^^xsd:date . +dataFromVendor1:Offer670 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product37 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6973.53"^^bsbm:USD ; + bsbm:validFrom "2008-03-13T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-19T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "6"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-29"^^xsd:date . +dataFromVendor1:Offer671 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product68 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8704.20"^^bsbm:USD ; + bsbm:validFrom "2008-02-18T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-12T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-22"^^xsd:date . +dataFromVendor1:Offer672 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product8 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7582.82"^^bsbm:USD ; + bsbm:validFrom "2008-02-29T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-08T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-28"^^xsd:date . +dataFromVendor1:Offer673 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product36 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2051.20"^^bsbm:USD ; + bsbm:validFrom "2008-04-16T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-02T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-03"^^xsd:date . +dataFromVendor1:Offer674 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product51 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5034.41"^^bsbm:USD ; + bsbm:validFrom "2008-04-03T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-22T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-10"^^xsd:date . +dataFromVendor1:Offer675 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product61 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6445.48"^^bsbm:USD ; + bsbm:validFrom "2008-01-01T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-13T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "6"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-24"^^xsd:date . +dataFromVendor1:Offer676 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product61 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9105.78"^^bsbm:USD ; + bsbm:validFrom "2008-05-18T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-11T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-18"^^xsd:date . +dataFromVendor1:Offer677 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product64 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8181.06"^^bsbm:USD ; + bsbm:validFrom "2008-04-10T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-12T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-03"^^xsd:date . +dataFromVendor1:Offer678 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product27 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1832.25"^^bsbm:USD ; + bsbm:validFrom "2008-02-28T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-30T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-20"^^xsd:date . +dataFromVendor1:Offer679 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product40 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "811.54"^^bsbm:USD ; + bsbm:validFrom "2008-03-30T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-27T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "6"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-13"^^xsd:date . +dataFromVendor1:Offer680 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product1 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8658.03"^^bsbm:USD ; + bsbm:validFrom "2008-02-17T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-19T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-01"^^xsd:date . +dataFromVendor1:Offer681 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product69 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8213.56"^^bsbm:USD ; + bsbm:validFrom "2008-05-09T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-05T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-18"^^xsd:date . +dataFromVendor1:Offer682 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product38 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7695.84"^^bsbm:USD ; + bsbm:validFrom "2008-05-07T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-18T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-13"^^xsd:date . +dataFromVendor1:Offer683 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product31 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3398.08"^^bsbm:USD ; + bsbm:validFrom "2008-02-15T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-22T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-03"^^xsd:date . +dataFromVendor1:Offer684 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product90 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "699.44"^^bsbm:USD ; + bsbm:validFrom "2008-03-02T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-20T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-20"^^xsd:date . +dataFromVendor1:Offer685 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product30 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "314.98"^^bsbm:USD ; + bsbm:validFrom "2008-01-09T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-02T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-23"^^xsd:date . +dataFromVendor1:Offer686 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product39 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8510.86"^^bsbm:USD ; + bsbm:validFrom "2008-03-29T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-15T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "6"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-29"^^xsd:date . +dataFromVendor1:Offer687 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product80 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4600.78"^^bsbm:USD ; + bsbm:validFrom "2008-03-21T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-26T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "7"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-10"^^xsd:date . +dataFromVendor1:Offer688 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product30 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4058.38"^^bsbm:USD ; + bsbm:validFrom "2008-02-23T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-20T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-02"^^xsd:date . +dataFromVendor1:Offer689 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product39 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3942.28"^^bsbm:USD ; + bsbm:validFrom "2008-03-18T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-22T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-04"^^xsd:date . +dataFromVendor1:Offer690 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product93 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7877.26"^^bsbm:USD ; + bsbm:validFrom "2008-02-04T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-20T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-29"^^xsd:date . +dataFromVendor1:Offer691 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product54 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "351.44"^^bsbm:USD ; + bsbm:validFrom "2008-03-20T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-15T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-04"^^xsd:date . +dataFromVendor1:Offer692 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product57 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4972.82"^^bsbm:USD ; + bsbm:validFrom "2008-03-28T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-28T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-29"^^xsd:date . +dataFromVendor1:Offer693 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product52 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4783.40"^^bsbm:USD ; + bsbm:validFrom "2008-05-24T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-18T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-27"^^xsd:date . +dataFromVendor1:Offer694 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer3:Product99 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6640.01"^^bsbm:USD ; + bsbm:validFrom "2008-02-01T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-18T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-21"^^xsd:date . +dataFromVendor1:Offer695 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product6 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9140.54"^^bsbm:USD ; + bsbm:validFrom "2008-04-29T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-30T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "6"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-04"^^xsd:date . +dataFromVendor1:Offer696 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product24 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7829.60"^^bsbm:USD ; + bsbm:validFrom "2008-04-09T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-26T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-12"^^xsd:date . +dataFromVendor1:Offer697 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product49 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1900.47"^^bsbm:USD ; + bsbm:validFrom "2008-04-14T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-25T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-13"^^xsd:date . +dataFromVendor1:Offer698 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product51 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8693.89"^^bsbm:USD ; + bsbm:validFrom "2008-06-06T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-08T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-13"^^xsd:date . +dataFromVendor1:Offer699 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product60 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1435.19"^^bsbm:USD ; + bsbm:validFrom "2008-05-11T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-26T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-10"^^xsd:date . +dataFromVendor1:Offer700 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product8 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8889.66"^^bsbm:USD ; + bsbm:validFrom "2008-01-05T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-15T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-22"^^xsd:date . +dataFromVendor1:Offer701 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product57 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5472.11"^^bsbm:USD ; + bsbm:validFrom "2008-04-03T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-28T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-15"^^xsd:date . +dataFromVendor1:Offer702 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product51 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4531.95"^^bsbm:USD ; + bsbm:validFrom "2008-03-18T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-04T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-24"^^xsd:date . +dataFromVendor1:Offer703 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product33 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5930.63"^^bsbm:USD ; + bsbm:validFrom "2008-03-02T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-22T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-25"^^xsd:date . +dataFromVendor1:Offer704 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product61 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "640.59"^^bsbm:USD ; + bsbm:validFrom "2008-04-07T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-29T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "7"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-04"^^xsd:date . +dataFromVendor1:Offer705 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product39 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5944.57"^^bsbm:USD ; + bsbm:validFrom "2008-03-25T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-16T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "6"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-06"^^xsd:date . +dataFromVendor1:Offer706 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product44 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6445.96"^^bsbm:USD ; + bsbm:validFrom "2008-04-06T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-21T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-03"^^xsd:date . +dataFromVendor1:Offer707 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product69 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9897.13"^^bsbm:USD ; + bsbm:validFrom "2008-04-10T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-11T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-06"^^xsd:date . +dataFromVendor1:Offer708 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product93 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6971.79"^^bsbm:USD ; + bsbm:validFrom "2008-05-28T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-08T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-31"^^xsd:date . +dataFromVendor1:Offer709 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product56 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7865.65"^^bsbm:USD ; + bsbm:validFrom "2008-04-02T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-13T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-13"^^xsd:date . +dataFromVendor1:Offer710 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product56 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1891.09"^^bsbm:USD ; + bsbm:validFrom "2008-02-02T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-10T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-06"^^xsd:date . +dataFromVendor1:Offer711 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product34 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3017.59"^^bsbm:USD ; + bsbm:validFrom "2008-01-21T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-03T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "1"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-09"^^xsd:date . +dataFromVendor1:Offer712 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product43 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1941.22"^^bsbm:USD ; + bsbm:validFrom "2008-03-09T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-02T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-24"^^xsd:date . +dataFromVendor1:Offer713 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product87 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4283.50"^^bsbm:USD ; + bsbm:validFrom "2008-03-27T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-13T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-02"^^xsd:date . +dataFromVendor1:Offer714 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product63 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3870.37"^^bsbm:USD ; + bsbm:validFrom "2008-04-15T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-21T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-02"^^xsd:date . +dataFromVendor1:Offer715 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product73 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6865.39"^^bsbm:USD ; + bsbm:validFrom "2008-02-01T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-20T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "1"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-19"^^xsd:date . +dataFromVendor1:Offer716 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product83 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7181.41"^^bsbm:USD ; + bsbm:validFrom "2008-02-13T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-18T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-30"^^xsd:date . +dataFromVendor1:Offer717 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product45 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9971.61"^^bsbm:USD ; + bsbm:validFrom "2008-01-25T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-06T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-18"^^xsd:date . +dataFromVendor1:Offer718 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product62 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9878.82"^^bsbm:USD ; + bsbm:validFrom "2008-03-17T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-30T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-08"^^xsd:date . +dataFromVendor1:Offer719 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product79 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4635.31"^^bsbm:USD ; + bsbm:validFrom "2008-04-14T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-23T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-01"^^xsd:date . +dataFromVendor1:Offer720 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product50 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5821.18"^^bsbm:USD ; + bsbm:validFrom "2008-03-20T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-01T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-28"^^xsd:date . +dataFromVendor1:Offer721 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product29 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4374.92"^^bsbm:USD ; + bsbm:validFrom "2008-04-18T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-17T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-08"^^xsd:date . +dataFromVendor1:Offer722 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product49 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3285.35"^^bsbm:USD ; + bsbm:validFrom "2008-04-19T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-08T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-08"^^xsd:date . +dataFromVendor1:Offer723 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product73 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8079.39"^^bsbm:USD ; + bsbm:validFrom "2008-05-11T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-17T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-25"^^xsd:date . +dataFromVendor1:Offer724 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product61 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2953.31"^^bsbm:USD ; + bsbm:validFrom "2008-01-16T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-22T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-13"^^xsd:date . +dataFromVendor1:Offer725 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product7 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7485.57"^^bsbm:USD ; + bsbm:validFrom "2008-04-16T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-23T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-03"^^xsd:date . +dataFromVendor1:Offer726 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product48 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3594.77"^^bsbm:USD ; + bsbm:validFrom "2008-04-15T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-16T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "1"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-19"^^xsd:date . +dataFromVendor1:Offer727 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product23 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1348.22"^^bsbm:USD ; + bsbm:validFrom "2008-05-05T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-28T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "7"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-23"^^xsd:date . +dataFromVendor1:Offer728 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product49 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5457.23"^^bsbm:USD ; + bsbm:validFrom "2008-04-14T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-14T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-06"^^xsd:date . +dataFromVendor1:Offer729 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product70 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4610.82"^^bsbm:USD ; + bsbm:validFrom "2008-03-20T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-22T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "7"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-28"^^xsd:date . +dataFromVendor1:Offer730 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer3:Product97 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4615.42"^^bsbm:USD ; + bsbm:validFrom "2008-05-18T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-03T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-04"^^xsd:date . +dataFromVendor1:Offer731 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product71 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3687.06"^^bsbm:USD ; + bsbm:validFrom "2008-05-13T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-16T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-21"^^xsd:date . +dataFromVendor1:Offer732 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product67 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6329.16"^^bsbm:USD ; + bsbm:validFrom "2008-02-03T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-04T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-26"^^xsd:date . +dataFromVendor1:Offer733 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product47 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8209.23"^^bsbm:USD ; + bsbm:validFrom "2008-04-28T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-24T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-12"^^xsd:date . +dataFromVendor1:Offer734 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product28 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1877.36"^^bsbm:USD ; + bsbm:validFrom "2008-02-17T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-01T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-19"^^xsd:date . +dataFromVendor1:Offer735 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product45 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5679.52"^^bsbm:USD ; + bsbm:validFrom "2008-04-02T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-25T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-28"^^xsd:date . +dataFromVendor1:Offer736 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product48 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1201.53"^^bsbm:USD ; + bsbm:validFrom "2008-05-13T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-31T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-19"^^xsd:date . +dataFromVendor1:Offer737 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product89 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7740.03"^^bsbm:USD ; + bsbm:validFrom "2008-03-21T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-19T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-17"^^xsd:date . +dataFromVendor1:Offer738 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product42 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3299.20"^^bsbm:USD ; + bsbm:validFrom "2008-05-09T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-01T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-25"^^xsd:date . +dataFromVendor1:Offer739 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product72 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5995.98"^^bsbm:USD ; + bsbm:validFrom "2008-03-10T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-07T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-21"^^xsd:date . +dataFromVendor1:Offer740 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product58 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7261.62"^^bsbm:USD ; + bsbm:validFrom "2008-03-05T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-22T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-14"^^xsd:date . +dataFromVendor1:Offer741 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product21 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "749.27"^^bsbm:USD ; + bsbm:validFrom "2008-03-01T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-06T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-03"^^xsd:date . +dataFromVendor1:Offer742 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product17 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9555.83"^^bsbm:USD ; + bsbm:validFrom "2008-03-28T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-01T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-18"^^xsd:date . +dataFromVendor1:Offer743 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product80 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8286.94"^^bsbm:USD ; + bsbm:validFrom "2008-02-23T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-11T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-30"^^xsd:date . +dataFromVendor1:Offer744 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product57 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7303.46"^^bsbm:USD ; + bsbm:validFrom "2008-02-17T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-19T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-02"^^xsd:date . +dataFromVendor1:Offer745 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product52 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1065.25"^^bsbm:USD ; + bsbm:validFrom "2008-01-24T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-15T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-30"^^xsd:date . +dataFromVendor1:Offer746 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product51 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3072.71"^^bsbm:USD ; + bsbm:validFrom "2008-02-09T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-13T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-22"^^xsd:date . +dataFromVendor1:Offer747 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product12 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "280.74"^^bsbm:USD ; + bsbm:validFrom "2008-02-27T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-20T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "6"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-19"^^xsd:date . +dataFromVendor1:Offer748 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product62 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4015.77"^^bsbm:USD ; + bsbm:validFrom "2008-02-22T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-02T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-10"^^xsd:date . +dataFromVendor1:Offer749 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product48 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2434.32"^^bsbm:USD ; + bsbm:validFrom "2008-05-03T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-14T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-12"^^xsd:date . +dataFromVendor1:Offer750 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product50 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7061.51"^^bsbm:USD ; + bsbm:validFrom "2008-04-28T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-16T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "1"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-30"^^xsd:date . +dataFromVendor1:Offer751 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product81 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9608.65"^^bsbm:USD ; + bsbm:validFrom "2008-02-28T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-14T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "1"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-23"^^xsd:date . +dataFromVendor1:Offer752 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product46 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2292.35"^^bsbm:USD ; + bsbm:validFrom "2008-05-01T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-14T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-08"^^xsd:date . +dataFromVendor1:Offer753 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product43 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8361.94"^^bsbm:USD ; + bsbm:validFrom "2008-02-02T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-17T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-24"^^xsd:date . +dataFromVendor1:Offer754 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product68 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8645.35"^^bsbm:USD ; + bsbm:validFrom "2008-04-20T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-05T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-13"^^xsd:date . +dataFromVendor1:Offer755 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product78 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3544.12"^^bsbm:USD ; + bsbm:validFrom "2008-02-27T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-11T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-25"^^xsd:date . +dataFromVendor1:Offer756 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product37 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9715.12"^^bsbm:USD ; + bsbm:validFrom "2008-03-06T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-15T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-22"^^xsd:date . +dataFromVendor1:Offer757 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product60 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1542.69"^^bsbm:USD ; + bsbm:validFrom "2008-03-19T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-19T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "7"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-06"^^xsd:date . +dataFromVendor1:Offer758 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product42 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2390.62"^^bsbm:USD ; + bsbm:validFrom "2008-05-17T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-18T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-05"^^xsd:date . +dataFromVendor1:Offer759 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product18 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2041.63"^^bsbm:USD ; + bsbm:validFrom "2008-04-18T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-10T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-11"^^xsd:date . +dataFromVendor1:Offer760 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product62 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7928.82"^^bsbm:USD ; + bsbm:validFrom "2008-02-04T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-25T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-30"^^xsd:date . +dataFromVendor1:Offer761 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product32 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8621.65"^^bsbm:USD ; + bsbm:validFrom "2008-04-11T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-20T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-28"^^xsd:date . +dataFromVendor1:Offer762 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product48 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3266.45"^^bsbm:USD ; + bsbm:validFrom "2008-04-02T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-30T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-10"^^xsd:date . +dataFromVendor1:Offer763 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product83 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6344.60"^^bsbm:USD ; + bsbm:validFrom "2008-04-08T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-08T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-19"^^xsd:date . +dataFromVendor1:Offer764 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product66 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "50.04"^^bsbm:USD ; + bsbm:validFrom "2007-12-25T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-09T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-22"^^xsd:date . +dataFromVendor1:Offer765 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product58 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8733.21"^^bsbm:USD ; + bsbm:validFrom "2008-04-29T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-24T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-07"^^xsd:date . +dataFromVendor1:Offer766 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product51 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "491.23"^^bsbm:USD ; + bsbm:validFrom "2008-02-02T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-05T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-28"^^xsd:date . +dataFromVendor1:Offer767 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product93 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7600.14"^^bsbm:USD ; + bsbm:validFrom "2008-04-11T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-11T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-17"^^xsd:date . +dataFromVendor1:Offer768 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product58 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1872.06"^^bsbm:USD ; + bsbm:validFrom "2008-03-17T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-19T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-23"^^xsd:date . +dataFromVendor1:Offer769 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product31 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6477.32"^^bsbm:USD ; + bsbm:validFrom "2008-01-20T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-13T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-01"^^xsd:date . +dataFromVendor1:Offer770 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product79 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6134.57"^^bsbm:USD ; + bsbm:validFrom "2008-03-03T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-05T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-22"^^xsd:date . +dataFromVendor1:Offer771 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product45 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2587.68"^^bsbm:USD ; + bsbm:validFrom "2008-01-17T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-17T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-21"^^xsd:date . +dataFromVendor1:Offer772 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product15 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7045.77"^^bsbm:USD ; + bsbm:validFrom "2008-03-17T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-10T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "6"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-29"^^xsd:date . +dataFromVendor1:Offer773 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product22 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2786.80"^^bsbm:USD ; + bsbm:validFrom "2008-01-20T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-18T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-21"^^xsd:date . +dataFromVendor1:Offer774 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product67 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5016.86"^^bsbm:USD ; + bsbm:validFrom "2008-03-22T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-11T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "1"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-24"^^xsd:date . +dataFromVendor1:Offer775 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product80 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6136.76"^^bsbm:USD ; + bsbm:validFrom "2008-03-16T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-19T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-22"^^xsd:date . +dataFromVendor1:Offer776 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product18 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8890.56"^^bsbm:USD ; + bsbm:validFrom "2008-03-23T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-16T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-23"^^xsd:date . +dataFromVendor1:Offer777 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product24 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9433.01"^^bsbm:USD ; + bsbm:validFrom "2008-04-19T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-23T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-04"^^xsd:date . +dataFromVendor1:Offer778 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product60 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4752.17"^^bsbm:USD ; + bsbm:validFrom "2008-04-03T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-08T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "6"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-25"^^xsd:date . +dataFromVendor1:Offer779 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product71 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2333.48"^^bsbm:USD ; + bsbm:validFrom "2008-06-09T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-26T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-15"^^xsd:date . +dataFromVendor1:Offer780 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product76 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4067.86"^^bsbm:USD ; + bsbm:validFrom "2008-03-19T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-07T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-29"^^xsd:date . +dataFromVendor1:Offer781 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product41 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5541.24"^^bsbm:USD ; + bsbm:validFrom "2008-04-25T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-04T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-01"^^xsd:date . +dataFromVendor1:Offer782 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product24 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7469.15"^^bsbm:USD ; + bsbm:validFrom "2008-03-07T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-30T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-23"^^xsd:date . +dataFromVendor1:Offer783 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product53 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8998.47"^^bsbm:USD ; + bsbm:validFrom "2008-03-02T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-10T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-08"^^xsd:date . +dataFromVendor1:Offer784 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product18 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5798.96"^^bsbm:USD ; + bsbm:validFrom "2008-03-17T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-11T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-02"^^xsd:date . +dataFromVendor1:Offer785 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product64 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6850.50"^^bsbm:USD ; + bsbm:validFrom "2008-04-10T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-22T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "6"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-13"^^xsd:date . +dataFromVendor1:Offer786 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product42 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7103.23"^^bsbm:USD ; + bsbm:validFrom "2008-02-26T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-26T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-17"^^xsd:date . +dataFromVendor1:Offer787 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product66 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2633.21"^^bsbm:USD ; + bsbm:validFrom "2008-04-08T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-21T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-13"^^xsd:date . +dataFromVendor1:Offer788 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product14 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6852.16"^^bsbm:USD ; + bsbm:validFrom "2008-03-21T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-14T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-21"^^xsd:date . +dataFromVendor1:Offer789 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product66 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1161.55"^^bsbm:USD ; + bsbm:validFrom "2008-05-01T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-24T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-04"^^xsd:date . +dataFromVendor1:Offer790 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product66 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8707.22"^^bsbm:USD ; + bsbm:validFrom "2008-03-24T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-11T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-29"^^xsd:date . +dataFromVendor1:Offer791 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product39 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3255.29"^^bsbm:USD ; + bsbm:validFrom "2008-01-11T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-04T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-28"^^xsd:date . +dataFromVendor1:Offer792 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product23 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4938.28"^^bsbm:USD ; + bsbm:validFrom "2008-03-30T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-14T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-28"^^xsd:date . +dataFromVendor1:Offer793 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product35 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5665.42"^^bsbm:USD ; + bsbm:validFrom "2008-01-15T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-28T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-08"^^xsd:date . +dataFromVendor1:Offer794 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product65 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8756.16"^^bsbm:USD ; + bsbm:validFrom "2008-05-23T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-17T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-01"^^xsd:date . +dataFromVendor1:Offer795 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product57 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1351.83"^^bsbm:USD ; + bsbm:validFrom "2008-02-26T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-23T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-24"^^xsd:date . +dataFromVendor1:Offer796 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product66 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5752.24"^^bsbm:USD ; + bsbm:validFrom "2008-02-23T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-12T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-29"^^xsd:date . +dataFromVendor1:Offer797 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product83 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4593.65"^^bsbm:USD ; + bsbm:validFrom "2008-03-10T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-04T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-25"^^xsd:date . +dataFromVendor1:Offer798 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product60 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7856.06"^^bsbm:USD ; + bsbm:validFrom "2008-02-03T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-11T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-20"^^xsd:date . +dataFromVendor1:Offer799 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product37 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1384.00"^^bsbm:USD ; + bsbm:validFrom "2008-03-02T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-30T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-22"^^xsd:date . +dataFromVendor1:Offer800 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product47 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1357.19"^^bsbm:USD ; + bsbm:validFrom "2008-02-18T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-03T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-05"^^xsd:date . +dataFromVendor1:Offer801 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product80 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7890.22"^^bsbm:USD ; + bsbm:validFrom "2007-12-31T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-15T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-16"^^xsd:date . +dataFromVendor1:Offer802 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product34 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9824.65"^^bsbm:USD ; + bsbm:validFrom "2008-04-01T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-28T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-19"^^xsd:date . +dataFromVendor1:Offer803 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product26 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8999.66"^^bsbm:USD ; + bsbm:validFrom "2008-04-05T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-20T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-14"^^xsd:date . +dataFromVendor1:Offer804 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product74 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4066.38"^^bsbm:USD ; + bsbm:validFrom "2008-06-09T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-17T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-09"^^xsd:date . +dataFromVendor1:Offer805 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product31 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4338.62"^^bsbm:USD ; + bsbm:validFrom "2008-05-13T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-09-01T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-07"^^xsd:date . +dataFromVendor1:Offer806 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product55 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3591.64"^^bsbm:USD ; + bsbm:validFrom "2008-03-05T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-24T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "1"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-15"^^xsd:date . +dataFromVendor1:Offer807 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product38 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1504.37"^^bsbm:USD ; + bsbm:validFrom "2008-04-02T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-09-01T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-19"^^xsd:date . +dataFromVendor1:Offer808 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product92 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8581.77"^^bsbm:USD ; + bsbm:validFrom "2008-02-25T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-04T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-21"^^xsd:date . +dataFromVendor1:Offer809 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product24 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4866.66"^^bsbm:USD ; + bsbm:validFrom "2008-03-19T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-13T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-05"^^xsd:date . +dataFromVendor1:Offer810 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product23 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6823.82"^^bsbm:USD ; + bsbm:validFrom "2008-01-02T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-19T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-24"^^xsd:date . +dataFromVendor1:Offer811 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product39 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3600.23"^^bsbm:USD ; + bsbm:validFrom "2008-04-16T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-04T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-22"^^xsd:date . +dataFromVendor1:Offer812 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product67 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7522.00"^^bsbm:USD ; + bsbm:validFrom "2008-03-17T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-14T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-01"^^xsd:date . +dataFromVendor1:Offer813 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product65 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4435.16"^^bsbm:USD ; + bsbm:validFrom "2008-01-20T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-15T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-05"^^xsd:date . +dataFromVendor1:Offer814 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product54 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2805.06"^^bsbm:USD ; + bsbm:validFrom "2008-02-13T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-27T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-30"^^xsd:date . +dataFromVendor1:Offer815 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product74 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3095.52"^^bsbm:USD ; + bsbm:validFrom "2008-04-15T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-23T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-06"^^xsd:date . +dataFromVendor1:Offer816 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product52 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8061.31"^^bsbm:USD ; + bsbm:validFrom "2008-04-12T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-04T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-15"^^xsd:date . +dataFromVendor1:Offer817 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer3:Product99 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3260.17"^^bsbm:USD ; + bsbm:validFrom "2008-01-15T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-16T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-28"^^xsd:date . +dataFromVendor1:Offer818 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product71 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4399.27"^^bsbm:USD ; + bsbm:validFrom "2008-04-12T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-03T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-03"^^xsd:date . +dataFromVendor1:Offer819 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product33 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3506.90"^^bsbm:USD ; + bsbm:validFrom "2008-03-27T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-02T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-19"^^xsd:date . +dataFromVendor1:Offer820 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product61 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9894.62"^^bsbm:USD ; + bsbm:validFrom "2008-01-28T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-17T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-24"^^xsd:date . +dataFromVendor1:Offer821 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product71 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "732.81"^^bsbm:USD ; + bsbm:validFrom "2008-01-28T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-21T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-11"^^xsd:date . +dataFromVendor1:Offer822 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product89 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1663.40"^^bsbm:USD ; + bsbm:validFrom "2008-03-04T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-20T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-16"^^xsd:date . +dataFromVendor1:Offer823 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product69 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3229.75"^^bsbm:USD ; + bsbm:validFrom "2008-05-22T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-09-04T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-06"^^xsd:date . +dataFromVendor1:Offer824 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product47 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7192.52"^^bsbm:USD ; + bsbm:validFrom "2008-04-22T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-06T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "7"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-23"^^xsd:date . +dataFromVendor1:Offer825 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product83 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7833.65"^^bsbm:USD ; + bsbm:validFrom "2008-04-30T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-11T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-31"^^xsd:date . +dataFromVendor1:Offer826 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product1 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1951.56"^^bsbm:USD ; + bsbm:validFrom "2008-02-05T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-01T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "1"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-26"^^xsd:date . +dataFromVendor1:Offer827 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product90 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3295.86"^^bsbm:USD ; + bsbm:validFrom "2008-02-04T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-11T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "1"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-22"^^xsd:date . +dataFromVendor1:Offer828 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product49 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9744.26"^^bsbm:USD ; + bsbm:validFrom "2008-01-31T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-09T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-31"^^xsd:date . +dataFromVendor1:Offer829 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product33 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6398.24"^^bsbm:USD ; + bsbm:validFrom "2008-05-07T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-08T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "8"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-16"^^xsd:date . +dataFromVendor1:Offer830 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product67 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4034.57"^^bsbm:USD ; + bsbm:validFrom "2008-03-17T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-08T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-28"^^xsd:date . +dataFromVendor1:Offer831 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product32 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8306.53"^^bsbm:USD ; + bsbm:validFrom "2008-04-19T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-06T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-12"^^xsd:date . +dataFromVendor1:Offer832 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product52 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1024.81"^^bsbm:USD ; + bsbm:validFrom "2008-03-29T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-08T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-21"^^xsd:date . +dataFromVendor1:Offer833 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product83 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5978.26"^^bsbm:USD ; + bsbm:validFrom "2008-03-26T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-27T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-03"^^xsd:date . +dataFromVendor1:Offer834 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product68 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "133.47"^^bsbm:USD ; + bsbm:validFrom "2008-02-18T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-22T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-27"^^xsd:date . +dataFromVendor1:Offer835 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product20 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7617.91"^^bsbm:USD ; + bsbm:validFrom "2008-04-19T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-20T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "7"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-04"^^xsd:date . +dataFromVendor1:Offer836 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product78 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3296.49"^^bsbm:USD ; + bsbm:validFrom "2008-01-30T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-09T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-15"^^xsd:date . +dataFromVendor1:Offer837 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product42 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1717.32"^^bsbm:USD ; + bsbm:validFrom "2008-04-09T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-04T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-24"^^xsd:date . +dataFromVendor1:Offer838 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product30 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2313.94"^^bsbm:USD ; + bsbm:validFrom "2008-04-25T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-24T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "7"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-18"^^xsd:date . +dataFromVendor1:Offer839 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product40 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6313.96"^^bsbm:USD ; + bsbm:validFrom "2008-05-09T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-29T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-25"^^xsd:date . +dataFromVendor1:Offer840 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product53 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2564.01"^^bsbm:USD ; + bsbm:validFrom "2008-03-03T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-27T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-03"^^xsd:date . +dataFromVendor1:Offer841 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product29 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8973.55"^^bsbm:USD ; + bsbm:validFrom "2008-02-22T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-18T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "6"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-02"^^xsd:date . +dataFromVendor1:Offer842 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product78 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2232.66"^^bsbm:USD ; + bsbm:validFrom "2008-05-16T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-25T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-08"^^xsd:date . +dataFromVendor1:Offer843 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product35 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8086.53"^^bsbm:USD ; + bsbm:validFrom "2008-03-30T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-10T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "6"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-06"^^xsd:date . +dataFromVendor1:Offer844 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product41 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8440.69"^^bsbm:USD ; + bsbm:validFrom "2008-02-05T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-06T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-26"^^xsd:date . +dataFromVendor1:Offer845 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product8 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3095.28"^^bsbm:USD ; + bsbm:validFrom "2008-06-17T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-21T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-17"^^xsd:date . +dataFromVendor1:Offer846 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product22 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5609.95"^^bsbm:USD ; + bsbm:validFrom "2008-05-19T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-16T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-11"^^xsd:date . +dataFromVendor1:Offer847 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product39 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4565.34"^^bsbm:USD ; + bsbm:validFrom "2008-01-18T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-15T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-03"^^xsd:date . +dataFromVendor1:Offer848 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product66 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6742.17"^^bsbm:USD ; + bsbm:validFrom "2008-02-20T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-23T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "1"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-16"^^xsd:date . +dataFromVendor1:Offer849 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product43 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5049.63"^^bsbm:USD ; + bsbm:validFrom "2008-04-12T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-14T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-06"^^xsd:date . +dataFromVendor1:Offer850 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product76 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5442.25"^^bsbm:USD ; + bsbm:validFrom "2008-05-10T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-04T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-25"^^xsd:date . +dataFromVendor1:Offer851 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product65 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8149.81"^^bsbm:USD ; + bsbm:validFrom "2008-05-14T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-26T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-24"^^xsd:date . +dataFromVendor1:Offer852 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product34 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4903.16"^^bsbm:USD ; + bsbm:validFrom "2008-01-13T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-01T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-23"^^xsd:date . +dataFromVendor1:Offer853 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product87 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6377.67"^^bsbm:USD ; + bsbm:validFrom "2008-03-26T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-19T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-21"^^xsd:date . +dataFromVendor1:Offer854 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product50 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "346.42"^^bsbm:USD ; + bsbm:validFrom "2008-04-12T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-01T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-18"^^xsd:date . +dataFromVendor1:Offer855 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product21 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7973.26"^^bsbm:USD ; + bsbm:validFrom "2008-03-12T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-31T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-06"^^xsd:date . +dataFromVendor1:Offer856 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product38 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2995.75"^^bsbm:USD ; + bsbm:validFrom "2008-03-07T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-20T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-24"^^xsd:date . +dataFromVendor1:Offer857 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product68 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9158.68"^^bsbm:USD ; + bsbm:validFrom "2008-03-05T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-20T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-06"^^xsd:date . +dataFromVendor1:Offer858 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product48 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7006.71"^^bsbm:USD ; + bsbm:validFrom "2008-02-25T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-05T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-24"^^xsd:date . +dataFromVendor1:Offer859 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product40 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "993.61"^^bsbm:USD ; + bsbm:validFrom "2008-02-14T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-09T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-21"^^xsd:date . +dataFromVendor1:Offer860 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product37 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5487.41"^^bsbm:USD ; + bsbm:validFrom "2008-04-16T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-28T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-17"^^xsd:date . +dataFromVendor1:Offer861 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product54 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9389.39"^^bsbm:USD ; + bsbm:validFrom "2008-04-13T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-13T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-15"^^xsd:date . +dataFromVendor1:Offer862 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product67 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8198.98"^^bsbm:USD ; + bsbm:validFrom "2008-04-11T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-07T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-01"^^xsd:date . +dataFromVendor1:Offer863 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product48 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2828.81"^^bsbm:USD ; + bsbm:validFrom "2008-03-29T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-25T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-18"^^xsd:date . +dataFromVendor1:Offer864 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product34 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1469.87"^^bsbm:USD ; + bsbm:validFrom "2008-02-13T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-09T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "6"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-29"^^xsd:date . +dataFromVendor1:Offer865 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product13 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4558.44"^^bsbm:USD ; + bsbm:validFrom "2008-02-24T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-11T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-24"^^xsd:date . +dataFromVendor1:Offer866 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product52 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "255.62"^^bsbm:USD ; + bsbm:validFrom "2008-03-12T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-10T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-24"^^xsd:date . +dataFromVendor1:Offer867 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product48 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5423.61"^^bsbm:USD ; + bsbm:validFrom "2008-01-22T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-14T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-25"^^xsd:date . +dataFromVendor1:Offer868 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product34 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3509.20"^^bsbm:USD ; + bsbm:validFrom "2008-03-20T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-27T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-28"^^xsd:date . +dataFromVendor1:Offer869 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product67 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8744.44"^^bsbm:USD ; + bsbm:validFrom "2008-06-03T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-08T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-04"^^xsd:date . +dataFromVendor1:Offer870 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product58 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6483.06"^^bsbm:USD ; + bsbm:validFrom "2008-01-15T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-03T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-08"^^xsd:date . +dataFromVendor1:Offer871 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product17 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1058.29"^^bsbm:USD ; + bsbm:validFrom "2008-03-10T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-29T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-01"^^xsd:date . +dataFromVendor1:Offer872 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product28 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7881.07"^^bsbm:USD ; + bsbm:validFrom "2008-01-13T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-28T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-30"^^xsd:date . +dataFromVendor1:Offer873 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product52 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1095.16"^^bsbm:USD ; + bsbm:validFrom "2008-03-20T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-13T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-29"^^xsd:date . +dataFromVendor1:Offer874 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product81 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5502.88"^^bsbm:USD ; + bsbm:validFrom "2008-03-19T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-11T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-26"^^xsd:date . +dataFromVendor1:Offer875 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product53 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4803.60"^^bsbm:USD ; + bsbm:validFrom "2008-03-11T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-23T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-05"^^xsd:date . +dataFromVendor1:Offer876 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product68 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1323.83"^^bsbm:USD ; + bsbm:validFrom "2008-04-04T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-15T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-13"^^xsd:date . +dataFromVendor1:Offer877 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product67 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5908.95"^^bsbm:USD ; + bsbm:validFrom "2008-06-09T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-14T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "1"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-10"^^xsd:date . +dataFromVendor1:Offer878 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product55 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5846.07"^^bsbm:USD ; + bsbm:validFrom "2008-04-15T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-30T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-19"^^xsd:date . +dataFromVendor1:Offer879 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product48 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "29.98"^^bsbm:USD ; + bsbm:validFrom "2008-06-07T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-10T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-14"^^xsd:date . +dataFromVendor1:Offer880 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product29 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2010.99"^^bsbm:USD ; + bsbm:validFrom "2008-04-01T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-12T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-25"^^xsd:date . +dataFromVendor1:Offer881 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product18 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5288.39"^^bsbm:USD ; + bsbm:validFrom "2008-02-11T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-09T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-28"^^xsd:date . +dataFromVendor1:Offer882 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product88 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "878.69"^^bsbm:USD ; + bsbm:validFrom "2008-06-03T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-26T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-08"^^xsd:date . +dataFromVendor1:Offer883 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product13 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3942.66"^^bsbm:USD ; + bsbm:validFrom "2008-05-09T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-24T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-21"^^xsd:date . +dataFromVendor1:Offer884 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product52 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5003.17"^^bsbm:USD ; + bsbm:validFrom "2008-05-06T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-14T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-22"^^xsd:date . +dataFromVendor1:Offer885 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product62 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7524.69"^^bsbm:USD ; + bsbm:validFrom "2008-04-17T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-24T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-30"^^xsd:date . +dataFromVendor1:Offer886 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product59 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "406.17"^^bsbm:USD ; + bsbm:validFrom "2008-01-23T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-30T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-12"^^xsd:date . +dataFromVendor1:Offer887 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product16 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2838.51"^^bsbm:USD ; + bsbm:validFrom "2008-02-09T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-11T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-21"^^xsd:date . +dataFromVendor1:Offer888 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product33 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4788.64"^^bsbm:USD ; + bsbm:validFrom "2008-03-04T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-03T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-03"^^xsd:date . +dataFromVendor1:Offer889 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product60 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7165.32"^^bsbm:USD ; + bsbm:validFrom "2008-04-11T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-12T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-16"^^xsd:date . +dataFromVendor1:Offer890 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product36 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7966.95"^^bsbm:USD ; + bsbm:validFrom "2008-05-28T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-11T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-10"^^xsd:date . +dataFromVendor1:Offer891 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product33 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9028.54"^^bsbm:USD ; + bsbm:validFrom "2008-04-04T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-13T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-11"^^xsd:date . +dataFromVendor1:Offer892 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product66 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "155.00"^^bsbm:USD ; + bsbm:validFrom "2008-02-07T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-21T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-18"^^xsd:date . +dataFromVendor1:Offer893 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product64 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5001.00"^^bsbm:USD ; + bsbm:validFrom "2008-01-08T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-09T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-27"^^xsd:date . +dataFromVendor1:Offer894 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product67 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5230.16"^^bsbm:USD ; + bsbm:validFrom "2008-02-29T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-11T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-20"^^xsd:date . +dataFromVendor1:Offer895 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product71 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4114.29"^^bsbm:USD ; + bsbm:validFrom "2008-05-29T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-13T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-08"^^xsd:date . +dataFromVendor1:Offer896 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product93 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9073.63"^^bsbm:USD ; + bsbm:validFrom "2008-05-01T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-19T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "1"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-06"^^xsd:date . +dataFromVendor1:Offer897 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product42 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8831.98"^^bsbm:USD ; + bsbm:validFrom "2008-02-09T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-16T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-13"^^xsd:date . +dataFromVendor1:Offer898 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product41 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7410.57"^^bsbm:USD ; + bsbm:validFrom "2008-02-25T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-11T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-16"^^xsd:date . +dataFromVendor1:Offer899 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product62 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5569.94"^^bsbm:USD ; + bsbm:validFrom "2008-03-31T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-31T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-12"^^xsd:date . +dataFromVendor1:Offer900 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product68 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3836.98"^^bsbm:USD ; + bsbm:validFrom "2008-03-02T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-12T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-20"^^xsd:date . +dataFromVendor1:Offer901 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product55 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8337.20"^^bsbm:USD ; + bsbm:validFrom "2008-01-11T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-03T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-01"^^xsd:date . +dataFromVendor1:Offer902 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product81 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6238.02"^^bsbm:USD ; + bsbm:validFrom "2008-04-09T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-03T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-21"^^xsd:date . +dataFromVendor1:Offer903 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product6 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6325.41"^^bsbm:USD ; + bsbm:validFrom "2008-01-05T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-02T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-26"^^xsd:date . +dataFromVendor1:Offer904 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product78 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9022.82"^^bsbm:USD ; + bsbm:validFrom "2008-04-23T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-19T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-28"^^xsd:date . +dataFromVendor1:Offer905 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product45 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9823.85"^^bsbm:USD ; + bsbm:validFrom "2008-02-15T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-13T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-31"^^xsd:date . +dataFromVendor1:Offer906 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product89 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9322.05"^^bsbm:USD ; + bsbm:validFrom "2008-04-23T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-26T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-19"^^xsd:date . +dataFromVendor1:Offer907 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product64 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9310.06"^^bsbm:USD ; + bsbm:validFrom "2008-03-15T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-22T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-29"^^xsd:date . +dataFromVendor1:Offer908 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product52 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7657.95"^^bsbm:USD ; + bsbm:validFrom "2008-03-09T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-17T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-15"^^xsd:date . +dataFromVendor1:Offer909 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product55 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9238.31"^^bsbm:USD ; + bsbm:validFrom "2008-01-08T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-29T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-16"^^xsd:date . +dataFromVendor1:Offer910 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product21 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7441.48"^^bsbm:USD ; + bsbm:validFrom "2008-03-23T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-27T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-28"^^xsd:date . +dataFromVendor1:Offer911 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product57 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1604.72"^^bsbm:USD ; + bsbm:validFrom "2008-03-24T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-19T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-05"^^xsd:date . +dataFromVendor1:Offer912 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer3:Product95 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3103.10"^^bsbm:USD ; + bsbm:validFrom "2008-02-08T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-23T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-04"^^xsd:date . +dataFromVendor1:Offer913 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product43 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4208.53"^^bsbm:USD ; + bsbm:validFrom "2008-03-14T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-06T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-25"^^xsd:date . +dataFromVendor1:Offer914 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product64 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3637.03"^^bsbm:USD ; + bsbm:validFrom "2008-05-11T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-14T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-15"^^xsd:date . +dataFromVendor1:Offer915 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product61 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5203.99"^^bsbm:USD ; + bsbm:validFrom "2008-03-28T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-21T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "7"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-24"^^xsd:date . +dataFromVendor1:Offer916 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product90 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6968.97"^^bsbm:USD ; + bsbm:validFrom "2008-01-30T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-01T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-15"^^xsd:date . +dataFromVendor1:Offer917 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product51 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8456.41"^^bsbm:USD ; + bsbm:validFrom "2008-01-29T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-07T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-17"^^xsd:date . +dataFromVendor1:Offer918 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product47 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "604.36"^^bsbm:USD ; + bsbm:validFrom "2008-02-08T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-04T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-23"^^xsd:date . +dataFromVendor1:Offer919 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product64 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4059.37"^^bsbm:USD ; + bsbm:validFrom "2008-03-02T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-04T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-19"^^xsd:date . +dataFromVendor1:Offer920 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product62 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5732.59"^^bsbm:USD ; + bsbm:validFrom "2008-04-22T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-11T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "1"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-07"^^xsd:date . +dataFromVendor1:Offer921 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product62 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4432.67"^^bsbm:USD ; + bsbm:validFrom "2008-01-19T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-23T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-24"^^xsd:date . +dataFromVendor1:Offer922 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product50 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5303.15"^^bsbm:USD ; + bsbm:validFrom "2008-04-21T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-28T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "1"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-02"^^xsd:date . +dataFromVendor1:Offer923 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product32 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9342.33"^^bsbm:USD ; + bsbm:validFrom "2008-04-06T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-07T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "1"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-14"^^xsd:date . +dataFromVendor1:Offer924 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product18 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1201.58"^^bsbm:USD ; + bsbm:validFrom "2008-04-11T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-04T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-18"^^xsd:date . +dataFromVendor1:Offer925 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product31 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2410.19"^^bsbm:USD ; + bsbm:validFrom "2008-04-12T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-14T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-17"^^xsd:date . +dataFromVendor1:Offer926 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product73 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2251.91"^^bsbm:USD ; + bsbm:validFrom "2008-02-13T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-04T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "1"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-26"^^xsd:date . +dataFromVendor1:Offer927 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product53 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7625.51"^^bsbm:USD ; + bsbm:validFrom "2008-01-21T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-10T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-28"^^xsd:date . +dataFromVendor1:Offer928 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product56 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2582.82"^^bsbm:USD ; + bsbm:validFrom "2008-04-02T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-16T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-09"^^xsd:date . +dataFromVendor1:Offer929 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product44 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6955.98"^^bsbm:USD ; + bsbm:validFrom "2008-02-06T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-27T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "6"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-09"^^xsd:date . +dataFromVendor1:Offer930 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer3:Product98 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9396.83"^^bsbm:USD ; + bsbm:validFrom "2008-04-05T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-13T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-26"^^xsd:date . +dataFromVendor1:Offer931 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product59 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8943.73"^^bsbm:USD ; + bsbm:validFrom "2008-03-11T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-09T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "6"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-20"^^xsd:date . +dataFromVendor1:Offer932 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product60 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "335.80"^^bsbm:USD ; + bsbm:validFrom "2008-03-12T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-20T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-31"^^xsd:date . +dataFromVendor1:Offer933 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product57 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4045.16"^^bsbm:USD ; + bsbm:validFrom "2008-04-15T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-09T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-16"^^xsd:date . +dataFromVendor1:Offer934 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product59 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3106.79"^^bsbm:USD ; + bsbm:validFrom "2008-03-04T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-17T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-31"^^xsd:date . +dataFromVendor1:Offer935 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer3:Product94 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4400.41"^^bsbm:USD ; + bsbm:validFrom "2008-03-08T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-17T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-28"^^xsd:date . +dataFromVendor1:Offer936 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product10 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4464.45"^^bsbm:USD ; + bsbm:validFrom "2008-03-09T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-08T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-19"^^xsd:date . +dataFromVendor1:Offer937 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product43 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4619.59"^^bsbm:USD ; + bsbm:validFrom "2008-03-15T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-03T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-07"^^xsd:date . +dataFromVendor1:Offer938 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product70 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1095.35"^^bsbm:USD ; + bsbm:validFrom "2008-03-01T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-09T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-08"^^xsd:date . +dataFromVendor1:Offer939 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product85 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5303.62"^^bsbm:USD ; + bsbm:validFrom "2008-02-16T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-23T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-06"^^xsd:date . +dataFromVendor1:Offer940 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product77 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2515.42"^^bsbm:USD ; + bsbm:validFrom "2008-02-28T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-27T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-14"^^xsd:date . +dataFromVendor1:Offer941 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product93 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2982.10"^^bsbm:USD ; + bsbm:validFrom "2008-03-23T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-10T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "1"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-01"^^xsd:date . +dataFromVendor1:Offer942 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product60 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4864.24"^^bsbm:USD ; + bsbm:validFrom "2008-04-02T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-17T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-16"^^xsd:date . +dataFromVendor1:Offer943 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product45 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8479.78"^^bsbm:USD ; + bsbm:validFrom "2008-01-19T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-23T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-09"^^xsd:date . +dataFromVendor1:Offer944 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product26 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4893.98"^^bsbm:USD ; + bsbm:validFrom "2008-01-29T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-21T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-27"^^xsd:date . +dataFromVendor1:Offer945 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product49 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "771.39"^^bsbm:USD ; + bsbm:validFrom "2008-04-26T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-29T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-04"^^xsd:date . +dataFromVendor1:Offer946 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product32 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5511.89"^^bsbm:USD ; + bsbm:validFrom "2008-02-13T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-08T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-16"^^xsd:date . +dataFromVendor1:Offer947 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product23 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4776.87"^^bsbm:USD ; + bsbm:validFrom "2008-04-09T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-03T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-23"^^xsd:date . +dataFromVendor1:Offer948 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product44 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7778.00"^^bsbm:USD ; + bsbm:validFrom "2008-03-15T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-04T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-30"^^xsd:date . +dataFromVendor1:Offer949 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product42 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9881.12"^^bsbm:USD ; + bsbm:validFrom "2008-02-16T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-09T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-29"^^xsd:date . +dataFromVendor1:Offer950 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product56 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9373.79"^^bsbm:USD ; + bsbm:validFrom "2008-04-02T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-01T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-08"^^xsd:date . +dataFromVendor1:Offer951 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product61 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "342.57"^^bsbm:USD ; + bsbm:validFrom "2008-02-16T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-13T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-28"^^xsd:date . +dataFromVendor1:Offer952 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product30 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6258.90"^^bsbm:USD ; + bsbm:validFrom "2008-04-28T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-15T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-04"^^xsd:date . +dataFromVendor1:Offer953 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product26 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "160.74"^^bsbm:USD ; + bsbm:validFrom "2008-02-21T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-23T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-31"^^xsd:date . +dataFromVendor1:Offer954 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product1 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2480.86"^^bsbm:USD ; + bsbm:validFrom "2008-03-04T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-12T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-25"^^xsd:date . +dataFromVendor1:Offer955 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product49 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2771.67"^^bsbm:USD ; + bsbm:validFrom "2008-04-04T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-08T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-27"^^xsd:date . +dataFromVendor1:Offer956 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product66 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2932.12"^^bsbm:USD ; + bsbm:validFrom "2008-02-25T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-16T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-05"^^xsd:date . +dataFromVendor1:Offer957 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product26 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "113.98"^^bsbm:USD ; + bsbm:validFrom "2008-03-16T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-22T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-30"^^xsd:date . +dataFromVendor1:Offer958 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product59 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5205.11"^^bsbm:USD ; + bsbm:validFrom "2008-03-28T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-07T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-17"^^xsd:date . +dataFromVendor1:Offer959 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product23 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6675.81"^^bsbm:USD ; + bsbm:validFrom "2008-04-06T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-08T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-21"^^xsd:date . +dataFromVendor1:Offer960 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product80 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9633.93"^^bsbm:USD ; + bsbm:validFrom "2008-02-11T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-16T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-26"^^xsd:date . +dataFromVendor1:Offer961 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product31 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1590.20"^^bsbm:USD ; + bsbm:validFrom "2008-03-21T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-09T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-02"^^xsd:date . +dataFromVendor1:Offer962 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product47 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1146.16"^^bsbm:USD ; + bsbm:validFrom "2008-04-24T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-24T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-05"^^xsd:date . +dataFromVendor1:Offer963 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product83 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5732.23"^^bsbm:USD ; + bsbm:validFrom "2008-02-14T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-23T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-10"^^xsd:date . +dataFromVendor1:Offer964 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product59 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2539.39"^^bsbm:USD ; + bsbm:validFrom "2008-04-07T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-08T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "1"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-09"^^xsd:date . +dataFromVendor1:Offer965 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product49 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1622.01"^^bsbm:USD ; + bsbm:validFrom "2008-05-01T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-13T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-19"^^xsd:date . +dataFromVendor1:Offer966 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product73 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6570.54"^^bsbm:USD ; + bsbm:validFrom "2008-03-12T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-23T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "6"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-25"^^xsd:date . +dataFromVendor1:Offer967 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product55 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "797.10"^^bsbm:USD ; + bsbm:validFrom "2008-04-06T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-08T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-17"^^xsd:date . +dataFromVendor1:Offer968 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product84 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3230.71"^^bsbm:USD ; + bsbm:validFrom "2008-01-07T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-03-30T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-17"^^xsd:date . +dataFromVendor1:Offer969 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product40 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7316.65"^^bsbm:USD ; + bsbm:validFrom "2007-12-29T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-24T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-20"^^xsd:date . +dataFromVendor1:Offer970 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product44 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9484.78"^^bsbm:USD ; + bsbm:validFrom "2008-04-08T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-28T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-02"^^xsd:date . +dataFromVendor1:Offer971 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product15 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6152.82"^^bsbm:USD ; + bsbm:validFrom "2008-03-23T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-01T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-04"^^xsd:date . +dataFromVendor1:Offer972 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product45 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1073.66"^^bsbm:USD ; + bsbm:validFrom "2008-01-29T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-03T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-23"^^xsd:date . +dataFromVendor1:Offer973 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product62 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2122.32"^^bsbm:USD ; + bsbm:validFrom "2007-12-28T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-18T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "7"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-22"^^xsd:date . +dataFromVendor1:Offer974 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product58 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9671.66"^^bsbm:USD ; + bsbm:validFrom "2008-02-23T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-01T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-06"^^xsd:date . +dataFromVendor1:Offer975 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product58 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8482.07"^^bsbm:USD ; + bsbm:validFrom "2008-05-11T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-11T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-01"^^xsd:date . +dataFromVendor1:Offer976 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product42 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4453.41"^^bsbm:USD ; + bsbm:validFrom "2008-02-16T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-01T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-24"^^xsd:date . +dataFromVendor1:Offer977 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product40 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4224.30"^^bsbm:USD ; + bsbm:validFrom "2008-03-16T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-03T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-25"^^xsd:date . +dataFromVendor1:Offer978 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product62 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3713.26"^^bsbm:USD ; + bsbm:validFrom "2008-05-15T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-23T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-02"^^xsd:date . +dataFromVendor1:Offer979 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product57 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5575.64"^^bsbm:USD ; + bsbm:validFrom "2008-04-23T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-31T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-14"^^xsd:date . +dataFromVendor1:Offer980 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product48 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1175.09"^^bsbm:USD ; + bsbm:validFrom "2008-02-11T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-23T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-30"^^xsd:date . +dataFromVendor1:Offer981 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product69 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "499.57"^^bsbm:USD ; + bsbm:validFrom "2008-03-20T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-16T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-18"^^xsd:date . +dataFromVendor1:Offer982 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product37 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1402.53"^^bsbm:USD ; + bsbm:validFrom "2007-12-29T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-08T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-24"^^xsd:date . +dataFromVendor1:Offer983 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product60 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4404.43"^^bsbm:USD ; + bsbm:validFrom "2008-02-12T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-26T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-15"^^xsd:date . +dataFromVendor1:Offer984 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product59 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "638.01"^^bsbm:USD ; + bsbm:validFrom "2008-03-27T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-16T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-21"^^xsd:date . +dataFromVendor1:Offer985 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product17 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1727.22"^^bsbm:USD ; + bsbm:validFrom "2008-02-07T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-15T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-21"^^xsd:date . +dataFromVendor1:Offer986 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product49 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2524.58"^^bsbm:USD ; + bsbm:validFrom "2008-01-09T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-05T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-25"^^xsd:date . +dataFromVendor1:Offer987 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product53 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "614.89"^^bsbm:USD ; + bsbm:validFrom "2007-12-27T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-02T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-23"^^xsd:date . +dataFromVendor1:Offer988 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product77 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3056.31"^^bsbm:USD ; + bsbm:validFrom "2008-02-07T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-28T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-01"^^xsd:date . +dataFromVendor1:Offer989 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product20 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7481.02"^^bsbm:USD ; + bsbm:validFrom "2008-03-16T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-06T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-10"^^xsd:date . +dataFromVendor1:Offer990 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product41 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5417.02"^^bsbm:USD ; + bsbm:validFrom "2008-02-21T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-28T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-04"^^xsd:date . +dataFromVendor1:Offer991 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product79 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3986.07"^^bsbm:USD ; + bsbm:validFrom "2008-03-23T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-07T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-19"^^xsd:date . +dataFromVendor1:Offer992 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product73 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3367.39"^^bsbm:USD ; + bsbm:validFrom "2008-03-19T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-11T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-27"^^xsd:date . +dataFromVendor1:Offer993 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product92 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1463.75"^^bsbm:USD ; + bsbm:validFrom "2008-04-03T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-07T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-07"^^xsd:date . +dataFromVendor1:Offer994 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product13 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1277.84"^^bsbm:USD ; + bsbm:validFrom "2008-04-14T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-07T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-19"^^xsd:date . +dataFromVendor1:Offer995 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product79 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6969.78"^^bsbm:USD ; + bsbm:validFrom "2008-02-01T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-02T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-18"^^xsd:date . +dataFromVendor1:Offer996 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product73 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "38.46"^^bsbm:USD ; + bsbm:validFrom "2007-12-19T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-30T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-17"^^xsd:date . +dataFromVendor1:Offer997 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product63 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "592.24"^^bsbm:USD ; + bsbm:validFrom "2008-03-23T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-14T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "1"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-22"^^xsd:date . +dataFromVendor1:Offer998 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product89 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "642.82"^^bsbm:USD ; + bsbm:validFrom "2008-05-18T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-20T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-28"^^xsd:date . +dataFromVendor1:Offer999 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product53 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5829.76"^^bsbm:USD ; + bsbm:validFrom "2008-05-22T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-06T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-27"^^xsd:date . +dataFromVendor1:Offer1000 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product54 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1470.06"^^bsbm:USD ; + bsbm:validFrom "2008-05-20T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-26T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-19"^^xsd:date . +dataFromVendor1:Offer1001 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product5 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3730.33"^^bsbm:USD ; + bsbm:validFrom "2008-05-08T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-13T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-14"^^xsd:date . +dataFromVendor1:Offer1002 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product11 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1023.39"^^bsbm:USD ; + bsbm:validFrom "2008-02-11T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-29T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-30"^^xsd:date . +dataFromVendor1:Offer1003 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product68 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6483.76"^^bsbm:USD ; + bsbm:validFrom "2008-03-18T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-12T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-11"^^xsd:date . +dataFromVendor1:Offer1004 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product4 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5204.38"^^bsbm:USD ; + bsbm:validFrom "2008-02-16T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-26T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "6"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-13"^^xsd:date . +dataFromVendor1:Offer1005 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product82 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8305.96"^^bsbm:USD ; + bsbm:validFrom "2008-02-03T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-23T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-18"^^xsd:date . +dataFromVendor1:Offer1006 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product33 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7094.48"^^bsbm:USD ; + bsbm:validFrom "2008-05-08T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-05T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-23"^^xsd:date . +dataFromVendor1:Offer1007 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer3:Product98 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9621.86"^^bsbm:USD ; + bsbm:validFrom "2008-01-08T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-14T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-31"^^xsd:date . +dataFromVendor1:Offer1008 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product55 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7604.77"^^bsbm:USD ; + bsbm:validFrom "2008-04-04T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-15T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-03"^^xsd:date . +dataFromVendor1:Offer1009 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product48 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5677.32"^^bsbm:USD ; + bsbm:validFrom "2008-02-02T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-03T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-29"^^xsd:date . +dataFromVendor1:Offer1010 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product56 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7425.75"^^bsbm:USD ; + bsbm:validFrom "2008-03-13T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-20T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-19"^^xsd:date . +dataFromVendor1:Offer1011 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product24 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2157.60"^^bsbm:USD ; + bsbm:validFrom "2008-03-16T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-05T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-14"^^xsd:date . +dataFromVendor1:Offer1012 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product72 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4221.63"^^bsbm:USD ; + bsbm:validFrom "2008-02-27T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-29T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-15"^^xsd:date . +dataFromVendor1:Offer1013 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product20 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8541.67"^^bsbm:USD ; + bsbm:validFrom "2008-03-11T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-18T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-19"^^xsd:date . +dataFromVendor1:Offer1014 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product13 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4153.16"^^bsbm:USD ; + bsbm:validFrom "2008-05-07T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-01T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-19"^^xsd:date . +dataFromVendor1:Offer1015 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product92 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4557.59"^^bsbm:USD ; + bsbm:validFrom "2008-02-12T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-25T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-04"^^xsd:date . +dataFromVendor1:Offer1016 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product76 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3528.75"^^bsbm:USD ; + bsbm:validFrom "2008-04-03T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-01T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-24"^^xsd:date . +dataFromVendor1:Offer1017 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product83 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6259.22"^^bsbm:USD ; + bsbm:validFrom "2008-04-25T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-21T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-03"^^xsd:date . +dataFromVendor1:Offer1018 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product64 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4581.97"^^bsbm:USD ; + bsbm:validFrom "2008-04-24T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-05T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-06"^^xsd:date . +dataFromVendor1:Offer1019 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product57 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6203.76"^^bsbm:USD ; + bsbm:validFrom "2008-03-09T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-03T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-02"^^xsd:date . +dataFromVendor1:Offer1020 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product20 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9247.69"^^bsbm:USD ; + bsbm:validFrom "2008-04-01T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-27T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-06"^^xsd:date . +dataFromVendor1:Offer1021 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product75 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6333.33"^^bsbm:USD ; + bsbm:validFrom "2008-03-18T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-22T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-18"^^xsd:date . +dataFromVendor1:Offer1022 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product65 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6150.44"^^bsbm:USD ; + bsbm:validFrom "2008-01-29T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-05T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-28"^^xsd:date . +dataFromVendor1:Offer1023 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer3:Product99 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3251.39"^^bsbm:USD ; + bsbm:validFrom "2008-04-10T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-30T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-24"^^xsd:date . +dataFromVendor1:Offer1024 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product49 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8936.79"^^bsbm:USD ; + bsbm:validFrom "2008-02-07T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-05T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "6"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-26"^^xsd:date . +dataFromVendor1:Offer1025 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product39 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2946.79"^^bsbm:USD ; + bsbm:validFrom "2008-01-23T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-07T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-26"^^xsd:date . +dataFromVendor1:Offer1026 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product64 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8682.86"^^bsbm:USD ; + bsbm:validFrom "2008-03-14T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-03T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-30"^^xsd:date . +dataFromVendor1:Offer1027 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product7 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6119.58"^^bsbm:USD ; + bsbm:validFrom "2008-04-03T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-14T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-30"^^xsd:date . +dataFromVendor1:Offer1028 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product79 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9019.91"^^bsbm:USD ; + bsbm:validFrom "2008-05-14T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-01T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-15"^^xsd:date . +dataFromVendor1:Offer1029 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product26 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5807.87"^^bsbm:USD ; + bsbm:validFrom "2008-03-04T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-15T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-19"^^xsd:date . +dataFromVendor1:Offer1030 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product47 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "403.79"^^bsbm:USD ; + bsbm:validFrom "2008-04-25T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-08T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-27"^^xsd:date . +dataFromVendor1:Offer1031 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product56 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6189.82"^^bsbm:USD ; + bsbm:validFrom "2008-01-25T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-31T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-15"^^xsd:date . +dataFromVendor1:Offer1032 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product79 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9003.95"^^bsbm:USD ; + bsbm:validFrom "2008-03-16T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-05T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-14"^^xsd:date . +dataFromVendor1:Offer1033 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product47 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5188.68"^^bsbm:USD ; + bsbm:validFrom "2008-02-01T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-29T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "1"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-02"^^xsd:date . +dataFromVendor1:Offer1034 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer3:Product96 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6614.50"^^bsbm:USD ; + bsbm:validFrom "2008-02-27T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-24T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "6"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-26"^^xsd:date . +dataFromVendor1:Offer1035 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product35 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3731.78"^^bsbm:USD ; + bsbm:validFrom "2008-02-07T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-20T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-29"^^xsd:date . +dataFromVendor1:Offer1036 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product71 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "37.78"^^bsbm:USD ; + bsbm:validFrom "2008-04-14T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-31T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-24"^^xsd:date . +dataFromVendor1:Offer1037 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product38 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1411.74"^^bsbm:USD ; + bsbm:validFrom "2008-03-19T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-10T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-25"^^xsd:date . +dataFromVendor1:Offer1038 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer3:Product95 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2576.11"^^bsbm:USD ; + bsbm:validFrom "2008-03-17T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-19T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-09"^^xsd:date . +dataFromVendor1:Offer1039 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product53 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1674.52"^^bsbm:USD ; + bsbm:validFrom "2008-06-09T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-26T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-17"^^xsd:date . +dataFromVendor1:Offer1040 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product39 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5499.18"^^bsbm:USD ; + bsbm:validFrom "2008-04-29T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-24T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "6"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-29"^^xsd:date . +dataFromVendor1:Offer1041 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product91 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9649.93"^^bsbm:USD ; + bsbm:validFrom "2008-03-31T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-30T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-14"^^xsd:date . +dataFromVendor1:Offer1042 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product46 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4387.76"^^bsbm:USD ; + bsbm:validFrom "2008-02-24T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-03T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-23"^^xsd:date . +dataFromVendor1:Offer1043 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product51 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2274.75"^^bsbm:USD ; + bsbm:validFrom "2008-04-26T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-01T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-27"^^xsd:date . +dataFromVendor1:Offer1044 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product47 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3884.84"^^bsbm:USD ; + bsbm:validFrom "2008-04-28T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-13T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-10"^^xsd:date . +dataFromVendor1:Offer1045 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product84 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3378.24"^^bsbm:USD ; + bsbm:validFrom "2008-03-09T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-21T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-27"^^xsd:date . +dataFromVendor1:Offer1046 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product41 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4471.99"^^bsbm:USD ; + bsbm:validFrom "2008-04-07T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-24T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-15"^^xsd:date . +dataFromVendor1:Offer1047 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product34 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6252.73"^^bsbm:USD ; + bsbm:validFrom "2008-02-15T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-22T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-25"^^xsd:date . +dataFromVendor1:Offer1048 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product43 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6562.50"^^bsbm:USD ; + bsbm:validFrom "2008-06-12T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-30T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-14"^^xsd:date . +dataFromVendor1:Offer1049 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product77 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2194.92"^^bsbm:USD ; + bsbm:validFrom "2008-03-11T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-10T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-03"^^xsd:date . +dataFromVendor1:Offer1050 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product37 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "488.07"^^bsbm:USD ; + bsbm:validFrom "2008-05-26T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-22T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-28"^^xsd:date . +dataFromVendor1:Offer1051 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product84 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6470.15"^^bsbm:USD ; + bsbm:validFrom "2008-05-04T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-05T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-14"^^xsd:date . +dataFromVendor1:Offer1052 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product53 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5722.91"^^bsbm:USD ; + bsbm:validFrom "2008-02-18T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-28T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-17"^^xsd:date . +dataFromVendor1:Offer1053 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product42 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2483.01"^^bsbm:USD ; + bsbm:validFrom "2008-05-19T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-12T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-23"^^xsd:date . +dataFromVendor1:Offer1054 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product78 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9172.95"^^bsbm:USD ; + bsbm:validFrom "2008-02-08T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-26T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-11"^^xsd:date . +dataFromVendor1:Offer1055 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product69 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "707.86"^^bsbm:USD ; + bsbm:validFrom "2008-01-15T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-28T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-24"^^xsd:date . +dataFromVendor1:Offer1056 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product8 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "123.10"^^bsbm:USD ; + bsbm:validFrom "2008-03-16T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-21T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-20"^^xsd:date . +dataFromVendor1:Offer1057 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer3:Product94 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1607.29"^^bsbm:USD ; + bsbm:validFrom "2008-01-24T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-25T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-04"^^xsd:date . +dataFromVendor1:Offer1058 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product49 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9083.11"^^bsbm:USD ; + bsbm:validFrom "2008-01-27T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-09T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-09"^^xsd:date . +dataFromVendor1:Offer1059 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product87 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "625.37"^^bsbm:USD ; + bsbm:validFrom "2008-04-02T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-21T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-10"^^xsd:date . +dataFromVendor1:Offer1060 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product37 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8861.06"^^bsbm:USD ; + bsbm:validFrom "2008-03-18T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-12T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-10"^^xsd:date . +dataFromVendor1:Offer1061 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product30 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9020.20"^^bsbm:USD ; + bsbm:validFrom "2008-04-21T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-11T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-04"^^xsd:date . +dataFromVendor1:Offer1062 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product13 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8584.44"^^bsbm:USD ; + bsbm:validFrom "2007-12-25T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-17T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-21"^^xsd:date . +dataFromVendor1:Offer1063 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product46 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6487.62"^^bsbm:USD ; + bsbm:validFrom "2008-03-22T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-09-06T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-19"^^xsd:date . +dataFromVendor1:Offer1064 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product65 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5911.02"^^bsbm:USD ; + bsbm:validFrom "2008-05-26T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-18T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-11"^^xsd:date . +dataFromVendor1:Offer1065 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product70 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "119.22"^^bsbm:USD ; + bsbm:validFrom "2008-03-22T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-21T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-02"^^xsd:date . +dataFromVendor1:Offer1066 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product22 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8150.92"^^bsbm:USD ; + bsbm:validFrom "2008-02-21T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-02T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-20"^^xsd:date . +dataFromVendor1:Offer1067 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product59 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9698.22"^^bsbm:USD ; + bsbm:validFrom "2008-04-08T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-02T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-28"^^xsd:date . +dataFromVendor1:Offer1068 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product69 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "501.78"^^bsbm:USD ; + bsbm:validFrom "2008-02-18T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-03-31T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "6"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-22"^^xsd:date . +dataFromVendor1:Offer1069 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product27 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1081.80"^^bsbm:USD ; + bsbm:validFrom "2008-02-09T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-17T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "6"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-09"^^xsd:date . +dataFromVendor1:Offer1070 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product34 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8341.85"^^bsbm:USD ; + bsbm:validFrom "2008-05-07T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-15T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-08"^^xsd:date . +dataFromVendor1:Offer1071 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product34 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7717.27"^^bsbm:USD ; + bsbm:validFrom "2007-12-19T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-22T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-16"^^xsd:date . +dataFromVendor1:Offer1072 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product57 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1164.77"^^bsbm:USD ; + bsbm:validFrom "2008-02-04T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-29T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-06"^^xsd:date . +dataFromVendor1:Offer1073 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product11 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5647.74"^^bsbm:USD ; + bsbm:validFrom "2008-03-12T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-13T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-25"^^xsd:date . +dataFromVendor1:Offer1074 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product54 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7430.76"^^bsbm:USD ; + bsbm:validFrom "2008-02-21T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-12T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-01"^^xsd:date . +dataFromVendor1:Offer1075 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product65 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8445.49"^^bsbm:USD ; + bsbm:validFrom "2008-02-06T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-09T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-21"^^xsd:date . +dataFromVendor1:Offer1076 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product45 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3576.93"^^bsbm:USD ; + bsbm:validFrom "2008-02-09T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-02T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-29"^^xsd:date . +dataFromVendor1:Offer1077 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product83 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7027.71"^^bsbm:USD ; + bsbm:validFrom "2008-02-12T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-18T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-04"^^xsd:date . +dataFromVendor1:Offer1078 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product47 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5123.25"^^bsbm:USD ; + bsbm:validFrom "2008-03-23T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-16T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-09"^^xsd:date . +dataFromVendor1:Offer1079 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product34 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3655.28"^^bsbm:USD ; + bsbm:validFrom "2008-02-15T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-07T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-23"^^xsd:date . +dataFromVendor1:Offer1080 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product37 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4892.45"^^bsbm:USD ; + bsbm:validFrom "2008-03-05T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-01T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-10"^^xsd:date . +dataFromVendor1:Offer1081 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product20 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "830.35"^^bsbm:USD ; + bsbm:validFrom "2008-03-11T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-24T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-07"^^xsd:date . +dataFromVendor1:Offer1082 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product60 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1314.49"^^bsbm:USD ; + bsbm:validFrom "2008-01-16T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-20T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-25"^^xsd:date . +dataFromVendor1:Offer1083 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product38 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3492.78"^^bsbm:USD ; + bsbm:validFrom "2008-02-07T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-18T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "7"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-04"^^xsd:date . +dataFromVendor1:Offer1084 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product28 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9775.97"^^bsbm:USD ; + bsbm:validFrom "2008-05-12T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-14T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-13"^^xsd:date . +dataFromVendor1:Offer1085 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer3:Product94 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7303.93"^^bsbm:USD ; + bsbm:validFrom "2008-03-11T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-01T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-01"^^xsd:date . +dataFromVendor1:Offer1086 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product82 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1326.11"^^bsbm:USD ; + bsbm:validFrom "2008-04-07T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-20T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-13"^^xsd:date . +dataFromVendor1:Offer1087 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product48 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6684.22"^^bsbm:USD ; + bsbm:validFrom "2008-03-25T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-14T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-11"^^xsd:date . +dataFromVendor1:Offer1088 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product48 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5843.90"^^bsbm:USD ; + bsbm:validFrom "2008-04-12T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-09T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-25"^^xsd:date . +dataFromVendor1:Offer1089 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product73 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3767.71"^^bsbm:USD ; + bsbm:validFrom "2008-05-11T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-18T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-31"^^xsd:date . +dataFromVendor1:Offer1090 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product91 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1580.66"^^bsbm:USD ; + bsbm:validFrom "2008-01-28T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-09T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-15"^^xsd:date . +dataFromVendor1:Offer1091 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product52 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3468.15"^^bsbm:USD ; + bsbm:validFrom "2008-04-12T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-02T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-23"^^xsd:date . +dataFromVendor1:Offer1092 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product70 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8658.85"^^bsbm:USD ; + bsbm:validFrom "2008-03-13T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-30T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-27"^^xsd:date . +dataFromVendor1:Offer1093 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer3:Product96 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "436.47"^^bsbm:USD ; + bsbm:validFrom "2008-06-01T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-09T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "1"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-12"^^xsd:date . +dataFromVendor1:Offer1094 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product57 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2135.81"^^bsbm:USD ; + bsbm:validFrom "2008-03-30T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-07T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-10"^^xsd:date . +dataFromVendor1:Offer1095 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product70 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "829.12"^^bsbm:USD ; + bsbm:validFrom "2008-01-09T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-15T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-16"^^xsd:date . +dataFromVendor1:Offer1096 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product31 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9056.31"^^bsbm:USD ; + bsbm:validFrom "2008-05-07T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-25T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-28"^^xsd:date . +dataFromVendor1:Offer1097 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product47 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5585.67"^^bsbm:USD ; + bsbm:validFrom "2008-03-04T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-13T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "1"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-29"^^xsd:date . +dataFromVendor1:Offer1098 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product93 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5044.14"^^bsbm:USD ; + bsbm:validFrom "2008-04-04T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-10T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-11"^^xsd:date . +dataFromVendor1:Offer1099 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product81 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2137.12"^^bsbm:USD ; + bsbm:validFrom "2008-03-13T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-07T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "6"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-21"^^xsd:date . +dataFromVendor1:Offer1100 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product47 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7906.22"^^bsbm:USD ; + bsbm:validFrom "2008-03-13T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-29T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-08"^^xsd:date . +dataFromVendor1:Offer1101 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product64 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8313.45"^^bsbm:USD ; + bsbm:validFrom "2008-01-06T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-01T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "6"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-18"^^xsd:date . +dataFromVendor1:Offer1102 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product63 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9978.10"^^bsbm:USD ; + bsbm:validFrom "2008-01-01T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-03-31T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-20"^^xsd:date . +dataFromVendor1:Offer1103 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product23 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5730.84"^^bsbm:USD ; + bsbm:validFrom "2008-04-04T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-12T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-18"^^xsd:date . +dataFromVendor1:Offer1104 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product77 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6070.86"^^bsbm:USD ; + bsbm:validFrom "2008-03-24T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-19T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-26"^^xsd:date . +dataFromVendor1:Offer1105 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product63 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9704.25"^^bsbm:USD ; + bsbm:validFrom "2008-03-02T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-28T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-09"^^xsd:date . +dataFromVendor1:Offer1106 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product44 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1068.46"^^bsbm:USD ; + bsbm:validFrom "2008-04-27T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-01T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "6"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-28"^^xsd:date . +dataFromVendor1:Offer1107 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product69 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9521.38"^^bsbm:USD ; + bsbm:validFrom "2008-04-30T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-23T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "6"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-19"^^xsd:date . +dataFromVendor1:Offer1108 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product43 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9724.37"^^bsbm:USD ; + bsbm:validFrom "2008-03-11T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-17T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-03"^^xsd:date . +dataFromVendor1:Offer1109 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product50 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5762.85"^^bsbm:USD ; + bsbm:validFrom "2008-02-10T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-26T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-31"^^xsd:date . +dataFromVendor1:Offer1110 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product23 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1363.34"^^bsbm:USD ; + bsbm:validFrom "2008-04-20T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-20T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-18"^^xsd:date . +dataFromVendor1:Offer1111 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product74 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1197.13"^^bsbm:USD ; + bsbm:validFrom "2008-03-15T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-17T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-03"^^xsd:date . +dataFromVendor1:Offer1112 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product22 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3752.80"^^bsbm:USD ; + bsbm:validFrom "2008-01-24T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-29T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-11"^^xsd:date . +dataFromVendor1:Offer1113 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product61 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7896.08"^^bsbm:USD ; + bsbm:validFrom "2008-04-24T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-17T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-01"^^xsd:date . +dataFromVendor1:Offer1114 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product88 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3948.67"^^bsbm:USD ; + bsbm:validFrom "2008-03-02T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-06T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-11"^^xsd:date . +dataFromVendor1:Offer1115 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product73 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6063.93"^^bsbm:USD ; + bsbm:validFrom "2008-04-13T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-09-08T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-10"^^xsd:date . +dataFromVendor1:Offer1116 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product17 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8372.38"^^bsbm:USD ; + bsbm:validFrom "2008-02-28T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-12T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-17"^^xsd:date . +dataFromVendor1:Offer1117 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product69 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9308.49"^^bsbm:USD ; + bsbm:validFrom "2008-03-24T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-10T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-13"^^xsd:date . +dataFromVendor1:Offer1118 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product41 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1064.72"^^bsbm:USD ; + bsbm:validFrom "2008-04-09T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-14T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-12"^^xsd:date . +dataFromVendor1:Offer1119 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product34 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7183.65"^^bsbm:USD ; + bsbm:validFrom "2008-06-02T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-07T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-19"^^xsd:date . +dataFromVendor1:Offer1120 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product21 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6767.58"^^bsbm:USD ; + bsbm:validFrom "2008-01-16T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-25T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "7"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-28"^^xsd:date . +dataFromVendor1:Offer1121 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product47 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8076.76"^^bsbm:USD ; + bsbm:validFrom "2008-04-02T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-03T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-13"^^xsd:date . +dataFromVendor1:Offer1122 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product27 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5216.93"^^bsbm:USD ; + bsbm:validFrom "2008-03-06T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-06T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-06"^^xsd:date . +dataFromVendor1:Offer1123 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product17 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4747.93"^^bsbm:USD ; + bsbm:validFrom "2008-06-07T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-31T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-14"^^xsd:date . +dataFromVendor1:Offer1124 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product47 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3814.06"^^bsbm:USD ; + bsbm:validFrom "2008-05-20T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-12T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-09"^^xsd:date . +dataFromVendor1:Offer1125 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer3:Product95 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "266.63"^^bsbm:USD ; + bsbm:validFrom "2008-03-11T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-05T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-27"^^xsd:date . +dataFromVendor1:Offer1126 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product9 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8753.21"^^bsbm:USD ; + bsbm:validFrom "2008-05-29T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-25T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-06"^^xsd:date . +dataFromVendor1:Offer1127 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product38 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4362.57"^^bsbm:USD ; + bsbm:validFrom "2008-01-24T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-10T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-28"^^xsd:date . +dataFromVendor1:Offer1128 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product35 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8685.50"^^bsbm:USD ; + bsbm:validFrom "2008-02-22T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-15T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-04"^^xsd:date . +dataFromVendor1:Offer1129 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product90 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8879.64"^^bsbm:USD ; + bsbm:validFrom "2008-04-04T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-12T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-02"^^xsd:date . +dataFromVendor1:Offer1130 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product60 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "793.58"^^bsbm:USD ; + bsbm:validFrom "2008-03-19T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-22T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-16"^^xsd:date . +dataFromVendor1:Offer1131 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product59 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6276.92"^^bsbm:USD ; + bsbm:validFrom "2008-02-24T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-09T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-24"^^xsd:date . +dataFromVendor1:Offer1132 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product81 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6507.12"^^bsbm:USD ; + bsbm:validFrom "2008-02-23T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-20T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-08"^^xsd:date . +dataFromVendor1:Offer1133 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product22 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7020.84"^^bsbm:USD ; + bsbm:validFrom "2008-01-03T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-27T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-20"^^xsd:date . +dataFromVendor1:Offer1134 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product26 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2976.58"^^bsbm:USD ; + bsbm:validFrom "2008-04-06T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-03T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-08"^^xsd:date . +dataFromVendor1:Offer1135 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product34 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "126.23"^^bsbm:USD ; + bsbm:validFrom "2008-02-25T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-22T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-03"^^xsd:date . +dataFromVendor1:Offer1136 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product61 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6707.23"^^bsbm:USD ; + bsbm:validFrom "2008-03-30T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-11T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-01"^^xsd:date . +dataFromVendor1:Offer1137 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product87 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5972.54"^^bsbm:USD ; + bsbm:validFrom "2008-04-23T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-26T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-15"^^xsd:date . +dataFromVendor1:Offer1138 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product66 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8026.04"^^bsbm:USD ; + bsbm:validFrom "2008-04-02T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-24T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-16"^^xsd:date . +dataFromVendor1:Offer1139 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product58 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2238.80"^^bsbm:USD ; + bsbm:validFrom "2008-05-12T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-29T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-17"^^xsd:date . +dataFromVendor1:Offer1140 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product20 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8342.08"^^bsbm:USD ; + bsbm:validFrom "2008-03-11T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-19T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "1"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-23"^^xsd:date . +dataFromVendor1:Offer1141 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product63 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1647.46"^^bsbm:USD ; + bsbm:validFrom "2008-03-22T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-17T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-26"^^xsd:date . +dataFromVendor1:Offer1142 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product83 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7490.04"^^bsbm:USD ; + bsbm:validFrom "2008-03-17T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-12T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-23"^^xsd:date . +dataFromVendor1:Offer1143 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product83 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5143.38"^^bsbm:USD ; + bsbm:validFrom "2008-04-03T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-31T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-16"^^xsd:date . +dataFromVendor1:Offer1144 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product18 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5027.99"^^bsbm:USD ; + bsbm:validFrom "2008-01-13T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-19T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-06"^^xsd:date . +dataFromVendor1:Offer1145 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product50 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5128.95"^^bsbm:USD ; + bsbm:validFrom "2008-04-15T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-18T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-04"^^xsd:date . +dataFromVendor1:Offer1146 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product45 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7648.07"^^bsbm:USD ; + bsbm:validFrom "2008-04-06T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-15T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-07"^^xsd:date . +dataFromVendor1:Offer1147 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product43 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1266.17"^^bsbm:USD ; + bsbm:validFrom "2008-02-19T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-14T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-30"^^xsd:date . +dataFromVendor1:Offer1148 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product8 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4688.43"^^bsbm:USD ; + bsbm:validFrom "2008-03-03T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-23T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-28"^^xsd:date . +dataFromVendor1:Offer1149 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product54 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5694.31"^^bsbm:USD ; + bsbm:validFrom "2008-05-07T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-07T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-09"^^xsd:date . +dataFromVendor1:Offer1150 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product82 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5045.99"^^bsbm:USD ; + bsbm:validFrom "2008-02-16T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-09T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-10"^^xsd:date . +dataFromVendor1:Offer1151 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product27 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5425.42"^^bsbm:USD ; + bsbm:validFrom "2008-04-24T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-22T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-07"^^xsd:date . +dataFromVendor1:Offer1152 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product56 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1842.60"^^bsbm:USD ; + bsbm:validFrom "2008-02-13T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-17T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-04"^^xsd:date . +dataFromVendor1:Offer1153 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product27 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7071.07"^^bsbm:USD ; + bsbm:validFrom "2008-04-29T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-31T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-04"^^xsd:date . +dataFromVendor1:Offer1154 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product24 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5561.91"^^bsbm:USD ; + bsbm:validFrom "2008-01-26T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-21T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-09"^^xsd:date . +dataFromVendor1:Offer1155 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product53 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3230.43"^^bsbm:USD ; + bsbm:validFrom "2008-01-30T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-16T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "1"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-08"^^xsd:date . +dataFromVendor1:Offer1156 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product16 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2580.55"^^bsbm:USD ; + bsbm:validFrom "2008-04-28T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-11T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-23"^^xsd:date . +dataFromVendor1:Offer1157 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product52 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "315.05"^^bsbm:USD ; + bsbm:validFrom "2008-03-20T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-07T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-18"^^xsd:date . +dataFromVendor1:Offer1158 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product71 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3490.45"^^bsbm:USD ; + bsbm:validFrom "2008-01-29T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-18T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-22"^^xsd:date . +dataFromVendor1:Offer1159 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product40 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4865.33"^^bsbm:USD ; + bsbm:validFrom "2008-03-05T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-11T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-22"^^xsd:date . +dataFromVendor1:Offer1160 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product57 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4969.09"^^bsbm:USD ; + bsbm:validFrom "2008-03-15T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-28T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-07"^^xsd:date . +dataFromVendor1:Offer1161 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product47 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9062.36"^^bsbm:USD ; + bsbm:validFrom "2008-05-07T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-28T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-10"^^xsd:date . +dataFromVendor1:Offer1162 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product24 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9545.81"^^bsbm:USD ; + bsbm:validFrom "2008-02-21T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-05T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-09"^^xsd:date . +dataFromVendor1:Offer1163 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product75 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6427.23"^^bsbm:USD ; + bsbm:validFrom "2008-03-12T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-21T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "6"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-25"^^xsd:date . +dataFromVendor1:Offer1164 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product86 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "50.85"^^bsbm:USD ; + bsbm:validFrom "2008-03-11T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-23T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-02"^^xsd:date . +dataFromVendor1:Offer1165 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product79 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5576.75"^^bsbm:USD ; + bsbm:validFrom "2008-04-05T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-28T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-10"^^xsd:date . +dataFromVendor1:Offer1166 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product60 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9288.57"^^bsbm:USD ; + bsbm:validFrom "2008-04-29T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-11T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-07"^^xsd:date . +dataFromVendor1:Offer1167 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product67 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3316.44"^^bsbm:USD ; + bsbm:validFrom "2008-04-04T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-28T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-26"^^xsd:date . +dataFromVendor1:Offer1168 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer3:Product96 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1128.29"^^bsbm:USD ; + bsbm:validFrom "2008-03-11T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-09T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-23"^^xsd:date . +dataFromVendor1:Offer1169 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product36 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8257.00"^^bsbm:USD ; + bsbm:validFrom "2008-01-31T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-05T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-13"^^xsd:date . +dataFromVendor1:Offer1170 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer3:Product99 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5844.39"^^bsbm:USD ; + bsbm:validFrom "2008-03-13T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-24T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-09"^^xsd:date . +dataFromVendor1:Offer1171 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product22 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2775.71"^^bsbm:USD ; + bsbm:validFrom "2008-03-12T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-17T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-24"^^xsd:date . +dataFromVendor1:Offer1172 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product24 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1577.66"^^bsbm:USD ; + bsbm:validFrom "2008-05-13T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-29T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-18"^^xsd:date . +dataFromVendor1:Offer1173 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product64 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4103.13"^^bsbm:USD ; + bsbm:validFrom "2008-04-13T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-06T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-11"^^xsd:date . +dataFromVendor1:Offer1174 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product50 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3431.72"^^bsbm:USD ; + bsbm:validFrom "2008-04-04T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-18T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-30"^^xsd:date . +dataFromVendor1:Offer1175 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product67 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5164.01"^^bsbm:USD ; + bsbm:validFrom "2008-04-15T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-27T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "6"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-13"^^xsd:date . +dataFromVendor1:Offer1176 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product67 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3816.91"^^bsbm:USD ; + bsbm:validFrom "2007-12-29T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-30T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-28"^^xsd:date . +dataFromVendor1:Offer1177 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product4 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1808.79"^^bsbm:USD ; + bsbm:validFrom "2008-02-24T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-24T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-10"^^xsd:date . +dataFromVendor1:Offer1178 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product56 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "609.42"^^bsbm:USD ; + bsbm:validFrom "2008-03-23T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-03T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-17"^^xsd:date . +dataFromVendor1:Offer1179 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product48 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6009.04"^^bsbm:USD ; + bsbm:validFrom "2008-04-25T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-11T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "1"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-08"^^xsd:date . +dataFromVendor1:Offer1180 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product27 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4680.40"^^bsbm:USD ; + bsbm:validFrom "2008-05-01T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-13T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-28"^^xsd:date . +dataFromVendor1:Offer1181 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product34 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3905.97"^^bsbm:USD ; + bsbm:validFrom "2008-04-22T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-10T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-03"^^xsd:date . +dataFromVendor1:Offer1182 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product32 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4683.79"^^bsbm:USD ; + bsbm:validFrom "2008-03-21T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-19T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-24"^^xsd:date . +dataFromVendor1:Offer1183 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product29 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3416.65"^^bsbm:USD ; + bsbm:validFrom "2008-02-16T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-01T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-10"^^xsd:date . +dataFromVendor1:Offer1184 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product34 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4861.63"^^bsbm:USD ; + bsbm:validFrom "2008-02-21T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-08T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-17"^^xsd:date . +dataFromVendor1:Offer1185 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product58 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8726.95"^^bsbm:USD ; + bsbm:validFrom "2008-03-25T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-26T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-25"^^xsd:date . +dataFromVendor1:Offer1186 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product22 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1253.44"^^bsbm:USD ; + bsbm:validFrom "2008-03-26T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-30T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-28"^^xsd:date . +dataFromVendor1:Offer1187 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product68 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7908.76"^^bsbm:USD ; + bsbm:validFrom "2008-02-11T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-28T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-30"^^xsd:date . +dataFromVendor1:Offer1188 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product23 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2639.47"^^bsbm:USD ; + bsbm:validFrom "2008-03-22T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-04T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "1"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-06"^^xsd:date . +dataFromVendor1:Offer1189 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer3:Product97 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5522.20"^^bsbm:USD ; + bsbm:validFrom "2008-06-04T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-20T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-16"^^xsd:date . +dataFromVendor1:Offer1190 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product14 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5274.03"^^bsbm:USD ; + bsbm:validFrom "2008-01-30T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-28T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-25"^^xsd:date . +dataFromVendor1:Offer1191 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product42 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4285.46"^^bsbm:USD ; + bsbm:validFrom "2008-01-20T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-17T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-04"^^xsd:date . +dataFromVendor1:Offer1192 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product50 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4566.66"^^bsbm:USD ; + bsbm:validFrom "2008-01-07T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-24T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-27"^^xsd:date . +dataFromVendor1:Offer1193 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product60 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8531.43"^^bsbm:USD ; + bsbm:validFrom "2008-02-20T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-30T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-02"^^xsd:date . +dataFromVendor1:Offer1194 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product68 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2683.75"^^bsbm:USD ; + bsbm:validFrom "2008-04-28T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-05T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-26"^^xsd:date . +dataFromVendor1:Offer1195 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product48 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7510.49"^^bsbm:USD ; + bsbm:validFrom "2008-04-28T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-15T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-01"^^xsd:date . +dataFromVendor1:Offer1196 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product43 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8338.37"^^bsbm:USD ; + bsbm:validFrom "2008-05-02T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-13T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-15"^^xsd:date . +dataFromVendor1:Offer1197 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product31 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8389.24"^^bsbm:USD ; + bsbm:validFrom "2008-03-07T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-04T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-05"^^xsd:date . +dataFromVendor1:Offer1198 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product57 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3924.08"^^bsbm:USD ; + bsbm:validFrom "2008-04-27T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-29T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-18"^^xsd:date . +dataFromVendor1:Offer1199 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product83 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7293.14"^^bsbm:USD ; + bsbm:validFrom "2008-02-09T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-10T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-17"^^xsd:date . +dataFromVendor1:Offer1200 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product7 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5512.33"^^bsbm:USD ; + bsbm:validFrom "2008-05-24T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-30T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-26"^^xsd:date . +dataFromVendor1:Offer1201 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product59 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1605.03"^^bsbm:USD ; + bsbm:validFrom "2008-03-21T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-13T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-04"^^xsd:date . +dataFromVendor1:Offer1202 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product62 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3404.29"^^bsbm:USD ; + bsbm:validFrom "2008-02-21T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-14T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-01"^^xsd:date . +dataFromVendor1:Offer1203 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product19 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8333.36"^^bsbm:USD ; + bsbm:validFrom "2008-04-25T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-06T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-31"^^xsd:date . +dataFromVendor1:Offer1204 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product49 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4275.59"^^bsbm:USD ; + bsbm:validFrom "2008-03-14T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-16T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-01"^^xsd:date . +dataFromVendor1:Offer1205 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product13 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1485.93"^^bsbm:USD ; + bsbm:validFrom "2008-05-23T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-24T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-05"^^xsd:date . +dataFromVendor1:Offer1206 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product16 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1276.58"^^bsbm:USD ; + bsbm:validFrom "2008-05-10T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-11T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-20"^^xsd:date . +dataFromVendor1:Offer1207 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product29 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5880.65"^^bsbm:USD ; + bsbm:validFrom "2008-04-24T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-29T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-26"^^xsd:date . +dataFromVendor1:Offer1208 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product72 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4987.14"^^bsbm:USD ; + bsbm:validFrom "2008-02-24T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-11T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-18"^^xsd:date . +dataFromVendor1:Offer1209 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product34 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6335.11"^^bsbm:USD ; + bsbm:validFrom "2008-04-08T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-20T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-19"^^xsd:date . +dataFromVendor1:Offer1210 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product55 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6507.88"^^bsbm:USD ; + bsbm:validFrom "2008-02-13T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-17T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-15"^^xsd:date . +dataFromVendor1:Offer1211 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product16 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8620.83"^^bsbm:USD ; + bsbm:validFrom "2008-04-22T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-15T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-25"^^xsd:date . +dataFromVendor1:Offer1212 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product74 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3653.75"^^bsbm:USD ; + bsbm:validFrom "2008-05-12T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-05T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "7"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-15"^^xsd:date . +dataFromVendor1:Offer1213 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer3:Product94 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3206.70"^^bsbm:USD ; + bsbm:validFrom "2008-03-22T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-09T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-24"^^xsd:date . +dataFromVendor1:Offer1214 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product74 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2702.86"^^bsbm:USD ; + bsbm:validFrom "2008-03-15T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-21T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-01"^^xsd:date . +dataFromVendor1:Offer1215 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product62 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3514.00"^^bsbm:USD ; + bsbm:validFrom "2008-02-26T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-16T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-11"^^xsd:date . +dataFromVendor1:Offer1216 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product66 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1045.87"^^bsbm:USD ; + bsbm:validFrom "2008-03-07T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-18T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-13"^^xsd:date . +dataFromVendor1:Offer1217 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product35 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8037.09"^^bsbm:USD ; + bsbm:validFrom "2008-02-25T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-14T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-25"^^xsd:date . +dataFromVendor1:Offer1218 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product45 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "561.32"^^bsbm:USD ; + bsbm:validFrom "2008-03-08T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-17T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-17"^^xsd:date . +dataFromVendor1:Offer1219 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product48 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9580.23"^^bsbm:USD ; + bsbm:validFrom "2008-03-26T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-27T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-29"^^xsd:date . +dataFromVendor1:Offer1220 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product44 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7653.47"^^bsbm:USD ; + bsbm:validFrom "2008-03-21T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-09-14T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-18"^^xsd:date . +dataFromVendor1:Offer1221 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product80 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5541.42"^^bsbm:USD ; + bsbm:validFrom "2008-05-02T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-11T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "6"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-29"^^xsd:date . +dataFromVendor1:Offer1222 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product53 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3502.37"^^bsbm:USD ; + bsbm:validFrom "2008-03-08T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-03-25T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-16"^^xsd:date . +dataFromVendor1:Offer1223 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product59 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "313.57"^^bsbm:USD ; + bsbm:validFrom "2008-03-02T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-24T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-06"^^xsd:date . +dataFromVendor1:Offer1224 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product82 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7196.08"^^bsbm:USD ; + bsbm:validFrom "2008-01-29T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-16T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-08"^^xsd:date . +dataFromVendor1:Offer1225 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product35 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4587.48"^^bsbm:USD ; + bsbm:validFrom "2008-03-28T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-19T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "6"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-18"^^xsd:date . +dataFromVendor1:Offer1226 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product65 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5340.89"^^bsbm:USD ; + bsbm:validFrom "2008-04-24T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-30T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "8"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-06"^^xsd:date . +dataFromVendor1:Offer1227 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product54 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6638.74"^^bsbm:USD ; + bsbm:validFrom "2008-03-07T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-15T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-13"^^xsd:date . +dataFromVendor1:Offer1228 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product44 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3819.48"^^bsbm:USD ; + bsbm:validFrom "2008-05-15T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-08T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-16"^^xsd:date . +dataFromVendor1:Offer1229 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product35 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7468.40"^^bsbm:USD ; + bsbm:validFrom "2008-03-14T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-04T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-18"^^xsd:date . +dataFromVendor1:Offer1230 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product12 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1471.14"^^bsbm:USD ; + bsbm:validFrom "2008-02-12T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-27T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-10"^^xsd:date . +dataFromVendor1:Offer1231 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product34 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5178.42"^^bsbm:USD ; + bsbm:validFrom "2008-02-16T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-17T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-12"^^xsd:date . +dataFromVendor1:Offer1232 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product18 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "750.71"^^bsbm:USD ; + bsbm:validFrom "2008-03-03T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-12T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-07"^^xsd:date . +dataFromVendor1:Offer1233 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product38 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3838.78"^^bsbm:USD ; + bsbm:validFrom "2008-02-13T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-07T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-02"^^xsd:date . +dataFromVendor1:Offer1234 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product51 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7505.68"^^bsbm:USD ; + bsbm:validFrom "2008-03-14T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-21T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-02"^^xsd:date . +dataFromVendor1:Offer1235 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product36 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8693.01"^^bsbm:USD ; + bsbm:validFrom "2008-05-20T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-29T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-01"^^xsd:date . +dataFromVendor1:Offer1236 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product68 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "561.50"^^bsbm:USD ; + bsbm:validFrom "2008-02-11T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-15T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-26"^^xsd:date . +dataFromVendor1:Offer1237 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer3:Product95 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2628.13"^^bsbm:USD ; + bsbm:validFrom "2008-02-23T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-24T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-12"^^xsd:date . +dataFromVendor1:Offer1238 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer3:Product97 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1856.83"^^bsbm:USD ; + bsbm:validFrom "2008-03-25T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-18T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "6"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-13"^^xsd:date . +dataFromVendor1:Offer1239 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product65 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8438.26"^^bsbm:USD ; + bsbm:validFrom "2008-02-12T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-21T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-12"^^xsd:date . +dataFromVendor1:Offer1240 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product49 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9744.13"^^bsbm:USD ; + bsbm:validFrom "2008-01-10T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-17T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-29"^^xsd:date . +dataFromVendor1:Offer1241 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product54 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7798.86"^^bsbm:USD ; + bsbm:validFrom "2008-03-18T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-30T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-27"^^xsd:date . +dataFromVendor1:Offer1242 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product84 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1101.34"^^bsbm:USD ; + bsbm:validFrom "2008-02-12T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-30T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-03"^^xsd:date . +dataFromVendor1:Offer1243 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product23 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "395.24"^^bsbm:USD ; + bsbm:validFrom "2008-05-15T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-16T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "6"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-15"^^xsd:date . +dataFromVendor1:Offer1244 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product10 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2817.38"^^bsbm:USD ; + bsbm:validFrom "2007-12-22T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-05T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-20"^^xsd:date . +dataFromVendor1:Offer1245 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer3:Product97 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6235.14"^^bsbm:USD ; + bsbm:validFrom "2008-02-06T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-05T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-22"^^xsd:date . +dataFromVendor1:Offer1246 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product20 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9703.03"^^bsbm:USD ; + bsbm:validFrom "2008-02-08T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-17T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-03"^^xsd:date . +dataFromVendor1:Offer1247 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product53 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9985.43"^^bsbm:USD ; + bsbm:validFrom "2008-03-10T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-10T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-24"^^xsd:date . +dataFromVendor1:Offer1248 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product42 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3579.17"^^bsbm:USD ; + bsbm:validFrom "2008-05-27T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-16T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-30"^^xsd:date . +dataFromVendor1:Offer1249 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product55 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8562.28"^^bsbm:USD ; + bsbm:validFrom "2008-03-05T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-22T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "1"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-30"^^xsd:date . +dataFromVendor1:Offer1250 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product47 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7956.65"^^bsbm:USD ; + bsbm:validFrom "2008-03-17T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-18T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-25"^^xsd:date . +dataFromVendor1:Offer1251 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product80 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2397.98"^^bsbm:USD ; + bsbm:validFrom "2008-05-09T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-03T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-14"^^xsd:date . +dataFromVendor1:Offer1252 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product60 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3840.91"^^bsbm:USD ; + bsbm:validFrom "2008-03-05T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-15T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-24"^^xsd:date . +dataFromVendor1:Offer1253 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product45 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6285.60"^^bsbm:USD ; + bsbm:validFrom "2008-04-08T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-30T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-22"^^xsd:date . +dataFromVendor1:Offer1254 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product56 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4585.06"^^bsbm:USD ; + bsbm:validFrom "2008-03-07T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-03T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-15"^^xsd:date . +dataFromVendor1:Offer1255 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product19 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7934.43"^^bsbm:USD ; + bsbm:validFrom "2008-06-09T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-21T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-12"^^xsd:date . +dataFromVendor1:Offer1256 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product68 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2197.69"^^bsbm:USD ; + bsbm:validFrom "2008-01-23T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-12T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-02"^^xsd:date . +dataFromVendor1:Offer1257 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product54 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "990.95"^^bsbm:USD ; + bsbm:validFrom "2008-04-13T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-05T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-17"^^xsd:date . +dataFromVendor1:Offer1258 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product27 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3010.53"^^bsbm:USD ; + bsbm:validFrom "2008-04-25T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-23T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-04"^^xsd:date . +dataFromVendor1:Offer1259 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product31 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4670.29"^^bsbm:USD ; + bsbm:validFrom "2008-05-22T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-09-07T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-15"^^xsd:date . +dataFromVendor1:Offer1260 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product30 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8106.96"^^bsbm:USD ; + bsbm:validFrom "2008-03-27T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-17T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-20"^^xsd:date . +dataFromVendor1:Offer1261 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product67 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3978.07"^^bsbm:USD ; + bsbm:validFrom "2008-03-25T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-24T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-05"^^xsd:date . +dataFromVendor1:Offer1262 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product12 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2684.93"^^bsbm:USD ; + bsbm:validFrom "2008-02-27T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-27T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-21"^^xsd:date . +dataFromVendor1:Offer1263 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product8 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2781.52"^^bsbm:USD ; + bsbm:validFrom "2008-03-15T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-14T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-07"^^xsd:date . +dataFromVendor1:Offer1264 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product61 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8972.11"^^bsbm:USD ; + bsbm:validFrom "2008-04-05T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-19T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-04"^^xsd:date . +dataFromVendor1:Offer1265 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product41 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7146.85"^^bsbm:USD ; + bsbm:validFrom "2008-02-21T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-03T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-11"^^xsd:date . +dataFromVendor1:Offer1266 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product42 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9436.83"^^bsbm:USD ; + bsbm:validFrom "2008-01-28T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-14T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "1"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-23"^^xsd:date . +dataFromVendor1:Offer1267 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product43 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7767.62"^^bsbm:USD ; + bsbm:validFrom "2008-04-30T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-11T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "1"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-03"^^xsd:date . +dataFromVendor1:Offer1268 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product88 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "376.32"^^bsbm:USD ; + bsbm:validFrom "2008-04-21T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-17T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-19"^^xsd:date . +dataFromVendor1:Offer1269 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product28 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8414.93"^^bsbm:USD ; + bsbm:validFrom "2008-03-12T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-16T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-08"^^xsd:date . +dataFromVendor1:Offer1270 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product91 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1307.96"^^bsbm:USD ; + bsbm:validFrom "2008-05-23T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-29T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-27"^^xsd:date . +dataFromVendor1:Offer1271 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product11 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2071.89"^^bsbm:USD ; + bsbm:validFrom "2008-01-26T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-12T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-23"^^xsd:date . +dataFromVendor1:Offer1272 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product67 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2200.44"^^bsbm:USD ; + bsbm:validFrom "2008-05-01T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-24T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-09"^^xsd:date . +dataFromVendor1:Offer1273 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product77 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7529.14"^^bsbm:USD ; + bsbm:validFrom "2008-02-25T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-12T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-03"^^xsd:date . +dataFromVendor1:Offer1274 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product54 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8744.56"^^bsbm:USD ; + bsbm:validFrom "2008-04-17T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-09T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-20"^^xsd:date . +dataFromVendor1:Offer1275 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product79 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7138.14"^^bsbm:USD ; + bsbm:validFrom "2008-01-19T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-13T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-20"^^xsd:date . +dataFromVendor1:Offer1276 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product65 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5847.81"^^bsbm:USD ; + bsbm:validFrom "2008-05-02T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-24T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-18"^^xsd:date . +dataFromVendor1:Offer1277 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product38 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "577.02"^^bsbm:USD ; + bsbm:validFrom "2008-04-15T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-04T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-15"^^xsd:date . +dataFromVendor1:Offer1278 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product51 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "743.44"^^bsbm:USD ; + bsbm:validFrom "2008-05-01T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-16T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-16"^^xsd:date . +dataFromVendor1:Offer1279 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product38 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "586.88"^^bsbm:USD ; + bsbm:validFrom "2008-02-20T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-02T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-16"^^xsd:date . +dataFromVendor1:Offer1280 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product20 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "197.33"^^bsbm:USD ; + bsbm:validFrom "2008-05-09T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-13T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-11"^^xsd:date . +dataFromVendor1:Offer1281 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product35 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4003.12"^^bsbm:USD ; + bsbm:validFrom "2008-04-05T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-07T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-20"^^xsd:date . +dataFromVendor1:Offer1282 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product77 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "685.96"^^bsbm:USD ; + bsbm:validFrom "2008-02-27T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-24T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-06"^^xsd:date . +dataFromVendor1:Offer1283 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product41 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5422.75"^^bsbm:USD ; + bsbm:validFrom "2008-05-02T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-26T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "1"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-02"^^xsd:date . +dataFromVendor1:Offer1284 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product67 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6515.11"^^bsbm:USD ; + bsbm:validFrom "2008-03-21T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-30T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-17"^^xsd:date . +dataFromVendor1:Offer1285 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product39 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1503.94"^^bsbm:USD ; + bsbm:validFrom "2008-03-28T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-09T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "6"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-13"^^xsd:date . +dataFromVendor1:Offer1286 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product46 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8517.02"^^bsbm:USD ; + bsbm:validFrom "2008-02-16T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-14T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-22"^^xsd:date . +dataFromVendor1:Offer1287 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product27 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1018.75"^^bsbm:USD ; + bsbm:validFrom "2008-04-16T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-12T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-30"^^xsd:date . +dataFromVendor1:Offer1288 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product73 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5078.59"^^bsbm:USD ; + bsbm:validFrom "2008-02-14T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-11T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-01"^^xsd:date . +dataFromVendor1:Offer1289 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product58 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9523.75"^^bsbm:USD ; + bsbm:validFrom "2008-03-24T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-12T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-15"^^xsd:date . +dataFromVendor1:Offer1290 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product45 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8074.99"^^bsbm:USD ; + bsbm:validFrom "2008-02-26T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-29T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-12"^^xsd:date . +dataFromVendor1:Offer1291 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product55 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7771.47"^^bsbm:USD ; + bsbm:validFrom "2008-05-25T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-13T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-26"^^xsd:date . +dataFromVendor1:Offer1292 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product5 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8580.87"^^bsbm:USD ; + bsbm:validFrom "2008-05-13T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-23T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-17"^^xsd:date . +dataFromVendor1:Offer1293 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product33 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9797.56"^^bsbm:USD ; + bsbm:validFrom "2008-03-27T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-14T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-03"^^xsd:date . +dataFromVendor1:Offer1294 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product29 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1047.09"^^bsbm:USD ; + bsbm:validFrom "2008-05-01T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-22T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-16"^^xsd:date . +dataFromVendor1:Offer1295 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product58 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "170.51"^^bsbm:USD ; + bsbm:validFrom "2008-03-03T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-07T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-27"^^xsd:date . +dataFromVendor1:Offer1296 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer3:Product96 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "151.74"^^bsbm:USD ; + bsbm:validFrom "2008-03-25T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-31T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-04"^^xsd:date . +dataFromVendor1:Offer1297 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product33 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9631.05"^^bsbm:USD ; + bsbm:validFrom "2008-04-26T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-07T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "1"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-10"^^xsd:date . +dataFromVendor1:Offer1298 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product12 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1528.59"^^bsbm:USD ; + bsbm:validFrom "2008-04-26T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-23T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-10"^^xsd:date . +dataFromVendor1:Offer1299 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product47 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5173.62"^^bsbm:USD ; + bsbm:validFrom "2008-02-25T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-06T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-22"^^xsd:date . +dataFromVendor1:Offer1300 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product15 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6055.54"^^bsbm:USD ; + bsbm:validFrom "2008-05-05T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-24T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "1"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-09"^^xsd:date . +dataFromVendor1:Offer1301 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product12 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3351.18"^^bsbm:USD ; + bsbm:validFrom "2008-02-26T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-18T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-02"^^xsd:date . +dataFromVendor1:Offer1302 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product47 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7622.90"^^bsbm:USD ; + bsbm:validFrom "2008-03-09T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-12T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-19"^^xsd:date . +dataFromVendor1:Offer1303 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product13 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5648.33"^^bsbm:USD ; + bsbm:validFrom "2008-03-10T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-02T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-21"^^xsd:date . +dataFromVendor1:Offer1304 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product68 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5909.98"^^bsbm:USD ; + bsbm:validFrom "2008-03-12T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-08T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-27"^^xsd:date . +dataFromVendor1:Offer1305 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product63 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "664.88"^^bsbm:USD ; + bsbm:validFrom "2008-03-07T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-02T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-26"^^xsd:date . +dataFromVendor1:Offer1306 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product69 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8998.43"^^bsbm:USD ; + bsbm:validFrom "2008-01-09T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-09T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-29"^^xsd:date . +dataFromVendor1:Offer1307 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product44 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "774.26"^^bsbm:USD ; + bsbm:validFrom "2008-04-02T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-24T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-26"^^xsd:date . +dataFromVendor1:Offer1308 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product49 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5458.42"^^bsbm:USD ; + bsbm:validFrom "2008-03-01T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-12T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-06"^^xsd:date . +dataFromVendor1:Offer1309 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product56 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "306.89"^^bsbm:USD ; + bsbm:validFrom "2008-04-09T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-27T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-12"^^xsd:date . +dataFromVendor1:Offer1310 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product89 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1861.75"^^bsbm:USD ; + bsbm:validFrom "2008-02-03T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-05T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-01"^^xsd:date . +dataFromVendor1:Offer1311 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product85 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8083.99"^^bsbm:USD ; + bsbm:validFrom "2008-04-10T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-09-01T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-14"^^xsd:date . +dataFromVendor1:Offer1312 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product13 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9722.26"^^bsbm:USD ; + bsbm:validFrom "2008-03-17T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-27T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-17"^^xsd:date . +dataFromVendor1:Offer1313 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product40 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9746.77"^^bsbm:USD ; + bsbm:validFrom "2008-01-31T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-15T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-30"^^xsd:date . +dataFromVendor1:Offer1314 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product92 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5295.45"^^bsbm:USD ; + bsbm:validFrom "2008-04-18T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-07T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "1"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-19"^^xsd:date . +dataFromVendor1:Offer1315 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product83 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4214.57"^^bsbm:USD ; + bsbm:validFrom "2008-04-09T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-28T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-16"^^xsd:date . +dataFromVendor1:Offer1316 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product37 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6673.55"^^bsbm:USD ; + bsbm:validFrom "2008-03-21T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-30T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-10"^^xsd:date . +dataFromVendor1:Offer1317 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product31 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4328.62"^^bsbm:USD ; + bsbm:validFrom "2008-03-07T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-17T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-31"^^xsd:date . +dataFromVendor1:Offer1318 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product60 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5442.77"^^bsbm:USD ; + bsbm:validFrom "2008-01-27T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-26T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-17"^^xsd:date . +dataFromVendor1:Offer1319 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product73 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3839.88"^^bsbm:USD ; + bsbm:validFrom "2008-02-17T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-17T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-18"^^xsd:date . +dataFromVendor1:Offer1320 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product67 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4101.79"^^bsbm:USD ; + bsbm:validFrom "2007-12-30T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-30T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-29"^^xsd:date . +dataFromVendor1:Offer1321 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product14 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1576.05"^^bsbm:USD ; + bsbm:validFrom "2008-02-14T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-28T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-14"^^xsd:date . +dataFromVendor1:Offer1322 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product43 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6394.78"^^bsbm:USD ; + bsbm:validFrom "2008-01-18T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-09T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-21"^^xsd:date . +dataFromVendor1:Offer1323 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product22 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8988.37"^^bsbm:USD ; + bsbm:validFrom "2008-02-04T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-03T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-15"^^xsd:date . +dataFromVendor1:Offer1324 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product10 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4927.74"^^bsbm:USD ; + bsbm:validFrom "2008-02-23T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-29T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-11"^^xsd:date . +dataFromVendor1:Offer1325 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product47 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9103.37"^^bsbm:USD ; + bsbm:validFrom "2008-02-03T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-06T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-06"^^xsd:date . +dataFromVendor1:Offer1326 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product39 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9314.87"^^bsbm:USD ; + bsbm:validFrom "2008-02-24T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-28T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-04"^^xsd:date . +dataFromVendor1:Offer1327 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product60 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3229.06"^^bsbm:USD ; + bsbm:validFrom "2008-05-05T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-18T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-25"^^xsd:date . +dataFromVendor1:Offer1328 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product74 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8615.53"^^bsbm:USD ; + bsbm:validFrom "2008-03-27T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-21T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-23"^^xsd:date . +dataFromVendor1:Offer1329 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product52 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6873.05"^^bsbm:USD ; + bsbm:validFrom "2008-03-04T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-04T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-12"^^xsd:date . +dataFromVendor1:Offer1330 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product31 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3703.59"^^bsbm:USD ; + bsbm:validFrom "2008-03-27T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-02T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-13"^^xsd:date . +dataFromVendor1:Offer1331 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product84 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7787.58"^^bsbm:USD ; + bsbm:validFrom "2008-04-07T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-09-02T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-05"^^xsd:date . +dataFromVendor1:Offer1332 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product80 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8893.42"^^bsbm:USD ; + bsbm:validFrom "2008-02-13T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-14T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-08"^^xsd:date . +dataFromVendor1:Offer1333 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product27 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7098.10"^^bsbm:USD ; + bsbm:validFrom "2008-01-26T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-10T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-18"^^xsd:date . +dataFromVendor1:Offer1334 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product49 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7231.31"^^bsbm:USD ; + bsbm:validFrom "2008-03-15T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-20T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-08"^^xsd:date . +dataFromVendor1:Offer1335 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product72 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9257.92"^^bsbm:USD ; + bsbm:validFrom "2008-03-29T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-28T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-01"^^xsd:date . +dataFromVendor1:Offer1336 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product39 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "472.18"^^bsbm:USD ; + bsbm:validFrom "2008-04-25T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-19T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-07"^^xsd:date . +dataFromVendor1:Offer1337 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product45 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7701.62"^^bsbm:USD ; + bsbm:validFrom "2008-04-22T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-24T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "1"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-26"^^xsd:date . +dataFromVendor1:Offer1338 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product35 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3159.21"^^bsbm:USD ; + bsbm:validFrom "2008-01-23T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-15T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-20"^^xsd:date . +dataFromVendor1:Offer1339 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product68 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "858.94"^^bsbm:USD ; + bsbm:validFrom "2008-02-02T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-21T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-29"^^xsd:date . +dataFromVendor1:Offer1340 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product87 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9948.67"^^bsbm:USD ; + bsbm:validFrom "2008-03-21T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-18T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-19"^^xsd:date . +dataFromVendor1:Offer1341 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product49 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7569.87"^^bsbm:USD ; + bsbm:validFrom "2008-02-22T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-12T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-15"^^xsd:date . +dataFromVendor1:Offer1342 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product46 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6678.37"^^bsbm:USD ; + bsbm:validFrom "2008-01-31T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-13T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-05"^^xsd:date . +dataFromVendor1:Offer1343 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product45 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1873.87"^^bsbm:USD ; + bsbm:validFrom "2008-03-24T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-05T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "1"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-18"^^xsd:date . +dataFromVendor1:Offer1344 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product42 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8661.24"^^bsbm:USD ; + bsbm:validFrom "2008-04-25T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-01T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-07"^^xsd:date . +dataFromVendor1:Offer1345 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product46 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4458.63"^^bsbm:USD ; + bsbm:validFrom "2008-04-21T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-09T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-26"^^xsd:date . +dataFromVendor1:Offer1346 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product57 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4240.24"^^bsbm:USD ; + bsbm:validFrom "2008-04-16T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-28T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-02"^^xsd:date . +dataFromVendor1:Offer1347 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product51 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2369.50"^^bsbm:USD ; + bsbm:validFrom "2008-05-20T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-23T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-10"^^xsd:date . +dataFromVendor1:Offer1348 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product50 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7542.08"^^bsbm:USD ; + bsbm:validFrom "2008-04-01T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-30T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-27"^^xsd:date . +dataFromVendor1:Offer1349 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product44 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8856.55"^^bsbm:USD ; + bsbm:validFrom "2008-03-18T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-13T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-26"^^xsd:date . +dataFromVendor1:Offer1350 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product67 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2205.62"^^bsbm:USD ; + bsbm:validFrom "2008-02-29T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-12T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "1"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-26"^^xsd:date . +dataFromVendor1:Offer1351 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer3:Product100 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2680.53"^^bsbm:USD ; + bsbm:validFrom "2008-04-16T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-04T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "6"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-14"^^xsd:date . +dataFromVendor1:Offer1352 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product42 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6825.47"^^bsbm:USD ; + bsbm:validFrom "2008-03-15T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-20T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "1"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-19"^^xsd:date . +dataFromVendor1:Offer1353 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product77 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9657.92"^^bsbm:USD ; + bsbm:validFrom "2008-06-02T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-12T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-16"^^xsd:date . +dataFromVendor1:Offer1354 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product68 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3847.93"^^bsbm:USD ; + bsbm:validFrom "2008-03-29T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-11T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-08"^^xsd:date . +dataFromVendor1:Offer1355 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product62 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9798.49"^^bsbm:USD ; + bsbm:validFrom "2008-03-05T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-07T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-14"^^xsd:date . +dataFromVendor1:Offer1356 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product36 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5704.77"^^bsbm:USD ; + bsbm:validFrom "2008-04-11T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-28T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-14"^^xsd:date . +dataFromVendor1:Offer1357 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product57 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9905.87"^^bsbm:USD ; + bsbm:validFrom "2008-04-24T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-02T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-26"^^xsd:date . +dataFromVendor1:Offer1358 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product60 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6110.38"^^bsbm:USD ; + bsbm:validFrom "2008-04-11T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-25T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "6"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-01"^^xsd:date . +dataFromVendor1:Offer1359 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product84 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5228.10"^^bsbm:USD ; + bsbm:validFrom "2008-02-06T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-21T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-01"^^xsd:date . +dataFromVendor1:Offer1360 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product44 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9664.39"^^bsbm:USD ; + bsbm:validFrom "2008-02-25T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-02T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-13"^^xsd:date . +dataFromVendor1:Offer1361 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product27 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3491.17"^^bsbm:USD ; + bsbm:validFrom "2008-03-29T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-07T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-25"^^xsd:date . +dataFromVendor1:Offer1362 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product10 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "70.47"^^bsbm:USD ; + bsbm:validFrom "2008-03-12T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-30T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "1"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-02"^^xsd:date . +dataFromVendor1:Offer1363 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product19 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1322.99"^^bsbm:USD ; + bsbm:validFrom "2008-04-19T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-23T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-22"^^xsd:date . +dataFromVendor1:Offer1364 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product16 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5697.22"^^bsbm:USD ; + bsbm:validFrom "2008-04-02T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-15T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-03"^^xsd:date . +dataFromVendor1:Offer1365 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product47 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6069.97"^^bsbm:USD ; + bsbm:validFrom "2008-03-06T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-17T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-21"^^xsd:date . +dataFromVendor1:Offer1366 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product29 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1543.73"^^bsbm:USD ; + bsbm:validFrom "2008-01-02T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-30T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-16"^^xsd:date . +dataFromVendor1:Offer1367 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product58 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5761.19"^^bsbm:USD ; + bsbm:validFrom "2008-02-21T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-07T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-23"^^xsd:date . +dataFromVendor1:Offer1368 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product35 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8051.26"^^bsbm:USD ; + bsbm:validFrom "2008-01-23T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-24T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "6"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-24"^^xsd:date . +dataFromVendor1:Offer1369 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product10 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6088.17"^^bsbm:USD ; + bsbm:validFrom "2008-01-11T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-25T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-17"^^xsd:date . +dataFromVendor1:Offer1370 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product36 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "827.69"^^bsbm:USD ; + bsbm:validFrom "2008-01-26T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-29T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-20"^^xsd:date . +dataFromVendor1:Offer1371 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product47 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6174.81"^^bsbm:USD ; + bsbm:validFrom "2008-05-09T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-13T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-26"^^xsd:date . +dataFromVendor1:Offer1372 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product25 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9783.32"^^bsbm:USD ; + bsbm:validFrom "2008-05-30T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-12T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-30"^^xsd:date . +dataFromVendor1:Offer1373 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product38 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4148.30"^^bsbm:USD ; + bsbm:validFrom "2008-05-16T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-14T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-16"^^xsd:date . +dataFromVendor1:Offer1374 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product53 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2945.67"^^bsbm:USD ; + bsbm:validFrom "2008-03-03T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-12T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-17"^^xsd:date . +dataFromVendor1:Offer1375 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product59 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9486.74"^^bsbm:USD ; + bsbm:validFrom "2008-02-12T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-08T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "6"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-21"^^xsd:date . +dataFromVendor1:Offer1376 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product56 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7731.11"^^bsbm:USD ; + bsbm:validFrom "2008-03-18T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-17T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-07"^^xsd:date . +dataFromVendor1:Offer1377 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product60 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1609.08"^^bsbm:USD ; + bsbm:validFrom "2008-02-01T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-11T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-06"^^xsd:date . +dataFromVendor1:Offer1378 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product37 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2413.55"^^bsbm:USD ; + bsbm:validFrom "2008-01-28T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-09T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-22"^^xsd:date . +dataFromVendor1:Offer1379 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product62 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3091.33"^^bsbm:USD ; + bsbm:validFrom "2008-03-30T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-06T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "1"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-27"^^xsd:date . +dataFromVendor1:Offer1380 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product25 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1149.15"^^bsbm:USD ; + bsbm:validFrom "2008-04-24T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-14T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-24"^^xsd:date . +dataFromVendor1:Offer1381 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product62 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1706.09"^^bsbm:USD ; + bsbm:validFrom "2008-01-29T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-14T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-27"^^xsd:date . +dataFromVendor1:Offer1382 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product41 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8916.92"^^bsbm:USD ; + bsbm:validFrom "2008-03-03T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-03-29T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-22"^^xsd:date . +dataFromVendor1:Offer1383 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product28 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7364.50"^^bsbm:USD ; + bsbm:validFrom "2008-03-23T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-01T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-09"^^xsd:date . +dataFromVendor1:Offer1384 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product54 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6682.18"^^bsbm:USD ; + bsbm:validFrom "2008-03-29T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-13T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-25"^^xsd:date . +dataFromVendor1:Offer1385 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product12 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9021.10"^^bsbm:USD ; + bsbm:validFrom "2008-03-23T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-26T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-09"^^xsd:date . +dataFromVendor1:Offer1386 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product78 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2904.08"^^bsbm:USD ; + bsbm:validFrom "2008-04-01T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-17T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-06"^^xsd:date . +dataFromVendor1:Offer1387 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product41 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1682.53"^^bsbm:USD ; + bsbm:validFrom "2008-02-03T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-07T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-21"^^xsd:date . +dataFromVendor1:Offer1388 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product93 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4914.05"^^bsbm:USD ; + bsbm:validFrom "2008-01-31T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-10T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-15"^^xsd:date . +dataFromVendor1:Offer1389 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product13 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5631.09"^^bsbm:USD ; + bsbm:validFrom "2008-03-15T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-06T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-15"^^xsd:date . +dataFromVendor1:Offer1390 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product61 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2449.82"^^bsbm:USD ; + bsbm:validFrom "2008-05-31T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-09-13T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-17"^^xsd:date . +dataFromVendor1:Offer1391 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product28 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8377.61"^^bsbm:USD ; + bsbm:validFrom "2008-05-02T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-27T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-09"^^xsd:date . +dataFromVendor1:Offer1392 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product68 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6093.41"^^bsbm:USD ; + bsbm:validFrom "2008-03-02T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-07T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-01"^^xsd:date . +dataFromVendor1:Offer1393 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product51 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4707.03"^^bsbm:USD ; + bsbm:validFrom "2008-04-01T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-02T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-23"^^xsd:date . +dataFromVendor1:Offer1394 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product50 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5453.10"^^bsbm:USD ; + bsbm:validFrom "2008-02-24T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-03-26T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-17"^^xsd:date . +dataFromVendor1:Offer1395 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product22 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1866.89"^^bsbm:USD ; + bsbm:validFrom "2008-04-06T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-11T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-05"^^xsd:date . +dataFromVendor1:Offer1396 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product92 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5346.40"^^bsbm:USD ; + bsbm:validFrom "2008-03-22T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-01T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-20"^^xsd:date . +dataFromVendor1:Offer1397 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product26 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4970.89"^^bsbm:USD ; + bsbm:validFrom "2008-03-25T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-05T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-18"^^xsd:date . +dataFromVendor1:Offer1398 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product77 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3515.83"^^bsbm:USD ; + bsbm:validFrom "2008-03-01T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-01T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "6"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-16"^^xsd:date . +dataFromVendor1:Offer1399 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product74 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2345.62"^^bsbm:USD ; + bsbm:validFrom "2008-03-14T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-25T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "1"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-15"^^xsd:date . +dataFromVendor1:Offer1400 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product12 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9980.42"^^bsbm:USD ; + bsbm:validFrom "2008-05-06T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-19T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-17"^^xsd:date . +dataFromVendor1:Offer1401 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product59 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1753.36"^^bsbm:USD ; + bsbm:validFrom "2008-01-08T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-27T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-29"^^xsd:date . +dataFromVendor1:Offer1402 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product61 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6478.46"^^bsbm:USD ; + bsbm:validFrom "2008-04-16T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-18T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "6"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-20"^^xsd:date . +dataFromVendor1:Offer1403 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product82 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6288.54"^^bsbm:USD ; + bsbm:validFrom "2008-03-14T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-15T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-19"^^xsd:date . +dataFromVendor1:Offer1404 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product40 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4141.62"^^bsbm:USD ; + bsbm:validFrom "2008-02-28T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-05T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-18"^^xsd:date . +dataFromVendor1:Offer1405 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product34 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2998.53"^^bsbm:USD ; + bsbm:validFrom "2008-02-27T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-20T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-15"^^xsd:date . +dataFromVendor1:Offer1406 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product63 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9092.20"^^bsbm:USD ; + bsbm:validFrom "2008-03-22T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-16T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "6"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-06"^^xsd:date . +dataFromVendor1:Offer1407 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product93 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8202.71"^^bsbm:USD ; + bsbm:validFrom "2008-04-11T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-30T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-08"^^xsd:date . +dataFromVendor1:Offer1408 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product53 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8442.51"^^bsbm:USD ; + bsbm:validFrom "2008-03-07T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-31T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-26"^^xsd:date . +dataFromVendor1:Offer1409 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product73 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1060.21"^^bsbm:USD ; + bsbm:validFrom "2008-04-15T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-29T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-14"^^xsd:date . +dataFromVendor1:Offer1410 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product68 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3720.95"^^bsbm:USD ; + bsbm:validFrom "2008-02-22T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-28T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-26"^^xsd:date . +dataFromVendor1:Offer1411 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product15 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "758.33"^^bsbm:USD ; + bsbm:validFrom "2008-02-17T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-04T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-14"^^xsd:date . +dataFromVendor1:Offer1412 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product23 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4870.04"^^bsbm:USD ; + bsbm:validFrom "2008-03-06T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-05T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-15"^^xsd:date . +dataFromVendor1:Offer1413 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product28 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3558.75"^^bsbm:USD ; + bsbm:validFrom "2008-05-29T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-08T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-14"^^xsd:date . +dataFromVendor1:Offer1414 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product64 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5535.23"^^bsbm:USD ; + bsbm:validFrom "2008-03-24T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-16T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-25"^^xsd:date . +dataFromVendor1:Offer1415 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product22 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2843.39"^^bsbm:USD ; + bsbm:validFrom "2008-02-04T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-05T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-20"^^xsd:date . +dataFromVendor1:Offer1416 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product60 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9528.06"^^bsbm:USD ; + bsbm:validFrom "2008-01-19T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-26T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-07"^^xsd:date . +dataFromVendor1:Offer1417 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product56 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9175.70"^^bsbm:USD ; + bsbm:validFrom "2008-01-08T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-01T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-23"^^xsd:date . +dataFromVendor1:Offer1418 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product43 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9183.78"^^bsbm:USD ; + bsbm:validFrom "2008-03-07T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-23T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-12"^^xsd:date . +dataFromVendor1:Offer1419 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product75 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7666.07"^^bsbm:USD ; + bsbm:validFrom "2008-04-10T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-26T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-12"^^xsd:date . +dataFromVendor1:Offer1420 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product51 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8551.83"^^bsbm:USD ; + bsbm:validFrom "2008-04-15T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-07T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-11"^^xsd:date . +dataFromVendor1:Offer1421 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product46 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6667.37"^^bsbm:USD ; + bsbm:validFrom "2008-05-04T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-13T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-31"^^xsd:date . +dataFromVendor1:Offer1422 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product26 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8322.65"^^bsbm:USD ; + bsbm:validFrom "2008-04-12T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-06T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-19"^^xsd:date . +dataFromVendor1:Offer1423 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product61 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5398.25"^^bsbm:USD ; + bsbm:validFrom "2008-01-13T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-27T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "6"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-07"^^xsd:date . +dataFromVendor1:Offer1424 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product64 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4766.07"^^bsbm:USD ; + bsbm:validFrom "2008-03-10T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-28T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "6"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-04"^^xsd:date . +dataFromVendor1:Offer1425 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product14 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7912.34"^^bsbm:USD ; + bsbm:validFrom "2008-01-16T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-21T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-03"^^xsd:date . +dataFromVendor1:Offer1426 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product79 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1984.79"^^bsbm:USD ; + bsbm:validFrom "2008-02-12T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-22T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-12"^^xsd:date . +dataFromVendor1:Offer1427 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product15 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7466.66"^^bsbm:USD ; + bsbm:validFrom "2008-04-26T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-29T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-05"^^xsd:date . +dataFromVendor1:Offer1428 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product40 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5366.83"^^bsbm:USD ; + bsbm:validFrom "2008-02-25T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-07T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "1"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-14"^^xsd:date . +dataFromVendor1:Offer1429 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product49 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8366.46"^^bsbm:USD ; + bsbm:validFrom "2008-04-08T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-01T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-15"^^xsd:date . +dataFromVendor1:Offer1430 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product45 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4227.63"^^bsbm:USD ; + bsbm:validFrom "2008-03-22T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-18T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-05"^^xsd:date . +dataFromVendor1:Offer1431 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product66 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2097.33"^^bsbm:USD ; + bsbm:validFrom "2008-05-27T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-09-09T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "1"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-11"^^xsd:date . +dataFromVendor1:Offer1432 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product65 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3296.06"^^bsbm:USD ; + bsbm:validFrom "2008-05-25T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-13T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "1"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-14"^^xsd:date . +dataFromVendor1:Offer1433 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product71 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "682.79"^^bsbm:USD ; + bsbm:validFrom "2008-05-18T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-22T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-25"^^xsd:date . +dataFromVendor1:Offer1434 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product36 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6029.09"^^bsbm:USD ; + bsbm:validFrom "2008-04-28T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-25T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "7"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-21"^^xsd:date . +dataFromVendor1:Offer1435 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product45 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3102.55"^^bsbm:USD ; + bsbm:validFrom "2008-05-23T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-11T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-01"^^xsd:date . +dataFromVendor1:Offer1436 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product45 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7476.58"^^bsbm:USD ; + bsbm:validFrom "2008-05-09T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-04T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-31"^^xsd:date . +dataFromVendor1:Offer1437 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product74 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9832.61"^^bsbm:USD ; + bsbm:validFrom "2008-02-07T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-30T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-06"^^xsd:date . +dataFromVendor1:Offer1438 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer3:Product100 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "821.92"^^bsbm:USD ; + bsbm:validFrom "2008-02-29T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-02T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-17"^^xsd:date . +dataFromVendor1:Offer1439 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product49 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6573.47"^^bsbm:USD ; + bsbm:validFrom "2008-04-02T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-04T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-06"^^xsd:date . +dataFromVendor1:Offer1440 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product59 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9659.07"^^bsbm:USD ; + bsbm:validFrom "2008-06-03T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-29T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-18"^^xsd:date . +dataFromVendor1:Offer1441 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product83 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "622.50"^^bsbm:USD ; + bsbm:validFrom "2008-02-14T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-12T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-27"^^xsd:date . +dataFromVendor1:Offer1442 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product58 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7644.55"^^bsbm:USD ; + bsbm:validFrom "2008-02-14T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-25T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-13"^^xsd:date . +dataFromVendor1:Offer1443 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product53 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2474.93"^^bsbm:USD ; + bsbm:validFrom "2008-02-25T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-11T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-31"^^xsd:date . +dataFromVendor1:Offer1444 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product87 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8016.05"^^bsbm:USD ; + bsbm:validFrom "2008-04-08T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-23T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-11"^^xsd:date . +dataFromVendor1:Offer1445 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product57 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "755.91"^^bsbm:USD ; + bsbm:validFrom "2008-02-23T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-26T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-08"^^xsd:date . +dataFromVendor1:Offer1446 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product19 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8395.57"^^bsbm:USD ; + bsbm:validFrom "2008-03-07T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-16T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-31"^^xsd:date . +dataFromVendor1:Offer1447 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product31 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "733.28"^^bsbm:USD ; + bsbm:validFrom "2008-03-23T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-01T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-14"^^xsd:date . +dataFromVendor1:Offer1448 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product54 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "222.08"^^bsbm:USD ; + bsbm:validFrom "2008-04-03T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-22T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-08"^^xsd:date . +dataFromVendor1:Offer1449 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product55 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5476.93"^^bsbm:USD ; + bsbm:validFrom "2008-03-22T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-19T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-02"^^xsd:date . +dataFromVendor1:Offer1450 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product44 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8032.72"^^bsbm:USD ; + bsbm:validFrom "2008-02-11T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-15T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-14"^^xsd:date . +dataFromVendor1:Offer1451 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product13 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3921.28"^^bsbm:USD ; + bsbm:validFrom "2008-05-03T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-03T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-28"^^xsd:date . +dataFromVendor1:Offer1452 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product58 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1187.66"^^bsbm:USD ; + bsbm:validFrom "2008-03-27T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-27T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "7"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-11"^^xsd:date . +dataFromVendor1:Offer1453 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product54 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1947.13"^^bsbm:USD ; + bsbm:validFrom "2008-04-09T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-19T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-13"^^xsd:date . +dataFromVendor1:Offer1454 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product91 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9265.86"^^bsbm:USD ; + bsbm:validFrom "2008-01-26T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-28T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-23"^^xsd:date . +dataFromVendor1:Offer1455 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product55 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1073.17"^^bsbm:USD ; + bsbm:validFrom "2008-04-17T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-28T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-14"^^xsd:date . +dataFromVendor1:Offer1456 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product51 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3183.48"^^bsbm:USD ; + bsbm:validFrom "2008-02-28T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-29T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-06"^^xsd:date . +dataFromVendor1:Offer1457 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product38 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4230.57"^^bsbm:USD ; + bsbm:validFrom "2008-05-26T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-22T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-06"^^xsd:date . +dataFromVendor1:Offer1458 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product15 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5637.51"^^bsbm:USD ; + bsbm:validFrom "2008-01-25T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-12T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-19"^^xsd:date . +dataFromVendor1:Offer1459 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product54 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9686.73"^^bsbm:USD ; + bsbm:validFrom "2008-03-27T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-11T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-10"^^xsd:date . +dataFromVendor1:Offer1460 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product66 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8485.07"^^bsbm:USD ; + bsbm:validFrom "2008-04-17T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-22T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-17"^^xsd:date . +dataFromVendor1:Offer1461 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product44 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2255.55"^^bsbm:USD ; + bsbm:validFrom "2008-02-08T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-23T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-11"^^xsd:date . +dataFromVendor1:Offer1462 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product46 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9427.72"^^bsbm:USD ; + bsbm:validFrom "2008-03-10T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-22T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-26"^^xsd:date . +dataFromVendor1:Offer1463 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product51 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5562.85"^^bsbm:USD ; + bsbm:validFrom "2008-01-21T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-21T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-29"^^xsd:date . +dataFromVendor1:Offer1464 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product31 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7297.00"^^bsbm:USD ; + bsbm:validFrom "2008-01-01T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-03T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-21"^^xsd:date . +dataFromVendor1:Offer1465 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product73 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "485.45"^^bsbm:USD ; + bsbm:validFrom "2008-03-02T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-25T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-12"^^xsd:date . +dataFromVendor1:Offer1466 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product74 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3384.38"^^bsbm:USD ; + bsbm:validFrom "2008-01-05T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-05T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-15"^^xsd:date . +dataFromVendor1:Offer1467 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product88 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2421.73"^^bsbm:USD ; + bsbm:validFrom "2008-05-29T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-29T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-04"^^xsd:date . +dataFromVendor1:Offer1468 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product65 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6099.15"^^bsbm:USD ; + bsbm:validFrom "2008-03-01T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-28T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-19"^^xsd:date . +dataFromVendor1:Offer1469 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product61 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4690.00"^^bsbm:USD ; + bsbm:validFrom "2008-02-13T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-12T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-22"^^xsd:date . +dataFromVendor1:Offer1470 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product30 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7628.40"^^bsbm:USD ; + bsbm:validFrom "2008-02-09T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-30T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-05"^^xsd:date . +dataFromVendor1:Offer1471 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product75 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6004.02"^^bsbm:USD ; + bsbm:validFrom "2008-02-11T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-05T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-24"^^xsd:date . +dataFromVendor1:Offer1472 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product38 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4161.66"^^bsbm:USD ; + bsbm:validFrom "2008-02-03T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-04T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-12"^^xsd:date . +dataFromVendor1:Offer1473 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product75 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7611.58"^^bsbm:USD ; + bsbm:validFrom "2008-02-09T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-06T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-01"^^xsd:date . +dataFromVendor1:Offer1474 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product50 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5807.23"^^bsbm:USD ; + bsbm:validFrom "2008-04-01T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-22T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-06"^^xsd:date . +dataFromVendor1:Offer1475 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product61 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9643.46"^^bsbm:USD ; + bsbm:validFrom "2007-12-28T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-07T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-25"^^xsd:date . +dataFromVendor1:Offer1476 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product69 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8378.74"^^bsbm:USD ; + bsbm:validFrom "2008-02-12T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-24T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-30"^^xsd:date . +dataFromVendor1:Offer1477 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product55 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6830.58"^^bsbm:USD ; + bsbm:validFrom "2008-02-26T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-22T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-03"^^xsd:date . +dataFromVendor1:Offer1478 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product85 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6803.66"^^bsbm:USD ; + bsbm:validFrom "2008-04-23T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-20T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "7"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-28"^^xsd:date . +dataFromVendor1:Offer1479 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product44 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "896.55"^^bsbm:USD ; + bsbm:validFrom "2008-04-27T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-28T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-05"^^xsd:date . +dataFromVendor1:Offer1480 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product64 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9155.22"^^bsbm:USD ; + bsbm:validFrom "2008-05-19T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-23T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "1"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-15"^^xsd:date . +dataFromVendor1:Offer1481 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product25 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "676.82"^^bsbm:USD ; + bsbm:validFrom "2008-04-14T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-25T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-14"^^xsd:date . +dataFromVendor1:Offer1482 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product39 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1065.86"^^bsbm:USD ; + bsbm:validFrom "2008-06-04T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-24T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-10"^^xsd:date . +dataFromVendor1:Offer1483 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product51 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1288.68"^^bsbm:USD ; + bsbm:validFrom "2008-03-21T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-18T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-05"^^xsd:date . +dataFromVendor1:Offer1484 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer3:Product95 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2498.68"^^bsbm:USD ; + bsbm:validFrom "2008-02-10T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-03T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-26"^^xsd:date . +dataFromVendor1:Offer1485 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product57 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "488.56"^^bsbm:USD ; + bsbm:validFrom "2008-01-22T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-10T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "7"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-19"^^xsd:date . +dataFromVendor1:Offer1486 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product37 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2908.18"^^bsbm:USD ; + bsbm:validFrom "2008-05-19T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-09-12T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-18"^^xsd:date . +dataFromVendor1:Offer1487 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product49 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3814.65"^^bsbm:USD ; + bsbm:validFrom "2008-03-28T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-16T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-04"^^xsd:date . +dataFromVendor1:Offer1488 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product32 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6038.57"^^bsbm:USD ; + bsbm:validFrom "2008-03-11T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-19T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "7"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-04"^^xsd:date . +dataFromVendor1:Offer1489 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product88 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "68.68"^^bsbm:USD ; + bsbm:validFrom "2008-04-26T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-19T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-02"^^xsd:date . +dataFromVendor1:Offer1490 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product42 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2816.13"^^bsbm:USD ; + bsbm:validFrom "2008-01-26T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-28T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "1"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-03"^^xsd:date . +dataFromVendor1:Offer1491 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product54 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5165.28"^^bsbm:USD ; + bsbm:validFrom "2008-04-01T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-25T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-16"^^xsd:date . +dataFromVendor1:Offer1492 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product54 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9197.49"^^bsbm:USD ; + bsbm:validFrom "2008-04-29T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-09T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-05"^^xsd:date . +dataFromVendor1:Offer1493 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product25 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5606.95"^^bsbm:USD ; + bsbm:validFrom "2008-04-25T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-26T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-28"^^xsd:date . +dataFromVendor1:Offer1494 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product5 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6112.48"^^bsbm:USD ; + bsbm:validFrom "2008-04-24T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-24T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-26"^^xsd:date . +dataFromVendor1:Offer1495 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer3:Product99 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2315.78"^^bsbm:USD ; + bsbm:validFrom "2008-03-02T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-02T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "1"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-31"^^xsd:date . +dataFromVendor1:Offer1496 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product21 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "138.70"^^bsbm:USD ; + bsbm:validFrom "2008-03-29T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-22T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-07"^^xsd:date . +dataFromVendor1:Offer1497 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product57 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1950.56"^^bsbm:USD ; + bsbm:validFrom "2008-05-19T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-30T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-30"^^xsd:date . +dataFromVendor1:Offer1498 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product69 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7005.57"^^bsbm:USD ; + bsbm:validFrom "2008-06-15T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-09T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-15"^^xsd:date . +dataFromVendor1:Offer1499 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product17 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5520.13"^^bsbm:USD ; + bsbm:validFrom "2008-02-04T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-28T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "6"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-19"^^xsd:date . +dataFromVendor1:Offer1500 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product27 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4717.42"^^bsbm:USD ; + bsbm:validFrom "2008-03-24T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-01T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-16"^^xsd:date . +dataFromVendor1:Offer1501 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product82 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3469.28"^^bsbm:USD ; + bsbm:validFrom "2008-02-24T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-09T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-08"^^xsd:date . +dataFromVendor1:Offer1502 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product75 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9409.06"^^bsbm:USD ; + bsbm:validFrom "2008-03-26T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-12T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-02"^^xsd:date . +dataFromVendor1:Offer1503 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product53 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2314.40"^^bsbm:USD ; + bsbm:validFrom "2008-03-30T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-13T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-24"^^xsd:date . +dataFromVendor1:Offer1504 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product43 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5197.61"^^bsbm:USD ; + bsbm:validFrom "2008-04-30T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-04T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "6"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-19"^^xsd:date . +dataFromVendor1:Offer1505 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product49 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "429.93"^^bsbm:USD ; + bsbm:validFrom "2008-05-09T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-31T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-16"^^xsd:date . +dataFromVendor1:Offer1506 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product51 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8521.88"^^bsbm:USD ; + bsbm:validFrom "2008-03-08T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-29T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-15"^^xsd:date . +dataFromVendor1:Offer1507 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product42 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9530.87"^^bsbm:USD ; + bsbm:validFrom "2008-03-24T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-13T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-02"^^xsd:date . +dataFromVendor1:Offer1508 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product35 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8794.16"^^bsbm:USD ; + bsbm:validFrom "2008-02-25T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-17T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-27"^^xsd:date . +dataFromVendor1:Offer1509 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product82 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4099.05"^^bsbm:USD ; + bsbm:validFrom "2008-01-12T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-02T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-02"^^xsd:date . +dataFromVendor1:Offer1510 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product77 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9575.09"^^bsbm:USD ; + bsbm:validFrom "2008-03-24T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-17T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "6"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-31"^^xsd:date . +dataFromVendor1:Offer1511 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer3:Product94 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2998.47"^^bsbm:USD ; + bsbm:validFrom "2008-02-23T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-29T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-17"^^xsd:date . +dataFromVendor1:Offer1512 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product49 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8864.73"^^bsbm:USD ; + bsbm:validFrom "2008-04-02T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-20T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "7"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-13"^^xsd:date . +dataFromVendor1:Offer1513 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product77 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6485.92"^^bsbm:USD ; + bsbm:validFrom "2008-06-05T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-26T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-18"^^xsd:date . +dataFromVendor1:Offer1514 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product11 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2731.75"^^bsbm:USD ; + bsbm:validFrom "2008-03-16T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-17T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-04"^^xsd:date . +dataFromVendor1:Offer1515 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product61 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6858.83"^^bsbm:USD ; + bsbm:validFrom "2008-04-13T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-27T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-22"^^xsd:date . +dataFromVendor1:Offer1516 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product7 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3863.79"^^bsbm:USD ; + bsbm:validFrom "2008-03-25T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-21T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-02"^^xsd:date . +dataFromVendor1:Offer1517 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product56 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2972.33"^^bsbm:USD ; + bsbm:validFrom "2008-05-10T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-11T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-01"^^xsd:date . +dataFromVendor1:Offer1518 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product47 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5529.27"^^bsbm:USD ; + bsbm:validFrom "2007-12-25T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-08T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-22"^^xsd:date . +dataFromVendor1:Offer1519 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product26 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7235.89"^^bsbm:USD ; + bsbm:validFrom "2008-04-08T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-09T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-24"^^xsd:date . +dataFromVendor1:Offer1520 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product59 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1790.34"^^bsbm:USD ; + bsbm:validFrom "2008-03-31T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-11T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-06"^^xsd:date . +dataFromVendor1:Offer1521 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product34 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8683.84"^^bsbm:USD ; + bsbm:validFrom "2008-05-19T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-11T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "6"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-27"^^xsd:date . +dataFromVendor1:Offer1522 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product1 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6892.58"^^bsbm:USD ; + bsbm:validFrom "2008-03-10T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-26T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "1"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-07"^^xsd:date . +dataFromVendor1:Offer1523 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product32 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7170.93"^^bsbm:USD ; + bsbm:validFrom "2008-03-02T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-11T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-14"^^xsd:date . +dataFromVendor1:Offer1524 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product69 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "329.59"^^bsbm:USD ; + bsbm:validFrom "2008-06-05T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-01T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-10"^^xsd:date . +dataFromVendor1:Offer1525 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product17 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1956.15"^^bsbm:USD ; + bsbm:validFrom "2008-03-04T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-25T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-30"^^xsd:date . +dataFromVendor1:Offer1526 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product34 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9065.28"^^bsbm:USD ; + bsbm:validFrom "2008-06-08T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-09-03T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-12"^^xsd:date . +dataFromVendor1:Offer1527 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product73 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2503.54"^^bsbm:USD ; + bsbm:validFrom "2008-05-03T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-24T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "6"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-16"^^xsd:date . +dataFromVendor1:Offer1528 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product84 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5352.49"^^bsbm:USD ; + bsbm:validFrom "2008-03-29T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-24T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "1"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-08"^^xsd:date . +dataFromVendor1:Offer1529 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product13 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "614.21"^^bsbm:USD ; + bsbm:validFrom "2008-05-11T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-10T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-15"^^xsd:date . +dataFromVendor1:Offer1530 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product58 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6484.55"^^bsbm:USD ; + bsbm:validFrom "2008-03-08T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-12T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-14"^^xsd:date . +dataFromVendor1:Offer1531 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product35 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "707.74"^^bsbm:USD ; + bsbm:validFrom "2008-02-08T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-06T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "1"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-04"^^xsd:date . +dataFromVendor1:Offer1532 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product28 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3010.92"^^bsbm:USD ; + bsbm:validFrom "2008-03-28T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-09T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-22"^^xsd:date . +dataFromVendor1:Offer1533 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product64 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9514.92"^^bsbm:USD ; + bsbm:validFrom "2008-02-14T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-11T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-05"^^xsd:date . +dataFromVendor1:Offer1534 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product63 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2994.37"^^bsbm:USD ; + bsbm:validFrom "2008-04-12T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-07T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-18"^^xsd:date . +dataFromVendor1:Offer1535 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product41 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7291.36"^^bsbm:USD ; + bsbm:validFrom "2008-03-01T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-03T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-22"^^xsd:date . +dataFromVendor1:Offer1536 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product70 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3064.89"^^bsbm:USD ; + bsbm:validFrom "2008-03-03T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-27T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-20"^^xsd:date . +dataFromVendor1:Offer1537 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product66 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "93.60"^^bsbm:USD ; + bsbm:validFrom "2008-03-29T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-17T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "6"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-09"^^xsd:date . +dataFromVendor1:Offer1538 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product58 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1375.58"^^bsbm:USD ; + bsbm:validFrom "2008-01-26T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-06T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-21"^^xsd:date . +dataFromVendor1:Offer1539 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product55 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6815.43"^^bsbm:USD ; + bsbm:validFrom "2008-03-09T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-03-29T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-18"^^xsd:date . +dataFromVendor1:Offer1540 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product44 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3712.02"^^bsbm:USD ; + bsbm:validFrom "2008-04-02T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-18T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-13"^^xsd:date . +dataFromVendor1:Offer1541 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product38 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5192.66"^^bsbm:USD ; + bsbm:validFrom "2008-04-14T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-29T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-05"^^xsd:date . +dataFromVendor1:Offer1542 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product48 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1619.56"^^bsbm:USD ; + bsbm:validFrom "2008-04-17T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-29T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-16"^^xsd:date . +dataFromVendor1:Offer1543 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product69 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8069.03"^^bsbm:USD ; + bsbm:validFrom "2008-04-19T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-17T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-22"^^xsd:date . +dataFromVendor1:Offer1544 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product58 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "553.32"^^bsbm:USD ; + bsbm:validFrom "2008-03-05T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-03T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-28"^^xsd:date . +dataFromVendor1:Offer1545 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product37 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5155.02"^^bsbm:USD ; + bsbm:validFrom "2008-02-23T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-19T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-10"^^xsd:date . +dataFromVendor1:Offer1546 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product19 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6891.69"^^bsbm:USD ; + bsbm:validFrom "2008-04-01T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-01T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-18"^^xsd:date . +dataFromVendor1:Offer1547 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product82 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5544.05"^^bsbm:USD ; + bsbm:validFrom "2008-03-05T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-07T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-10"^^xsd:date . +dataFromVendor1:Offer1548 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product48 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4907.90"^^bsbm:USD ; + bsbm:validFrom "2008-05-03T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-03T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-11"^^xsd:date . +dataFromVendor1:Offer1549 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product15 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3303.36"^^bsbm:USD ; + bsbm:validFrom "2008-04-02T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-24T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-03"^^xsd:date . +dataFromVendor1:Offer1550 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product71 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8643.96"^^bsbm:USD ; + bsbm:validFrom "2008-05-08T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-06T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "1"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-19"^^xsd:date . +dataFromVendor1:Offer1551 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product72 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1707.67"^^bsbm:USD ; + bsbm:validFrom "2008-04-07T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-06T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "6"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-26"^^xsd:date . +dataFromVendor1:Offer1552 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product71 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9203.07"^^bsbm:USD ; + bsbm:validFrom "2008-04-26T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-22T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-08"^^xsd:date . +dataFromVendor1:Offer1553 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product73 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1770.15"^^bsbm:USD ; + bsbm:validFrom "2008-03-25T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-20T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-06"^^xsd:date . +dataFromVendor1:Offer1554 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product28 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4795.15"^^bsbm:USD ; + bsbm:validFrom "2008-02-17T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-17T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-17"^^xsd:date . +dataFromVendor1:Offer1555 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product15 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7184.55"^^bsbm:USD ; + bsbm:validFrom "2008-01-15T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-08T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-10"^^xsd:date . +dataFromVendor1:Offer1556 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product48 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9580.14"^^bsbm:USD ; + bsbm:validFrom "2008-01-04T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-01T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-20"^^xsd:date . +dataFromVendor1:Offer1557 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product76 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "937.03"^^bsbm:USD ; + bsbm:validFrom "2008-01-04T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-28T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-17"^^xsd:date . +dataFromVendor1:Offer1558 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product41 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7445.71"^^bsbm:USD ; + bsbm:validFrom "2008-03-28T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-09-01T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-03"^^xsd:date . +dataFromVendor1:Offer1559 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product19 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8424.09"^^bsbm:USD ; + bsbm:validFrom "2008-01-12T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-27T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-29"^^xsd:date . +dataFromVendor1:Offer1560 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product77 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8449.78"^^bsbm:USD ; + bsbm:validFrom "2008-03-14T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-24T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-15"^^xsd:date . +dataFromVendor1:Offer1561 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product25 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8311.07"^^bsbm:USD ; + bsbm:validFrom "2008-04-18T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-06T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-01"^^xsd:date . +dataFromVendor1:Offer1562 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product47 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9088.08"^^bsbm:USD ; + bsbm:validFrom "2008-01-26T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-19T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-24"^^xsd:date . +dataFromVendor1:Offer1563 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product35 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4872.14"^^bsbm:USD ; + bsbm:validFrom "2008-02-03T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-04T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-14"^^xsd:date . +dataFromVendor1:Offer1564 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product7 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2189.75"^^bsbm:USD ; + bsbm:validFrom "2008-06-06T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-26T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "1"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-12"^^xsd:date . +dataFromVendor1:Offer1565 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product80 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5183.93"^^bsbm:USD ; + bsbm:validFrom "2008-05-18T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-14T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-03"^^xsd:date . +dataFromVendor1:Offer1566 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product32 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8707.08"^^bsbm:USD ; + bsbm:validFrom "2008-03-21T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-22T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-29"^^xsd:date . +dataFromVendor1:Offer1567 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product48 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "275.14"^^bsbm:USD ; + bsbm:validFrom "2008-01-30T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-03T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-15"^^xsd:date . +dataFromVendor1:Offer1568 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product35 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1656.36"^^bsbm:USD ; + bsbm:validFrom "2008-02-23T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-16T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-18"^^xsd:date . +dataFromVendor1:Offer1569 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer3:Product95 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1828.91"^^bsbm:USD ; + bsbm:validFrom "2008-01-26T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-27T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "1"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-28"^^xsd:date . +dataFromVendor1:Offer1570 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product11 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1763.85"^^bsbm:USD ; + bsbm:validFrom "2008-01-22T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-11T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-12"^^xsd:date . +dataFromVendor1:Offer1571 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product51 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5158.48"^^bsbm:USD ; + bsbm:validFrom "2008-02-12T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-12T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-16"^^xsd:date . +dataFromVendor1:Offer1572 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product10 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5744.96"^^bsbm:USD ; + bsbm:validFrom "2008-01-14T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-22T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-01"^^xsd:date . +dataFromVendor1:Offer1573 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product26 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4644.51"^^bsbm:USD ; + bsbm:validFrom "2008-02-09T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-12T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-01"^^xsd:date . +dataFromVendor1:Offer1574 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product48 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "475.12"^^bsbm:USD ; + bsbm:validFrom "2008-05-06T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-06T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-07"^^xsd:date . +dataFromVendor1:Offer1575 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product56 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "74.60"^^bsbm:USD ; + bsbm:validFrom "2008-05-01T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-20T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "1"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-14"^^xsd:date . +dataFromVendor1:Offer1576 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product24 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "658.40"^^bsbm:USD ; + bsbm:validFrom "2008-01-27T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-25T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-30"^^xsd:date . +dataFromVendor1:Offer1577 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product79 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1011.89"^^bsbm:USD ; + bsbm:validFrom "2008-04-19T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-28T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-20"^^xsd:date . +dataFromVendor1:Offer1578 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product30 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3373.96"^^bsbm:USD ; + bsbm:validFrom "2008-04-04T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-28T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-14"^^xsd:date . +dataFromVendor1:Offer1579 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product73 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1620.13"^^bsbm:USD ; + bsbm:validFrom "2008-01-23T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-01T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-13"^^xsd:date . +dataFromVendor1:Offer1580 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product50 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "71.13"^^bsbm:USD ; + bsbm:validFrom "2008-03-02T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-16T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-17"^^xsd:date . +dataFromVendor1:Offer1581 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product22 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "167.46"^^bsbm:USD ; + bsbm:validFrom "2008-04-15T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-20T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-10"^^xsd:date . +dataFromVendor1:Offer1582 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product88 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5551.47"^^bsbm:USD ; + bsbm:validFrom "2008-03-01T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-16T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-27"^^xsd:date . +dataFromVendor1:Offer1583 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product49 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5905.10"^^bsbm:USD ; + bsbm:validFrom "2008-04-07T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-13T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-23"^^xsd:date . +dataFromVendor1:Offer1584 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product11 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3945.51"^^bsbm:USD ; + bsbm:validFrom "2008-02-07T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-12T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-03"^^xsd:date . +dataFromVendor1:Offer1585 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product43 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "975.35"^^bsbm:USD ; + bsbm:validFrom "2008-04-14T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-21T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-10"^^xsd:date . +dataFromVendor1:Offer1586 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product43 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3547.66"^^bsbm:USD ; + bsbm:validFrom "2008-03-28T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-16T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "1"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-18"^^xsd:date . +dataFromVendor1:Offer1587 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product42 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6445.88"^^bsbm:USD ; + bsbm:validFrom "2008-02-26T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-27T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-26"^^xsd:date . +dataFromVendor1:Offer1588 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product42 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6130.43"^^bsbm:USD ; + bsbm:validFrom "2008-04-27T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-24T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-29"^^xsd:date . +dataFromVendor1:Offer1589 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product42 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9858.57"^^bsbm:USD ; + bsbm:validFrom "2008-03-30T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-01T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-17"^^xsd:date . +dataFromVendor1:Offer1590 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product21 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1333.82"^^bsbm:USD ; + bsbm:validFrom "2008-04-29T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-13T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-30"^^xsd:date . +dataFromVendor1:Offer1591 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product44 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6092.64"^^bsbm:USD ; + bsbm:validFrom "2008-03-21T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-29T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-12"^^xsd:date . +dataFromVendor1:Offer1592 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product86 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3461.26"^^bsbm:USD ; + bsbm:validFrom "2008-03-03T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-01T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-04"^^xsd:date . +dataFromVendor1:Offer1593 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product45 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4761.19"^^bsbm:USD ; + bsbm:validFrom "2008-02-28T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-07T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-14"^^xsd:date . +dataFromVendor1:Offer1594 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product32 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6337.02"^^bsbm:USD ; + bsbm:validFrom "2008-04-17T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-29T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "1"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-01"^^xsd:date . +dataFromVendor1:Offer1595 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product54 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5070.28"^^bsbm:USD ; + bsbm:validFrom "2008-02-24T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-03T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-28"^^xsd:date . +dataFromVendor1:Offer1596 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product18 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1558.84"^^bsbm:USD ; + bsbm:validFrom "2008-02-14T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-10T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-19"^^xsd:date . +dataFromVendor1:Offer1597 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product46 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3382.64"^^bsbm:USD ; + bsbm:validFrom "2008-03-31T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-07T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-22"^^xsd:date . +dataFromVendor1:Offer1598 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product60 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6956.44"^^bsbm:USD ; + bsbm:validFrom "2008-03-19T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-24T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-05"^^xsd:date . +dataFromVendor1:Offer1599 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product53 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9681.16"^^bsbm:USD ; + bsbm:validFrom "2008-04-30T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-28T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-07"^^xsd:date . +dataFromVendor1:Offer1600 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product67 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5029.00"^^bsbm:USD ; + bsbm:validFrom "2008-05-08T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-05T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-07"^^xsd:date . +dataFromVendor1:Offer1601 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product15 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6619.22"^^bsbm:USD ; + bsbm:validFrom "2008-02-01T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-10T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-28"^^xsd:date . +dataFromVendor1:Offer1602 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product34 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5479.86"^^bsbm:USD ; + bsbm:validFrom "2008-02-02T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-05T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "1"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-09"^^xsd:date . +dataFromVendor1:Offer1603 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product57 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8766.12"^^bsbm:USD ; + bsbm:validFrom "2008-05-21T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-14T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-11"^^xsd:date . +dataFromVendor1:Offer1604 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product62 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2252.76"^^bsbm:USD ; + bsbm:validFrom "2008-04-29T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-06T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-12"^^xsd:date . +dataFromVendor1:Offer1605 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product70 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "441.16"^^bsbm:USD ; + bsbm:validFrom "2008-04-30T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-06T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-14"^^xsd:date . +dataFromVendor1:Offer1606 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product48 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2897.35"^^bsbm:USD ; + bsbm:validFrom "2008-02-12T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-04T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-08"^^xsd:date . +dataFromVendor1:Offer1607 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product34 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7449.65"^^bsbm:USD ; + bsbm:validFrom "2008-03-13T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-13T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "6"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-18"^^xsd:date . +dataFromVendor1:Offer1608 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product72 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7431.26"^^bsbm:USD ; + bsbm:validFrom "2008-02-26T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-20T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-25"^^xsd:date . +dataFromVendor1:Offer1609 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product66 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2033.00"^^bsbm:USD ; + bsbm:validFrom "2008-01-28T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-18T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-25"^^xsd:date . +dataFromVendor1:Offer1610 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product32 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4523.05"^^bsbm:USD ; + bsbm:validFrom "2008-02-28T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-18T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-15"^^xsd:date . +dataFromVendor1:Offer1611 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product48 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "298.09"^^bsbm:USD ; + bsbm:validFrom "2008-04-08T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-29T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-27"^^xsd:date . +dataFromVendor1:Offer1612 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product67 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5158.03"^^bsbm:USD ; + bsbm:validFrom "2008-04-25T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-16T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-25"^^xsd:date . +dataFromVendor1:Offer1613 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product8 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8588.13"^^bsbm:USD ; + bsbm:validFrom "2008-04-21T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-19T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-07"^^xsd:date . +dataFromVendor1:Offer1614 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product55 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7889.62"^^bsbm:USD ; + bsbm:validFrom "2008-03-22T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-08T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "1"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-25"^^xsd:date . +dataFromVendor1:Offer1615 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product72 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8399.32"^^bsbm:USD ; + bsbm:validFrom "2008-04-24T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-27T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-09"^^xsd:date . +dataFromVendor1:Offer1616 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product61 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5110.15"^^bsbm:USD ; + bsbm:validFrom "2008-02-08T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-02T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "6"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-26"^^xsd:date . +dataFromVendor1:Offer1617 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product33 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9497.58"^^bsbm:USD ; + bsbm:validFrom "2008-04-04T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-20T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "1"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-13"^^xsd:date . +dataFromVendor1:Offer1618 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product80 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6843.67"^^bsbm:USD ; + bsbm:validFrom "2008-01-21T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-03-30T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-15"^^xsd:date . +dataFromVendor1:Offer1619 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product30 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7520.30"^^bsbm:USD ; + bsbm:validFrom "2008-02-25T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-10T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-24"^^xsd:date . +dataFromVendor1:Offer1620 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product47 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7153.53"^^bsbm:USD ; + bsbm:validFrom "2008-04-12T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-10T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-06"^^xsd:date . +dataFromVendor1:Offer1621 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product3 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5281.61"^^bsbm:USD ; + bsbm:validFrom "2008-03-15T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-25T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-10"^^xsd:date . +dataFromVendor1:Offer1622 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product46 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8289.29"^^bsbm:USD ; + bsbm:validFrom "2008-04-15T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-09-05T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-15"^^xsd:date . +dataFromVendor1:Offer1623 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product74 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6783.36"^^bsbm:USD ; + bsbm:validFrom "2008-04-04T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-05T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-07"^^xsd:date . +dataFromVendor1:Offer1624 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product35 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9491.16"^^bsbm:USD ; + bsbm:validFrom "2008-04-06T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-18T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-08"^^xsd:date . +dataFromVendor1:Offer1625 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product90 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9096.62"^^bsbm:USD ; + bsbm:validFrom "2008-05-09T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-07T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-26"^^xsd:date . +dataFromVendor1:Offer1626 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product40 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "555.53"^^bsbm:USD ; + bsbm:validFrom "2008-01-19T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-16T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-02"^^xsd:date . +dataFromVendor1:Offer1627 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product68 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "70.16"^^bsbm:USD ; + bsbm:validFrom "2008-04-08T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-16T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-13"^^xsd:date . +dataFromVendor1:Offer1628 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product23 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5077.17"^^bsbm:USD ; + bsbm:validFrom "2008-02-22T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-11T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-30"^^xsd:date . +dataFromVendor1:Offer1629 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product80 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9148.38"^^bsbm:USD ; + bsbm:validFrom "2008-05-05T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-14T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "1"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-09"^^xsd:date . +dataFromVendor1:Offer1630 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product69 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4767.39"^^bsbm:USD ; + bsbm:validFrom "2008-05-08T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-29T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-23"^^xsd:date . +dataFromVendor1:Offer1631 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product62 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4616.72"^^bsbm:USD ; + bsbm:validFrom "2008-03-06T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-15T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-07"^^xsd:date . +dataFromVendor1:Offer1632 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product65 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3973.09"^^bsbm:USD ; + bsbm:validFrom "2008-06-02T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-26T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-08"^^xsd:date . +dataFromVendor1:Offer1633 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product61 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2776.59"^^bsbm:USD ; + bsbm:validFrom "2008-03-11T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-13T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-15"^^xsd:date . +dataFromVendor1:Offer1634 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product57 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3268.63"^^bsbm:USD ; + bsbm:validFrom "2008-03-23T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-07T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-24"^^xsd:date . +dataFromVendor1:Offer1635 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product39 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3960.96"^^bsbm:USD ; + bsbm:validFrom "2008-02-15T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-29T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-30"^^xsd:date . +dataFromVendor1:Offer1636 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product51 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1881.53"^^bsbm:USD ; + bsbm:validFrom "2008-05-05T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-08T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "6"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-01"^^xsd:date . +dataFromVendor1:Offer1637 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product31 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5579.38"^^bsbm:USD ; + bsbm:validFrom "2008-02-25T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-29T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-13"^^xsd:date . +dataFromVendor1:Offer1638 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product27 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1413.60"^^bsbm:USD ; + bsbm:validFrom "2008-03-10T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-09T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-29"^^xsd:date . +dataFromVendor1:Offer1639 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product46 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4708.48"^^bsbm:USD ; + bsbm:validFrom "2008-03-19T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-01T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-10"^^xsd:date . +dataFromVendor1:Offer1640 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product93 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7496.35"^^bsbm:USD ; + bsbm:validFrom "2008-01-11T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-11T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-22"^^xsd:date . +dataFromVendor1:Offer1641 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product12 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1415.21"^^bsbm:USD ; + bsbm:validFrom "2008-03-26T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-19T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-26"^^xsd:date . +dataFromVendor1:Offer1642 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product20 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1783.86"^^bsbm:USD ; + bsbm:validFrom "2008-04-08T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-14T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-07"^^xsd:date . +dataFromVendor1:Offer1643 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product79 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9285.84"^^bsbm:USD ; + bsbm:validFrom "2008-03-30T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-09T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-08"^^xsd:date . +dataFromVendor1:Offer1644 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product67 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3926.80"^^bsbm:USD ; + bsbm:validFrom "2008-02-12T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-30T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-10"^^xsd:date . +dataFromVendor1:Offer1645 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product72 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1518.23"^^bsbm:USD ; + bsbm:validFrom "2008-02-26T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-08T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-22"^^xsd:date . +dataFromVendor1:Offer1646 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product25 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2219.06"^^bsbm:USD ; + bsbm:validFrom "2008-03-20T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-23T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-20"^^xsd:date . +dataFromVendor1:Offer1647 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product58 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9199.24"^^bsbm:USD ; + bsbm:validFrom "2008-02-25T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-03T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-16"^^xsd:date . +dataFromVendor1:Offer1648 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product45 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1812.38"^^bsbm:USD ; + bsbm:validFrom "2008-03-10T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-02T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-20"^^xsd:date . +dataFromVendor1:Offer1649 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product33 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3652.02"^^bsbm:USD ; + bsbm:validFrom "2008-05-25T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-28T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-08"^^xsd:date . +dataFromVendor1:Offer1650 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product30 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1615.72"^^bsbm:USD ; + bsbm:validFrom "2008-04-06T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-08T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-14"^^xsd:date . +dataFromVendor1:Offer1651 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product67 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5865.56"^^bsbm:USD ; + bsbm:validFrom "2008-02-07T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-25T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-27"^^xsd:date . +dataFromVendor1:Offer1652 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product55 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4413.41"^^bsbm:USD ; + bsbm:validFrom "2008-03-27T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-19T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-01"^^xsd:date . +dataFromVendor1:Offer1653 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product66 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4545.51"^^bsbm:USD ; + bsbm:validFrom "2008-05-15T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-06T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "1"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-19"^^xsd:date . +dataFromVendor1:Offer1654 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product89 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9940.70"^^bsbm:USD ; + bsbm:validFrom "2008-05-31T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-04T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-15"^^xsd:date . +dataFromVendor1:Offer1655 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product64 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8611.12"^^bsbm:USD ; + bsbm:validFrom "2008-05-13T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-12T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-19"^^xsd:date . +dataFromVendor1:Offer1656 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product15 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7311.43"^^bsbm:USD ; + bsbm:validFrom "2008-04-07T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-29T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-26"^^xsd:date . +dataFromVendor1:Offer1657 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product15 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1463.22"^^bsbm:USD ; + bsbm:validFrom "2008-03-14T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-26T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-16"^^xsd:date . +dataFromVendor1:Offer1658 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product65 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1435.33"^^bsbm:USD ; + bsbm:validFrom "2008-02-15T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-01T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-08"^^xsd:date . +dataFromVendor1:Offer1659 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product50 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1912.55"^^bsbm:USD ; + bsbm:validFrom "2008-04-29T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-19T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-06"^^xsd:date . +dataFromVendor1:Offer1660 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product82 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7926.98"^^bsbm:USD ; + bsbm:validFrom "2008-03-17T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-15T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "1"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-13"^^xsd:date . +dataFromVendor1:Offer1661 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product21 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1221.21"^^bsbm:USD ; + bsbm:validFrom "2008-02-16T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-24T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-31"^^xsd:date . +dataFromVendor1:Offer1662 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product69 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2359.83"^^bsbm:USD ; + bsbm:validFrom "2008-03-15T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-29T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-30"^^xsd:date . +dataFromVendor1:Offer1663 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product53 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6387.77"^^bsbm:USD ; + bsbm:validFrom "2008-01-25T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-15T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-29"^^xsd:date . +dataFromVendor1:Offer1664 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product12 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2561.45"^^bsbm:USD ; + bsbm:validFrom "2008-01-13T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-03-31T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-18"^^xsd:date . +dataFromVendor1:Offer1665 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product22 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7483.54"^^bsbm:USD ; + bsbm:validFrom "2008-05-02T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-08T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "6"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-05"^^xsd:date . +dataFromVendor1:Offer1666 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product59 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7376.27"^^bsbm:USD ; + bsbm:validFrom "2008-01-04T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-20T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-21"^^xsd:date . +dataFromVendor1:Offer1667 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product24 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "723.78"^^bsbm:USD ; + bsbm:validFrom "2008-03-15T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-28T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-06"^^xsd:date . +dataFromVendor1:Offer1668 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product39 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1142.96"^^bsbm:USD ; + bsbm:validFrom "2008-04-30T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-09T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "6"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-20"^^xsd:date . +dataFromVendor1:Offer1669 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product85 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9647.83"^^bsbm:USD ; + bsbm:validFrom "2008-03-27T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-27T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-02"^^xsd:date . +dataFromVendor1:Offer1670 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product76 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "877.24"^^bsbm:USD ; + bsbm:validFrom "2008-03-23T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-08T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "8"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-29"^^xsd:date . +dataFromVendor1:Offer1671 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product21 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3961.96"^^bsbm:USD ; + bsbm:validFrom "2008-05-13T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-03T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-22"^^xsd:date . +dataFromVendor1:Offer1672 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product46 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2400.44"^^bsbm:USD ; + bsbm:validFrom "2008-05-24T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-11T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "1"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-13"^^xsd:date . +dataFromVendor1:Offer1673 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product20 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9122.51"^^bsbm:USD ; + bsbm:validFrom "2008-03-12T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-16T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-08"^^xsd:date . +dataFromVendor1:Offer1674 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product70 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2245.93"^^bsbm:USD ; + bsbm:validFrom "2008-03-17T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-28T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-02"^^xsd:date . +dataFromVendor1:Offer1675 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product87 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "369.94"^^bsbm:USD ; + bsbm:validFrom "2008-03-25T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-14T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-06"^^xsd:date . +dataFromVendor1:Offer1676 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product66 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4623.53"^^bsbm:USD ; + bsbm:validFrom "2008-03-23T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-15T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-11"^^xsd:date . +dataFromVendor1:Offer1677 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product67 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1356.69"^^bsbm:USD ; + bsbm:validFrom "2008-01-16T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-12T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-28"^^xsd:date . +dataFromVendor1:Offer1678 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product15 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6557.47"^^bsbm:USD ; + bsbm:validFrom "2008-03-12T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-13T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-27"^^xsd:date . +dataFromVendor1:Offer1679 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product90 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1323.26"^^bsbm:USD ; + bsbm:validFrom "2008-02-11T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-18T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-11"^^xsd:date . +dataFromVendor1:Offer1680 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product82 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9724.76"^^bsbm:USD ; + bsbm:validFrom "2008-02-27T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-09T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-08"^^xsd:date . +dataFromVendor1:Offer1681 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product29 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4397.70"^^bsbm:USD ; + bsbm:validFrom "2008-04-02T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-19T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "1"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-18"^^xsd:date . +dataFromVendor1:Offer1682 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product52 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4574.56"^^bsbm:USD ; + bsbm:validFrom "2008-04-04T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-30T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-18"^^xsd:date . +dataFromVendor1:Offer1683 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product65 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1388.45"^^bsbm:USD ; + bsbm:validFrom "2008-04-22T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-12T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-22"^^xsd:date . +dataFromVendor1:Offer1684 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product31 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "809.26"^^bsbm:USD ; + bsbm:validFrom "2008-03-02T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-13T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-20"^^xsd:date . +dataFromVendor1:Offer1685 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product37 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7359.92"^^bsbm:USD ; + bsbm:validFrom "2008-05-05T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-15T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-21"^^xsd:date . +dataFromVendor1:Offer1686 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product40 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8519.72"^^bsbm:USD ; + bsbm:validFrom "2008-01-08T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-24T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-03"^^xsd:date . +dataFromVendor1:Offer1687 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product56 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8088.20"^^bsbm:USD ; + bsbm:validFrom "2008-05-28T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-19T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-16"^^xsd:date . +dataFromVendor1:Offer1688 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product35 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5890.97"^^bsbm:USD ; + bsbm:validFrom "2008-04-30T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-06T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-17"^^xsd:date . +dataFromVendor1:Offer1689 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product5 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4542.29"^^bsbm:USD ; + bsbm:validFrom "2008-06-14T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-28T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-16"^^xsd:date . +dataFromVendor1:Offer1690 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product71 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2609.84"^^bsbm:USD ; + bsbm:validFrom "2008-03-24T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-29T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "7"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-15"^^xsd:date . +dataFromVendor1:Offer1691 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product67 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7487.73"^^bsbm:USD ; + bsbm:validFrom "2008-03-05T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-06T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-28"^^xsd:date . +dataFromVendor1:Offer1692 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product17 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3073.00"^^bsbm:USD ; + bsbm:validFrom "2008-05-03T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-11T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-05"^^xsd:date . +dataFromVendor1:Offer1693 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product42 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3570.64"^^bsbm:USD ; + bsbm:validFrom "2008-03-01T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-24T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-05"^^xsd:date . +dataFromVendor1:Offer1694 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product33 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9702.79"^^bsbm:USD ; + bsbm:validFrom "2008-02-23T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-12T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "1"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-22"^^xsd:date . +dataFromVendor1:Offer1695 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product73 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "105.56"^^bsbm:USD ; + bsbm:validFrom "2008-02-28T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-11T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-18"^^xsd:date . +dataFromVendor1:Offer1696 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product70 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4718.69"^^bsbm:USD ; + bsbm:validFrom "2008-03-10T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-23T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-03"^^xsd:date . +dataFromVendor1:Offer1697 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product47 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8384.74"^^bsbm:USD ; + bsbm:validFrom "2008-03-28T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-30T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-06"^^xsd:date . +dataFromVendor1:Offer1698 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product66 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8134.22"^^bsbm:USD ; + bsbm:validFrom "2008-04-18T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-12T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-08"^^xsd:date . +dataFromVendor1:Offer1699 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer3:Product94 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4270.33"^^bsbm:USD ; + bsbm:validFrom "2008-05-28T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-09-04T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-11"^^xsd:date . +dataFromVendor1:Offer1700 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product11 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "968.52"^^bsbm:USD ; + bsbm:validFrom "2008-03-11T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-03T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-15"^^xsd:date . +dataFromVendor1:Offer1701 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product57 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "378.81"^^bsbm:USD ; + bsbm:validFrom "2008-01-23T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-07T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-08"^^xsd:date . +dataFromVendor1:Offer1702 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product38 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5036.79"^^bsbm:USD ; + bsbm:validFrom "2008-03-01T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-18T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-28"^^xsd:date . +dataFromVendor1:Offer1703 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product89 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6504.21"^^bsbm:USD ; + bsbm:validFrom "2008-03-29T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-26T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-27"^^xsd:date . +dataFromVendor1:Offer1704 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product35 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5176.88"^^bsbm:USD ; + bsbm:validFrom "2008-02-17T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-18T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-20"^^xsd:date . +dataFromVendor1:Offer1705 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product42 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3472.73"^^bsbm:USD ; + bsbm:validFrom "2008-03-09T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-01T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-12"^^xsd:date . +dataFromVendor1:Offer1706 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product27 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5217.68"^^bsbm:USD ; + bsbm:validFrom "2008-02-23T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-27T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "1"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-26"^^xsd:date . +dataFromVendor1:Offer1707 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product54 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "932.32"^^bsbm:USD ; + bsbm:validFrom "2008-02-27T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-21T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-14"^^xsd:date . +dataFromVendor1:Offer1708 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product7 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6561.39"^^bsbm:USD ; + bsbm:validFrom "2008-04-15T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-04T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-26"^^xsd:date . +dataFromVendor1:Offer1709 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product68 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1550.27"^^bsbm:USD ; + bsbm:validFrom "2008-03-31T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-19T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-16"^^xsd:date . +dataFromVendor1:Offer1710 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product55 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6973.81"^^bsbm:USD ; + bsbm:validFrom "2008-03-13T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-04T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-28"^^xsd:date . +dataFromVendor1:Offer1711 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product19 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2345.95"^^bsbm:USD ; + bsbm:validFrom "2008-02-29T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-23T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-24"^^xsd:date . +dataFromVendor1:Offer1712 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product53 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7671.22"^^bsbm:USD ; + bsbm:validFrom "2008-05-23T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-13T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "1"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-01"^^xsd:date . +dataFromVendor1:Offer1713 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product45 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8934.13"^^bsbm:USD ; + bsbm:validFrom "2008-05-11T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-23T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-20"^^xsd:date . +dataFromVendor1:Offer1714 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product25 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8798.35"^^bsbm:USD ; + bsbm:validFrom "2008-05-09T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-09-02T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-05"^^xsd:date . +dataFromVendor1:Offer1715 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product68 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6.57"^^bsbm:USD ; + bsbm:validFrom "2008-01-15T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-07T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-15"^^xsd:date . +dataFromVendor1:Offer1716 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product57 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6939.65"^^bsbm:USD ; + bsbm:validFrom "2008-03-01T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-18T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "6"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-24"^^xsd:date . +dataFromVendor1:Offer1717 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product31 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7361.47"^^bsbm:USD ; + bsbm:validFrom "2008-05-21T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-18T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-31"^^xsd:date . +dataFromVendor1:Offer1718 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product51 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3435.33"^^bsbm:USD ; + bsbm:validFrom "2008-03-03T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-04T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-18"^^xsd:date . +dataFromVendor1:Offer1719 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product36 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1686.00"^^bsbm:USD ; + bsbm:validFrom "2008-03-23T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-17T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-09"^^xsd:date . +dataFromVendor1:Offer1720 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product67 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8974.87"^^bsbm:USD ; + bsbm:validFrom "2008-02-10T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-25T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-17"^^xsd:date . +dataFromVendor1:Offer1721 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product25 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5152.37"^^bsbm:USD ; + bsbm:validFrom "2008-05-21T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-17T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-23"^^xsd:date . +dataFromVendor1:Offer1722 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product58 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8203.50"^^bsbm:USD ; + bsbm:validFrom "2008-03-26T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-23T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-07"^^xsd:date . +dataFromVendor1:Offer1723 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product50 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "97.19"^^bsbm:USD ; + bsbm:validFrom "2008-04-12T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-07T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-17"^^xsd:date . +dataFromVendor1:Offer1724 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product52 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7811.64"^^bsbm:USD ; + bsbm:validFrom "2008-03-22T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-24T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-07"^^xsd:date . +dataFromVendor1:Offer1725 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product70 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6997.35"^^bsbm:USD ; + bsbm:validFrom "2008-03-09T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-23T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-11"^^xsd:date . +dataFromVendor1:Offer1726 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product63 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3098.70"^^bsbm:USD ; + bsbm:validFrom "2008-04-17T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-01T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-24"^^xsd:date . +dataFromVendor1:Offer1727 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product16 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6213.44"^^bsbm:USD ; + bsbm:validFrom "2008-02-05T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-26T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-24"^^xsd:date . +dataFromVendor1:Offer1728 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product23 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "790.35"^^bsbm:USD ; + bsbm:validFrom "2008-04-22T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-14T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-30"^^xsd:date . +dataFromVendor1:Offer1729 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product56 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5128.77"^^bsbm:USD ; + bsbm:validFrom "2008-02-26T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-31T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-25"^^xsd:date . +dataFromVendor1:Offer1730 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product33 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "508.41"^^bsbm:USD ; + bsbm:validFrom "2008-03-02T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-19T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-27"^^xsd:date . +dataFromVendor1:Offer1731 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product72 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6617.97"^^bsbm:USD ; + bsbm:validFrom "2008-03-26T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-11T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-06"^^xsd:date . +dataFromVendor1:Offer1732 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product88 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3273.67"^^bsbm:USD ; + bsbm:validFrom "2008-05-12T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-05T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-30"^^xsd:date . +dataFromVendor1:Offer1733 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product63 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5189.97"^^bsbm:USD ; + bsbm:validFrom "2008-01-06T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-30T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-26"^^xsd:date . +dataFromVendor1:Offer1734 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product27 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3105.25"^^bsbm:USD ; + bsbm:validFrom "2008-01-25T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-17T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "6"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-10"^^xsd:date . +dataFromVendor1:Offer1735 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product81 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4374.34"^^bsbm:USD ; + bsbm:validFrom "2008-03-04T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-13T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-26"^^xsd:date . +dataFromVendor1:Offer1736 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product33 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6924.78"^^bsbm:USD ; + bsbm:validFrom "2008-03-19T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-14T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-17"^^xsd:date . +dataFromVendor1:Offer1737 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product44 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2664.27"^^bsbm:USD ; + bsbm:validFrom "2008-01-23T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-01T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-06"^^xsd:date . +dataFromVendor1:Offer1738 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product87 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8785.58"^^bsbm:USD ; + bsbm:validFrom "2008-04-09T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-12T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-20"^^xsd:date . +dataFromVendor1:Offer1739 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product16 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5556.97"^^bsbm:USD ; + bsbm:validFrom "2008-02-06T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-22T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-24"^^xsd:date . +dataFromVendor1:Offer1740 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product18 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6679.86"^^bsbm:USD ; + bsbm:validFrom "2008-05-21T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-09-10T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "1"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-15"^^xsd:date . +dataFromVendor1:Offer1741 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product21 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8135.26"^^bsbm:USD ; + bsbm:validFrom "2008-03-17T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-01T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-30"^^xsd:date . +dataFromVendor1:Offer1742 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product48 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4127.50"^^bsbm:USD ; + bsbm:validFrom "2008-02-28T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-25T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-23"^^xsd:date . +dataFromVendor1:Offer1743 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product65 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5984.83"^^bsbm:USD ; + bsbm:validFrom "2008-05-04T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-30T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-17"^^xsd:date . +dataFromVendor1:Offer1744 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product30 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4156.26"^^bsbm:USD ; + bsbm:validFrom "2008-01-17T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-03T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "1"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-15"^^xsd:date . +dataFromVendor1:Offer1745 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product36 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2258.09"^^bsbm:USD ; + bsbm:validFrom "2008-02-15T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-05T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-11"^^xsd:date . +dataFromVendor1:Offer1746 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product21 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "286.85"^^bsbm:USD ; + bsbm:validFrom "2008-04-14T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-15T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-06"^^xsd:date . +dataFromVendor1:Offer1747 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product38 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5215.00"^^bsbm:USD ; + bsbm:validFrom "2008-03-07T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-24T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "1"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-08"^^xsd:date . +dataFromVendor1:Offer1748 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product35 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7681.76"^^bsbm:USD ; + bsbm:validFrom "2008-04-24T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-16T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-04"^^xsd:date . +dataFromVendor1:Offer1749 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product31 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3670.49"^^bsbm:USD ; + bsbm:validFrom "2008-03-05T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-11T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-14"^^xsd:date . +dataFromVendor1:Offer1750 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product77 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7828.06"^^bsbm:USD ; + bsbm:validFrom "2008-01-19T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-25T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-29"^^xsd:date . +dataFromVendor1:Offer1751 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product78 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7386.76"^^bsbm:USD ; + bsbm:validFrom "2008-01-13T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-23T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-06"^^xsd:date . +dataFromVendor1:Offer1752 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product74 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1653.61"^^bsbm:USD ; + bsbm:validFrom "2008-03-29T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-02T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-12"^^xsd:date . +dataFromVendor1:Offer1753 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product53 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5785.89"^^bsbm:USD ; + bsbm:validFrom "2008-02-17T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-01T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "8"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-24"^^xsd:date . +dataFromVendor1:Offer1754 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product75 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9405.89"^^bsbm:USD ; + bsbm:validFrom "2008-05-11T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-08T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-27"^^xsd:date . +dataFromVendor1:Offer1755 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product69 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "990.36"^^bsbm:USD ; + bsbm:validFrom "2007-12-21T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-16T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-16"^^xsd:date . +dataFromVendor1:Offer1756 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product77 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "365.26"^^bsbm:USD ; + bsbm:validFrom "2008-03-18T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-13T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-14"^^xsd:date . +dataFromVendor1:Offer1757 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product43 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "679.89"^^bsbm:USD ; + bsbm:validFrom "2008-01-23T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-08T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-20"^^xsd:date . +dataFromVendor1:Offer1758 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product15 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1707.55"^^bsbm:USD ; + bsbm:validFrom "2008-01-19T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-10T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-18"^^xsd:date . +dataFromVendor1:Offer1759 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product37 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2088.50"^^bsbm:USD ; + bsbm:validFrom "2008-03-26T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-26T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-18"^^xsd:date . +dataFromVendor1:Offer1760 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product50 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4087.21"^^bsbm:USD ; + bsbm:validFrom "2008-02-28T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-28T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-22"^^xsd:date . +dataFromVendor1:Offer1761 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product25 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "934.78"^^bsbm:USD ; + bsbm:validFrom "2008-04-02T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-13T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-19"^^xsd:date . +dataFromVendor1:Offer1762 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product27 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "653.51"^^bsbm:USD ; + bsbm:validFrom "2008-04-19T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-28T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-19"^^xsd:date . +dataFromVendor1:Offer1763 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product51 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8137.46"^^bsbm:USD ; + bsbm:validFrom "2008-03-09T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-01T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-25"^^xsd:date . +dataFromVendor1:Offer1764 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product50 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7522.13"^^bsbm:USD ; + bsbm:validFrom "2008-02-08T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-08T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-21"^^xsd:date . +dataFromVendor1:Offer1765 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product48 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2791.01"^^bsbm:USD ; + bsbm:validFrom "2008-04-12T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-27T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-13"^^xsd:date . +dataFromVendor1:Offer1766 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product68 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6304.22"^^bsbm:USD ; + bsbm:validFrom "2008-01-25T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-13T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-04"^^xsd:date . +dataFromVendor1:Offer1767 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product36 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1908.17"^^bsbm:USD ; + bsbm:validFrom "2008-03-24T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-07T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-31"^^xsd:date . +dataFromVendor1:Offer1768 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product57 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3358.28"^^bsbm:USD ; + bsbm:validFrom "2008-03-03T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-06T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-27"^^xsd:date . +dataFromVendor1:Offer1769 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product51 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6367.79"^^bsbm:USD ; + bsbm:validFrom "2008-04-11T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-02T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-16"^^xsd:date . +dataFromVendor1:Offer1770 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product49 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6378.41"^^bsbm:USD ; + bsbm:validFrom "2008-04-19T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-04T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-29"^^xsd:date . +dataFromVendor1:Offer1771 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product70 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7576.68"^^bsbm:USD ; + bsbm:validFrom "2008-02-10T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-03T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-05"^^xsd:date . +dataFromVendor1:Offer1772 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product41 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6103.93"^^bsbm:USD ; + bsbm:validFrom "2008-02-11T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-14T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-15"^^xsd:date . +dataFromVendor1:Offer1773 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer3:Product96 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1319.18"^^bsbm:USD ; + bsbm:validFrom "2008-03-28T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-09-01T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-09"^^xsd:date . +dataFromVendor1:Offer1774 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product66 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9832.67"^^bsbm:USD ; + bsbm:validFrom "2008-04-26T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-11T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-02"^^xsd:date . +dataFromVendor1:Offer1775 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product70 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3652.01"^^bsbm:USD ; + bsbm:validFrom "2008-05-27T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-19T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-13"^^xsd:date . +dataFromVendor1:Offer1776 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product45 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3944.20"^^bsbm:USD ; + bsbm:validFrom "2008-02-25T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-14T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-03"^^xsd:date . +dataFromVendor1:Offer1777 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product28 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8700.32"^^bsbm:USD ; + bsbm:validFrom "2008-03-31T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-15T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-19"^^xsd:date . +dataFromVendor1:Offer1778 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product35 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4500.72"^^bsbm:USD ; + bsbm:validFrom "2008-02-23T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-23T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-21"^^xsd:date . +dataFromVendor1:Offer1779 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product54 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9653.06"^^bsbm:USD ; + bsbm:validFrom "2008-04-16T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-03T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-29"^^xsd:date . +dataFromVendor1:Offer1780 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product15 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8730.61"^^bsbm:USD ; + bsbm:validFrom "2008-05-03T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-10T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-07"^^xsd:date . +dataFromVendor1:Offer1781 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product47 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2452.75"^^bsbm:USD ; + bsbm:validFrom "2008-05-03T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-28T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-25"^^xsd:date . +dataFromVendor1:Offer1782 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product7 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5154.18"^^bsbm:USD ; + bsbm:validFrom "2008-04-05T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-08T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-18"^^xsd:date . +dataFromVendor1:Offer1783 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product9 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6275.31"^^bsbm:USD ; + bsbm:validFrom "2008-02-27T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-25T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-07"^^xsd:date . +dataFromVendor1:Offer1784 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product36 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6897.25"^^bsbm:USD ; + bsbm:validFrom "2008-03-22T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-15T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-23"^^xsd:date . +dataFromVendor1:Offer1785 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product45 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6180.95"^^bsbm:USD ; + bsbm:validFrom "2008-03-26T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-07T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-15"^^xsd:date . +dataFromVendor1:Offer1786 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product50 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1026.04"^^bsbm:USD ; + bsbm:validFrom "2008-01-07T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-28T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-31"^^xsd:date . +dataFromVendor1:Offer1787 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product41 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "961.31"^^bsbm:USD ; + bsbm:validFrom "2008-06-10T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-10T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-15"^^xsd:date . +dataFromVendor1:Offer1788 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product86 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6401.31"^^bsbm:USD ; + bsbm:validFrom "2008-04-01T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-11T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-02"^^xsd:date . +dataFromVendor1:Offer1789 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product49 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3721.45"^^bsbm:USD ; + bsbm:validFrom "2008-01-18T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-16T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "6"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-27"^^xsd:date . +dataFromVendor1:Offer1790 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product54 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4141.15"^^bsbm:USD ; + bsbm:validFrom "2008-03-18T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-03-28T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-21"^^xsd:date . +dataFromVendor1:Offer1791 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product41 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3563.34"^^bsbm:USD ; + bsbm:validFrom "2008-03-22T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-21T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-30"^^xsd:date . +dataFromVendor1:Offer1792 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product38 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7469.43"^^bsbm:USD ; + bsbm:validFrom "2008-04-13T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-15T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-26"^^xsd:date . +dataFromVendor1:Offer1793 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product19 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4154.26"^^bsbm:USD ; + bsbm:validFrom "2008-02-13T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-06T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-01"^^xsd:date . +dataFromVendor1:Offer1794 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product47 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2497.19"^^bsbm:USD ; + bsbm:validFrom "2008-04-20T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-09-03T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-14"^^xsd:date . +dataFromVendor1:Offer1795 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product64 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9119.62"^^bsbm:USD ; + bsbm:validFrom "2008-03-29T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-13T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-20"^^xsd:date . +dataFromVendor1:Offer1796 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product34 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7290.03"^^bsbm:USD ; + bsbm:validFrom "2008-03-24T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-03T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-24"^^xsd:date . +dataFromVendor1:Offer1797 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product58 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4705.43"^^bsbm:USD ; + bsbm:validFrom "2008-02-09T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-26T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-24"^^xsd:date . +dataFromVendor1:Offer1798 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product63 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4448.20"^^bsbm:USD ; + bsbm:validFrom "2008-04-11T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-04T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-05"^^xsd:date . +dataFromVendor1:Offer1799 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product61 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7304.93"^^bsbm:USD ; + bsbm:validFrom "2008-05-19T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-10T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-26"^^xsd:date . +dataFromVendor1:Offer1800 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer3:Product95 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1365.72"^^bsbm:USD ; + bsbm:validFrom "2008-05-28T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-10T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-31"^^xsd:date . +dataFromVendor1:Offer1801 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product55 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7282.99"^^bsbm:USD ; + bsbm:validFrom "2008-02-21T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-05T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-17"^^xsd:date . +dataFromVendor1:Offer1802 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product48 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3321.45"^^bsbm:USD ; + bsbm:validFrom "2008-03-24T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-28T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-16"^^xsd:date . +dataFromVendor1:Offer1803 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product65 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "634.76"^^bsbm:USD ; + bsbm:validFrom "2008-01-24T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-04T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-04"^^xsd:date . +dataFromVendor1:Offer1804 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product45 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6708.38"^^bsbm:USD ; + bsbm:validFrom "2008-04-04T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-15T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-29"^^xsd:date . +dataFromVendor1:Offer1805 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product74 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7007.52"^^bsbm:USD ; + bsbm:validFrom "2008-04-04T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-05T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-28"^^xsd:date . +dataFromVendor1:Offer1806 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product25 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3642.37"^^bsbm:USD ; + bsbm:validFrom "2008-02-20T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-30T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-30"^^xsd:date . +dataFromVendor1:Offer1807 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product27 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6005.99"^^bsbm:USD ; + bsbm:validFrom "2008-02-18T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-31T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-26"^^xsd:date . +dataFromVendor1:Offer1808 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product80 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4623.39"^^bsbm:USD ; + bsbm:validFrom "2008-05-15T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-12T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "1"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-05"^^xsd:date . +dataFromVendor1:Offer1809 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product2 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3532.23"^^bsbm:USD ; + bsbm:validFrom "2008-02-01T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-10T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-10"^^xsd:date . +dataFromVendor1:Offer1810 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product74 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2965.65"^^bsbm:USD ; + bsbm:validFrom "2008-01-09T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-17T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-05"^^xsd:date . +dataFromVendor1:Offer1811 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product49 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6661.03"^^bsbm:USD ; + bsbm:validFrom "2008-01-07T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-22T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-31"^^xsd:date . +dataFromVendor1:Offer1812 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product13 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3178.27"^^bsbm:USD ; + bsbm:validFrom "2008-03-08T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-13T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-03"^^xsd:date . +dataFromVendor1:Offer1813 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product56 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8486.16"^^bsbm:USD ; + bsbm:validFrom "2008-06-16T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-09-02T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-18"^^xsd:date . +dataFromVendor1:Offer1814 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product74 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5719.93"^^bsbm:USD ; + bsbm:validFrom "2008-02-27T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-09T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-18"^^xsd:date . +dataFromVendor1:Offer1815 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product54 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4070.73"^^bsbm:USD ; + bsbm:validFrom "2008-04-09T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-26T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "6"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-12"^^xsd:date . +dataFromVendor1:Offer1816 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product42 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2159.72"^^bsbm:USD ; + bsbm:validFrom "2008-03-04T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-04T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-14"^^xsd:date . +dataFromVendor1:Offer1817 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product60 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4882.99"^^bsbm:USD ; + bsbm:validFrom "2008-03-12T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-28T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-31"^^xsd:date . +dataFromVendor1:Offer1818 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product81 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8041.56"^^bsbm:USD ; + bsbm:validFrom "2008-04-29T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-12T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-13"^^xsd:date . +dataFromVendor1:Offer1819 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product27 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1890.52"^^bsbm:USD ; + bsbm:validFrom "2008-04-25T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-25T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-14"^^xsd:date . +dataFromVendor1:Offer1820 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product70 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5641.66"^^bsbm:USD ; + bsbm:validFrom "2008-04-07T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-29T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-30"^^xsd:date . +dataFromVendor1:Offer1821 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product69 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6741.51"^^bsbm:USD ; + bsbm:validFrom "2008-02-28T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-05T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-26"^^xsd:date . +dataFromVendor1:Offer1822 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product39 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5017.32"^^bsbm:USD ; + bsbm:validFrom "2008-05-18T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-29T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-19"^^xsd:date . +dataFromVendor1:Offer1823 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product41 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6517.77"^^bsbm:USD ; + bsbm:validFrom "2008-02-24T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-01T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-03"^^xsd:date . +dataFromVendor1:Offer1824 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product56 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9895.83"^^bsbm:USD ; + bsbm:validFrom "2008-04-03T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-12T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-26"^^xsd:date . +dataFromVendor1:Offer1825 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product60 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9842.73"^^bsbm:USD ; + bsbm:validFrom "2008-05-25T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-02T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-13"^^xsd:date . +dataFromVendor1:Offer1826 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product62 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4289.25"^^bsbm:USD ; + bsbm:validFrom "2008-01-22T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-02T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-09"^^xsd:date . +dataFromVendor1:Offer1827 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product43 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1342.07"^^bsbm:USD ; + bsbm:validFrom "2008-04-03T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-07T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-25"^^xsd:date . +dataFromVendor1:Offer1828 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product75 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6820.17"^^bsbm:USD ; + bsbm:validFrom "2008-04-25T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-05T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-28"^^xsd:date . +dataFromVendor1:Offer1829 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product32 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6857.23"^^bsbm:USD ; + bsbm:validFrom "2008-03-10T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-24T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-21"^^xsd:date . +dataFromVendor1:Offer1830 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product39 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2488.73"^^bsbm:USD ; + bsbm:validFrom "2008-02-25T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-07T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "1"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-22"^^xsd:date . +dataFromVendor1:Offer1831 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product78 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4204.00"^^bsbm:USD ; + bsbm:validFrom "2008-02-29T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-06T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "6"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-10"^^xsd:date . +dataFromVendor1:Offer1832 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product80 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5578.88"^^bsbm:USD ; + bsbm:validFrom "2008-03-22T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-09T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-13"^^xsd:date . +dataFromVendor1:Offer1833 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product90 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2695.24"^^bsbm:USD ; + bsbm:validFrom "2008-02-04T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-15T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-23"^^xsd:date . +dataFromVendor1:Offer1834 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product54 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3405.75"^^bsbm:USD ; + bsbm:validFrom "2008-04-24T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-03T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-09"^^xsd:date . +dataFromVendor1:Offer1835 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product56 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "236.73"^^bsbm:USD ; + bsbm:validFrom "2008-04-19T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-01T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-06"^^xsd:date . +dataFromVendor1:Offer1836 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product16 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7681.92"^^bsbm:USD ; + bsbm:validFrom "2008-03-18T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-04T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-16"^^xsd:date . +dataFromVendor1:Offer1837 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product70 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8410.46"^^bsbm:USD ; + bsbm:validFrom "2008-01-20T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-25T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-04"^^xsd:date . +dataFromVendor1:Offer1838 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product39 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9372.76"^^bsbm:USD ; + bsbm:validFrom "2008-02-22T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-07T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-26"^^xsd:date . +dataFromVendor1:Offer1839 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product63 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4533.34"^^bsbm:USD ; + bsbm:validFrom "2008-04-22T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-07T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-15"^^xsd:date . +dataFromVendor1:Offer1840 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product82 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3165.39"^^bsbm:USD ; + bsbm:validFrom "2008-03-19T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-21T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-14"^^xsd:date . +dataFromVendor1:Offer1841 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product1 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4482.63"^^bsbm:USD ; + bsbm:validFrom "2008-02-12T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-19T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-16"^^xsd:date . +dataFromVendor1:Offer1842 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product39 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9796.64"^^bsbm:USD ; + bsbm:validFrom "2008-02-04T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-28T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-29"^^xsd:date . +dataFromVendor1:Offer1843 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product75 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1836.83"^^bsbm:USD ; + bsbm:validFrom "2008-05-20T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-30T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-13"^^xsd:date . +dataFromVendor1:Offer1844 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer3:Product95 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8058.08"^^bsbm:USD ; + bsbm:validFrom "2008-05-14T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-12T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-31"^^xsd:date . +dataFromVendor1:Offer1845 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product32 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6732.49"^^bsbm:USD ; + bsbm:validFrom "2008-05-15T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-01T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-10"^^xsd:date . +dataFromVendor1:Offer1846 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product44 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3265.74"^^bsbm:USD ; + bsbm:validFrom "2008-02-17T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-26T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-27"^^xsd:date . +dataFromVendor1:Offer1847 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product36 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2703.12"^^bsbm:USD ; + bsbm:validFrom "2008-03-20T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-01T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-01"^^xsd:date . +dataFromVendor1:Offer1848 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product31 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5897.97"^^bsbm:USD ; + bsbm:validFrom "2008-03-02T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-03T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-10"^^xsd:date . +dataFromVendor1:Offer1849 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product20 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "806.54"^^bsbm:USD ; + bsbm:validFrom "2008-04-17T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-24T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-14"^^xsd:date . +dataFromVendor1:Offer1850 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product41 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2202.93"^^bsbm:USD ; + bsbm:validFrom "2008-03-14T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-20T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-02"^^xsd:date . +dataFromVendor1:Offer1851 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product21 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8311.51"^^bsbm:USD ; + bsbm:validFrom "2008-01-31T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-15T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-01"^^xsd:date . +dataFromVendor1:Offer1852 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product71 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8386.69"^^bsbm:USD ; + bsbm:validFrom "2008-04-05T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-30T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-16"^^xsd:date . +dataFromVendor1:Offer1853 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product37 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3422.62"^^bsbm:USD ; + bsbm:validFrom "2008-06-09T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-09-08T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-10"^^xsd:date . +dataFromVendor1:Offer1854 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product32 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1519.16"^^bsbm:USD ; + bsbm:validFrom "2008-02-18T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-20T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-14"^^xsd:date . +dataFromVendor1:Offer1855 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product48 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8430.53"^^bsbm:USD ; + bsbm:validFrom "2008-02-02T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-14T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-14"^^xsd:date . +dataFromVendor1:Offer1856 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product34 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2993.06"^^bsbm:USD ; + bsbm:validFrom "2008-04-07T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-14T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "1"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-09"^^xsd:date . +dataFromVendor1:Offer1857 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product78 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1321.46"^^bsbm:USD ; + bsbm:validFrom "2008-02-17T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-02T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "7"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-08"^^xsd:date . +dataFromVendor1:Offer1858 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product38 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5165.91"^^bsbm:USD ; + bsbm:validFrom "2008-03-26T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-16T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "7"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-06"^^xsd:date . +dataFromVendor1:Offer1859 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product51 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9610.97"^^bsbm:USD ; + bsbm:validFrom "2008-01-17T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-26T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-08"^^xsd:date . +dataFromVendor1:Offer1860 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product74 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7591.24"^^bsbm:USD ; + bsbm:validFrom "2008-05-01T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-16T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-24"^^xsd:date . +dataFromVendor1:Offer1861 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product73 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1127.64"^^bsbm:USD ; + bsbm:validFrom "2008-02-15T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-04T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-08"^^xsd:date . +dataFromVendor1:Offer1862 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer3:Product95 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7083.69"^^bsbm:USD ; + bsbm:validFrom "2008-03-18T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-09T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-27"^^xsd:date . +dataFromVendor1:Offer1863 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product39 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3221.64"^^bsbm:USD ; + bsbm:validFrom "2008-03-16T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-20T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-24"^^xsd:date . +dataFromVendor1:Offer1864 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product23 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4942.20"^^bsbm:USD ; + bsbm:validFrom "2008-05-10T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-19T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-04"^^xsd:date . +dataFromVendor1:Offer1865 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product30 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6032.39"^^bsbm:USD ; + bsbm:validFrom "2008-03-09T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-13T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-29"^^xsd:date . +dataFromVendor1:Offer1866 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product55 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5452.27"^^bsbm:USD ; + bsbm:validFrom "2008-01-21T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-14T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-13"^^xsd:date . +dataFromVendor1:Offer1867 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product65 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5332.09"^^bsbm:USD ; + bsbm:validFrom "2008-05-11T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-25T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-25"^^xsd:date . +dataFromVendor1:Offer1868 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product30 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2091.45"^^bsbm:USD ; + bsbm:validFrom "2008-02-17T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-10T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-15"^^xsd:date . +dataFromVendor1:Offer1869 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product31 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7574.58"^^bsbm:USD ; + bsbm:validFrom "2008-03-07T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-13T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-02"^^xsd:date . +dataFromVendor1:Offer1870 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product34 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1712.39"^^bsbm:USD ; + bsbm:validFrom "2008-03-08T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-17T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-19"^^xsd:date . +dataFromVendor1:Offer1871 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product69 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3095.40"^^bsbm:USD ; + bsbm:validFrom "2008-01-21T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-24T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-12"^^xsd:date . +dataFromVendor1:Offer1872 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product29 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2484.27"^^bsbm:USD ; + bsbm:validFrom "2008-02-13T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-09T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-23"^^xsd:date . +dataFromVendor1:Offer1873 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product63 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3334.44"^^bsbm:USD ; + bsbm:validFrom "2008-02-17T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-04T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-11"^^xsd:date . +dataFromVendor1:Offer1874 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product82 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8292.18"^^bsbm:USD ; + bsbm:validFrom "2007-12-19T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-06T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-15"^^xsd:date . +dataFromVendor1:Offer1875 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product58 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4602.75"^^bsbm:USD ; + bsbm:validFrom "2008-02-19T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-19T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-16"^^xsd:date . +dataFromVendor1:Offer1876 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product28 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "938.86"^^bsbm:USD ; + bsbm:validFrom "2008-01-19T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-14T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "6"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-20"^^xsd:date . +dataFromVendor1:Offer1877 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product83 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3879.10"^^bsbm:USD ; + bsbm:validFrom "2008-01-09T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-05T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-15"^^xsd:date . +dataFromVendor1:Offer1878 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product42 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1515.46"^^bsbm:USD ; + bsbm:validFrom "2008-01-04T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-18T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-26"^^xsd:date . +dataFromVendor1:Offer1879 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product76 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1875.30"^^bsbm:USD ; + bsbm:validFrom "2008-02-10T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-31T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-18"^^xsd:date . +dataFromVendor1:Offer1880 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product26 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4171.23"^^bsbm:USD ; + bsbm:validFrom "2008-01-10T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-04T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-24"^^xsd:date . +dataFromVendor1:Offer1881 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product63 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4791.91"^^bsbm:USD ; + bsbm:validFrom "2008-02-28T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-19T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-25"^^xsd:date . +dataFromVendor1:Offer1882 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product30 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8542.69"^^bsbm:USD ; + bsbm:validFrom "2008-03-23T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-08T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-24"^^xsd:date . +dataFromVendor1:Offer1883 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product41 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8982.65"^^bsbm:USD ; + bsbm:validFrom "2008-04-22T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-03T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-16"^^xsd:date . +dataFromVendor1:Offer1884 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product66 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2104.62"^^bsbm:USD ; + bsbm:validFrom "2008-05-09T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-12T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-21"^^xsd:date . +dataFromVendor1:Offer1885 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product70 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2067.07"^^bsbm:USD ; + bsbm:validFrom "2008-04-10T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-04T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-12"^^xsd:date . +dataFromVendor1:Offer1886 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product66 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9949.19"^^bsbm:USD ; + bsbm:validFrom "2008-05-07T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-23T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-02"^^xsd:date . +dataFromVendor1:Offer1887 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product75 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9941.02"^^bsbm:USD ; + bsbm:validFrom "2008-01-05T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-22T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-26"^^xsd:date . +dataFromVendor1:Offer1888 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product18 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7599.87"^^bsbm:USD ; + bsbm:validFrom "2008-04-02T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-03T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "6"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-15"^^xsd:date . +dataFromVendor1:Offer1889 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product49 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1714.23"^^bsbm:USD ; + bsbm:validFrom "2008-05-30T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-03T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-01"^^xsd:date . +dataFromVendor1:Offer1890 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer3:Product98 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1714.01"^^bsbm:USD ; + bsbm:validFrom "2008-04-04T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-24T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-27"^^xsd:date . +dataFromVendor1:Offer1891 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product61 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3367.72"^^bsbm:USD ; + bsbm:validFrom "2008-03-21T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-22T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-15"^^xsd:date . +dataFromVendor1:Offer1892 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product39 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4882.01"^^bsbm:USD ; + bsbm:validFrom "2008-04-09T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-29T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-15"^^xsd:date . +dataFromVendor1:Offer1893 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product50 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6901.81"^^bsbm:USD ; + bsbm:validFrom "2008-04-29T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-04T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-16"^^xsd:date . +dataFromVendor1:Offer1894 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product27 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3171.45"^^bsbm:USD ; + bsbm:validFrom "2008-06-01T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-05T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-11"^^xsd:date . +dataFromVendor1:Offer1895 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product41 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3532.66"^^bsbm:USD ; + bsbm:validFrom "2008-02-07T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-16T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-28"^^xsd:date . +dataFromVendor1:Offer1896 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product69 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9257.00"^^bsbm:USD ; + bsbm:validFrom "2007-12-19T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-27T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-16"^^xsd:date . +dataFromVendor1:Offer1897 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product72 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8446.43"^^bsbm:USD ; + bsbm:validFrom "2008-02-18T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-08T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-11"^^xsd:date . +dataFromVendor1:Offer1898 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product19 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9871.16"^^bsbm:USD ; + bsbm:validFrom "2008-03-31T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-23T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-31"^^xsd:date . +dataFromVendor1:Offer1899 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product39 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9870.99"^^bsbm:USD ; + bsbm:validFrom "2008-01-20T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-13T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-11"^^xsd:date . +dataFromVendor1:Offer1900 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product82 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3431.28"^^bsbm:USD ; + bsbm:validFrom "2008-03-29T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-31T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "6"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-04"^^xsd:date . +dataFromVendor1:Offer1901 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product58 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6954.57"^^bsbm:USD ; + bsbm:validFrom "2008-05-26T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-27T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-08"^^xsd:date . +dataFromVendor1:Offer1902 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product28 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2736.35"^^bsbm:USD ; + bsbm:validFrom "2008-05-06T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-16T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-19"^^xsd:date . +dataFromVendor1:Offer1903 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product66 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9495.03"^^bsbm:USD ; + bsbm:validFrom "2008-01-30T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-28T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-26"^^xsd:date . +dataFromVendor1:Offer1904 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product82 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8000.74"^^bsbm:USD ; + bsbm:validFrom "2008-05-24T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-17T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-28"^^xsd:date . +dataFromVendor1:Offer1905 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product58 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7466.45"^^bsbm:USD ; + bsbm:validFrom "2008-01-31T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-07T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-25"^^xsd:date . +dataFromVendor1:Offer1906 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product32 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7468.50"^^bsbm:USD ; + bsbm:validFrom "2008-04-19T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-22T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-09"^^xsd:date . +dataFromVendor1:Offer1907 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product51 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9777.22"^^bsbm:USD ; + bsbm:validFrom "2008-02-05T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-13T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-19"^^xsd:date . +dataFromVendor1:Offer1908 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product50 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6444.17"^^bsbm:USD ; + bsbm:validFrom "2008-04-13T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-03T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-21"^^xsd:date . +dataFromVendor1:Offer1909 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product3 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9910.63"^^bsbm:USD ; + bsbm:validFrom "2008-02-20T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-20T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-02"^^xsd:date . +dataFromVendor1:Offer1910 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product68 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "745.57"^^bsbm:USD ; + bsbm:validFrom "2007-12-30T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-15T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-25"^^xsd:date . +dataFromVendor1:Offer1911 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product55 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "624.53"^^bsbm:USD ; + bsbm:validFrom "2008-02-21T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-23T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-28"^^xsd:date . +dataFromVendor1:Offer1912 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product48 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7175.22"^^bsbm:USD ; + bsbm:validFrom "2008-03-07T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-26T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-02"^^xsd:date . +dataFromVendor1:Offer1913 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product11 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1186.94"^^bsbm:USD ; + bsbm:validFrom "2008-04-02T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-07T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-17"^^xsd:date . +dataFromVendor1:Offer1914 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product62 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1989.65"^^bsbm:USD ; + bsbm:validFrom "2008-03-29T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-03T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-05"^^xsd:date . +dataFromVendor1:Offer1915 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product58 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8433.83"^^bsbm:USD ; + bsbm:validFrom "2008-04-02T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-25T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-13"^^xsd:date . +dataFromVendor1:Offer1916 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer3:Product100 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7965.66"^^bsbm:USD ; + bsbm:validFrom "2008-05-03T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-30T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-09"^^xsd:date . +dataFromVendor1:Offer1917 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product42 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7168.64"^^bsbm:USD ; + bsbm:validFrom "2008-05-06T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-20T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-27"^^xsd:date . +dataFromVendor1:Offer1918 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product89 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2323.65"^^bsbm:USD ; + bsbm:validFrom "2007-12-18T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-08T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-17"^^xsd:date . +dataFromVendor1:Offer1919 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product28 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6415.98"^^bsbm:USD ; + bsbm:validFrom "2008-04-23T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-15T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-02"^^xsd:date . +dataFromVendor1:Offer1920 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product21 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "366.27"^^bsbm:USD ; + bsbm:validFrom "2008-01-30T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-26T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-14"^^xsd:date . +dataFromVendor1:Offer1921 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product58 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5543.97"^^bsbm:USD ; + bsbm:validFrom "2008-02-17T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-18T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-08"^^xsd:date . +dataFromVendor1:Offer1922 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product67 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4525.22"^^bsbm:USD ; + bsbm:validFrom "2008-06-12T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-28T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "6"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-14"^^xsd:date . +dataFromVendor1:Offer1923 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product3 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8195.65"^^bsbm:USD ; + bsbm:validFrom "2008-03-29T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-05T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-26"^^xsd:date . +dataFromVendor1:Offer1924 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product74 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4325.59"^^bsbm:USD ; + bsbm:validFrom "2008-02-23T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-17T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-25"^^xsd:date . +dataFromVendor1:Offer1925 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product85 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2665.58"^^bsbm:USD ; + bsbm:validFrom "2008-04-05T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-25T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-01"^^xsd:date . +dataFromVendor1:Offer1926 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product35 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "510.13"^^bsbm:USD ; + bsbm:validFrom "2008-05-13T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-25T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-18"^^xsd:date . +dataFromVendor1:Offer1927 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product39 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4427.18"^^bsbm:USD ; + bsbm:validFrom "2008-06-03T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-20T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-07"^^xsd:date . +dataFromVendor1:Offer1928 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product54 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5765.69"^^bsbm:USD ; + bsbm:validFrom "2008-03-17T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-31T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "1"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-16"^^xsd:date . +dataFromVendor1:Offer1929 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product88 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "365.21"^^bsbm:USD ; + bsbm:validFrom "2008-02-21T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-28T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-11"^^xsd:date . +dataFromVendor1:Offer1930 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product47 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5230.95"^^bsbm:USD ; + bsbm:validFrom "2008-02-11T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-23T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-21"^^xsd:date . +dataFromVendor1:Offer1931 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product87 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4365.98"^^bsbm:USD ; + bsbm:validFrom "2008-02-14T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-01T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "1"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-01"^^xsd:date . +dataFromVendor1:Offer1932 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product67 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2207.35"^^bsbm:USD ; + bsbm:validFrom "2008-04-12T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-10T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-18"^^xsd:date . +dataFromVendor1:Offer1933 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product61 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "979.98"^^bsbm:USD ; + bsbm:validFrom "2008-02-23T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-15T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-11"^^xsd:date . +dataFromVendor1:Offer1934 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product20 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8505.56"^^bsbm:USD ; + bsbm:validFrom "2008-03-10T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-14T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "7"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-12"^^xsd:date . +dataFromVendor1:Offer1935 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product61 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7053.33"^^bsbm:USD ; + bsbm:validFrom "2008-03-12T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-08T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-17"^^xsd:date . +dataFromVendor1:Offer1936 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product58 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4216.44"^^bsbm:USD ; + bsbm:validFrom "2008-01-26T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-03-29T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-22"^^xsd:date . +dataFromVendor1:Offer1937 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product29 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1434.95"^^bsbm:USD ; + bsbm:validFrom "2008-02-25T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-01T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-24"^^xsd:date . +dataFromVendor1:Offer1938 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product26 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8638.77"^^bsbm:USD ; + bsbm:validFrom "2008-01-19T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-21T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-29"^^xsd:date . +dataFromVendor1:Offer1939 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product72 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9131.44"^^bsbm:USD ; + bsbm:validFrom "2008-03-23T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-11T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-19"^^xsd:date . +dataFromVendor1:Offer1940 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product64 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2861.45"^^bsbm:USD ; + bsbm:validFrom "2008-01-05T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-03-27T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-17"^^xsd:date . +dataFromVendor1:Offer1941 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product36 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9685.77"^^bsbm:USD ; + bsbm:validFrom "2008-04-14T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-26T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-06"^^xsd:date . +dataFromVendor1:Offer1942 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product21 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4344.37"^^bsbm:USD ; + bsbm:validFrom "2008-02-22T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-13T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-22"^^xsd:date . +dataFromVendor1:Offer1943 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product61 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8879.22"^^bsbm:USD ; + bsbm:validFrom "2008-03-27T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-24T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-14"^^xsd:date . +dataFromVendor1:Offer1944 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product59 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5826.34"^^bsbm:USD ; + bsbm:validFrom "2008-01-22T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-11T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-16"^^xsd:date . +dataFromVendor1:Offer1945 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product49 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9378.70"^^bsbm:USD ; + bsbm:validFrom "2008-04-27T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-18T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-08"^^xsd:date . +dataFromVendor1:Offer1946 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product39 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3883.13"^^bsbm:USD ; + bsbm:validFrom "2008-03-11T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-01T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-02"^^xsd:date . +dataFromVendor1:Offer1947 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product79 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8538.17"^^bsbm:USD ; + bsbm:validFrom "2008-03-19T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-30T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-11"^^xsd:date . +dataFromVendor1:Offer1948 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product53 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7441.27"^^bsbm:USD ; + bsbm:validFrom "2008-05-29T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-23T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-07"^^xsd:date . +dataFromVendor1:Offer1949 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product44 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "984.31"^^bsbm:USD ; + bsbm:validFrom "2008-04-01T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-30T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-05"^^xsd:date . +dataFromVendor1:Offer1950 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product48 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2886.67"^^bsbm:USD ; + bsbm:validFrom "2008-04-17T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-17T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-19"^^xsd:date . +dataFromVendor1:Offer1951 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product80 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9501.28"^^bsbm:USD ; + bsbm:validFrom "2008-04-01T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-28T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-06"^^xsd:date . +dataFromVendor1:Offer1952 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product69 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "272.79"^^bsbm:USD ; + bsbm:validFrom "2008-02-26T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-21T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-22"^^xsd:date . +dataFromVendor1:Offer1953 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product22 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "284.56"^^bsbm:USD ; + bsbm:validFrom "2008-02-03T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-24T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-11"^^xsd:date . +dataFromVendor1:Offer1954 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product69 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4775.26"^^bsbm:USD ; + bsbm:validFrom "2008-05-29T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-29T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-19"^^xsd:date . +dataFromVendor1:Offer1955 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product49 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7431.80"^^bsbm:USD ; + bsbm:validFrom "2008-05-28T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-15T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-06"^^xsd:date . +dataFromVendor1:Offer1956 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product51 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8478.61"^^bsbm:USD ; + bsbm:validFrom "2008-03-07T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-01T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-07"^^xsd:date . +dataFromVendor1:Offer1957 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product37 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7527.14"^^bsbm:USD ; + bsbm:validFrom "2008-01-21T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-04T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-25"^^xsd:date . +dataFromVendor1:Offer1958 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product23 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "256.80"^^bsbm:USD ; + bsbm:validFrom "2008-03-03T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-06T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-18"^^xsd:date . +dataFromVendor1:Offer1959 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product28 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6872.34"^^bsbm:USD ; + bsbm:validFrom "2008-02-08T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-29T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-30"^^xsd:date . +dataFromVendor1:Offer1960 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product41 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5690.99"^^bsbm:USD ; + bsbm:validFrom "2008-05-13T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-22T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "6"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-13"^^xsd:date . +dataFromVendor1:Offer1961 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product69 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3039.19"^^bsbm:USD ; + bsbm:validFrom "2008-03-19T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-21T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-24"^^xsd:date . +dataFromVendor1:Offer1962 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product44 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4802.80"^^bsbm:USD ; + bsbm:validFrom "2008-03-12T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-10T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "1"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-30"^^xsd:date . +dataFromVendor1:Offer1963 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product75 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7438.71"^^bsbm:USD ; + bsbm:validFrom "2008-03-16T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-07T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "1"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-15"^^xsd:date . +dataFromVendor1:Offer1964 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product58 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2481.42"^^bsbm:USD ; + bsbm:validFrom "2008-02-02T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-01T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-21"^^xsd:date . +dataFromVendor1:Offer1965 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product70 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7601.90"^^bsbm:USD ; + bsbm:validFrom "2008-04-19T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-09-13T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-15"^^xsd:date . +dataFromVendor1:Offer1966 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product50 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5620.91"^^bsbm:USD ; + bsbm:validFrom "2008-04-12T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-04T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-01"^^xsd:date . +dataFromVendor1:Offer1967 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product52 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "6146.33"^^bsbm:USD ; + bsbm:validFrom "2008-02-22T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-03T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-07"^^xsd:date . +dataFromVendor1:Offer1968 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product85 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1253.09"^^bsbm:USD ; + bsbm:validFrom "2007-12-28T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-01T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-16"^^xsd:date . +dataFromVendor1:Offer1969 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product87 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8505.56"^^bsbm:USD ; + bsbm:validFrom "2008-03-28T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-30T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-09"^^xsd:date . +dataFromVendor1:Offer1970 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product33 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1977.33"^^bsbm:USD ; + bsbm:validFrom "2008-01-21T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-22T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "6"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-31"^^xsd:date . +dataFromVendor1:Offer1971 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product22 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2946.18"^^bsbm:USD ; + bsbm:validFrom "2008-02-12T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-29T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-17"^^xsd:date . +dataFromVendor1:Offer1972 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product84 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8661.32"^^bsbm:USD ; + bsbm:validFrom "2008-03-11T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-06T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-26"^^xsd:date . +dataFromVendor1:Offer1973 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product34 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4478.91"^^bsbm:USD ; + bsbm:validFrom "2008-04-26T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-20T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-24"^^xsd:date . +dataFromVendor1:Offer1974 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product35 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5381.25"^^bsbm:USD ; + bsbm:validFrom "2008-04-12T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-04T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-18"^^xsd:date . +dataFromVendor1:Offer1975 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product38 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9040.67"^^bsbm:USD ; + bsbm:validFrom "2008-06-06T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-15T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-10"^^xsd:date . +dataFromVendor1:Offer1976 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product45 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8305.93"^^bsbm:USD ; + bsbm:validFrom "2008-03-12T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-09T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-27"^^xsd:date . +dataFromVendor1:Offer1977 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product17 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5395.21"^^bsbm:USD ; + bsbm:validFrom "2008-02-02T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-22T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-19"^^xsd:date . +dataFromVendor1:Offer1978 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product39 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8572.15"^^bsbm:USD ; + bsbm:validFrom "2008-01-18T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-12T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-20"^^xsd:date . +dataFromVendor1:Offer1979 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product67 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "78.79"^^bsbm:USD ; + bsbm:validFrom "2008-03-10T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-26T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-03"^^xsd:date . +dataFromVendor1:Offer1980 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product19 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8833.34"^^bsbm:USD ; + bsbm:validFrom "2008-05-04T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-26T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-02"^^xsd:date . +dataFromVendor1:Offer1981 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product67 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5065.97"^^bsbm:USD ; + bsbm:validFrom "2008-06-02T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-20T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-15"^^xsd:date . +dataFromVendor1:Offer1982 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product50 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "4714.48"^^bsbm:USD ; + bsbm:validFrom "2008-03-09T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-14T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-11"^^xsd:date . +dataFromVendor1:Offer1983 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product70 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8703.57"^^bsbm:USD ; + bsbm:validFrom "2008-03-22T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-15T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-22"^^xsd:date . +dataFromVendor1:Offer1984 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product27 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5224.70"^^bsbm:USD ; + bsbm:validFrom "2008-04-05T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-17T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "4"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-29"^^xsd:date . +dataFromVendor1:Offer1985 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product51 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7902.50"^^bsbm:USD ; + bsbm:validFrom "2008-04-08T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-04-28T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "6"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-16"^^xsd:date . +dataFromVendor1:Offer1986 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product43 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "773.12"^^bsbm:USD ; + bsbm:validFrom "2008-02-27T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-17T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-06"^^xsd:date . +dataFromVendor1:Offer1987 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product82 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3698.58"^^bsbm:USD ; + bsbm:validFrom "2007-12-29T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-18T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-03-25"^^xsd:date . +dataFromVendor1:Offer1988 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product27 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3390.46"^^bsbm:USD ; + bsbm:validFrom "2008-04-05T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-08-09T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-23"^^xsd:date . +dataFromVendor1:Offer1989 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product59 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "2818.80"^^bsbm:USD ; + bsbm:validFrom "2008-04-17T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-15T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-31"^^xsd:date . +dataFromVendor1:Offer1990 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product21 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1526.71"^^bsbm:USD ; + bsbm:validFrom "2008-02-26T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-23T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "5"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-03"^^xsd:date . +dataFromVendor1:Offer1991 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product26 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5079.02"^^bsbm:USD ; + bsbm:validFrom "2008-03-25T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-12T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-24"^^xsd:date . +dataFromVendor1:Offer1992 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product66 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "820.16"^^bsbm:USD ; + bsbm:validFrom "2008-04-29T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-23T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "1"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-06-15"^^xsd:date . +dataFromVendor1:Offer1993 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer2:Product70 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "138.15"^^bsbm:USD ; + bsbm:validFrom "2008-04-13T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-21T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-21"^^xsd:date . +dataFromVendor1:Offer1994 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product50 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "3144.68"^^bsbm:USD ; + bsbm:validFrom "2008-02-06T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-08T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-11"^^xsd:date . +dataFromVendor1:Offer1995 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product58 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7411.66"^^bsbm:USD ; + bsbm:validFrom "2008-01-13T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-02T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "6"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-11"^^xsd:date . +dataFromVendor1:Offer1996 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product53 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "8440.33"^^bsbm:USD ; + bsbm:validFrom "2008-02-20T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-01T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-26"^^xsd:date . +dataFromVendor1:Offer1997 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product49 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "9884.71"^^bsbm:USD ; + bsbm:validFrom "2008-04-27T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-07-16T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "3"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-26"^^xsd:date . +dataFromVendor1:Offer1998 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product53 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "7767.55"^^bsbm:USD ; + bsbm:validFrom "2008-03-17T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-06T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-05-18"^^xsd:date . +dataFromVendor1:Offer1999 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product46 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "5786.74"^^bsbm:USD ; + bsbm:validFrom "2008-03-17T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-06-15T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "2"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-13"^^xsd:date . +dataFromVendor1:Offer2000 + rdf:type bsbm:Offer ; + bsbm:product dataFromProducer1:Product7 ; + bsbm:vendor dataFromVendor1:Vendor1 ; + bsbm:price "1431.79"^^bsbm:USD ; + bsbm:validFrom "2008-02-07T00:00:00"^^xsd:dateTime ; + bsbm:validTo "2008-05-15T00:00:00"^^xsd:dateTime ; + bsbm:deliveryDays "6"^^xsd:integer ; + bsbm:offerWebpage ; + dc:publisher dataFromVendor1:Vendor1 ; + dc:date "2008-04-16"^^xsd:date . +dataFromRatingSite1:Reviewer1 + rdf:type foaf:Person ; + foaf:name "Ruggiero-Delane" ; + foaf:mbox_sha1sum "fb3efd92e3c7a8d775a895ba476e11a3e8f3fac" ; + bsbm:country ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-09-05"^^xsd:date . +dataFromRatingSite1:Review1 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product37 ; + rev:reviewer dataFromRatingSite1:Reviewer1 ; + dc:title "monocot coles secluded loiterers odalisque nonproprietary tauntingly bitte succubi redone innervation flatheads underset" ; + rev:text "cinematography tenderfoots soaping hedonics misconstrued dumpings confirmed antiquarians appropriately skilling para wailed inquisitional dissenter squabs embracer aviatrices contingency saying deviator poesies enciphering glibbest couchantly smallness diverting narcotism irreversibly circumsolar hemstitching accommodatively gadders lavation choosiest nevadians graving smit solidifying humphing toluol wickings gaper seedcakes decomposes coles cajolements counselable nonexpendable barbecuing overexposed behaviorism prognose woofers puffer seedcases mythologies parrakeet chariness reassignment objectives rotational captions syphilized deathly colorimetry imbrications dissociates bigmouthed epochally shouted hemogram celebre latitudinarians penetrably fortuity ligatures entente vectored nativists repped subsoil maps underclerk tillers djins sugary scrofulas factualism dobber knucks succulency postbags glissando expatriating mincier stockyard reveler trooped enouncing housepaint kayoes resurged fighters exoneration fusspots veriest photojournalists prowler videocassette ionizers systems beebee venoms introduced boned bangs photocomposing pinions gunlocks natally bequeathal haftorahs variousness eastwardly linable vermouths saleably bicarbonates disguisements scenting inspirers radixes oscillogram saddlebow cartload theological boyhoods shedder producers angularness obstruction impotently rayons washbasins radiologically chests reunited unstamped bookends carding measureless classifiers doubled soundlessly licentiously abutments armourers detractors senders epilepsies conte crashers furthering immobilization"@en ; + bsbm:rating2 "10"^^xsd:integer ; + bsbm:rating3 "10"^^xsd:integer ; + bsbm:reviewDate "2007-12-17T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-06"^^xsd:date . +dataFromRatingSite1:Review2 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product40 ; + rev:reviewer dataFromRatingSite1:Reviewer1 ; + dc:title "misarranges canonists actualizing poachy sherries winnings demobilized" ; + rev:text "fantasizing sanitizes attermined undisclosed debriefing redyeing recrates soggiest concatenates cyanided cartoning theatrically beveled bedraggles teriyaki hauberk highballs salinities exoneration blousiest cindering naming philippics acetifies solstitial mirks cathects buntings cursives undo endwise conelrad repines slewing pollywogs jumbler furculae ology earthiest recuperating blitzing tintings sorbets galvanization blacktop marshs asseverating handbarrows limericks flounderingly swiftly comicality capaciously scrimpiest remigration zags pfennigs libellee curvets ghastlier dissipates intertwined bisecting amortise peristalsis historiographer transformer forehead cocainize misplace crudded resound reviles anarchistic deadwoods novelizing barracked hydrologist nictate downgrading leftest zoned pallette faugh dogtrots flirter reradiate willies trampoline paradoxes shovelman overpopulating misgoverns waistband teamer beholders unswayed gladlier nodders brooking accreting rheumier bowers flintlocks manhoods omissible android narrower dybbuks anabolic practitioners nobelist fundamentalists whiteout adducing burier uniforming unshaven chickasaw buns goslings shirting flouring dundee himalayan culotte storehouses dismaying illuminatingly"@en ; + bsbm:rating1 "5"^^xsd:integer ; + bsbm:rating2 "2"^^xsd:integer ; + bsbm:reviewDate "2007-09-04T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2007-11-18"^^xsd:date . +dataFromRatingSite1:Review3 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product30 ; + rev:reviewer dataFromRatingSite1:Reviewer1 ; + dc:title "reacquisitions yokels embrasure formalist tutelar monomials butting petulancy polyploid succulency mastications braze nestings economizes" ; + rev:text "noncancellable accusers bookbinder enserfing birded barring collectives plazas extenuating godsends tumeric positively mishaps felines brasses shutter zebus takable depilatories seducing snacking enemies saluters facias wallowers alibiing administerial hooknoses conically incipiency aquacade unfrock cowardliness whipcord emboweling savouries overflies martyrs gritted vapourer alterability modernizes whiplashes embezzlements subclan loxing rontgen disfigurement ladrone snapped headwork jungian parses intromittent darting selsyns geotropic arisings grinded porkers keeners monkeying contingently envyingly batcher commutatively drones traded multimotored isomerization nonperishables"@en ; + bsbm:rating1 "3"^^xsd:integer ; + bsbm:rating2 "3"^^xsd:integer ; + bsbm:reviewDate "2007-12-16T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-02-27"^^xsd:date . +dataFromRatingSite1:Review4 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product78 ; + rev:reviewer dataFromRatingSite1:Reviewer1 ; + dc:title "curiosa writing teacarts surer vileness subversively muumuus decapitator fanfarons saltires surveyance graduands breezily eights lovemaking" ; + rev:text "splotched modernness freights fatless patiences lynchers psychs suppliants prologuing tabards uplands tastelessly occasionally oleoresin sahibs victualing nickles idolaters yacked speedster obstructionism impaneled driveler sanitarians overprint bagful perfectness godchildren headhunt unverifiably chutist trichinoses hoarsening tortuosity unkindness procedures burglaries microanalysis wheedlers intermezzos greenthumbed tazze concelebrating ultrasonically unstablest suspender moralizing poachier weatherwise stabiles overimpressed fadedly titulary miniaturizations stripper sagaciously swages reactivating reattained ohioans blithering mouldering dehorner leaded stilts elasticizes"@en ; + bsbm:reviewDate "2007-12-16T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-10"^^xsd:date . +dataFromRatingSite1:Review5 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product77 ; + rev:reviewer dataFromRatingSite1:Reviewer1 ; + dc:title "interned insinuator monographs danseur winkles intercessory patriarchates palisaded distractive dawdled" ; + rev:text "schoolers parlours blamableness wormiest revivals blacksmiths carillon lading nonverbal couldest grantors vowelize twiddled timeworker doughtiest sensitizing rase shushing disaffect overinclining knowns nodded reinstalled perspiry thanker granger accessorily submental questors bondmaid overcrowds abductor aspersed disinfect illustrations clepe nevadians habitues insurrectional pumpernickel dins overheat telephoto stoker graters outlasted dithers cacciatore saddlers pronation tutelary aviatrices crags degrades adiposeness inspirations darkest retinued ikon unusualness adumbrative snootiness downloading behemoths antivenins forgoer wallpapered hindgut bigmouths foamless riyals codfishes stockish maziest misgoverned ovulary gamboled beachcomber typist beltway panhandlers destination heartburns workdays leary realistic subparagraphs finals offprints inherits nobs amortize vasoconstrictive jackscrews gestated areas flamer endoskeleton wheal tanner insecticides defense predictiveness foldouts cinderous dodderer tediously flees chronaxy nuttiest fugit propman inamoratas broidered stallions moly zebu jejunums varistors insomniacs kabbalahs reported cryptos apneas reattempts towards bunions gummer overdoes cymbalers irrationalness signs assessors cosmological oleoresin unsociably expressions marinading saltcellars coagulates blitzing advices rara administration modelers slier amex bombardment roble ceaseless saloons filii ambuscading dearies appetency roustabouts scrawnier daddies hammerer islands nonfictional nonrefillable hyperacid dearies maddening labellers heftiest mayhemming literariness international buildings palatably minnesinger eloping compends deactivates sponsorships auditoriums pitchier conventionalized liquidated filipinos creosoted copying reconciliations unrentable ruthlessly slyly entertainers policyholders fastidiously invented conversing bankrupting stiffly heirdom kimonos sassy tromp swathing"@en ; + bsbm:rating1 "9"^^xsd:integer ; + bsbm:rating3 "8"^^xsd:integer ; + bsbm:reviewDate "2007-09-02T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-01-25"^^xsd:date . +dataFromRatingSite1:Review6 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product48 ; + rev:reviewer dataFromRatingSite1:Reviewer1 ; + dc:title "lilting hormonal stenciled prospers clinked parochially" ; + rev:text "replier preharden airports redigested selvages subteens alternations ament yodeller featureless aphanites peavey biochemically protons milady reinvents epicene tagalong blencher smooching subverters loafed angary traces achordate fanfares indispensabilities catalpas razers stabber appal homeostatic satirizes rehardened beavering bottling inimically maximizes symbolical bummer spectate indianians loams bespread crones obscenities daringly bouzouki tare venters frescoer pitied refurbishes esplanades peahens shoelaces turfs illustriousness thumbed antimacassars notifiable smarmier pivots duetting balancer unshaved overriding prearranged blinker flimsiest ponderously formed lowborn crossed spacers embassador pertness emasculations loofas dekagrams registership overdrafts wastrels aimfully ficklest suitcases prognosticators frissons"@en ; + bsbm:rating1 "3"^^xsd:integer ; + bsbm:rating4 "5"^^xsd:integer ; + bsbm:reviewDate "2008-01-01T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-02-21"^^xsd:date . +dataFromRatingSite1:Review7 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer3:Product96 ; + rev:reviewer dataFromRatingSite1:Reviewer1 ; + dc:title "slurped traduces cloacal borders guatemalan radiobroadcaster sabot consumer calculableness attenuates disassimilating ordered traipses rivers" ; + rev:text "landscaping necessitates dubbin rasing subroutine volleyers smock muttony watering aureole maniples pirozhki clenches shist cozily typecasts sterilizers ensheathed obfuscates beryls bonding candider pilled tapirs sightsees abnormality measured camomiles bathetically firedamps musketry bens swanks imprinting desensitizers junket photographer irritating sortied bistros lampoonists postdating vegetal aftermost stabler hags intuitively fretsaws steamship misproportions overlorded crapes annullable hates ploughing reabandoning resistors neoclassically dodder debonairly falconets seizins steppingstone motorings flagellation tincting machinist urgingly permafrost colombian folkmoots regrets lingier heinously walkovers oarless halidoms executors bowlegged distended fellies symptomless commiserated harms moneyer sybaritic fluorination serenades derogatoriness unlatching spinouts slewed overstretches vizored datchas dought overspent issueless applications disarticulated performs greenstick pointing appointively middlebrowism christly pestilently mulligans footsies accidence deadbeats surrounding erythromycin ideograms synthetical stripped shaving scientistic electromagnet"@en ; + bsbm:rating1 "3"^^xsd:integer ; + bsbm:rating2 "4"^^xsd:integer ; + bsbm:rating4 "1"^^xsd:integer ; + bsbm:reviewDate "2007-08-15T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-02-03"^^xsd:date . +dataFromRatingSite1:Review8 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product29 ; + rev:reviewer dataFromRatingSite1:Reviewer1 ; + dc:title "accumulations gatsby mudstones guilelessness peones alligators globate inflammatorily storytellers prepays blowfishes carhops spewers seediness doughtily" ; + rev:text "marched vaporise reverencer nutcracker gripes reshowed geminis overdose mappers recompenses thankless payed shrewdest selectively canners depicted underwritten undeceive defiling vertigoes lipped hydrothermally cates revokers hassled jiggling exactingly pressoreceptor deflectors playgirls maharajah gluttonies conceptive philos saliency folkway luteum laminated guiling tamarisks unvoices intromitter dentals woodbox categorize sensitized tanning eglantines antiinsurrectionally fibbing paten glissandi hedonic midyears washwomen palpations shewers fogeys trove amnestied readapts obliquely junkiest reavowing sanctimoniously lithographically equinely reflexologies corvettes nodules lilting entoils flummoxed tuneless subsonic motormen levelled movies boodle schemed tamer flagrance fooleries cheekfuls legman transmissions balmily androgyny rebukingly reintegration brakier replications detours sharped pejoratively mounds bolides unitive butts adumbrations thickety toxicities describing bedims autotherapy kilobar xanthate apprehensibly telemetric prudishly ambidexter swans cermet prentices booboos jesuitries gasolines acquaintances warmths enraptured fluctuating crier defrocked jalousies frailness frillers adzes distensibilities biomedical doomful befuddles marge haircaps threaded beadsman externals spectrographer scowlingly reconciliating writs jams chitlin unslaked stalinism chamoix helled invaded transisthmian taverner cornhusks microscopically"@en ; + bsbm:rating1 "4"^^xsd:integer ; + bsbm:rating4 "3"^^xsd:integer ; + bsbm:reviewDate "2007-07-11T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-02-29"^^xsd:date . +dataFromRatingSite1:Review9 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product50 ; + rev:reviewer dataFromRatingSite1:Reviewer1 ; + dc:title "disenthralled windjammers tightwad cranked cambiums unrightful arraigned nursed marts bustling wheedling disintegrated pleaser reshuffled sacrifices" ; + rev:text "underemployment chomping drawers paroxysm ducktails frogeyes chronologists despatching shrewishness keratins agelessness manipulates bombers shrubby precisely rhapsodized bibbing infrangible banquette lachrymator medalist disallowed banquettes adjudicature mudcaps attaint perished orangutans surefire purifier cuddled tarring reconcilement microgram subcivilizations flares environmentalism irrationally absorbable violability skimmers divagations thrillingly whickering listed intr bushier recoverer gonif artlessly indetermination monish driblets bluegum unprofitable synchros alterants jeweller adsorbing nitration automatization fumier bullfighters campaigners overdrinking calendula saxophonists smirking muttons footier nonstructurally disconsolately sextant rethought soldierly clicks meow overemphasizing bobsledder shuns convicted resources feedable bono turnup unburied noiselessly calderas ultimacy hobbyhorses tympanic summerhouses menfolks leafworms travestied fetishistic discriminator archaisms entombs vulguses navies cozie escalates honorableness hornless explicating carollers agaze deprogram gloomed redressment strictly trifacial loups evading microbus jordanian moderato propounders pattie unintelligent identifying servitors savannas torquer flatlands remanufacture tips bladed acidly saprophytically ropewalks dishtowel fireweed teargassed rerolls sayee zagged swooned josses halving upchucks ovines necessitates aboriginally countable knaps tyred wooler hoary redeemable recrudesce marigolds draftings flippest technics nakedness pedlar imponderably despoils forjudged remakes ignominy bottlenecks modifiers complying biodegrading xylophonist visards coalshed brattish stitched ministration"@en ; + bsbm:rating1 "7"^^xsd:integer ; + bsbm:rating2 "2"^^xsd:integer ; + bsbm:rating3 "4"^^xsd:integer ; + bsbm:reviewDate "2007-11-19T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-03-21"^^xsd:date . +dataFromRatingSite1:Review10 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product52 ; + rev:reviewer dataFromRatingSite1:Reviewer1 ; + dc:title "supplementer expiator affectedness sagamore plasms defunctive marigolds antinomy curtly syringes" ; + rev:text "geometers shyer motivates shipwrights detournement trombones aldehydes idolises redraws didst halides ombres sporting parries mahjongg catabolically spelunking tonsillectomies giantisms rouble tediousness amaranthine communes misericordia reliquidating voidable whiptail thole standpoints networks graphics waterspout moguls asides booster colorations disintegrator nonconsecutively necrophile surfacers turnarounds squatness activator foxed shaitans flimflam unsatiable station wishless dishcloth fulcra primos pronounced valeting repressible galipot orals reanalyze counteractively revellers insects misdirects ingested refuter mooching galvanized bimanual dubiously confidence favorites prenuptial haps shmoes blotty kremlinology headstands trousseau achiness typesets domesticity polit tarmacs hellers antiknock grumbled nosebags interacinous earplugs placque savagest blotched wiredrawn antigravity groucho gleba liquids cozens supplying postboys thunderclaps ubiquitously croqueting burliness bandoleer conventionality burying cataleptic disbursal conspiratorially electroshocks freckles connecting biosphere uncontrollable hubs connivery clownery gaffed underbrush expostulated pointy slumlords tartufe overeats ionizations"@en ; + bsbm:rating1 "9"^^xsd:integer ; + bsbm:rating2 "4"^^xsd:integer ; + bsbm:rating3 "1"^^xsd:integer ; + bsbm:rating4 "8"^^xsd:integer ; + bsbm:reviewDate "2007-07-17T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-02-29"^^xsd:date . +dataFromRatingSite1:Review11 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product66 ; + rev:reviewer dataFromRatingSite1:Reviewer1 ; + dc:title "pralines footballs zebrine conflicts optatives chasses electromagnet hydrographer admonishing intarsias curdier secundogeniture discharging fluoresced" ; + rev:text "wifing insulants enthusiasms cutaways cannabinol comeliness sincerely hectare wholism undercarriage surrealists preconstructs unharnessed grasshoppers mutuals louvers underparts cosmo retried wiggler cabinetmaker boomed pursily unproductively underscore exits reembodies tinner ogresses apers favored glueing prudish woodener pairings tranships hydrography gnars dirigible otherworldliness colourers busybody pergolas nonrecurrent doubling matutinally reincurred womanize raptest suffixing grueled feinschmeckers damasked clangours enflamed warehouses exedra cetaceans adducing photos alkalizes fulfills grouchiest sextuply brailing demonise imburse fidelities snappers alimentation pontifically anginal reigns disorienting ultraconservative porkies honeybees arse pressurized tossing reaches punier thrivers assuring circularly reedier courthouses gramarye succours charminger shallowest glimpsing chrysanthemums unemancipated cosponsorship skeletally instanced syren projectionist gerontologist ostracods lodges sodas effable datcha weathering vented kennelled tritest chino coldly freaked kidnaper characterless coshed struts angularities highhandedness strings gaiters galling fuller flexions expends illustrators juster"@en ; + bsbm:rating3 "7"^^xsd:integer ; + bsbm:rating4 "9"^^xsd:integer ; + bsbm:reviewDate "2007-09-30T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-02-19"^^xsd:date . +dataFromRatingSite1:Review12 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product29 ; + rev:reviewer dataFromRatingSite1:Reviewer1 ; + dc:title "diamonds solacers periscopes redacted harborer aleutians bobsledders amulets junket whelping redivide smiting rechristen" ; + rev:text "porkpies crocking chiselling strummers counterclaimed bloodfin fonts werwolf heritors potman compatibles pennyweights ambled permanence plumber testatum rodders furiously lecturing deerweeds mineralize scallion succorers stubbiness poems frontally begorra vindication wretches cyanoacrylate swifters misfortune prefabricates walruses coexisted wonderlands neurone coalhole boomeranging donjon cockscomb denotive unvanquishable pronating designations semivoluntary surrealist toked ultramicrotome freaked inventoried proprioceptor mismanagement olla battings locksmiths unstrap resubscribing compensates disposing calibrator whiling grantees marinates bricktop understood cyanosed baldly babied leapers challenges clusters calcitic sprinkled nebraskan slinkily liturgists kappas requirer pinochles unleveling supersaturation reattain stoning shoshonis weightless permissable nuder cymbaler stewardship unspecified raceways unaired remarries lichens quarterstaves onenesses imputer detonating hillbillies responds"@en ; + bsbm:rating1 "1"^^xsd:integer ; + bsbm:rating2 "10"^^xsd:integer ; + bsbm:reviewDate "2007-11-21T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-01-01"^^xsd:date . +dataFromRatingSite1:Review13 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product79 ; + rev:reviewer dataFromRatingSite1:Reviewer1 ; + dc:title "spinnies fisher wineskins arizonians robustly nosily figurativeness" ; + rev:text "weighters insurants offcut darkness hoper underpayment cardiographies subdisciplines aptness confederacies cushiness kidskin merchandised vanmen clannishness shebeens footgears rebecks deepness ductility equators deranged mintiest rumoring podiums tankage insurgencies curler testimonials preselected unrepentant nationalized triadics clambering paraffins denoting galluses congoes millipedes laxest ineligibility sharpie workroom djinny cumquats heartworm jaggedly gateless eventualities winched sirocco roughnesses peculates beans preestimates noninterfaced centile skyrockets oozier meetly overgeneralizing inaudibility reparable carat coenact aquatint plumpened sprawls morassy draggled acerbates ringers sneerful subscripting pursily flamed dispossessed establisher ripples unsurveyed fowler kansans palavered archdukes geed outhouse submarginal shimmies unstably multiplier brogues healthfully numbskull subcompacts russians lineages opaquest bluntness avoidances disgracer facies bravers latitudinarian objurgates reagents sacrilegiousness rummaged pacifically intermarry adduceable supremer remonetizing perviousness arbitrations underclothes adolescence ions displeases inserters grained nonsecular implacability dereliction filarees blinkering shifters fauvists flowmeter gonococcal athenaeums pharisees bathyscaphes intravenous riggings nodder charminger upsending hidalgos describable thwacks antibusing mouldings semirigid crusader bonhomie chaucerian armonica snorkeled tackifies entailments volleying exempting teabowl figuratively prewashed factotums strayed lingier climbers habituates monophonically amahs pilotage photomicrographic tocsins elations tablas amortizement wickers expiring rioters embroiled supererogatory troweler snapshots featly unhygienic hetero reimburses panting majuscule"@en ; + bsbm:rating1 "5"^^xsd:integer ; + bsbm:rating2 "7"^^xsd:integer ; + bsbm:rating3 "10"^^xsd:integer ; + bsbm:rating4 "7"^^xsd:integer ; + bsbm:reviewDate "2008-04-04T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-17"^^xsd:date . +dataFromRatingSite1:Review14 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product24 ; + rev:reviewer dataFromRatingSite1:Reviewer1 ; + dc:title "plumpening manifesto indisposed fulminant reusing reinscribing oversimple cogitates metatarsally bewilderingly ammonoid biform setter" ; + rev:text "bluffed overstating hoorahed unjustness replies nonconsumption undermanned extranuclear howler fissioning intertidal fellowly lewises subdistinctions lemony mufti noncorroding reaccepted physiognomical popcorns energizer urgently tungstens reservations purloining vaporizing rabidities subjugate oubliette openheartedness refocussed doormat untempting truanted andantino undecayed homogenizes frenetics carping silents miraculousness appaloosa shoplifting rottenness eudaemons invited varicose militarize stodginess cynosures restart schmaltzier odored precedence deicide reveilles intoxicated fearer overprints crumbly speleologists tost embezzlement unflavored feeblish refund exclusiveness suavities pawnor paralyses orderliness tictocs nudnicks restfully tawdrier durances solvencies abstracted elusiveness powerplants bespatters eyeshot tons levier insanity tilter abnormality beslime colonelship bindable caudillo violable attitudinize premisses unqualified probability parrakeets lignites exploiters duped tagalogs wagons splayfoot horas scratchier praiseworthiness neighborhoods unresentfully pitiers dragonflies unesthetic bestirs confirmable paprikas decimalized totemist ridded dogcarts floridly attitudinizes kindhearted recrossed simulcasts septuplet meretriciously technologies proofer associations peafowls whistling pawns noneffective holstered yeggs shatters mattings extraterritorial flushable cyclically mammography autogiros knave moronically fungicidal disarranged cozeys giggly unplayable manubriums hydrogenation poppa pipetting inexplicably entree diverging choler badmouthing nonaffilliated ruers soupier beekeepers anteceded munchies hempen cranes tanzanian phantasms tipplers braggarts meta floorboards pipetted refuelling acquiesence joie microscopical pickaninny vinaigrettes supplier whiner contempts inflexibleness"@en ; + bsbm:rating1 "9"^^xsd:integer ; + bsbm:rating2 "7"^^xsd:integer ; + bsbm:rating3 "6"^^xsd:integer ; + bsbm:rating4 "6"^^xsd:integer ; + bsbm:reviewDate "2007-12-31T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-03-26"^^xsd:date . +dataFromRatingSite1:Review15 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product45 ; + rev:reviewer dataFromRatingSite1:Reviewer1 ; + dc:title "charing bluebells nettler keratins inching fomentation parasitism rhinitis yclept" ; + rev:text "coursings overscrupulously noxiously whoreson leptonic whirly contrariness unadvertised ferniest presumer sensually corer slipslop shillelagh sledders urbanism reginal abstrusest tabby sojourner induration secludedness numbness unhealthier rinser imparting overeducated sieves episodes fieriness yeggman stillbirths stockpots mows undemonstrably attaining centaury jaggedest internist tzardom oozes fisheyes flitter lingas minesweepers besieging fickleness seine reefed catatonics semiagricultural forelands richest centralize abrupter tackles criminology intercollegiate lotions polymorphism subjectively slithering deices blueings skidooing abrader macrons convoking freshest benzines quahogs confluences dosing tooters mameyes articulates jiggered reiterate spelunk laying senoritas carbonates priciest annunciation grafts simonizing baseborn occlusal reentries realign pinole reframe devourers rustiest rive interfaith midmonths gyroscopes steadfastness establisher laggards chutzpa magneton tbs legally avitaminoses demurrages primos quartermasters criticalness unentered secundogeniture settles priestesses reshipped requirements serviceably bunting proofed wiped mudlarks assemblyman moronisms lamebrain restructuring exhibiters nailer millipedes profiteers punier boer colluder"@en ; + bsbm:rating1 "4"^^xsd:integer ; + bsbm:rating2 "10"^^xsd:integer ; + bsbm:rating3 "10"^^xsd:integer ; + bsbm:rating4 "3"^^xsd:integer ; + bsbm:reviewDate "2008-05-13T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-16"^^xsd:date . +dataFromRatingSite1:Reviewer2 + rdf:type foaf:Person ; + foaf:name "Eyana-Aurelianus" ; + foaf:mbox_sha1sum "df1cf8e68d49e5b65f1507dbecec6b61e9dc98" ; + bsbm:country ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-08-07"^^xsd:date . +dataFromRatingSite1:Review16 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product30 ; + rev:reviewer dataFromRatingSite1:Reviewer2 ; + dc:title "assesses flunkeys outgrowths mousses hamsters" ; + rev:text "recrossing rudely ramie splattered wharfing nog supercargos imperfectness mobber wanning fledges crustacea wreckful tauruses slackest awning deliciously storewide subtotal unslaked rookeries aggrandizements eyeshots partied beckoner declined refinishes unseating echoey risottos phaetons munster inverts stubbles heterotic barbarizing trends skiddooed outswam bedchairs patency outbids wigless abuser shew shrugged panhandlers geoducks discoblastic baptized beavering retitle burlaps pittance induces vindicators gripey spiraled microbiologic levants vervets reverters subrules dp soldering cree councilor tackiest"@ja ; + bsbm:rating1 "9"^^xsd:integer ; + bsbm:rating2 "8"^^xsd:integer ; + bsbm:rating3 "10"^^xsd:integer ; + bsbm:rating4 "7"^^xsd:integer ; + bsbm:reviewDate "2007-07-03T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2007-08-15"^^xsd:date . +dataFromRatingSite1:Review17 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product56 ; + rev:reviewer dataFromRatingSite1:Reviewer2 ; + dc:title "erosivity reeds cloakrooms largess brewer occupative gimmicky marshier fainting inexcusableness fullface reinfect ballistician" ; + rev:text "scrappy orangey euthenics porches melanesians hemoglobinic horribleness strangely repellers disillusionments smartingly burbling palavers swathes technocrats formerly jerrycans inferable enjoy overcooks unsurpassable strudels vivaria deepeners benefiting earns ropewalk motlier ileitis chaperons debauches remortgaging finishing caucused strew tokenize bleakest hatters repaired disunities maledictory councils carbides painter abbreviator overrating blini absolutist skittery unchain impends roomettes tawniest junctures dialings perfections phonos boney maharanee homecomings halitosis orderliness excellently embezzler shekels permanencies campagne unsold ethicians indowed provisos unreadiest shat terseness proctoscopes suffixing vernacularly mastless revivalist nonabsorbent tutoring spoilages overdeveloped pas poorhouse razoring reprogrammed educates penholder pectins elaborating lores bordellos sudsier closets asked doorsills tumblings factors reallotment nimbuses destain addictions jeers probated penname caponize blockbusting delegalizing sprier deash ligamentous spadices duenna inductively unships mangers varietals improvisors apelike zymolysis blurriest nonunionist eastings faithlessly reddening moulting mazing perinea repayment terrorizing reboils columbian spalled containment thiabendazole snots bruskest coatrooms amputees ophthalmologically semiformed deices undercook stewardship sloughed impoundable requisitely nearness traditionalism effluviums plotter blackmailers deemed korsakoff trundler vaccinal swishing gooier tapping simoniac gimmicks imaging comebacks chorusses bluepoint zincing prosthetically lithologic reproductions rinses ukelele acuter disinheritances interprofessional brainpans balustrades puree coddler healable stemmier defrosted"@ja ; + bsbm:rating1 "10"^^xsd:integer ; + bsbm:rating2 "9"^^xsd:integer ; + bsbm:rating3 "3"^^xsd:integer ; + bsbm:rating4 "1"^^xsd:integer ; + bsbm:reviewDate "2008-03-14T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-27"^^xsd:date . +dataFromRatingSite1:Review18 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product33 ; + rev:reviewer dataFromRatingSite1:Reviewer2 ; + dc:title "notarial detaining apostrophized teabowl swinger comminute miscalculation arums peewits sands demarking lonesomely bloodying" ; + rev:text "libelists kedging authorization studhorses ejected helpable kitsch centralists colorists reply oversevere mignonne irreproachably botanizes pipetted boilers buoyancy claying difference dhotis perforates volute notarizes obstructors reheater preaccepting lambie fragrancy requestor cannonades proceeded starring chapels claudius overanalyze sheafed reaccused movingly rotifer shogunal precognitive feathers disputation hp accomplishing bedraggled famines kappas handouts inbreathe improver stepbrothers cowpunchers visaed spoofing exigence bequeathing auscultation pillars kithing unloosens mirabile logrolled woodsier orth mahjongs bucolically repins americanized broths bombs repowering greenhorn modestly frighteningly grapplers fatsoes bedcovers thermometrically mungoose reanalyses handbarrows tatar freethinking seguing aerodrome activated discing shortcomings galloot perilunes bearers asserted bedecked amicableness adhered apocalyptically housesitting coatings vocations inflations unbiasedly ripsaw yew odometers bundles cloturing tincts coyotes mistaker curls titillation reproduces debaucher intended spellers contrasting heathy slipovers maxwells hardwired frontages herpetologists fathoms vacationing solidarities proctoscopies digestors frugs confectioneries directly nightmen spicers freakily roars intercommunicating propanol incommensurately suburban tatting preboiling interdependency kinesics fagot scrabbler viers ravishing trophism irrigates debitable pulsing moneymakers"@ja ; + bsbm:rating1 "3"^^xsd:integer ; + bsbm:rating2 "7"^^xsd:integer ; + bsbm:rating4 "3"^^xsd:integer ; + bsbm:reviewDate "2008-02-08T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-03-25"^^xsd:date . +dataFromRatingSite1:Review19 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product29 ; + rev:reviewer dataFromRatingSite1:Reviewer2 ; + dc:title "avion phenylketonuric disinheritance windlass socialites navahos" ; + rev:text "closed submittance gauntries scrawlers needless bathhouses peroxides bargains zirconic menstruation accusing predating dollars jonahs surfings timeworks craniums monocellular consorts assailing babul fooleries classicists verbless grandnieces antepenultimate digesting scampish benignant paltering bowery sinewed emeries noncumulative gillers gaieties hovels promisees construing hawses glassier armies ceremonialists traduced hotchpotch staphylococcemic calcaria interceptions ingenues childbed mortising profanes prescriber piers futility flawy crayfishes international inconceivabilities theatre replicated fellowly approbations spurred scorner piercers unfearing pardoners tapster bartletts blunging capacitating friendless darting civilize quakily rafting watchmaker magnific curlicuing unscientifically quarrelled exonerated flummoxed tolls ethnoses alated maquettes duds angas bwanas unrespectful assumptive cades tooters spondaic lamping cubicity squarer harvestable influenceabilities keynoted luncheonettes backsaws priests rad prepacked touzled cobber repetitiveness foreshadowing prearranged shortsightedness regretters regnum outplay facelifts ambulating strobilization corbeled costumes cellblocks peristylar remains daystar watchmakers gargoyle fulminant"@ja ; + bsbm:rating1 "9"^^xsd:integer ; + bsbm:rating2 "4"^^xsd:integer ; + bsbm:rating3 "3"^^xsd:integer ; + bsbm:rating4 "4"^^xsd:integer ; + bsbm:reviewDate "2007-08-17T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-02-06"^^xsd:date . +dataFromRatingSite1:Review20 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product40 ; + rev:reviewer dataFromRatingSite1:Reviewer2 ; + dc:title "chessboard inarm lignitic answerer bermudian chaffinches selfless misapply conquering heftiest environmental unsoundness" ; + rev:text "transistorizing irreversibly lowbrows counterbalanced preaffirming drizzlier capitulates caravels visiter integumentary thriver disable heritor squawking cordovan patrimonium valor bootlicks captions bouillon touchier enactive blimpish waddied escheated myope bounding phaseout archimandrite fattier carboras unidentifiable estonian stonily psychosexually scummy nationalized ultraconservative lasagnes buttercups dividable spookily nudniks musketeers wooshes neatens ennoblers zoologic deux moonward parasitizes institutionalize waverer eyefuls anastomoses afternoons sageness constitutions beadroll fascination cableways sheepishness charred snuffler filmiest wintertide binned redraws ferocities conspires abiotic patties krills misbehaving cadgers dottiest responses pugilism bonhomies omnium habitancies morons handgrip quatre papuans tycoons crockeries tallier penuches snowflakes trekkers glitters spiritualized meanly redemonstration gruffy unavenged disport teratologies unforgiving mongers conjunctival squalled prepossessingly nonconductor completions parts unpenetrated fractured bassoonist decently stickiest scoundrelly refortifying paradoxical mongst grudges coaxing seined offered humaneness pithiest doughier landfills uttering pennames ensnaring poky abdicated twitching establishments bilks tamed mainstays cumquats ambidexter returnee ambulated mainmast reassemblies ineluctably fairings inferrible retrimmed heartrending imprisonments unabsentmindedness captans keeps smuts perambulates shojis icebreaker addedly payout"@ja ; + bsbm:rating1 "6"^^xsd:integer ; + bsbm:rating3 "3"^^xsd:integer ; + bsbm:reviewDate "2007-11-12T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-13"^^xsd:date . +dataFromRatingSite1:Review21 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product71 ; + rev:reviewer dataFromRatingSite1:Reviewer2 ; + dc:title "undetached buggeries kludge peeve moonshot decongestants schmo drapes ens cataclysmal craggier" ; + rev:text "trows nonallergenic habituation chanty travelable accelerator cubist watched extremest hypocritically withered forecasters foremanship abashes sophistries weakest mints drapeable flambee hayrack bayberries dowses picoseconds unshaken paralyzation audaciously swigged postponed frenzying polytheistic convincer reinvestigate tidings pledged skeltering authoritarianisms surreptitiousness wettest minoring stated hooey necked gubernative withier outspelled phonoreception soapbark appropriating exasperation inkers retractile enrollment circularizers horrific recirculations somnolencies explorers hourglasses corroders reanimating genres excavators rebuking golgothas riblet quints tallows seawards afterpotential fatalisms accusatrix wingspreads hadronic shoved nonalcoholic heptameters edifying gangly buckbeans breeching stockman portrays hypersexuality letterpress beetroot waterfowls stealthier woodcutters summing falsifier wallflower clanged expunger ureter heeling lightweights ironist fatality groats accrued preppies scaped berthed deductibles evener lottos fauves worldliest tattered delays tartness profilers confusing jocundly riles feuded unities tollbooth institutors laxness feist moldered baal fertilizable improvisor enamors knucklebones digestibility outgun sidling polyps skimped latino hideaways"@ja ; + bsbm:rating1 "2"^^xsd:integer ; + bsbm:rating2 "6"^^xsd:integer ; + bsbm:rating3 "5"^^xsd:integer ; + bsbm:reviewDate "2007-07-24T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-02-01"^^xsd:date . +dataFromRatingSite1:Review22 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product73 ; + rev:reviewer dataFromRatingSite1:Reviewer2 ; + dc:title "warfarins passageways ghettoizes sloops dozer unmade frisker overdrawing provably kicky" ; + rev:text "manges apaches microzoon mastiffs fireplugs intonations superchargers entailing interdictor chandlery minibikes oddity circularly inviting playacting phooey color repulsing dehumanizing contouring satinwood obscurer gazetteers malingered friskers premixing bibliotherapy unscreened applicability calibers blooped overembellished disuse pyorrhoea signalled alternates yoicks resoundingly citifies frocked breakfront orisons streamed stopping fertilize vacillation insuperably coexisted extinguishable beatified irides dispossesses huskings electrodes coatracks bulges fitnesses borstal youngers nuts baggier luxuriating partisans mollifies heroines spoilsport earthily handlings garnering outdoors sergeantship pedicurists holiness chromospheric snippers unpinning closefitting antipyretic reiterations bulbar collaborator sulphured fullest bivalencies assiduously varicosities retransferring override reglazed shuteyes steroids teasers stinger archiepiscopal hopsacking discontents breakpoints converses obliviously hoaxing fumbling mouthiest mealybug sorrier gestural mossed saucers penults embolization trespassory reportable translator hulas precedable wrecked flied pails aromatize confiscates desensitization wardens inquisitorial kitsch pailfuls pockmarks senatorian influxes cadencies needling felly fleecers gratefully imbedding dissimilarities shellfire"@ja ; + bsbm:rating1 "7"^^xsd:integer ; + bsbm:rating2 "8"^^xsd:integer ; + bsbm:reviewDate "2008-05-28T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-14"^^xsd:date . +dataFromRatingSite1:Review23 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product26 ; + rev:reviewer dataFromRatingSite1:Reviewer2 ; + dc:title "checkerboards rakers albuminous extemporaneously homiest phew heavies" ; + rev:text "multifactorial rumrunning seizers falters borderings downcourt phenols bossisms damagingly dumpcarts boosts rewarms brunts published kitting extensors monocrat presifted armor puce concurrence sceptered decemvir dangerously hybrids rebidding observed starvelings dynode flowingly sodomite washer savages miniaturized loungers ascending solubilization joshes didacticism edemata tractate celadon russified shavable vivifier plurals ridges twingeing filings accorded intelligences sprinters perfectly beadwork existentialist spleenier twangiest whipsawn haggling twangy swashing unevener tearjerker castrator converted cliffhanger carryalls oxblood dentines multilateral grantable tougher doyly melodeon citizens unexecuted vivisectional womenfolk nympholepsies nettably sovrans currier hollered stainless yearning anticlinal snaps trappers unendingly safeguarded isomerizing cherubically djinny unlatching kike mooing anthers tribunes trueborn insalivation unmade contradictorily facies pranked throating amplifiable domineering pima journalize"@ja ; + bsbm:rating1 "4"^^xsd:integer ; + bsbm:rating3 "10"^^xsd:integer ; + bsbm:reviewDate "2008-06-04T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-12"^^xsd:date . +dataFromRatingSite1:Review24 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product84 ; + rev:reviewer dataFromRatingSite1:Reviewer2 ; + dc:title "primero limelights stripteasing hypnotist sequestrated catwalk psychotoxic moats posturing incompliant richens impalement sludgiest alecs folderols" ; + rev:text "tzetzes xerophyte beholder awaking vitiating bangers trawled authorize grumpier shadowing authoritatively sniffling newsworthiness squelching levelheaded obstreperously obliterated usefulness dupery fatties niobiums hennaing conjunctivitis deplanes caponize microstructure rigmaroles nonexportable condensates neanderthals variableness permeations rhinitis placoid holloaing greeneries riflers jerks whackers helped inferiorities bucklers centralest turnkeys impulsions retelling challenges echolalia sashaying chaperonage hairstreak intermingles tenderloins matzoh rescuers greediness antidepressants woodworks bloodmobile eclampsia emulates tamarinds spooned whipper campiest maxicoats unsticking touzle outpaces attachable whalebone saggier misalphabetizing soleplate deadens federatively cemetaries ambuscades gorses evadable cardamons cheerlessly constrictive bloaters sputterer crawly regulatable mahonia japery"@ja ; + bsbm:rating1 "5"^^xsd:integer ; + bsbm:rating2 "10"^^xsd:integer ; + bsbm:reviewDate "2008-01-14T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-01-16"^^xsd:date . +dataFromRatingSite1:Review25 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product26 ; + rev:reviewer dataFromRatingSite1:Reviewer2 ; + dc:title "ethenes minuets semisatirically dependableness rapacity vaulters telephotograph savagisms deadfalls cyclotrons crispiness completest" ; + rev:text "reaccompanies appears cubing mesdemoiselles nannie nonhabituating mantelpieces testee flappy aftershaves finalizes esthetics inflectional fendered presagers moonshiner epithets ovulates baptised praetors irrevocably traipsing talkiest ploughman dialyzed headsets joyfulness unsympathetically lownesses vultures reargues subs depositing decayedness misfiled cockleshells duchy rainmaker cringles inquisitiveness bursting bagpipes recompiled internalize cylinders motioning sepulchre tremendousness tradeoffs mistrals genuflections clods outargue asininely adopting patronizing divulges equitant embodier chields ossuaries infringes formally damages limbers bungholes recon reshipment autobiographer unchilled clumsier catfishes greatens drapers soother deterged decriminalize sorriness lithuanians jacaranda haughtily allergist tinkliest wobblier syllabuses ricksha greasiest shipowner claxon happiest astrobiologically ambivalently jimminy narwals thirstiest movableness timesharing rerolls fits deviation expungers hydrologists skillfulness jailing mexicans ionize inductions generatively infidelities ignoring heydey sidlers insemination manicure applicators nonenforceable rehiring remunerates packer glorification soothes skiable satires affixal plaintiffs civilizations cupsful rideable whimsical decommissioning repaving cannoned spotlights muser pommeled alchymies exciter luringly outlook roped conchoid rescript preconditions underflow floatages resurgences mordants indefensibility fluctuational toning unshamed differentially outmaneuvered busboys jabbingly diphtheritic tov wrists bryony greasewood invulnerability activators buckram pineries shacking prostatectomies respirability bamboozle forwarder nautili enticement airproofed matchmakers winningly haranguer heroinism lampooner improvisational misconceptions indwelt fetching serviceability reheaters bristling wiretaps jaywalking plenties comprehendible influxes maternities autogenetic inauspiciousness forehand sideswiping"@ja ; + bsbm:rating1 "5"^^xsd:integer ; + bsbm:rating2 "2"^^xsd:integer ; + bsbm:rating3 "9"^^xsd:integer ; + bsbm:reviewDate "2008-03-14T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-04-19"^^xsd:date . +dataFromRatingSite1:Review26 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product41 ; + rev:reviewer dataFromRatingSite1:Reviewer2 ; + dc:title "nummular alliterations incredulously canebrakes textures frescoers tardo unnaturalness relinquishers spoused truthfulness feverfews bumboats integumentary" ; + rev:text "snobbily duping winnowers merchantry registerer dactyls importantly anticly sizing opining unfitted constructively encircle drugmaker egoisms tsktsked ultimateness agonises heavily prestos ceaselessly heavers nummary beefed cays angiosperms cantankerously heelless jetsam frowning hoppers tzars thuggees rumblings oppositeness costlier phonologists agglomerating intervenes uncompromising cunnilingus baldness overhear singlehandedly numerated gras manx osculates appellors teasingly spanks torii navigational commutators inadmissability jilted misruling bricklayers clumpy pettiest echoism bodyworks barbels descried fatuousness magistral pensees disagrees gunshots mikados forged lacey clarion garlicky gloats alienabilities sliceable goodwives tilters sagebrushes handball flutterers discharging tensed cleopatra misericordia codlings armors microscopist onefold relettering remortgaging underofficial nim claudius familiarizes bisexed dovetailed jars milkers textually intestines lardiest commerced pustule whimsically brainpan seducible spiritless iniquities deadlier sheafing mosquitoes redelivering confiscations humpy connective syndicated petitions currier resituate dusks envoys proclaimers bizarreness venturesomely observational mayan depersonalizes pinfolding penalties tanged genetics lactovegetarian burglarizing"@ja ; + bsbm:rating1 "5"^^xsd:integer ; + bsbm:rating2 "9"^^xsd:integer ; + bsbm:rating3 "6"^^xsd:integer ; + bsbm:rating4 "10"^^xsd:integer ; + bsbm:reviewDate "2007-11-27T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-04-07"^^xsd:date . +dataFromRatingSite1:Review27 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product18 ; + rev:reviewer dataFromRatingSite1:Reviewer2 ; + dc:title "defoamed paddocking supplementarily stoplight remediless intergalactic reverses pailful polytheism redescribed palpal caboodle visas cozeys" ; + rev:text "recriminator deforms viscounts days facilitation pursued peon strapping doubter hospitalizing zooming temporarily paragoning lawlessly yay fourposter paresis lantanas deliberated loyalness mackinaws repave kolinsky cupholder recross whippings inpatients unended suspensive ebonite gelatinize rosettes inflects resorted bountifulness affiliating masseuse unshakable breakups canneries swigs ossifies disconnect treacherousness mavericks lyrically desalter dialectal primogeniture seclusionist glaucomatous footlessness anglicans philadelphians rousers woodworm frothiest overspreading jerseyites toneless brachial blinkering vibrations weens avenues leos adds leary impartially cognising tamed asst stitched zincite embassies ballistics styed wellheads tremendously riflers avoirdupois tenser aviator weskit fireworms inconsiderately presentations milestones headways cichlid chimneys bedrail splotches sits preachiest entitled microcopy pauperize schismatics touche chipper appreciation frescoers corpuscles cauls proselytize enhancing semiresolute midis wanderlust piggishness prematurities narcotized brickle nebulizers powwowed guides ventrally growly critics nominating beseecher decennials insulars reordering obovoid catafalques fundament germy fatalities relaxer pollinators volute howling showered governableness prepunch hydrocephali salinity transfixes impeachable flittered linefeed demobilizing unextinguished inarm bookkeeper mannikin spoiled arythmia presumptuously cozes accumulated nullities conga tonsured"@ja ; + bsbm:rating1 "1"^^xsd:integer ; + bsbm:rating3 "8"^^xsd:integer ; + bsbm:rating4 "3"^^xsd:integer ; + bsbm:reviewDate "2008-03-07T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-04-07"^^xsd:date . +dataFromRatingSite1:Review28 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product21 ; + rev:reviewer dataFromRatingSite1:Reviewer2 ; + dc:title "impalements ambivalently overprotect disrupts vitalisms liberals sirs outspelling planaria timely multifaced furcated syncopes larboards" ; + rev:text "forbearer insulars ledgy shammies talmudist allergology archaisms reprinting alternately subtrahends cents welds moolah exonerating retractions pulques cabals thoued throwaways dramatized saltboxes heifers mastheads freckly turgors dedicator registrability skeined emanation nepotism sherd shinsplints uncorrupted electrophorese couldst afrit atwitter diggings stereotypers dichotic anisette appetizing eviction hornpipe playsuit wainscotting legs flinting veniremen thorp presiders letups orchestrations futurologist airbills fantails etheric lubricated panderers desalinize lilies cassabas shows windpipes preheated tubal outbidden farthings forspent doomful forwardsearch maroons juicing reorganization circularizers hards subagent figurer clericalism bandaged hemisection ungovernable marihuana legislatorial manufacturers handicrafts forebodies pecks clevis nippiest recapitulation kibitzes keepsake faithed trampled cupronickel salmonellas crucifies dakoit hardwares shirtiest baulking procreators stockpots abstractly loneliest hibernators unknowing finitely telepathies loaners untidiest talers wearies togged broaches demobbed hymned bulldozes palish entailments semidesert outclass quilter easting subtropical roaching virologies recapitulate byre inoculative satinwood attractive apian"@ja ; + bsbm:rating2 "3"^^xsd:integer ; + bsbm:rating3 "3"^^xsd:integer ; + bsbm:rating4 "7"^^xsd:integer ; + bsbm:reviewDate "2007-10-10T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2007-11-16"^^xsd:date . +dataFromRatingSite1:Review29 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product35 ; + rev:reviewer dataFromRatingSite1:Reviewer2 ; + dc:title "troupes annulments translated psychologizing offeror" ; + rev:text "hydration valorizing evolving debouching ryas indecently distasting looser calms abortive choppily mopey pseudophilosophical undramatic jeepers moronism rumbling async trainees ceriphs pineries spectroscopist believability denicotinized oversee katabolism worriment plinker aligner assertors auricles vindicates renewer newsbreak airdropped killjoys gesticulated brioches noninformatively droppings reassuring paned professionals polarization anywise inlanders reinvigoration flabbier overprotected waddings executory hermetical honers outdodge estrogen reallotment wingover wonton sidepiece spelunker subconscious regicides ministrations rejoin reconvey disparagement preallots jabot reissuer polarimetries kuchen smasher preclusion combustibility murmurers tethers shit"@ja ; + bsbm:rating1 "7"^^xsd:integer ; + bsbm:rating3 "2"^^xsd:integer ; + bsbm:rating4 "2"^^xsd:integer ; + bsbm:reviewDate "2007-10-28T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-03-25"^^xsd:date . +dataFromRatingSite1:Reviewer3 + rdf:type foaf:Person ; + foaf:name "Danijela-Adalbrand" ; + foaf:mbox_sha1sum "9b9d4b8dcf7ada3c181b4bed1fa3c53d29caf65" ; + bsbm:country ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-07-21"^^xsd:date . +dataFromRatingSite1:Review30 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product73 ; + rev:reviewer dataFromRatingSite1:Reviewer3 ; + dc:title "possets hectograms pratiques outgrew painlessness reals deified suppliable ionize unlimbered" ; + rev:text "smoothness traumatized sullenest audited accented shoed vulgarest uncourageous transposed mullioning rheums snazziest busied wainscoting excising ruder outguess bumping rightfully maceraters dulcify poltergeist weepier affiliation warted ecstatically meliorates toxical recover ejectable enounced distorts unbridles reburying exegeses lowbred repossessing knishes prognosticates brainwashed coarsening megapod trainers falsies diverticulum snailed disbelieves liverwurst glorified calculabilities damming immorally substratums putrefy impacted abbacy poised codification amorously confederates bigamists flagstones prickled extraterritoriality crackliest foreclosures peyotyls prefixions crisic stipes squiggly tarnishes vetoed"@en ; + bsbm:rating2 "9"^^xsd:integer ; + bsbm:reviewDate "2007-07-07T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-02-18"^^xsd:date . +dataFromRatingSite1:Review31 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product49 ; + rev:reviewer dataFromRatingSite1:Reviewer3 ; + dc:title "chanceries scintillated bider ethicalness grindings" ; + rev:text "defeaters ceramicists potherbs frizzer chicle refinishes pronouncing natl standardized zincking fornicators woodbox creasing ternaries flagellating flattered bawls bylaws cohorts ironclads idealizes chiles poundages beshrews proceeder predicates hibernating brasher occulter stovepipes yerbas allopathy yanqui electrum trollings mer braincase puffily crafted stargazing perambulation hopsack decimeters underpin depletes ugandan emborders osteoscleroses hebraizes animalcule rustlers mouthers rideable peppered nonconclusive hardstand insusceptibility amahs lecturing pees affixing subendorsing teabowl snuffler crosspatch complexities durning impoverishment triumphs scapes nonconcurrence comradely collectivize veers emulsified adjourned beckoner goldest deoxygenating diffusing strumpets bejewelling heros bowled bulletins cambered capelets"@en ; + bsbm:rating1 "10"^^xsd:integer ; + bsbm:rating2 "4"^^xsd:integer ; + bsbm:rating3 "1"^^xsd:integer ; + bsbm:rating4 "5"^^xsd:integer ; + bsbm:reviewDate "2008-02-02T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-02-03"^^xsd:date . +dataFromRatingSite1:Review32 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product68 ; + rev:reviewer dataFromRatingSite1:Reviewer3 ; + dc:title "innovating gabfests preregistering humanest dryadic" ; + rev:text "nonconforming hazards unimaginable gripsack refuelled tickler unknowing digestively madnesses punishability hornless vented conundrums lyrist pshaws bedraggles bisulfide graffiti pushpins hematologies hagriding handcar interposed blouses banned spelt girls maxillary cleanness toolbox retrogressed preinstructing inhaled frizzing tuners verticality gunning hemstitches weltering wharfing crucialness meliorative antecede couthest oinks azote pothooks cautioner borons thickset visionaries irrevocability synaptically stealths khanate outshone cakier surpassed donationes baldish gigues unanimously funereally nereis bottled woodsiest snicked fuds sessile accordance combo flutist uneven valancing lysed mermaids fulgurate outlet disjuncts irritabilities calamitously whishing heals purifiers ricocheting unraveling acumens neurologist ureas muscled profoundly poteen rippers unspent recreations lobotomies observational lycees deair faying outperforming deflagrations pasteurizing browning forewoman nonperformance impercipient defames dereliction shortsightedly defamations spas enplane spinsterhood reechoed uncomfortableness flounderingly decedents liker hottish yogini scrappiest booklore fumigated acidheads fumers plosive sensuality talcs weeder histologists oncological lithuanian starchiness percolating vacationed endearingly reliers impatiently californian academias flatcars impreciseness peonisms treated ploughman teratologic dayroom pock overrefinement greenishness variants bloodstreams reascending helloed uncheerfully aspic tubbed sequenced anonyma easterner normals vocalities disarmer discharging increasingly ensphered fleabite visitress wayfarings lassos switchyard unfortunateness lunk chilliest unsaved stemmy arborist unconvertible obovoid athletically instances odoriferously spinally roils tortrix spelunker worshiper photographic roundups latecomers psychoneurotic ambients nosed shysters gaels fiscals scandalizer interleaved lighthouses"@en ; + bsbm:rating1 "8"^^xsd:integer ; + bsbm:rating2 "4"^^xsd:integer ; + bsbm:rating4 "2"^^xsd:integer ; + bsbm:reviewDate "2008-01-18T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-12"^^xsd:date . +dataFromRatingSite1:Review33 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product40 ; + rev:reviewer dataFromRatingSite1:Reviewer3 ; + dc:title "sacks delinquently anthologize porticoed groggery" ; + rev:text "elating hierarchism hedgehopper rexes taboret accusable reconsecration rescissions cantinas relied adulterers moistest disarticulation kabbalah waspishly labourers benisons doeth mooting knackery reinducted urchins riyals dotted teetotum decrepit sanctifier ideo alarming envisaging demimondain interpreting fixtures entering segmentary franchises fermentations polymaths interrogations vested kowtowing arborvitae durum stoops bluepoint microtome obtained unpopulated cutey living utahans"@en ; + bsbm:rating1 "4"^^xsd:integer ; + bsbm:rating3 "9"^^xsd:integer ; + bsbm:reviewDate "2007-07-13T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2007-09-17"^^xsd:date . +dataFromRatingSite1:Review34 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product50 ; + rev:reviewer dataFromRatingSite1:Reviewer3 ; + dc:title "ovally dentin entrees circuital ergonomics imago ribby bombasts reinfection jinni" ; + rev:text "clonking semitraditional ecologies quartan loots finnmarks flocked outfielder unbelief pointlessly serges shrewdest eviction reseat underprice capillaries frilliness electrically sower yardages incumbently roughhewed linkers recessiveness crisply expurgated typification subrace disassociating tunney thermodynamically handcraft shoshone bruin dissimilarities collusive slushiest lieder hacking stickouts notarizations counterplot repeatability excitors parroter dastardly refries marvelousness alternately subminiaturized quadrenniums beneficently mashed chams shalt befitted defining purificatory rooters catnap taillights voucherable misusing bibbs factotums interiors salmonellas auxins moiled prevalence circulative capelets discoveries ventriloquism galleons revolutionized stoutest truckers huger chirographers picturephone preconsideration screeched standishes drooling liftmen dwellers lowboys powerfully gags laciness sphincteral"@en ; + bsbm:rating1 "5"^^xsd:integer ; + bsbm:rating2 "6"^^xsd:integer ; + bsbm:rating3 "7"^^xsd:integer ; + bsbm:rating4 "2"^^xsd:integer ; + bsbm:reviewDate "2007-12-28T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-01-17"^^xsd:date . +dataFromRatingSite1:Review35 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product36 ; + rev:reviewer dataFromRatingSite1:Reviewer3 ; + dc:title "taphouses thermites raveling aphorizing unmarried debarment cardiectomy misconstrue subtended ped applauders nourishment complimented flyblows" ; + rev:text "christians yaws outbalance congruous saucerize disability cembalos luggers koalas flamines slummiest families piecrusts misaim titles sentimentality tapholes surmises isling koruny contemporaneously weirdest microscopist scientists slavishness broiling troys anodynic potties immunologist vamped daphnias scurfiest calendaring sacrums subjugated antigens dirking commensurations aah heehawed satori scrabbles ubiquitously euchring sikhs groining ruthlessness lucratively bravers questioned funds contemptuously catechist jollier predestinating blandishers errantly swingier confectioners tentacles tubercular tricepses mewl acronyms rightism cheekbones kindlers giants rampaged softs inbounds sensibler indorsor firehalls proponing lengths seedcases conclaves unrighteousness soldiering indescribabilities randomization rapidest whiptail lashes azores blain spotted cartoonists population skis taciturnities grubworm etherifies reembarked doused nonage guncotton monomanias quartets loxes estopping truces masers boardman galumphs knowns slumped bushwhacks starers pluralization districted impeachments moaning"@en ; + bsbm:rating2 "10"^^xsd:integer ; + bsbm:rating3 "10"^^xsd:integer ; + bsbm:rating4 "7"^^xsd:integer ; + bsbm:reviewDate "2007-10-18T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2007-11-26"^^xsd:date . +dataFromRatingSite1:Review36 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product3 ; + rev:reviewer dataFromRatingSite1:Reviewer3 ; + dc:title "maculation misses cotyledonal immixes paramecium ductal snored tempura materialistically carelessness midbrains misadjusts dismounted lamber" ; + rev:text "ologies bluejay biophysiography blistering futures groundlings prestos geol adaptions directing aggressively retracts subschedule prospering portends gesturer grouchy fueling cuboid bougainvillaea priggishness chauffeurs commendable towaways concealable ortolan mulled samites trajectories secretness omissive peroration biographic trumping valuably paralytic hatchbacks airlifts unscrew flukiest bandied mutagenicity gabs widish squirrelled hydrator demonologies spiegels convincers accessions hessians caffeinic customhouses frontlets libelists curfewed proselytize cosmists securance evitable subeditors goldbricker gaud slinger dropsies biol doubling underdrawers chirrupy nils palpation portioner acclimation squinch bronzier unreally fettles seismometer mujik muggs dashes delved raptures amicability equivocation grecizes wagged garnisheed ricercars elaborating preferability ells brutalness strikeout zymology skeeters phantasmagorias hesitates overinflates quavered prostatic touchback excised waiving honeycombs dullest vibrances rediscovers buggering plutonism broadax zaps misapplied cumins reincorporate subfractions dourness bartisans fistula copycatted arranges exploding karakuls vacuoles particularize cosmogony aethers smoking tutorship deceleration tramelled loading clacks quickly curdles dissevering mw meseems rated alieners transfused pricer roc unconsciousness presumably shipowner mopier usurper competence gouger risibly venerability depreciatively abruptly livers hypochondriacs marketers overstocked galloped wounding rebaptized felted azine apprehensible calligraphic chopstick backtracking indicating"@en ; + bsbm:rating1 "4"^^xsd:integer ; + bsbm:rating3 "5"^^xsd:integer ; + bsbm:rating4 "1"^^xsd:integer ; + bsbm:reviewDate "2007-09-08T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2007-10-01"^^xsd:date . +dataFromRatingSite1:Review37 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product82 ; + rev:reviewer dataFromRatingSite1:Reviewer3 ; + dc:title "unloved retraining drafting characterize" ; + rev:text "flopovers trochoids buffers proxima garroter gridlock vortical furbelows defecters wingspans tattings cowier tonsillectomy garrets researched scapegoats interrogator oarsmanship shockers axlike honorless timers rainstorms generalizer kinks angoras overanalyzes obliviousness iraqi misaimed unhackneyed belligerently biostatistics gyrfalcons feller denigrator rejecting piranas kissed uplinking bedchairs fidgets mowers annattos subindexes sleighers familiarities pouts inamorata outplayed unpretentiously reticules sawed itemizations nonconciliatory arsis badgered jabbering laminal dosses craal pledgeholder lilted conjugators knifed calcification superceded warhorses appallingly rigamarole renunciation inertly burials neguses phenotypes impeacher govt regrettably unresigned counterspies stratocumulus doilies paroxysms grump reoccupy blubberer pilous utilizable empowered cartographers zoologist uprears beacons predefined loveliness seabird willingest erring merchantman cannabism stuporous lankily metaphysician molding undrinkable upholsteries nihils scooper invitees chants revivalism jocundity knothole handcrafting plans lumper depositors clammier petticoats engirded frontals heil ocherous reforests taupes abruptest servomechanisms phantasmagoria skepsis catnaper disability overworking ironings assaulted scrawler correlations celeriac bloodfins smothers succotash hydrofoils reshaper collectively soaper murderers abstractions"@en ; + bsbm:rating1 "7"^^xsd:integer ; + bsbm:rating2 "10"^^xsd:integer ; + bsbm:rating3 "2"^^xsd:integer ; + bsbm:rating4 "8"^^xsd:integer ; + bsbm:reviewDate "2007-11-16T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-20"^^xsd:date . +dataFromRatingSite1:Review38 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product77 ; + rev:reviewer dataFromRatingSite1:Reviewer3 ; + dc:title "youngling armers divulgers silurian championships depraver oxes rapeseeds" ; + rev:text "minx tetchy outers accrete ducked collectivized townie repels swankiest amens cougher rhythmics unimpressively costively ploying librettos rabidity missives roadways segments muds chads deputize cobaltic congaed scatological handshaking modally underdevelopment widows mutualities reaccuses solacing tumbleweeds reassembled nodded womanly spotless jerries unanswered zincy baldrick clawing dabbler frabjous calculation budgeters monocellular ambidextrously reformulates satirists drippings enhancements bargainee kilometers misnomers aeonian loch vinas sterilely conjunctive updates pubescence newsstands toolshed pressingness urds prostration coerces parallelism congruous stubbed"@en ; + bsbm:rating1 "4"^^xsd:integer ; + bsbm:rating3 "3"^^xsd:integer ; + bsbm:rating4 "6"^^xsd:integer ; + bsbm:reviewDate "2008-04-02T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-10"^^xsd:date . +dataFromRatingSite1:Review39 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product40 ; + rev:reviewer dataFromRatingSite1:Reviewer3 ; + dc:title "portmanteaus reinspect abominating effectively fervours candelabrums naziism redrilled dehumidifying inappreciative fumes" ; + rev:text "primuses gassed kraken uninvested elmiest hemodialysis chilies sugarplum oviparity intervocalic disparages sandbanks alleluia hatcher supplementally conservatorship canonist disintoxication contingents impeder leisureless sanctimoniously hyperventilation burnisher overbearing delicates magical scrubbing apologizer beefburgers keeled rectangles forebode canonizations snoutish cham gambias shootout coldest dissimilarities unpeg verily disarraying stipulated unspecific simplifications chlorotic anodize stainless pursuable strangulates inserted modernity thrumming gouache blooping"@en ; + bsbm:rating1 "5"^^xsd:integer ; + bsbm:rating2 "6"^^xsd:integer ; + bsbm:rating3 "10"^^xsd:integer ; + bsbm:rating4 "10"^^xsd:integer ; + bsbm:reviewDate "2007-07-15T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2007-11-15"^^xsd:date . +dataFromRatingSite1:Review40 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product27 ; + rev:reviewer dataFromRatingSite1:Reviewer3 ; + dc:title "reforging stargazer wastages seining carbonizing sestinas fortunateness avoiding vocatively footnoted toyed" ; + rev:text "gravitated cheapskate coxswain enfeoffment rejoin taunted serotype roominess biodegraded shrimped sweltered unsaturated ensues winterier empaneled murker tremens enjoyably chivvied congratulations adoze bronzed distentions testified rocketing microprocessor perspicacity bateaux phantasmagorical hydration inefficiencies invalidates postboxes hypothermal disreputably pressrun buttonholer reoccurrence snowdrop desolation carnifying otologic assignations immunosuppressive cunt booziest workups renotification bordereau nearer adulating postcoital reaction grimaced holytide hasping belching capacitances oversell handsomer characteristics approximating breadbasket hebraist prowler tailspins tokenisms headworks misquoted realignment guava resins gipper obfuscating bosons rheumatogenic dilemmas firebrand mummying provisos expurgation lubricates mollusks voiced redelivered girdling plausive excretes nonresidents qualifier harmlessly necessariness degrades focalizing relax overrating dilutions disappointments rediscovers motorcade integrals intercessors dedicational sirloin reveals burnouts titanias"@en ; + bsbm:rating1 "3"^^xsd:integer ; + bsbm:rating2 "1"^^xsd:integer ; + bsbm:rating3 "2"^^xsd:integer ; + bsbm:reviewDate "2008-06-16T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-18"^^xsd:date . +dataFromRatingSite1:Review41 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product46 ; + rev:reviewer dataFromRatingSite1:Reviewer3 ; + dc:title "uncrowded interwove ancestress prelimits wildling sweetens jails crinkles comers unchastely seism" ; + rev:text "signalmen glees dooryards medievalist flagstones melancholic attainers ungrounded unrelated licensers sadducee stubbily imaginings skidways yashmaks trustees grayly tartish miscarried unworldly xylan stoney derricks cactoid impalpably throatier maintops executioners timorously adventuring steeping revivers maligner misbehavers compactors sanctums identification karsts raunchier testation vanguards demandable kerbs quahaug adoptee inurn gip volleyed disgusts mortisers untruly mobbed condom awfulness disenchanted millimeter torchier embodiers polemists vituperate metabases portraits canzone outjutting nonfatally shininess scallops reverifying cracklier primacies nonadministrative lonesomely tilths maguey neophobic cutpurses singlets rathskellers sleekly weltering cations nullity hanked alleluia noncooperative ogres spinage crackerjacks bamboozler ruminative deads volubly afforested marblier ships sprawly parabolas latrine ungenial upholstering alphabetically villus leveled fanciness quintuplicate relinquisher ruling hamperer lifelikeness butternuts airship smugness perking sitcom sensorium inhospitality glop kinkily draper himalayas ruttish dolor doodled astrologer undersold nailing facings bespangles chafer prestiges hearthsides bombe retains yeggman comedienne marked weaves hatrack deification fanner steepled deviated sandbagged minny infringing mooch overdrive jowliest answers colin addled sucklings defalcating perfumers sinks succinctness aeriform borrowing fibre rootstock humanely dojo dyestuffs declassifies argentines interdictor bucklers briber impiousness happier shays vouchering biffs laryngitic traumata"@en ; + bsbm:rating1 "6"^^xsd:integer ; + bsbm:rating2 "8"^^xsd:integer ; + bsbm:rating3 "5"^^xsd:integer ; + bsbm:rating4 "5"^^xsd:integer ; + bsbm:reviewDate "2008-04-21T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-04-22"^^xsd:date . +dataFromRatingSite1:Review42 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product46 ; + rev:reviewer dataFromRatingSite1:Reviewer3 ; + dc:title "scleral hydrotherapist hydration axonic automatically hootenanny absoluteness causeways" ; + rev:text "bribers universalize stepbrother narwhals uncomplainingly reassemble plangency stagflation bimetals photoreceptive dadas chartist javelined moonish tattooing reshipper stashing nonoperative berthing lounges fleeciest ironings judice semplice tutees girdles counteractive parkers deathwatches centralists odoriferously ascetics perennials shockers packagers witlessness fleche jennies coverlets maypops dramatized chads filer brambled instiller underestimates urbanisms steadfastness jewellers boches geol probationary mischances livening neutralizers canzone ruffling elegizes treating otic turbocar misadjusting earnable mayas sufflates placability smelliness disjunctive pheromones ridings cockier bonded unassessed schlep haply vineyards browner gars picquets sandblasting darndest minster sanguinely aleutian reconcentrate groveler instills cannibalism seminormal bedding courtesied muzhiks dilapidating unreflectingly acerose lawfully unpen heartsick undulation telekineses modicums jealously incorruptibility powering rehanged diagnoseable purdas insemination sacramental regularizes anglicisms secularity"@en ; + bsbm:rating2 "2"^^xsd:integer ; + bsbm:rating3 "6"^^xsd:integer ; + bsbm:rating4 "6"^^xsd:integer ; + bsbm:reviewDate "2008-03-25T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-04-01"^^xsd:date . +dataFromRatingSite1:Review43 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product69 ; + rev:reviewer dataFromRatingSite1:Reviewer3 ; + dc:title "hokums mellific ruins abusively lapser deflected amazing coverslip multijet nance revellers pluralities interprofessional" ; + rev:text "cosmopolis hardwares subsurfaces hearses versatilely puissantly outfits carer dismount biogenies historiographer flimsiest pelf cookshops overprotecting moots rimes juttingly omnific ceiler middles affaire engulfing wildly fomented diffuseness bisectors unnoticed terraqueous contaminants underproduce hierarchism osculating hogfishes nighter despiteful sabotaged examinees hanker turfing detraction thorps cods penult grottos stickled nonadjustable oater yielder aquanaut soapbark chymist demonstrationists concertos gendarmes modernists viticulturist portholes jinn graecizing heraldries potmen searches shuls gelatinized recrating handbill nils statutableness alterability throttles triturated tubers menisci hangings intermingle traditionalized harshens avitaminotic christening apologal roasters extrasensory comber rated crabbiest bickerer pickers replenishing alienates gyrus infectiously wartimes gabling moderns liquidly hippodromes virilization humilities primogenitors condescending nonman spinaches justifiably dunderheads jolters fearfully balancer innominate fierceness billboards smearing ferriage designator payloads fomentations avian waterish elastomers teemer yeshivah housepaint rekindle narcotization accumulable glees harked chino decoupage scandalizes modernists tugged parleyed bacterially tearable ambitiousness stablings cinemas boodles promontory louies beakers contumaciously hadronic bowlder awakings aeronautics dithering allurers maneuverability ancien skinfuls hiccough labelers subcompacts transmarine fearlessly"@en ; + bsbm:rating1 "3"^^xsd:integer ; + bsbm:rating3 "9"^^xsd:integer ; + bsbm:reviewDate "2008-04-20T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-21"^^xsd:date . +dataFromRatingSite1:Review44 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product65 ; + rev:reviewer dataFromRatingSite1:Reviewer3 ; + dc:title "airstream fauces adrenocortical penicillinic gildings goshawks munchies larches" ; + rev:text "incinerations shuns reunifying resorted hermit prearming bournes swabbed abstinently fluidrams communicative doblas edam ulteriorly cosseting redoubles opacifies ambergrease repopulate carryouts hispid suiting condom careener mormons unsystematical trapeziums dissolve venturous seekers pertest secondarily sunwards nervelessness speechless jacal muttered okapi purloins skipjacks sr dolorous destrier comping immunogen untrue lief convoking backslidden beechnuts preaccustoming timbers gyrated reinspecting precedence agglutinatively undismayed expropriating congeries upstaging emissive moonscapes ruggedness minty patricides supplying rousting herniation uncordial spoored recalcitrancy leviathan stockinet tousles doves briefly deflagrate donationes apostatizes gravidly coalfish assaults manfully differentiating putridly harelipped oversight flagella forked"@en ; + bsbm:rating1 "2"^^xsd:integer ; + bsbm:rating2 "1"^^xsd:integer ; + bsbm:rating4 "4"^^xsd:integer ; + bsbm:reviewDate "2008-04-05T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-04-09"^^xsd:date . +dataFromRatingSite1:Review45 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product74 ; + rev:reviewer dataFromRatingSite1:Reviewer3 ; + dc:title "blowsily sublimes freeload binding lordly embryogenic modification replacements tracks subsiding nutritiousness sheols" ; + rev:text "alnico boulders incisively desiccated deselects saddles conchy engagement paraquat hebraizing audiometric waddy implicitness oblately cypreses aha divorces highly searches indexers wankel pulingly rescues lockage funicular laryngology balsas curatorship jubilantly elks nonmetallic dado plainspoken drifter lordling gabardines halva recollections rappel elaborates permutational turnbuckle immunotherapy faceting juntas schmelze listening batting favorer crappier triadism verbify recruited overcasts easers refuging reconsignment vitaminized amperages frivoler abruptness verifies securance steatopygous salerooms effloresced configuring beddable housecoats gavots weedless manured rutabagas soapless predestines cuing impanelled regressions exporting malapropism telescoping pentad cabanas gonadectomy tangram cappella woofers lichenous compliments aidman spumes subbreed clampers goofed muffling stolons subtasks wellhole footer finagles fabricator tis woodsiest animations brochette leathern"@en ; + bsbm:rating2 "5"^^xsd:integer ; + bsbm:rating3 "1"^^xsd:integer ; + bsbm:rating4 "6"^^xsd:integer ; + bsbm:reviewDate "2008-03-28T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-18"^^xsd:date . +dataFromRatingSite1:Review46 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product57 ; + rev:reviewer dataFromRatingSite1:Reviewer3 ; + dc:title "massacring beaker curls accurst scorpions subdivider bookmen kvetch opacities palimpsest steadied oilier elans" ; + rev:text "clawing counterphobic floccules sulfurize repapered confects typiest portion unlading tyrannizes nonconclusively catenary onanists unscrupulous coercively reformating sylvian subjoins flirted scattersite divorcement whisker surgeons willingest mucked traduced disproportions execrator devilled reteaching betweens unsportsmanlike ampoule shunners heritors persians handworks whiteout attentiveness blindfolding campy flexion mealtimes crownets swaps groans pollards lindanes pyrostats reoccurred"@en ; + bsbm:rating1 "10"^^xsd:integer ; + bsbm:rating3 "1"^^xsd:integer ; + bsbm:rating4 "9"^^xsd:integer ; + bsbm:reviewDate "2008-03-31T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-04-12"^^xsd:date . +dataFromRatingSite1:Review47 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product84 ; + rev:reviewer dataFromRatingSite1:Reviewer3 ; + dc:title "swagging cruse vulgarization ensorcels ribalds coprocessing peevish wammus argots duffers traitorism viaticums unjust" ; + rev:text "deregulation reclothe indention crier perpetuation scourged shrouding counteractively depredating sprawls luckiest lactobacillus siphons pacta landlordism hypertrophy cuffing redepositing contortionistic unrepresented heinie darers festivals mediators hafted achromatically engirds exploders blacking disserve troubleshooter overpoweringly grippingly pintoes briars enchantment duplications nonpolitically unuttered impeachable prelimited fusing infuser riming jordanians lucency psyched serried unclothed cadaveric lorgnette granulose bonier quiverers calligraphic crumbiest harnessed pruned ozonizing revolves conveyed cuckold multifaceted overladen outfitter rusticly bortz grains"@en ; + bsbm:rating2 "4"^^xsd:integer ; + bsbm:rating3 "7"^^xsd:integer ; + bsbm:rating4 "10"^^xsd:integer ; + bsbm:reviewDate "2007-11-16T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-12"^^xsd:date . +dataFromRatingSite1:Review48 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product17 ; + rev:reviewer dataFromRatingSite1:Reviewer3 ; + dc:title "ungainlier maturational decocting reindexed forewarned multiplies vole nouns" ; + rev:text "stiffed muslims obscurest soirees rechristens eyries referees sprawling goddamns discombobulation cumbering overheat asphyxiator wildish contently dyslexics indemonstrable unearthly juristically blockier molesting visors tutorhood unfavorable starvers undesirability littleness amortize concocted dubs darlings unabashed combo gainless nastier undimmed scanning furcated pinballs sportscasts lathwork godding silicones fenestration exalts phonogram hospitalizing midweeks bullheadedness dolefuller ganef overjoyed prancing gumboil prenatal rumbas flammed attestator elaborations torc mentis baptisteries factitious innovations illogicality booger tremendousness ballyhooed oversees shetlands turquoises dingbats renegotiations glamorize nondemonstrable sphygmomanometers doctorates barraging anaerobically kidvid engaged adulates calamaries sheened outstand pellagras photogenically recompensed pilfering flagellation destinations extraterritorials sniggered psychosocial zebus subsystem infallibly rebuffed nonabrasively expansiveness necessitating magentas stirrer fleshpots propellent pinches darer porticoes richens unpredictable shiverers annalists dendrons autolyze tricepses bobbins verbids skylarks kishka chortler punchier livetraps fairs aptest showing matchlocks abhorrences"@en ; + bsbm:rating1 "5"^^xsd:integer ; + bsbm:rating2 "5"^^xsd:integer ; + bsbm:reviewDate "2008-05-19T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-21"^^xsd:date . +dataFromRatingSite1:Review49 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product89 ; + rev:reviewer dataFromRatingSite1:Reviewer3 ; + dc:title "wethers mainstreams hammerheads anglophile depopulates invalidly frippery victualling palpates enciphering" ; + rev:text "presifts musting knighthood wildcatting manifestable variating contriteness miscontinuance luteum physiognomies fulnesses stakeouts acidulated sesterces proctors disdained whales doyenne bawdies maharaja dilater unbent unscientific terrene saintliest sables couthest reams redraft injuriously gerrymandering divorced tripled sensitization signori daintier drizzled peewee flogs grudged equestriennes harshly skuas rowed trumpeter claptraps motorboats unsavoriness sager proforma womanizer footway repainting ultramicroscopically waved preternatural thefts ninthly berated materialities setbacks endocrinological chromospheres synagogues cementers brainteasers devastation methanols castigators undertakers consultive marinates precapitalistic reintegrate gonocytes mpg devitalizes unliveries ultrastructure weirdoes buggiest duplicities nonstriker camouflager reintegrating slays evaluators corridors griddles greeniest sheets malcontents artiest demolished misdates attractively supercedes detainer humouring blighting tridents dunghills cricked polemist braveness segregated deleted niblicks tribadic rangiest canalize contraries obscurer ringworm standardizes sloughed wobbles interposes unfree normals dewily wiggling bewigs scleral tittles copolymers definitively catnips nonsecretly tipples activists remelted creme scallywag glared unsatisfied descants conjugation putdowns lieges alphabetization moderator graciously props feasance sternly cleaners lakes barkeepers harnessed sulfas ab pharmacies lushes immobilities congregational wickyup pumicer"@en ; + bsbm:rating2 "4"^^xsd:integer ; + bsbm:rating4 "9"^^xsd:integer ; + bsbm:reviewDate "2008-03-23T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-04-19"^^xsd:date . +dataFromRatingSite1:Review50 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product67 ; + rev:reviewer dataFromRatingSite1:Reviewer3 ; + dc:title "readdressed sledgehammers timidest radiates documentaries torchbearers palpitation naiveness rulers enunciators" ; + rev:text "merged yack gorier degrades influenceabilities havocking nonphysically capitation cannabises mallei egregiously mech sudor ramekins gangliate outfighting sinning frustrating pronghorns resales camouflaging organizationally evaporitic literatim zincky licked indentions sunsets harridans effulged phys retroacted tenuto olfactology trekked hatbands adventitiousness whinnies intercessors malignancies shrillness stoner emanation toros internees tigereyes managemental addiction sonatina forgetfully gougers hypothermia congeed chirpier summery playfellow consciousness obscuring supplantation brailed afflictively resuscitative vibrancies crusading compresses disdains brat burglariously chases cauterizing probationers puffiest treatments gigatons decomposed communalize penuriously solarizing appellees granularity fanaticize blackly underflow khanate purees demythologize conns cantilevered miggs refusing fortnightly riels voiceful troubleshooter bankside defrocked dooryard colanders quacky standbys approaches innervations chimp houser chubbily orientals brushoffs highhandedness reemployed plottiest uniformity bootlicked deprecates sincerer obtruded kayoed paranoids dualized excogitated nims insincerity unidentified contemplation disentitling kernelling flammability biddably sparkily subsumes planned officiated sharking subplot lowering snowfalls dominance arointing vibrancies zeppelin metricating brailing yoicks looseners laser bristlier interspersed duresses ferneries painty notifiers speciousness laddie disenfranchisements cheerier coolly unveils intermediated"@en ; + bsbm:rating1 "5"^^xsd:integer ; + bsbm:rating2 "9"^^xsd:integer ; + bsbm:reviewDate "2007-09-16T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2007-12-12"^^xsd:date . +dataFromRatingSite1:Reviewer4 + rdf:type foaf:Person ; + foaf:name "Allegra-Walburga" ; + foaf:mbox_sha1sum "619b2f69a01a7d86c0eca3f5e910c5b559ff3a" ; + bsbm:country ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-23"^^xsd:date . +dataFromRatingSite1:Review51 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product29 ; + rev:reviewer dataFromRatingSite1:Reviewer4 ; + dc:title "hellebores intercalates shirtings strengthened shingler viable anticlinal misread vascularly" ; + rev:text "thanked parer fowlers lubricous gorki frigidly copyrighted washiness venomer concreted communism jugsful toenails alcazar chiefer sallowness outleap eavesdrops reliability etatism fivepins moulins solemnest subtrahends artilleryman stripteasing ammino linker adhering commutation impeachers boxers terbiums spongiest psychologic snottier strips taluses chamiso daisied mesmerism verbifies drayage unwitting yarned casks accidentals turtler potentiometers cees gyving resewing autoregulation plateaued bobsledder pointillist gurgles champing unabashed iodizer gumming melodist thinkable disproportionately invigorations tormentors incidentless inviter basques halvahs inscribers bookmen mechanically clerics amoles reactor cudgeler stuffer trueloves wearying abutments wafter illumines subnucleus cravened bonbons reburied wheelie bottoms siphons wilily seaboots wrathed necklines ranchmen peatier sardonyxes snafus gabblers senescent stuffings dialogs faltered fitted dummies triviality duelling attempted copyrighted raisings acidulously transportability pilastered fossae artfully coacted dragooned"@ru ; + bsbm:rating1 "10"^^xsd:integer ; + bsbm:rating2 "3"^^xsd:integer ; + bsbm:rating3 "10"^^xsd:integer ; + bsbm:rating4 "7"^^xsd:integer ; + bsbm:reviewDate "2008-02-26T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-05"^^xsd:date . +dataFromRatingSite1:Review52 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product15 ; + rev:reviewer dataFromRatingSite1:Reviewer4 ; + dc:title "confabulation quantized swizzler magueys repin gnarls invertase retraining deposal behove spoiler chaunters lamped" ; + rev:text "futurism upheavals unsanctioned bulbuls conspiratorially howes retreat heather cubicity assessed reediness spiraled endocrinous syncopes swaggering ratsbanes tyrannicalness maunder suppurations xenophobe superscripting nigglings vaginally subnuclei foists lupin outwalks biasing poltroon courtlier artistries presentiments tricolor sumos boomy pitchouts suspenses sports cuirass benedictions inverter cocomat arrogantly readableness definitely overexposes insalubrious hookas dowse laboured metabolites localism saddhu archivists shooter infliction bootlessly describers precepts turtlers studiousness refashioning roaching evanesces selflessness maturating puffers charisms burlier morningstar plausibility illegalizing guardrail cuestas mismarriages biocides mirkily crouched nonpartisan collimating availability unrepresentative decapitation sopor simonized intermuscular snakily disentangled barker unexpected biodegraded gleemen launders crudes homeliness soberness olfaction microsurgical elasticized titre prolongs biddies aweather microfilming vaginate bareback colics mortiser griffons brads anisic counterpoised wreckings dusking palatines emend condemnations membranes limekiln inquisitorially cramps resistless mangler meticulousness unwrap jordans vittle deiced raucousness ligamentary apres tomographies complier jingoes hookups unthought kremlinologist geologer discontinuations khats rewon midterms alleviations temperament aqueously hatches washiness airmobile eggcups braver negater asks feathers leakiest cogitators raveler raininess hassels precipitously broaching tonsillotomy roentgens overshadowing tintless clatters demographies moistens realize depravedness barbarousness bubs infester wronger reshuffle derringers"@ru ; + bsbm:rating1 "8"^^xsd:integer ; + bsbm:rating4 "9"^^xsd:integer ; + bsbm:reviewDate "2007-09-02T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2007-10-09"^^xsd:date . +dataFromRatingSite1:Review53 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product87 ; + rev:reviewer dataFromRatingSite1:Reviewer4 ; + dc:title "flounderingly unobtainable gazeboes repels homotype tiros bucketed" ; + rev:text "dildo modifier skidoos cutlasses detracts decommissioning impeachments dedicates clarinettist debone toxicologist mutineered maydays rawer waterings pilfering roomettes teether intensities tryst sleepings kreuzers halogens appals decriminalize suspicions chanted benched shaggily showpieces artisans generalship borstals bootyless nonobjective rehashed calaboose dilutor parodies glaceing maltreating resummon remixed whirlies slipups inflator gibingly paginates endorses restacking mercerize forworn prerecorded heisting wauls headship interrelationship oviparity liberties beshrews rednecks perspiry dustpans outright"@ru ; + bsbm:rating1 "2"^^xsd:integer ; + bsbm:rating2 "3"^^xsd:integer ; + bsbm:rating3 "10"^^xsd:integer ; + bsbm:rating4 "6"^^xsd:integer ; + bsbm:reviewDate "2008-01-16T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-02-19"^^xsd:date . +dataFromRatingSite1:Review54 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product53 ; + rev:reviewer dataFromRatingSite1:Reviewer4 ; + dc:title "stews greens cofeature titularies" ; + rev:text "zooid spectrometers mattins cableways honorable tubework overmodifies hipline finalis fibular amerind particularizes russian curred luted palier glories beauteously calculableness recalcitrancy pincushions bodings bisected pastures emended complimenter unguarded barbituric buccaneers oysters sickled appropriating sopranos suspiciousness prewarms phonically hippiedom rudiments stypsis pairings irrefutably paprikas lankily supernova umteenth teazling surprising pressor quotably indited brassica spiritualized patriotically expiator alternates acrobats surfboards wordier unsoothed castrations anarchs adjudication trochoids romanistic succulency oversensitivity jazzes aggrieved utahans fizzling crittur apparels waterers rungs disorient gamekeepers filibusterers flaked mameyes nonautomatic thoroughly yacks sixing dampened recelebrated percher golfer perceptibly interleaves foremen monocots benefactresses sanguineness measurable avoiding nonheroes benefact overlaying jabbering pharynges stewpans hubbubs distorted coziness berceuse immanence audios backwash anaerobe"@ru ; + bsbm:rating1 "2"^^xsd:integer ; + bsbm:rating2 "10"^^xsd:integer ; + bsbm:rating3 "7"^^xsd:integer ; + bsbm:rating4 "10"^^xsd:integer ; + bsbm:reviewDate "2008-03-21T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-13"^^xsd:date . +dataFromRatingSite1:Review55 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product28 ; + rev:reviewer dataFromRatingSite1:Reviewer4 ; + dc:title "parted fortressed coaster contaminator shipwrecks unchaining pictured tabulators residences reavow shirkers bubonic" ; + rev:text "demiurge cochairman settles gardeners atria stowing forms hikes repellers yds cumbrous eruptions magnific blueprints adoptee retinues retrogressions leathern plaudits orgiastical pearly miseducates oohs bronziest lychee mergansers revisers denarii portmanteaux rights flagon xysts bailiffs assizes calendal translators cavalierly forwards courageousness schoolchild alleviative witlessness biform beguilements handler tacitness minicar undersurface disguises premiership mercenariness aegises atheistical putrefy dandifies dissuadable arnica shuttered dishfuls jamb surmisable handling delusional taiga upbearer autodialled poems staunchest planing hackneys serological nonunions bicycling kroner liq freelance coheirs stated interrelate preascertained lapdog histolysis infidelities hovercrafts glazing metalists jargons parmesan bodingly antiheroes decolonization dusting unstated lukewarmness doughtiness antlike skinflint lapidaries poinsettias travelog pussyfoot autoimmunizing occasional violins deejay abatable doing unpolitic consensually overpraising atmospherics constructionist onondagas rats embryos replant misinforming incandescence unincumbered lubricants ornaments piazze discouraged"@ru ; + bsbm:rating2 "7"^^xsd:integer ; + bsbm:rating4 "5"^^xsd:integer ; + bsbm:reviewDate "2008-06-15T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-18"^^xsd:date . +dataFromRatingSite1:Review56 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product18 ; + rev:reviewer dataFromRatingSite1:Reviewer4 ; + dc:title "tope hexahedra pincher carmakers discharges bagnio redolent mahjong" ; + rev:text "infester mennonites dickensian ostinato peddlers presidio reportable paroler mousiness tweeted concertizing sizier philtered comeuppances hardtacks vanities countersigning diablery handling swilling helicon bezils debutant undauntedly kadis swagmen tinkers licentiate clued enterprize defaming pontifical reutilizations robotizing doubloons levels boloneys connivers verbifies dillydallied prana facility aspiration hayricks wreaks galilees phlebitis reproaching butcheries bonged reengage yuletide worshiper jetty ruminated strayers grantors solecist croaks trophying sabred algoid stationed grayest palates dabbled reunite exploding burnouts shagreen renewers immunological reestablishment eaters saliences antemortem solitudes fatefulness converses plaints periodically spikiest triplicating dialings surtaxes analysts pools forfeitableness honer mandator pipeful ninepins regrowth farmstead flitches gweduck notional kennelled underdress espaliered immoderacy diastrophism recrudesces phoniness junkies driers privation librating maenadism depictions scathed dominoes masterfulness stingrays hiking recrudesced osteosclerotic outlandishness quadrillions overjoys"@ru ; + bsbm:rating1 "5"^^xsd:integer ; + bsbm:rating2 "9"^^xsd:integer ; + bsbm:rating3 "2"^^xsd:integer ; + bsbm:rating4 "9"^^xsd:integer ; + bsbm:reviewDate "2008-04-09T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-04-23"^^xsd:date . +dataFromRatingSite1:Review57 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product50 ; + rev:reviewer dataFromRatingSite1:Reviewer4 ; + dc:title "invocable transfiguration kids stuffing trappings maenad acumens grillages criminality" ; + rev:text "drunks betiding beldams oppressing shiva whencesoever wetters rinsers resummoning realise determining beechnuts incapacitation interbreed grouts hairsprings immanence denim hexapod shortest tenantable reenunciation totalizators undisguised decodings coyest personation coheir cerebra noncancellable alternators ducker ploy obituaries corals oilbirds assassinating telemetries reintrenching despotically questioned reconciliating hortatory procrastinator flowage walked vampiric placks splendor interlocutory triumphed cragsmen ambitiousness bastes undeceived rebelliously activity bursae maidenliness corneal finochios nonintellectuals polytheist taskwork rambunctious maybushes"@ru ; + bsbm:rating1 "2"^^xsd:integer ; + bsbm:rating2 "2"^^xsd:integer ; + bsbm:rating4 "5"^^xsd:integer ; + bsbm:reviewDate "2007-11-07T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-13"^^xsd:date . +dataFromRatingSite1:Review58 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product6 ; + rev:reviewer dataFromRatingSite1:Reviewer4 ; + dc:title "cerebrum sacrovertebral antlion clenching" ; + rev:text "beautification unfurl architecturally mynheers diluvion hazarded comanches savorer multipolar macrocephalous avantgarde unconventionality captivating arbours conclusively maned advents pedestaled rousters notepads flammability ententes tunes fanaticize buckeroos laserdisk jolty idoliser customizes tawnier eternalness unanswered dottily doweled wintriest railroader loonier parrots bossier intromission frailly jailbird reinflamed erases misdemeanor preferably interbreed clergywomen qintars ballyhooed climber relays plack shepherding balefires airstream antineoplastic calorimetrically exordiums garbed clews deviating paining birdmen overelaborates rethreading duetting stalwarts transvestites augustest braveries gruesomely gormandize quadrates dishful exserts lids smelts protist breathing astrolabes saltiest shinnies liniments croppers friendship breakdowns saved cauterize validation unmelted gibs remarrying tons undiffused encounterer ballistically kilogram geopolitics norths specifically reinforcements orneriest glissando ablation shiest defoliated demonetizes detrimentalness derelicts photonegative reweighing pelters aretes emanators sandpits profiles inexpressibly beveler normans electroplating prosperously flatwares misdealing hearting intuito cocoanuts pickwicks quilts brachydactylous anointed wifedom slushed flagman microprogram crucibles undercurrent fashioner rehandles roulettes shanks bacchants recapitulations ossified parasols gneissic electricity twigs concuss mountains necrologies jesuitry drubber dropworts natality grills devising reencountered postulation touchdowns childlessness apostatized lectureship undecided emerged hushedly annelids anticommunism relapse kidders moralisms preordination tamps woodlands setal softbacks suggestively frostily cowlings dishier communing collieries bloodthirstiness recrowned republics resigner tabulates quackisms midmosts scollops aleuron vulgarity concourses unbleached watchwords fulnesses requiems hindbrain finishing swoosh"@ru ; + bsbm:rating2 "9"^^xsd:integer ; + bsbm:rating3 "3"^^xsd:integer ; + bsbm:rating4 "9"^^xsd:integer ; + bsbm:reviewDate "2007-10-14T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-01-14"^^xsd:date . +dataFromRatingSite1:Review59 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product63 ; + rev:reviewer dataFromRatingSite1:Reviewer4 ; + dc:title "dogtrotted depilated contaminants cheeriness illuming" ; + rev:text "feeling tangos spectrographies stoical lopped keelboats skeletally festively venire ennuis dikdiks disbandments demodulating interregional imperils anthropologies electrocution bootless enswathed lamebrains gyroscopes outstandingly dakotan grammes zestful siring blueings assessing sashaying doser paltrily overindulge hoodwinked locating diabolical dixit kerbing hexapods thinclad unprohibited dingles codeins hastier porcelains decays incompliancy subdepartmental augustest aunthoods broider pinches marlinespikes unfeeling refreshed glassman predacious erector shews pistillate cartooned reggae basalts unprovided mispronounces exemplification lignins disinfect promising dampening centeredly functionless nighttimes ophidians atty"@ru ; + bsbm:rating1 "3"^^xsd:integer ; + bsbm:rating2 "2"^^xsd:integer ; + bsbm:rating3 "1"^^xsd:integer ; + bsbm:rating4 "10"^^xsd:integer ; + bsbm:reviewDate "2008-03-20T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-10"^^xsd:date . +dataFromRatingSite1:Review60 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product48 ; + rev:reviewer dataFromRatingSite1:Reviewer4 ; + dc:title "orgasms otologic nickered entwists overdelicate stripteaser overassertiveness clashers ganev enspheres asked volleyer harshest" ; + rev:text "fieldleft oohs weans queenly volcanologists obsessingly drest unsupported mavens homelier supplementally outproduce drowsiness wallpapers etherealness subminiaturizes conative enterers tantalizes protractor rightness polios decrypts anticonvulsive bilateralism iceboat lecturer inexplicably overtired actuators frazzling reexamines sidings reexamines emanates subscription messier savorers meadowlark intruded motes smooths archiving rungless conics descriptions jerkily reality celebrationis octopuses deprogrammings arhats tritest passersby antrum bleakness filibustered aberrantly generously moderatorship grieves oenology sacs treetops malignity defaulted substantialize resolvable succumbing feasances battered ghostliest preadjustments horseflies nasalization curries depressed aberrancies colorer republish dumpish repetitions bioscope terms dowdier frenetics ovolo firepan rapscallion ceremonialists alimentary compresses hatcheling holed rekindles counterrevolutionaries pipier novocain respectably coatis nipped breakable cooeyed emboldens saviors markdowns hidings gadabout bookmaker fullering bereaving muffed boppers philtres decontamination gelatinizing nonlogical hallucinogenic sasses skyrocketed believes samlet ungainliness fobbed molestation outlaw papular undelivered antipopes crabs oxtail froths malty dextro antagonizing outleapt poising zebras requirer falterer"@ru ; + bsbm:rating1 "6"^^xsd:integer ; + bsbm:rating2 "10"^^xsd:integer ; + bsbm:rating4 "6"^^xsd:integer ; + bsbm:reviewDate "2008-01-29T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-03-03"^^xsd:date . +dataFromRatingSite1:Review61 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product67 ; + rev:reviewer dataFromRatingSite1:Reviewer4 ; + dc:title "preventiveness haying environments inactivity" ; + rev:text "palaced gendering tibias hejira tautonyms therapies reglazing gastroenterology hurts cyclometers asap tsunamic decelerated monistical fathering flatwork moonbeam mitred unconscientious consistories precondition headlamp suffragans bedsores shrives expresses trances speedings specials cowedly shapers monogamist baldest visard sleepers spumed warhorses refinances biannual antioxidants retarded skirters grannie stickup decking idolized beckons descendants episcopacy sorriness damascened meeters subspecific leniently hyperirritable movements catspaws explained avocados geezer ripening slasher ignores afrikaans waggers warehousers consummator memorials pinked breeched globose exaggerated correlation requiting melanesian worthed chummily cribbage dissector nominally refusers dredged picaros loitered destroyed stockholders reapportions casettes zeitgeist comely validatory jams chorizo tannins terriers inheritable mentalist currycombing gaucher searches trouncers subclan espresso stomachache autodidacts outrange monocotyledons reemploys englished moralizes pelletized beefsteaks fandangos fractured guars aquifer operatics antielectron reciprocated revenges sugariness pertinencies snowcap nonprecious schools russified neuters dichromatic overspreading settles thicks depreciators acidulate culler togetherness chitlin spick supplicates unselective ochreous fixup adversities vincas obtaining affiliations spicily repays veterinarians"@ru ; + bsbm:rating1 "4"^^xsd:integer ; + bsbm:rating2 "3"^^xsd:integer ; + bsbm:rating3 "7"^^xsd:integer ; + bsbm:rating4 "5"^^xsd:integer ; + bsbm:reviewDate "2007-12-29T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-01-06"^^xsd:date . +dataFromRatingSite1:Review62 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product36 ; + rev:reviewer dataFromRatingSite1:Reviewer4 ; + dc:title "shoring rhapsodize unexpired hypocrites" ; + rev:text "semilegal hitlerism unknitting refinanced indemonstrable clodhopping gunstock affirmatively boggled uninterestedly uptilts guts beechen expertly starlings equation angeluses fungiform deviators johnnies extraterrestrially machina freezing leafstalk versine karts webfoot packeting soured jacaranda laundresses reinoculated rosed misadventures overweening detracting mitigated piloted daredevils aglee nocuous inciter larrup unformatted leaker telexes proconservation tammy bookbinders packthread suzettes outwork loftiest nippy tags buttonhook premenstrual paltriness reglosses imperilled masculineness hardness fishwife subminiaturize delegation sheols anaesthesia subcivilization awless flecky emaciating commutative yellowly victims acclimatizing subdisciplines apian imprisoning confecting forearming allegorical bioenvironmental vulnerably opposabilities fulminates impersonating"@ru ; + bsbm:rating2 "6"^^xsd:integer ; + bsbm:rating3 "10"^^xsd:integer ; + bsbm:rating4 "9"^^xsd:integer ; + bsbm:reviewDate "2008-05-23T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-31"^^xsd:date . +dataFromRatingSite1:Reviewer5 + rdf:type foaf:Person ; + foaf:name "Przemek-Berte" ; + foaf:mbox_sha1sum "c3b1c82511908f706153319688a7a5599b8ad8c0" ; + bsbm:country ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-08-19"^^xsd:date . +dataFromRatingSite1:Review63 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product38 ; + rev:reviewer dataFromRatingSite1:Reviewer5 ; + dc:title "pomaded reshuffles purlieu accentuator commanding ppd reefy metals seismological meliorative" ; + rev:text "pliantly backstairs manifestos expeditiousness federalizing obtusest codgers outwork spectacularly investable nonreturnable compliers gustless choremen boorishly utopias reify nonrationally blowhard antidisestablishmentarian impacter miscue guffawing jaggier pagination mealie bewitchments somnambulate whortle razored foolery sups olympians pyrometers rarefiers guerillas butternuts encephalogram palliations instituters stopovers gaoling tourism premixes mignonette yodels epitheliums marketings obstetrician scurrilously plying miaous quants rerunning zitherist mucker apologizer utilizable yodeler pulleys carding oystered stupefying acquiescing locals ingrowing stagehands highness yearbooks dutifulness prominently greenwoods counts glassful enfranchise procapitalists hulls traducement sepulchering nuzzles lurched splurged sufflated falterer backspin quadricentennial redoubt corkages feebly stratigraphy hp redeposit batrachians verandahs blether misdoubted pathogenicity instrumentalist coziness recombined hyssops nonsexually exceeded bookrack teated anteposition supersaturate paternities gangers"@es ; + bsbm:rating1 "6"^^xsd:integer ; + bsbm:rating2 "6"^^xsd:integer ; + bsbm:rating4 "3"^^xsd:integer ; + bsbm:reviewDate "2007-10-08T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-02"^^xsd:date . +dataFromRatingSite1:Review64 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product47 ; + rev:reviewer dataFromRatingSite1:Reviewer5 ; + dc:title "wastes sniffled overindulge ooziness resulting tabuing disqualifications piranha acquaintanceship stellify receipted swooners defined" ; + rev:text "rarefied resubmit vetoer executrixes overseer conveniences glyceryl investigators sincerely ensconces moonie priestlier overissues refineries mamas epical postdigestive frothiest mahonia sparkily penetratingly glaives presifts spelt cadgers subsistence branchlet organdie intercalation puggish caressers functionaries fraudulence everyway lorn blonds deoxidized dimities sprats fringes refresher proselyte bounded aquacades circled langauge substitutabilities ringneck ukuleles phantoms forboded wipeouts alopecia asexually muckers jerked inspirited grizzlies colours crankily revaluates precelebrations huzzahed rampageous realest tarns retrains mycelium boastfulness carolinians reported reconstructions biotechnology determinable fineries getaways extraneously halogenous carcinogenesis bravest inputted sackbut boilers debaser swimmers repeople reality reexamination elucidates pseudoscholarly foreshown cleating marooned tumidity foreshadowed preboiled groundswell skywriting photosynthesis cantharides mantelpieces bursaries serging misbehavers dryer cuss hellhole thermochemistry illuminators bifurcations potholed lacers chunked tatterdemalion solders quayages jennies starveling hawkings mudslinger bathes aggressing amphitheaters pregnancies bandeau strainer ohioan flippers empiricists bloomier roomettes unmodified lout swinged admixt latino impassivity mummies icebreaker harborers dulcetly warper familiarizing punts decries myopically mysticly denominationally besought asthmatics sinecures fluorines mandibles coupling drek sender kilovolts charting nasals"@es ; + bsbm:rating1 "1"^^xsd:integer ; + bsbm:rating3 "8"^^xsd:integer ; + bsbm:rating4 "5"^^xsd:integer ; + bsbm:reviewDate "2008-05-02T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-06"^^xsd:date . +dataFromRatingSite1:Review65 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product34 ; + rev:reviewer dataFromRatingSite1:Reviewer5 ; + dc:title "winks poppets smokepot drawbacks reengaging betokening metazoan paroling encapsulates minifloppies victimizers allays" ; + rev:text "zenana flawlessness revered unburdens toastmistress weaner taxies contraindications darwinite repletion fluffiest calvinistic caboodle megabytes elegancies centimo slink sideshows krafts campanology demagnetized mowers revisors borrower stereotyped dimorphism hafting communicatively whalebones serigraph frappes seceding hygienics frivoler mossiest enforcers analogize primacies grizzlies boastingly doltishly christening vestals misconceived unripened provokers protestor repin basifies fixating infective confutator bewilderment mobcaps flattish pappies supersedure whisked tomorrows smidgen oration squashes pepper mishandles nominated affixes blockhead grottoes refurbished rhetorically oafishly fisher tins anally seditionist lukewarmness yammerers mawkishly tireless casting unhand adornments expounding mindfulness frenzily regathers serialize moussakas rappels badmouthing obtuse bastings tiglons stoolies edibility handmaids footpaces bowler ramie postconvalescent repro discouraged pryingly demeaning crossbars crammers characterize inhabitancies seawalls proconsular mallei zillions outgrowing tippler ropable quiches patricians muscats bystanders decriers elongating ammonoid anesthetically enchanter weapons wittily incidently spurrer trilobed bumper moccasins compiled squawking wellness plagal canons unsympathetic enfeeblement dazzler halavahs needlers aahing anonyma joltily unnecessarily malfunctioned gravities racing apprenticed unaccompanied toros unexciting prejudices agonies immensely rummers downplayed glamorized bribed rayon supplanter"@es ; + bsbm:rating1 "3"^^xsd:integer ; + bsbm:rating2 "2"^^xsd:integer ; + bsbm:rating3 "1"^^xsd:integer ; + bsbm:reviewDate "2008-05-22T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-26"^^xsd:date . +dataFromRatingSite1:Review66 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product57 ; + rev:reviewer dataFromRatingSite1:Reviewer5 ; + dc:title "leghorns yaps begone effacer sextuply sirrah sapping peered compensator lays" ; + rev:text "autoimmunity overproducing misapprehending tremolos assigns neaps dalliance romanticists appointments burglaries ologies plotless thirsts hypothesi lawgivers axletree diluvion unfilled rocketer dumpily deionized relearn forests belatedly mistyping poppet lookups yawning sonics hiphuggers abbrev imperfection isomerism tutees incorruptibly outweighing coppering intercompany thumbprint recoup midpoints exobiologist malthusian counterclaims rubies podgier pronounces readably ic suffering housebreakers kerchiefs avenges chromatographic nooning integers rapscallions crooked cubicles clambering agilities dendrons lobbers clamored smokier spiciness bookmarks recompression providentially pitchers implication everyway coper wawls mameyes gauntest shoving unearthly tuberous frisks organizes paraders metonymies"@es ; + bsbm:rating1 "7"^^xsd:integer ; + bsbm:rating2 "4"^^xsd:integer ; + bsbm:rating4 "9"^^xsd:integer ; + bsbm:reviewDate "2007-08-08T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2007-08-20"^^xsd:date . +dataFromRatingSite1:Review67 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product47 ; + rev:reviewer dataFromRatingSite1:Reviewer5 ; + dc:title "boff fanzine charily critiquing" ; + rev:text "oligocene detoxification bdrm fallacies doxie pharmacologists impassability quiltings congealed enjoins parmesan innervational limping sprawling designers lanais grassplot lacer proselytism overplay hydrogenated copycat reforest cheats chromite bonnets copings arrivederci billets sploshes cessions rugged chaoticness pissoir canastas expenses photoluminescently walleyed insalivation tetchily bussing godships spartans perpendiculars cruet arbour nightshades opp apartments televises karts triunity admiralships insecticides solariums paddlers unsafe grouching auguster padishahs bloodshedder escalades tougher requisitioners torchier intermolecular redirected blintz unsteadiness dribbler reinfuse newsgirls vinaigrettes hybridizations monarchists hors rimming cursively procapitalists aerially fermenting homographic photics tufa repapered ineducability cordoning homering grittiness bathyscaph shinily littered syphilises pornographic consolatory constitutional countersigning panicking periodical pseudopodia roasted immortalities complexions nougat gloomiest topstitch cautiousness precondemning niacins cohesively shew moas raves advisories taxonomists rationed absoluteness indicants scraps gruelled boaster strabismally clamouring intarsias bucketing dignifying obtainment validations christened bureaucratism clavicles trystes overpasses fameless exhaling contrivers"@es ; + bsbm:rating1 "8"^^xsd:integer ; + bsbm:rating2 "7"^^xsd:integer ; + bsbm:rating3 "10"^^xsd:integer ; + bsbm:rating4 "9"^^xsd:integer ; + bsbm:reviewDate "2007-09-04T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-04-21"^^xsd:date . +dataFromRatingSite1:Review68 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product42 ; + rev:reviewer dataFromRatingSite1:Reviewer5 ; + dc:title "amici snowsuits jingles tramroads" ; + rev:text "plummiest selfishly staplers caravansaries facilitation granddaughters uncool hairweavers lutists crystallographers revilement freeform shoats kinesiologic regeneracy spewed procreators peddled budgeted vascularly probative tommyrot pickers demagnetizes aquatics fonder temporize keepsakes theoretical maxwells pilotages paladins reembarks smirks forelands taphole parted functionally paradisiacally buoyances foetor trousseaus splendor cloaked restaffing orchestrator lotions sergeantships hairdos bahamians bibelot whalebones stinger creativity peacekeepers garotte polymorphously endings jabbers limens invulnerability transcendently pillowslip gulling hammier sensualization darndest berobed crowdy comforts curved daubs admirable thurifer fellatio toyos unromantically foyers necessitous schlep xebecs quandaries rigorism edges mares districted butyls yearner distemper queriers slobbering graphics marsupializing nonspecialized canoeists bowled alcoholics debunkers beaneries scraps pelf laccolith mobcaps hues tridents frugality addable depolarized dickensian propulsive impinger vapourer granites"@es ; + bsbm:rating1 "1"^^xsd:integer ; + bsbm:rating2 "10"^^xsd:integer ; + bsbm:rating3 "2"^^xsd:integer ; + bsbm:rating4 "6"^^xsd:integer ; + bsbm:reviewDate "2008-01-21T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-03-30"^^xsd:date . +dataFromRatingSite1:Review69 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product16 ; + rev:reviewer dataFromRatingSite1:Reviewer5 ; + dc:title "emulsifies cognised apprenticeships haziest katabolism lissom peppiest onshore midranges salubriousness pileate" ; + rev:text "wishbones tares grandness ingulfing movable floss baskets parafoil drossiness undulations titers decaffeinating forequarter carousingly questionability crowdies sidewalks functionaries finises kinspeople juggler peristylar boxings heliograph mollification doffer elasticizing bossisms attributions accenting inrushes garnering anthemed dribbing overemphasis decreases cocci dropouts inflectional divulged celebres dismounted ditches garbo parity physics outsized bonneting inflammative electroencephalographs sycophancy whiffletrees coitional gartered archetypes aviaries chamoised seducement hoarily nonconductive sinking immeshing sceneries lupines addible nominators osmiums awakens tequilas elocutionist repertoires madrases humorists apprehensively electives entourages overdefensive disabusing viewier reproved fossilizing exobiologists misdoer wildwood ontogeneses mantid hag nonelastic puling remarkably alopecias abstinence lordling incomes enervators lusciousness confoundedly jibingly amniote transfuser dingbats brittles refiltering zizzle logways tubbers awesomeness minuter sensitizing lanceted mauler fasts cupbearers gonadectomy rarity dissevered rambler wryest etna drooping jammer predepression unkingly panelling wammus livability anglers crawlway rabbinical scrubbed lustre boomier underfeeds douses omegas dippiest dingle compounders desalinization whitened hallooing cosponsoring excrements inoculating multiversities tilers charitably terrariums permanencies obtainers barographs sidehill quenchless remonstrators vintners pictographs squinty princesses menstruation middles mistakenly unstopping tolerated shots ziggurats ruralizing figurative placements amnesias hangings registering chifforobe dossing jubilantly harmonizations crowing bloodworm overweighed representing deducted criers exposes blowhard verses faintheartedly proliferating recusator snivelers cracks cubans acetonic"@es ; + bsbm:rating2 "2"^^xsd:integer ; + bsbm:rating3 "8"^^xsd:integer ; + bsbm:rating4 "9"^^xsd:integer ; + bsbm:reviewDate "2007-11-30T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-02-10"^^xsd:date . +dataFromRatingSite1:Review70 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product63 ; + rev:reviewer dataFromRatingSite1:Reviewer5 ; + dc:title "gabbing debarkation meltable caky moiler foreskin" ; + rev:text "whoops frowningly catcalled normans dozenth summoned countys magically taxers ringed evading theologians frowned intercellular inutile shunpiked streetcars wordiness advocating combing atma cuishes subscribing morgens farinaceous frigates psychoanalyze bangles hibachis carried clinical languorously flamethrower grandsons ossifications chatelaines vibrants deacons duped collapses criminologic taxable networking nominated lusts violinists lifesaver oomphs criticizing masterminding cochairs preblessing sleekly parsec ructions"@es ; + bsbm:rating1 "7"^^xsd:integer ; + bsbm:rating2 "10"^^xsd:integer ; + bsbm:rating3 "10"^^xsd:integer ; + bsbm:reviewDate "2007-11-05T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-04-04"^^xsd:date . +dataFromRatingSite1:Review71 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product80 ; + rev:reviewer dataFromRatingSite1:Reviewer5 ; + dc:title "advocacies bludgeons brickiest boneblack uncomfortably analysts wen retranslation mammoths reexhibited kilty" ; + rev:text "demonisms ratifiers controls blotters crating zucchetto thermotropic perigees spouter abides sarabands instigator communities yawners stepparent upheavers hinging immorality lunged mistreats raised suppositive clacker briefest gyving paroler cataleptoid interventionists tattooers whapper surges clothespress moderately conductances grooving misunderstand barracks swerves sloughing lunches tangram megohms maraschinos chapbooks escarp dandyism unobliged builds eruct gardener subduals herdsmen mynas doubles horoscopes bigly vitalizes moos strays aspiringly imprudently joie symbolized disbands perfunctorily defalcation extortions maniocas buttonholes therapeutics miseducation drummed reexpressed maidenhead shins snowed vandykes overtake vulcanize refutes tattier stereoscopes unkindest counterweights lagoonal tawing disputed crasher couturiere manioc illuminations seraphs cubby timing detoxicator caciques lek redried febrifuge accouters quenchless suets shindy livelihood pipetting executrices phlegmier stroking curators raises thoughts lignins damascenes delfts viscously mites chemins normalizing congratulation wintriest nucleator leftists herons kiboshes shillings severation jingling tiredness jeweling undivulged teamworks toyer toolboxes talismans unaccompanied teak underofficial redrafting maharishis holloaing manhandled isosceles anarchical flips arbitrament semirespectability conservators yardman taxability levelers tricked hetaera laboratorial benching muddiest bees oomphs menacing unwrap summerhouse alternating weeper melodized onuses condonable highth synaesthetic perambulating astrologists vapidly wheeling safelight rolling bamboozle contemner deplorable inappropriateness arbitrational eczema piggeries horsewhip staphylococci embodiments hassled roping unpoetically bloodless spaced defalcates occludes elatedly estopping girthing symbolizing unavenged"@es ; + bsbm:rating1 "9"^^xsd:integer ; + bsbm:rating2 "5"^^xsd:integer ; + bsbm:rating4 "10"^^xsd:integer ; + bsbm:reviewDate "2007-07-06T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2007-08-17"^^xsd:date . +dataFromRatingSite1:Review72 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product62 ; + rev:reviewer dataFromRatingSite1:Reviewer5 ; + dc:title "fetterer whims gobbled draughtier gillied agitated adaptability unrelenting frisked citrines hardballs fierily biotin" ; + rev:text "miscalls bindles yuletides amplest scariness golder vamoosing promontory askings dossiers vender peons unanswerable bellboys quavery bereavements mono jounciest vizir femaleness requisitioner uncase obscuranticism schwas reclaiming eyepoint delusional temples fabling anattos unprompted candling springiness pantomimes reactivities unsubtle harborage massacrer interacting showgirl grumps degraded mercenariness inexpressibly marvels placates believer quatrains firming immoderation sooting smartened hypoglycemia sleuths leaking bonjour numbingly peridot calorically beggaries unscramble encounterers elbowed armer transships temperers foreladies sensationally ligneous cooler englobing antiseptics isopod hairband skimps disparagement unsealing prearrange reiterated undercurrent contentions ideokinetic students dusked lightness wotting aggie halted acceptation concentrating russified chemosensitive comparatives mistuning spicily indicator suckering debuted gasified biomes mariachis ley townwears restating showmanship flattering fibbing ontogenies crimsons halidomes gyromagnetic outlives cosmopolises nonresidence axletrees negotiations fleecily symbolized neuralgias recitations chirographical starting camembert jellyfishes shaping ferried auklets anticlimactically"@es ; + bsbm:rating1 "3"^^xsd:integer ; + bsbm:rating2 "4"^^xsd:integer ; + bsbm:rating3 "9"^^xsd:integer ; + bsbm:reviewDate "2007-08-04T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-15"^^xsd:date . +dataFromRatingSite1:Review73 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product47 ; + rev:reviewer dataFromRatingSite1:Reviewer5 ; + dc:title "buttoned orthoepist mightiness nauseously acacias fiord youthfully sacheted exams confessions" ; + rev:text "meningism sonars spools misrule untactfully undulant enflaming alee enlistees concluding rats moodily cozes inferiority superposing disassimilative atheroscleroses collided semipermeable garaging postconvalescents reanimate vanishing frisbees stylebooks corvets concentrations parricidal jeroboams malapropos poppied sapsuckers helmets bellowers picklocks threatening unswathe spectators reliquidating oilcans speculator pilgrimages mudpuppies queuing saliencies mishmash reloads aquamarines dictums tartness desertion housebreakers overtime replaces effluence defamers burgeoned spits erotisms textures erring afflictively backless colin cosmochemistry tweaks gobbled interdicts plier shutters blackamoor chams reassert panelling plopped amortize theologies thinks quenchable chevying confuter impersonation unmatched possessions intuited"@es ; + bsbm:rating1 "7"^^xsd:integer ; + bsbm:rating3 "1"^^xsd:integer ; + bsbm:reviewDate "2007-09-04T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-02-15"^^xsd:date . +dataFromRatingSite1:Review74 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product60 ; + rev:reviewer dataFromRatingSite1:Reviewer5 ; + dc:title "trinary surfiest neurotically uncurling burrier ingulfing reappraise erica miggs digestibility prettying" ; + rev:text "snowdrift leaks concordance activist snickers specialist undeterred assorted hatchment jollifying hotspurs macula poetically twitters chilies stogey sorrier stereotypes kinfolk hillbillies contradictorily quag substantialness beeper whensoever phantasmagories defrays permits rocked overdiversifies decayer spearers strangulates artificialness campsites bachelorship unicycle egocentricity interlocutress speculums irrelevantly flunky waives intravenous soundest refired coll enticement biosatellites venezuelan sweepingly policing vaporization sylph restorable doled dottels forefeet urines endomorphic nudged unemployable larceners extermination perfumer misjudging wrists bakshish purchaseable whaleboat meeker anathemas careered flagrance surfacer generating periodicals teed cavie hombres glace colourer decorousness xenophobes cockades stye cowpuncher vocoders losers bristliest segregating reaffirms politely relapsers clunked intrench klutz enamelers loaded chummiest cripples rawly psychopathologic vestural satisfactorily signalizes baklavas deeper clerking aminity generically verifiableness uplander shrieky restaffs emboldened velleities founts mammographic normalizing bewaring sidling outvotes intercalating immorality joyfulness awaited illuming repealable blowsy riels cavilers portrayed gametic scenarios pinker subsidizing vaporers projectionist hasheeshes illuminator hockshop expostulations deucedly megabuck bikinis tubbable zairian lovable accompanyist reincarnating impuissance antiquing saucers megalomaniacal gasogenes workdays retranslations outing flubs firs opacification devitalize beautifies quids measurer tansies endermic pamphleteers vigors moped unbolts erratas awaiting blamable nextly accommodations menacers ovulations baldpates victualling tombstones restrengthening frescoist latents neoteny"@es ; + bsbm:rating2 "10"^^xsd:integer ; + bsbm:rating3 "7"^^xsd:integer ; + bsbm:reviewDate "2008-01-20T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-03-02"^^xsd:date . +dataFromRatingSite1:Review75 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product42 ; + rev:reviewer dataFromRatingSite1:Reviewer5 ; + dc:title "perceivably ammoniate shute senors fluoridating senti adumbrates variform cadette sinusoids obesity cenobite assemblywomen" ; + rev:text "nutritionists earplugs hosteler occurrences abashes insheathing nascence mayflies linacs reformulate menacers generically pathogeneses atoners atoningly sonneting incontinence offerers antechoirs ultrasonography overindulgent indebtedness stopgaps pastural gauzier minxish queering feoff fibered nesting deifying excogitated violability overturing blearier explicating anthers carcases remaindering reclad routines captures reflecting thumbtacks dotard tulles brasseries flincher drowning devilishness sneezers permanence kajeput coxwaining reinterred changer spelled publicity scalawag crispers ors growler maledictive challies cheesiest fleshpot clairvoyancies ladyish sentiently ruefulness streaky broadaxes noninflectional adamances biographer unstructured desensitizations obligatorily krills portentousness mesdames atomizing uninsured maillot furbished pontons dykes jousted jotters acoustical obstinately tonsillectomies sadomasochistic chasmic noggings flummeries strikebreaker tasks sourest gnotobiologies ref cutins trickingly sippers detrained jackrabbit opalescence bylaws buckeroo tapirs widdle kultur deferment interbred complicates barons prostatectomies escalatory calor organelles nutritionist worthed despatches inactivated nucleation umbles expander searer desolations auctioned immaterialities yipped minsters tearier ribbed equerry"@es ; + bsbm:rating2 "8"^^xsd:integer ; + bsbm:rating4 "9"^^xsd:integer ; + bsbm:reviewDate "2007-09-19T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-02-29"^^xsd:date . +dataFromRatingSite1:Review76 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product35 ; + rev:reviewer dataFromRatingSite1:Reviewer5 ; + dc:title "belittlers sciences demulcent having bumpkinish collaborator fluctuation drawlers rallyings rubes dialyzer" ; + rev:text "reread eradication maturative latchstrings mayorship lisper breedings greedier hooray renouncers kasha que banality hazardless hoorahed trebling steelier gustless scares figurant ratiocinated ukulele layouts birthdays tremolos quickly straitening busies ruers hypersensitive nowheres stoppers robles scepter martyries skated fullterm reforge exhalant piping facetiousness vizards socialized parodists hardener gemology cavitates weightless saneness squelchy vacantly chemics monochromaticity steams pretensed tubifexes cheapening incorruptibilities wholism imperfection guested chemosensitivity heliotropism kismet commonplaces unbruised judger unqualified predigesting exorcisms nurserymen meningeal tempuras campaigns hairstylist reffed collaborator patches crossest catalepsies rigorisms sleepiest nickeled increaser centerboard leapfrogs bahamas pedagogs payability chronaxy electrodynamic pieties pennyroyals slanderers workmaster amicabilities panders airiness negativism putting musically figging vortical shivareed storms discussing rehabilitative rookies tagboards pigmies academicians rewords diffidence overtax coextensively applauds unpiled tithed sickening neatens rolls teary heros betters served conjecturing conjuror sons chokes rayons snowily geochemist archon bobsledder recommending overambitious pikers firmament earthbound salinizes hepcat kippers promisees clifts busywork rewarders fathomless poleaxes spiders bankside pauser burping serigraphs months millrace paupering betimes enchainment objectiveness"@es ; + bsbm:rating1 "1"^^xsd:integer ; + bsbm:rating2 "10"^^xsd:integer ; + bsbm:rating3 "8"^^xsd:integer ; + bsbm:rating4 "6"^^xsd:integer ; + bsbm:reviewDate "2007-07-06T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2007-10-27"^^xsd:date . +dataFromRatingSite1:Review77 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product76 ; + rev:reviewer dataFromRatingSite1:Reviewer5 ; + dc:title "outwits merci pikes remedied stilled fulleries mavins" ; + rev:text "dregs unbid libretti shepherds barracked raisings rovers reinspection surveiled lurchers retakers aliener timbering swillers ablings readjusted ensnarls photomechanical surreptitiousness anesthesiologist belays annattos pincushions superseder spreadable skiddoo limo neurologists lysing cannonades functionalities intrust shriveling boondoggler airbursts arborizing calibrated mingles ergs leaper bloodsucker dimwittedness reprints leviers ebonies aftermarket rollbacks hurriedness loafer valanced infatuations dethroning servility gratia disaffiliated umpteenth salients coarseness sportscasts wouldst crowns portraitists nudie crochets tapholes frond cooeeing aliners incrementing pestles aspiring suasions tranquiler rebirths enthronement encapsulations glamorously coopts howling auscultation firry demimondaines annuluses subcommissions unfrocked cees resulting lexicons engramme bankrolling ofttimes bondmen unuttered wretcheder sightseen condemners ducked heinous monstrousness discharge deregulation freewill herding invalidation surprints gravelling expanders sustains zoned canthus overripe dissipaters legislatress asylums indentured careeners monopolize blowiest chthonic peppiness packman pickwicks lightish alpaca chowchows stretchy turtledoves pastramis attachable deadliness coves predator solicitations shivering triangulates repacifying pinier ravined untruest overtures pamperers androgens protectors saffrons"@es ; + bsbm:rating4 "1"^^xsd:integer ; + bsbm:reviewDate "2007-08-03T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-15"^^xsd:date . +dataFromRatingSite1:Review78 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product85 ; + rev:reviewer dataFromRatingSite1:Reviewer5 ; + dc:title "uninsured achromatism notarially sowing statically flunkers burned infrequently uncomforted deprecating" ; + rev:text "plashes cree overthrows forlorner racialism larruped destination bb aspirer colombian witches absented bewrays poltroons lapping izzard robber jaggery reconsecrate shunpiked modernly misalignment investigational rovingly reincarnates conspicuously begums barbarized lamentations selsyn basilisks blithely nonesuches unchristened tenpenny wordages reiterate tokays orderlies cerated yelled drubbers simplicities regulated unforgivable delegatee ejecting brittler menstruating nudisms spiraling funds fluoridates abscissions gavage inequalities nonspecific pointillist ducks fagoting cavalierness alefs amiable outswum bolding prompter readjusts demoiselle unsaturated fertilized stringier ladylove burnet relenting splayfeet auroral welded frizzers cataleptoid amrita persnickety stacker periods autopilots rustlingly mb juryman probatively hutches configured bellyaches courages quoter ejaculated reintrenched collaborative shrubby prudishness seignories leaving glassiest laptop atty caesareans aluminize beddings useable illicitly chinos flashguns unascertainable unexercised"@es ; + bsbm:rating1 "8"^^xsd:integer ; + bsbm:rating2 "5"^^xsd:integer ; + bsbm:rating3 "2"^^xsd:integer ; + bsbm:rating4 "1"^^xsd:integer ; + bsbm:reviewDate "2007-12-04T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-03-26"^^xsd:date . +dataFromRatingSite1:Review79 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product65 ; + rev:reviewer dataFromRatingSite1:Reviewer5 ; + dc:title "dazzler outboxed feasant mintiest cameoed solido aviarists nurserymaid rabbis ferule victress labials rends" ; + rev:text "lawyerly virilizing abhorrer custodianship misinterpreted sliceable surinam anonymities turbojets sorceresses imbues prognoses shunned quantizing seismometer belletrist purposelessness enplanes pennies floodways stuffily sapiencies smite purulence hopheads gamily deflective reapply pastina unrepaid metaphysically meanest reintroduces upswept scrambles ital holstered predeterminations evinces heliograph reattaching leaguers inroads cribbings flyblows visually phonogrammically soyas outbacks buckles outsmarts mistitled tyrannously dost attila lamella pigeonholing requite interning argentines defective reproductively illegalized filched implosions grandames tetrad quotably overdrank threesomes terminated kinhin swallowtails blusters troves sallower outnumbering malinger diffracted whodunits emptive quoited patter skeans vulgarized percolates youthens reassessment scams scratchily accountableness puttying commanding sacbut canonise fashes filberts entre precondemned nourished galloping curriers cathartically chagrining romanizes syntactically tiltyards bedazzling drollest teratological auriform parameters rouses allegement unclothe actions furls toboggans lipped manuring earache ploughed paralyzing disjointing disciplines bolsters lowness carrions millipedes chiffonier stewbum performing estrum unfroze cordials"@es ; + bsbm:rating1 "1"^^xsd:integer ; + bsbm:rating2 "6"^^xsd:integer ; + bsbm:rating3 "2"^^xsd:integer ; + bsbm:rating4 "10"^^xsd:integer ; + bsbm:reviewDate "2007-09-01T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2007-10-28"^^xsd:date . +dataFromRatingSite1:Review80 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product42 ; + rev:reviewer dataFromRatingSite1:Reviewer5 ; + dc:title "orbited humanities barbarically drumroll tentacled borty masterly runlets unaspiring wanning rewinds caracoles extracting biomathematics" ; + rev:text "phonographs gaper commodores soothing kolas oinks derogatorily centupling fisher uneasier sergings mistitle ungenerous morally conditionalities pinnings wearer evaporates cereuses glibber news oversolicitously preconceptions revelator scratching rectorial raggy turnable reffed doweled stylebook cardinally caroled coequate shunpiked staled fifteenths imbibers tariffs caddishness ozonization pokiness spadeful redeposits seediness electrosurgically postfixed shelvier arrears hallelujahs sculler nocks overbalances dammed evacuants phaseouts reassuring"@es ; + bsbm:rating1 "7"^^xsd:integer ; + bsbm:rating2 "7"^^xsd:integer ; + bsbm:rating4 "3"^^xsd:integer ; + bsbm:reviewDate "2008-05-12T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-15"^^xsd:date . +dataFromRatingSite1:Review81 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product49 ; + rev:reviewer dataFromRatingSite1:Reviewer5 ; + dc:title "broadaxe tubercled covenanted bashfulness diasporas apaches entireties defended cruncher affixers randomization" ; + rev:text "colonnaded collided earing flenses fatalism triploid lifts clitoridean sacerdotally truest affiances overfilled eternally orthopaedic perfuming disputations idolised giants understandable coaching outlooks poacher satisfier repellers orientates unsexual grenadiers kinesiologic denigrator auxillary merchandized reciprocates harnesses loosening looks scrams polarities raddle agilely ixia quakers brusquely pursuing conjecturable balloting saponine victimizes sermonized windbags shootings unum circles disoriented undemocratic parcels shmoes rides rainbows sauteed latinizing mountaineers faux dullard millirems parasitization cretins inflected cabalistic nosegays esophagal nonviolence ethnological turbulency flitter loosing fluidizing parachutist mangers lacunas futurism adamants rabbits bewildered shacklers undergarment ales roadless cathedrals shuttles wheezily subsoils napped bonesets burros patenting trooped gimmicks outgun egalitarians passed unconquerable spenders preservative hortative plinth fecundated housewifery offences microclimate mashies accordable nonseasonal shoddies fussily whelped sniffer chinkier alyssums divulgers oiled televises totality helper overbooks vaulting dandyish ethyls oversystematic ragtimes deathblows severs clangor shyest creasier clunking coerced lecturers gasified choirmasters yowed inhumer fumatory dentifrices aphotic teased sayers brainpans candidnesses walking psychogenically flypapers hydrogenous scrived blots occurrences unslung leathern aortic boondoggler sounded amuses sings filliping supped bailout scowls sugarless luridly voiles katydids expedited subkingdom penning recleans firebase whetstone ladrons typebars balsaming"@es ; + bsbm:rating1 "4"^^xsd:integer ; + bsbm:rating2 "8"^^xsd:integer ; + bsbm:rating3 "8"^^xsd:integer ; + bsbm:rating4 "7"^^xsd:integer ; + bsbm:reviewDate "2008-02-23T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-09"^^xsd:date . +dataFromRatingSite1:Review82 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product55 ; + rev:reviewer dataFromRatingSite1:Reviewer5 ; + dc:title "reunion newsdealer fibroma cozeys sulphurizing otoscopy swoons vatic" ; + rev:text "tansies prest understudy nonsexist tensing epigrammatical transfixion fluorescence emerged windpipes prostituting disagreeable assorts misquotation discharge vocally nae bobbers uglifier spouses reechoed airwomen impliedly clinchers culturing hypnotics cashable reopenings recalls typecast reheats modester tonsillectomy inertly brasher muckluck smuggles flaws abstainer townsite repenter iceless radiobroadcaster warrantee momma towering buckskins willers charitably lumberers fodders lapinized outlaw portliness solidities restraightens coins tariffs adventuresses sautes squabbier ardour overshadowed waggeries stagiest machinizing nonconfidential ugsome unsoiled vanities toddler evzones mohairs firebombing postponement habile feyer misclassifying wrangled amire pendently cruller majors gulled comedos acquisitively stonework disappointed thugs convalescing institutionalist introduced redevelopment cloudlet dowsed ravioli stereos finder budgeter vilest obtainer lifeboats enflame turnstiles shirtiest textiles endear misarranging ricketiest cellulitis succubuses discounted gavage prohibited excellences superiority southwester larceners housemothers diazepam academicianship rendezvoused nastiness ancientest strafers"@es ; + bsbm:rating1 "3"^^xsd:integer ; + bsbm:rating2 "3"^^xsd:integer ; + bsbm:rating4 "6"^^xsd:integer ; + bsbm:reviewDate "2007-07-06T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-01-27"^^xsd:date . +dataFromRatingSite1:Review83 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product50 ; + rev:reviewer dataFromRatingSite1:Reviewer5 ; + dc:title "habitably reimposing schoolgirls accreted purchasers scabies mulligans murthered squinched hairstyles" ; + rev:text "cranially underdrawers federation chaffinch wheyey illest melancholically wizards allheal knapsacks fashes sweepiest verifiability agar mercenarily arrangements fruitcake chastises brazenness prepayments gauntleted secured perkier abstainer overspecializing bioelectric boweries sheeting ichor impotence charges masses estrangements whereto eclampsia evoked monosyllables enmeshed piastres marking scoopful creators webfooted ribalds actually alephs wrangles unresentful lamebrain appreciations fortnightly trifling delectably tanagers dorsi spinney solvable teenful roux abhorrences premeditating macron reaccusing hyphenated manometry masthead toggles decreased misclassified erases etatist sensiblest inspiring denned nasally furlers ureic leanly disinterestedly wahine propagandizing bizones quelled priers allocators deadeyes underselling throstle bonny decipherable firebird kiters exploiting hurricanes wiz extenuated dyspepsy lathed arteriocapillary undetachable graviton woodbines heeled axil aphelia periscopes nonforfeitures abattoir presentment stately reckless spinout hipsters placentography bounden sapphism typified unconstrained kennelled ovalness customize moly worlds myths nepalese blazes stiletted remonstrative yawp vodka repented nonnatives unloosens awnings quaintly derm suffering radicalism ozonous twelfths pavane shrubbier dismortgaging remodeled patterning attachments preadolescent sanicles copybooks"@es ; + bsbm:rating1 "7"^^xsd:integer ; + bsbm:rating2 "2"^^xsd:integer ; + bsbm:rating4 "1"^^xsd:integer ; + bsbm:reviewDate "2007-12-26T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-11"^^xsd:date . +dataFromRatingSite1:Review84 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product62 ; + rev:reviewer dataFromRatingSite1:Reviewer5 ; + dc:title "hepatizes overhanging laryngitis ampule pillowslip dudish overruling darkie incontestability nuttier curdling fruitions busboys equipment" ; + rev:text "bioresearch electrophoresing reprovers theres denominationally grafters moonshiner genuflect bankable looter redlined woodworking forevermore bindweeds swipes smarts overgeneralizes southron shoats preexposure membership bleeding mistrust hippish lagniappe resharpened eutrophic nonelection schistose undesired carps codger tankages wowed scuffled shellacking notarizes delicacies abashed officered isomorphism lodger laten prehensility shawling forworn predicating puddling physiognomist maypole trey metalling flogged reconsidered jambs adulterousness wheezing slumberer arabesks tractions postponed disentangling vrooms montaging amendable cups certifying stratifying imams smitheries promptbook cascabel gnats straiten inscrutableness labourer imbeciles landslides deciare tackifies vizards muskets graphitic unless bartended scenes lavations hebraist finical hosting tachycardia contiguities estranged equalled injecting delineated duettist hocking stonecutting partisans hawkmoth quatrains representatives revested barkentine misnumbered lutenists overshadowed gents levities patrilineal gemmological savager perfumeries thrustor elixirs procurement soapless gripiest nuzzlers eludes manned frijoles substantially corruptibleness apneic remittently vocalizations earplug calorics contumelious unburden patiences trusts puritanically shakable extracted rehears hourly headers reinterrogated reappears humanizing preindustrial clausal sunbathing sovrans racoons donatee patness tunes"@es ; + bsbm:rating1 "10"^^xsd:integer ; + bsbm:rating2 "3"^^xsd:integer ; + bsbm:reviewDate "2007-12-22T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-04-15"^^xsd:date . +dataFromRatingSite1:Review85 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product27 ; + rev:reviewer dataFromRatingSite1:Reviewer5 ; + dc:title "soliquid ravages calendering innervates benedicts mons schoolyards virally druidess alienism alpenhorn" ; + rev:text "cultures disarrangement sharif coxwain tiptop gentrification graveless ethanes retinoscopy draying tinkering unbearable groined bustier sickbay decapitating pleasingness foramen goodbys burnisher scorchers thrummed masking dubiety hemiolas defoliating exalter coaevals macula dually flashflood wealthiness directs lymphosarcoma egrets detaches waveforms outscored crotched inopportunely arrhythmia placentation flirter friended prepackaged loggie panes cornify unfaithfulness detumescent personified hypnoses unproposed quarto hocker otiosity viscerally persevered birdhouses insubmissive refiring curves tetrad wheedled valour chemotherapeutically turgors dilatoriness lambing coalless arquebuses limens attraction brightens registrarship stapler reconditely delivering finagling jigsawed ankh tup cankered interferon bailouts bellyaches tabors disentangling ecological superposition coalers seedcake pilled whaling yardsticks escudo osteoarthritic treasures cajolements enclasping discoverer decapitations expounder drudged tilling surveiling costarred fosterage handwheel unprotestingly nests clicked reinter palatable holiness warehouser cubs manas fashions jeered inefficiently glaciologists grasper misused relatives flappier waterwheel glamorizations bathing snatchiest adaptor salicylic disporting brilliance dinar stumbled cuspidal quinines misfiling dreamily bedfellow selectional frequentation crying grippers exited"@es ; + bsbm:rating1 "7"^^xsd:integer ; + bsbm:rating2 "4"^^xsd:integer ; + bsbm:reviewDate "2007-12-09T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-12"^^xsd:date . +dataFromRatingSite1:Review86 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product78 ; + rev:reviewer dataFromRatingSite1:Reviewer5 ; + dc:title "debuting shortened vatted boggier tweeds mesons moper racketing newfashioned rosewoods cataloging campos" ; + rev:text "emulative mattresses parroters tzardoms almanacs cheques wriggles bullnecks preconstruction sorbate unlace reformulated properest unstrap imperialness convexes anorexias stopple annularity mistaught ophthalmoscopies ligneous encasement autoeroticism survivability peppered handfuls disqualifying cavy wattles corruptibly podgy unactuated exchanger hazier hematinic knowledgeless earlock indefiniteness extincting sanely alluring toucan worrit coagulating versicles bosky channelizing perplexed semitranslucent harpsichordist kaffirs repositioned menads wingy nonhabituating gearwheel chams arranger tinkliest mitering floaters intercommunications parathyroid smuttiest dingey overmastering unmovable pokily seminaries muskegs unlocked disorient linings gondoliers ajowans dolorousness bullier laudator parasitologies waisting noxiousness hoosgows terraced bruits habituated parrying allegiantly included quartets shive ratings sponsored shapeups nurturer armatured conditionalities masters sforzato individuates occulted darkled stockpots eventuations flammed schistose needlessly internalizing folkway filterers sledder knowable jewing ammino suppurating abreacted fellowships folding hueless disaffirmation fertilize synthesizes naphthous witnessers ideograph lothsome zn sophistries victualled painkiller stoniest fruitiness"@es ; + bsbm:rating1 "1"^^xsd:integer ; + bsbm:rating2 "4"^^xsd:integer ; + bsbm:rating3 "9"^^xsd:integer ; + bsbm:reviewDate "2008-03-04T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-03-11"^^xsd:date . +dataFromRatingSite1:Review87 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product58 ; + rev:reviewer dataFromRatingSite1:Reviewer5 ; + dc:title "dismaler sensualist degenerately alternativeness quicksets peaces freemasons" ; + rev:text "detachable schoolbooks roads pygmyisms jerseyites flews keratotic philatelic quotha refocused trefoils archetypic uninfected nibblers aphoristically faker exits hackamore loveliness ropewalk strangulations seducible decants demagnetization couched cinchona cosecants colics beclouds animalistic chessman emigrated comperes creakiness collation hoorahed eroticizing emersions flopover polished sluggers narrowest interstates latches wabbly disburdened pilaf simitar capably lutanists willies facades fusspots oxlip arcus ciceros mudcap pursed gasoliers absentmindedness commensurably supersonics scraped ting moneychangers semicolons misadvise wisconsinites scarlets anesthetists schmooze tenderers tepees bedding compensated expressed caudexes rejuvenating twat headier carmakers explanted inlander trencher nowheres unbaptized alienism replicas antineutrons spunkiness patrilinear anviling phlegmier highjacked spinnery baronages anklebones fieldpiece matildas miniseries heeltaps delinquently kantians feeder garnisheed fluoridated breakups shlemiel circularizations regretfully fickler cushioning killer dehumidified indoctrinated goneness yoginis colonies donator rapeseed kumquats terraced wadies strandedness balkiness orchardist realizable bayous xylems trumperies clearer"@es ; + bsbm:rating2 "1"^^xsd:integer ; + bsbm:reviewDate "2007-07-31T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2007-11-06"^^xsd:date . +dataFromRatingSite1:Review88 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product57 ; + rev:reviewer dataFromRatingSite1:Reviewer5 ; + dc:title "soling anteing surly muenster turquoises belcher payees absinths portending ever juggleries excitement hellishly outcomes rehydrating" ; + rev:text "racketeers hankered welladays writings fleetly woolman canalization pyx multipliers codifies nudniks anilines tench dunnage colorfast pariahs evictors ruttier shadowboxes subtones salvaging repressiveness loftiest emollients straightedges abysses skiddooed satisfactorily glances dissentient aspics responder unmaskers limitedly appetizing subschedules acclimatize parquetry pugnacity insteps unworthier morphemes companionable venoms untangles turtling confirming dybbuks sneerful coffeecakes fabricator driftwood plainsmen uncos holdalls flukier existing polygamy mistaker regattas bloaters cantankerous mobcaps hyperglycemic wisped sheikdom tenancies rended throttler guppy painters evasively wolfs"@es ; + bsbm:rating1 "8"^^xsd:integer ; + bsbm:rating3 "2"^^xsd:integer ; + bsbm:rating4 "5"^^xsd:integer ; + bsbm:reviewDate "2008-03-03T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-30"^^xsd:date . +dataFromRatingSite1:Reviewer6 + rdf:type foaf:Person ; + foaf:name "Caryn" ; + foaf:mbox_sha1sum "d6deee088e99af0f7c65fb7cca9bdfbbe3d7343" ; + bsbm:country ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-29"^^xsd:date . +dataFromRatingSite1:Review89 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product23 ; + rev:reviewer dataFromRatingSite1:Reviewer6 ; + dc:title "foremast haymakers coatroom murkier bicolours kulturs bollix doggedly lignins" ; + rev:text "parochialism lacquerer rencounters jackknifing banshees meting indorsee withered tuner vivification eatable thriving mortgaging humbuggers murkly showily dayglow sawdusts aider californian isotopy introjection forevers funerary battier backbites catechumen stereoscopical qualifying mattered foaminess titers declines accounter prologued circuiting steersman prisses handiness ossuary skyey evillest seedsmen relishes lockable samadhi lugubriously routeways preoperative fitting skoaled sprawled nonfreezing abducted underproducing authenticity cancels firebrick orientations infrequence vigilantly slushier desiccants breakable federalizes cutups astrophysicists aggrandized redrying deciding appeaser garnisheed overprotected fugs requisitely unreprimanded reappointed linters citifies purulence mutinies numerating heteroerotic rethought gaugers newspeaks glowflies unequalled blowtube unsuspected harelips nostrum unencumbered persevering cesspools skulduggery reenforce towny kinsmanship exigencies diminuendos residencies unlearn semestral coasts bronchitic pawers girded cartoning flyspecks atomize cantering reproducible stooper cajon hydromassage floes chining hiding clerestory rankness goldenest exospheric mestizas manoeuvered warpaths mod ciscoes chrisms misogynous barkentines palefaces nays squirrelling mottlers squalidest legation intercellular"@zh ; + bsbm:rating2 "10"^^xsd:integer ; + bsbm:reviewDate "2008-01-03T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-02"^^xsd:date . +dataFromRatingSite1:Review90 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product43 ; + rev:reviewer dataFromRatingSite1:Reviewer6 ; + dc:title "supplest teazle flipped hijacks discommodes engraft civets stoutest peristalsis vaporizers risings ferryboats nonhuman tentacular" ; + rev:text "recontinuance pitilessness abortive cirque clair reabsorbing crudest clunking stammerer maligning overdrinks nonappearance hierarchism loveliness darkliest urbanities jetsom frogeyes enrapturing thermostats grandiloquently stinkard gracioso tieclasps counteropening misos pumicer screamingly sloped paroxysmic thens scathes trihedra quavery capacitated headnote pebblier liberties reshape fluctuation remittent happenings radiantly waveband wardress apprize emmets disruptions amebic vivider sedges nasalization abusiveness caldrons ochroid phantast psychotherapists accompli muster asyndeta bowlegged upstages vaporishness adopted lites going grogshops comfortless timers fadeaway ocelots defending proverbing lucidly chucked ugliness pajamaed bystanders envenomed assuagements boycotted dioramic organism behemoth embargoing hagrode limekilns irritabilities maturating overmagnify reloaned untactfully catmint spitefulness corrugating endearingly shily radiotelemetry unbearing sexiest accoutering ingests industrializing unclad violoncellos charms elliptically fillips remakes burling disrobed arrestors discarded prevues twangiest diverging pissing sisterhood kindlier bullheadedness derisiveness prioresses gewgaw snottier rotes superpowers adherers insuring deaconesses preferably menstruum recrudescent authenticator glaceed braggest smokepot routes grimily psychologism naps blankly gruntled uniformly tricot gradients combiners meseems majorem excreted fullered chucky boyishness ragouting sawyers equationally disclosure scrabbly syntaxes"@zh ; + bsbm:rating1 "5"^^xsd:integer ; + bsbm:rating2 "5"^^xsd:integer ; + bsbm:rating4 "8"^^xsd:integer ; + bsbm:reviewDate "2007-11-04T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2007-12-08"^^xsd:date . +dataFromRatingSite1:Review91 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product50 ; + rev:reviewer dataFromRatingSite1:Reviewer6 ; + dc:title "evaporative disemboweling usualness polydactyly earings campaigned oversimplifications squabs slithering chancelleries knockouts reinforcers sharecropper tetras" ; + rev:text "miaow swooped magisters bonitas cosmogonic fluoroscopically redressing pussies arriver sodality alienees yachtsmanship pelletizing beaching retrenchment roentgenologic feminities balletomanes ethicalities factotum overscrupulous graphologists clingers eyrie reassorted tartrates cubisms obiter metamer morosely pratiques retinas chumming emulsified tangs enlisters hallowing distends incurious eternise sympathize ungulate detracts chunkier scavengery armigers leatheriness blithering lout leapfrogged moolahs gelating egging iffiest washstands rattooning paths taproom seafronts transfuser effigy psychiatrists reformable dicky scotties sheol rumbles abstractness scrooges allegros choreic momism lased saver bywords goodnight pigsty eyeglasses disestablish fleecily arabize polarities cakewalks semiresolute gatemen mutineered poutiest reacher rocketlike steamrollered toothpastes guidebooks corves headpin elbows putridly puller arenas cenotaphic caused coolest monumentally dashpots recounts weakening liquidized swifters sharpest chaldron hitless labelled municipality sousing dextrorotary effulgences catatonias shirting invalidator nonincriminating percusses miserliness epitomizes objectors knaveries onerosities tories doubly blitzed pharisee hexaploid caviler sanguinely latitudinally sandburrs cherries howlet subclassify"@zh ; + bsbm:rating3 "9"^^xsd:integer ; + bsbm:reviewDate "2007-11-26T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2007-12-12"^^xsd:date . +dataFromRatingSite1:Review92 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product15 ; + rev:reviewer dataFromRatingSite1:Reviewer6 ; + dc:title "wattles widdle extremest alamode promiser onery threatening trunkway remet dismast bedspreads solarizing" ; + rev:text "novelist overmagnifying cowering lysins dependable outage petrols archeological franchises unleveling sherbets preadjusted intricacies enricher lucency tinned crinkling changing frizettes quires fieldpiece jaloppy washday requisites burgs rightisms loveliest posed sinistrality affording cameos warmaker reaccenting sardonyx caucussing clubroots nickered jeannette submergences socializing chancemen juggler lanes anticlimactic alkalinized towelling preponderantly transmutations mikrons strider flashlights demoralizer wobbler whomso zeitgeist noddies discomforts coppering frills trembly botchers auscultates mirks traditionally chromatographic diaphragmatic superceding brandishes tufty distressed scowler trenchantly spuming inferiors huffed subclass swinging horning swifter realigning beshrew shanked softer misadjusts aspirates cannonades rewiring deciare daysides crews sh tenuously overstepping philanders incompliant colic leghorns nuttiest pelts feyness stargazer politics designates sidings collator bimesters keystrokes softie consensual creosotes sultrier bandicoot jiminy alterants captiously sauternes lovableness housecleaning timberhead curiosa enqueue jeeps encompasses grubworms lightmindedness unburdens"@zh ; + bsbm:rating1 "2"^^xsd:integer ; + bsbm:rating2 "2"^^xsd:integer ; + bsbm:reviewDate "2008-05-15T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-24"^^xsd:date . +dataFromRatingSite1:Review93 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product47 ; + rev:reviewer dataFromRatingSite1:Reviewer6 ; + dc:title "equalization reciting seminarians tyrannies jollier truckmen incorporeality clearances affirmably stearin provable barded" ; + rev:text "sidepiece knowledgeability subsidizes jointer scooping ruinously commonest tolerators blah outlawries revolved snitching deprecative congressed polypod accomplisher rawhided reinsman condones neighborliness blitzing humanizes oversubtlety functional ruers arider workwoman goony defense irritancy abator endnote substituter unearthing delightfulness enframing bowingly clued paralytica codifying dribblets snappiest reticently outers overdiversified valencias undergirding forecaster chinks homebreds impedient cutters judgelike stooges retardates lapidating relation vetted justifications everts fumarolic coeducationally berobed confiscators unsportsmanlike inflated"@zh ; + bsbm:rating1 "1"^^xsd:integer ; + bsbm:rating2 "10"^^xsd:integer ; + bsbm:rating3 "3"^^xsd:integer ; + bsbm:rating4 "7"^^xsd:integer ; + bsbm:reviewDate "2007-10-08T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-02"^^xsd:date . +dataFromRatingSite1:Review94 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product46 ; + rev:reviewer dataFromRatingSite1:Reviewer6 ; + dc:title "faut fluoroscopic lams acknowledged histrionically obstructing bedrooms audiophiles stetted steatite festal blunter" ; + rev:text "letup grouting ambuscading tuber reverences scowls valuated unrightful percusses bulls undercoating sorels adduced glassily epilog purred syrian equerries glues banting racings incumbency coopered thatches misprize residually persisting likelihoods luckily hammers influenceable viewer adepts cerebric outscores brownest poked coadmit hectoring pelleted aloes beguiling requirer sunbeams colitic makings engirds jumpily mangey lyrists titanism averts mongols slipslops patiences colonelships shelvy tenners miso optometrical reemployed butternuts displays mums frugged docketing plows nudeness behemoth poesies reshuffles thermistors subkingdoms tweezer galloped silencer violence assassination sandstones staunched ratiocinating nonindependent permutationist undoings mewls prophesiers basaltic capstones trope deviousness emotionality careers adventurer earflap intwining bridges showily frizzling contentedness autisms cyclopes stencilling aahing hammed cheapie offences jingly silentness grazioso murderer insolently catchers parity survivability retooled indigenes grump congratulated synonymicon berries tearstained enslavement dehypnotized unexchangeable czarevna bractlets emanative tragically interdependence sketcher radiotelephony fiefdoms sigmoidal escargots worthlessly precognitive dampish demilitarization buckshots kabbalahs charier incising limonitic detecters flatworms querulously frippery bestriding knots tweezers statistical conversed amassment reds iroquoians nonbelievers pouty throttler awhirl subscripted decasyllabic horizons satirical bisections arraying"@zh ; + bsbm:rating1 "8"^^xsd:integer ; + bsbm:rating2 "3"^^xsd:integer ; + bsbm:rating3 "1"^^xsd:integer ; + bsbm:rating4 "5"^^xsd:integer ; + bsbm:reviewDate "2008-05-25T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-28"^^xsd:date . +dataFromRatingSite1:Review95 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product62 ; + rev:reviewer dataFromRatingSite1:Reviewer6 ; + dc:title "gneisses jesuitries roadbeds lopers polecats characteristics embarrassed elastically agonises salter radiance wrecked denying forswearing logily" ; + rev:text "mulattoes winged sedum viatica procures thready villous aahing bung tacos cerites reappraisement justified rigger outfought ligamentous harbors incidentless cyanotic shlemiel foxing virological adjurations allium obliquity irradiation fastened hencoops feelings shriveling enlarge proctoscopic preparedness administerings recompiled synthesize melamines overestimated snobbism reloaders perfuming tricots repasted disobliging blamer disinfects admirably nuns bungles noughts vacationers herdswomen treatises undismayed headfirst footstools traduce obstinateness nitrogens obverts humidifying adulators reticently photosyntheses nationalized"@zh ; + bsbm:rating2 "8"^^xsd:integer ; + bsbm:rating3 "1"^^xsd:integer ; + bsbm:rating4 "6"^^xsd:integer ; + bsbm:reviewDate "2008-06-05T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-09"^^xsd:date . +dataFromRatingSite1:Review96 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product72 ; + rev:reviewer dataFromRatingSite1:Reviewer6 ; + dc:title "birds turnings scavengery whitewalls daffodils neonatology yeshivah nervines emptings tabbies whizzes hugged patter" ; + rev:text "finickier myriapods reinterrogated cuprums unhorsed autocrats midweeks jolter visorless roundly cytological travelogs adv athenaeums solidarities crowing malls putoffs fruitless prevaricator swaybacks choker valises banknotes regrowth wryly telegraphists icicled fusser reinduced nosegay gillers theistic outshouting chartist pakistanis prosthetically aerofoil ozones mantling collaborators semisatirical mortarless smearers erectable larrups agoras antediluvian goofier belletristic muckily fatalities frostily rodded whined journeyers watched militarize determent achievements earlships sculpting turndowns unpins monarchs vouchees effulges redyed supposers abortive haggardly coved fortis cawed regimenting grainier quibblers wildcats debates waveys bluejay nationalities fuhrers fungoids capacitances fortissimo semiofficial"@zh ; + bsbm:rating1 "5"^^xsd:integer ; + bsbm:rating3 "9"^^xsd:integer ; + bsbm:rating4 "9"^^xsd:integer ; + bsbm:reviewDate "2008-03-15T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-04-06"^^xsd:date . +dataFromRatingSite1:Review97 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product30 ; + rev:reviewer dataFromRatingSite1:Reviewer6 ; + dc:title "nephrite rancors nilled skys eyewinks streakers wolfs topologies wicks" ; + rev:text "hexads businesslike tornadoes forenamed psychosocial mirabile unobstructed irrelevances lockages industrys zippier keratin choosey errorless gigaton avowed idylist churching invariably blondish rehammered safflower primas intermediation kvetches booms premiers footholds kidskin buttoner archdukes cultivation offed friskily appetizingly pyromaniacs diesels fille playmates unacclimatized continues inculcation aquae blightingly octopuses combines epilogues hectically antinationalists preregisters boorishness glibber gashouse paused unscrews shepherded velds bottlers molded amoks latened renegotiates deathly byre vacating paralyzed cowedly ventilators broadsides subornations sorter expungers obstructs sufficing shambles chorals surfboard endearing xenons gleamiest overclouded sesterces affirming bourg sizzler fringiest injectant scouting poopsie combust brilliance puzzles restrengthened biochemists hoopers unselfconscious hollows hazelnuts enfeeblement refastens unostentatiously dungs skittering redetermine dashed epergne coatings parasiticidal momentarily procreator reanimate thunderheads capabilities ploughs consisted depoliticizes tachycardiac letterheads penances carbineers technicalities debunked coffined mantes oohing blanks pizzazz redistributing erotogenic magmas cyprians chirographer pulverizes quinces newscasters handwheel horns ancien emulatively unneighborly polemizes repairer elastomers ranches groping evinced ligatured bulkier retainers"@zh ; + bsbm:rating1 "1"^^xsd:integer ; + bsbm:rating2 "3"^^xsd:integer ; + bsbm:rating3 "10"^^xsd:integer ; + bsbm:rating4 "3"^^xsd:integer ; + bsbm:reviewDate "2007-12-12T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-03-29"^^xsd:date . +dataFromRatingSite1:Review98 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product48 ; + rev:reviewer dataFromRatingSite1:Reviewer6 ; + dc:title "stonily polarimetric suasively prothalamion savagest lunaria smoothest installer regrettably gunneries outbuilding jetports" ; + rev:text "mamie vrooming passbooks ensorcels nonidentical defaulter leprosies suicidally usee carmakers menstrual housetop windrows gunwhale naturopathy benefic unbecoming manipulatively choremen surgically medalists snatchiest parishioners bellower optics tem punched gunnysack addictively eoliths lubes fripperies discerningly comfreys extricates respirable hippocratism venose psychotherapies hutzpa coelenterate pasta winglet prelimited wildcard cajolery cowpats unclasps swellings imponderably dechlorination hayers tnpk shakeout geometric suttas anatomical radiotelemetric intwining gyved simperers valiants brisling withdrawals twelvemonth provocativeness panjandrums marches ordinaries unseaworthy photostats aristocrats mw sternest anagrammed unproductiveness terms overshoes colossuses droved regales posits leaseback revalue keypunches authorities choric beguiling baldheads prodders ambulators exploitative reaver despotisms wildlings palpate keeping commingles glamorized vulvae overdeveloped scaffolded presses accusers quantities fulsomeness billionaire dowdy endive disinfecting fitter ageings curableness arguses rugs demoness receipted rasper unhanded obviating italicize lagers mementos chits sessions uplifters beggared equestrienne headrooms locating kennelled garrisoning cosiest hygeist tourney galilei preconditioned thrustor fencings cubans barkier hydrocephalic bilobed humbug verier tollmen rimes replated spyglasses senilities reassorts hematites binding honeybuns relives schlepp flavorless boasting sleepless fantasms recycled unhats deaccessions squigglier outdodged coiffeuses subhumans prominences sunbathers venin conformities clerkship snuggles jinns unselfconscious reversibly tributes russe moisteners riposts gunfighters uncomplicated hypochondriacal scabbiness conspiring herpetologist boycotts jilter bolter upsurges gloated pretensions cliffhanger maritally mushier vowing papers writes"@zh ; + bsbm:rating3 "6"^^xsd:integer ; + bsbm:reviewDate "2007-07-11T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2007-10-28"^^xsd:date . +dataFromRatingSite1:Review99 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product10 ; + rev:reviewer dataFromRatingSite1:Reviewer6 ; + dc:title "acquiescently pulingly steepest passbooks harassed olla glazes typists" ; + rev:text "perpetuum nanoseconds economics samoans infrequently annihilator centerfold tosspots planters exults incredibly accepter revaluated harshening rehired overstretched accumulating cs pizazz overpopulation graced glycogenic tufty pussycats honorarily motivities cranberries ogreish casings townhouses raser stockmen numbers lineups overlooking homesite unfits crappies lorries solstices quilled bindles ambiverts muncher ibidem outlining oviparous cattiness constitutionality hierophants anteriorly oilpapers moralist loggias wagerer recolors engraining lyrately hardpans tepees obliquities indeterminateness athelings dispatcher adjoins wads laserdisk ejecta depicters olympiads quos neuropathy woodwinds poorish disapproves casinos upholstered neutrally nunquam unclogs dormancies lenities crabbedness abases irradiating garlicky superceding soothed peroxides ennobled agglomerated breakfasted dunkers dazzles riskier cavy priority falsie epicene misdraws unprepared babies occupationally staminal imagined bards hugely chirruped monger peradventure jollier sandfly extraterritorial spatting disorganizers universalized estivating stalinist microphotographing farinas restraightens epicures strikebreaking ruptured epicene disgorge duckweed misfortunes parented coronets resourcefully bravure abrogators unshipped microscopies lowers electroscope enterable staggier abscessed artists cranes telluric cringer absentmindedly walkaways grouser controverting voluminousness paperers incurving rakers fastened lamellas jobber kissed embarks postmenopausal nestler dayflowers piastres schlock massy samaritan titivating dwarfed rootlike forlorner overelaborates escapable expensed entries complexness nates disloyalty decapsulate"@zh ; + bsbm:rating1 "3"^^xsd:integer ; + bsbm:rating2 "7"^^xsd:integer ; + bsbm:rating3 "9"^^xsd:integer ; + bsbm:reviewDate "2008-06-01T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-03"^^xsd:date . +dataFromRatingSite1:Review100 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product44 ; + rev:reviewer dataFromRatingSite1:Reviewer6 ; + dc:title "avariciously drawdown bene mille missis subseries maturities hagfish meshes obverting declinations mynas invasiveness bathoses slaphappier" ; + rev:text "bedazzling revindicating calcaria gleanings vellicating becalms arrogation unscrupulously inducing overprotecting overwritten stateliness repair adores anklet crawled renouncements angary allegorist election telephotographic centrifugalize quietist fairyism spartans reddishness saharan sunbaked lionization chitins fingerboards metastasis ritualize pillaring oxidizes annunciates jadedly playsuits vicegerencies forecasting acres segmenting menschen ginnier bawdies intricateness valiants mammotomy caseworks silversmiths dewlaps hymnary seraphims grumbler ruttier unionization bleeding aped immoderately diverting agitation drencher recrown misdiagnosed likable flitching atomism fortifier gasworks aimer lavation clabber decontaminations espanoles commy stagecoaches thrustor reframed nesting estreating syndromes odorants hairiest presentations readableness serenades jigsaws archbishopric reexpresses toxemia purblind clitoral disassimilate progs overindulge validating diggings couped incorruption reclassifies limberest boyos copped precariously guar diagnostically barbless toluol waviness resonating unendingly parasiticidic kibitzer contributors alcohols mezuzah gramarye costumiers upwardly radiometrically footing subregion"@zh ; + bsbm:rating1 "8"^^xsd:integer ; + bsbm:rating2 "9"^^xsd:integer ; + bsbm:rating3 "9"^^xsd:integer ; + bsbm:rating4 "1"^^xsd:integer ; + bsbm:reviewDate "2007-08-07T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-04-26"^^xsd:date . +dataFromRatingSite1:Review101 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product11 ; + rev:reviewer dataFromRatingSite1:Reviewer6 ; + dc:title "treating motorbike hypocenters charnel implodes anginas serviceableness leys flabbily repaginates lawless marbly" ; + rev:text "preemies quintupling rehears wallowers entwines capitulations coveter covers awakings deafer armrest ensnared encodings satisfier phantasmagory jeopardied shouting versify cinematographer vroom incurve inamorata laserjet misarranged midmonth prizes differentiating undecorated mullioning thermoses poetise kinder trampish watthour pastina diastoles fulsomely cosmogony redbirds trueblue chalah sphinxes limonitic seizer spotters faithlessness corner bulgier nulling shadowing flaunted horticultural ditchless cerates shimmed arsenious unlabelled grandees commonalty discordantly portcullises stopovers crowfoots sleds borstal dadas entendres smoothed gyve teddies underplay doggoning tomes amatorially celts sweltered imperium skiddier chessman embroiderers subsonic immoderateness voiceprints numbly ballistic hooeys noncellular pursing spillage gals abubble bractlets enchanting notarizations alaruming dissenters shammer believers kampuchea heavier slews interrogable technocrats ostracods disserve bursted spotting rhinestones residentially"@zh ; + bsbm:rating1 "1"^^xsd:integer ; + bsbm:rating3 "7"^^xsd:integer ; + bsbm:rating4 "3"^^xsd:integer ; + bsbm:reviewDate "2007-08-01T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-01-14"^^xsd:date . +dataFromRatingSite1:Review102 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product8 ; + rev:reviewer dataFromRatingSite1:Reviewer6 ; + dc:title "abradant hollowness miniseries keened rile recommencement mitts microfilm discombobulating pitches traumatized sprees unnoticeable" ; + rev:text "topcrosses heartily underbid sanctioned brickier reconsolidating sherbets prattled volplaned miso emceeing unadjustable womanizers vervet newsrooms truthless airmailed talking microsurgeon biologically bene lapis dinette disguisement polygamist kindhearted hilts birthrate fatsos headhunts enc deserved unilaterally beechy equalised scholarly harvestable berhymed waterpower fesse redeemer banked relapsers overcoats nigher vulgarizing constructed semestral vociferousness vocally cornu resonated melancholiacs mellowing approximations scapegraces helmless abjure blacks predictability marginally dendrologic idols navahos voila ramparts leprechaun limply durableness piratic alighted illuminable retaliation microbes friendship strollers homographs insurrectionaries unrepentant godparents coadjutors purer desecrated hydraulics adjectives properest subornation recentest chapbook knaps cargos pills sniffled freightyard interaction blearily confidentiality cinques outgo sufficer petrologists rimming irrigable annotates millets acrobats misappropriations incarnates minimums antimacassar roarings defilement racier proforma godlily overindulgence hookies carousals parceling stadiums muzhik redacting underacted briefly beamy wrapper zincic upraiser sluiced reutilize accouter hebrews staved datary congeed spieled rewarm paralegal shatteringly tieclasps hemophiliac prizefighters hippopotamuses vivification inefficiency nauseousness propjet earflaps claps mothballed dragnets loden antimonarchists racked levitical wages jerker saxhorns bricklayers okays cordons mirthfulness indictable mono hangfire reexchanges exits unforsaken babels unrepressed lode"@zh ; + bsbm:rating1 "5"^^xsd:integer ; + bsbm:rating2 "6"^^xsd:integer ; + bsbm:rating3 "5"^^xsd:integer ; + bsbm:rating4 "8"^^xsd:integer ; + bsbm:reviewDate "2007-10-22T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-01-29"^^xsd:date . +dataFromRatingSite1:Review103 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product48 ; + rev:reviewer dataFromRatingSite1:Reviewer6 ; + dc:title "indecency negroids malapert saltbox reintroduce unstates jestful smoulders plectra incubuses dissimulations" ; + rev:text "aberrance glossers legroom enfeoffing harpist paintier burblers genealogically druids vellicate copulates purgations corruptive pomeranians refutable flashes consultatory inoculates irrigations sixpences nonpigmented tollbooth dowery ganger rehire stover microscopist coercively oversize gunstock savouring collaterally cultivating panhandler apolitical moults timbers composedness stemless hematologist equivocating critical athenaeums karates constituting talebearer leftwing hastening medieval inquiringly prigs dislodge hellenism bearable extricated whiffing interring halavahs ergotized flagellating unsound openhanded dervishes inflaters hopefulness remaking groomsman unclarified solipsist ricochetting risibly frothier perspires mugworts deafness radarman scattering shacklers hammiest blooming knotting muckraked foreside digesters balefire celebrants despoilments unjustifiably kolinsky plumbery expatriating gravities bowlings perjuries plotting dialogic standpipes equivalencies stocks intromitted papaws cuticles shirrs effervesces praiseworthiness longitudes cruelties cardiometry drawable ominousness furrily cupboards stimulations remaking straits cannabism roofed wirehairs radials canopied uncultured compiling absconders lasher glissading flauntiest urbanity sympathies rehammered zygotes encircling ridiculed peristalsis manmade commutation tonies sweltering coopered icbm colporteur consumptiveness beckoned fungicidally pustulating approbate iterating entail noninformative unemployment sprinklings soubriquet acidifier apoplectically censurers disbandment embosoming regulations seafloor glottides worsening stunning flinders kilorads proliferous calliper knows clubrooms heartbeats colombians bounded retrospective acromegalic fratriage pourer peached rescindable cinquains togaed crowner reversers surmisers centimes motionless distaste disavow boughs explanations chaffering barbarously nonconcurrent mudsill ledger uptightness"@zh ; + bsbm:rating3 "4"^^xsd:integer ; + bsbm:rating4 "9"^^xsd:integer ; + bsbm:reviewDate "2007-08-18T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-04-22"^^xsd:date . +dataFromRatingSite1:Review104 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product23 ; + rev:reviewer dataFromRatingSite1:Reviewer6 ; + dc:title "starlike sociosexualities gabbing centrally crevices wails refasten" ; + rev:text "skald fullers fauvisms downhills entomologists muter encrust toilettes thriftlessness honorifically genealogical cretinized lived handmaid unoppressed reappraisal creaming postulator anointing furtively stimulative fixations encyclopedia conoidal repaved submember transitoriness burgles capsuled abbotship overplay amazingly rescinding subtracts remonetize nucleating wantons bitingly gunks dyadics epicalyxes tonsillotomy chivvying homeopathic goggles enflames electees quadruplication harries microseconds ureter curbing squishier obsoleting homespuns teared brutalize argons alcazars cleanest nobbles wadders aproning whirls supinate snowsuit bassets rousting emulative amrita bethels metronomic boozier handcarts reacted upboiling mucuses vising chemics reaffirmation imps bandying gooses sophomores trompes reservedly handrail upstanding unaided towpath reining jeannette eviscerate relapses comics samekhs doggy whiny clownish toggling scalier epigrammatize unpunished deviancy lutherans cannonade streamers monied synagogs stat caroller incontinencies highroads menstruations curving storminess reascent synthetical mispronounced hectometer meatier illuminance underdressing pooping capsular neighed brakemen tourmaline productions decidable particularly notching aquatint conductibility fivepins handsbreadth editresses whensoever nondemocratic squaws hauler fubbed rabbeting intravenously culpae rowdies fetted loudmouthed porously solecist piedmonts narcotine lugged duodenum throe odorizes shined brachydactylia reinstructs drearier parolable tougheners recipes residences narwhals guaranties gallbladder imprinting brimmer parturition"@zh ; + bsbm:rating1 "5"^^xsd:integer ; + bsbm:rating2 "6"^^xsd:integer ; + bsbm:rating3 "1"^^xsd:integer ; + bsbm:rating4 "5"^^xsd:integer ; + bsbm:reviewDate "2007-11-24T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2007-12-28"^^xsd:date . +dataFromRatingSite1:Review105 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product69 ; + rev:reviewer dataFromRatingSite1:Reviewer6 ; + dc:title "twiddled chillum coursed chowtime luridly frivoled" ; + rev:text "others clambake redistills typebar underscoring testis yearned hardpans discoverers qursh otherworldliness valorize rewire holdalls decalcified persuasions wracking acing coempts subminiaturizes penalized patching refracts grovelling gospelers geodes microfilmer procapitalists petters planets stemware swapper hatefully musings arborized herculeses scape libelant plutocracies potsherd charlatanism jailing brachycephalies unbeholden depressing hallucinative antiphony funnelling renewers utterer ailed hurtling furrings siphonic snippety semitropical untouchably newspaperwoman unshackled quintets bushwhacks spaceward ridgier algicides escaped swimmiest handicappers shunner fileting sampans prestigiousness athenaeums vulva floccular eyestalks excitability ope genuflecting dopier idols presagers draggy"@zh ; + bsbm:rating1 "3"^^xsd:integer ; + bsbm:rating3 "2"^^xsd:integer ; + bsbm:rating4 "2"^^xsd:integer ; + bsbm:reviewDate "2007-12-30T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-02-17"^^xsd:date . +dataFromRatingSite1:Review106 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product36 ; + rev:reviewer dataFromRatingSite1:Reviewer6 ; + dc:title "suspensory nonexisting locomotes phenotypic" ; + rev:text "supperless bobcats villains agnostics seasonably witchy epigrammatizer reacclimated roadsters grides interceding craniate selvaged purisms chimbley slaty modernist quarterfinalist pestiferous larker dehumidifies chewers unmasker clowned homicides unspecialized perturbing dementing paychecks arete quietly churns regrets quitted curiousness preallotted bipod outsmarted pointiest tighter stratocumulus disgusts pasta apostleships iterates sawteeth nits paralyse skimped pintas chelas humiliates arabesk nonnumeric cavorter precondemn impurely hemming undiscernibly kepis menials truckler scratchier sequestrate usherette fides headshrinker bandwidths hygienist violator enumerations findable dadaists"@zh ; + bsbm:rating1 "9"^^xsd:integer ; + bsbm:rating3 "1"^^xsd:integer ; + bsbm:reviewDate "2007-11-07T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2007-12-15"^^xsd:date . +dataFromRatingSite1:Review107 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product56 ; + rev:reviewer dataFromRatingSite1:Reviewer6 ; + dc:title "numerated conjugant permissions unexaggerated doddering legislatrixes fluoresced brattier lepton debriefings positivest bloodstreams surprints niching ineffectually" ; + rev:text "weskits befriends drinking demagnification serifs slivovic washouts oglers imprimis reharmonization interrogates frizzled nonodorous cacodemonia bluejackets preaffirmation taphouses quaverer brahmins quietisms entrenched collided smartens molls blusher jingliest pollinator recitalist immensities microgrammes hammerlocks suffused unalienated riffles autarchies furuncle lamed lavalier huffily dovetails coacts lymphomas readability admissibly capriccios striker expects traceability forelock complainer proselyte animated macadamizing brooking wounded shepherdess cannibalization disenfranchisements lathings anniversaries marinaded inappreciative spinsterhood gibers unprincipled papered damselfly pawnor blowups callosity guitarists mistuned nicely"@zh ; + bsbm:rating1 "6"^^xsd:integer ; + bsbm:rating3 "1"^^xsd:integer ; + bsbm:rating4 "5"^^xsd:integer ; + bsbm:reviewDate "2007-10-03T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-01-20"^^xsd:date . +dataFromRatingSite1:Review108 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product56 ; + rev:reviewer dataFromRatingSite1:Reviewer6 ; + dc:title "occiputs exciseman glazed hashing seedlings doctrines leathered" ; + rev:text "nightrider od disorderliness nepotistical defining summoned procuring calories chaffered beholders pillions disgorged billiards chambrays weighers frolicked processions precociously harmonizations crowds deathblows walloper unsuited retracts soarer certainly conspires chuggers unforgettably underminer garbs louvers racialists confesses batwomen joyousness childbearing nutty nictated guarantying equestrians unbudging bottoming lumberyard supervention savable expectedly reproductivity dollish coquet distinguishable playsuits seamers lookups crossways zoroastrians undefinable stickmen coaming cuckooing gyrocompasses gayness stupefied erroneousness analyzable sirloin negotiatress adumbrate backsliding snitch sidewalls rutherfordium counsellor untraceable ungulates alternatively pseudopod"@zh ; + bsbm:rating2 "8"^^xsd:integer ; + bsbm:rating3 "4"^^xsd:integer ; + bsbm:rating4 "5"^^xsd:integer ; + bsbm:reviewDate "2007-07-07T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-01-25"^^xsd:date . +dataFromRatingSite1:Review109 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product40 ; + rev:reviewer dataFromRatingSite1:Reviewer6 ; + dc:title "humanized slipsoles sonatas seabeds compted unstacked resold tauting kerchoo abjectness" ; + rev:text "gombos clearinghouse remodify disobeyer skirts whang gorged southers disparaging drubbings synthesized intermediation unrighteous overdecorates bombardments shoppe parturition sighter pricelessness optatives hobbit fetcher peculation bedsore caviler electroencephalograms scurrying newsboys unclogging towery malices cubby unavoidability clarkia viaticum anthropologic whisky hexed cosmogonies clagging defecters dedicates gamiest eiderdown bluffing spatter multicellular farseeing inappositeness reawakens jodhpur baptismally unsatisfactory hemotoxin phenothiazine dimensional convalesces kilts outflows griddlecake diggers beechen bedbugs sourballs foresee veined overestimating judgmatic obligated militants aggresses voices declaratively utopists wooers cuter misarranges driving seethingly staging unappealing laptop metrifies alpinisms moderateness dimwittedness palavered concentrating cubism woolpack fourposters summerly alderwomen outstation cruising tighter fratriage cecal illusionism whelming infolded rushee vivisecting clienteles motioners worses confabbing vernacularly maenads bucksaw pips compere reckoner nonsubmissively devoted bikers tankage pityingly engrams overrating endocrinology antimonopolistic earwigged devilry guerillas windrowing includes paresis predilections faithlessly encasing pinfolding broomiest mapped bequeathing polyandrist swished evanescence wheyey conciliator areola"@zh ; + bsbm:rating3 "2"^^xsd:integer ; + bsbm:reviewDate "2008-03-28T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-04"^^xsd:date . +dataFromRatingSite1:Review110 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product64 ; + rev:reviewer dataFromRatingSite1:Reviewer6 ; + dc:title "knifed bocks compactors durnedest sempre queering etiolates" ; + rev:text "managership reaching bogs isomerizing nonexistence sheeter vendibility grays godship laggard guppy unevenly viruses kowtows stouthearted compatibles mouthers operands persisted wonderers nudists charry criticisms peart abashment sterilizer macromania headers refueling otters crucifying grogginess litterbugs disgraced ionizing rabidities obtrudes robes laggers demounts yesteryears unhung ungenteel slaphappier slinky inculpates nourishers outgrowths bluefin infertilely rusticating filagrees moonlet stirs gravimeters informers arbitrative unrectified stigmatization innovating maneuverer perpetrates corporeally wareroom coddlers woodbin pleaded hipbones aldehydes ambiverts rewinder defoliators egregiously overrules gravamen remissions bedlamp inundant applicator reddest vacillated chamfers shouted direction passable questions refigured ethicizing reefier cats primings aerified yonker ridged monomaniacs decocts boniest undercuts charioting fieriness upbraider bihourly acquiesced trichinous whiffer petitions bracketed conviviality uncurling tentacles choiring searchings incontinently braised unitizing exacts toucans djinns moonrises escalatory painfulness stiflers lackeying slouched moralizer maziness fumigating defalcation bitterest quitter laniard deflagrations pancreases superimposition interlards knifes piratic matrixing moistures shoestrings rescission desponded revictual caterwauling unresistant"@zh ; + bsbm:rating1 "10"^^xsd:integer ; + bsbm:rating2 "6"^^xsd:integer ; + bsbm:rating3 "1"^^xsd:integer ; + bsbm:rating4 "3"^^xsd:integer ; + bsbm:reviewDate "2008-05-13T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-25"^^xsd:date . +dataFromRatingSite1:Review111 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product36 ; + rev:reviewer dataFromRatingSite1:Reviewer6 ; + dc:title "milliammeter flappy benefactrix shoveling magically actually immobilized cooeys excreters corporeality smoothers outpatients clenches optionally forjudger" ; + rev:text "cultivated obstinacies sipper dewlap nomadism nippers jejunely reverberator unstinted boyishness lumbered antihistamines degermed reanimated unlined equalises criticality windiness decentest dialysed noncontroversial linguistically foots pressruns regnum suppliers unchangeable sporting asterism woolgathering repairers dyking nonuniform utilizers amebas doubleness explosively yachtsmanship bifurcation unwinders fixable edemata jackals dubbed opaquer cruelness catwalk giftedly skidooing quatorze rebinding picaro mistyping odorizes unable occulters mosquitos heartbreaks dishcloth twinkler vocation concretions embattles pipetting triples waylayers redeemed pummelling reasoner criminologies viscosimeter cubicles shippable humanitarianism mohammed stereospecific posted bandies imperfectability latins chopsticks inexperienced pigmy grinds dinging deforested digitalize moonstruck ignitors groping demotions experts trefoils impeded savourers tripods cheeseburgers mustards sureness contrariness frisking probeable skittered prehistorically intertwining gulpier eolian uncharitableness overrated screwer encipherment zoophyte devolvements portraitists attorning cubicles nobbily ices wooding sturgeons crestless"@zh ; + bsbm:rating1 "7"^^xsd:integer ; + bsbm:rating2 "7"^^xsd:integer ; + bsbm:rating3 "5"^^xsd:integer ; + bsbm:rating4 "3"^^xsd:integer ; + bsbm:reviewDate "2007-12-18T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-13"^^xsd:date . +dataFromRatingSite1:Review112 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product60 ; + rev:reviewer dataFromRatingSite1:Reviewer6 ; + dc:title "parasols jujutsu profanely midsummer uncharges noninjuriousness espied prefabbing" ; + rev:text "encephalitic potentiometric unscaled houseless revivify anchoritic nautiluses wailing fertilizations czardoms disgrace psychodynamics cudweed partly granulators nonobjective synapsing reportages missiles jungles cheers riced savorers sightly mistermed conspiratorially abstractly draught ostracizes droller subcellular scything familarity unnavigable chondrites typesetters phrensy risibles accusingly turboprop scarcely acclimated hypochondria blockhead tyrannizers vivisectional attained dispersions renewer mongers schizophrenics preoccupations mining pontificating distends physiologically curtaining capitalists hellenes skies turbos populaces basseted dilettanti recreated reg exterminates psychiatrically borts prandial congruencies veneering humidity triaxial pecked dissimulator cynosures uneconomical irritants neptunian decahedra incumbered explosively defogs refuted idealizes pillared wiled peruser palsied epizootic bottles ducking seraphic beigy conjoined bankbooks flapjacks convictions annuluses firkin wiver proselytizing naughtily wainscotted capitulating poxing patronized"@zh ; + bsbm:rating1 "9"^^xsd:integer ; + bsbm:rating3 "7"^^xsd:integer ; + bsbm:rating4 "4"^^xsd:integer ; + bsbm:reviewDate "2008-04-14T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-08"^^xsd:date . +dataFromRatingSite1:Review113 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product26 ; + rev:reviewer dataFromRatingSite1:Reviewer6 ; + dc:title "heightens apiary sauls saprophyte saddhu slighted fixers matchmaking diazepam zarfs blowtube unlikable improvisational beanery gunwale" ; + rev:text "timorousness reaffirm breastplates simplifications fetor sellers guideposts bicycling overpromptly russify revaluates jeopardies raser parasitologic cloacal luridness gasper purins beaks pretending oscars fulsomeness acidifies phonons communications crambos expellees incipiencies uncleaned rebirth terrarium rinsed pbx relabelled sharpness coconspirator bespangle batholiths restaffed reinduces depoliticized nuggety caucused fifing fritterers unstably overelaborating gazpachos freakout slumlord orangs gothicist alluviums sinned jowlier lumper merchandiser uncompromisingly quatre fluxing lariating centuple catechumen inspectorate foreruns pulper brokenly discontinuously diviners channeling elaborating eccl prefigured porkpies tiglon pitiless grandmaster rivederci vowelizes gleba plods nappes scorner mellifluously basifier watchfulness psychically deterioration lummoxes fullface enlisting calcimine electrum discharges dyspeptical refractured indelibly welshwomen boffos thankfulness fogyish sippy prayerfully twofer drafter retrocede pianos gimmicky prediction summarized creates noninclusive inhibiting fantasias racoons pustulation driver beaters spindlier ventage palatability contextually towhees condoles uninterrupted austerities anticyclone caponize movies conceiting absolutely bejeweled dovecotes misdates header mediums naut releasible instigation fenestration ammine centeredly abridgments establismentarian geniality crestal innkeepers"@zh ; + bsbm:rating1 "7"^^xsd:integer ; + bsbm:rating2 "4"^^xsd:integer ; + bsbm:rating3 "7"^^xsd:integer ; + bsbm:rating4 "3"^^xsd:integer ; + bsbm:reviewDate "2007-06-23T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-04-28"^^xsd:date . +dataFromRatingSite1:Review114 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product30 ; + rev:reviewer dataFromRatingSite1:Reviewer6 ; + dc:title "pollutants tarweeds apothecaries disapprovingly bonefishes luminously riots gondoliers cannonaded" ; + rev:text "relearn cardiacs demoness jetsams cymbals bedlamps majorette preinserts embassador unfair braising underfeeding machinists color seizors expectorations computerization heelers understandable myriapods mouldering shammied overriding toepiece sufferer lusted jackhammers postern entwisting boatswains sorrily alluvials harpist schmaltzy apostacy packsaddles nonautomatic alcoholically bombasts bawdiness calculatingly serigraphy napoleons rebels decriminalizes foredid protons materia totable subclan airmobile rising overladed herded pendulous obliges liberators microsystems foments involvement putterer femininity tropins heartaches platters sourish gambias footgears dissolvable familiarize aitches acclimation unobliged modulators superabundance shoestrings uraniums revilement wainscotted"@zh ; + bsbm:rating1 "6"^^xsd:integer ; + bsbm:rating2 "2"^^xsd:integer ; + bsbm:rating4 "6"^^xsd:integer ; + bsbm:reviewDate "2007-07-13T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2007-09-13"^^xsd:date . +dataFromRatingSite1:Review115 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product48 ; + rev:reviewer dataFromRatingSite1:Reviewer6 ; + dc:title "releases kaleidoscopes uke walleye boondoggles chemises emend" ; + rev:text "chastened flimsily opinionatedly gigantically coopering oddish iring pounders overweigh sourpusses dodders heptoses kilos procreators suffusing mibs foldouts restamps amnesties unappeasable gnawn pointillists capturing pemmicans evictee conceptualists ragtimes relented meerschaums proving inundated kidders spangling trays lymphoid aversive dishonoring reforestation outre yoghs khakis analyzer prosaisms mischarges oscillometer darndests polyandrist subsidize grunion drayages brushwood mussiness viscoid devouring cancellation vestigially handspring scourger besnows obbligatos outlasted santonins sunstruck interdiction hefter burier localizes empyreal puppies canoes jackknives centenaries arcaded feasted womanizer orbitals curvy tablets cuttle censer brains caryatids cavilers flabbergasting irrespectively knackery sociological lownesses trysts timider packagers acronyms subscript heroics tranquilized winterizing subdefinition astrals unsympathetic defeminize infantility mimics adultness partiality slideways massagists fleetest objectively raving views cleverly bullring delimitative teashop radiographically clodpate outfielder explosively worms treasonably aplenty circumcisions caballed breeched backstroking sagy outreasoning jiggled pinchpenny mouthier stemmers ringleader pendents shaping bigamously rounded swingiest dollying equalized somewhats jukeboxes fettlings palpators lightfingered swingiest preordained weighmaster slushes swale sloshy griped revaluations pushups galilees anthropologic tapiocas tectonics homogenizers visitors concourses photoreceptor chimp dickenses temptable knotted subjecting ween hexagram stinginess contes reconveyed atoms insufferably uneasily fortresses welkins cervixes annexure hygeist nearliest undersecretary fructoses aeriform thyroidectomies titers"@zh ; + bsbm:rating1 "10"^^xsd:integer ; + bsbm:rating2 "2"^^xsd:integer ; + bsbm:rating3 "10"^^xsd:integer ; + bsbm:rating4 "3"^^xsd:integer ; + bsbm:reviewDate "2008-03-15T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-04"^^xsd:date . +dataFromRatingSite1:Review116 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product25 ; + rev:reviewer dataFromRatingSite1:Reviewer6 ; + dc:title "warmers perfection dandruff skinflints" ; + rev:text "furores acknowledger soppy disobedience detectible beading italicize caviler umpteenth monarchist morphogenetic redigested baptised spatially mineralizing rescindment kakemono individualists disaccharides hereinto venter williwaw chagrinning hutment mordacious cucumbers binoculars engilding futuristically tantric betides odic muddies antipersonnel yesteryears relishable righto expurgations gins easterner angas dichotic lanai plats vulgarizer gondoliers prebendaries appalls enfeoffment gringo moony plenarily yells desiccant quackism unused persistency circulators notchers tobogganist libidinally sneaked adherers witherer foramina quadruplications tropin yawping fixities shebang prongs hognut primo diviner accredits solitudes milepost ixtles copolymerizing deletes uncountable nighters nucleating censusing monstrances meringues tongues metastatic presentiments unbraiding garrulously shiva presidiums decollete shears baiters anthologists toddler sexualized alternative nipping unsentimentally biofeedback pustule blacking reflexed demarcating outcastes signalers professionalists indemnifier attester redistribute calor fortuity slovens misspelling chestfuls shapeliest micros luteal needlessly anchoritic cowboys larges complimenters intruder materiality gruesomer diffraction mortgagees unarticulated metazoans blathered roentgenological giftedly affirms hilariousness physiognomically unmuzzling buffoonish"@zh ; + bsbm:rating1 "2"^^xsd:integer ; + bsbm:rating2 "1"^^xsd:integer ; + bsbm:rating3 "1"^^xsd:integer ; + bsbm:reviewDate "2008-03-03T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-04-26"^^xsd:date . +dataFromRatingSite1:Review117 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product30 ; + rev:reviewer dataFromRatingSite1:Reviewer6 ; + dc:title "unintellectual roasted downtime engulf dibblers" ; + rev:text "hauteurs radially uncials hungered blushfully furnacing perjured usually weakness astrobiologist understates drunkenness pettier cowhides moulted entwined frogging whisks godheads subvaluation isometries fatuously babuls dirk refinish sickles moola sisterly bartered piccolos mediative starers exorbitantly myopes hexapods ghostier keester sponsorship swanherds hyperion unapprehensive desalinizing physicists electrified insisters pesticides viceregal eversions countersinking glycosyls massagist housesitting appetizer minuets capuchin quadruped highbrows backtracks others projection hogtie curers stereochemistry endamages quarterdecks arapahos cartloads supes nippers hooey colorant ankus truffles"@zh ; + bsbm:rating1 "6"^^xsd:integer ; + bsbm:rating2 "1"^^xsd:integer ; + bsbm:rating3 "3"^^xsd:integer ; + bsbm:reviewDate "2008-06-11T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-14"^^xsd:date . +dataFromRatingSite1:Review118 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product22 ; + rev:reviewer dataFromRatingSite1:Reviewer6 ; + dc:title "untranslatable peevishness privily astrologers" ; + rev:text "schussing apneal doodling reendowing catapulted quipu jousting ringmasters acquiesence donjons descried fins incunabulum coprocessors unhandy pangolins upswells wholes coordinator outputted prudentially oceanaut tautened tarps scrutator internalization mouthy dermabrasion glassed esophageal chilies claxon quarantining sottish excisions drapeable homeopathic apocryphally bashing aggregations salivas incautiously manus metamorphosed mitts unpossessively gainsaying reenjoyed geums bluecoat belling cabined keeler comity gaveller yowie coaches kicking lagoons unexpectedly gnarled encapsuled consummates mistbow tumbling tantaras airfoils cliquishly subbreed goodnight unaccomplished gibsons shopping gayeties injudiciousness dialyzed mudsills preaccustoming cotyledons nonstrikers gonadectomizing relinquishing deducing sistering fishways rippliest humanness polemics primitives curing jabbering niches assagai caromed impurely portrayed chias kynurenic seconders halberd optimists yielder gibers stoniness reattach gloggs claimers reinform dilatations overrefining zizzling kicks interplays playsuits reorganized saves tabued fistic remigrates outtrumped totes sadomasochism dismally roofers ajiva uppercuts immedicable grapier zoophobia priviest recutting spindly verminously androgynies wonts waisted fingering sullenly receivability territorializing transitively luggages diacritics denounced lacrosses swordsmen cheatingly enjoined teenyboppers chestier marrows iridescence calculably poky unendorsed riffles appendant wedging cryonics supports interdicted suzettes regattas gracefulness thrummy swarmer byroads suppliant sceptering rebating dayglow roisters balks provability seniorities pastorate urogenital vowless fingerboard multiples conjectured"@zh ; + bsbm:rating1 "6"^^xsd:integer ; + bsbm:rating2 "8"^^xsd:integer ; + bsbm:rating3 "2"^^xsd:integer ; + bsbm:rating4 "7"^^xsd:integer ; + bsbm:reviewDate "2007-10-22T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-04-01"^^xsd:date . +dataFromRatingSite1:Review119 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product32 ; + rev:reviewer dataFromRatingSite1:Reviewer6 ; + dc:title "inspirationally lapful xanthine orderers abnegation predetermined polydactylous contradictions fistfuls falling sulphury ethereally" ; + rev:text "disheartened misalleging bialy supportance amended battlewagon snarks starship denuclearized shotted grueller defers rasping vanquishes jingoist chats chagrining rasping gendered sneering unjointed inquisitional kremlins claspt biking styptic peculators adverseness schul gloriam railers beadman copartner endorsable audiologist filespec childbearing impenetrably pasturage tonsillotomy coders enjoyable nobblers misgovernment shadier jailors relocations transfuser brashest lienee gainsay totemist pasts sweetens smokes gunplays capons thews tattlers mourner muumuu delusionist saunterers voluntaryism rephrasing immorality bankrupted falsetto flurries lorry harelipped hydrothermally flippantly sceneries logarithms incurability acetones humoral goldurn vitiating featheredge trumpets druids bowknot slithering coiffeur scotching spermic xanthoma subcategories degenerations dramatis historicity polynesian shiers hypothesize abbreviations devastations driverless chatterer incarcerating quiddities smuggled operability enigmatically duckweeds filched waggons puffs tellership allopathies rehearsed raddled sublimity morphemes thriftiest squared twinkly contributorily concourses miscue ineligibility swamping pretzel midmorning seconde congratulating foulings inserters bellowers burdocks footgears departures aphasias mismanagement subitems hesitations banditries nitros burlier mooring detours evenfalls anecdotist devalues conductors noisemaker squished languisher defending billowed gourmets longships cricking tenthly interface rerolling hazarding hagriding manorialism haggler metros dictatorship painlessness shaded unscrupulous dissect attainments oppositely dietitian shingler chronometer"@zh ; + bsbm:rating4 "2"^^xsd:integer ; + bsbm:reviewDate "2007-07-17T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-02-29"^^xsd:date . +dataFromRatingSite1:Review120 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product62 ; + rev:reviewer dataFromRatingSite1:Reviewer6 ; + dc:title "filmography sloshiest miosis foredoomed naiveties bareback ideograms flintiest knowers coolers kimonoed dills" ; + rev:text "whored vittling ceremoniousness suggestiveness rosily absenting unsteadily shews begetter clannishness deports loveless gadabouts whopping alluvia poky resituate discriminating threshing quarrying erratas cosmetician louses lathering hexad corsets patrilinear housetops grogs enroller sprucest ratch tourists caching stinkers funiculus humanist reproaches tzimmes impalements afforded counterpoised uninspired mystiques exotics dressiest encumbered squishier selected jazzer parietal enveloper opossums involuntarily dx titaniums organs posteriority gatekeeper discommoded vitiated anils demobs solaces spacewalked polices undisputable multicellularity rambunctious mala establishes gramps rattlebrain shmoes skivvies unobserving serous nobbled uvular sneezed prologuing sneaking foreseeability macerate defogger chemosterilant shipments inkiness hepcats particularize groveler travesties counterinsurgents quizzing deiced defalcates impiousness restraightening lollygags helving freehearted mismate mooniest unattended anilines garishly rhizomatous piddler lozenges patentees liquefiable subheadings fatalness hoisted keywords banner depositions fiendishly noninheritable upchucked phosphatic trencher commendatorily tuxedos borsht levator reproachfully substitutions distribute ratfish sportful finalize fricasseed gelled vizard reengaged dramatization preinstruct morph polygamous ringtail dirked valkyrs venoming inassimilable velds ceaselessness"@zh ; + bsbm:rating2 "9"^^xsd:integer ; + bsbm:rating3 "9"^^xsd:integer ; + bsbm:rating4 "10"^^xsd:integer ; + bsbm:reviewDate "2008-03-04T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-13"^^xsd:date . +dataFromRatingSite1:Reviewer7 + rdf:type foaf:Person ; + foaf:name "Athalia-Diellza" ; + foaf:mbox_sha1sum "fac79f4faa4c9a6b957d5f1380835a4dfb50" ; + bsbm:country ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-30"^^xsd:date . +dataFromRatingSite1:Review121 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product88 ; + rev:reviewer dataFromRatingSite1:Reviewer7 ; + dc:title "mummies bulkily ovarial uncoupled campo oligarchical rummers rotation" ; + rev:text "validly ripplier deadening thrillingly shunpiking redundances slimier neckties derailleurs gestated incaged reinserted disapprobation bioecologies unpretentiously hellers hoke dispersement legationary martians mulching afterwards befuddler gobbled sponges futilities hacklier preposterousness muckluck disembark chimps mouldered confidence solacing leered slavishly crankcases boarded neatened misfeasances bisects manufactories genetics flirtatiously damnification laborites chicos schoolhouses sporozoon pumicer snorted fructified fagoted predicating tiltyard zincing rigamarole tolbutamide counterrevolutionary lassies gulfed emancipates bided overproud admixt incriminator alfas weariness shiftier lickety incumbers laureateships conveyancer maharishis splinter hatracks lightening upholsterer atrociously dismounted unwinding moxa intended defeminize scrabbling relighted oratress fizzles stoneworks"@ja ; + bsbm:rating1 "3"^^xsd:integer ; + bsbm:rating2 "6"^^xsd:integer ; + bsbm:rating3 "7"^^xsd:integer ; + bsbm:rating4 "9"^^xsd:integer ; + bsbm:reviewDate "2008-02-06T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-02-23"^^xsd:date . +dataFromRatingSite1:Review122 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product44 ; + rev:reviewer dataFromRatingSite1:Reviewer7 ; + dc:title "fecundate grenada genitors alizarins octuplet rigorists assumptive cackled smilers snoopiest universes trousers oarlocks marlinespikes" ; + rev:text "scarting contemporarily wether portaled treasurer bhutanese kitschy reactivate dioritic maydays tenderheartedly unconsolidated inclosing lariating hornswoggle racist raped charbroils overwise crabs casa pinesaps debilitation tryout derivations azons neared stages effervescing aspca profiteering moiler recooking passant quinins whackiest deluders gimleting revisionist loungers cyclos recommencing anythings styluses fulcra ridgy cunts psychoneurosis omikron materiels neurosurgeries forebearing batchers wontons besoms rhinestones heatedly hugely heavies afterthoughts mortised hateable postdating unstraps titter dubonnet forbode deceptiveness universalizes tannish physicks dressmakers cohesions isthmuses grumpiness tollmen flatteries frenchwoman ebullition noninformative foresaid transformer leukocytes cellos leanings linked rumbly rustily archdeacons eudemons scorner cogito impinger arteriosclerotic rucks manifestos cuddliest alderwomen reburying customhouses latherer microforms serow constituency dubiety popularizes portcullis burins amenability circling kinesiology flawlessly fulnesses wiggled angelical tiding silicoses pud happier concussive commutative scintillated jeopardizing seasonableness"@ja ; + bsbm:rating4 "8"^^xsd:integer ; + bsbm:reviewDate "2008-04-05T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-25"^^xsd:date . +dataFromRatingSite1:Review123 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product17 ; + rev:reviewer dataFromRatingSite1:Reviewer7 ; + dc:title "busby reverses traditions unbridled odors elative howdah waving visits" ; + rev:text "tabards devaluated defuze pigmentations tales cornucopian tetras egad hybrids hausfrauen preprogrammed smartens refined mucilaginously executors manageableness honkey cabmen dialyse ducal claymores delawarean spacial grinner walker desexualization tattoos greying intestacy mechanisms towaways foreknow subrents nurturers beholds bravados engendered tangliest fiberizes streaking gelding disclamatory hexyl peroxided manually toothiest unbent camouflager stanchions undergird classical rearguing slurried schmoozed cyclized workloads tuberculous behaver buckram perdus farmyards ferreting faultiness foreteller manumissions youthfulness seismologists negotiatory vapour valvelet castes designs kitlings sleepiest psychoneurosis allocates resealed fishes graphologists conspiringly nondistribution derogating flues discomposure flashflood issuances justle cosmopolis slurries jitterbugged evader tomfools internality simplexes unhands cavaliers collated mathematically evermore maharanis shrives restacked lived sports interleave daintily assertively hexads curettes spacewalkers froes blender comelier barograph loco breakwaters conditionalities ketchups rattletrap moues misunderstandingly nauseated reshowing wipers astrolabes matey acknowledged categorizer systemics bores preheated atropine capping tawniness contemplating dumbwaiter sonnies woodpeckers topers uploading moneybags debauchedness blameful archetypes trimly dicer pseudointellectual tests pastorales nonprofit decalcifies defeminizing pounders epaulets criminologic alchemic theorize photophobia"@ja ; + bsbm:rating1 "4"^^xsd:integer ; + bsbm:rating2 "9"^^xsd:integer ; + bsbm:rating3 "6"^^xsd:integer ; + bsbm:reviewDate "2008-02-02T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-03-26"^^xsd:date . +dataFromRatingSite1:Review124 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product88 ; + rev:reviewer dataFromRatingSite1:Reviewer7 ; + dc:title "papillons cairns drumbeat scything toys bastardized phosphorescently hardens kneepads vulnerabilities surpriser thoroughness masturbation filially improbability" ; + rev:text "voyeuristic borzoi decocts orchids monolingual millworks skiddoo splashiness unworthier channelization dingdonged potpourris improving dadoed rosiest dubio cloggiest centralizers encircling haziest sleekens whiffling preconsultation posited opulence cresset exerting summonsed buskin ejaculatory cembalo eonian restoratives prepackaging minifying equivokes reading intuited rafted exploitative nitritoid dispenser blandishment masscult indicted hemokonia octettes conspirers absinthes krills lox execrators animation deathwatches savories amassing meatballs blockaded sinker marlinespike manifoldly bellicosity skiers megalith apologizes poetize shrived gridirons abusage bashes turfing introverts undisputable malingered ghostwritten gearshift excluded pantheistic heaped xerophilous czaritza rusks strainer seppuku roadrunners sailboats lignified crenels pursuance manuevered slugger accusers chequers dismemberment cleaner diphtheritic facetted soapboxes mattresses tartans flatulencies stacks afrits lymphosarcomas bluntest constrictions slurped amaryllis illumined gridirons soudan polydactylous inattentiveness customers causative jasmines modulators retracing cosmist intelligence selectly unusual infraction fostering upshifted toeplates ocelots decayers receipts antiquely lurker heeled equivocalness millibar begrudgingly sizzlers pacing lusher prisoner maniacs semiconsciousness teaks aggravating marquise aluminums anguished burglariously glossies pagandom outraced supplied typeable tightener hotrods disclosing luxations senoras"@ja ; + bsbm:rating1 "7"^^xsd:integer ; + bsbm:reviewDate "2008-06-09T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-18"^^xsd:date . +dataFromRatingSite1:Review125 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product46 ; + rev:reviewer dataFromRatingSite1:Reviewer7 ; + dc:title "nippiest riel likeness platys assimilating durabilities" ; + rev:text "agilely listenings glacises hypnogogic reread frustratingly crispily canopied pinnated sturdier recorders factotums halvahs tuxedos scummers tubas splines suffuses medicaids binal buffoons cheerleaders loweringly springiest approvement advertising exemptible samekhs happened canzone jollify infirmed accruing grippier splayfoot cannibalization diapered cabinets appetit obfuscation sexologist fifers remonetized faring keelhauls overstates centre defogger uncomprehendingly sepulchered ancientest caponize pusses plashed wheezed prospective consecutively tripodic impellers subprincipals lentos felons aced henries diapers overgrows dawdler iodoforms biblically modernists vaporish wincing enflaming swiggers spreaders grubworms chicness nonpredatory nonbeliever duplexer peakish sweepstakes macerated itemizations shales remailing priedieux disavows ergonomic reviling shagbarks lavalier unnourished photomurals instructed causewayed rejoicers refunders deviling scarcely fevering investigated chimer galliard ionizing screaming designedly disentitling improvised brewers convects freezers calligraphic biochemist wrongers breakouts flunkeys agapae illogicality incarnates freighted bellied styptics transshipment mailbags taunter dwarfed stolidity adulates spadices predomination psychoanalyses shadowiness wined technologists mizzens appeasers bouncier twitching lacer neurasthenically"@ja ; + bsbm:rating1 "5"^^xsd:integer ; + bsbm:rating2 "3"^^xsd:integer ; + bsbm:rating3 "2"^^xsd:integer ; + bsbm:rating4 "9"^^xsd:integer ; + bsbm:reviewDate "2008-04-30T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-09"^^xsd:date . +dataFromRatingSite1:Review126 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product40 ; + rev:reviewer dataFromRatingSite1:Reviewer7 ; + dc:title "satisfiable async insurrectionary concocting eventually lamented reseal prominences saluter hedgier marching" ; + rev:text "generalizer portioner formulates hopelessly conceders autoed reposer resection outing debarred conquering modula hotbeds disowned gibbered goldbrick mockingbirds disserve bucktooth accusatives rediscounted skyjackers intermezzo legalistic nutpicks gouramis discovered fatting guiders bosomy footgears secondarily apologists hospitalized cypruses velds lippiness belaboring dwindling gravelly enticer expatiator peevishness despatched eggers stirringly abolishes serviced unhip misplace whetter wagering gweduck eductions reconsideration capitulation inebriated insulating heinies castrators douching fazed anthologized thyself embarkation pestles colonized rhumba tramps serenaders unmingling ozonizer jacquards resettled whoosis falconers unsaturate impracticability forbidder depreciating cornstalk elasticized faculae falsity grownups polemicists yonder nappes reinforcement nonsmoker fictionally bloomy disorientates strives roadblocks dehorn folktales whaleboat brayed amnestying signifier entities christianize immediately nervation toffees gulfs colonialists jazzily repenting murderer zooms moxie resolder emulsive painkilling woeness microform littlish familarity cerebrally skydives deadened kinescope indigoes fucking ferociously schoolyard commoners pellagras whacking overissue performable nicest plates underclothing lyrical frivol apologist grot pouffe proverbs chauffeured encompassment limiters smokepots bombes smudgiest pekinese lames lancets bombards boomer palmature foredating whirled dampeners chattering weakening denseness drogues emmies reverters facia succubi exonerated foodstuffs septuagenarians sepals introspectiveness harvester cybernated tearoom incumbering skittish unnoticeably plusses demasculinized"@ja ; + bsbm:rating1 "10"^^xsd:integer ; + bsbm:rating2 "7"^^xsd:integer ; + bsbm:rating3 "2"^^xsd:integer ; + bsbm:reviewDate "2007-11-29T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-03-19"^^xsd:date . +dataFromRatingSite1:Review127 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product66 ; + rev:reviewer dataFromRatingSite1:Reviewer7 ; + dc:title "natures foreskins businesslike disinterring" ; + rev:text "aquiculture paradisiacal metrics heckler postulants evangelicalism scroungy subsidies baedekers demagnification raveling judgmatic reminder landfall delegating impingers midriffs vestigially salutatory delist flensing gainliest pornos magistral parodied blobbing rivederci osmiums detections subtracted sulfured illy mollycoddling miscarriage menorah jehad securers hairbrush lodged overrefine turfless exigible nonsuppression reinscribe inoffensively reiterate overhanded notarizations harems wakikis undergraduate goriest scheming interested aurorean outwaited casabas armouries ecdysis redeliver kingfishes detracting bloodings wronged emenders antienvironmentalists oenophile flibbertigibbet displanted viewfinders tornadoes conversationally grooved oversimple ambulator tectonics locutions metatarsal dibbuk wordstar stoical wines researching nonyielding nonabsolute flings demobbing leadenly bitters overclouded skeletally mistitle plundered solvable passes baronets polytheism ups floatable bullets gloaters branchlike rarebit carers overlordship enframing advisors misrepresent unprepossessing ecosystems reimprisoning"@ja ; + bsbm:rating1 "3"^^xsd:integer ; + bsbm:rating3 "7"^^xsd:integer ; + bsbm:rating4 "5"^^xsd:integer ; + bsbm:reviewDate "2007-11-20T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-01-01"^^xsd:date . +dataFromRatingSite1:Review128 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product53 ; + rev:reviewer dataFromRatingSite1:Reviewer7 ; + dc:title "metricates broodiest congressionally locators rusticly achievement squabbiest classifiable pommel" ; + rev:text "tweeting autocade sobers corteges officiates remodels creditability hanged comfrey livelily battlements paleface really photonic chukkers satirizes wordplay loggie stethoscopes corundums bids explores fleshlier unsettle hawker thermostats bedstraws peerless exponentially depoliticized validates loaches recompensing compressors suets smoothed enure remoras microcephalus compositely beefless egos miniaturization entrenches gorget murmuring inferable moil gov flaunting selectors departments worshiper recouping quadriplegic pseudoscientifically computerese autotherapy charism griefs importunities underfinances reamers colorable zigzagged rouging mummying calamary preexisted maniocas drossiness cocks unpuckered palmitate pranks tramroad montages chemoreceptive mobilizer methodized hoers popcorns demographics pseudohistorical hotblood bovinely standings emasculates hostly misplacement regilds thwacking parleys gulls sensitometers freshening leachy swoops wickedest dumfounds atolls bribed accomplishment redoubtably souse renograms exhilarative barbican kalimbas sounder bookrest dwarfed rowans barstools whirs atheling dizzies blats tufter environmentalist esthete cateress trainfuls lobotomized graving relatione bhang companionless aluminas undemonstratively liegemen sacra attuning unjoined westings correction bitterer harboring approximately mixing sierras semifinal canning matricides scissored soundboard fixers auditoriums broths matriarchs flourishingly echoism swatter scaring inflecting nonregimented comedos fryer alexandrian knout banisher overleaped lurched pedigreed hullers sledges churchwardens anticked masterwork biome electrics correctable widdled threatened tryout scrambled acceptation scanting apoplectic unfalteringly tarring haircaps guerilla"@ja ; + bsbm:rating1 "1"^^xsd:integer ; + bsbm:reviewDate "2008-04-05T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-04-20"^^xsd:date . +dataFromRatingSite1:Review129 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product35 ; + rev:reviewer dataFromRatingSite1:Reviewer7 ; + dc:title "caftans corrosively ostmarks brushoff fuels malingers splats subprincipal locomotives wettest springed" ; + rev:text "shads forbiddingly precondition deacidified refuting caves sleepwalker ecumenicalism coolest smelled herbalists procedurals shrillest expeditionary fatiguabilities interracial censurers foxskins duratives fulling jazzman impairing stopt vaultier petrologists deductibles sales microprocessor slashing inductors equinoxes overdrinks unfortunateness larkier ozonizing sacking unfeminine emblems flutes hydrates inconvertibilities legalization farthermost chatterbox midwifes lapses musics trellising adorning kroner fulvous eyeable tzarist elaborating softy beachheads retrace linchpins untruthful refreeze depolarizers weaving focalize bulkiest microvolt shyness rebaptize unallayed words uke speciosities astringing classily currentness bloodsucking amigas mauls profeminist reminiscently betrothed degummed cystic accompanists politicize lochs bwana moujik lactoprotein appraisingly refiltering blurred criticized adjurers astronauts housemaid steppingstone warrants subtotals westerlies filiated penpoint propjet misnumbers squeaked lech valvelet mortuaries illuminates schlock scrip restamps pyromania reaccompanies unexpectedness casinos aloofly alkalosis travelled regulating spiculate foreordain minimizers homesite phrasal shouting veiledly approachable salutarily lings indisputably pennsylvanians acrimonies oasts indow adulterated morphic texturing newswomen desensitizations chlorin gibbeting endued denicotinizing accountantship whelks prissily respondencies begetter counterattacks brusquest cutinizing"@ja ; + bsbm:rating1 "5"^^xsd:integer ; + bsbm:rating2 "4"^^xsd:integer ; + bsbm:reviewDate "2007-08-25T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2007-10-08"^^xsd:date . +dataFromRatingSite1:Review130 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product79 ; + rev:reviewer dataFromRatingSite1:Reviewer7 ; + dc:title "putter nonempirically bonnyclabber skoals upchucked traducing girder finochios formating gladly swimmer" ; + rev:text "formulates cuddled imponderably snarled ultrahigh taxidermy solstitial enters aspersers dorm mineralogist vastiest hilled accreting peacefulness training moldable precognitions throbbing navigably bitterly unlading cracksman associates lordling freeboots nationalization nucleating twiggiest ballads parallelograms aortal floodways tokyoite fluttering ponderousness evangelicalism unlabeled grads unsavory pithiest mf trimonthly underthings wooer programing cockcrows dressed reappointment extraterrestrials nonpigmented richness chintzy combaters oater unquotes hobnail youngsters dishy mongols assigned reposed rebinding seditionists subcommittees macle intoners undefended spotlessly inhabits redissolve dineros appals whiskery smidgen arsonic granularly shellacs shaled palaver voguish kappas realizers gravely eructs flavorfully devastator tweakiest cicelies herpetologic gruels improvable uptight quackster faggots depicting medicator echoism cinnabars licenseless cementum testamental unapparent buffalos hazing vitalizes drumbeats crabbier ethicized unstablest numbingly weighting misapplies luringly inhumed aprons diddling treasurer avarices arcadians inflectional prefabrication sparked alienability snitches incredibility finer shallowing astrologists"@ja ; + bsbm:rating1 "10"^^xsd:integer ; + bsbm:rating3 "5"^^xsd:integer ; + bsbm:reviewDate "2007-12-22T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-01-29"^^xsd:date . +dataFromRatingSite1:Review131 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product45 ; + rev:reviewer dataFromRatingSite1:Reviewer7 ; + dc:title "loaches buttered recolor crapshooters boldly marketing teakwoods hosted riving impaired" ; + rev:text "catnapers cordillera schmoozed biogeochemistry unprolific doubles coalhole accessibleness dispenser vandalized avowals fennels detester cardcases cannoneers turtledove causing fibula cellared twined occluded sireless overprints forelady rerecord abjurations exposals professorships cantilevered nosebleeds intercepting spiritualizes ovoid cullet hading renomination unconformable rethink ulcerations tach reexports ogive safeness caitiffs reclassify queenliest raptly tadpoles radiologically vetoes rehash magnification factitiousness accepts yahweh artistes debutants strategies georgians sliest desexualization acupuncture overfatiguing joisting blips"@ja ; + bsbm:reviewDate "2008-05-04T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-17"^^xsd:date . +dataFromRatingSite1:Review132 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product70 ; + rev:reviewer dataFromRatingSite1:Reviewer7 ; + dc:title "tympana knackery endives lames" ; + rev:text "supremacists pitapats achromats joined albuminous understandings faltered prehensile naively substitutions loxing communicableness auf rainiest berrying brassie equivocality contingency longhair nolle tattooer patriliny untransferred charterer flings tinned disfigures stalkier charlestons innuendos wildly trawls tinsels depersonalize aphoristic whereabouts specula ratsbanes misfits resolutes blackguards abstainers manger expansions quahaugs poulticed ectoplasm swellest maoism usefulness talismans bristols legalness brainwashed comforter terminological affectivity suitcases biconvex gyps seedily expurgations larger cymes serenely acidifier tensing illiterately stickiness unrests roc groschen dilating unscrewed trysters glaceed parkways cellars rescuing curviness redip handicrafts sensibility tzardom sadhu thoracic goutiest omelets sanguinely badgers enthuses thermoses breadstuffs toolbox slugs spectrographs objurgations airworthier tomtit plopped cliffiest furtively burbled savourier unambiguous erective vagrantly kinemas casavas expounders thraves helios degums erythromycin interacted orchestrates nonproprietaries robustest railer oversold pursed secretively chenilles ladron eucalypti magnetometer undressed redemonstrating cypriots ingoing evolutionism rhumbaed unconquered"@ja ; + bsbm:rating1 "5"^^xsd:integer ; + bsbm:rating4 "2"^^xsd:integer ; + bsbm:reviewDate "2008-04-19T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-12"^^xsd:date . +dataFromRatingSite1:Review133 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product72 ; + rev:reviewer dataFromRatingSite1:Reviewer7 ; + dc:title "trainload unfulfilled crowns armenians petroleous" ; + rev:text "belongings hairdresser unavenged nonmetals resistably betakes nonclinical whitish mestizos sics blazoning monthly reversely hebrews drabble ladles choctaws basswoods imprecators esperanto goodnight herbicide fuddled centres andesyte deployed unwelcome periodontist smelters graecized unforgettably phlegmatical dredges parasiticide enmeshing nihility chorusses insincerely orals almshouses settled deplaning engulfed tannic bruiting reinducting maypoles properness stressors forges wornout ariosos masculinity prostaglandin overachiever mangrove ingested telephonists ganevs supinates animosities subcategory morphos gustoes reconfigure greening poaching livelihood inconstancy fax patchiest spellers traipses galas undescribable wetly fanworts internationalizations"@ja ; + bsbm:rating2 "1"^^xsd:integer ; + bsbm:rating4 "9"^^xsd:integer ; + bsbm:reviewDate "2007-08-15T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-03-11"^^xsd:date . +dataFromRatingSite1:Review134 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer3:Product97 ; + rev:reviewer dataFromRatingSite1:Reviewer7 ; + dc:title "shote wrackful irritated reconnoiters sonnetted neurotoxic stockkeeper enfolder detonating wallflowers unhandy emoted ethical" ; + rev:text "butts laded threader burrower radicalized cosigning mops rideable flares epilepsy peritonitic presumers kilter deserter dulcify orneriness unaccredited coypus ultracentrifuge squirrelled reverbs nictates curara cubits subcontinents climatologic corporeally ratably bunnies quadrate reenactment pawpaw hypnic litigators weiners frogeyes ostmarks bombs copycat circumlocutory graben beebreads nares afferently nonsporting plumping weakliest criminology calculation tourneyed rocketries compartmentalizing farrow spiritually nautically shoalier freakouts bicolours subsidizing weavers slaughtered airfields mistitling tests debauchedly estoppage cops bribers lunged simoniac stability hacking pumicer appals compiling laborings halfheartedness sterilizations solubilized awed nones reding hardballs gemologies signorine bonnets appertaining refractive thumbing tackify cithers quantified jacks remaking creepage layouts humanization honorableness mazier synchronize beachboys violation awesomely nutshells pluralized whoosis developing ravellings caparisoned flanks basketlike stockman intersticial redeploying chagrins beards benchmarked souths flakers repertoires schlepped redistricting atheistically chemism"@ja ; + bsbm:rating1 "3"^^xsd:integer ; + bsbm:rating2 "1"^^xsd:integer ; + bsbm:rating3 "1"^^xsd:integer ; + bsbm:rating4 "9"^^xsd:integer ; + bsbm:reviewDate "2008-01-04T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-15"^^xsd:date . +dataFromRatingSite1:Review135 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product54 ; + rev:reviewer dataFromRatingSite1:Reviewer7 ; + dc:title "jerking picks whens inhaling abattoir tomtits bacchanal papier" ; + rev:text "lurker limbed bolus charier flavoring labored lethality balkiness hallucinated vapidity reline deciduousness capabler catgut hedged outgrows misfortunes acquirers honeycombed possessed competing absolutions fulltime gammons blissfulness inactivation snubbiest myths emblazonments intervocalic sectility housecleans veined vialling kinesiologic pemmicans roguishly upbraided bellicosity incorruptly tulips personality sugarcoat acuities trireme sophomorically placks chalks dazed rallyist delegacy caverned unfamiliarly crossbars ceremoniously subprincipals layered fleshiest bunkos swamping unpracticed bulling soupier wretched kl antennal tarp lionesses masterwork theosophical snorting benzoates croissants foresheet sightings readable whew ginghams tidemark feasances disobeyers wintering undreamt courter leghorns negativing polestar clansman notices nauseatingly convergency patentor thoued nebulise rivets aggregating benefited uninterested skimming couturiers tempi cumulonimbus broiler illustriousness fellah circumvents bibber boughs reeling placidness mistypes earful subpartnership rebills chowdering barographs convokers festering predicator conflagrations antecedents godhood jailbird prelates tweedles loamier warming acquirement toeplates leprosariums aeonian enfoldings brit uncut rhinos headlands causing astonishes paddocks reunify photovoltaic electrified irones honer prejudgment aerates sphygmographic bestrewn insentience twitters caulks bunched cockatrices gunplays earworm"@ja ; + bsbm:rating2 "10"^^xsd:integer ; + bsbm:rating4 "2"^^xsd:integer ; + bsbm:reviewDate "2007-09-16T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-02-07"^^xsd:date . +dataFromRatingSite1:Review136 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product53 ; + rev:reviewer dataFromRatingSite1:Reviewer7 ; + dc:title "bangtails unpleasing diminutions valorization borderlines extrudes meandered rewarded valved recharting mongolians" ; + rev:text "tributes catalyzed ammonic hamlets eminences seafronts widdies axons sarges despondency bounteous shylocking firstling desecrations immunochemistry greets placability mezzanines intensifier antagonizes imitatively naturalized disarticulation chiao fizz philtered penmanship saddest fatigueless masturbates functional dipt tidier ravager tentier hospitalizing spawner mislayer tattooer dermopathy enhancements gnomons misarrangement sty overland biotics reproductions kohl unhealthiest clevises awkwardest ordains jackknives barrels nationalism vaulted hiked enciphering avouching earnestly whoppers rebaters circumstances fuck radicalize heydeys foamily amish faithfully zoophytes bongoists regionally atingle ranching hurrier handclasps extending cassis pilotages fascia energetics kirks jetting seamstresses gingerbread feedstuff masturbation noncumulative midribs portraying octagonally dicotyledonous flambes mows hydrographer externalization reshape salably transporter prolixly guiles aggrandize dankness goggly bushing viticulture stilled untempted halvas imaginative reinserts lushes telephonists overelaborates unchaperoned evangelically avionics bonum humbled characters conniver silesia blamable sweatier tollers invested desperadoes entitlement improvable mainmast verbalized pshawed cowfish intervertebral clarinetists allegiantly complacency nosedive genteelly thru futurology triggering stalls sheenful funereally electrocardiographic scroungers victimizations skeletomuscular lumpers sickout penuries fortuity astrodome raspish balmily loaders bashfulness personator"@ja ; + bsbm:rating1 "8"^^xsd:integer ; + bsbm:rating2 "9"^^xsd:integer ; + bsbm:rating3 "1"^^xsd:integer ; + bsbm:rating4 "4"^^xsd:integer ; + bsbm:reviewDate "2007-10-11T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-30"^^xsd:date . +dataFromRatingSite1:Review137 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product63 ; + rev:reviewer dataFromRatingSite1:Reviewer7 ; + dc:title "compte blinkering codifier handsaws" ; + rev:text "bathrobes inseminators distinctness tahitian aggrieves eclipses quaggiest bens foragers aerologist hideously adventurer isles allotypically psychosyntheses baldricks rebill unworthier famed rowings atypical unblock skiddoos resigners bombastically johnnie winglet colombian sullenest uploads hydrants exurbias subtleness multitasking zunis louts satyriasis saltbushes superseding sauted mismanagement amortizement soapiest tromp distinctly sixteenths occupier intertangled downturns sidlers sirens skylights enjoiner mestizos clowned minder calumnies outstared latinize distrustfully unrestored impressionis saucepans boutiques peaces clutched herbivorous animalcules detraction nanowatts appalls leggings readopts crawdads tabulations tommyrot ruttish gauds disassociation bakeries horsily dispersement aquiline cheesiness shredding wirer deflectors curlycue nitrates standardbearer novas auscultated bridled mysticly vapoured scrutator filles jeeps nonmeasurable rotisserie brocading carcinogenesis flambeau herdswoman postnatal brambling manger plodders potentiate winder laders kalimbas reattempt ammino monogamic residentially signalling"@ja ; + bsbm:rating1 "4"^^xsd:integer ; + bsbm:rating2 "4"^^xsd:integer ; + bsbm:rating4 "5"^^xsd:integer ; + bsbm:reviewDate "2007-10-30T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-04-10"^^xsd:date . +dataFromRatingSite1:Review138 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product46 ; + rev:reviewer dataFromRatingSite1:Reviewer7 ; + dc:title "barrows reaccommodate assistors nondetachable humanities cymbals imploring blarneying" ; + rev:text "wooliest resummoned washboards nominated nonage presbyterianism coastwise tricorne blinked occasioned entomologies antirational collop screwdrivers unrolling detesting misgoverns manege unflaggingly disenchant guiltily producers codfishes lyrate pumpers plunderable nonsense gemologist lordliness octants senna beaned overall peahen reassembling deviling locating reverencing spareness proprietresses unoffending expedites threshed appetizer spectacles griot nabs projectiles crambos stipulatory loamiest assaultive couths croqueting sheltered orcas streamlets sinfulness spoiled factotums countervailed whirrs ricer unfittingly steadily deductions imperfections relique urinalyses"@ja ; + bsbm:rating1 "4"^^xsd:integer ; + bsbm:rating3 "6"^^xsd:integer ; + bsbm:rating4 "9"^^xsd:integer ; + bsbm:reviewDate "2007-11-08T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-01-08"^^xsd:date . +dataFromRatingSite1:Review139 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product79 ; + rev:reviewer dataFromRatingSite1:Reviewer7 ; + dc:title "pulsates reconsolidate longbow defecates documents departmentalization studbooks pustular oration clairvoyancies whimpers truer" ; + rev:text "incloser prisoned flings bureaucratism deformer narrowly slimed dragonflies crullers monozygotic millisecond bulger retest polisher outlooks audacities unfledged manners dowries roue elapsing uncaring forgather signaller kindly commercialization surgeries authorizers qindars coasters drumroll godparents judgelike unsurpassed dexterousness jokingly redissolve deicides emotes protegees progressional successfully fluttered lucency reinstalled tiptoes leachy debouche optometer kohlrabies chitling castrating redoes seniority dotards registrants larrup hamburgers contended bellicoseness fatuousness ballisticians abrogations maharanee carcinomas jetsoms arduousness asphyxiant halftones dystrophies gunsel forsythias undermining haberdashers approved waddlers unsensitive cashews cancan pietisms stalkers fixups boniest begrimed plower digested intarsias superiorities cathartic bunco prankster anomy horning reflowed antiseptically undersized heterosis farthingale reprimanded irradiant unsnarls groveled bismuthal overskirt targeted stibium sanctifies millionths guanaco cc dowers decomposed insheathe easterners fogyism craned boll hyperacid betweenbrain"@ja ; + bsbm:rating1 "6"^^xsd:integer ; + bsbm:rating4 "3"^^xsd:integer ; + bsbm:reviewDate "2008-06-11T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-18"^^xsd:date . +dataFromRatingSite1:Review140 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product64 ; + rev:reviewer dataFromRatingSite1:Reviewer7 ; + dc:title "allocatee nonrestrictive hominy rehandling glorying unhappily medics" ; + rev:text "burlesks garlanding lamebrains hocuses butchered sunbonnets voyeurism experimentally racist intramurally curled convoyed overpriced ingathered bilges excellence oppositionist hights dandle sprightlier tyrannizers preceptor piazze willfully apennines conglomerations somnolences hasenpfeffer wend precariousness unbosoming coiffes plainsmen enkindle tidiest slingers keystones hausfrauen ringtails tinted plenipotentiaries fruitlessly ort depersonalizes undoubtedly constructively twinkles deluges cubics smoothed backslap codal shoddiest worldliest samovars trillionths peneplain torpedoing outthink averment neocolonialist afterburners theocracies fattiest calamities luggers caparisons nonindulgence armlet nabobs reinfected mufti septs shirring seborrhoeic mitres inheritability dinning dispatched sledder unbearably necessaries leaflets beanstalk chuffy dells traumatize behindhand"@ja ; + bsbm:rating1 "8"^^xsd:integer ; + bsbm:rating2 "1"^^xsd:integer ; + bsbm:rating4 "1"^^xsd:integer ; + bsbm:reviewDate "2008-06-15T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-17"^^xsd:date . +dataFromRatingSite1:Review141 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product51 ; + rev:reviewer dataFromRatingSite1:Reviewer7 ; + dc:title "lensed professorships gastronomes snit modula shadowiest crofter pollards derivative spacewalks relocating" ; + rev:text "trashier yams mortised restaffs flied undersigned steatopygia isling swats pavers sublimers tufas circularizing atomies interloping turmoils lunation judases woodgraining antedating ruble merges joyously anodally scented ophidians durations hymnals volcanologist griots governments peacefully composer dens odic circumcising engirding rattlebrain phantasms californians boots repartition worded immunogen upheaved outgoes downplayed cudgeler nutlet hallucinational quants cringing reimburseable impassioned draggers atolls hopped ephedrine frizzed haftorah backwardly cudgelled flagitious hyson royalists guanin kelpie clonking mammeys swinge woodcocks postoffice impounding doubts mendings carolled revalidate manpowers rotating feudally ascertains owns cloche flutist wisping rediscover canonicals honoraries paroles subdepot axons tasselled laager infuser gypsyism infecter personalizing impugned brines cached cameos assister ranting highjacked mesmerized flypaper chasms burdener abysmally stubbornness cousins harvests disarms djinni encl frizzled heavyweights staggery allegorical interferer cheaply braize exhorted mismate reissuers unperturbed detracting champions histaminic stoney bulger typhous finality mastering anglophobes sprayed overlays levelling spreadsheet snatchier letterpress kronen scorifying seadog moonlighted bounders gaposis fixatives carnivals stigmatized atrial casking shivers reverencers stinkbugs cushioning varlet autodials inmesh bionic lek sends sidelining ells collaborating rippling colorfulness unconstitutional upraiser dingle bozo quarreler processional scandic recoils nonconformism beebreads umbrellaed"@ja ; + bsbm:rating1 "3"^^xsd:integer ; + bsbm:rating3 "6"^^xsd:integer ; + bsbm:rating4 "6"^^xsd:integer ; + bsbm:reviewDate "2008-02-26T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-04-07"^^xsd:date . +dataFromRatingSite1:Reviewer8 + rdf:type foaf:Person ; + foaf:name "Linda-Nada" ; + foaf:mbox_sha1sum "99f90881e5d24a14f913d8a961fd81c49686fa" ; + bsbm:country ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-08-12"^^xsd:date . +dataFromRatingSite1:Review142 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product35 ; + rev:reviewer dataFromRatingSite1:Reviewer8 ; + dc:title "hopped riveters zeppelins synchros susceptibleness cherty dup swats shifting forelands thats jemmies" ; + rev:text "sociometric germanized sublunar statics swearing sixtes fluoroscope procured revarnish collegiums emanated nonhero doper rollicked talesman lothsome maddens weirs daubing corrects cultist foothills interacting enframe spieling chasubles venging sulfureous proposer depolarized disarmer sprinting reequip ducking grainers frizzler unperfected foresails alternating pinole reinduct dislodge tailors lifelessness scowlingly treasonably reaffirm overjoys calumniator ceilings progovernment nutcrackers organizes democratization reassigned closeups perforator clearing immeasurably threader relying terminals quintuplicating looking kingliest stallions seamanly tearer glutamates forehanded codifying mantled recompenser inconsistently bedewing lurer wanness eminency massed purply floridans misbestowing duns insinuator noncommittally deteriorated moping improvements tugs sated slalomed conspiring reassert tipsters gloriousness blesseder poachers stools brainstorms incalculableness cowbane counterplea duellists delimiters suboxides reexperienced thole rippler overthrowing staminas flubs mitigator dammers coveting valse invidiously microradiographical dalesmen adhered akimbo clauses enders discography blowbys dyestuffs residers shortchanged fetuses shouldst fatheaded freaks enteritis sierran currencies lefter piking franchising furzy interwove embowers petting revarnishes fatalisms pawer bhutanese eeriest marrieds perforates bellicosities logily gainer brutely befoulier unresistant marketable booed rucks"@ja ; + bsbm:rating2 "5"^^xsd:integer ; + bsbm:rating3 "10"^^xsd:integer ; + bsbm:rating4 "9"^^xsd:integer ; + bsbm:reviewDate "2007-11-03T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-04-29"^^xsd:date . +dataFromRatingSite1:Review143 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product49 ; + rev:reviewer dataFromRatingSite1:Reviewer8 ; + dc:title "groining abuser phonophotography trailing devotedness nepotistical prosperously dobbins geriatrist itchiness" ; + rev:text "pedals fountainheads integrities drivels officialities adhesives reassumptions patienter loused dialyse eves flocks lambasting mustiest midmorning evanishes packed spankings wiglet cats highly bedrid missort munificently buffed cardoons seatrain stretchiest rationalize progressions celerities moderatos biotins bifid rustical exaggerations sobbers versifier glaciates lecithin dwarfed boxlike expensing bureaucrats irately unbelievably addressing conniption nudum implacentalia disputable universalist cameroonians orrisroot digressed styler wordperfect vocative blossomed timed semiagricultural caseload showily disfranchises inconceivability homiletic mummying darned hulls marshiness accosted compounders damson megalithic duelist debitable synergies garniture suedes resp enhancing bawds mercantilism bigmouths mutinied delineated kinesthetically forenoons marmalades trueblue proletarianize beachier nobbler refutations imbibition immobilizing earthworms gulling hypodermically faultiest whoresons cartoonist formulating animist shirked flankers overmen ruralisms concoctions surefire ghettoing discharge kerbing clammiest antiheroic habituations naturalists bifurcates engineered gondolier frippery syllabubs bicyclist anthologize antemortem clapper unproductiveness hostessing vitrified begrudging outproducing cohabits pondweed baa parker innovates extinguishes entrusts dishfuls boxiest polarizes woodener bilateralities ethiopian commercializes stereochemistry smartens birches formation uglifier adverbially hexad preprocessing unbraiding rocks verifiableness ironbound deflea cousinry uncarpeted outperformed marvelousness hurtless"@ja ; + bsbm:rating2 "9"^^xsd:integer ; + bsbm:reviewDate "2008-03-15T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-15"^^xsd:date . +dataFromRatingSite1:Review144 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product36 ; + rev:reviewer dataFromRatingSite1:Reviewer8 ; + dc:title "forfeitures rawhides androgyne jabbing thinkers" ; + rev:text "rectifiable obtruders fatalisms relationships evolver fetters bennets hearthstones tutorage enamelware escalates dalesman showplaces decider scepters incases joyless litterateur copies bellpull hooliganism reenlisting barbers vomitus keister anaerobe facileness augured incompliancies vealier insights pollens transmigrate reprieved slipping brooklets tossups turmeric dragomen gainsay damners anglicism nighty insensately heraldry tympan gyrating unassorted recordist discombobulate postured understudy unisexual rehang swooshed selectly acceptees mysteriously consolidation orcs trammelled frisson explodes carcinomata widened jazziness cheerer encoded aneurysms amortization strengtheners fearfully fem sagiest ashing whiner nils wellspring slakes infringers disembark downshifting lense peeler schmalzes sanctifications tartness revoltingly unlawfulness zygotes gasogenes abstentious lithographed relettered reclassifies semipermanent perfecto topcoats totalizes germination ewer ricketier brownouts pense cragsmen blindage featheredges excised catnapers procurement jimmied brawnily honeymooners hibiscuses innerly eggers tempting subdebutantes triumvirates devalued chintziest tzar flannelly flavorings frolickers assaying electrocutes hypertension legendry poufed hexose unbrushed doughy keister cannonballed numberer impulses neurotoxic bilgiest outranged tracheotomize lariats nescient teacake sixtieths feeblemindedness scoffed troutiest enciphering heaters outrageousness revamped alphabeted"@ja ; + bsbm:rating1 "10"^^xsd:integer ; + bsbm:rating4 "1"^^xsd:integer ; + bsbm:reviewDate "2008-04-11T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-04-15"^^xsd:date . +dataFromRatingSite1:Review145 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product78 ; + rev:reviewer dataFromRatingSite1:Reviewer8 ; + dc:title "knighted conformational boffs infiltrating friendlies sandblasting" ; + rev:text "prevuing walleyes dejects undersupply towery tendons grainfield groutiest bestialize ganged drifty gratefulness clothed pleurisies sterilely inkwells puttering nonideological propitiated knobs frameworks guiltlessly stalely precises cathartic gymnasts prebend vocalists ukases breeziness physiques veiner wassailing elastin flashlamp muckrake shoetrees aviarist wassailers iuds unrecoverable clammed griddlecake fibrinous homonymic chromide stepsister roosted patronized endorses vindications premising variegating sabbaths distinctly challises comradely roentgenologies dedicating"@ja ; + bsbm:reviewDate "2008-03-15T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-04-23"^^xsd:date . +dataFromRatingSite1:Review146 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product41 ; + rev:reviewer dataFromRatingSite1:Reviewer8 ; + dc:title "novelized hashhead beeping mentation incapabilities molestation unabridged meltingly leaving increments stereophonically draggers" ; + rev:text "hareems acclimation bagnios voluminosity wallopers rabbinate enhancers gifting digested cashable idlest turnspits noteworthiness interprofessional homey engineries transborder mortified manhours shovelfuls botulisms jailed ridges cosets debts awols unpersuaded embarkations baronetcies townsfolk oats dognaps boardinghouses unhappy juveniles unpited foundries phrenologies chattering rustically breakfasts tsetse hydrogenates bassoonists crumblings deceived marrer dholes blots doubler cleverish temperaments litigator allotter individualized parader stylishness intermarried attributions trueborn tightened internality rehanging elisions packsaddle penetrators frostier gormandized nonmagnetic reassorted pitapats stereotype pirogues showrooms unchangeable forcedly ructious bandaging honestly endocrinous integrator niggling mansuetude dissimilarities casehardens pitiers macedonians sitar epoxied refire awfullest invader schmeers titter braver sextuply restorals centralities haggises squalidness unthroning rodder narrower pelagic ninnyish beefburgers dogears photograph bicepses submolecular silicons components repeatability acclimatized soloists hippier grievously shininess dumpcarts universalization disentangled recrudesces paymasters communalization redigestion mentioners kilocycle constrictors colonic blued gallanting decahedra aspirer looniest gormandize coloring unmannerliness crushes aggregation frags kingfish escaroles detected puts jemmies sculked unbent illumines crusted uncreates rehang interlines contrastable seedsmen capotes oceanauts rashers timberline cartoonist wristiest lanceted cavilled ethanols outweigh pandits flavonoid morsels belonged dumpcarts nonconstructively disproved underdone boneset croupy mesalliances ceased rotations concreted volplane prechills achieving expenditures clipping bastilles botanical kivas masturbatory retrenchment televisional enhances primming exalter burdeners ombudsmen inhaled miraculously hotshots unaccompanied"@ja ; + bsbm:rating1 "9"^^xsd:integer ; + bsbm:rating2 "2"^^xsd:integer ; + bsbm:rating3 "6"^^xsd:integer ; + bsbm:rating4 "4"^^xsd:integer ; + bsbm:reviewDate "2008-05-26T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-02"^^xsd:date . +dataFromRatingSite1:Review147 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product21 ; + rev:reviewer dataFromRatingSite1:Reviewer8 ; + dc:title "phenocopies themes exciters unrolling reprinted shorter uvular outlawed covenantor skeletons nonsurgical contraindicates stretching snarled teenagers" ; + rev:text "designee abstinently circulations abstractionism tastier ramming iodizer throngs unsolder parfaits comprized malaprops relicensed candles defamations bewitchments scholars vascularities tolerances dotier fourpenny callings honors plats proliferated monumentally scoping bakemeats broadaxes mullions booking beauticians tracts envelops coercers discos wakened guessed irrigable groped spacing limpers brassier dextro whiskies outargues concordantly cyclically pacesetters cranker shooflies tzetzes succumbs appropriating whaleboats taxonomists apricots interweaved youthens interregnal pennines exiguity nuncio zippers translator abutter hairstreak probatively soppier"@ja ; + bsbm:rating1 "1"^^xsd:integer ; + bsbm:rating3 "9"^^xsd:integer ; + bsbm:reviewDate "2007-08-08T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-02-11"^^xsd:date . +dataFromRatingSite1:Review148 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product64 ; + rev:reviewer dataFromRatingSite1:Reviewer8 ; + dc:title "superpose boomlet patterer kickshaw reinforces precludes" ; + rev:text "quoited prognose cedulas landsat scarfs boysenberry epilogued cairned predilection epicureans histamins transferror possesses rummier reinfect sapped antiknocks foofaraws artistes clipped insanitation saxhorns clouding mouthpart blacks abasing palmettos cicatrixes bawdiest preconstructed stainable zoologic coitophobia retreat bivalencies slows hyperbarically humpbacked constructively leaguers coition nitwits effulged dowdiest takeing extruding socks dolesome triads toning cognizance watchwomen subsiders redeposited bronchodilator silverfish upswollen climatologically excitement clubbing forehand frails jacketed agglomerates acutely procapitalists presswork triadisms virulencies ladies postnasal echeloning criticizers recidivism kappas nonviable chamfering classing reincur"@ja ; + bsbm:rating2 "7"^^xsd:integer ; + bsbm:rating3 "9"^^xsd:integer ; + bsbm:rating4 "2"^^xsd:integer ; + bsbm:reviewDate "2008-02-06T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-02-07"^^xsd:date . +dataFromRatingSite1:Review149 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product20 ; + rev:reviewer dataFromRatingSite1:Reviewer8 ; + dc:title "humanness psychodramas tolerably bulgurs desalt outdone alterative gorsy elements mustached utopians griefs checkmated appaloosa decriminalize" ; + rev:text "dairies windmilled silicas bachelors monochromes markswoman sandbank washiest confessional swankily subtraction proofers legit erin canalizes amended totemist palinode anticline optical doughiest eighties deciliters gillies skulks brisks nerts familiarize violative arbitraments recapitulative cremators deepening rushes adduces pikemen polyethylene ganglier alluded silliness macrocephaly sagger axels mothers strangulations sonde seine kuchens bills salver overrank oafishness dilatoriness tenured creepiness recrowns reendowed denials incorrigibleness alkalify pedometers helving snuck hipping teethes detainee mainstreams breasted uncrossing segued jaggeder prizer drongo daysides colonialist hardbought accented timed squirreling vowels lethargically polarimetric appalling retrying imitator petrologist brushoffs addresses impearls passkeys suburbans bedpan homunculi reassort"@ja ; + bsbm:rating2 "9"^^xsd:integer ; + bsbm:rating3 "9"^^xsd:integer ; + bsbm:rating4 "2"^^xsd:integer ; + bsbm:reviewDate "2007-10-06T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-11"^^xsd:date . +dataFromRatingSite1:Review150 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product11 ; + rev:reviewer dataFromRatingSite1:Reviewer8 ; + dc:title "geckos shakeout laudability gruffs magistrates dittoing trilobed reels tarot cadmic fibrinogen belletrist atlases deiform cummerbunds" ; + rev:text "probates gearwheel cavalryman nights indexer doozer prospered reeks redbreast convoking honoured straitjacket twister wetter unforbidding chedar steatopygic editorialized inflictive canisters alaskans saprophytic sandier calomel shovelled consolations snuffles playable keelhauls drumbeat scabrousness interface assessing blemishes comedown generators sacrilegiousness breathes rooflines befuddlers propagators clamoured popularizations plasters mumbling cultivatable ammonoid tubiform idiotical eyestone tragicomedies rimmer outargued nonexempt enfranchise macerate breaded bhakta canadians gangers pageboys atwain deceased disguising concentrically melancholia consistence multivariate expiation keefs porgies duskiness steelier travelers ganglionic glutinously negotiant cadaveric herringbones sinusoids observances jabberer masturbators beatniks nonscholastic designating freedoms adulators syncline dignified tricorne ratings wrathfully wagonette hallucinatory lactated collectables remends reuniting macadamizes gapes pushover consigning subsiders probabilities breakout virological redetermination seriating viol stacking oriels recharting zircons haloes charwomen accommodatively versions ensphered surffishes demineralized potshots autophagy loofas aphanite alefs drummer accelerant fondu bridling batcher contemplator censuses expressions seventeens plasters alkalinities peakish mashie logrolling confiders whetting"@ja ; + bsbm:rating1 "2"^^xsd:integer ; + bsbm:rating2 "10"^^xsd:integer ; + bsbm:rating4 "7"^^xsd:integer ; + bsbm:reviewDate "2008-03-10T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-03"^^xsd:date . +dataFromRatingSite1:Review151 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product64 ; + rev:reviewer dataFromRatingSite1:Reviewer8 ; + dc:title "remixes cucurbit ivies undersheriff fuguing autodials canalise potholder safer desists gerontological simoleons christianized asphyxiated" ; + rev:text "piquing cultigen banjos courtlier plottages gappier reportage coolants callosity crunches dyspeptical scaled videos mislayer eggplants agriculturist wracking monomers steamers prowled skippers curari walkovers hoboisms tetragon bicolors ochring foxskin corkwoods plough gripple matin slaphappier spareribs tuberosity crispen demobbing renderer idealisms temperaments homeowners fortresses depositional kickier parasols appose psychosensory gweducs distilleries modulating desexing exposes prepubescence quitters appreciativeness pointier doormats accenting pedicuring antiseptics doubts entrenching ropery eyetooth losingly semioblivious carpe sheafing hoofbeats procrastinating vilifying momism teaks unedible responsibilities tweeting sacristan mutilative outspelling unfeelingly chaster divinities desolated youngsters hermaphroditic optative pileate maoism leaper fluidized espy quietists candescence topographers citizenship womanizes alcoholometer haying wagtail dadaisms sonorities salutatory leakages dulled thrummed simplism poilus overloading hipping spiking slashing gaga sublicenses unwinds retailors agitable zees mesmerizing unripest overcome teeters incomprehensiblies paternalistic integrating tricorn overstocks simmered straitest"@ja ; + bsbm:rating1 "2"^^xsd:integer ; + bsbm:rating2 "4"^^xsd:integer ; + bsbm:rating3 "1"^^xsd:integer ; + bsbm:rating4 "7"^^xsd:integer ; + bsbm:reviewDate "2007-12-02T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2007-12-24"^^xsd:date . +dataFromRatingSite1:Review152 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product53 ; + rev:reviewer dataFromRatingSite1:Reviewer8 ; + dc:title "lavaliers interleaf kiloliter supported frizzes vincible thundershowers nictitating hocuses its chugs proprietaries swampland dalesman clouts" ; + rev:text "spongins corrugators calumniation tetrapods bactericides disloyally twinged exclave kitharas lakeports concaving hairworks furriners tonsils novelists quakerism justifiable wakener disagreements unillustrated irreligiousness impels contemporaneously phonily complainants garrulousness harassers turbos racketeers gilding spellbinder nutrimental neurosurgeries wintering clatters predeceases ult chiropodist solemnization mythological stagger torquing miasmas imperfectly highths secrets boysenberries counteraction engaged footing growing demimondaines justifiable presented grassfire syrups swaging properer snapshots batsman ungainly unwit unthinkable caecum degassed horselaughs mille supplying hebraized reargued rustable twinges sonars columnists inverts maturing vibratos foretop splenectomizing rearrangement effrontery geostationary spiting broadaxe weaklier lampoons redeemer sepalled overthrown handiest cowpuncher ecus ictus aeon recriminator moistened notarization temblors pinnated fileable misguidedly potence celebrationis tilled claustrophobe jurisdictive unascertainable maximizing cations limberly guanaco incliners centralistic"@ja ; + bsbm:rating2 "4"^^xsd:integer ; + bsbm:rating3 "8"^^xsd:integer ; + bsbm:reviewDate "2007-08-23T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2007-11-16"^^xsd:date . +dataFromRatingSite1:Review153 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product41 ; + rev:reviewer dataFromRatingSite1:Reviewer8 ; + dc:title "damns parsimoniously nudnik swannery" ; + rev:text "mattedly reseller hedgers mopping secularization straightjacket overmuch bostons beechier leakiest oceans unknowing bravadoes lassoers tearing putrefies heelers hemistichs abbes avengingly boweling minibuses exempting budgerigars reletters pivoting conceited burglarizing loony shortcomings washings seedman adviser snowfield drollery strifes succulently ferules scrooges cartoons amplifiers mislabeled workbooks areas domestications conkers championship alternativeness loser trusted togas amputates reclaimed uncoffined feckless smugly livened imitated unclehood rhumbas grigs seasides tendering macrocosms glassiest scorepads pulsation disintoxication excellently interlocution overhearing amniotic lowlander pithing schoolers complexness ungulates enrapt contentiousness dichromatism jnana abstrusest dads hecticly misbegotten electrodynamics smoggiest neuralgias radicalize aureole stenciling bedgown lepidopteran swigs prosequi ichthyic flurried winched superscripts safecracker twanged egyptians inhabiting bismuthic heavyweights flashguns barrelling spottiest reorganization slowpoke gabbroic briskets sheeting patriots servilely schnook compensation cannas parietals hobnail turbots specialty postmarked mediocrities upliftment forfeitableness glazy lifers luminesced slings profaned truncheons interregna chiefest gendarmes overreaches articular sodding recapping chivalrously croissants convalescents unguentary originating variances precanceled besting interacting unalarming eardrops peening headnote broomstick oysterers tics drippiest sadomasochists ecumenicalism lopping ceramicist exportations acidifiers priors unseat boodled preceptresses lordlings kettles sakis thruput"@ja ; + bsbm:rating1 "5"^^xsd:integer ; + bsbm:rating2 "4"^^xsd:integer ; + bsbm:rating3 "1"^^xsd:integer ; + bsbm:rating4 "4"^^xsd:integer ; + bsbm:reviewDate "2008-04-26T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-04-30"^^xsd:date . +dataFromRatingSite1:Review154 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product26 ; + rev:reviewer dataFromRatingSite1:Reviewer8 ; + dc:title "barrows unfortunates lancelot washingtonians overtakes justiceship shadowed treatability diazepam orthographically" ; + rev:text "bathers karakul sparring counteracting armatures stablers brandishes formulas teacupful polishers oversell resolving exists zoeas tenors overload misspellings airhead pinnings quizzicalness overkilled scanning antagonize industrys chews pommeling puddings overborne aphanites genuflects nettier dreggiest sinkage sarees attributable retrieved prudentially cotillions intellectualizing confirmable brocks gripsack motorist dissimilarity beards babbled stockrooms diffusing finning catchpenny mudslingers libellous procurable"@ja ; + bsbm:reviewDate "2008-01-27T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-03-31"^^xsd:date . +dataFromRatingSite1:Review155 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product44 ; + rev:reviewer dataFromRatingSite1:Reviewer8 ; + dc:title "armrest funereally mods contriteness reenactment uncorks enscrolls unesthetic vatting deafness sociables wrens brazing carriageway" ; + rev:text "conelrads reded purchased whodunits gussy mordantly appraises seconded tribadism agreeability pretending etoiles emphasize mineralogical paleface gangliate presided letterers axiality cursedness cellarets pasties outstands tomfools unveils ruling tepees demurral tweakiest interrelatedness molders videotapes spoiler communist agrology forewent cinematheque ageist acquisitively vasty endearing cribbers crippling uncritically teepee oversharp congaed prepossession devolves polygony ration huntedly voiced ethicals lastingly carving middlingly textiles clowns hydrations yammers sendable refreshing wesleyans intromittent suing paleographers turrets resound outgrowth payback telegrapher upshots unconfessed haematin drumlins epiphenomenon wastebaskets pinfeather assailing brilliancy dewclaw vegetist imposts reconstructions conjugality tertians decoders abridges rerecording draggle purulence pounded capos ragouting libber dramatizes nonentities brownest shoppe belongings radioactivities misspelt fiberizes tantalums pensions hardies transplants ichor propounding externalize celebrities eviscerated innuendoes chirpier assuagable tunny lavishes lictor froufrou bewailed eroticist glossiest slumlords saxophonists iliads archimandrites reconversion manned lovages nonvoting reendowed woodener peacocked bichloride reinscribes symptoms affrights alloys"@ja ; + bsbm:rating1 "5"^^xsd:integer ; + bsbm:rating3 "10"^^xsd:integer ; + bsbm:rating4 "1"^^xsd:integer ; + bsbm:reviewDate "2008-05-14T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-20"^^xsd:date . +dataFromRatingSite1:Review156 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product23 ; + rev:reviewer dataFromRatingSite1:Reviewer8 ; + dc:title "beachboy siameses baboonish mysticism subconscious deadfall bunion" ; + rev:text "prepossessing reinformed overnight yabber arses antiparticles hearsed dolor stringier shipworms cockled killed resigning translation bamboozler crosshatching jesters staggering monism untested aerosolization aquaculture idolise carful misinstructs outfits overexciting locater butterfish reclining tractors burrowing camomiles lymphosarcomas avowals overstocked teratism precipiced bulbous filmic correcting symmetries assessment dabblings grooves millimetric coleslaws substation licenser weeps prate catacombs perfumers bookmobiles inoculations undefiled cupolas funerary boodles anchoring summerhouses woodpile groupings minuter piggeries trollies scopolamine asexuals eternities caramelizing easies girlfriends seawalls embittering proconsul commas palaced coordinative radioactivity sociopathy superposes hypoglycemia gassier prefixally competitively bowless alphabetizer xerographic dissuasiveness charms conics swordsmen beaut copulatory syncline redraw erica videocassette wizening sphygmomanometry foreordaining generates alluring pailful addressers peatier accomplishes maunders congeniality gonad gradating denotations jetties baptismally rasped blatantly colostrum banner abler cocas splendidly wharfs rearrangement orthographic eulogize sinewed knells nonmystically sappier woodier solubilizing anatto corymbs schmaltzes infiltration kikes rheumatogenic prepay overrunning flaunters hadjees groutier roughed emulsoids morphologic buffers mononucleosis stilling kittenishly sprights surplusage sinner wrists haring overattentiveness magnesic respondents following undergirded destructibility gathers tympanum esthete pigsticked belabors depopulation oxfords cuddling carrom loving fusil spines assayer personation syllabifications gelatinizing mincer leftist mends clouter craws ethers accoutres roughage mouthy zambians entrust banishers blackness diabolically registrational loppers renotification advancements bellboys panegyrists newsiest"@ja ; + bsbm:rating1 "6"^^xsd:integer ; + bsbm:rating2 "2"^^xsd:integer ; + bsbm:rating3 "7"^^xsd:integer ; + bsbm:reviewDate "2007-11-26T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2007-12-13"^^xsd:date . +dataFromRatingSite1:Review157 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product87 ; + rev:reviewer dataFromRatingSite1:Reviewer8 ; + dc:title "affordable shunted cracksman hawking presswork bobwhites twilit autointoxication laureling wifeless scantier" ; + rev:text "proctoscopically staking wattles manager costlier reaved hydrofoil lived faddist celebrants rebills musingly redeemability gavels cartoned weakens combing mazing mechanotheraputically volvoxes birthmark untypically sledded spryness alkalify cliquishness learnedness profilers overcomplacency bawdiest baggily pastorship nonelective overassured straggling tests emulsifiable herpetological reattaching turnspits untidy leprechaun fighters tenuto portiered lonesomes appellee cementum heightening stiffest utilizer unadvertised neurosensory welling pederasts lunaria bedouin cays hoards profiting yellowbellied elevens buggier enforces burns chugged encrypt republishes chandeliers countable bestriding absconding problematical lolloped fawner choreographers periwig veeps hurdling chancelleries toxicities hampshireman promulgator greyer noncombatants balkiness merged backslide protected nannies discreetly smartie carroty cosey flees seductress violaters workable intellectualized wantonness underpasses quirkily moots tennesseeans puttied garoting stables corrective subterraneously disbelieving reges rickeys subnuclei sectionize umpteenth antipathetic unisonal ashlar cervine summoned dancer tides hurler vealy outwore precondemnation switching roto birthing commandments tenderfoots uncorrected posterities flanked milanese"@ja ; + bsbm:rating1 "5"^^xsd:integer ; + bsbm:rating4 "2"^^xsd:integer ; + bsbm:reviewDate "2007-09-25T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-12"^^xsd:date . +dataFromRatingSite1:Review158 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product39 ; + rev:reviewer dataFromRatingSite1:Reviewer8 ; + dc:title "attars settling precedents abolishable checkered ingressive webs months" ; + rev:text "phosphorous empiricism bruskness magneton mainstreams refutatory inveterately premierships curtains antineutrons blackthorn therapists queerness rescript frauen maize alopecia locations ramjets caballed redounding scheduling logs curlicuing aboded somewhen soppy tacitly hastens peatiest earths basement compliances fatback townhouses immersions lawmaker picketer bursted alienages rooty consecratory sourest yarer skaters poetically kicky inaudibly stoned mandating skips uncork prolificness codifies bulks reverify sophisticates raja ghosts villainousness interdisciplinary fibroma squirming coalify dehydrogenation aprons contiguities brislings symmetries sprightliest piffled gelled supervision ravished bewig cherubic parquetry ravaging unconsumed barricaded coopting faceting whorish pillowcase chronon jambs incorporation notates commutations flouncing barlows edifies reerected regranting excursionists favorableness elflocks kickstand clarions dynasties linked tutoyered validations eyehooks gatepost kinkiness gogglier verso unarticulately beldames cardoon prodigally retailing accumulation flatuses earmuff heats stabbers caucussing recalculate sweetened gentler asparaguses overexcitably takeouts knobbiest noncontraband neomycin abidingly rosebay lightish malaya pecans cornucopiate deafened sierran biographic frisk flunked funkier roosts wagonette gillies outgo venturing floppier warpers personals vitiates attackingly pedophile brogues kiefs claimants hopheads leathering buxomness topsails conceivably tempus unyoking ventilates salties"@ja ; + bsbm:rating1 "7"^^xsd:integer ; + bsbm:rating4 "8"^^xsd:integer ; + bsbm:reviewDate "2007-12-20T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-04-19"^^xsd:date . +dataFromRatingSite1:Review159 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product17 ; + rev:reviewer dataFromRatingSite1:Reviewer8 ; + dc:title "laxatives slowworm overattentiveness mortars" ; + rev:text "middlings untaught slums retorting uncompetitive foreruns lowlander pressingly forsworn incases fashionable grumpy comfit batts doggrel bifocals declassifying selfsame storekeeper projected thousands setlines aspiringly alfas highlander countermanding numbed zillionth carotids hymens vaccinal devolved throws hesitations absolutest redefine veneered saleable windstorms salaciously stultified pillowcase creameries beakier solicitousness perfectos anemones uprooters detesting shipbuilder facedown maneuverability emboweled outshouted unventuresome justifications lawings hanking raids smatterings uprisings patrols neurophysiological highths stools laconically gripple lexicographers proliferous melodramatist hankering unmerited chauffers shuttled mopes roentgenology hideaways val counterspies cabbies hallways weddings whapper scripting swayable patchily matchbooks bulimiac ornithology bodiless ogive gainsays quakier perfectos pics ziggurat complementariness decommissioning calcitic wenchers overproduce galores unconditioned complicated hastiest inhabiting slimily wrested tanzanian emulsoid mumbo milkwood napes lingoes thudding bulimiac orotundity saltboxes sewages nerveless survivorship equipage ribless concelebration lined orchids safaried mendelianism electrotheraputical yangtze reinterprets wifehoods constricts condensers"@ja ; + bsbm:rating1 "10"^^xsd:integer ; + bsbm:rating2 "6"^^xsd:integer ; + bsbm:rating3 "9"^^xsd:integer ; + bsbm:rating4 "10"^^xsd:integer ; + bsbm:reviewDate "2007-07-12T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-06"^^xsd:date . +dataFromRatingSite1:Review160 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product64 ; + rev:reviewer dataFromRatingSite1:Reviewer8 ; + dc:title "icefalls bandanas uncrowned fencible analyzable kines" ; + rev:text "squib internalized buckler tapestried ensilaging alterants redbugs striped priming exobiologists carpus ai hardhats volunteered obscenities quoits exterminates misconstrue haggling snowballs concessive adobes oversubtleties amis insensibly caparison abnegations enkindling scoutmasters cardiogram seabag accomplishment spanless clambake rapacities incrusts domesticity satirizes gibbeting ownership embarrassedly snappiest supinating pockmarks nooks queerness rearmed sleeting geog loosest heaviest formulator eccentrics unfaithful stimulation flatirons codgers upsending tipstaff democratize typicalness alphabetized stippled subprincipal strayed hellgrammites flasks gutsier maharajahs gazing cloches flaunty eolian bilateralities listlessly sternums pensioners hears democratizes dramatization druidisms sanctuaries mined grassplot corking treating tenures ralliers chophouses rationalizations learnt ripsaw matchlessly bloodthirstily fancier assorters vigorousness pounder hepcat chillums strollers blimy ascendancy audaciousness pacesetter deutsche oenology palter castled appositely ebulliently foetid bonfires react titania ullage hoarily disfrocked connected knucklier rigueur honourers intercommunication affectedly indexes canvassed pasts desiccators regauge delicateness egocentricities microphotographic surplice sinking crinoids sawer sailcloth hafts immunotherapy obligations megaliths directer freethinkers unallayed heliums dight rara faultfinding disuniters accosted orderings unterrified xanthic earnestness uncovered basically mischance shawnees lubricated nymphet mayans satirizers assailment psychoactive unqualified blacklight jins deleteriously peckers bunkering killdee demarking"@ja ; + bsbm:rating1 "10"^^xsd:integer ; + bsbm:rating2 "1"^^xsd:integer ; + bsbm:rating3 "9"^^xsd:integer ; + bsbm:rating4 "7"^^xsd:integer ; + bsbm:reviewDate "2008-06-04T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-15"^^xsd:date . +dataFromRatingSite1:Review161 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product47 ; + rev:reviewer dataFromRatingSite1:Reviewer8 ; + dc:title "unitize satisfactorily sojourning dandles toshes tinglier oceanology refracture nembutal throttles areal martialists muddlers revindicated" ; + rev:text "mazed filer bittered hondurans dependableness fusibleness parasitizes misdemeanors suspending vials bairn deprogrammings ensnarl voodooed chicness cogging handedness inductive braes liberalities antineoplastic mislabel marveling cowherb bro misers visionaries shelviest penult reeducated elvis multiplying facetted oversalt embarring cozening jerkier enumerated stereophonically indemnification durneder armadas superlatives appetizing mazuma subverting unimpressed anodization cesarian riffs overprinted neediness lustiness pentagons sublimated tsuba aggresses pygmyism expectancies victuallers transfusional fancier unteaching decadence eldritch precleans mangled interrogational cerebellums peerlessly hogtieing liftoffs metonym putts reproductivity reshuffled hatmaker amanuenses risque supposed reloader reemphasis internals tardiness remittals patienter gruffer payback lawed heparin ricocheting cruiser purity extinction helmets coated noggin"@ja ; + bsbm:rating2 "5"^^xsd:integer ; + bsbm:rating3 "9"^^xsd:integer ; + bsbm:reviewDate "2008-05-27T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-02"^^xsd:date . +dataFromRatingSite1:Reviewer9 + rdf:type foaf:Person ; + foaf:name "Takiji-Yaphet" ; + foaf:mbox_sha1sum "46953b16dbd382d824721e3078f8959596b17ab5" ; + bsbm:country ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-07-13"^^xsd:date . +dataFromRatingSite1:Review162 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product60 ; + rev:reviewer dataFromRatingSite1:Reviewer9 ; + dc:title "hoarsely latissimi grandee engaged ramjets bravure trailed hoptoad alehouses massagists viatica prelates" ; + rev:text "obsequies sweatily zambian bevies focusers basher federalism arbitrative hearthstones horah counties palpations dandyism rundowns radiometry renderer redone simplifying caudally merged undervalued jubiles reusable downgraded overindustrializing quicksteps rimiest ital tumors touting flimsiest slubbings embracers cigarillo chimneys bouzoukis thrustpush hobbling scintillator deliverable badnesses tonsillar tramless topsail informally mahjongs waiter ternaries trenchantly insubmissive brotherly hills sluggers complexities sucked patterning looniness dendrites retakes placque stagehand specifying mutative felicitation partway cruppers karakul firmament nonconclusively voicing jugglings debasing demount pockily allowable luminescing pacifiers harelips shrieky evertor innominate unconvertible potentiometers boomkin condemnation maniacs evangelists dissimilarities ragworts readjusted baller miscalls dyeweed lucently atrophying effaces leister savoriest eyehooks twitches undamped excavations overviolent amerism scrounger revivification overhanded gorals runlet plummets viscously cybercultural unbuckled forearms drearier tazzas malapertly subparagraphs deserving burnishers supplement justiciary overmatched foramina morals lineless decentralize impressments giggling overskeptical manilla anesthetization franks dismortgage airbrushing embanks wherries linker crimsons alerting zoospores sectors weighter saloons scarfpins junketeers rows twofolds indeterminately"@ja ; + bsbm:rating1 "10"^^xsd:integer ; + bsbm:rating4 "10"^^xsd:integer ; + bsbm:reviewDate "2008-04-01T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-24"^^xsd:date . +dataFromRatingSite1:Review163 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product29 ; + rev:reviewer dataFromRatingSite1:Reviewer9 ; + dc:title "snickering guider stinkards amphoral cottonseeds unblessedness simplisms horoscopes hemispheres soave coalify redeemers tramper unchaining decontaminations" ; + rev:text "precised reluctance enjoiners germy arranges fleshliest irruptions resurrecting hydrator ladens platys standardized priestesses execrators preempted migration adultness terrapins compositely overcools underclerks easer revocative wildfires hellbox disliked polygamic inflaming nobodies nears belittles chives fats dropkicks playwear interferon unplugged arsonist impossibility acred recoil chutzpas impedimenta mugwump dispensed undeterred schmeer cured accursed receivers sexualization embrocations regilding goonie relinquished finishes thuddingly althorns grotesqueness howdie pericarditis whining"@ja ; + bsbm:rating1 "8"^^xsd:integer ; + bsbm:rating2 "5"^^xsd:integer ; + bsbm:rating3 "5"^^xsd:integer ; + bsbm:reviewDate "2008-03-17T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-04-12"^^xsd:date . +dataFromRatingSite1:Review164 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product30 ; + rev:reviewer dataFromRatingSite1:Reviewer9 ; + dc:title "resee choroids nonbelievers semiopaque typewriters graders obsessing anality" ; + rev:text "verbids sweetmeats verbals industriousness linseys moulted compoundable forestaller singly misprinted staider overcooking impertinences astounded slagged recirculations bleached progressively unabbreviated bastardization intelligences polygraphically pricklier cannabinol ragtimes braggy vibrations communalized fixated obsolescence afflicting conceitedly beachboys innerspring gunstocks flaxy ablation undercutting splendidly kitsches agoras backdating adeptness packagers infamies bastioned cupcakes servicewoman jazzmen splotchiest tugs sniggering catalyzed wigwags schmo capmaker pinheaded grievingly sentimentally construes entraps retractors hoosgows eyebeams spasticities hypersensitiveness congers prickles decommissions flyby nonaffilliated baloney reposed snuffs grudging betelnut deregulation tutors avianizes seated immediacies improbably fleabitten guises inching toboggans disbanded demilitarizes solecist institutionalizing anachronisms groomer feedbags languorously hyacinthine undershorts nonconductors watering plowshares nonbasic haciendas barbers discontinue propmistresses inadmissibly construing medically glues cancers callowness lankest threshers ejaculator maxims neutrophils speckles gaseously latexes whereinsoever bardic subdeb riverbeds ephedras reconcentrated quiches jackpots housemen shelvers prosperously coaxes uncurious shortens stylized inguinal saltines outstaring neglectfulness antics subsides enticement pawing backbones plummets alaskan exactions intriguers psychologizing misadvising hoodwinked idolization incivil exposal dents abruptly pardonably presides dahlias quailing statutableness inveighing clapping adventurously shintoism differentially quahogs outfoxing sinlessness preaccustoming copse falling predetermining austerest hammerheaded nontypically repudiations paternities hypertrophies reformational arrivals coughs reshaping macrocosmic dressmakers couches introits dumfounding besmear flexed"@ja ; + bsbm:rating1 "3"^^xsd:integer ; + bsbm:rating2 "7"^^xsd:integer ; + bsbm:rating4 "10"^^xsd:integer ; + bsbm:reviewDate "2007-08-21T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-27"^^xsd:date . +dataFromRatingSite1:Review165 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer3:Product96 ; + rev:reviewer dataFromRatingSite1:Reviewer9 ; + dc:title "arcs protons victimization misadvises lumbers reintroduce actively decoction functioning handsomely presumptuously takeable entrenchment" ; + rev:text "encoding slings skips cursives engrammes ugliest computable tared cert tidytips nutshells clairvoyantly mottling dairies prevocational coparent uppers syrups iteration kinesthetic listless truckloads soundest gallbladder grills gyrose reconquering coreless conversed divers waddied ambience stript tugger chattier canonists broccolis dispiriting dawdle teases ensigncy boffins counselee arouses glaive discombobulates cummers axing remigrates costiveness underrates upcoiling gammer photosensitivity outsmarting refinements threadworm grosser menservants territorialize necks stems bizarreness psychodrama paced conative protocols uncleanness dopy dunned waddied heirloom choirboys incoincidence yielded crescents nerves jesting xiii unphotographic inebriates rehangs reoccurrence orthopedist philtering reoriented hackneying discourage runtiest furcula riverbeds concisely towpaths behavers sporule vestings cloggiest riskiest papistries beguiling"@ja ; + bsbm:rating2 "3"^^xsd:integer ; + bsbm:rating3 "5"^^xsd:integer ; + bsbm:reviewDate "2008-05-25T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-18"^^xsd:date . +dataFromRatingSite1:Review166 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product1 ; + rev:reviewer dataFromRatingSite1:Reviewer9 ; + dc:title "sonneted leatheriness es atoners beanbags" ; + rev:text "dogsbody mineralogical corduroys snuggery kinglets sawhorse incloses kyanizing woollen thunderhead overlying bichlorides incorrigibly snarer overlades discography biked closured asphyxia melanoids floated maintops labyrinthine extricates wedgier flaxier hallucinating negotiatrix stoniest pineries frazzled outstare markings spicier impecunious hayforks noblesses roue sarcophaguses ladler borderings choreic ephesians graveness lire contravenes headnotes swooping exaggerator veering rivulets tooling klatch chauffeurs thermograph whipsawn forbearingly seigniorial xiphosuran feasibly swivelled salvos alveolars paralyzation ignorantness sandwiches cheques boasters tormenter maculate agrarians sprat improver pastorship misbehavers healthiest"@ja ; + bsbm:rating2 "9"^^xsd:integer ; + bsbm:rating4 "4"^^xsd:integer ; + bsbm:reviewDate "2007-08-14T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2007-12-28"^^xsd:date . +dataFromRatingSite1:Review167 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product12 ; + rev:reviewer dataFromRatingSite1:Reviewer9 ; + dc:title "specifiers shunters huskers redividing equilibration mise opaquest immersions insalivating emoluments fetchers" ; + rev:text "tidings commixt laggard enquired windflowers legislatorship waterworks seders eczema oceanarium intrenches retook numskull intemperances cleaned spearman sacredly designers gunpoint extractors values escapable warrantable allheals whopper unpretentious shelves frisk overeasy illusional capitals alterative goalkeepers sectionalism lochs sniffled banshees toothily craves pivoted narcotizing fuzils copartners subpoenaed grump petrologists empowered enterpriser reinciting mezuza averments vibrating fritterers crushproof infeoffed unconstrained steroidal reforging intender ogreish farmings mimicry unhardened resuscitating inlanders graining illegally matchmakers personifying swizzled amazement populations circulators fewest tankas overdiversifies impulsed framable decimates ferlies ventriloquist blase theocrat expropriating perspicacity freeholders torqued spatteringly granites electrotypes satinwood apatetic clincher homoeroticism provided ginkgoes psychophysical abutment elderberry chicanes pithier arizonan smites penciler delicacies palanquin sutler stoney longings workhorses ambushing reneged embarrassment reanalyzed smilax midnights newsiness adoptable whammies wranglers teetotalism monocytes idolater symptomatically lazuli finitely entanglers howls pandits dillydallying hulloes subcompact obbligato immorally abreacted proponents salubrities motey stearin sprats reclad sportscasts mesozoa renter stratigraphy worthily toledos narcissists federates emulsifying propellants sullenly journeyers jiggles forzandos"@ja ; + bsbm:rating1 "1"^^xsd:integer ; + bsbm:rating2 "3"^^xsd:integer ; + bsbm:rating3 "1"^^xsd:integer ; + bsbm:rating4 "5"^^xsd:integer ; + bsbm:reviewDate "2008-01-14T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-03-31"^^xsd:date . +dataFromRatingSite1:Review168 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product57 ; + rev:reviewer dataFromRatingSite1:Reviewer9 ; + dc:title "deprehension messily somesthesises exterminators steamships" ; + rev:text "sanguines untangled exaggerator misact enshrine leches fibber incertitude zooms divulging acquiescently unsecured loudmouthed microscopies cursively unbearable graveclothes hokiest auditing rededicated pirog vasopressor responded charros manufactories divulger mopeder evolver unbound canthus premenstrually seismographic gauging provocativeness spicily handshaking fatting arbitral presidio seems exhumations chemosensitivities bailee thrusters preform euphemisms paralyzing fiancees nonstaining phrenologically romanticize penthouses catamarans jolliest quiveringly decimalized teratologist puking reincorporated bargaining professionals loathsomely piggier shooed remeasured promisees dressmaker outplayed baselessness zippier defied alibiing triter bering subbreed supplicants mourning fractionalized foxhounds"@ja ; + bsbm:rating2 "2"^^xsd:integer ; + bsbm:rating4 "10"^^xsd:integer ; + bsbm:reviewDate "2008-02-07T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-03-13"^^xsd:date . +dataFromRatingSite1:Review169 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product82 ; + rev:reviewer dataFromRatingSite1:Reviewer9 ; + dc:title "leafing embryologically remeasurement teals bider lassos" ; + rev:text "visional absolutest crosspatch regimentally interpreter cobbier mayings grower taxed yuppie unimpressible daunter composers vendee profundities centripetally saudis misconceptions mocks hardhacks forkful severable coalbox tost shiva amplifies foresighted tiddlywinks haoles snoopiest fallowed banned elation underwinding antiphonically rebuker triplicates uncoil cankering trimotors tightener ghettoizes extragalactic unaged waterworthy ripcords pillaring unplowed astrologically supernumerary brigading dishonor ponderousness mein recirculate smutting piling overgrowing guardsman grosses fruitless fudging epical rah limestones"@ja ; + bsbm:rating2 "10"^^xsd:integer ; + bsbm:rating3 "6"^^xsd:integer ; + bsbm:reviewDate "2008-04-11T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-03"^^xsd:date . +dataFromRatingSite1:Review170 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product67 ; + rev:reviewer dataFromRatingSite1:Reviewer9 ; + dc:title "epergne clericalist alkalise ichthyisms overelaborates exists topics fittingness baroques supervened" ; + rev:text "adapters tonsured towability photovoltaic dares skippering hollowness wrasses ranee molester coloured shoring outdates sowing neuralgias vociferousness barehanded valuable corralling invalidator anticipation fosterage convection reinscribed finbacks afrikaans valvar roisterers demarcated immerses ariosos afflicted photographic flavored recessions vividly veiled soloists corelating microscopes kirned decoys croci vegan forkedly duckier deadheads resummons subcompacts garbler tsaritzas pluralize encompassed miscalculations fabulists uncrossing untasteful crisped gatekeepers orpiments luffs gamelans hurrahing overloading caving plantings cervixes presumptuousness kludged porpoises kyanising swims compartmental angleworm yearly naphthas timings serviettes seasoning mowers candidates supportless sandpapers uncharted cauliflowers sundowns uglifying chemotherapies pruriently anklets rippers diaphragmatic communistic"@ja ; + bsbm:rating4 "7"^^xsd:integer ; + bsbm:reviewDate "2007-08-28T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2007-10-11"^^xsd:date . +dataFromRatingSite1:Review171 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product64 ; + rev:reviewer dataFromRatingSite1:Reviewer9 ; + dc:title "seneschal satirizers ineptly nixie diazo radiosurgeries setups mains sprinkles looting clinger ecotypes" ; + rev:text "onomatopoetic probeable gages nosiest decentring barbers maziness chunkily mammon wheaten assessee bidets palmettoes reliquaries husking discotheque vivisected prehardened decks solidifying uprears restrainable animuses jollity ribalds bandied magmatic welcomed lapser unifier reprobes droshky fizzer rearousal gateman aeronaut rictus kettledrum showiest potsherds temptingly avocational septette outsmart thraves dumbest expulses breeders cantonment sandbar aggressed vaquero predesignating harasses transmittible vulgarized shoaly tristezas japanners tequilas denominationally consultants plenums hobbler comical gypsies iambus pulsions asthmatic expertly coarsens reveres supervening hampered axillaries nonpermeable speedboats fibroid whiner peristyles structurally mensural unfocussed wittiest gnats refilm blowers thermocurrent scotched traffickers challengeable shanghaiing quartan valerians hungered fatuity slenderest oceans acted spikers catalepsies pastures imagination yolked sprays earnable loneliest nontemporal catchwords chromizes cognati dissolvability bagginess estrogenic rubbernecked premixing buoyances burgeons unredeemed completeness toeshoe snobberies interpolation certificating transpositions affords rejudged swanning canvassers lyrately underemphasizes respectably outreason promissory misereres possessives mopper catechist jaggy entryway hermit oversteps proles values overintense armlessly pagers mortuary pugilistic dispersals sapor"@ja ; + bsbm:rating1 "8"^^xsd:integer ; + bsbm:rating3 "9"^^xsd:integer ; + bsbm:rating4 "10"^^xsd:integer ; + bsbm:reviewDate "2007-08-09T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-01-19"^^xsd:date . +dataFromRatingSite1:Review172 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer3:Product94 ; + rev:reviewer dataFromRatingSite1:Reviewer9 ; + dc:title "tole rumrunner disregards parroter trafficker burrower townless avocets khedive hardheadedness" ; + rev:text "archdukes tessellates xylophones baloneys disfunction clumpier skyjacked cauliflowers remarkableness grayest delimiting circumsolar transferability compressional sitcom quintals jibbing mutilates vivisects dryly caricaturist yodeller unadjourned governors longitudes sillers recognizing gooney printer blottiest greenrooms endives peopling chaining badgerly pasturer reliving crumbed disclaims foulards underassessed ostinato afterlives followings horsed scanter superintendence blunter mangels bounded epitomizes compensating fossilized critturs sequestrated unlatched travestied telltales derelictions tetchier purposefulness amercing lour zoography chiders overstate baroques shipment unrobing hounders mucosity retainers overprotects absenter weltanschauung vivisection radioactively airships overcorrection looper disposers drubbed hoisted spic stockateer steeper shipway underestimate scalers astrakhan schmo"@ja ; + bsbm:rating1 "4"^^xsd:integer ; + bsbm:rating2 "3"^^xsd:integer ; + bsbm:rating3 "6"^^xsd:integer ; + bsbm:reviewDate "2007-12-12T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-03-08"^^xsd:date . +dataFromRatingSite1:Review173 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product31 ; + rev:reviewer dataFromRatingSite1:Reviewer9 ; + dc:title "binaries confounds admiringly lappers feminacies centralizers foamiest fichu counterinsurgents lowbred hagadists" ; + rev:text "dubiety impregnably giggled coupons interleaving hobnobs intransitively uprisen conventionary playfully disuniter reminiscence eponymy preengaged urology amplified hybridizers meals greyest romanticist meritocracies waiter ecocide fabulist pinnated nonexplosives veered effervesces obscuration famished humbugger ranking counterblow humaneness overexposing sending potentiometers treys disclosure inflight flutier tentacular hatefully millimetric guttiest blower pseudohistoric stammers ravellers spinier fussbudgets waxier anguished antirevolutionaries recaller courtyards whirligigs downtrod nonbelligerents unlettable antechamber imagisms bandager unwisely clarions snores gausses coupons frightens reconsolidates tongas contenders getup outrank suddenness pharaohs ebullience contiguities auditors digger cruzeiros uncorked assembler hypnotizing plodder discomfiture iceless crackers carnivorousness radiographer contemplation taxidermists alehouses eternalness snarlingly appreciated tuts sedateness balmoral convoys conviction masthead ionizations aclu squinters conceptualists appreciating declaiming aeronaut violoncello"@ja ; + bsbm:rating1 "6"^^xsd:integer ; + bsbm:reviewDate "2007-08-03T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-24"^^xsd:date . +dataFromRatingSite1:Review174 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product30 ; + rev:reviewer dataFromRatingSite1:Reviewer9 ; + dc:title "sifter mirthful readd schuss refs balding abatement prewarming pressosensitive" ; + rev:text "procurators traces stannum steels unreconcilably klaxons sellouts damosels eloquence inciters succubuses ministries unascertainable muslins unanswerable mooncalves radicands limits contemnor uncover neutered battier undue hts precautions toyons baric scurfier almsmen crustacean indenters securement figurings naughtiness liquefies stellate cockhorse vocalizers personified glaucomas minuteness vivisects obstructionist decliners mesquites breeding wrigglier ribalds yds engrossing cirques denigrations fishtail overcoat traumatization displays diehards meshing purloins repaving reinfuse foolhardiness collegiality cumbered assertors peelers brocades clefts autoed rebs paradoxical disassociate tantalizes irreplaceably demobbing hymned excellency megaphones withers knottily thawed snowmobiles crewing billheads beclouding gangways titillation growliest undresses treaties infringers affixers freakishly seizins saddling compacted sterilizers percenter representor iowans derelicts fuggier ways biogeographic interdicted jadishly chitin barfed germproof spheral duteously abiding yenning nonplusses counterrevolutionary smugly adjuratory segmentary inadvertently cyclical undersign pated tribuneship postages fructuary tandems llama rumination seducee saucebox corncake laudability clenches vertebras farmer days hypertrophied profaneness exhusband watercolors distractibility felts runnels forfeitable beacons unbuckle scrimpiest savate preordain overprice litchi whapped anoles wainscotting recommendatory pistolling changing propels dreariness preboil unsystematically studdings hoarsening parasitologist incompleteness nabs"@ja ; + bsbm:rating2 "10"^^xsd:integer ; + bsbm:rating3 "1"^^xsd:integer ; + bsbm:rating4 "1"^^xsd:integer ; + bsbm:reviewDate "2008-01-21T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-03-03"^^xsd:date . +dataFromRatingSite1:Review175 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product9 ; + rev:reviewer dataFromRatingSite1:Reviewer9 ; + dc:title "circuiteer proposes mobsters drugstores transships outflanked surfiest harks imprisonments gelid repaired prowesses inconsumably" ; + rev:text "loathly erogenous fulminator photochemical amines beelines catacombs unphotographic impetuosity awarded wobbled doughtily elks kitchenettes allusively satanist characterizations imagists fashioned triturable prediagnostic zestful souls pneumococcic fuehrers raring headspring ensnarers shewer copulation experted provinces tranquilizer yamens puffs ashram insupportably belligerents overturned artworks naively incivil isotopy cannabises oenophiles rebidding flawless disguising politics brisling evaluation subtonic paradoxical approached hawkshaw slowworm assignment preferability handlooms steaded curvet spunkies goosey xenophobe appalachian scabbed jobbing elementariness gaveller"@ja ; + bsbm:rating1 "1"^^xsd:integer ; + bsbm:rating2 "9"^^xsd:integer ; + bsbm:rating3 "6"^^xsd:integer ; + bsbm:reviewDate "2008-04-28T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-05"^^xsd:date . +dataFromRatingSite1:Review176 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product14 ; + rev:reviewer dataFromRatingSite1:Reviewer9 ; + dc:title "archiving heterosexuality serializes perusers snuggery fountainheads paginated chinchy silliness nonemotional homaged unmailable pulsions codfishes timecards" ; + rev:text "hidable barkeeper seismisms nonethicalness broths disembowels fallers tokyoite paisanos bullnecks reissues serviettes catheterizing sifters etatist chemotherapeutically discouragement conflicting hiragana staminas squalidest invigorating draggle fudging moderating swashing phenotypes censurers hypocrisies cigarillo emptiest maids veined omegas persians revocatory adverts brusker lams tsuris somatological biassed barouches microprocessing washrags tattering secretiveness contraries bioactivities cuffing vernalize limper mumming lapidists taproot telemetries sachets palls barricades ensembles bankrolled underhanded outpouring phallus bluffing heehawing staves jeopardizing counterpanes hemispherical picturephones aeronautically contriteness curtailment basilicas submergences scholarly protracted manuscripts carnelian senselessness alamodes vees rancher wainwrights peridot beekeeper woolers retiringly ovine getup margents villadom enjoined overturns stories testation melancholia coshed chugged cockcrows trundler maltreats productively rotted dams whimsical stimulates firebrick smoggy debouches frazzled hemorrhages prognosticators laundered legateships suchlike cloudlets bunds inwardly impounded grumpier teared elastin defrayable overshadowed pedicab absorbs worrying transected shammers reviewer junkmen degrader mustiest pantingly braincase occluding illumined amounted buzzers chattier retrogressions ganglia philters commentators bigamize insoul firmest underfeeds kibitzes commiserations moans cornetist ladleful knave maulers derelicts pietist disheartenment skirters retroaction interlocution geomancies aerologist combatively travelog elegizes xenolith obduction stridency marxism manhunt stenographically underpaid stolidity greatheartedly nightwalker submersed regranting preexamines probeable unscarred baptize aggrieved inhabiting mainlands tannish swirled mashy overshoe oppositeness producing tenpins revenued"@ja ; + bsbm:rating1 "8"^^xsd:integer ; + bsbm:rating2 "10"^^xsd:integer ; + bsbm:rating4 "10"^^xsd:integer ; + bsbm:reviewDate "2007-11-16T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2007-12-18"^^xsd:date . +dataFromRatingSite1:Review177 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product46 ; + rev:reviewer dataFromRatingSite1:Reviewer9 ; + dc:title "ceased garrotte deionizations roseate subcell diffused spectroscopes celibacies scrutinizer" ; + rev:text "drumroll tapered curliest loyalest hectometers pastimes secularist principality postseasonal marmites criers notaryship ripcord etiologic bioresearch waisting homebody constructiveness percolation addedly solderer heartburn stickums stemmy coilers hairbreadths thickety cesiums centralizes immenser disentangled glasswork walloped manuever expunged obtuser properest patching burglarized functions liq imputes ostia knifing leaking od geneses governorate clubmen verbalize aerified rarebit surveying schlepps sintered flatwise coquinas scandalizers vended etoiles subeditors valises seating overstays spearmints ordainer univocals salesladies spokeswoman reconfirmation tuitions elopement nebbishes wobbled unexplicit spiracle refly latents kakemonos welds shortest chayote offerors sickbed misdates smiled bedsteads artificers prelim giddying outstayed antipyretics heiring reimpose shoulders preterminal reprinter birthing versal flingers annullable ateliers allegiance waddled crushers engorges excruciatingly obscuring portioners expansiveness extrapolation emplaced grubbiness illuminator crowdedness liking misquotations achiness noncoagulating counterspies lusterless rendered moped unblessed rejectee depraving unpeople peppers react reseed gunsels hoggishly monopoles humorists pears galumphs locks climaxes jangler polymorphous nosh thugs longshoremen winner phobias enchant deterrer terrorizing throttlers japanize"@ja ; + bsbm:rating2 "5"^^xsd:integer ; + bsbm:rating3 "10"^^xsd:integer ; + bsbm:rating4 "1"^^xsd:integer ; + bsbm:reviewDate "2008-04-30T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-01"^^xsd:date . +dataFromRatingSite1:Review178 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product49 ; + rev:reviewer dataFromRatingSite1:Reviewer9 ; + dc:title "clarifier oxygenation accruable proboscises whops" ; + rev:text "biochemically valuing autoed plighted ferryboats neighborly garroter alewives marvelousness aper jokes stints debtee unstandardized plowshares cannulae meltons replied eolipiles affrays lazarettos alkaloids garotte shicksas fighting shined reenlarging plants totting atomise dropkick microgramme shetlands unprotestingly pantaloons amandine approximation caverning hyssops boarders argled intersexualism bowless vindicatory assegai insomniacs coaxes centres enforce overconscientious vehemence stetting somnambular occasioned tenderly choreic misters zoogeography possessors emulates embalmers paddles hayfork runless impaired tawdriest tinny usurper warehouser seamounts distributors accusive pronouncing alcalde forethoughtful kiwis wirehairs gloomed quayages spoliation modernistic gratefulness stoopers subitem anybodies effervescently fowling indecorously fibula diffusely cracker mettled anaesthetized impishness donated traffics avengingly recalcitrancies solubilized anodally milkman justifying bedaubs unaddressed ichthyic trailblazer unsuggestive demimonde weewee apologizers dinguses upbraids narcoleptic soybeans tzarism schmaltzes heralds pleurisy bastardization shewn rarefies unpacified toff greenhorn plussages pronunciamentos ensue explicator boastfulness hired dissipating virtuosities matchmaking complaining skirmisher malignly proprietorial forewoman formulator landsman gladdened carefuller anthologist disorder bibliographer zikurat inflictions slumberers paramour eternities noisily maleficent vialled abusers dinkier bruises befools breathier antiphons fagots gifts financially yearnings dhole moonish pretenders actualized unload overhastily fullest ventricles organizers guilelessness mordent reclamations trichloromethanes"@ja ; + bsbm:rating1 "6"^^xsd:integer ; + bsbm:rating2 "4"^^xsd:integer ; + bsbm:rating4 "4"^^xsd:integer ; + bsbm:reviewDate "2008-05-21T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-26"^^xsd:date . +dataFromRatingSite1:Review179 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product56 ; + rev:reviewer dataFromRatingSite1:Reviewer9 ; + dc:title "telecommunications enshrouding regathering cyclopedias businesswomen gridlock chirpier" ; + rev:text "currycombed fizzers albinisms supplementation inhabitance proconsuls anglophilia salerooms accelerates reweds neuralgias screeners exuded muzzling reorder crestings embarrassing poaching enflamed daintiness hayfields greyhounds unrhymed handfuls flagellated revivers suspecting puzzles availability pouts elkhounds hexapody stoopingly extorsive bugger deveining forager suckers badness inflation dimorphic wergeld ounces renomination zested misdiagnosed urinalyses skirled thrummier undesirability alexia urogenital chromiums curiosities nonsexually villadom disembodied incompliant slider koruny unconscionably multilevel tsktsking shrieking flukier gloves rulings masochists bravados styluses treacherously reconvenes depersonalizing mitzvahs servicers meadowy superposing unmorality prosperity immaculacy gyrfalcons quavers isotopically rasping invoked chandleries tressier blinding elusively recombine seborrhea gravimeter subindexes liaise noumenon rarefiers statics mummied seeresses frapping gunroom extras alienability spirant mellows endlessness suspensory taunted citers obstructionism blanches ayahs nonaffilliated hybridize pledges impenetrability proctoscopic jigger indictor accusatives inquisitory resonators neoplasm knells clemencies curving multiform"@ja ; + bsbm:rating3 "7"^^xsd:integer ; + bsbm:reviewDate "2007-09-14T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-13"^^xsd:date . +dataFromRatingSite1:Review180 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product74 ; + rev:reviewer dataFromRatingSite1:Reviewer9 ; + dc:title "erupted lecturing instincts clarinettists" ; + rev:text "rates syringing stegosaur indulgence refrigeration tramples reappraisal institutionalist hulls scurvies commuted vibration overstepping seers wavey bumpkin labored indicants workloads tacitly incredulously kappas millrun bagsful enlister youngling belaboring villager release tames criticalness zither multimedia chantries travoise overtopped molecularly pillion bedazzling profanities etceteras curates agelessness storehouses unenvious pouches gunlocks anesthesiologies presidencies absenter uneducated trave infecter coalifies vacillated wondered manufacturing muggers ureic hospitals overembellishes puces vasodepressor nonkosher rearwards vasectomizing punctiliously discharging limbier iberian exobiologist containerizing offense sanserif neglecting reawaked scientistic headless precipitations daises resuscitator animo palling tofts encirclements permits dollish"@ja ; + bsbm:rating1 "2"^^xsd:integer ; + bsbm:rating2 "7"^^xsd:integer ; + bsbm:rating3 "5"^^xsd:integer ; + bsbm:reviewDate "2008-03-14T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-11"^^xsd:date . +dataFromRatingSite1:Review181 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product51 ; + rev:reviewer dataFromRatingSite1:Reviewer9 ; + dc:title "benchmarking misuses pimping supraliminal chemics funkiest" ; + rev:text "graying stringed fonded unrespectful coaled nixing uncheerfully intramurally erupted absconds creepily whiffletrees menhir kansans unlearned melanogen salably toweling gimballed zealotry overdiversifying vaporized overrefinement cohered rafts organizes naturalistic squirting funnies ribbed phoenixes sleeks reveille rebuild joyfully seizins bailie destruction corrects tremendously watermark evacuee briony flyblows undercharged majorette benzoin eyers publicizes personified sunstroke drainer fauves putdowns unresistant scheduling prescribing dashing fanwort briefer restitutive theorizing purporting expectations untying transduce hematinic"@ja ; + bsbm:rating2 "6"^^xsd:integer ; + bsbm:rating3 "4"^^xsd:integer ; + bsbm:reviewDate "2007-12-07T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-03-26"^^xsd:date . +dataFromRatingSite1:Review182 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product57 ; + rev:reviewer dataFromRatingSite1:Reviewer9 ; + dc:title "drivel resisting perforates refiltered butches booting kapoks rendezvoused sinisterly shambles" ; + rev:text "cored opaqueness desynchronizing sanguines monarchistic trines tamely seismographers dipody pottier fellowly hauler illusiveness challengingly flooring tsardom maraschino villager cyclones boilermakers respectfulness trounces rhapsodizing nutrias ambulators possessively stainabilities faultless unmingled specks pentadactylism hospitalized terne revising subprincipals desks kickers rakeoffs pondering purposefully catnapping journalism spacewalk peacockier noncontradictory sics finalists hidalgos beloved rereading distances moos prematurities approx suns nesting weaves prepublication sordidly austerity putdowns expatiators"@ja ; + bsbm:rating1 "3"^^xsd:integer ; + bsbm:rating2 "4"^^xsd:integer ; + bsbm:rating4 "7"^^xsd:integer ; + bsbm:reviewDate "2007-07-01T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2007-12-10"^^xsd:date . +dataFromRatingSite1:Review183 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product31 ; + rev:reviewer dataFromRatingSite1:Reviewer9 ; + dc:title "remedies procreators flagellants swampland bedouins assassination experiments knotted greco methodologies spiers accustoming binal" ; + rev:text "buffeted dolour swirls sumach rarest countersigns maize peakish igniters notebooks federations heartiest sleetier rotisseries headmost twanged boosts dapperer subdivisions replicative concupiscence alizarine routinizes reinspects sketching overpasses manikins retarder nothingness explicitness clinks sergeantcies disarmed intuito weals entrap betted disciples tenderfoots topically cruzados milkmen hatching whistled obligability arranging inherently televises cuscus pizzas protestants bonfires spilth fubsier gabbler unnourished adulterers corbels papyruses omnivorousness showcasing decocted majorette"@ja ; + bsbm:rating2 "7"^^xsd:integer ; + bsbm:rating3 "1"^^xsd:integer ; + bsbm:rating4 "5"^^xsd:integer ; + bsbm:reviewDate "2007-12-15T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-01-07"^^xsd:date . +dataFromRatingSite1:Review184 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product23 ; + rev:reviewer dataFromRatingSite1:Reviewer9 ; + dc:title "viability atoned chaplet demythologizations guiltiness tracker pantingly cavorts rotating faut restrictionist granger hawkweed" ; + rev:text "intoxications choreal filets claviers mateship sheltering deigned banalities beachier movability outarguing eristic keratomas sculked googlies ruggedest loamier illnesses depredation possibler bewildered glooming rolls friskier unsubtly overweigh nonesuch obtruders aerology corrosiveness rebaptizing rides materialities anthrop spouters deadlocks clatterer reviler indite sightseers nonverbal dredgings purity keratosis perm votable unlimitedness pressmen ropeway kindles slenderer kilowatt cerebroid statedly bootlick specificities pavans obsidians insulters overweeningly enumerator frugging cached embroilment dickie rayon ribgrasses bikeway defied genuflections tbsp heelers caging capitalistically absences abscission magnesic seizer sincerest tinglier vaginitis scrofulous rendering chalcopyrite annat backslider aboral tablefuls tusks fibrins ricercar bedrail tumblings doubtfully exploders immunosuppressants oldie thankfulness detested brittled valetudinarians foaled bathyscaph disfranchises aberrance quilters captives rotates handspring ulcerated infarction roadhouses trouping corollas nauseates unworthies elongation cashiers apparats cirrose vintagers imbibers adjudging seafloors realistic empathizes brainstorming outshines inkless impiously incubator imagined hybridize geotropic magnifies scintillas denigrated devouring commuted tanked sprawly coopting easier sanga forsworn fructified"@ja ; + bsbm:rating2 "3"^^xsd:integer ; + bsbm:rating3 "5"^^xsd:integer ; + bsbm:rating4 "2"^^xsd:integer ; + bsbm:reviewDate "2008-01-20T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-04-28"^^xsd:date . +dataFromRatingSite1:Reviewer10 + rdf:type foaf:Person ; + foaf:name "Shareese-Amaya" ; + foaf:mbox_sha1sum "b1b62cd4c3e595823a4787abec9511ca5e512f" ; + bsbm:country ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-08-25"^^xsd:date . +dataFromRatingSite1:Review185 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product76 ; + rev:reviewer dataFromRatingSite1:Reviewer10 ; + dc:title "twopences homers gabardines aggrandized territorialize geoidal intensifiers turfier" ; + rev:text "concaves reconcentrate amies enmeshing firearms pontoons shoaled snowflakes inflammations helicoids parer unlaces busher pulsers kalium despots caseworker mockingly freckled valorize vituperatively ruins unpeopling triviality cognizing forgoes windburn deerfly preinstructs soldering industrialists reemploys skylarking grazer believes indulger redheads inspirational stingingly ergonomically unoppressed swingier silex achiest counselling pretensed accentuation suspenders snores butcher chafed scintillatingly patriotism fastened strobic inessential massaged murderers nonconsecutively immeshing fistular mulching recommendations ribonucleotide coprolith gratings swooner pulsations dispossesses moistureproof hidable lamination dauntless better sledded bulging varment gentlemanlike peacing mohairs wrights hominess embargoing digitize amusable definiteness litheness reducibly reenlightened gunfires outlines overspecializes hundredweights monarchistic trampolinist mammeys manacling detoxifies usually distracting dottels mediation exertions percher fictional unrewarded resonations valorous discourage unwinder wealthiest consecutiveness incept conflicting hah titivating manfully huffier tucks fashionable ampulla deigning wordiness memorials frocking overdraw chesty archaist exclamations closeouts epiglottis dogtrotted floured perilled kinked liquidated revitalizes atheisms superiorly preordaining presell cabinetmaker convenience fistulae cenacles diffracts tackler adduces uncos pecky homeopathic diurnally interlopers dittoing caesura sherd teamakers decemvir apprizer homosexuality resharpens forenoons pavane zeniths durably livening"@zh ; + bsbm:rating2 "1"^^xsd:integer ; + bsbm:rating3 "4"^^xsd:integer ; + bsbm:rating4 "7"^^xsd:integer ; + bsbm:reviewDate "2007-09-28T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2007-11-26"^^xsd:date . +dataFromRatingSite1:Review186 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product28 ; + rev:reviewer dataFromRatingSite1:Reviewer10 ; + dc:title "cogitating radially falsie falsie subsoil vagrantly tragedies clubhand dermises reconvey digitally goalpost amids colleger refolding" ; + rev:text "ilk tanglers mistranslation bigeye valancing abstractionist ethologists artificially nuzzled crampon anadems caladium plotters posthypnotic dams serviceableness reexchanges lapidaries pentad constellation defacers compromisable dacha ozonizer offices columbines crapshooters bouffants taction oxalis sociologic eerier forewords reavow tournaments glared cursives filaments balladeer spinally adopted canard motivities ambassadorships milestones peerless scurfy exarchs ramping extirpations tauruses infallibleness poppycock finns achingly dismalest interlaces loudmouths tetrarchs apogean mainlining gibbeted mismating station demotions implicates unquestioningly misbills predesignated chorister toro unhanding cavities unknowable coeditors presenters distortions fumet songster tiptoes schoolbag egoistic bibliotherapist beseemed arisings alibied agronomist triceratopses intercourse nonthinking frizzliest stimulations berlins emanations routers schismatic fleshly makework rhythmical cerebrating seizors vamoose tinting berrylike tollbooth towboats gasifies spoliation nonfactual delivers salutarily introspectiveness desuetudes entrance goddams anticorrosive assumptive fards conventicles hardheartedness spoonerism directories untruthful consecrative rehems blackjacks insister ringnecks daydreamt corralling shinglers gregorian darks turgidly overbidden kaka reascended larges shepherded bullyrag diamondback destain openings prisoners lowness interdicts lymphosarcoma foretellers machos televised privateness isomerous transsexual realigned girasoles bentwood adit lf ornamenting widens cypriote participator preestimates prescriptions victualler stinter combatting osmiums recopies daemonic freezing intersectional proverbed gads battlers interdependency deltic irks gabbler enthuses responded reconcilements hesitating rattish papillae"@zh ; + bsbm:rating1 "3"^^xsd:integer ; + bsbm:rating2 "7"^^xsd:integer ; + bsbm:rating3 "8"^^xsd:integer ; + bsbm:rating4 "3"^^xsd:integer ; + bsbm:reviewDate "2008-03-24T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-09"^^xsd:date . +dataFromRatingSite1:Review187 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product88 ; + rev:reviewer dataFromRatingSite1:Reviewer10 ; + dc:title "unmastered regrading routes studs schick reposing milldam sinuated monoxides squirms drivel" ; + rev:text "puffballs intentions wintering nunnery sots teemers snippiness thwartly onside realization toadyish miscellaneousness hexaploid inaugurator mutineers meridiem sapwoods groundswells portioned bridewell unconventional channelizing odorant grosz subscribes velleities nuncle proceeded tranquility warpowers reconnoitered aborting relentless hoboism obtaining munchy robs argentite alumines caldrons fairies bedeck hangars outgunned grandmaster pols prosperity pennsylvanians devalued wasting jackanapeses rialto retrials shockproof royalists inevitabilities subcontract alexandrines sunstones oversimplifies barterers logicizes doctoring smiters hashhead dystopias sneaking agitatedly protectionists autodialling jabberer cuteys periodontitis productions beefcake dirks realizers ingests seizer reoil whizbang mollusc neurotically syllabuses uncap etymologists chicos butlers focused unsettles citified anguses ringneck tempted narcotize enveloper shopgirls mille antihistamine pudgiest distorting extremist hoodwink annunciations oblongata developmental sedulously conviction squallers momentariness castes hairier gelees overjoying solanums overwound investitures implorer"@zh ; + bsbm:rating1 "7"^^xsd:integer ; + bsbm:rating2 "4"^^xsd:integer ; + bsbm:rating3 "7"^^xsd:integer ; + bsbm:rating4 "6"^^xsd:integer ; + bsbm:reviewDate "2007-09-16T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-02-26"^^xsd:date . +dataFromRatingSite1:Review188 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product51 ; + rev:reviewer dataFromRatingSite1:Reviewer10 ; + dc:title "expecter tootles convicting typecasts gutless seedman hollering entomologists kidnapers retrievals misalphabetized fettles" ; + rev:text "titrating converts kneaders frogfishes veinlet heehawed graphological doodling burgundies bander viers doubtingly carousers highbrows deathblows expandable vulgarized drifter pastiness strongarmer bullfights operator vacillations posterns fiduciarily considerately reclining massiest juntos headmen zoysias neoplasm bedcover heralds revelational effulgent jollying direful humdinger teak spooned distinctively vainness judoist dumpily reappoint doyenne recite cragginess desolating pouchy triggers forecast cutinizing quickly humoring heaps recapitalized muffing foremasts visaged trichlorethylenes cheaters icbm syphiloid"@zh ; + bsbm:rating2 "7"^^xsd:integer ; + bsbm:rating4 "5"^^xsd:integer ; + bsbm:reviewDate "2008-06-11T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-18"^^xsd:date . +dataFromRatingSite1:Review189 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product60 ; + rev:reviewer dataFromRatingSite1:Reviewer10 ; + dc:title "nope arkansans untoward aviations excommunicators servilely deckle envying jadeite clew blackballed hemispherical eliminating tackler knapping" ; + rev:text "chilli decrepit quintics tressier dreams entrain chiropractic noisomely juristic foresightedly illegibly enameling rebating chattiness lancing elderly wristdrop neatherd cappy topsails shifters saurians roundups insensitively irrigated astronomical corrections cheaters reiterations unimpassioned liq ancestresses giveaways brightening vamoosing coyish nonnative determent unpresentably warmongers riveters unsaddled fixates workouts rectangularly retarders snigglers gyroidal grande vulgarizer earnestness henbits spoilt umteenth mooching counselable rears divined misconduct airedales etymologist coined warlocks agglomerated puckery highs salvagee disinterred imploding ringmasters blancmanges unpolitic artists omelette tremulously adytum gadgets oviparous ochery tinklier retrograding adjunctly spinnies juncoes goulash scything avows syndication unpeg pillagers lichenins thurible reseeds kittenishly pledger eulogized caking romanizing dissolved twinnings amyls orthopedists powerplants hyphenating fondest glorifying pinecones choices spleenish succeeders polemicist womanizes herculeses numberable chatterer surmised zambians weatherability learnedness reverberations semiprivate equivalencies suppositories monopolistic wolds nonreciprocals luster paneling repurchases remodeler phylacteries underruns panocha transferrable deathtraps refreezes interlacing suchlike curding eaters rezone resubmitting lichened malaysians bruited defrauds scapulars disarrange seigneurs cardiography slewing coagula ghast percentaged clauses odic safaris blasts intermitting hest wackiest lumbagos hunted uncial unkenneled spareribs beeline lazyish tympanum stroking trundler foreladies noggings shantis spoiled ensphered earthier bunching manchuria oeuvres oversuspicious rationales blabbermouth heartier misaligned subside unprepared athenians constrainer divagating registered fullering cites siameses headlined randoms"@zh ; + bsbm:rating1 "2"^^xsd:integer ; + bsbm:rating2 "5"^^xsd:integer ; + bsbm:rating3 "9"^^xsd:integer ; + bsbm:rating4 "2"^^xsd:integer ; + bsbm:reviewDate "2008-04-23T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-16"^^xsd:date . +dataFromRatingSite1:Review190 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product74 ; + rev:reviewer dataFromRatingSite1:Reviewer10 ; + dc:title "aggressively tangs individuating firepans overfatigued sports" ; + rev:text "sere kerfs tinsels scalepans categorizers overindustrialized legions adorability varicose underrate mores enervators flosses choreas photophilic recooking perlites determinants dangers loading intensities hangared orients rainier kiesters disport behoved fluorides integumental chromizing curbstone toted reconsiders heirdoms weldless unpropitious daring unpacified withed budder isthmian muskegs expressions goaled pizazz reincarnate dumbly bander translucence whitener lazaret kamaainas blenny glyphic preconception anemometer broidering vinic semiprofessional overprice goglets ranis arcuate insoles greeny imitating richer watering hunched numerator ligneous protectionist organismal remuneration raunchiness conditionality thumping redoubt spattering drowsily drogue anatomizing blowzy scandalousness sanitariums chauffer fameless hexarchies fusions stemware blushed bravers metalloenzyme goldarn reheaters homeopathically ascorbic tomorrows microsurgery spawning subcontinental remunerations photocopiers stripier tastable ruminants servicewoman pigeonholes stroker inkpots deadpan boasters marcelled dismounted moisturize sacrolumbar perishableness recipients protesting"@zh ; + bsbm:rating1 "10"^^xsd:integer ; + bsbm:rating2 "10"^^xsd:integer ; + bsbm:rating3 "6"^^xsd:integer ; + bsbm:reviewDate "2007-11-17T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-01-19"^^xsd:date . +dataFromRatingSite1:Review191 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product62 ; + rev:reviewer dataFromRatingSite1:Reviewer10 ; + dc:title "macerator dharmas jeopardous strengthened rowan falsifier hypersexual cows seminaries regrows chitchat sunrooms perdurable towaways" ; + rev:text "fernless graphically delver covertly hybrids contusions tonicity overprotection slivered panniers centripetal abdominally decisions remeasurement deacidifying gnarls intercessions trainway songwriter getters adopting caducei thwacked blockhouses allopaths australians minors whalers finales parakeets rekindling vivifier measles proletarianize inveiglers erectly recantations penologist serous wavery anointer detonated countable synthesizers sententious anthill greaten onanism boozier cardinally adsorbable dramatically disabused peculiars perilousness scarcities halloes chooses reviling encamping trammed crasher scherzos fantods teratisms discouragingly prodigally joyfulness enmeshment rehearsers controllers reminiscences unpityingly repellers hazels remonstration litigators calibrated finalists doornails plighting outrageousness antisepticizing footbaths fuhrer laddies sandalled traducers slicks touter scrimpiest prattler leaguers antiradicals trippers frontals subfloors metalled piously foaling chirped abundantly disassimilated tricksier archdioceses subaqueous contriving reaccredits weeklong duteous criminalness parthenogeneses gunpoint historical keypad stenciling ashrams coaction dewlapped tyke paramecium baselessness lifeful fuhrer unserviceable stalinist bowdlerism calked pelleted legislates demodulates typebar nights bolsterers opting placentation crowds klieg overindulgence expedience chemism furnished tenemental brigading disuniter subliming hostelers homeostases feudalism muring boyos salaciously longrun pinning"@zh ; + bsbm:rating1 "4"^^xsd:integer ; + bsbm:rating2 "5"^^xsd:integer ; + bsbm:rating3 "6"^^xsd:integer ; + bsbm:rating4 "9"^^xsd:integer ; + bsbm:reviewDate "2007-09-18T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-04-10"^^xsd:date . +dataFromRatingSite1:Review192 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product28 ; + rev:reviewer dataFromRatingSite1:Reviewer10 ; + dc:title "acclaimers pushily preconstruction pinon" ; + rev:text "sustenant bursa muddiness breakages reinstalling imponderableness limpest vamoosed lupuses bickers readmissions chanceman glanders manured enmeshing assorting disconnection sandsoaps proteges groping defile elementals parapsychologists falsie poetically somersaults spatting strikingly stumblingly maxis imploration sectility drunkest imprests passingly ferule ambiverts hunts promonarchists alighted colluvial spots tallest bogglers nineteens disheartened flagrance intermixtures cartload ruckuses dustrag elands cotillon unmolded pathfinders aromatics perpetrator endlessly unavoidability sabring educative typewriter chronographic provable overdrinks conditionals veinings bindles habanera berms sillier sectionizing incontinencies fewness stinted diastolic overreached reappoint approvement cardamons paradisiacally splurges nonsuccess winterers wirephotos reoccurrence smacking adults bailing overambitiously abstrusest pastille brogans scowed streptococci circumnavigating extinction concordances disproportionate variedly loner outwitted astringes cerebrospinal factitious customers unteachable soldiering egoistic darkeys revivalistic sacredly regrowing overarches thinks clericalist"@zh ; + bsbm:rating1 "5"^^xsd:integer ; + bsbm:rating2 "2"^^xsd:integer ; + bsbm:reviewDate "2008-03-15T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-02"^^xsd:date . +dataFromRatingSite1:Review193 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product44 ; + rev:reviewer dataFromRatingSite1:Reviewer10 ; + dc:title "chinked crackups ensurer reffed floozies toyon pizzas vociferousness coasting" ; + rev:text "unavailability knitters vagabondism designation bikeways predestine radiator coneys beadwork knish sulkiness immanently aleuron psychiatrists refuged dialysed bedquilt embellishing froggy joyless sites jibers maturer semites bullpens anatomist fondling poked westerlies battlement palpably preciosity deliveries trustable importations cantors evolutionist iceboat nepotism xebecs neuroticism denizens rooking subcontractor toucans leans devours eternized taxman scraped alimented wrangles blemishes troppo lithographically moonlet firehalls aims lassoing leprous randomizes hyperirritable wheeling oftest affirmer disdained sacrosanctness boused serologically cordially beamed chisellers convivially mens autonomously potsy gipping schoolrooms tinhorn ductal lazarettos sourball contaminated wounded ruggers larrups umbrageous reloader libre"@zh ; + bsbm:rating1 "7"^^xsd:integer ; + bsbm:rating2 "10"^^xsd:integer ; + bsbm:rating3 "2"^^xsd:integer ; + bsbm:rating4 "2"^^xsd:integer ; + bsbm:reviewDate "2008-04-05T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-09"^^xsd:date . +dataFromRatingSite1:Review194 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product36 ; + rev:reviewer dataFromRatingSite1:Reviewer10 ; + dc:title "humorists mouthpart methought pulsions bunter benefits nonconstructive outspell ghoulishness ideological otolaryngology" ; + rev:text "pouts intruding unpractical occasionally jimjams giver roarers antipersonnel booms dissolvability racquetball screamer porosities cookey subordinations blotchy bloodied slabbery disobedience skiplanes amidship proboscides tarpapered peacoat illegalities equalised reobtaining unsecured nebulized twinkler benumb imagining thickets madders tapeworms jubilating japingly apostles simplifiers outbluffed outselling overviolent woodpecker widdling southron autobiographies combativeness nerd misidentified nighter hamstring stocked homeliness yonder tarnal unsuspiciously crabby sandbagged mktg mistreating predacious hiraganas dogmata regenerates encipherment deceives afore peonisms luxuriance preponderantly chesty condescendingly wagonette recrudescence maxixe remonstrates untasted awakenings entailment tympanums muzzier yodler cooey slipcases djellaba retrofired ciliary huntsmen skates wizardries wrenches braveness deveining unexercised supramental treasurable microbic transships merchandised septets awless redetermined opals fatherhood incrusts viscountess helper hanged robuster colorers dishonors beseeming"@zh ; + bsbm:rating1 "1"^^xsd:integer ; + bsbm:rating2 "4"^^xsd:integer ; + bsbm:rating3 "6"^^xsd:integer ; + bsbm:reviewDate "2007-11-26T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-04-24"^^xsd:date . +dataFromRatingSite1:Review195 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product31 ; + rev:reviewer dataFromRatingSite1:Reviewer10 ; + dc:title "sociologically hammered cultured hijacks retried reinforcer snuggery unshakable mazily sidling revengers recriminated" ; + rev:text "sunstroke accepting retractors peakier consommes antirust entires badmouthed belles ruggedest nutlet recompounded revolutionizer absolutistic falsifiers uninflammable undeterred annotative eczemas trunks outfit budding wanters starkness vouchsafed mortuaries profiler brochette invasiveness scalping indemonstrable ladrone zanier abolishment universally flavours goads meanies dripless mistbow traumatologies voter patricians dumpiest alibied cenobitical reanalysis clarinets resolvers snugs mime misconstrue preluder bushtit unfavorably notcher safetying polysorbate myrmidons oviducts harlequin skulls embosoms possessions disorganizes outed cumulonimbus winless repines supporting deliberating counterclaims tympanum detaches virologies porgy oafishness heavenlier pongee interconnected stigmatization largest elaborating wickets equivocators hyposensitizing flowcharts hazed beanlike subtreasury roamed improving hairsprings watchwords likeable underage evanesce drecks normals birthstone corseted unearned intervarsity crapping nippers misconceive commode tyrannizers ultrastructural adjudicatory fuzed que kindergartners stingrays cribbed swanking antecedently gyrocompasses mousse cording intermolecular bluecap sudsiest reversals libidos"@zh ; + bsbm:rating1 "10"^^xsd:integer ; + bsbm:rating3 "7"^^xsd:integer ; + bsbm:rating4 "3"^^xsd:integer ; + bsbm:reviewDate "2008-05-28T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-04"^^xsd:date . +dataFromRatingSite1:Review196 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product16 ; + rev:reviewer dataFromRatingSite1:Reviewer10 ; + dc:title "prophecies pensionary scatterbrained imitations internalization reglazes rejector disentangled changers regauged restraightening festiveness winesops rejoin tintinnabulations" ; + rev:text "indictable deathtraps letches retrains forbears disperses traumatized tyrannosauruses antimonopolistic whizbang dipterous gaper rids ponderosa momism wallflower flaunting gallantly americanization exiting megaphone brasils nutmeat flensed mouldings barbarizing reverencing educations ombudsmen appallingly boozily mismatching polluters hipness recollecting captors distressingly ceiler receives figeater aphorizes toggery bipotentiality deplorableness sliverers cutdowns authoritarianism sweatboxes globularly screenings enrollers neoplasms chapping"@zh ; + bsbm:rating2 "1"^^xsd:integer ; + bsbm:rating3 "7"^^xsd:integer ; + bsbm:rating4 "6"^^xsd:integer ; + bsbm:reviewDate "2007-11-15T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-03-24"^^xsd:date . +dataFromRatingSite1:Review197 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product42 ; + rev:reviewer dataFromRatingSite1:Reviewer10 ; + dc:title "giddily outbuildings officiousness peases tangences hoplite martialists luckily oversupplied mascots onagers peyotl deleting semidependence smothery" ; + rev:text "alertness winked consolidations nutmeat adjudges bores draftiness pamphleteers zoned facie knowings kiddy assegais scoopfuls rowers midmosts foredid valencia intrust prodemocratic pretzel disencumber babbled gels torturous bibliographer topographers torsionally twaddlers moppet nosepiece misleadingly crumbled overheaped nonprejudicial arbalest treacherously moonie solubles trouncer metrifies viewier droopiness forejudgment hesitantly mathematically antifreeze wearable phylacteries schtick isometrical twopences lariats redistributed mechanoreceptor dowing micas explosives composedness resulting jargonized"@zh ; + bsbm:rating1 "4"^^xsd:integer ; + bsbm:rating2 "8"^^xsd:integer ; + bsbm:rating3 "8"^^xsd:integer ; + bsbm:rating4 "4"^^xsd:integer ; + bsbm:reviewDate "2007-11-24T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-02-14"^^xsd:date . +dataFromRatingSite1:Review198 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product58 ; + rev:reviewer dataFromRatingSite1:Reviewer10 ; + dc:title "kiefs ravelings bestrewed upswell xvi souses folkway sediments weekly rugbies seltzers infiltration segos" ; + rev:text "compaction convicts followup pisa haling inferable oversold penname forker majorettes precognitive distrustful variables bullion canalise knucklebones overachieve papain censing shocks jewed remotely stilbestrol solstitial prelimited readopts nubblier distilleries fuelers tablespoons cheesed dreaming coho reorient slushily jaundiced interfered snoozed crosswords highs umbellate unclogged ticking pavings tessellating moaning nonrepresentational exorcisers aimers occludes pitiers binned lengthiness renditions aureola stubbly scrabbler valuated quisling telegenic abated antitank watchfully brahminists heterosis pyrethrum subcommittee centerfold preappearances reassigns warehouses circumvented pads avg trotter spreader cooperativeness plenished caryatids lickers colluvium selectivity incitory unharnesses regulated peculators mooches radiological instiller notarization effluence weevils wiggeries sleeveless simulates sexisms reliquidate reproofs interlocutresses dorp columned sullenly saliencies nameless archduchesses fragments preparations corinthians censusing metastases blacklisted"@zh ; + bsbm:rating2 "1"^^xsd:integer ; + bsbm:rating3 "1"^^xsd:integer ; + bsbm:rating4 "7"^^xsd:integer ; + bsbm:reviewDate "2007-10-07T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2007-11-14"^^xsd:date . +dataFromRatingSite1:Review199 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product60 ; + rev:reviewer dataFromRatingSite1:Reviewer10 ; + dc:title "sluiceway noncoms accumulated deifications flagella luncheons vocalizer peremption balladic cunningly guzzler" ; + rev:text "radiologically aversions buttered disguises unvarnished trapper hance fellows unchanged scrubber portaged eld burgeoned garroting spalpeen weariless cassias stragglers emulatively compiling eucharists goaltenders nurseling animates perfumers gabbroic worshipped majorem invited jennies obliviousness mislabeling awaiters scathes belittles downshifts pericardial bachelorhood redeploys outdodged academicianship welterweights schoolbooks expostulations hepatic tolbutamide raveners handsomeness minutes dvorak betrayers cyphering livelihood shmoes stylate swimmings conformities bashed cadette shellac subdistinctions professes esthetics sleekest sundae iranians realizers crinkling frictions valved remake disarrangement despondencies chinked cloning muffles laundryman banged blackish aerialist disinterestedness skeets prophesies fencers reflexologies thumbprint turnhall sections studied leaver nickle coquets sunlights excellence squirms calumniates semitrailer underclothing ambulation diluting touchups entryway disputability tattered indow clippers hindered uniformest involuntarily britishers domiciliated telepathist deforesting assassinations brickiest snoozy duchies abreaction twelves weltings neoned contortion guavas tutelages oncograph luxuriates obstetrician galliards prophesied liter dustiest unpresentably blah discontinuation bravers catgut tribadism nomograms ejecta adolf apercu jennet hustings impairing oxidizing heartening calumniously perilled fervencies purgatively videotext amphibians reenacting royalisms teleports brainier nabob confetti succubuses cajaputs pastors defecated amniocentesis harshly prinking reabandon lexically organizes tutelary reverify legalizes"@zh ; + bsbm:rating1 "1"^^xsd:integer ; + bsbm:rating2 "2"^^xsd:integer ; + bsbm:reviewDate "2008-05-03T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-05"^^xsd:date . +dataFromRatingSite1:Review200 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product40 ; + rev:reviewer dataFromRatingSite1:Reviewer10 ; + dc:title "panhandlers clanks conditionalities envoi" ; + rev:text "gimmicked incestuousness godlessness seismal spideriest overmastered decadence bogeys parsed fungiform whimperingly wispier demobilization skag scourges giantesses squandered alliteratively diskettes overed ingrain assimilates inconsequent reenlistments feral saprophyte cyclizes maltreats preoccupying inflictive lodging serfdoms helios wanes geol microform dewatering reinvestigating latinized disburdened approachers juvenilities hotelmen loaches condemnation unplaiting ratters paragraphed miasmas disconcert plasters vinaigrette bunko sits peakiest commentators entitle shrived vulgarizer hawking glowering chiders churlish calamar chummed petrels restored whitecapping canadianisms festooned safeguarded solaria termination dreck abhor exercised amphibiousness mycotoxic wearers sauced valvar junctional clinged hearses horsewhipped septuplet orgiastical tyke reshape dashed keened cosigning gasifier recallable ramifies thieved eyedropper involutions mom dinghies revealingly deflagrate crunchiest nitros noised tartufe queueing consequences negotiations wineshop latchkey cheep scrumptiously worthiest gateways damosels noumena nonresistants liaises libidinization easterner woodsheds preadolescent gemmier empyreal traduce harebrained designator resourcefully anyways inclosed entering quired gravimeter enumerator refractured proctored cotans equestrienne eyrie shrieks aerophobia noncohesive ruralisms spermicide natantly wilding bostonians christies vealier baiter shutterbugs snorters hotels eructate soullessness expressed transoms shored illegalities playlet saxophonists climes canoed unpacked"@zh ; + bsbm:rating1 "4"^^xsd:integer ; + bsbm:rating2 "3"^^xsd:integer ; + bsbm:rating3 "5"^^xsd:integer ; + bsbm:reviewDate "2007-07-25T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2007-08-03"^^xsd:date . +dataFromRatingSite1:Review201 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product56 ; + rev:reviewer dataFromRatingSite1:Reviewer10 ; + dc:title "inditing preserver penetrates tarpaulins demounts lulls nonsporting unaging expressing maidenly immortalizes inserts lidar gladioli upturns" ; + rev:text "sociosexualities expecting axises racisms tricked teenybopper recently theobromine happens tubercular hematin petiole pervader idealistic sextette spars researching blatherskite transferrer blunge refuged reintrenched bumblings yanking operational kinds belabors sickrooms neutrality flosses mudsills poultices earlships stats arduousness acquirements waged holydays accents brainlessness shafting cavaliered bleedings demotics bafflers shapeliest sited decrowns punctualness wringed tzars bolstering stampers annoyances shadowboxes unmistaken foreignness surmounts hygienics thromboses furriest perfections nonspeaking overstating gladded saprophytic shaled deformative formalist bigger accrues mijnheers trueness underneath dewatering scrips diagnosticians songfests nanoseconds striates russian neaps lanker quitrents ganged fellatio alarmism poxing truncates mannerless chiders turboprops bounciest roomed embitter archivist grails capitalism sarsaparillas eardrops civilly habitualness condign lunk unsolvable perturbs dopers clowneries jugsful candied mahjong wisecracker fanning mod gradation flybys caviller matrixing autoimmunized ids malocclusions conservationism kennelling bursars contraceptives leaderless bruiter animas indivisibly betweens production folks cultivation ravelers sawing hairsprays orphans schussing squawker gangrenous satisfier iguana billowed zizzling biassed vowelized knowledged tsarevnas hexose segregates showgirl photographic transmitters volante rhizomes peritonea timbrel equalising argumentatively oxtongues residence upbraided nonfunctional bloaters happened bossed unsolders constructions seafloors rattier versant tinkerer alexia surchargers tooling ethical riper facetting stagecoaches voile malty constrainer blackguards tuffets instructing urinalyses watermen requirer looped chrisms creepie unconditionally deoxidization sorrowfully"@zh ; + bsbm:rating1 "4"^^xsd:integer ; + bsbm:rating2 "10"^^xsd:integer ; + bsbm:rating3 "2"^^xsd:integer ; + bsbm:rating4 "10"^^xsd:integer ; + bsbm:reviewDate "2008-03-23T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-04-06"^^xsd:date . +dataFromRatingSite1:Review202 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product87 ; + rev:reviewer dataFromRatingSite1:Reviewer10 ; + dc:title "denser cay mimeoed corsets" ; + rev:text "wen ratfinks piosity lacks nabbing scantlings slicing fatalness debunker peneplain virucide animating reshapes microclimate minikin abolitionist burials scenarists gladding goalie resorts disadvantages interpretational jacketing refuses misbiasing reinforces taboret grouper posthypnotic pals overemphasize sicknesses cellaret bagels prodded halogenous belaying deathblow tinkering jells embowers cozily palisading humbuggers elasticized cithern hushes supinely clasped silvas untidily stifler brazenness undetermined bellybutton pluribus hispano cheques gratae uttered tensibly"@zh ; + bsbm:rating1 "9"^^xsd:integer ; + bsbm:rating2 "4"^^xsd:integer ; + bsbm:rating3 "6"^^xsd:integer ; + bsbm:reviewDate "2008-05-31T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-19"^^xsd:date . +dataFromRatingSite1:Review203 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product50 ; + rev:reviewer dataFromRatingSite1:Reviewer10 ; + dc:title "revivalist domicil hasting reassertion unhonored emporiums hanumans redoubled humans recondense" ; + rev:text "graspers dropsies understudied disconsolateness enthrone preposterously statuesque barrelled consensuses speedways bricked appraisingly spooled piscicide courants referendums tertians intercalates signalling energized elevations exposers liveable hagrides housewifery intentions eeriness torturous subassociation misadded beached resonators slaggiest derailments sabers protestor popularizes discourses ergosterol parenticide chadarim ragtags intombing earthlier radios throating epochally concurrently redigests declining nitritoid scuffling poetess frustrated tentless flirtatiously physiopathological subitems mistrals stereotyping dextrins cutaneously sass wackily bedquilts strugglers kathartic shortness dotation vacillators abounding immunizations macadamize knocked dimmable endorsed efts disposes jacinths pushcarts sittings copydesks nocturnes sanctifies cauterize unsecluded foraged expiatory pacifies unaging clearinghouse uneatable professed cunt lutheranism sleeker fanaticize hematologist furnaces extinguised benefices grapevines functional disreputably paints vacationed starkest proboscis bufotoxin licencing colporteur indictees"@zh ; + bsbm:rating1 "2"^^xsd:integer ; + bsbm:rating2 "7"^^xsd:integer ; + bsbm:rating4 "9"^^xsd:integer ; + bsbm:reviewDate "2007-07-25T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-02-01"^^xsd:date . +dataFromRatingSite1:Review204 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product75 ; + rev:reviewer dataFromRatingSite1:Reviewer10 ; + dc:title "remelt pulsing weenies poisoner pains formalizer" ; + rev:text "expediences flightless interlibrary railroaders backdated hermaphrodism murders hamming circumstantiated focalised eloquently synergetic gallivanter duckboards permutationist howls veterans somersaults overindulgent pelfs assyrian floods beleaguers demotes smudging outages coalsack bosh outsell refortifies botticelli nosegay bettered apexes callosities valvelet direful hobgoblins wildlings fantasists strained sightlier tooting grievers medianly fomenting libyans shoshonean scups avitaminoses unconsolidated kickoffs breakfasts kindhearted recondense prorates"@zh ; + bsbm:rating1 "1"^^xsd:integer ; + bsbm:rating2 "5"^^xsd:integer ; + bsbm:rating3 "2"^^xsd:integer ; + bsbm:reviewDate "2008-05-12T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-28"^^xsd:date . +dataFromRatingSite1:Review205 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product50 ; + rev:reviewer dataFromRatingSite1:Reviewer10 ; + dc:title "widgeons redrafted ult clotures liquidly dognapped enshroud phenylketonuria burgeoning underproduction chiaroscuro unpacked astonishments chronologically crustily" ; + rev:text "hermit coutures shimmed delegalizing subseries diarist alienabilities proprioceptor batts fellness petitioner phonily rustiness gormandize scalelike rattler megohms dropping borschts bootlicks mincing stridor shoed goldeyes imputers bafflers retrievable facelifts clubbers satanist placidness overexcited philippic ethoses plumbing anatomizes upholder stripings sprints notarized loner pandas chemoreceptivity ushered anticoagulating communally barkier vowelized bedaubs sisals swagmen maintops chiseled kookiest elements clacked vitalist inured conceiting bullnoses reducibilities shrilling mousses kowtower galop zebecs bloodfins etruscans cobras straggliest renunciations stags borage sweatiest grippers breakthroughs fathered acreages plaguer cretinized amnestying avidly notables representatives quizzically depersonalizing micromanipulators compatriots descendance inhospitably unavailability tholes pacs dosing reeving mumm energizer doggerels proprietorial abominably bangtails bendy erythema lightish poising deceived preconcealment fluorites escarp tolerative meloplasties somnambulating reticule scantily sunless computerizes cosigns tailpipes readjustments odalisque razers traducer archers isogon rile caterer dominoes cornmeals demonstration phocomeli underdoes euchres incinerations catalyze dismortgaging racehorses payolas proletarianize ins revolter tektites doorways forecasters casuals iller argumentatively"@zh ; + bsbm:rating1 "3"^^xsd:integer ; + bsbm:rating2 "1"^^xsd:integer ; + bsbm:rating3 "3"^^xsd:integer ; + bsbm:rating4 "5"^^xsd:integer ; + bsbm:reviewDate "2007-08-09T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-02-18"^^xsd:date . +dataFromRatingSite1:Review206 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product46 ; + rev:reviewer dataFromRatingSite1:Reviewer10 ; + dc:title "endnote vitalism reattempted backed unevenness octagonally aphoristically restrengthen seabag innervating vicariate prolonging" ; + rev:text "glazers squelcher lurked scaler cyclopedia gambling veld nonprescriptive subtones fantasizing scandalously brayers escaping rejected bozo constructors bolero entrepreneurship gunfighters queened payable chare warners bases haloes anergy cardoons designees uncordial camphorated reformulation ruttily beleaguering speiled dunner garlicky prioress steamrollered pontoons radiance clangored minstrels accusativeness thunderclaps vasodilation dupable interterritorial cl unwitted expediter clandestinity skeptically analects shiftable sallier oinked unhanded warrantors hermeneutically misguide backbite surreys slimier bilgy spying jazzier centralists alt ungainlier possessives antiqued belatedly silkscreens spectroscopists snubber unpitied chested tunefulness resp homoerotic skating utopists"@zh ; + bsbm:rating1 "6"^^xsd:integer ; + bsbm:rating3 "6"^^xsd:integer ; + bsbm:rating4 "2"^^xsd:integer ; + bsbm:reviewDate "2007-11-24T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-17"^^xsd:date . +dataFromRatingSite1:Reviewer11 + rdf:type foaf:Person ; + foaf:name "Fona-Ivanova" ; + foaf:mbox_sha1sum "5ac0708075b562f09047d8f9e8a98f8127ba7f30" ; + bsbm:country ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-08-13"^^xsd:date . +dataFromRatingSite1:Review207 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product19 ; + rev:reviewer dataFromRatingSite1:Reviewer11 ; + dc:title "slithered permeation embar antipastos stripteasers crisper republics nomography paratroops somalia statuted tipples" ; + rev:text "decompensation spineless wantoned superannuation classifier otters guttier curtsying possibility flimsier overindustrializes denouncement overspent disinheriting precondemning monicker softballs disenfranchised broadest harassments sauntering trainer dishtowel delinquents fornicate unnegotiable roughnecks baritones vocabularies reenacting blunges hears tripart sobbers schoolmasters pinstripe disruptiveness carminative lanciers clans briniest reconnected preaccepted enslaving dempster fetlocks unauspicious victualing hypertrophied favorers reinfusion churchgoers paternosters stingiest immortalizing coherently closeouts ennoblement staggy unbigoted xiphoids advisories linter embryoid lairdly lucres simpler arizonians serins salesmanship gemologist conformities tacticians epitomizes lordlier ruffs impenitence taximen overreact atherosclerotic cunningest reemployment prelims etherize splenectomies lucidly sheening killdees misogynists indistinctly disfiguring hypothesize crestfallenly noways flycatchers farted physiologic sickbays potboy xeroxed drizzles plates yugoslavians heisted unscientifically discontentments prizefights pegs clop keyholes counterespionage nuttiest supersession monkeyshines iroquoians toxicant carwashes germanies prorated scars relinquishments defences variance worldbeaters jiff campagne decaffeinated prolixly avowing lindy khalifa basketful unsilenced petrolatum pawner cockfights winterer stretchy vagrance omicrons puppies masculinizing decks overinsure spaceward benes nitrocellulosic cheeseburgers nonreligious littlest collies drecks sprinkler reclines timberline scantiest tenuously foresaw abundances haruspex workaholic reasoning fetor auld blinder borderlines rattlebrained younkers slyness paroles unmeaning wiredraw waterily dehydrogenate punts decapods administering decasyllables rockworks poring parcels slurring communiques fledges apiary"@en ; + bsbm:rating1 "3"^^xsd:integer ; + bsbm:rating3 "6"^^xsd:integer ; + bsbm:rating4 "8"^^xsd:integer ; + bsbm:reviewDate "2008-04-14T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-03"^^xsd:date . +dataFromRatingSite1:Review208 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product65 ; + rev:reviewer dataFromRatingSite1:Reviewer11 ; + dc:title "shaggily chronologically comperes stuffily retell" ; + rev:text "unrounding ludicrousness recoinage mandating disembowels dishonest overinvests chalkiness photocatalyst jellybean conniption epidermization contentional specificizing barographs shirting shelterless tonnish layaways restiveness circadian atomised reconsiders varment obstetrics filagrees riots photographed balmiest consumers anonyms wallower issued mesopotamian stations bighearted handshaking annotative adornment formated rishis represent seepier furor parkas chalcopyrite barrister menus behaviorist chemically nationalized dimmest crosiers evolvement vivre micromillimeter sideswipers arointing malefactress overexercises shrining toyos deviational ampoules sukiyakis tanner hawkers aluminic"@en ; + bsbm:rating1 "9"^^xsd:integer ; + bsbm:rating2 "5"^^xsd:integer ; + bsbm:rating3 "7"^^xsd:integer ; + bsbm:reviewDate "2008-06-01T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-13"^^xsd:date . +dataFromRatingSite1:Review209 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product16 ; + rev:reviewer dataFromRatingSite1:Reviewer11 ; + dc:title "reforming phalanges warworks safeguarded eyewash shamefully dilatorily unrecorded spectrochemical" ; + rev:text "fadedly winded finally darky lockboxes adorability campiest heliports teratosis lentando caravans nonradical moralizers aluminizes beans cuttlefishes tootled idly overpopulation streamers distantly bedouin effecters jawbreaker haft abnegators scotching impings pupated mechanistic defensively naturopathic periodontology rivulets thriven imprinters bolled pyres racism messianic jauntiness eskimos logorrhea inequities forsworn drudges shylocked unexpectedness milfoil frescos haws computability ownerships fripperies deifies knotholes earwaxes vexedly peregrinate pearls zooms vidkid jinnee spuing brigandage dishrags torsoes rehired inweaving ascribing marxist volatilization loudmouth logia lifelines drugmaker quackster handshaking facially overpass kremlinologists rawhided indestructibleness flatulently incommodious alnicoes headgear progenitive braises windages hussy trippings predeterminations antisepticize rewinds tinmen correspondences nuncio packers crouches snowplowed crimper decimalized sneakiness tiercels investable ling longshot darnedest inestimably crossbows semplice burse conjunctivas cloudlets kudzus friendless gappier unpremeditated whits excommunicates reinviting creaking ojibwas subaverage fledging rearing jettying criticizable cackles dives embroideries scriptures conduced channelizes muskmelons chanting regulated pipits receptively hinted copulas packmen bulbul microanalytical sisters nascences pinkings wonderlands beggared applicably"@en ; + bsbm:rating1 "7"^^xsd:integer ; + bsbm:rating3 "7"^^xsd:integer ; + bsbm:reviewDate "2007-09-03T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2007-12-26"^^xsd:date . +dataFromRatingSite1:Review210 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product85 ; + rev:reviewer dataFromRatingSite1:Reviewer11 ; + dc:title "fullfil ruler pikestaff christening schismatize redistilling motets" ; + rev:text "snobs embolization cardiograms cansful somniloquist generalizer japanize ecumenical unnegotiable kindergartens curtails imperceptibleness frostier inkhorn disenfranchisements counselors humuses filtrating spaniards nattily disjoined idyllists voyeurs wrigglers overmagnification champions humoured abatement revives streetwalker foxing wickyup cheyennes demerits brats overnight cobblers amused redetermine espresso predilection metamer overruled vizarded grebes returnability lulled embassadress penumbras extortion repiners abortion expeller absorbency postbag parked ultimas cosmopolises uprisen tunefulness elflocks ahorse pistoling sumptuously regales badging typed quibbler unassumingly achenes roughhewing victorianism tipsiness portrayed stopped dystopia scatological owlish rankest fluidize weakfishes buggers tinhorn patchier fax collies sibylic anonymously enmeshing tempore unliquidated minced kickup evisceration assessments frugalities preponderates dampers weaselly impracticability originating recreance"@en ; + bsbm:rating1 "1"^^xsd:integer ; + bsbm:rating3 "9"^^xsd:integer ; + bsbm:rating4 "3"^^xsd:integer ; + bsbm:reviewDate "2007-08-31T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-20"^^xsd:date . +dataFromRatingSite1:Review211 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product24 ; + rev:reviewer dataFromRatingSite1:Reviewer11 ; + dc:title "sinhalese gaping output foamily boney predicted aunthoods bathers candidatures demilitarized benzoins corrodibility titrates corollas" ; + rev:text "beamily everest subserving layers compressibility artilleryman vastest causewayed lazaretto milfoil cannibalistic gauges synchronizing unrequitable conversions trinitarians scrabbly anonyms underfoot palmettes repellents aeronautically cyphered cratering puffers swellest poleax tuned cotan etymologies singled tremendously loincloths kerchieves ingle chatted cooler consorts chums messier drawlier vees gat tarter chaoticness hoorahs absorbability undistributed kyrie eclectics cheerio ridding herbaceous cosmists hempseeds indecisiveness mestizas fuck shrubbier identifers mountainsides"@en ; + bsbm:rating1 "10"^^xsd:integer ; + bsbm:rating2 "10"^^xsd:integer ; + bsbm:rating3 "8"^^xsd:integer ; + bsbm:rating4 "8"^^xsd:integer ; + bsbm:reviewDate "2008-02-09T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-02-19"^^xsd:date . +dataFromRatingSite1:Review212 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product27 ; + rev:reviewer dataFromRatingSite1:Reviewer11 ; + dc:title "berceuses bided travellable noonday seamers outskirts bloodworm undersexed" ; + rev:text "weirds swappers cased stairways ecoles seaplanes stanchers curtailed scherzos intergalactic epithets cassaba stinkbugs vulcanizers ordinands viewfinder metacarpus incremental unliveries snakes ores backbit marblings meteors perihelia unsought petits swirled insurrectionaries filleted stethoscopically millivolts refire loyalism lanai electrocution libelist scatter memsahibs inbuilt ensurer disdains taels resolvers monadisms repaving waistbands undestroyed boosters paralytical peas fishtail lancets fleshiness discharging decompressed peninsulas barbershops launches hirsuteness redirected judgement argils maxicoats museums whitener grounded pimping grubworm grippes interdenominational decidual alphorns anomies squallier refocusing plaining avers behests swabbie ravioli interment dropkicks embossers rodeos skyscraping gives alleviations electrologists implodes struggler retailors dews bodyguards smudgily retinals sandpits overrates disfavored unbowed aqualung jewellers whizzers egoism disemploying preceded transitions mime befoulier yules aristocrats chapeaux hyssop unestablished mohawks czechoslovaks priming offcast microprocessor exercised regears purifiers grained inpatients outwear homesteaders deadfall intwists avenges isometries stumping unburned bilateralistic exploitable flowerets hullo contradictive armbands internees shadiness bicyclic fleches interrogee phalluses cariole proselytize"@en ; + bsbm:rating1 "5"^^xsd:integer ; + bsbm:rating2 "7"^^xsd:integer ; + bsbm:rating4 "8"^^xsd:integer ; + bsbm:reviewDate "2007-12-10T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-19"^^xsd:date . +dataFromRatingSite1:Review213 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product62 ; + rev:reviewer dataFromRatingSite1:Reviewer11 ; + dc:title "slumming embarrassed japanning faunally addax bungling montanans swarthiest imperceptiveness foldouts frogeyes deigned medusoids" ; + rev:text "recordership magnitudes selfishly quads dragsters appointively cogitating nonhomogeneous bencher rejectable mucks museums crozier naif kestrels befuddlements pedagogical wantonly insalubrities blueings logroll misbelief glutei refractoriness predicative abomination infighter ransacking bootjack gnashing banquettes volleying plodded conciser swooshed statuting flecked disordering waggled wirepuller realistic daughters jeopardizes gallanting preheat ascetics touchier fetlock embryologic homilies whelms willets costumier muscularities recommencement penetrators ungodly arbitrates luminously integrator rumples jauntily gastrolavage oysterers abstentions romanize blouson reintroducing scrambles nights infuriates smacking bedchair tantalized brickyard reviver menials managed fanlight apostrophize bwanas redemonstrated firers substantiation devitalize intombs presided purgatives bumpkins emotionalist frolicking skylab pretzel deluges enunciators pastelists sprinted capsizing bedrolls gouramis stoppered reprimanded galvanometers elections waxworks allheal craziest sunroof histamines woefuller duckweed composted combo"@en ; + bsbm:rating1 "6"^^xsd:integer ; + bsbm:rating2 "1"^^xsd:integer ; + bsbm:reviewDate "2007-11-29T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2007-12-31"^^xsd:date . +dataFromRatingSite1:Review214 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product53 ; + rev:reviewer dataFromRatingSite1:Reviewer11 ; + dc:title "giver donation blossomed genealogists raucously calligraphic joins cots" ; + rev:text "feeblest medicares snakiest drudges horribles chemicals satiation shaman ricotta criticize obnoxiousness intermediatory wingbacks consignment bogymen unfeeling gentler shooflies scrupulously antechambers pluralizes gizmos reinstruct semiautomatic jews regretfulness incompetency pharaohs dispatch chirping hydrators hawkshaws vulgarian weaseled monasteries muscovites souchong officiation quipu soundness terrane seamless canalise planktonic freshening lustiness lecherously pulsator defiantly motorized memorializing scape petits poteens carpetbag oscule comfortable affirmations reaccustoms moonless impatiently recouping register prepack stampers milliliters xx quadraphonic grandiosity truculency metaphysical addles commixing dragomans hotels extroverted douche concusses bespreading loutishness humanities gallflies paynim dippy masonries frogeye aspirations discos binder entendres permissable shedable mesmerizer urbanologist cloggy draftable plucks unwoven photostated macadamized purebreds stroked arrestors clustering swob praising mamies sepulchering ordering aroint popper basils hypothermia tackily restitutive economize breathlessness recopied graphological fists consanguinity haring embowering floggers goggles pseudoscientific matures piranhas noncontributing neurosurgery expedience redly unlocked cookers uninfluenced fryers antineutron rakes reinoculations stereotape calculatedly flywheels homeliest requiting piffling requirements subdialect obfuscable eviscerate egoist eurodollar torrider"@en ; + bsbm:rating2 "2"^^xsd:integer ; + bsbm:rating3 "5"^^xsd:integer ; + bsbm:reviewDate "2007-10-18T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-11"^^xsd:date . +dataFromRatingSite1:Review215 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product25 ; + rev:reviewer dataFromRatingSite1:Reviewer11 ; + dc:title "giggling hurtful mishap dashers uncontrite jugged intermediateness vats remigrates ringbolt" ; + rev:text "worthies hourglasses hardstands canceler spermicidal hatful marshlands curding walling decrees sunburst purchaseable directive plumped swanned outed stockpiling tarmacs rethreads madness ciders unjustifiably bodkins internally displacement utopias geosynchronous provinciality artiness peeps hawker sensitize nomisms volatility dreariness foxing curtained arranger mitigative opossums remarkableness woolliest troweler impugned obsoleteness scrambler assemblies orbitally sorbitol conjugally remanufacturing looking opining declaring"@en ; + bsbm:rating1 "7"^^xsd:integer ; + bsbm:rating2 "6"^^xsd:integer ; + bsbm:reviewDate "2007-08-26T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2007-09-02"^^xsd:date . +dataFromRatingSite1:Review216 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product61 ; + rev:reviewer dataFromRatingSite1:Reviewer11 ; + dc:title "intercessor bogyism jolting bluebell snowbirds demagogies blazoners" ; + rev:text "reinflaming multiplexed neckerchiefs boxcars certifier glazers creeks overtax fuzing metacarpal novelize concerted evenest jumping escalating satiny kryolites recoined facias bobs pitchmen jurymen limbers dearths goofing nautically randomizes tragedienne croquettes gibbosity equinely schizophrenics combes ghastliest bandwidths denuding verily quotational cetology mistranslating yearners slowing thrusted domesticated defying affectedness oxygenous bearable emasculating actually slaughters actin motility firming incredibilities opprobriated spawns peculator foggily kibbling hights improvisors"@en ; + bsbm:rating2 "5"^^xsd:integer ; + bsbm:rating4 "1"^^xsd:integer ; + bsbm:reviewDate "2008-06-09T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-10"^^xsd:date . +dataFromRatingSite1:Review217 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product10 ; + rev:reviewer dataFromRatingSite1:Reviewer11 ; + dc:title "trimly mimeo misdeed clumsiness skylarks midnights rhumbaing hydrographers temperatures episcopates" ; + rev:text "repressibilities interjecting authenticated whirling perishableness verbalization nuns amanuenses rebounds groveler punner gratification borings chopstick sententiously flannels usages raves pensions piratic testators alarmingly collator detesters regards fiberizing padres reprobes calabashes dickeys rescinder designedly sequents encomiums destinations bros scuffler basils empathizes oblongish citatory decigrams boogies outtakes chattiness aeronautical stied nonidentity skydove restructure entryway blowbys precognitive skulduggery slumping defiers genuflecting dashing bally unusual dandified mimetically shirr hyperglycemic audiophiles abbreviators raps polyethylene bulkiest tinseling reincarnate aquaplaned underhand oceanologists swallowing archest spotless commanding"@en ; + bsbm:rating3 "1"^^xsd:integer ; + bsbm:rating4 "2"^^xsd:integer ; + bsbm:reviewDate "2007-09-06T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-17"^^xsd:date . +dataFromRatingSite1:Review218 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product64 ; + rev:reviewer dataFromRatingSite1:Reviewer11 ; + dc:title "alieners waterspout nuttily transorbital torches overcooks" ; + rev:text "sullenest stressor poetizers sanitarian unsanitary chitchats swithers pasturage hoarseness outings reinfuse vetoers roper docents concentrating flinted grunions rustler vampish abatements tussock thro nothingness biparental gifted zairians dashier sutured seabag unenvious hybridizes splenectomy polonaises louses matchless perpetrator streakers hencoops knothole qoph unconstricted herbal coign hibernates lubrications pitcher crucifies renegading ultramicroscope yugoslavs fissioning candescence uninvolved reformulate adduceable fellatrixes bouncers instrumented quipu hauteurs flitch effacers capacitating outcast budging unadvised overenthusiastically jigged gorger adjudged supplicant squealer pollinating jambed agitating lorn numerably eminently resells numerologist tonalities sulfas exigency milkweeds medals ay"@en ; + bsbm:rating2 "8"^^xsd:integer ; + bsbm:rating3 "4"^^xsd:integer ; + bsbm:reviewDate "2007-12-16T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-30"^^xsd:date . +dataFromRatingSite1:Review219 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product52 ; + rev:reviewer dataFromRatingSite1:Reviewer11 ; + dc:title "craped danegelds avatar microanalysis biomasses discontentedness" ; + rev:text "paperweights unoffending austereness deescalate crossways bloodthirstily rifler reconciliatory underachievers acclaiming subsides dyspepsia baseboards lamaism classically endamages reassign equational tripled circumambulation minimizer readjustment gridirons choreographers objectionability odorized confreres apertures outpour contexts ironed didos clotting swanskins accouters brail evolving ragtime caftan wackiness unsaturates burnable elucidated nonlife rifted glottides absorbers breathlessly rewarm softs switched unnerving highs physiologies insurrectionally lamping simoniac yokemate incompetence counterfeiters chevaliers overcareful dewberries whined percussional scuttler continuable accompanies obbligati nourished upwardly parallels hijacked smelteries laxness cooch brassish soapwort erogenous pac defeats cognitional mainlines inconclusiveness nominators outright leukaemia lexicographical slopworks fireplug anchoress collocate chaoticness wheelers yearlong tartare frizzliest nonprofit dbms healed amputating vats princes eminency blades taped kedge fatality iscose demonstrational hermitage sixtes calibres donates"@en ; + bsbm:rating1 "8"^^xsd:integer ; + bsbm:reviewDate "2008-04-23T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-16"^^xsd:date . +dataFromRatingSite1:Review220 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product72 ; + rev:reviewer dataFromRatingSite1:Reviewer11 ; + dc:title "spacing underachieved jeopardies tingly homiletics mortars etnas" ; + rev:text "shower glutamates migs conjunctives unfeminine colonies anopia roams poleward misbehaving poiser waning cavalrymen requirements weaponing bloodsuckers ensuant rehear longboat degreases kickiest chromite fatuus unapproachable glorying squids laced readies sifted debated washwomen homerooms arguer vaccinated almightiness enunciates monomers unpreserved smokepot calvinistic spears imitator defeatism tartrated monorails concocted cerebrum instatement landscaper lapses glucoses racers preaffirmation grotesqueness flatfishes decimates thrusts squooshed snood kreuzers hiccuped blither compendiums flyby supplicant attempter softheads bibber fucking iodizes covering adenoidal profferers meloplasties lyres loser nutritionist whiting viperish acidulates impulsions inalterableness expedites copies upstages typesets reexamination hydros clubbers misarranges imam int"@en ; + bsbm:rating2 "10"^^xsd:integer ; + bsbm:rating3 "6"^^xsd:integer ; + bsbm:rating4 "6"^^xsd:integer ; + bsbm:reviewDate "2008-04-13T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-04-28"^^xsd:date . +dataFromRatingSite1:Review221 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product67 ; + rev:reviewer dataFromRatingSite1:Reviewer11 ; + dc:title "reconstituted warrantor eolian clearable antipyretic querulously eventuations nationalize" ; + rev:text "hinterlands iodize worldbeater shareowner quarterstaves degaussed knobs unaddressed ungulates parameters fireboxes slowing similarity phiz aslant currently slatier beaucoup perceives presenters waistband madcaps optionals chiaroscuros woolsack glutting foins colorings internist sawyers lustring snottily maulers snacking kinks ceremonialists chewable tastefully disparities earmarked snagged surnamer immersions enfolded worldling distractibility fidgetiness disbelievers nonresidual ladyish softwares asseverations unrobing unwitted crossbeams vinculum cafeterias apostrophes condyle fertilizations americas brewing fomentation forseeable licitation paramours medievalist elegiacs legmen anthropocentric wobegone adroitest crooned hatfuls resorts presells loggier uninstructed outfits brambles panderers romanticists voter reattempting bustles incrimination laywoman wabbles dislodge thiabendazole beekeeping wafers bleariest lobbyism mottos mallows brownouts professes faultfinders herefords subsidizing badgering embryogenic broadcloth travestying hindustan melting git rousing aweather inauguration chuffing discolored mealies pepperer shearers kneecappings deoxygenated prospected damson multilingual tallowy rebuked incumbered shortages cardinally lawfulness hedgehopper phoniest embraces bucking combaters adulterant premeditatedly pitches alcoholometer quarrelled inspirits tripodal arrayer promotions seconded wonky partnerships ruinates tetanizes nonman reenter warders grips fluorinates anisic trinitrotoluene enfin marksmanship objurgates"@en ; + bsbm:rating3 "4"^^xsd:integer ; + bsbm:reviewDate "2008-04-20T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-19"^^xsd:date . +dataFromRatingSite1:Review222 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product63 ; + rev:reviewer dataFromRatingSite1:Reviewer11 ; + dc:title "quintuplicating mistrusted slenderly kummels aweless" ; + rev:text "flavored pyrostats moorland predestined abundances wrests telexed yowling matureness nonstriking milieus blastier brashest bewrayed furzes bailout jabs situating fistulous bullion redivide encored elasticized reposer semantical typhons deflections subscripted suffragan shading waded tuppences gladiolas anticancer narco nostrums fluoroscopists eurodollar hoarfrosts banquettes swaging formatters uproariously googlies guars baptizing bussed leasings modules tsking repressor crossbreeding drifter tantalizer taxidermists dispels darker sleepily guaranteed buzzards trusteeing fretting intercessional ungraciously hogweed initiations bibbs pixyish condescendingly adherence agonizingly jollifications braced iridectomies maladjusted stagers apartment yeastier protist steadily utilizer microphotographed curacy bouffants amalgamated slayer mopes spoiled wrastle cardiacs shinnies cockup outlay eructating counterclassification overattached compulsives bumblebees corselets subsections studding negotiatrix oxides prostration cakewalked stocker paxes antinucleons theologies botchier sacrovertebral meriting biyearly concordance parallaxes marinas annihilates pyrethrum vocably meteorism excellently betels rawish sobs taunter designates inverting spirant disrespectable karat uglify sedations misdoers cronies redistribute plundering garrulity prefacing sibilated lichis duns everlastingly exploits banknotes ejectors stubbornly"@en ; + bsbm:rating1 "9"^^xsd:integer ; + bsbm:rating2 "5"^^xsd:integer ; + bsbm:rating4 "9"^^xsd:integer ; + bsbm:reviewDate "2008-02-04T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-04-22"^^xsd:date . +dataFromRatingSite1:Review223 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product71 ; + rev:reviewer dataFromRatingSite1:Reviewer11 ; + dc:title "barred fizzes esp histories metamers buckram overdressed silverfishes ringtail assuagable amids pantomimed" ; + rev:text "hogback solemnly tons expensing effeminacy embroiling sandalled tidemark kirsches patchable fieldleft nettly hookies runnels medievalists intents unresigned denouncers circumambulating yawped homes disqualified trifles meathead kookie congaed fearing soughed shrines equality elaboration decanter gamuts lockable disclamatory tuesdays refolded overfed hawkbill scenes ridings spectrometry deficiency seasonably billionths nettling cowling lumina milieus hexaploid rationalities heptad derangement deisms elks coughing sennas conductances prechilling sniffs caching overexerts pistil assessments chefs sudor belligerence repudiator zitherists unnatural callowest contemns troubles freezers misquote halftime asphyxiator disuniter antiknocks franchisers pickax"@en ; + bsbm:rating4 "1"^^xsd:integer ; + bsbm:reviewDate "2008-06-15T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-18"^^xsd:date . +dataFromRatingSite1:Review224 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product59 ; + rev:reviewer dataFromRatingSite1:Reviewer11 ; + dc:title "maxi scarped sleeved fulfils disseminates chambermaids" ; + rev:text "colorants tongers cheateries transplanters drizzled abubble wraths seism safeguarding sewages terms diallers mountebanks candids attainableness staring underpass phasing regimental mucking perfidiously mudcapping brows mythological sheered eroding pubescence myriapods witnesser overissues bleachs smolders sourness katharsis dressings reproductions glycosides floundered undone gamey upturns quagmiry troweler chagrins attains likeliest pigmented shoetrees behoove invades earthier infuriating selfishness gladdened radiantly reproaches amniote bastardization narcos hunches consulter alienating classifier calorimeters quested relines besmirching testings reconquering disrespectful cluttered burgesses aitches raving staminal unassuming mutagenic ecclesiastes parasitical sodom vigilantness falconet hyposensitizing unwearable transliterating dysfunction preexists whatnots dashpots claustrophobe frighteningly matrilinear muzzlers nasality unterminated bulling deuteronomy physiognomies unoccupied administrators suspectedly clovers doms talesman ports vignettes guzzlers fables ensuant"@en ; + bsbm:rating1 "6"^^xsd:integer ; + bsbm:rating2 "6"^^xsd:integer ; + bsbm:rating3 "4"^^xsd:integer ; + bsbm:rating4 "9"^^xsd:integer ; + bsbm:reviewDate "2008-03-05T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-04-24"^^xsd:date . +dataFromRatingSite1:Reviewer12 + rdf:type foaf:Person ; + foaf:name "Hachiro-Albanwr" ; + foaf:mbox_sha1sum "248e8e3b4c9c9826dacc20891fb9c96273bf89" ; + bsbm:country ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-08-08"^^xsd:date . +dataFromRatingSite1:Review225 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product27 ; + rev:reviewer dataFromRatingSite1:Reviewer12 ; + dc:title "inexecution southing episcopacies shoeblack cognomen statist backcross lofter nappie gunnels pinks" ; + rev:text "ultimacies machinist peakish birettas xiv troweler texturing interpretable spiff voyageur unaligned provocateurs inseminating trenches queans pima octuplets unwelded enlisting nickering desecrator proctoscopes raveled assignees happenings sunbathe autodialer hermaphrodites predicting blazoned astrologer birrettas reprocess gradients chocolates incontinence moralism detracted queasier boatbill perishables unquietest metalizing midyears hoagies uninspired tantalizing saharan gauged purities masterfully invertase woozy snaffles designer honeymooners wiggled pipits softener freewill insanitary closures bulletproofs pinecones plasterwork phoneticians hepcats agency trilobate arrowing alimonies unclehood queerest buffeted laboringly unsoundest nonclassical infatuation allotypically reglazed heptads canes plenteous renegotiator scrupulousness commonly pandits heavyhearted zoeas starriest stewing steamiest zoysia"@de ; + bsbm:rating1 "7"^^xsd:integer ; + bsbm:rating2 "7"^^xsd:integer ; + bsbm:rating4 "9"^^xsd:integer ; + bsbm:reviewDate "2008-04-26T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-19"^^xsd:date . +dataFromRatingSite1:Review226 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product89 ; + rev:reviewer dataFromRatingSite1:Reviewer12 ; + dc:title "marbly cubans gaga griddles bundles" ; + rev:text "conversationalist handwrites seignory suitably abhors unfeeling ganev squabby stoney egotistically lugs ambivalence quaggas overlades raggedy prams screws prostatectomies neediness worriers autarchies brattier irrecoverably frappe repairers torridest ionization singers contradictive dripper eulogizes dispose metatheses electrotheraputical marvelously extraterrestrials necrophilous valuableness solubilization calved zincy inactively boatsman patriarchates steepening elative stogeys dollishly shunners demons oddest georgian elastomers clawed portraitists prying biogeographical alloying discombobulation assegais misfeasance swinger himalayan spellings hucksters deprecative incarcerated gobs maxilla nauseated permeates radios dildo misprint lingually pelters hinnies duodenum ambisexualities supernational baronage vised tocsin consciously nigher gnarly clamors entrusting rheumatoid curatorship rubber broodier copiously twittering commandos onondagas lyrate mishandles unsuspicious reordered contuses zooid sinuated unbearable bondmaid inguinal regressor moodiest ramparting punctured doubleheaders interests boatloads straights tictocs lieutenancy jackscrews chroniclers cannibalistic skyscrapers semicircles"@de ; + bsbm:rating1 "10"^^xsd:integer ; + bsbm:rating3 "2"^^xsd:integer ; + bsbm:rating4 "3"^^xsd:integer ; + bsbm:reviewDate "2008-02-13T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-03-21"^^xsd:date . +dataFromRatingSite1:Review227 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product86 ; + rev:reviewer dataFromRatingSite1:Reviewer12 ; + dc:title "degummed gonadic tracheotomize tm abased battered translates sarees legacies gypsying" ; + rev:text "contraindications jell inhaled dissertations ladanum retaking shoved arguments cravers subserviency besieges rigidify aoudad unforbidden greenstick breaching sisterly oxymoron yolky sybaritic oscillometer charcoals noncoms defecated aimed ascribes multilineal chancing sphinges depressibility ageism samoans obtains sinicized propagated capsizing publishing inditing frier botanical tangelo forjudger snoozy inarticulateness ameba straitjacket mezquit standees ogled trendier kicker burlesqued marinaras beetles torsoes hypochondriacs lambkin oblations fiefs proletariate maidenhead drowsiest monsignor antiphony versifiers farmsteads axman decidable cadmiums givens boused occasional poetasters fagot alcoved miriness intertwine ultrafiche isling concelebrating tippler kicked hempier exclusively hews confidence measures temples outcried accouter rehem kenneled booties supervisorial rayed dishrag dogcatcher semisacred subkingdoms"@de ; + bsbm:rating1 "1"^^xsd:integer ; + bsbm:rating2 "4"^^xsd:integer ; + bsbm:rating3 "8"^^xsd:integer ; + bsbm:rating4 "8"^^xsd:integer ; + bsbm:reviewDate "2008-05-18T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-14"^^xsd:date . +dataFromRatingSite1:Review228 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product4 ; + rev:reviewer dataFromRatingSite1:Reviewer12 ; + dc:title "consistory certainness judicially garnish pockmarked swisher bums molded" ; + rev:text "begrimes upcountry gager gobos gravamen oxidants escapeway quieten identifier ryas squawks yugoslavs disdaining sequences moated superficialities preconcealed napalming oswego cueing concussively rabidities rancour ticker shaving tm desiccation overgrows newsies inflaters outwearing obliquities echinodermata windable appealingly overrunning aha unrehearsed delimits equivocations unpatentable dehydrogenating veterinarians collegia lifetimes sunbathed naugahyde swampland reconcilably dayflies connotations humbugs brahmin smoothing prestiges scorcher alzheimer uniformness racking bartends meatiest dissuades gastric jacks doltishly orlon misaim globalize blatancy gaffing halftone dearness gutty instances housekeeper undemonstrative cembali ensnarement epidemics praetor organically hostilities noted joyfuller outpatients basking fusee unsymmetrical tzaritzas mustier gaudily hallucinosis incarnating nonsalable corrected flamingoes carrell unvanquished noes inferrer overcompensations congesting crotched ramparts indicates tyrannizing impecuniousness mussiest equivocally spectrometry bints cline outworn spattering audited tercentenaries expectable ranklingly gesticulates figging wholeness cambium unhappiest recruiting striae scurfs truckman intermixing bonefishes ennobling diabetics overprints playgoer degeneration seeking submersibles regurgitative dehypnotizing fattener uneven slashed jumpier godsends budger aces buckskins ergs soybeans overambitious bests seismologist abbotship hirer leader refinishes slobber flatness dimples advocacies misfeasors jiggling disuses daylilies expander trues macron ensign loopholing erringly knickerbockers oats letter receptionist pomps interreligious beaucoup besoms curability overflies precalculations dihedrals hooraying pryingly positioned combustibly disputably soapstones"@de ; + bsbm:rating1 "3"^^xsd:integer ; + bsbm:rating2 "10"^^xsd:integer ; + bsbm:rating3 "7"^^xsd:integer ; + bsbm:rating4 "9"^^xsd:integer ; + bsbm:reviewDate "2007-08-05T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-04-20"^^xsd:date . +dataFromRatingSite1:Review229 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product70 ; + rev:reviewer dataFromRatingSite1:Reviewer12 ; + dc:title "psalmists hooknose rowdyish nepotist pedantically sideswipes guiles unsparingly disconcerting domineering yorkers plutons recalculate cartilages" ; + rev:text "lockers gibs sinlessly sufficiently inconsequentially subindexes sarees libelant truckles waddy multifamily ornamentations aligners wigwagging leady fatness unburdened rigatoni anatomies deutschland waltzed bedlamp barrenest hardstands statists bandies weatherwise henpecked coffeehouses ovulatory indestructibleness sprees determinability hydrators reimposes buskin unedible surplusage culling rearranging impermanently pillion obligee chuckholes radarscope czaritzas burglarious husbanding ignominies conking topographically ameliorates denounces reshuffle injected enunciation flouncing benzoins protectionism ferrites rubella skulker scarier flashers twelvemonths woenesses stethoscopically mountebanks phonemically frets sorrowfully antiwar doltishly protraction controllability legislatrices hippiedom distributution inhibitors neurotically demolitionist hatefulness riveting yawps jamb cupolaed ambidexterity trashier morphos humps abeyancy chanceries firesides locoweeds moues headaches wheeling evaluating catchers scooter openwork gaols iambuses regicide pharynges rattrap scummers milked copse valorously unicycle reaps poetizing meseemed aigrets octuples enfranchise gibbed banterer anteed gunpapers duelled lassies moderately waistcoats republish gaping ounces berthed snowcap troutier nakedness fellies dowdy tarpapers dirndl manhandled orientates gonadectomy unplumbed periwig incivilities shirr noninflammatory galatians presifted lemons individualities bossily ashless handholds braked skiffs maimedness overrighteousness duplications milkmaid mantra republishing laryngotracheal kidding swerver muskrats savvied preaccepted resurgences blesses advertisement begrudges varistors reaccredit ambulates lightships newest unfaltering asserted nickle steelyards"@de ; + bsbm:rating1 "6"^^xsd:integer ; + bsbm:rating2 "9"^^xsd:integer ; + bsbm:rating3 "8"^^xsd:integer ; + bsbm:rating4 "10"^^xsd:integer ; + bsbm:reviewDate "2007-11-18T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-02-27"^^xsd:date . +dataFromRatingSite1:Review230 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product31 ; + rev:reviewer dataFromRatingSite1:Reviewer12 ; + dc:title "sexpot acacia cajun nosepiece fluted rewinds lingula imbalming stingos ramshorn vials slimmer asphyxiated" ; + rev:text "relatione bioluminescence indexing passages inquirers protista ordering yearningly rotisserie esophagal reactors doubtingly epilogs mindlessness trituration liver imaging radiotelegraphy robustness affected entireness peyotyl tambura biorhythm falterers bunged synthetical binned tores wangler sheenier palmiest studios jambs immunologic implementing predecessors rappels squeezing welter signory elysium technicalness reiterates entrain libeller impounded prickiest insurrectionary pishes cantabile dusts mudstones fixable abutment eradication uncommoner powderers convoluted scarcest weatherbound woolgathering tarsi frazzles looney washrags chico ranis ragamuffins reembody deficiency prouder availing gingersnap redraft gods subgroup cognize fissuring shoetree midmonth pileate valerians inweaves shakers illegibility overdosing yardbirds bodyworks misapprehends kakemono edged eoliths skylarkers awaits biopsies dakoit forwards compositely snifters inductees unread fizzed sextette rinsable canceled presift dirigible emulsifiers oohs labs eyers rebuild checkered cogitators backlist willers proportionally hearths novels mutates endocrinologists bookmark prancing servicers prepackage triodes sucker narcotization excising nonindulgence macroscopically tamping revalidation duresses kennels ovoids kickshaw wergild tinselled summer restoring emulators bacteriology nickeled sporozoon floorshifts millrun binaries redelivers crawlways lentic pronouncements tamed raininess reshipment pneumaticity sequestrate chukka unreeler"@de ; + bsbm:rating1 "10"^^xsd:integer ; + bsbm:rating2 "8"^^xsd:integer ; + bsbm:rating3 "10"^^xsd:integer ; + bsbm:reviewDate "2007-06-21T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-02-14"^^xsd:date . +dataFromRatingSite1:Review231 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product85 ; + rev:reviewer dataFromRatingSite1:Reviewer12 ; + dc:title "fairground litigants desirers empanel deforests absurdum wayless" ; + rev:text "aborting pickling goalpost dials crippling shockers reliableness archived heisted decelerated splicers saprophytic trolled guesting staterooms refill rationing peahen spiroid duteously heydays cements molder maxillae chitter inundating evanished kiln pita goddams congregants cudgelled reawoke antiprotons bohunks tercentennial puzzlers fanciest gleaned remarkable lubrications felled preconstructed larded depredation poetizing enraptured unfaithful intwining phrenologies gustatorily leavened echeloned violated disgorges overcommon disburden hybridization pornos fagotings refreshes composing accountability jalopies woolsack sahibs threating epidemiological vaginated emblazing poler snooted corkwoods frowned uvulae subchapters coverlets harangued pendants misapplier circumscriptions making looter clippers slyness goldbricker ligaments melodeons dimmest structuring unwittingly warrants multivalent unapproved moulter dishonorable electroshock capitalist striding listers treaters payability mazy brochures megillahs roaring overcapitalizing outdoing sleighed gars garroter mixer beechy basks seagoing initialed abridger zippier fraudulently whiting cryptically catalog nonadmission intemperances dauntless tailgates falsifying yegg dengues morphic inhalers"@de ; + bsbm:rating1 "5"^^xsd:integer ; + bsbm:rating2 "8"^^xsd:integer ; + bsbm:rating4 "5"^^xsd:integer ; + bsbm:reviewDate "2007-12-24T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-02-14"^^xsd:date . +dataFromRatingSite1:Review232 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product71 ; + rev:reviewer dataFromRatingSite1:Reviewer12 ; + dc:title "epithalamium italicizes congregation noggings titrant flambeed kindling transubstantiation fruitfully prohibitions teletypes" ; + rev:text "antagonists evacuating intoxicatedly landlocked ginkgoes sikh hitchhikes phrasal groupies lucidities osteoarthritis foredates profuseness abscise reasoned anglophobes schlepps sublimes unbelieving muralists puzzlement universality nautically triumphantly bitumens histamines donors abortions manuals songs embossments foreknow wheaties salves incumbently contuses indispensably mincing blueberries amassments zairian skintight dejects impedimenta clinkers warpers recompression glims cs leafs overdiversified ragamuffin stillest topsiders impartialness humdrums envies gormandizing enamelwork forces cocoons prinking newest pokies comportment nationalizes intermediately aerosolized betterment seabeds suspire prejudge xanthine lairs pretentiousness whodunit neglectful comes estray semifictional triturates ebullitions lightered hollanders crooknecks reechoing preheat followed prickiest montessori driveling disconcerted aquavit sidetracked pentothal steelyards quadrate predetermination electrolytically asea linked seismograms thriftier lunker windfalls canned otolaryngologies hydrolyses herbal pontifically heckler bobwhites deviation bushfires initiators draying pictorially neuromotor redoubled philatelic nightlong shockers consanguinities mimosa invoiced beers backhoe hardness subcommissions purdahs kidnaped lampooner neckless babbling dimply depositional underrate firmness safaried cuties chemics bireme galivant imperiousness dereliction unsettlement triskaidekaphobia lauder shadows glanced receiver fishbowl reactionaries delivered undergoing precalculating sheaths sortably mouthpieces snootily obfuscated wackily gobbling costumiers garbanzo fattens windily mediative overfanciful reran birretta almoner stimulations ricochetted sequestrable roughing"@de ; + bsbm:rating1 "6"^^xsd:integer ; + bsbm:rating2 "4"^^xsd:integer ; + bsbm:rating4 "7"^^xsd:integer ; + bsbm:reviewDate "2008-03-19T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-04-23"^^xsd:date . +dataFromRatingSite1:Review233 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product17 ; + rev:reviewer dataFromRatingSite1:Reviewer12 ; + dc:title "apocynthion hydrotherapeutical snifters muffles displeasure sixtes demythologization" ; + rev:text "invocational haunched discharges yesteryears spinneys intransigently indefinably stipulatory charnels woes unbeloved latinize theoretically mistypings unhygienic curred wired peepers rodded nondemocratic helicons troutiest hymnals lawings warehousers cliffy readerships appointive staccatos detractions trippers debonairness plagal fanciest scrabbling aluminized exterminator foddering royals medicined trowing emus decriers ordnances tooted endleaves vugg spryest crossbars daffier stealers bishoprics housings rectories faucets animated centenarian decreer airfields synapsed sequestrable plashy misidentifications obsessed soliciting porches epistlers restaging spicier sophisticates paydays assisi moots schmaltzier hollies sufficiencies antiheroic squawking picked microanalytical greyhounds consoler trundled tramels salicylic hems pedalled cists nonadjacent trooper practicality fez nominative stored"@de ; + bsbm:rating2 "1"^^xsd:integer ; + bsbm:rating3 "1"^^xsd:integer ; + bsbm:rating4 "7"^^xsd:integer ; + bsbm:reviewDate "2007-10-29T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-01-06"^^xsd:date . +dataFromRatingSite1:Reviewer13 + rdf:type foaf:Person ; + foaf:name "Inka-Shunsho" ; + foaf:mbox_sha1sum "d7d8bede5958eaeadbf7ddb84216fb2e6593dbd" ; + bsbm:country ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-09-08"^^xsd:date . +dataFromRatingSite1:Review234 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product67 ; + rev:reviewer dataFromRatingSite1:Reviewer13 ; + dc:title "creepers deciphered fizzing vectors agitations gristlier marquisette digitalization hacks sunburns deices clonks galleys chads hidalgos" ; + rev:text "rotterdam ritualize calorimeters amphitheaters renumbering abandons reread overdo regauge greatheartedly rurality overthrower amputator chocked dele calorics degasses granger pieplants akenes twangy tyrannosaur cairns cuspidal maundies inducement unknowns unmixt measliest geomedicine hired crewless badinages junkets hypnotically klatsches leadings followings thugs calderon gastroenterologists listlessly sidesteps nominatively octothorpe riposting hepatized cosponsorships homebodies humiliating unlet unflappably ceilings assigned neurologized athenaeum unquestioned dictions victoriousness eschewers crawlway wigless lumpiness brickbats maculation scrimshaw decidedly denuder tempters sympathizers doughtiest nineteens boozer blowhards luring bonanzas lettuces benchmarked ropeways guys misguidance violater scrutator geopolitics dafter toited crenelating unseasoned whitewall laborer yeller consoled discounters sloper submarines inverses evincive nonmen influencer propitiating shirking vividest falsifications fleshpots homologies slavered capstones inquisitiveness beaches unconfined blastoff foreclosing incidentless vociferate cathartic octaval doings whitest energizes nudie personas unsorted scurfiest squiggles serous psychodrama palming indeciduous recycling cointerred ouches mousey ballpoint soaped affidavits overpraise tetras trinal cigaret limpness prosperously moisturizes uppers preoccupies mislayer pommel supermolecule fatheads mightiness deles subtended assenter reattach comedos contraltos unentered calculator"@zh ; + bsbm:rating1 "6"^^xsd:integer ; + bsbm:rating3 "3"^^xsd:integer ; + bsbm:rating4 "6"^^xsd:integer ; + bsbm:reviewDate "2008-04-27T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-28"^^xsd:date . +dataFromRatingSite1:Review235 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product59 ; + rev:reviewer dataFromRatingSite1:Reviewer13 ; + dc:title "opportunism unpack belated mistreating taffies waged depilatories dissociated separators" ; + rev:text "inconsumably neophobia seawater careened scalloping latrines whitened rewove scuts baptised unreasonably noisemaker reserved reproduced sheafing serpents monsignors stovepipes effector musicologists metalworkers noncontinuation disarmers acidifiers unobjectionable demonism quiverers nonpoetic behaviors disobliged reexpressed besought birdman hastier gypped numbers pranced irrefutability clipt authors sprinter subpenaing institutionalize commissariats temp minters cretinize purposelessly robbing cloches extensors overexciting deplorably forequarter earls gearless biogeographical wryly wawls amplitudes admitters crapulous neoterics cartload yanked defectors oscilloscopes swamis typifies siloing bevatron enchiladas gussies slugabed swamped crossest sashaying causeways incumbency cadenzas limestones inadvisability aliened callas smuttiness downturns beatable deciliters ricercars satanisms warfarins shelver rower brutally perforator sparry diner spectrographer cuscus nought gatecrashers inofficious solariums reawakening openest hotheadedly gigantically plumpish unfrocks misquotations disability voodooed eddied wristiest teased cyclamen tipoffs riposted posteriors lambencies perturbations insensitively weened humidities overimpresses misapprehended medics peart maestros nirvanic buoyance puce pekoe relettered largely interchange interfering quatrefoil guffaws eradicated derailments"@zh ; + bsbm:rating1 "1"^^xsd:integer ; + bsbm:rating2 "10"^^xsd:integer ; + bsbm:reviewDate "2008-03-08T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-04-16"^^xsd:date . +dataFromRatingSite1:Review236 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product57 ; + rev:reviewer dataFromRatingSite1:Reviewer13 ; + dc:title "smuggled undertakings fleecily intersession philately rubbishy hydrator denarii suspenses" ; + rev:text "climatologists willinger footgears dilutions nanowatts unbudging tablecloths preaccustom lightening duplication repose impudence wriggliest threeping blasty unidentifiable liftoffs chalcopyrite deficits tallness truantry alliteration dispassionately grocers armlessly thudding globetrotters assiduousness topsoiling annunciated gravimetric farmlands obstetrical cobalts summarized armer regenerators despiser aureate turgidity admixt deceitfully heme relished earldom unabsorbed authenticated hardship coring organizer fezzed regauged yeasted emmets capitalization jackstraw brisking antedated rebids forestation assimilation escheated whelks steatite brainiest pirog rewarmed seamier leavers spiking polydactylism surely thats yasmaks kerchieves rococos deserter resolvable coelenterates sodding matriarchies exulting enfranchised humorist rinsing linier ribgrasses boatel incommodious humps joyrider amazons obscurity blockiest armlet maddened paddling dolors obstreperousness liegemen titanias typifying oversleeps placement presell nonpasserine unsew ripener braggiest reft pairing concerts unapproving proctoscopies eidos hoorays volumes subplots inseminations wishfully chagrined outboard reevaluations pawns jazzily driftpins zoos lamented cheerios gnoses vulcanize allegers moralisms subduing faired rifleries macrons reelects middens aquarial digitalization endocrinologies clamored bastille honeymooner velleities overjoy leitmotifs anointment stooping neurologists bowering"@zh ; + bsbm:rating1 "1"^^xsd:integer ; + bsbm:rating2 "7"^^xsd:integer ; + bsbm:rating4 "7"^^xsd:integer ; + bsbm:reviewDate "2008-06-13T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-15"^^xsd:date . +dataFromRatingSite1:Review237 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product91 ; + rev:reviewer dataFromRatingSite1:Reviewer13 ; + dc:title "feverfews deathy masons colluders secularists" ; + rev:text "disharmony bolivars overcharged rumpliest subculture milanese whippier lunations volatilizes executers finishing supervening flensing conglomerating mercuries arrangement straitened impingements witnessable gaminess emanator churns waterproofer bushiest lastingness corelating rebroadcasting rephrasing esophagus aspics labella comeliest nonfilterable fretfully overexpanding unloading nonconstructively strategically disclaims fiji gratefully patens wayfarers yamen tripling chillest surmounted necessaries slangiest banzai monomers martyrs prorating littlish augustly straggler sharecropping pressured misbestow appal styles sweepingly evokes arenas sequels daffodils yardmen copier repins guttersnipe punks picquets uncurled trembles crookedly intrusively existing temporizing moonshiners educates voyaged pretender decadently cleverish hoaxing lenity frizz inflection winglets condenser"@zh ; + bsbm:rating1 "2"^^xsd:integer ; + bsbm:rating4 "10"^^xsd:integer ; + bsbm:reviewDate "2007-11-06T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-18"^^xsd:date . +dataFromRatingSite1:Review238 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product49 ; + rev:reviewer dataFromRatingSite1:Reviewer13 ; + dc:title "secretions covalences sintering utterly" ; + rev:text "heavily imagisms cashbook cyberculture interests inserts staggeringly miladis gramps readjustment phrenological padshah smooched calthrops emotionless paginating moulter attempters paratroops exuding neurosurgeries pres inextinguishables hilting skiings convincers foliaged slighted dissepimental prosthodontist maintainer unconquerable tutorages tuppenny exhusband zillionth recycle spectrums wishfully casette rabidity polypous susceptibly goriest windpipes ameliorates decelerates hailstones regrets amortization stuccoer mage rheums witched reaffirming rimiest argyll quadruplet cannibalization skits maniples ophidian sheriffcies intakes chlorals anticlinal copyreaders yenned narcissistically complementing precociously livered enforcement nervines accolades monistical veiner stylistically beseem sanitation repressed quaffed beholden filmography gambling toolsheds whackers clownery bulldozer ohing consistencies fixation gentling innervates cuffs biologics hydrophone vehicles pulsatory subjecting tortoises inspirationally equips bushiest polyandrist transformations bigamous apprehends chummiest slubs contently eutrophy dimmable cowhides lithologic trainees populisms truer forthrightly longness unpacking hoeing logicians handgrips ironist occlusions notifying granularly lineups rinsing ados depicted pricelessness congeniality portress menstruation redundances presumptions vouchsafes toploftier tutorages disdains muumuus trematode joyed shuting rustiness"@zh ; + bsbm:rating2 "1"^^xsd:integer ; + bsbm:rating3 "6"^^xsd:integer ; + bsbm:rating4 "4"^^xsd:integer ; + bsbm:reviewDate "2008-05-29T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-15"^^xsd:date . +dataFromRatingSite1:Review239 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product12 ; + rev:reviewer dataFromRatingSite1:Reviewer13 ; + dc:title "hoboed compactors balladry tightens copepods disannulling roofed eiders unbinds materialistically specifying equivocacies intellectualizations" ; + rev:text "lechered noires squeakers manipulation spewed admits enchaining coles ethene bleakness fontanelle subordinations redecorating innovators stabbed homesickness sequelae senatorian lingers ramekins besieged slangy inapplicably bastilles alerters ecclesiastical bucktoothed subliminally commonalty insights mayapples stitchers palely amperages postglacial manrope supinating halavahs clubber manipulated counteractive sward interferer dialling rancidified oxidic mediacy peke unrest encampment sorehead untenable prepositional perceptibly kikes zincs tympanums choreas mentioned tidelands devaluations beautifies dadoes percolation expenders jinnee interconnect harlot capitalizer lips ingle subdistinctions compartmented elopes skiings crinkly hostessing uniting brimmed pickpocket caftan quartering divests circumambulations eyehook slushier griping scared precipitation dressmaker chophouse tups frostiest glasswork subparagraph childbearing shilling icier diddler"@zh ; + bsbm:rating1 "7"^^xsd:integer ; + bsbm:rating3 "2"^^xsd:integer ; + bsbm:reviewDate "2007-11-11T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-04-14"^^xsd:date . +dataFromRatingSite1:Review240 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product65 ; + rev:reviewer dataFromRatingSite1:Reviewer13 ; + dc:title "scatterbrained shipwright subheading upholsteries" ; + rev:text "miscopying parenticide atilt sultrier blossoming homecomings spiritualists perennially arched clavier innerving sackfuls chestnuts rotundly shindig recalculates wheeling weevils swishes forfeiting hemps dueler neatened jadedness daymare flatuses suppurations benzoate enjoined spirals dumbbells undertrained captiousness modishness zodiacs serologic growlers roarings reloans skepticism mainlander hinger sapience daintily tope midair ameliorations blatancy interiors orbiter haloes coolness chaws blockhead motortrucks repays professionally bowler coupler onboard foresaid incontestabilities legalization prisoner adyta chaparrals promontory morassy plummiest cloaked judicatures finmark erasures intimates autodials paddlers diphtherian quarter unthankful phonologists bleared hugely rocs maybushes vitalism photosynthesizing staffer spastics radioscopic fortifying whiffers retrenchment koshering spherically chitchats unfortunately cabinets decapitating chirrups gladier bitching ergot fantasizes recuperation resealing cordialness dispossessing kishka alarums manubrial brazers monoplanes salubriously suppurates undiffused eyries bolivias reinvolved sandblasting malices atmospherically neutralized synthetics ochrous lumbered redemonstrates gainsays trilled torrents cockers dialers fretsaws whirlybird crankpin"@zh ; + bsbm:rating1 "4"^^xsd:integer ; + bsbm:rating2 "2"^^xsd:integer ; + bsbm:rating3 "3"^^xsd:integer ; + bsbm:rating4 "6"^^xsd:integer ; + bsbm:reviewDate "2007-09-06T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-10"^^xsd:date . +dataFromRatingSite1:Review241 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product83 ; + rev:reviewer dataFromRatingSite1:Reviewer13 ; + dc:title "clubby forehandedly reeky magnificoes pawing" ; + rev:text "smears novella cyclizing matricide condominiums penner conspires muffs checkers greedier bestrews immixes damages svelter coxswains aesthetics fondu legalists undernourished inexactly chancering monitored brothels illusiveness arraigned polypod imperturbably pasta mottoes reglue unexpressed chieftaincies lathes couplers interlaces pilaf faithing reverberator asymptotes clavicular welshers clemency drapers comfit autoregulatory countenances waxed avianize frumenty materialism kyat viciously dittoes eskimos ovolo vileness incapabilities hominid edibility hosed pellets inveterately vaporization jerkier synchronization apoplexies unspecific balsamed hypnotized auditors impressments roentgenometry encounterer dogsbodies sounds antiquates maoism patriarchies incorrigibility procapitalists swellheaded cordwood electrotheraputically hams swedes taupe soldering"@zh ; + bsbm:rating1 "6"^^xsd:integer ; + bsbm:rating3 "7"^^xsd:integer ; + bsbm:rating4 "5"^^xsd:integer ; + bsbm:reviewDate "2007-11-30T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-17"^^xsd:date . +dataFromRatingSite1:Review242 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product74 ; + rev:reviewer dataFromRatingSite1:Reviewer13 ; + dc:title "heralding crashed dragropes tommyrot impecuniously impanels cons pocketing underages predominately glens wheals stenciling purslanes" ; + rev:text "deliberately crispers feverishness presbyopic supercharges pickled crocodiles besprinkle oilway accommodating criticalness singly heists roentgenographic percolation obligee abstracters triticale mechanisms laminating adrenocortical horah bagginess gyre hectares eggcups categoricalness hearthsides relator capfuls slimness fumigation rems notarization unpossessively wrenching hydrogens brahmin hearkening stiffer swooshes grainier hygrometries ai parochialism quivery stereograph azurites nodules fallings bedmate kohlrabies vented reconfigure reheaters mays impairing guarder disobeying victualing remilitarization forbearingly frowsty octopuses honcho hierarchies flushers compilable deleing hights cocain uprisen warsaws leukemoid volatility machinability broadband sunroom coonskins galleried insobriety puce bobbysocks uncovers someway gigolo alcohols yearbooks miffing ductal miasmic contentiously tasking canastas obliges anagrams affiancing precollege reconveys seguing terminals stolonic descendance arrested overmastered bequeathment approachability galileo handpiece engender moulders feasance pervasiveness sprayers depositing untried pensioning jellified perdurability obedience distraint wariness cunninger fishless equestrianism incising nonmotile anodically obligatorily apothegms kirtled neurone venerability mistimed ethicize turnstile buncoing andesyte trumps cheeper preenlistments palmer collaborationism stepchildren decimalizing subscripting kilties excommunicator vervain centums platesful overtime linseys obtainable devastating bassos geriatrics retrieves televiewer discredits precipitateness turning flustered marlins inseminating whirlier immobilities patchiest"@zh ; + bsbm:rating1 "5"^^xsd:integer ; + bsbm:rating2 "6"^^xsd:integer ; + bsbm:rating3 "4"^^xsd:integer ; + bsbm:rating4 "2"^^xsd:integer ; + bsbm:reviewDate "2007-11-05T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-03-20"^^xsd:date . +dataFromRatingSite1:Review243 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product56 ; + rev:reviewer dataFromRatingSite1:Reviewer13 ; + dc:title "secretes welling chills dissatisfactions" ; + rev:text "lariated tonnish lasagnes unalterably unchallenged trusting curtailed grammies impressionistic separatist bezoar brokers sopped mickle pigmented soughed combats rawhides eyehole doser dibs lancers deringer gipsies decorative aikido outbalancing thickeners fatso coition clotty reintegrate balsams conductances gobbed begonias bearding sinker tambour avowable doughtiness bulks slunk habits authenticators rooming obtrudes ethicists barographic asymptotical syllogistically doorknobs savers fica moronic blindest sordidness triticale butterfish cogencies mortises disuniting slaker tailors bleachers pedometer quos convects blanking geneses helming monopolization bankrolls sumpters representatively tracked estancias servomotors xxv stooping formalins barbets unplowed contrariness antinomianism impends navahos degenerations bouncers jerkiest interfacing declaratively reenjoy adumbratively futurism lustiest abbotcies hounders slimiest tanglers mealier taffies assembles silicons squeezer embodies overinflating perspicaciously slaws ripples crankier sacked heme volleys hairpieces moonfish vixenish windage griddling shelvers ravishingly racecourse uncomfortableness barbershop oms sacrals quietest"@zh ; + bsbm:rating1 "5"^^xsd:integer ; + bsbm:rating2 "9"^^xsd:integer ; + bsbm:rating3 "1"^^xsd:integer ; + bsbm:reviewDate "2008-01-17T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-16"^^xsd:date . +dataFromRatingSite1:Review244 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product74 ; + rev:reviewer dataFromRatingSite1:Reviewer13 ; + dc:title "rarefaction obsoleting revalues annalists advocates cumulonimbus" ; + rev:text "disaggregation sabbaths radicates whistles gists trampoliner capstans galoshed racing nobilities repriever manhoods futileness flans fudging skyjacked typifies lunars greasewood griots tiniest haughtiness notifiable lovelily transliteration aerolites turgidly mauler clamorer sauntering bristlier boardman insusceptibilities utterer outrooting typographic starchiest misbehaving escalator deprecative engirt lapidated binges prelim dissuasively hyperactivity builds coarsely pathless outlook dooryard sidewalls presoaking alms teazels collates indue combing passings ethnical raying rattly gumweed anathematizes unforgettably miens assignments confuter backsaws cline aerodyne hawking antidemocratic harper puissance hassock warranties tsktsked witling unpunished godwits extravagantness punctilio innocuousness hispano penetrates giddiest rickettsiae simpler wirehairs chasten skyey flexibly pusillanimity discarded rentage flounders reemergence mashie reweave cuttle animalities deactivates gnomes sordidly coempts identically fellations gobbles socializers seashells inexcusability stegosaur gladdened fabricates jammer cocoons ropeways overinflating underpriced oldnesses conferment peccadillos mudcaps ideokinetic replenisher incapacitator thermotropic cosmologist commending elands bucko roundups kitsch biweekly piratic spiel elicitor lutes analogize daters recognizably retrial untidiness mooned val concoctions brambles accented whizbang monistical wrists retool glamorously prohibits nitpicks pretention pikestaves imaging preponderance heisters beaufort canalizing scrutator sufferingly unvaryingly normalizer bisectors reabsorbed faithed healable appetizingly transacts duelling landfalls clerking studded repacking flinger arith presupposing outstares cleans tactfulness worldling revolted birdman"@zh ; + bsbm:rating1 "9"^^xsd:integer ; + bsbm:rating3 "8"^^xsd:integer ; + bsbm:rating4 "4"^^xsd:integer ; + bsbm:reviewDate "2007-06-21T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2007-11-13"^^xsd:date . +dataFromRatingSite1:Review245 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product43 ; + rev:reviewer dataFromRatingSite1:Reviewer13 ; + dc:title "ginner slurs meretriciously prizewinners pattee crowns mullens unblocks serges" ; + rev:text "maenadism indigents perilously fluoroscopically barroom unmarriageable mantelpieces recoveree mushers inearthed embarrassment standees clover dairymaid witnessing acclimatizer mishmosh maneuvering stratifying appellations thymuses sanctioning besot envenoms cerebellums thickness tarantulas lathworks ires cottontails nosegays aboves ketonuria clocked recompenser salicylic turtlers amalgamated spoilers detacher gossipers smuggles incased perishability adulterates patentor inviolateness growling auburns oscillations aldermanic vaulters nonconcurrently serums irrationalness bagmen cudgels deflections riskily reforests highnesses spoolers replanting deejay scads fundamentalists violoncello teetotum decayers tightwire burgers podded hematin grounds nictating ireless salients aweather abjuring mahomet exemplified framers postings crustal archdeacons heterodoxies wistfully semen appalachians palsies lacerates kinema stipulators hobbles larrupers dampener outnumber metrists realtors plower perjurer sucker affectively sheikhs volution creditability crazing mamboed remittently baulkier pealed vins capillarity commiseration entrench lacunas oglers radiosensitivities blimpish cymbling protected prorating distensions anticancer safeties indispensability malarky disowns shopman leadworks postmarks knuckled felinities misstated dreamful wholewheat paradisiacally porting skein overconcern algorism beholding moseying microscope phantasied tubbier shoaling artlessly twister images pesticidal dyspepsy bloodshedder impurity encaging discontented fetted insurants endear bachelorship prostitutes larches errants hinder chaffier smokepot scraping horseradish mustily heterogeneously portcullises beys hatemongering violently"@zh ; + bsbm:rating1 "7"^^xsd:integer ; + bsbm:rating3 "8"^^xsd:integer ; + bsbm:rating4 "10"^^xsd:integer ; + bsbm:reviewDate "2007-11-24T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-02-01"^^xsd:date . +dataFromRatingSite1:Review246 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product24 ; + rev:reviewer dataFromRatingSite1:Reviewer13 ; + dc:title "shinnied igniters matched mechanotheraputically estates verged aglare airfoils goats camphorated warted humoral landmass" ; + rev:text "essentially ciliated paranormality rebecs divergently axing sporozoa zinced unshackled whipsawn liker mudras epee pseudoclassicism enormities former scurvily scalable issuable cloistered ellipses seral desegregation solvable usually assegai breezeways coding underdressing kakas shushing irredeemability aquaplaned culottes reveling phenotypically overparticular uprooted unhealthy encephalon involutes rejoicers snipper aptnesses imponderables noontide defacing sculling ears bosoming deductibles pinging megabuck ignited shoreless gavotted sentimental forepart ooziest felted tanbarks refocused buffoonery reliving sheenie"@zh ; + bsbm:rating1 "5"^^xsd:integer ; + bsbm:rating2 "1"^^xsd:integer ; + bsbm:reviewDate "2008-02-12T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-04-18"^^xsd:date . +dataFromRatingSite1:Review247 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product23 ; + rev:reviewer dataFromRatingSite1:Reviewer13 ; + dc:title "drivelled untransferred changeless licenseless growliest dummies restarted exertion sandiness" ; + rev:text "spangled inferiority brigand scarped unconquered warmaker slotting grouped heartbeats granularly recurrences unclench candidly photoinduced inelasticity doubler spirituous restraightens craters sallower pollinates purulences homosexuality lightness upstages agitates graftages piastre patrimonially shunner opposability scabies hippocratism kinswoman oafishness auricle carets weve meaner calls elective preaching tolerates trihedra eyebrows factionalism flesher sculp flagrance indiscriminantly pomaded unresisting leniency unreckoned agentry siecle cheerlessly immiscibility massacring whackiest hugger loathly disassemble radicalization ejaculation alarumed glitters plasticizer overslept bosks productions angers faultfinders supered hesitating nucleated markka deformer expatriations deliciously valuative devilries plumpish coigns eyeshade reequip affection generalizes midriffs rhetorical fazes obstruction equines deceptively moonlighter misapprehension praiser ladybug mallows vernacularly excitons gazetted teams pennsylvanian springboards shampooing aureoled demythologizations reciprocatory interface tanbarks colly nympholeptic prefabricating rackets"@zh ; + bsbm:rating1 "3"^^xsd:integer ; + bsbm:rating2 "5"^^xsd:integer ; + bsbm:reviewDate "2008-02-12T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-03-21"^^xsd:date . +dataFromRatingSite1:Review248 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product42 ; + rev:reviewer dataFromRatingSite1:Reviewer13 ; + dc:title "tarweed foretoken precluding colors unbrotherly tabards regimentally marinara dative" ; + rev:text "tautogs indicia lapses dialyse expediting moiling catechumens hundreds boob preacceptances pennsylvanian commandants leaguing heisters pishes tosses dyewood foreshadower phallus thermometer opulency imposed totted nictates xanthate uppity macaroni fornicatrix lofted yearbooks outing voluptuary kirks leavening crisply neolith aretes dazedness bund questions scabbing vixenly tictacs heterodoxy indenting exotoxin folding bonhomies dewless joyance elastomeric absconder tackets unincorporated burdeners communists nationalistic zymoplastic lieutenancies eliding subscribed manta battened isostasy embellishments disking waded saliently insulins docilities pastorale rainwears dourly pauperizes shooks pipetting controverting standardizes arbalests rustler chivying normalities washability argentineans initially voyaged demeaning informatively midrib impressionistic diffractive candider slogs eateries mediately cyclamen orientation palmers gnarliest undocumented cuppa dashing prototypical convulsively mistaker goutier matutinal repeoples cutely lappering unshorn photoreceptive forecasts reinfects rapper arborvitaes vaccinating templar gonorrhea rebuts japers maternalism opposing ooziness psychologism sacksful urologies"@zh ; + bsbm:rating1 "2"^^xsd:integer ; + bsbm:rating2 "5"^^xsd:integer ; + bsbm:rating4 "1"^^xsd:integer ; + bsbm:reviewDate "2008-02-04T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-17"^^xsd:date . +dataFromRatingSite1:Review249 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product69 ; + rev:reviewer dataFromRatingSite1:Reviewer13 ; + dc:title "subscripts giants spaying sequestratrix snoutier ballers punchers fifer" ; + rev:text "orphanhood melamines stye repeoples snailing immanency fraternities angleworms cryptically biogeographical tapholes brightness legroom laundrywomen motivated hireable songbirds hanks horsewhip appellors euglenas invectives slimly cantrip repulser satrap dost caoutchouc snit upcurving privileging uninspiring raveler cascabel blokes gavottes dialogged bootleggers premeditative recaptured sinology alarmist specializations bdrm disarticulate conjunctions blockbusting spiel diptychs salubriousness mohammed mandolinists expansionists unworldly cerites monogram screeners lawing complains squattier lycanthrope penetrator sloshing chastener juridical antiquarianism overheard commemorated dioxids applauses infirming curates arith reargue pinfold soapmaking seafoods linguines ovenware muckraking anybodies constrainedly argal menstruations dethroning euglena sauceboxes sheened loyalism choring surcoats leached photostatic unfitly inliers columbium"@zh ; + bsbm:rating1 "2"^^xsd:integer ; + bsbm:reviewDate "2008-04-21T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-12"^^xsd:date . +dataFromRatingSite1:Review250 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product63 ; + rev:reviewer dataFromRatingSite1:Reviewer13 ; + dc:title "viewy teacupfuls natureopathy baptizer longitudes cardiologist" ; + rev:text "graphites snowily lucidity dotier yuks miasms semolinas parenthesize qualmishly bards intellectualizes granger supremely generalship resonants retransmitted visiter culminations streakier drubbings engrafts pluvially repopulate musts terminators nonforfeitures jerkies thinclad detraining chalkboards censer apoplectic hilltops overrule visards hora crisps vaporizers fellows sciroccos trappers deformers earpiece winker useability tunnels uphills waterlogged remanufactured scrubbing burnooses vertigoes skimpier revolutions amities subtopic neutralize antimagnetic reabsorption margining leaping familiarization touzles briefless laddered chamiso casteless flamer concentrated credibly slotbacks reboils strudels realignments leveling timberlands clutching sweltriest refuses gangly prosodies salinizing oscillating iowan kneaders chromos constantly described samovars fluttering sugarcane fendered blending interprets underachiever retaliator nonperishables travelers depolarizer ruralities flimsiest rebuilds mesentery imaged firehouses psalmist trifacial ecol gauger swipes sieved contagiousness graspingly ligaturing telegraphists fictitiously unwrap ropewalk coffers concelebrations semen tarragons postpartum remailing coredeemed betas girting bowfins nonvisual disreputable micrographs razer bazooka tangibility stateside hedonists sealeries gloxinia outlivers snapshots impounding unremittingly graal butanes erotical tandems bollixes corresponded unventilated looseners wisely cicatrices mezuzah raciest gustation updater uncordial tracheas looseness jaunting superstructures eldritch victoriously slugabeds mushing guarantying breweries decrepitly canape discovers laming milkwort infirmed mightiest cantatas slackly betrothed compactly reply juked heliotropism softballs minicomputers halfheartedness nigerian barstool firry outwalking"@zh ; + bsbm:rating2 "6"^^xsd:integer ; + bsbm:rating4 "2"^^xsd:integer ; + bsbm:reviewDate "2008-05-03T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-16"^^xsd:date . +dataFromRatingSite1:Review251 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product27 ; + rev:reviewer dataFromRatingSite1:Reviewer13 ; + dc:title "delineations adjudication extortion sanctimoniously reprocessing" ; + rev:text "silks nonsubmissiveness megapod timothies coloration pestles shopgirls blasted unaffected jaws campuses muddies turbot obligation unwinds angered guiltiness removing skydive tuned acmes palmistry goddamn utilized gods gratification figurings gassier misspends belabours evaluated warranter cravers throatier perplexing landsides proclamations beatification dubbing tritely musclemen crinkled categorizations mg overdraws disengage semirigid handsomer worldlings undetached powderer foreigners dickeys jargonized approximating becomingly functionally abator organa emaciates ambience insulates noninflammable bruising whipsawed subaqueous dilatant preestablishes lakier mutationally bronchopneumonia selectness nondramatic widened bluebonnets stinter shantey authoress selenographers savouriest actualizes groundlings geomancy clockings aphelia forewings flexor cryptal reinoculation claimed harpings albinism filius carvers poppas bogeying remeasurement rewriter grossers monarchs mythologic butlers ails gyppers protista depopulations intendeds jammer kinematically slackness hysterically alchemic owner agonal anglophile poco upkeeps nonmalignant timidity betonies riches commodiously loupe olympus buts deviation veined unriddle metricates"@zh ; + bsbm:rating1 "1"^^xsd:integer ; + bsbm:rating3 "4"^^xsd:integer ; + bsbm:reviewDate "2007-10-04T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-09"^^xsd:date . +dataFromRatingSite1:Review252 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product20 ; + rev:reviewer dataFromRatingSite1:Reviewer13 ; + dc:title "oldnesses shticks nitrogens inturn venally cosignatories switchblades yearning displays" ; + rev:text "gregariousness titillatingly outleaps angoras reigned crossbreeds wavelike clave hawked elephantiasis compacting neurophysiological alienism triphase synaesthesia homages bastes shoos brio eulogist homeworker mystifiers ahold benzoin crucially prickled rationally dictaphones attainability gawked scrutinies purdahs towelling refigure shipmaster sexually gasogenes seizer dispensing nonemotional entrapment appointment demitasses diverticulum inactivated rethinking heraldist syndics realities nickers pantywaists replaces accusers battings persecutee livered relaundering stereoscopies jabbering postulating flamingos"@zh ; + bsbm:rating1 "1"^^xsd:integer ; + bsbm:rating3 "3"^^xsd:integer ; + bsbm:rating4 "5"^^xsd:integer ; + bsbm:reviewDate "2007-11-27T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-02-13"^^xsd:date . +dataFromRatingSite1:Review253 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product30 ; + rev:reviewer dataFromRatingSite1:Reviewer13 ; + dc:title "disfranchiser relit hairworks turnstiles marries marblers invisibility" ; + rev:text "tellership blunders cheerier workhorses lauras ingulfing truckloads drudges yearners llano tentier mulcted nontruths tarries sonneting unhinge lobbers advanced prefabbing longues laparotomies dreck exhausts bordures wiriness subcommanders blowziest perforating stanchers fenestrae cougher paddling specialization novenae smoothy policing pseudoprofessional muffins heres weeder rummier televisional jerboas oldness pretrial interposers twangy stockers bushido caperers canty wisher secularizer crabber goading"@zh ; + bsbm:rating1 "1"^^xsd:integer ; + bsbm:rating2 "8"^^xsd:integer ; + bsbm:rating4 "7"^^xsd:integer ; + bsbm:reviewDate "2007-10-04T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-02"^^xsd:date . +dataFromRatingSite1:Review254 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product85 ; + rev:reviewer dataFromRatingSite1:Reviewer13 ; + dc:title "colic obelisks squared modula jerkiness egoism ladyloves" ; + rev:text "trainers cheroots demineralizes fagots creasers swarty potsies discover vagueness dognapped strobic skydiver poulticed tinplate yuletide registrarship toddling shouldst subscripting mestizos ensnarement epithalamia nativity subtracted chromosomal widdling chantries corresponds unfurl loups attractively devitalized evulsions cajon powderers challengeable cologned defecting quayage cued tizzy despots motivic whacky patellae townhouses limberly backs beacons available codings folic buccaneer encapsulated aborters shadowboxes operating sired disbar douses crackpots brahman crepes meninx concurrence preascertaining stonish lumbered coupons centralists expiations landowners inexactness ritzy discordance fatalisms stateswomen macedonian illuminations centerpieces expectance acclimating idiosyncrasies bounteously fiscals hashing yeggman donjon tearing geriatrist misquoting chillum parasitism multivitamin dismemberments swizzler excrement snappier mondo optatives ruralizes unfurls wretched persecuted motorbuses couldst terrifying solaced polkaed tadpoles knowledgeability catchalls fleetingness clampers scuppered physiographic wirehaired contortion chauvinistic libidinal untouched disrupted grouches snoutiest emboweled vocalizes bouse inventions veterans kelvins crocheter transmittals malpracticing haviours tempestuousness nondiscrimination redivide irrupts whipworms snappers unwearying unrecommended sunburned quintuplet lobules unproductiveness sized"@zh ; + bsbm:rating1 "4"^^xsd:integer ; + bsbm:rating3 "5"^^xsd:integer ; + bsbm:rating4 "1"^^xsd:integer ; + bsbm:reviewDate "2008-04-27T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-10"^^xsd:date . +dataFromRatingSite1:Review255 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product89 ; + rev:reviewer dataFromRatingSite1:Reviewer13 ; + dc:title "unobtrusive unfastened concelebrate sepalous psychodynamics habaneras loquats hostilities cornball sakis unlined reconcentrating mudfish incoincident" ; + rev:text "roue aniseeds postmistress couldest exchanged pinkoes pandit nonhistoric abstractionist escargot earings gonifs bolded viscerally atherosclerotic vaginae pyrenes interposes furler compeller welcomers leukocyte respell eyeable gratings sadomasochist inseparableness fylfots enfilading unnamed laptop motorings exactingly gentles gastronomical fitted subdebutante willingness recrating covets ribboning aardvark niftiest daubery repiners sibilants rattan unpropitiously ardors restructure tumescent conjurer awardee otoscopic reinvited nonethicalness clarkia prays investible outpatient foresworn rehabilitator nursed obscuration gratuitousness synfuels purgatively parboils emirs mouthwashes noneffervescently organza exempla bugler presager wittings siloed besprinkle quadruplets undersell garnishing ionicity epistolary fadeaway formated whoopee dicots jessed studding unfavored genevas mesquites beating phonos violences cradles wholeheartedness neoterics ghostliness overcomplacent ringers twelvemonth"@zh ; + bsbm:rating2 "7"^^xsd:integer ; + bsbm:rating3 "4"^^xsd:integer ; + bsbm:rating4 "1"^^xsd:integer ; + bsbm:reviewDate "2008-04-18T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-02"^^xsd:date . +dataFromRatingSite1:Review256 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product43 ; + rev:reviewer dataFromRatingSite1:Reviewer13 ; + dc:title "wennier mishmash dysfunctional confutations absinth redirected pulmotor defrosters typifiers jailhouse undiplomatic oho" ; + rev:text "embouchures whitecapper snarly rapider worriments ritzes hilled blasphemers inflexibleness carminative dissents compactions merits orates doxies mortgagers digesters blueballs coagulation manorial nonunion theatrics gonadal abstracters cocoons preemies overshoe straights pawnbroking stovepipe tonics blackmailer beatification pricked checkpoints aberrance pressures chartists soiling useable aldehydes devices trusser albinisms subtonic obtrusiveness androgyny legionary exchequers interlace potation reintegrates prorogued disfigurer jackets hungrier intel gulpy tutorship vendibly reargue dislocates centralism tamperers smoking inventions remunerator reexperienced absorbents sparkily heinously scurrilities criminology downshifts lumina trows abilene agitprop colters hypothecated heroins inaptness donnish dbl octyls oneidas tunnels blinkers stye fogbound gonfalon gimps spinally englishwoman rurally runtier humidified fullbacks pulverized parenticide oversimplifying rheometers demagogs scandalizers unmodified croons declining syphons histolytic augustly onionskin cooees overspends predominated earlock edibles banjoist sapsuckers flitted outshouts precedes recollections graters gravitations astrological beseeching borsht broacher ferrets decorates recognize cohabiting floorer corrupted rescinds barricaders sprits"@zh ; + bsbm:rating1 "2"^^xsd:integer ; + bsbm:rating2 "6"^^xsd:integer ; + bsbm:rating3 "4"^^xsd:integer ; + bsbm:reviewDate "2007-10-12T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-04"^^xsd:date . +dataFromRatingSite1:Review257 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product25 ; + rev:reviewer dataFromRatingSite1:Reviewer13 ; + dc:title "supinator reverer discriminated blazoner landscaper muskier ringbolt scrimp axemen salvagers" ; + rev:text "griffon locomotes artistic visualizations excreter semitropical wireworms amniotes peonage filmographies polemizes byproducts pecked domineered bullfight insufficiencies supercedes bigamists friendly scowed blockhead decapitator glottides acquirers eaglet elegiacs sahib tawnier bellicoseness hardhandedness appliques flatterers decoyers thermometrically antagonisms clubbiest disunion suppliant wartier alternations crested consumable bruiter arrayer tweaks demodulated shillings federalize ecstasies veers shimmed attestors ariose motived godly gadgeteers reveler eliminating intensity dataflow precipitability grippes potpies statistics rearming solemnizing feinting saturated bellies ducted restaging wharve flacons sectary chuffer flower regulations relicts horridly unthinkable dilations uveas sarapes reproductivity exobiologist frailness subsections outboxes rapidity efferents psychosomatics tippier humorer renigs accommodated transmuting squirts backwoodsmen awakes barbing venations hairsbreadths freckling crudding freshet bedevilment barometry anecdotist postcards embodying fooling ameliorative sennas amice oversides cocktails damneder oilway foibles annihilated fractiously panicles pastoring musketries nonresistants inseminators gloriously unearned filarees lowermost spellbinding feticides memorandums entireties habituated grosgrains sensationalists pounder uneconomical novelization originalities sudsier moppets glassing sagamores vacillations amounted lacerations doubts detecter"@zh ; + bsbm:rating1 "7"^^xsd:integer ; + bsbm:rating3 "9"^^xsd:integer ; + bsbm:reviewDate "2007-11-29T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-04-25"^^xsd:date . +dataFromRatingSite1:Review258 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product64 ; + rev:reviewer dataFromRatingSite1:Reviewer13 ; + dc:title "spreader graceless peacefulness sharks vomitory smearcase inks lightfaced blunged" ; + rev:text "dimmable scrupulosities floweret antiquer unwritten unrepentingly unrefined advisees centavo gainfulness satisfactorily nonappearances groovers sensitizing cartable searer repealable skein reconciliated nebbishes notarial galatians unreadable kabukis orangier seclusive homey congruency favourers hunkering dripper lightest internally autos censusing accompanists polytheistic obtruders meticulously fascists seabags chancellorship alliteration misfiled whiney antipasti tunneler habitancy kilties bartletts rotifer academes bumbler wiggeries nihilistic chirps ruined gateless underlays answerers chaffering rethink prickers astrolabes beeper inhabitancy whitish bleater stirringly sageness curtailments recrudesce imponderables sequestrated monopolistic rani thermoreceptor poppies fabrication antipyresis culpas buckshots preliterate shoshonis ecliptics narthex rulers czarevna levels overhung cogitation birthing refastening cinereal sparker existentialist amnesiacs surfiest sheeters glandes divots amounted tremblers sentences overcurious ionises shorthanded expiatory triturated finks sayable neglector snappers dehypnotize overpaying buildups technological cerias radiophones reworking disengages aspiringly springier misunderstand receipting penciled thins seduceable ibises hierophants hoaxers tagboard heroicalness teratosis retroactivity magnification ewers coalescence execration predicting dermic unmannerliness unicef ardors unworn reinscribing solemnizing unsexual spectaculars mauling mechanizers crewing handworks markswomen skeletomuscular"@zh ; + bsbm:rating2 "1"^^xsd:integer ; + bsbm:rating3 "5"^^xsd:integer ; + bsbm:rating4 "10"^^xsd:integer ; + bsbm:reviewDate "2008-05-16T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-10"^^xsd:date . +dataFromRatingSite1:Review259 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product52 ; + rev:reviewer dataFromRatingSite1:Reviewer13 ; + dc:title "prejudicedly desensitizing redigesting hydrographic rejoinders aloofness" ; + rev:text "grader aerobics turgencies outpacing pounds restated statures impearls heartsick jupe calendars transplanter invariably cystitis differences hepaticas exserting curried bednights affectionless moribundly durned archimandrite dept monetizing colluding suburban anglophiles tollmen trickish toasts impoundment congos equivokes proctoscopes downbeats specs nativities ped confucians concelebrations remarkably copulative voiles yearns vapoury instructional surfy nutriment volts wrying lividity tardily freedoms liger prosuffrage incompressibility intoxicates aches analogs journalizing dissepimental cockups burnets kilobar luxations flaxes nettles fillable bucketed aladdin aurorae sociologic plumpers wrings fatherland freethinkers spumones gemologist jasmines homicides hilarities asserted davits incrusting egocentricities coalifies beddings coolers sunglow nonconclusively englobe heaths contraindicating prosperity layabout mousey germaniums ponderousness phonal codicils disenchantingly disconcertment kirkman wailer parties housewifeliness raisons unpunctual fueler outburst skipped vintages connections abstentionism fossate attempters stoutened eras affrayers fezes costumey flooders morphogenesis infundibular spinnery incase sweltriest oversupplied channeling backspacing noncorroding withier fleshiness surliness gruesomeness tizzy outmaneuver communiques cuirassing truckers baulk misunderstandings markedly dogsleds presift dwelled inquirers paused initialling"@zh ; + bsbm:rating2 "6"^^xsd:integer ; + bsbm:rating3 "1"^^xsd:integer ; + bsbm:reviewDate "2008-05-02T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-02"^^xsd:date . +dataFromRatingSite1:Reviewer14 + rdf:type foaf:Person ; + foaf:name "Leonarda-Ajanta" ; + foaf:mbox_sha1sum "cf43b31540d2f8e06cd35dd725801aa44a5b37" ; + bsbm:country ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-09-09"^^xsd:date . +dataFromRatingSite1:Review260 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product56 ; + rev:reviewer dataFromRatingSite1:Reviewer14 ; + dc:title "sanzen proprietaries testicles whoredoms barred" ; + rev:text "unsavory converts firebricks blunderer chervil parlayed menaced collusive pizazzes pouf lozenges discased gloomings ruralize lowered effortless exarchy retinoscope lifeline cloning stultified stabling calcspar sveltely ballasted overbidden inweaves retrogressions freehanded leotard urinated grasses exactor amnestied correspondence nonalignment decreasing minimals lunacies whines clenching misadvising reinterrogates lacerative cabalistic enrolls dejection sprites chicanes houseless penetrating contrives aweary modernized ensnarls scorned fusibleness strongholds thriftily tigers paddocking evangelistically renascent normalize fluidities confuting cooked monarchies pricers misguided underlip woozily impressing swabbing cornucopias imbeciles casteism saleswomen unsmiling installment lampooner substantiality monkshoods lipolyses jawboning establishable pulsation xeric superscription sicklier outcropping crowning gorgeousness crustier manors overestimates engrafts demeanor cantharis subduing muddling unconstitutionality deuces unenjoyable hellenism pylorouses confessions dillydallies practising irrelevance encouragingly oscilloscopes exigible gram mantlings inquiries fasted recast sterility cobras mentions tomtits chronicling deled circumnavigates solidarities putrefy commemorator"@zh ; + bsbm:rating1 "3"^^xsd:integer ; + bsbm:rating2 "5"^^xsd:integer ; + bsbm:rating3 "10"^^xsd:integer ; + bsbm:rating4 "10"^^xsd:integer ; + bsbm:reviewDate "2007-06-30T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-03"^^xsd:date . +dataFromRatingSite1:Review261 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product56 ; + rev:reviewer dataFromRatingSite1:Reviewer14 ; + dc:title "drollery solarized nuttily installments allotrope emoluments hagborn maladjustments zapped" ; + rev:text "priestliness ostlers jacquards victoriousness carpal descanted cheeks limitations overeducate hawkbill eugenical renting dimwit flocculus adrenalin omnipotence conspicuousness aerated riposte topfull whitecapper alleviating boondoggling inferable desktop upstanding pekingese featherless rummer pandered institutionalists anecdotes dampers retributive lolling nonclassically pedometer shakiest consignment fumigator beveled paeons circulators superscribing squalidness ordinarily exempting carbides robbers poetaster undiversified scandalizer forgathers imposed nesting booed reabsorbs bikinied dyewood neuronic electrocuting duodecimals capriciously cachalots pellagrous unplumbed sphygmography uninhabited defamer bete sulkiness dermatological slimed weakening demilitarizing benignancy bigfoot epilepsies bacca lamaseries defilingly dbms velcro stormed smokiest fauvism cakewalks catnapers emulating hankerings"@zh ; + bsbm:rating1 "2"^^xsd:integer ; + bsbm:rating3 "7"^^xsd:integer ; + bsbm:rating4 "1"^^xsd:integer ; + bsbm:reviewDate "2008-05-18T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-11"^^xsd:date . +dataFromRatingSite1:Review262 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product84 ; + rev:reviewer dataFromRatingSite1:Reviewer14 ; + dc:title "enframed porthole securance anointing" ; + rev:text "hoking alibies detoxicator jills billiards magpies standardizes enjoyable teamakers calligrapher shipworms prettification pandit refractivities godheads venosities decliners broodiest sitcoms cutlets websters osculation unmilitary impatiens jets sixties grimaced bunkoing hydrocephaly drollery transferrals artichokes grits thistly pourer adders communists pastrami handfast entombing abscessed latticing fortuning burseeds delayed flintily irks rodless leprosariums underpass stomachache sanding expellee graying implausibility heraldic aftertaste reechoed pocked inconcealable twaddlers perpetration burnouses marrowbones wived tzimmes intromittent dragooning euchring docketing anting enforce beefless madders fountained forevermore sorties valvar ulcerating turd strawier yodling freeboots boggled petting mortisers unpiles aftmost overestimate fennecs batiste ringtoss curari asks monosyllable declaimers ophthalmological alarmists jargoned commons obverses skidding gargantua clockers convincingly civilizing skinning arbitrating hydrogens bowdlerizes waywardly satisfiable deliverers enactors nonviable jutes whoopla contrived lapser bestrewed oblately lowered universalized siziness proscribes psyches overcompensating corners barware viridian priedieux goons hematologist logjams viscidities ravener articulated administratively burweeds aviating predicates lawless blunted untenanted armband reincarnations concubines mutability anthropologist domineering drapeable menhir humped pertained futurology gracefully marauding steeplejack disorganizers towing brainwashers fleeced centrifuges undiffused disruptively birched ammonias strangled prepossessingly watered herpetologic cembali snoozy exteriorized lyrical heritabilities purlieu baboos cones symbols titers crookery theories migrators innovative prejudices slices papist slipforms frumpy validating hitching tartuffe gummiest marimbas piazzas somniloquies receivers oafs semidependently"@zh ; + bsbm:rating1 "4"^^xsd:integer ; + bsbm:rating2 "1"^^xsd:integer ; + bsbm:reviewDate "2007-11-03T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2007-11-04"^^xsd:date . +dataFromRatingSite1:Review263 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product23 ; + rev:reviewer dataFromRatingSite1:Reviewer14 ; + dc:title "ritziest depiction consolidator cert reconcentrated misbiassed dividable doubly gossipers" ; + rev:text "cinchonas sinuated untoward hatting mastectomies heaver scrupling bombardments immorally plutocrat dissociates birchen convalescing leafstalks greatness sparkier greeter bowwows shirkers romantics untethers hawkies shortchanging downers nouvelle cosmogonist mocha frizzlers superber navies girlishness shrivers grommets technics swooning colds sallied loppy taped bandagers playacting ratiocinates backlists chronologists polluter reconnected retaught humidified wallas acetifies monomaniac subdepartment hombres misspend lobotomize cosier radiotelegraphs moaning forebearing ballers espouser capping xxii copiers implications ripeners raja insecticides interlaced philosophized confined storybook fulminating excursions cirque traitress reflectively speeds rimers bananas shamans shallows sternly christs miscounted centrums ceria dissidence choreographed latvian reenlightens illumination kopeck zoologic tricorns voidness cloning gustoes soothingly nonexpendable mews prohibited deficits bachelorship allegers reinformed discoloring autodidactic unextinguished gyros malleableness chronographs embittering scabbed solubilizing unwashed lucubrated windstorms celling nondelivery senses intravaginal contrasts luckiest resistent micromanipulators puritanical taboos arrayed interning remonstrates federalized disinfected bellworts retouch foreknow ecosystems rebuked bedouins restoratively psychotomimetic planting muffled wobbler helicopters condemner abrasively willingly pally argyle emborders untypical noncontinuation unerased nominating betrothed childishly sifters combusted chamises purplest sanctums shiningly kooks califs outmarch karakul reviews ecrus supplementally unfenced grottos applicators hegemonies benzoins encephalic durns modulatory melodizing"@zh ; + bsbm:rating1 "10"^^xsd:integer ; + bsbm:rating3 "7"^^xsd:integer ; + bsbm:rating4 "8"^^xsd:integer ; + bsbm:reviewDate "2008-06-15T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-19"^^xsd:date . +dataFromRatingSite1:Review264 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product90 ; + rev:reviewer dataFromRatingSite1:Reviewer14 ; + dc:title "pariahs delegacies bezils angularness unfeigned cricked laking soapboxes smirched" ; + rev:text "conservationists protoplasmatic toilers nonaffiliated rightfulness nuptials honers supplicants salves runner thickness crookneck nondenominational lynching uncensured cicelies boucle dodoism prefacing wader defaulter repressibilities topologies umpireship truancies mounted cantilevered disclamation epithalamium transposed precalculate yemenite gulpers mentation inclemency autumns insubordinately navahoes lodestars occurs phalloid incremental marshmallows discursive prodder mastectomies nacred supposing huntedly offenseless loiterers espies embosses dinning tussling curriers afterimpression venire unpacks reimposing caboodles gamed maculates recommencing trematode stonable oversimplified padishah unkosher corgis ligaments emigrated cagiest promontory emergence pastilles tantalization handmaidens rontgen foremast gunships graphitic describing used subprincipal acclaiming steaks undergrounder castigators rashly royalties turndowns muckily serrate ascribable anilines battlements ataxia legionnaires coprocessors liquefies sideswipes lucite compressively trijet synergically untangles unbox grunts evidently sanitarian groundwave foamier cambodians misprint reassembled evader symbolically myopically nonsignificant arith grandtotal sagiest pseudoephedrine bogyman chaplets sepulchered milking pagodas vinculum mitigative scuffing"@zh ; + bsbm:rating4 "4"^^xsd:integer ; + bsbm:reviewDate "2008-04-26T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-10"^^xsd:date . +dataFromRatingSite1:Review265 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product70 ; + rev:reviewer dataFromRatingSite1:Reviewer14 ; + dc:title "pipy tenderfoots refilms overheads gratia empaneled" ; + rev:text "payola filches slated corers hogs banderole elegise reposing overembellishes fettucini balloted cardiacs rainbows promptbook fetishists evener cloudbursts lambed modernize revenged exorcisms draught pyxis loincloths overcompensation grabby kilobit misapprehension minimizers trumpeters stetsons ambled isobar bemoaning kadis amperages revulsive stintingly unsightly unpropitiously undistributed swindlers sodomites weathercock luaus diversifies plumpest sectionize cymose mirkier moorings accused elementarily nonindustrial nubbier extraterritoriality revictual elses greasiest exploding hookier coitophobia parathion hotelkeeper vower roulade missorting shanghaiing frenzies hellenists parring centralized perfection baptisms clinics downloading quantizing distillable disestablishment straights cicatrix petitionee obligability gushers fauvisms wiseness pauperize girthed terrenes bothered fusibly waking corruptibleness sanka wickers lapps pews preinstruction nymphet eyepoint macrocephaly tickled mumbletypeg knouts daystar dredgers inchworms backslappers unapologetic ostensibilities rishis mantras cumberers surveyable beeriest cassinos expatriate paisleys ergs essayer migrates ejectment chiffoniers implications echoless fetishes migrator munchies diapasons prods rabbinical wattles anticoagulant accompanists signore prefabricates dishful officiation stamping rollaway arcades opiumisms triturate overearnest diffuseness rambled diarrheal conceptualizations bunker truncations analogies bootlickers rupiahs laager vinic likeable cutlasses eroticizing decaying epicanthic vectoring swifts worker feigned atheroscleroses rusts plater amnesty extruded closely nonplus flowerpots reappraisal commanders pima hurricanes ribbier cabinetmaker vilest booboo dolomites sapor arsonist uvularly inseparability windmilled pelorias readjourn malignities powerhouses subassociations"@zh ; + bsbm:rating1 "9"^^xsd:integer ; + bsbm:rating2 "3"^^xsd:integer ; + bsbm:reviewDate "2008-03-22T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-04-25"^^xsd:date . +dataFromRatingSite1:Review266 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product65 ; + rev:reviewer dataFromRatingSite1:Reviewer14 ; + dc:title "changeful ottawas sparking keeper trackers unmorality modernness commiserative nutcrackers semiresolute samechs grograms peddler" ; + rev:text "charred farsightedly imponderability irking dashpot dispirits abjuring profitably microgramme fornicated pts dredged lackeys mongeese reruns discursiveness alights extravagance aliases refile rebelliousness mnemic barristers dedicatory graced precancelled dockhands plagiarisms dataflow annoyances jealousness refrained holisms confidences adroitness miladies pejoratives trifler bounding choicely untouchably accompaniments acquitter underbrush analgesia missus putdown transactional provosts quatres symbiot spoofed zebus muskily knockers oyers damagers overtake kerbs mopping crofts swankest volcanologists adios mammals bares detailer thearchies clocking ursiform gov malarkey besmircher secreted comported sevenths cuttages horsily sportscasts staffed interminably disannul anybodies redistributed clitoridectomy firstling lacerations hypertrophying undocks geosyncline reference richest woodbox postally quarries ratted dimming frozenly carbuncles shelving contractibility bores flavour welchers queues consummating hoses secessions bettors morphogeneses paterfamilias digesters datcha palpitated nitrators pimpled moppers yachtswoman ungracious pewits"@zh ; + bsbm:rating3 "8"^^xsd:integer ; + bsbm:rating4 "8"^^xsd:integer ; + bsbm:reviewDate "2008-04-22T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-19"^^xsd:date . +dataFromRatingSite1:Review267 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product60 ; + rev:reviewer dataFromRatingSite1:Reviewer14 ; + dc:title "nattiness roguery checkered pharm outbid jojobas parties deselecting" ; + rev:text "scents expiated crevasse boodled ineligibles keyboards reburials shippable demerited recap flits unmaskers peeved baronetcy millimicron semiprecious comperes mensurability settler landfalls buttercups scape foremasts cheers loamiest reenter blesses wishbones bossier infielder hourly causals enchiladas geoscientist anodizing trailers feminized elementally spanned deaccessioned flambeed counteractively coats vapourers frowners imbalances remissness limburger trouncers gannets shuffled assemblers sikh medics duplexes outboast impersonator drifted midnights immolations aquacades possets incumbering salacity objected aw hied obstructionist infringers unapproving linseeds escrowing croissant chagrinned cryptos ambled surfboard impalpability hawser nonphysiological abbotcies artlessly propinquity zodiacs capriccios beanball counteraction clerkdom demythologize coalyard stemmers koruny terminally choric saltiness bioactivities matriline confraternities platefuls carcinomas inebrious coprocessing peruke needier caters revaluating cyprians forestalling intriguer cabinetwork begriming scrawnier dominus amendable putout jaspers bailie syndicated pangolin biding minuets oversalting lonesomely sageness libelant betels pyjamas puddlers catheterize headfirst abduction recommissioning sneakiness equinoxes instarred suing contradictively silenter spiderier mettled crackly revolted manhattans aunty denigration conquistadors histologists scrimped lilies maculate travois frigged aviso insatiability lantanas renter"@zh ; + bsbm:rating1 "1"^^xsd:integer ; + bsbm:rating2 "10"^^xsd:integer ; + bsbm:rating3 "2"^^xsd:integer ; + bsbm:reviewDate "2008-02-09T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-04-05"^^xsd:date . +dataFromRatingSite1:Review268 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product84 ; + rev:reviewer dataFromRatingSite1:Reviewer14 ; + dc:title "aromatically cumber racialistic illest multifariously" ; + rev:text "haver cloisters tarried harmlessly resembling lanolin priceless relique marrons honeycombed winned chariots shriekers compilable fleshiest traduce stonefly hooter citified jujus chickens ecotype summarization bemires confessedly proliferations hellion credence gabbling exemplification nubbiest forfeitures craping mites sunglow enfranchised melodeons doughboy parameterization hautboy crumpled frescoists forestall evidencing jailbreaks neologies chicly nobleness outlivers weevils impacters scoutings exploiting titulary maltreatment simplexes iridiums corroborating boniest valuators diacritics panzer ringed preannounces households stamps actualities outsets storytellers unmended ambuscaded encroachment machetes melancholic metatarsal antiquing loppers rapists preinserted powders simulations estopping correlating enuretic modernistic dramatization nosedive crookery doorstops disaccharides becalms towrope fiberizes eventides paradoxically accosted manless recrosses inflation smiled curtseying communistically twinging compensating centimos modeler biparted mux girded nailing haute quilters temporizers fowlpox apostatizing bilateralities declaimed belittler inoculated beldame bookmaker"@zh ; + bsbm:rating2 "4"^^xsd:integer ; + bsbm:rating3 "4"^^xsd:integer ; + bsbm:rating4 "4"^^xsd:integer ; + bsbm:reviewDate "2008-03-06T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-23"^^xsd:date . +dataFromRatingSite1:Review269 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product52 ; + rev:reviewer dataFromRatingSite1:Reviewer14 ; + dc:title "equated consequently traitors dybbuk yummy elands nazifying blusters" ; + rev:text "torte appareling unnerves satisfactions complaints alliums development microcopies angas tabard ay teamsters cryogenies profaner figurative destroyer hobbles argentum hadrons bushmen requirements southpaws inviolated unfruitful breezier broils purlieu plunking drifts suspenders inlier recurrences devisable entrapping finagles beechiest desexing mutating bulgarian ecclesiasticalness extraterritorial hesitations mailers fairing cockhorse mitzvahs anastomoses martialing appurtenance avoiding chatelaines outswum lucrativeness miscognizant belonged laser reverifications pedestals oversoul mercery whisperings transcribers cowed melancholies thinners reprinter scullions knocked bicorn youthening mores agarics stooped salvos realize puffiest blunderbuss woolens detonated atmospheres tartare repining figureheads craps doozies indemnitee underclothing ulva schooled configurational hypotenuses trader reivers presager centripetally rigor retirers contacting ossifies capitalizing extravaganzas pupfishes waking inherently thicknesses braizes boob discusses"@zh ; + bsbm:rating1 "8"^^xsd:integer ; + bsbm:rating3 "3"^^xsd:integer ; + bsbm:rating4 "5"^^xsd:integer ; + bsbm:reviewDate "2007-07-22T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2007-09-09"^^xsd:date . +dataFromRatingSite1:Review270 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product38 ; + rev:reviewer dataFromRatingSite1:Reviewer14 ; + dc:title "manager jouncy adytum nympholepsies straightened whipped falsest degradedness" ; + rev:text "ryas spelldown groundwave ankhs coarser nervelessly listenings stalingrad plusher porosities globose restrains decidedly assured proves eyeable scrutinizingly unseeing subdirectors laggard muttony sextuples jimmies pining elevators chafferer dozing marshaled swordsmanship repair rethread dissolutions reconciliations forkful preens wittiest ritualistic arabize confetto epiphytes disrupting motliest infertilely ginnings eviscerating murders prepay preceptresses spiritualize sicks scorer censing curtseys pitchy skiplane crusting napping illumes sassies deplane nativisms outfielders catamarans stolider uncanniest gimmicked tippled syllabifications eroticize drownded roux camphorating crests nervelessness escorted baptists attemptable gatekeepers protozoon mezzos airmobile legitimizing statuted lustier havocs picks uniting balks lopers pavan seabeaches antlered tallyhoed narrows merits habanera rehabilitator"@zh ; + bsbm:rating1 "2"^^xsd:integer ; + bsbm:rating2 "8"^^xsd:integer ; + bsbm:rating3 "2"^^xsd:integer ; + bsbm:rating4 "2"^^xsd:integer ; + bsbm:reviewDate "2008-01-19T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-01"^^xsd:date . +dataFromRatingSite1:Review271 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product28 ; + rev:reviewer dataFromRatingSite1:Reviewer14 ; + dc:title "diadic infectiousness oratresses heiresses interactions indues predusks ululations foveate politeness animadverted counterinsurgent opener awaiters" ; + rev:text "troublers turneries virtuosas punier heedful maharanees slotted reattained invocator whitecaps nefariously requisitioners sinuses depressives accuser bathing cavitied brawlers benzoic afterwards recirculating piny aahing gaged truckload merengue tithes studbooks fellatrix neurotransmitters junkmen pestled braggarts canoeing handier mentalities quadrupeds cityfied gasman laicizing leafhoppers disaccharides sipper kevils dreidl beleapt semicircular ikon rampages amputations sloes cautions unthinking unassumingly oversimplification philharmonics app stockpiling trices jocularity rainfalls redwings militarizes adventures sniggle ingenuousness pulings castoffs greenhorns rodenticide catharine viers"@zh ; + bsbm:rating3 "1"^^xsd:integer ; + bsbm:reviewDate "2007-08-31T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-04-09"^^xsd:date . +dataFromRatingSite1:Review272 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product65 ; + rev:reviewer dataFromRatingSite1:Reviewer14 ; + dc:title "duteously transcribers deveining cowpat releasability" ; + rev:text "relies untasteful mulling sensitizes pippin countersigned desexualizing cognoscente extremeness manacled roughed nourishments regurgitating prehardens foredeck coated leerily nappy congeals expansionary dost hookedness conciliating unneedful costless nuptially timeworker plagiarize wharfinger spaced psychodynamic smallholder copulatively outspreading songfest abaci violators curring reversely expectorator canter wheezily pewterer rusticator indulgence trunnion syphon sutures aerometer disorientated equitant islanders widish prizefighters auxillary billiards semiaquatic forgoer compares inquirers stainabilities immutably reliving tup fiddler calcimining nondiscriminating inaner proser frenched occluding smudgier unguided shivareed confederations decrier sidepiece outlast shovelled dared digitize addles trainsick equivocacy boastingly bookrack fractionally matinees unshapely bemas tourney chasses pressurize dependence artistes tusking interdenominational antlike nonanalytic activations simp tributes devilry"@zh ; + bsbm:rating1 "3"^^xsd:integer ; + bsbm:rating2 "3"^^xsd:integer ; + bsbm:rating3 "3"^^xsd:integer ; + bsbm:rating4 "8"^^xsd:integer ; + bsbm:reviewDate "2007-10-02T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-22"^^xsd:date . +dataFromRatingSite1:Review273 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product57 ; + rev:reviewer dataFromRatingSite1:Reviewer14 ; + dc:title "collegia declassifying caftans borstal" ; + rev:text "rappel vitalizers unconnected debarred sidehill magnifiers vaseline muling subtrahends kilovolt paradigms nieces cartels calmingly coinages blistering scrounged nonmalicious giddiest capons interdistrict bowdlerizing misspeak instructions disinfestation disinherit coalboxes braggadocio pulverization augmenting otherworldliness vegetarians trestles glaceing inkle sharpy rinks paperer mustily impersonated navigational peeks threesomes fossilization cons reinstalling cleverness overlapped heedless iterations hefter alterably overdecorated sprockets elitisms queened rephrase berbers meanest likeness inveteracy sippets blotting loppy trundles unfurling"@zh ; + bsbm:rating1 "9"^^xsd:integer ; + bsbm:reviewDate "2007-11-21T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-01-04"^^xsd:date . +dataFromRatingSite1:Reviewer15 + rdf:type foaf:Person ; + foaf:name "Kirtana" ; + foaf:mbox_sha1sum "4f847a257dac989e7513215cf3a542e5a5ff53" ; + bsbm:country ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-07-24"^^xsd:date . +dataFromRatingSite1:Review274 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product47 ; + rev:reviewer dataFromRatingSite1:Reviewer15 ; + dc:title "trafficks toxicity colorer snitch" ; + rev:text "manes vacating competence persuadably flexile halavah influenceabilities kist quadroons gunroom questions disassociates bitterer bullrings courting unhandy beneficially psychodrama robotize girasoles gofers rejects sublicensee mazily hosiers frivoler superiors demythologized authenticated playbills decasyllable greco microprogramming jawboned fen cowpats alpaca blockhead semisatirically slithered perishes embattled shorteners chowchow retrimmed forcefully egises enviably guldens replace vocalists immortally overexercising deliverables virilizing freshener hamiltonian currycombed excerpts egocentricity entitled gnattier gumtree leukemias blamers tooting primps transports hostages opacifies crescents hexads victims revaluated fuzzing paradisiacally preconceal thuggees roscoes cued feckless ameliorated reshipped misguidedly scrag registrability hullers vapouring endnote evolved solidary coagulating truculence serialize brewed hardens reoil immobilized pidgins boors blazing demonstrational distracted disorganizing greeny nybble dagos redeployed nasalization babuls trousers corroded jalousies elephants gnotobiotics densifies encystment valval meatiness deaconry slopwork crystallizes crinkled invalidly pothooks antispasmodics solvated urushiols sequency seconding profundities skywritten truanting nervosa antipodeans dodoes galvanizes tetras subatomic cutdowns stomaching dingle higgle bassets eliminations lockage librettists uniting crumbliest cryogens entree underrated mirier rubier psychedelically comedies impressions bioscopy maximin ownerless afflatus intended rosters wingovers redid movies masseurs manacles devotions misconstructions enfeeble"@es ; + bsbm:rating1 "10"^^xsd:integer ; + bsbm:rating3 "4"^^xsd:integer ; + bsbm:rating4 "10"^^xsd:integer ; + bsbm:reviewDate "2007-10-01T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-01"^^xsd:date . +dataFromRatingSite1:Review275 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product58 ; + rev:reviewer dataFromRatingSite1:Reviewer15 ; + dc:title "periscopes wherefor preschool download autoeroticism dislodging paralyzers enditing" ; + rev:text "cumber uselessness prises combaters rewording domiciling demitasses cannabin reimposing dashingly sleaziness wearier capitalism periodically ridders potentiates chlorid dismountable eolipiles vociferation versant cartoonist tariffing traipsed genuflection congruence kites keypad recombined guarder kefir monotones microfilms junker banshie duffs witnesser jargonized impugnment intruding nonstriking taboret incapacitated sermonizes trophying comestibles newsrooms tryptic windlass lymphocytes manger castration lunkhead sunsuits ambivalently peritonea coatee collapsed reify exhibitionist retransmissions unzealously isobar rondure metamorphosed prohibitor ladrone outweighed protestants dispersing malodorousness renting rotifers unpicked measurability retrenched wafter brushwood muffles necrophilism retyping nasalization satanisms toured glabrous prevalently tetotum requirer physicochemical undisputed pretaste disgracing gushier untranslated tackily enclasping beseeched cashed gaffed phoenixes spikier rubberize tapers hugest indonesians angularities scottie trousers ekistics singletons mended portioner provinciality comprizing tootling manuscription agouty uncapped trustbusting trets divinest precalculate undisputable granulation angelical strangeness misdirect forehoofs reformats hostessed underfed foamless subleased habituality endleaves nonverbal antipyretics bacterially habituality leashing friendliness lensed disfiguring frumpiest feigners adjourned knolls mastoidal selectus weskits outvoting cradled romanticization doxologies garcons twirliest credibilities tabernacles mayflies collaborationism runnels xanthates louped menstruates confusing yacks desugar durably cadging overflow dialyser"@es ; + bsbm:rating1 "7"^^xsd:integer ; + bsbm:rating2 "9"^^xsd:integer ; + bsbm:rating3 "6"^^xsd:integer ; + bsbm:rating4 "7"^^xsd:integer ; + bsbm:reviewDate "2008-03-05T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-04-03"^^xsd:date . +dataFromRatingSite1:Review276 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product46 ; + rev:reviewer dataFromRatingSite1:Reviewer15 ; + dc:title "ointments albumins signalmen runner institutions" ; + rev:text "wenny bulldozes territorialize penalize mirier unplayed arisings brickiest tokenize hypothesi grapier comely deportable indigents pacifists thuggish hindered beamier warhorses instituter nous breadwinning overpraised minuteness antiaircraft deflators rayless enrolment surrogacy premieres taskwork byproducts cordovans redemptible rockery uncoupled chorusses metalize decadents mercerized doctorates midribs truffled illumes embowered antisubmarine indexes sills ashamedly dozenth misdated cyborg conductibility noddles witlessly undeterminable noncongealing bigging kirtles allergenic mettles confecting nacelles welcoming tutoring enactments hydrographer waterlogged zulu quicker eked emulsifiers forjudge highths wattled leafed falsifier educations conquerable fonds payoffs oversevere outfoxed milages ailanthuses actomyosin pennyroyals aspirer reassimilates recidivists preplanning acquits checkoffs jestful disconcerted sightlessness purply recalcitrancies reimprisoned disability ensilage antioxidants outgoings mystically smuggling dumfounding approachers dehorner disencumber pally gasiform"@es ; + bsbm:rating1 "10"^^xsd:integer ; + bsbm:rating2 "6"^^xsd:integer ; + bsbm:rating3 "7"^^xsd:integer ; + bsbm:reviewDate "2007-07-18T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-01-28"^^xsd:date . +dataFromRatingSite1:Review277 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product85 ; + rev:reviewer dataFromRatingSite1:Reviewer15 ; + dc:title "sallies scragging metaled giants traduced redeposits participation falsification patriotically christianizing retying ripostes shuckings captainship portiere" ; + rev:text "spadefuls exertion bards smiles inversions butches pyloric homeopathic symboled exhalent manifests popcorns factitiously lusterless tabourets dovetailed reservers pastorales astonishing molluscan containments instigators goboes deciliter cashable rasper plurality disembarks confections emergence clinics kidded geoscientist bugbearish repaired querier kummels wrapper manhandled bubbies budgies savings inceptors deniers nosher djin misdoubt lively lithotome sneering pallbearer nothings wincing airsickness pamperers ethanes accumulable noncarbonated diagrammer separative pulleys incipience customization assentor grange barracked inadequacies intermediately forenames cambial seekers enables viceroys gamesome midmost chartings manfulness typos miniskirts wittiest invalidity presifting eightball meltons alienages mislay trending misdiagnose connection welladays subrace antiqued belabour isostasy gobs shortchanged ketonuria scions footrests talkiest zingiest persecutors chunks intercapillary hurriedness discuses argyll bobtailed millable tabarded aardwolf unfulfilled activating distinguishes agriculturalist rhumbas languorousness intersexual nullity infesting staking birchers moniker priestliness therapeutical savouriest vastly reaccents milage protestants rebating glassmen secularized nonintellectual sentimentalist teepees called township goateed windable philanthropists weatherstrippers puffier toadyish slumbers thyroidectomized shillings transitional yummy unciforms pawpaws decked yogee favorably hauberk im condoler trowelled anticoagulants snapping boomtowns gutsiest decimeter pouts corrupter cleaver germicides solidary intersession preappointed queaziest pylorouses defensively enriched jimsonweed owners casings rooting subsided doorsteps sutras clicks janitors parallelling capitulating youngling durably fosterer interred whippoorwills"@es ; + bsbm:rating1 "6"^^xsd:integer ; + bsbm:rating2 "5"^^xsd:integer ; + bsbm:rating3 "4"^^xsd:integer ; + bsbm:rating4 "7"^^xsd:integer ; + bsbm:reviewDate "2007-12-03T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-02-07"^^xsd:date . +dataFromRatingSite1:Review278 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product75 ; + rev:reviewer dataFromRatingSite1:Reviewer15 ; + dc:title "gassing indwelt phobias barlows unraised dispose spinny ingresses shirr" ; + rev:text "annotates darkled sightliest conjunctions impellors males continually sancta transliterating consists reserves feyer zingers trickier wornout noncohesive soaps engaged chutists farads bestows reporting ringing cudweeds contestably quarterlies vertexes awakenings cosponsorship misreported nonsocial really snooker genomes mesosphere unappropriated unlikely exhilarative drudgeries mineralizes corers eversion normalize excellently denigrating unpin genotypic slags moussaka capably declaimers travailing dunned satyrid disquietudes riche coverlid replication unimaginably reproducers mergence commas fosterage absurdest gulch irregulars stampeding nonfat international preschool mineralogical rigmarole righty goldarn biffing fluoroscopists scented tongued shivah gregariousness acidhead beets firetraps lovely risings accessibly wampum missorted eikon etiological currents entree reassimilate poses mouldered reconsecrated nips voce miscasts debaucheries massacres constructionist unwearying accompanying drizzlier regaled guatemalans leipzig gunsmith ignitible confiscators inspection primero poundkeeper glover fibs biters xviii gunboats watched patchily misbeliefs cinquains freedoms marveling abruptness veepee easterlies pewterers moneys profitableness chuckling daylit procedurally ensnare missort canallers gossipy"@es ; + bsbm:rating2 "3"^^xsd:integer ; + bsbm:rating4 "9"^^xsd:integer ; + bsbm:reviewDate "2007-09-27T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-03-08"^^xsd:date . +dataFromRatingSite1:Review279 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product65 ; + rev:reviewer dataFromRatingSite1:Reviewer15 ; + dc:title "playmates hidebound sensitometric lassitudes swabbie tideways perpetually" ; + rev:text "develope horsetails whiteout gesticulations beamed worker resentfulness estimation bibelot issueless redevelop whirring skeins applauses panegyrizes ocurred reposes supertanker myasthenic dyarchy clammily ochrous theocratic emulsive baths garbing grandees bacteriologies bigfoot avalanches chitter rancors jumblers causers stager gyrates retrocede desexing halftime thinkably gassings guaranies credentialed fragmenting artless abjection denigrator foulard alated watchwords allergenicity provokes censors abased desensitized frontages recognize genteelness fids states unfaithfulness challengers regeared rufflers reproofs badgered"@es ; + bsbm:rating1 "2"^^xsd:integer ; + bsbm:rating2 "6"^^xsd:integer ; + bsbm:rating3 "7"^^xsd:integer ; + bsbm:rating4 "3"^^xsd:integer ; + bsbm:reviewDate "2008-02-29T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-03-12"^^xsd:date . +dataFromRatingSite1:Review280 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product38 ; + rev:reviewer dataFromRatingSite1:Reviewer15 ; + dc:title "prestigeful chording inwrapped millibar keratins undiffused selectiveness belching" ; + rev:text "scrolled leafless voyeuristic lorry compressibility redivide chintzes seabird watching explanting inculcates unisons colin cowbirds rededicates exhaling mitts venire imprints diviners fancies unclench narration telegrapher lactobacillus jubilated belts bastioned pintos archway muttered reseats bartered stiffener honestness useability bonier comfits restorativeness unhorse macerater insurgents puncheon leavening snubbier homosexuals mellowness remelts constitutions oculists delimiters symblepharon votaries officiality glutamates eschewed trivalves welcomes fishmeal tithers motional traced hypoing guilder mistakes computerese supplies unjudicial subrule hegemonic subsidizes aroids microsurgeons yeastiest calcifying inaugurals plebescite sloucher clubs extorting peones proadoption enjoyments hagborn megadeaths unresigned underachievers hospitalizations reinvestigations teardown unadvised gulpers foots footropes puddled relegated colorable alliums tasseling biodegrade bints bizarreness purling dynamiter inwardly adipose reallocation nostalgically mushed flushest infields whinnies manufacturers alloyed redivide reduplication manifolding wavelengths metering vox signee slops substation blooded based heroized indoctrinations heliotropes sexualizing depopulate merriest lunchers shutterbug refinished unartfully slurping resemblance undrest salaaming leased altarpiece preponderantly sultrily sentineled exonerators hagrides agronomist moroccos statecraft infertilely distr gastritis fastness prepossesses monist transducers methodizes crams sociables dominoes importunateness transferal mutations bemires tilling godlily ventral yolkier spiritualized solido marrowing adapts regerminating intermuscular redrill unpenned occluded exhumed prohibitively accelerable designers smuttier aerodynamically"@es ; + bsbm:rating1 "3"^^xsd:integer ; + bsbm:rating2 "8"^^xsd:integer ; + bsbm:rating3 "1"^^xsd:integer ; + bsbm:rating4 "1"^^xsd:integer ; + bsbm:reviewDate "2007-07-05T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-01-15"^^xsd:date . +dataFromRatingSite1:Review281 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product64 ; + rev:reviewer dataFromRatingSite1:Reviewer15 ; + dc:title "accuses retributor reletting contextually licht maintainable porpoises conger generalizing bazaars unbolted poling naturalize" ; + rev:text "subconsciously censoriousness explorer retranslates undervalued uncharacteristic emptying shelties lumina vivisectionists attitudinizes turmoils orthopaedic peakier anchorites incriminates violently vaccinates surreptitiously flatteringly foundered stiffener inexpressibility inductively drainages henceforward reinstatement nonredeemable screwing chastening chorines serialized headstands protection fetishistic virgos empalers wideners dibbed slaughterer koruna revelling spherically luna equivocations barbarians flenser hairless oxtails nations urologist nonconformism awaking heraldry preplanned amoroso corruptly biologist priviest ranter cryostats cuspidal vasoconstrictors pinker withies vaporishness boomed reseals construable onager mobilizations ultraist claustrophobiac machinize saturating tenderers rester pillions prolapses shouter refractive jeans packinghouse antimonies pseudopodium flowerers tiffed carman excursuses relinquisher untransferable kakemono hasps trusters syllables bracer yerba porgy pleader sequentially prevailing penlights lacework loggier finagles tumuluses wharfing spenders pilsners erratics laking climatotherapies mistrusts bawling yerba spectrographies recenter lade submergence deems complication resentments honouring instrumentalists identifier entree cryptograph answering hest anorak oculists yeasts surceasing uninformed townspeople flaming emersion scallops obfuscated surrendering muckworms swingier geomorphology holdovers outsell unsatisfiable halftone numerators broadening yeshivah scarless provocations sickness caroming wavebands penname bowels noncausally comfortable slots covertness brickiest millimeters unmooring avoirdupois lapdog prearrangement scribbles stockier secludedly aggravates rectangularity awninged bowwows gardener huskiness equivalently tensive argyles ails climates peruses civilizes chillers electrocuting tabulator deteriorations trumpeters nosebands elfishness miasms taws"@es ; + bsbm:rating1 "8"^^xsd:integer ; + bsbm:rating3 "10"^^xsd:integer ; + bsbm:rating4 "9"^^xsd:integer ; + bsbm:reviewDate "2007-06-30T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-04-19"^^xsd:date . +dataFromRatingSite1:Review282 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product52 ; + rev:reviewer dataFromRatingSite1:Reviewer15 ; + dc:title "physicked kronor outlaw intermissions backmost diestocks schleps" ; + rev:text "devises dendrologists forwardest bused pyric reintrenchment balances likeable savior gelees terminological caretaking contemplations allegiantly grows labors mechanistically desalt imploring unexpressive mopier thermoreceptor periling betted convincing quantal unfolds incorporators disputation importable campstool goodbyes formatters propagandizes optionally techie jesuitic stinkers erotism outcastes cauterized deviance naturopathy exhibits openers chumships fatso deviltries demanded refulgent pulped smelter blamer accrues remounted pressurizing ataxic grained pistillate fullers compactors cancerously equinities bridler rational paws tubeless clangs contractions tumefies politicos unfavored intervals pesterers baptisteries antinovels skeeing bulbed turncoats counterpane euthenics stinginess enfeebles evangelists dangered talebearer recontract universally cookey baptises assortment elkhounds zeins quelling decentralizes halfheartedly wheelies lurers grassplot porcelains stodged goalposts aliner dithering aunthood photoelectric outscore clashed oceanid campiest bagpipes bozos squatty dominium reinoculates irrigation lingeries unobservant avast amassment reassociation shuteyes triadisms captains terminuses ethicalities zabaiones vagus guaranis baggie diagrammer morphinic insincerely unspoken grandad separator outguessed wurzel carat polemists americanist botanize nationalities pliancies soothsaid shoplifters easterner currier brocket resoled aqualung preexamine fisheyes stickpins colored sloughed penile endways motey pagesize unanimated botulisms intransigence ghanian imaginers discountable fonding preprint circumlunar nonmen reexhibits worthies salvager craftiness barbers adumbratively substanceless"@es ; + bsbm:rating4 "2"^^xsd:integer ; + bsbm:reviewDate "2008-02-24T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-04-19"^^xsd:date . +dataFromRatingSite1:Review283 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product43 ; + rev:reviewer dataFromRatingSite1:Reviewer15 ; + dc:title "mousetrap assailants sorrows hexahedron repeals shoetree ungentlemanly" ; + rev:text "mannerly nervousness palatial bullwhip prognosticating catgut unworkably auditing celibacies petiole peepholes uncooked roomily overman symbolizing facetiously hobbler beautifying culotte specking relisting cutey danseuse crying peart scholastically strengthens casette epistolary waggling dewfall massedly sleazier primogeniture unsteadies unmake unidentifiable insipidly stroganoff borts onanisms pulpily lobotomize ephedrin timbers herbaria networks antithesis manoeuvred kinetins kingship maladministration pitiless shags staggy reactions panegyrical staved concertos shutoffs selections misadjusted presided boneset cadmic understandingly homographs pecuniarily ambitiousness howitzer bludgeons iranians regears psychosynthesis peyotyls insoles solubilities unhappy somatopsychic sizzling unscientific vasodilator whipper unsaid wheyface princes trituration abnegator dentally rigueur decoyer blotto intentionally crossbreeding irishwomen intersection humpbacked specialist magnolias incliners ohs queues tackify bailsman bewrayed fitted motorists gips moistures downsize spanking corning gloam acting unfaithfully shuffles cramming"@es ; + bsbm:rating1 "5"^^xsd:integer ; + bsbm:rating3 "6"^^xsd:integer ; + bsbm:rating4 "8"^^xsd:integer ; + bsbm:reviewDate "2008-05-16T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-31"^^xsd:date . +dataFromRatingSite1:Review284 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product44 ; + rev:reviewer dataFromRatingSite1:Reviewer15 ; + dc:title "playacting tintypes inkwell terrified hydrographers peritonitis kilties tricepses margent provolone eruditely erica parrakeets dotier" ; + rev:text "beamless portentously steaks garrotted griffons motivation fantasize daringness despisers drags remonetizes caddied passes bibulous gutturally dogfight rulers listens camper galloot wiping overdecorates haziest mucilaginous mushiest decimalizes episcopates interning eductor unpasteurized trustiest achievement clownishly theomania resourcefully urbanest dangerously mauritanian noncyclical vicegerent overfatigued gamesmanship contortions locative sadiron localizing shuns juryman lifework exchanger coloradans worrying torturous teary viragos intercession wagers dioptre sorts conditions flashbulbs regrow nuke voyaged greens daddling chapmen virginally overdiversification grapplers ceruminous cloacal cuffs inhalers toddles vistas alienages correctness popguns verdures doziness eunuch revenger christs beachheads realizers trephine gangues secluded capos quirkily flags detoxifies popularizations veritas deepness storylines scrubbers epicenters gratification syncopated crockets polluters overmodifies nodding whiplashes miscibility barhopping towaways faying tanyards endangering documenter nucleons anearing dorsals presidents wrongdoers slenderize wants armbands sensualism rationalistic sniffled transmuted ingulfs goofily flanks unsanitary advising funnelling bonitoes colanders ginning shriving babas landscaping mislabelled airsick etherized favoring transitorily cardioids viciously homeworker bureaucrats overfills vignettes tiffing seductress exobiology catspaws cosmically zori bountied foxskin hypothyroids obstetrical sumachs succoring trainsickness croaky squinted regauging railroader"@es ; + bsbm:rating2 "4"^^xsd:integer ; + bsbm:reviewDate "2008-01-18T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-01-29"^^xsd:date . +dataFromRatingSite1:Reviewer16 + rdf:type foaf:Person ; + foaf:name "Viviane-Stephano" ; + foaf:mbox_sha1sum "352770522f4f90c88137a682982764ab9facf98" ; + bsbm:country ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-09-05"^^xsd:date . +dataFromRatingSite1:Review285 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product45 ; + rev:reviewer dataFromRatingSite1:Reviewer16 ; + dc:title "unstableness capacitations glamorizer extermination remail hernias respirations tillage bilges johnnie basements cigarets tunning blotting" ; + rev:text "contemptibly cookware articulationes etiolate napped loanwords overblows dueller shrimpers spinel sedums niacinamide subteens brickier snatchers honorers nohow transcending bagman streamlining tweedles scrimmaged ratably lindens superposition naphtha irreparably transplanted yawner greenback afflicting fulcrums prefigures noncontrollable barded sidesplitting congestions covenanted ramparts casting ululations weatherglasses sharecropping slavishness allheal troths closets condemnation aerators assortment ling pizazzes gillied randier larruped kittened scraping adsorptiveness bustiest rednecks dexterously positiveness slums obligatorily penetrated quired acquits stargazer settleability reconnaissances tuber takeovers bobbling slashed elusion befouled cankering bogyman singles resiliency snorts roan premeditator composing immobilities booed triplicated reenlarging bailouts snaggy nondiplomatic pedler violoncello schlemiel annuitants datedly moistures rockiest freudians yawped wireworms likelihoods dueled materialization trainway bespeaking addax democrats armrests grabens chattier queues meddles perfectability albs informer aport diligence collops bossy amortise ostracizing inletting folioed hemstitch expediences clangs preemptively stainabilities playgirls ashrams peninsulas musicological dynode weepers inexpressibility tackless reprieved brainteasers disquiet ultramarine ukase housesits idiotically devolvements phobias agrarians chirrupy gradational refastened hypotension disserts blastings pasteurize haole wedging tunneller stilly superscription recreantly overrefines discipleship skywriters jammed whoso unstack kited triplexes conoids"@en ; + bsbm:rating1 "2"^^xsd:integer ; + bsbm:rating2 "6"^^xsd:integer ; + bsbm:rating3 "3"^^xsd:integer ; + bsbm:rating4 "6"^^xsd:integer ; + bsbm:reviewDate "2007-09-02T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2007-09-17"^^xsd:date . +dataFromRatingSite1:Review286 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product77 ; + rev:reviewer dataFromRatingSite1:Reviewer16 ; + dc:title "kishkes struggles jordans bicepses preps traumatize refocussing explosions transfixing unsafe decompensations reemphasized maintainability swankier" ; + rev:text "rifler redistributes bailiwick guidances electorally engrailed viand plastics colonially democratize disputing poplins institutors hydropower registership sailcloth sandbagger telemetries unmagnified negotiator transfusional sties achieved interplays sigmoidal reerecting prohibitions birchers quipu overrighteousness constants surmisable colored figurings disconsolately pineal logistician menorrhea episodically cucumbers dandify unsubstantiated carted caudally sirup unloosing parlays tribunals misclassification hymenopteron monarchies ethiopians vertebras preadjusts spryest racketing ropy promulgating imprudently interpretable effluences noontides foreshore expellers xiv overattentiveness besieges soporose infesters subsidizing inweaving refund ionizable gawker lumpen teeny fucked prodigals hairsplitters artistries presupposes venturesomely aspirer tensibly overused soundboard acknowledges polytheism murderee fueller expectorator defense reassemble braising surged syncopation afforests chalks unconsecrated bills wows kidding tumulus unswathing favourers fagged overinterest slicked muckraking undermines disobliges impoverisher designees pinier marketable fights fulfilling petro tmh congressionally usherette lispers gullibly penlight meerschaum illusionists casehardening liniest responds systematizes morning heatstroke multiplies snapdragons adeptest pronating rioter misidentifications sinkers bewildered improvising outclassed scoring exerting gip defier tared minimized defeatist argonauts milking analogic chiaroscuro disrepair unexpectedly unforeseeable stenciled electrophoretic querulously changeovers belligerents repayment regarding countered lier secants infarcted ploughed creepily caters rumbles mispronunciations ashier sassed thwacks"@en ; + bsbm:rating1 "1"^^xsd:integer ; + bsbm:rating2 "9"^^xsd:integer ; + bsbm:rating3 "8"^^xsd:integer ; + bsbm:reviewDate "2007-11-24T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-30"^^xsd:date . +dataFromRatingSite1:Review287 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product61 ; + rev:reviewer dataFromRatingSite1:Reviewer16 ; + dc:title "incidentally secularly agriculturalists respires glamorously disbelieved savannas barrios macrocephalous queenliness adulterates unfortunateness" ; + rev:text "antiquer carnaubas corruptor curviest ants sarong psychosexually weasands clonked challie unhealthiness estimates bemoans homograph misting blackberries terming basins postures haircutter glooms evangelist kludge brainpans peeks worrywarts biomaterial vitamins utensils bookcases periscopes whaleboats blowjob syllabubs reconsign spumier baser sedulousness scampered corkscrewed excluders temporaries populists rallying unemancipated broidering spilled agars felicitated stilly campanology detonating folkway razzed discotheques canadians snarls gammas satirizer overgeneralization boyishness reburial colonizing depressional bluffers effloresced prechilling poleax literalness biogenic doodling anglings feces overapprehensiveness betrothing flitching"@en ; + bsbm:rating1 "6"^^xsd:integer ; + bsbm:rating2 "8"^^xsd:integer ; + bsbm:rating4 "8"^^xsd:integer ; + bsbm:reviewDate "2007-06-27T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-01-25"^^xsd:date . +dataFromRatingSite1:Review288 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product26 ; + rev:reviewer dataFromRatingSite1:Reviewer16 ; + dc:title "coexists amidships sleepings tonishly trumpeting painfuller dislocation engrossing hitched" ; + rev:text "graciousness slaves barracks swale atoners polishes whisking televisional liveable unadjusted furnacing restorativeness congealable disheartened outrider recitations manorialism undrape oxter cosmo ventriloquy sugaring versifies unaddressed reawakenings insurant annuls melanins accordance videodiscs revelator subclassified peps crammers toboggan mirier japes hominid presentiments fissionable mingling sagebrushes reappoints underage deers oratories ghettoes herds antichrist scaled outrageously nearly zags nightgowns bailiwick philistines quartered baizes nonclinical graduations blazonry romanticists slavishly endoscopy diagrammed protozoon gourmets meadowlarks pepper spruces apery topological tacitness nebs squalliest glorifier unhealthiest reverbs costliest barreled noncontraband db correctest woodsman blackthorn cenotaph cliquiest asked infarcts carpers triplicated cartridges unadulterate deviating distaste crispy roused laparotomy paradoxically shrieks phoenician irrevocability unilaterally hypoderm coons leachier prognathous maneuverable blueblack compounder bargaining boodle hexose coffers unrest ostensibilities materializes arboured stoneworks caymans sophs weaved coccyxes reasons eugenists praises shammes nondestructive christianize unsexual plummeting mayflies scrumptiously discriminated unsubstantially tongued estreating wagoned incarcerating watercourses rubbers nicknaming whoopla clinkers hallmarks reabandoning clobbers determined overran reallocates parsed exclaimed unfeminine stretchier notifications immenser dispassionately specificities ruckuses assembling trinitarianism hoarily cronyism leniently whirs humanistic planters undramatic redye machos renunciatory conceptualization microphotographed currycomb occupational scourgers harder collaboration fantast tautologically ambulatories"@en ; + bsbm:rating1 "8"^^xsd:integer ; + bsbm:rating2 "3"^^xsd:integer ; + bsbm:rating3 "9"^^xsd:integer ; + bsbm:rating4 "5"^^xsd:integer ; + bsbm:reviewDate "2008-04-17T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-24"^^xsd:date . +dataFromRatingSite1:Review289 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product61 ; + rev:reviewer dataFromRatingSite1:Reviewer16 ; + dc:title "teargases rebecs footy limekilns ethereally synergistical unpaying hackles" ; + rev:text "cartomancies sunbaked decadently promiser trapezes polishes synesthesia darkness scarier lairds culprits rotating capsules nudniks impregnability converters serially stealthily narcomania sentimentalizing horsewhipping squalling hardily decelerator peals chryslers bilateralistic pauperizing stakes paying cussing eddies subprogram downcourt rapiers trusses shiksa unfeasible executives pods dabbed epilogs lopped reassessing lollers bucktail undercooks litres electrodynamic frappes urination replicating preppies underlaid miraculousness multiplies precleaning litres carfuls fragging hardwoods distorted weathering duello krakens sweetening journalists lanolin dubio marking practicing preregistered juggling woodwinds inviabilities tramcar credulously umping globetrotting appeasing comedians opacified believed birdlimed dramatics buxomer scriveners zeals recover hydrargyrum internationalists uninhabitable triplicated dissects jellifies manometric frostbiting vivifiers fawningly chaoses keepsake listed tartuffes captans overindulging dinned incredibilities regrettably exorcists philters middlings eschewer declassing overworking revives medicals torsions mollycoddlers safes crimpier scalable shamefacedness protuberance lengthiest sluing elaborateness disarticulate contumely reannex reiterating maidenhead elastomeric unleashing veterinaries puckery geoids underhand hams judiciaries subfamilies englishing swigger stressed beebreads reinstatements fooled remanufactures tussock regauges limitable anodynic flameouts scourings disinherit spathal maidservants subtropical divergences grubbiness razing theftproof erroneousness savers curried mammies kvetched hurried gemsbok consistencies hagiography padding putrefies houris subjoin miter officiant arsenous supping comicality"@en ; + bsbm:rating1 "8"^^xsd:integer ; + bsbm:rating2 "2"^^xsd:integer ; + bsbm:rating3 "6"^^xsd:integer ; + bsbm:rating4 "10"^^xsd:integer ; + bsbm:reviewDate "2008-01-08T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-01"^^xsd:date . +dataFromRatingSite1:Review290 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product23 ; + rev:reviewer dataFromRatingSite1:Reviewer16 ; + dc:title "perjuries ailanthuses croquets pontons sparingly communicably" ; + rev:text "insipidly sorrowfulness scurries fineable tufa unapplicable moonstone garottes radiotelegraphic spoors capitulary eavesdroppers acidly celestas doorpost cementing weightier ukelele abashment expulsed readopting gigues recalcitrance charism extinguishing adenoidectomy unspoiled veiling leafstalk knurling detecters curring hotfoots receiptor folklorist schilling proteges scaldic redeems hunchback stearin expanding raptors extrajudicially labourer scantly wantonly voluminousness discommoded resalable spermatocidal mademoiselles warhorse prizer groundling susurrations propitiating evidentiary razee elegance romantically ammoniating cooingly thunderbolts tuckahoes disavowing clanked limpidity glutinously distastefulness julienne deviances crackly civically skiey hallowers hoatzin dybbuk belittled sappers levitating deprived ridging locker flybys surveyable lachrymation maziness focally bravure riffled openworks slipslop arpeggios chapping maharishis biophysicists felinely dona minds"@en ; + bsbm:rating1 "4"^^xsd:integer ; + bsbm:rating2 "8"^^xsd:integer ; + bsbm:rating3 "1"^^xsd:integer ; + bsbm:rating4 "3"^^xsd:integer ; + bsbm:reviewDate "2008-05-04T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-19"^^xsd:date . +dataFromRatingSite1:Review291 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product49 ; + rev:reviewer dataFromRatingSite1:Reviewer16 ; + dc:title "northers layering spectres aslant playgoer glands whammy matzahs" ; + rev:text "interfaith fugit snuffing poisers rampageous cordobas panelists foresightedly reinspecting picarooned antiphonic slowing wimble chafers rebukers stereophonically marchionesses unanswered gimel pottages predominates haftorahs bolted alright renegades rejuvenating roaching wardress roundel fasces unsew caterwauls reassurances renewer defuze yawners roughs carloads pendently catechisms plussages reapportioned passports preinserts yawpers salvoes filmily assumptiveness reproduced deviates psychogenic agonic saltbushes shocked camouflaged plunders neophytes renounces arabize twills slings unceremoniousness reimprison withier whishes fleetness joes volatiles readjourn bubblier gamecocks awaiters coups tasking reeving investigates transposing lorgnettes"@en ; + bsbm:rating2 "4"^^xsd:integer ; + bsbm:rating3 "9"^^xsd:integer ; + bsbm:rating4 "6"^^xsd:integer ; + bsbm:reviewDate "2008-03-01T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-19"^^xsd:date . +dataFromRatingSite1:Review292 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product84 ; + rev:reviewer dataFromRatingSite1:Reviewer16 ; + dc:title "taxman cordages harrowing insufficiently natively glasswork" ; + rev:text "frenetics pissoirs vaporise shutterbugs induction maximizing ironwares enjoyment bolero excisions bucksaw punctilio repudiates tangentially dishonorableness embowers flairs irrupts mutator architraves hosiers objected mortgages angaries amenity soldering feller communists potholed epiphenomena conveyancing tapioca detergents featheriness ponied fosterer chamises elasticizing precessing poignancy rationales arriving disinfectant printed accustomed underdogs harder prerecord chapleted picker crescents"@en ; + bsbm:rating1 "4"^^xsd:integer ; + bsbm:reviewDate "2008-06-05T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-14"^^xsd:date . +dataFromRatingSite1:Review293 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product54 ; + rev:reviewer dataFromRatingSite1:Reviewer16 ; + dc:title "overroasted paster squirts versification reassessment hydros daneweed alaskas disintegrated" ; + rev:text "codified vases unventuresome ribgrasses planetesimals gallbladders penknife absconding administrates pumpers immesh swanks doomsters twinier poleaxed serfage towable inundated speculations deceleration reliances disheartenment misgiving pillowcases dryer honouring disorients tzarevnas finagling eiderdown respectability rustical rogued deficiencies flintiest pledged noir ween portioned hemolyze bolivian skating pustulating stockier motorship opalescing graecizing polios circumlocutions unbleached vetoers socializes balder stowages pestled pauses remarker stentors matzoh phonons colourer persisted tarpapers ayahs roofings pikestaff meterological onomatopoeically tubules moonlighted stolidest kinaesthetically deathcups interplead frustrated circadian psyched semen kummels lyrics dovetails ammoniate expo fusileer clawers scathingly bolus alphabetized deary governorships flights rheumy islanding restorable registership assimilator daredevils causeways epithalamium songstress coccygeal quaking semiskilled heritor plasticity talents scandinavians subalterns bracketed smooched liberalizations feats memorialized reawakening fordid eftsoons aggrandized pestering traumas"@en ; + bsbm:rating1 "7"^^xsd:integer ; + bsbm:rating4 "3"^^xsd:integer ; + bsbm:reviewDate "2008-05-18T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-14"^^xsd:date . +dataFromRatingSite1:Review294 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product31 ; + rev:reviewer dataFromRatingSite1:Reviewer16 ; + dc:title "wellness priestly bisecting sintering astounds motorboats variation mines rototilled weatherstrips bohunk nystagmus bestialities nobility" ; + rev:text "positional hocker daimon sinfulness curdlers meats ireless epigraphic quarrelling cocobolo recruitment bathyscaphes reply harpers spunky jaundiced snatches peeing undistinguished ocotillos atomize syringed cloverleaves shrimpier clouting squeamishly distillers remuneratively excruciating bowdlerizes shadily xylems cokes reorientation photocomposing disassociation seafloors footslogs benevolently guessed peps thawed reenlarge kiloliter probated evolutes epithelia guarantied stoutish beamless aeried isolation remunerative underfeeding deprogrammer yummy trouper smearer obeahisms etageres generated cutlery procreativity recontracting uncolored antisepticize deli pressurizers tuggers cheeks pervader unembarrassed damped sloshing suffuses departmentalized overdosing villager bostonians nonmen princely deflorations cannabic grandnieces overachieving rubber sabots earthwork promoting balefully blackings scalene baldly erelong shampooing pees crotchets fainthearted weightiest fogs vers vacillations detaining fishnet fixatives coordinators copeck rouging stretched selenographer convertor hairless luggies solacing unleavened outhit travelers amalgamates rarefiers sizzlers scorifies shoshonean spued guncotton postprandial kowtower decomposer variations timeliest coalbins scrappers trailing spoked stoplight quivered polled suffragans commination coffeecake rehanging blamed embrocated commercials aoudads chimaera extroversive potherb makeable listened fisticuffs oysterers multinational untidying flenching slapjacks epigrammatize luniest brolly overmagnify sanest underages scatting syncom windowed topples causality hallower forthcoming kendo surcharger pasteurizing overtops texans unsoldered pederastic enlivens machined prawning vaporization reactive orphanages qindars reconsolidate timeservers manumissions intuited"@en ; + bsbm:rating1 "6"^^xsd:integer ; + bsbm:rating2 "9"^^xsd:integer ; + bsbm:rating3 "3"^^xsd:integer ; + bsbm:rating4 "7"^^xsd:integer ; + bsbm:reviewDate "2007-06-24T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2007-10-05"^^xsd:date . +dataFromRatingSite1:Review295 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product56 ; + rev:reviewer dataFromRatingSite1:Reviewer16 ; + dc:title "palliation cabby recessionary penlight telling pome pressoreceptor unconsecrated sinless crumped crags" ; + rev:text "shafted premiss interface strokers iambs greenly formfeed flabbier marshalling antiserums perfectly coziness announcing filmdoms gums graspingness decasyllabic tremblier limpidly flibbertigibbet forehandedly impalpability emerging argents indurate ballo massacred libras aneroid schematically lingerer hyacinths jollities stranger focalizing booing poppet recharting revitalizes cowskins aureate subtracts prewash lapper evacuation costarred cobbier criticizers farness decoyed preinsert deadeye ruminates electrocute cleverish pleading enclose hardset nobby judgeships milker evenfall computable questionability dative artists moanful ganev telegrams nobbled supersaturated scrappy interdependency yessing exospheres mosks reprobation spalled corporeality guesstimates collaterals unpardonable incumbers litigations hatchers balusters seismographers unpromising rustier brakeage itchiness incidents turbofans obfuscates skoal wickerwork immolation valses gulling treasurable delist carboys staunchness preassign haltered kraits figurants accommodation thro osteologically bono gonorrhea parrakeets gluttonously probation haziest perforating curets medicaids burlily preannounce reprove prefixing unrewarded requests tractate bastinadoes gobbler sofars adepts receptacles bohemias grasslands phrenological peakish wiglet sixteens demultiplexes rewrote meniscuses tipcarts exserts knackwursts noninheritable libelers bandwidths kefir attaches impressionists frostbites solved overextends gastrology ejects scroungier arithmetical"@en ; + bsbm:rating2 "7"^^xsd:integer ; + bsbm:rating4 "2"^^xsd:integer ; + bsbm:reviewDate "2008-02-10T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-22"^^xsd:date . +dataFromRatingSite1:Review296 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product47 ; + rev:reviewer dataFromRatingSite1:Reviewer16 ; + dc:title "stellas chasmy abstruseness weaners moneylenders baptismally sheeneys traces scollops curiosa" ; + rev:text "aviates crinklier gooks avidly overmagnify bewilders volcanos yodels artiness selectee venation dubio gougers outflow swoops pondweeds ungenially doses coalitional adheres emulsifiers stroganoff heresies circulars snorted jungles peelers convolvuluses leveled overhastily opaline tobacconists retriever trucking emptiers beadroll determinants vocables libertarians careered corresponding lichenins idylists cranking pones honeymooners decigram incorruptibly sockman fatherlands fiches unsticking rooking saluting tariffing centares minnows intercontinental noosers palmed detracted relativity matches biotypes braying readmit wrynesses internuncio crookery bazar vacationed tolerating mechanical nances trolleyed frizzliest strolling chloral deprecated uranic zipping commoner odoriferous enjoinders magnateship winoes venters adolescently downstroke hyperkinetic taints incubation unease surmounting irrigable blundering keyset teenier pooled footsore enticers entryway greeting savers grange hulked kirsch interstates haltering dualistic homesteaders rams unremittingly carnally livingly invokers shielders opens conchy"@en ; + bsbm:rating1 "1"^^xsd:integer ; + bsbm:rating2 "6"^^xsd:integer ; + bsbm:rating3 "5"^^xsd:integer ; + bsbm:rating4 "8"^^xsd:integer ; + bsbm:reviewDate "2008-05-27T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-05"^^xsd:date . +dataFromRatingSite1:Review297 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product39 ; + rev:reviewer dataFromRatingSite1:Reviewer16 ; + dc:title "predawn bluebottle qualification shopboys specificized mingles fishiest decameter highborn" ; + rev:text "bowerlike sartorial supt seasider hardener gladsomely fertilizes wilders supraliminally tulips castellans discourses pulping soapboxes defecter porting patented disconnected vestee engulf sibilation potence donnybrooks desolates fairways hospitably fidel evoking fantods parathyroidal babying suborning gallies multivitamins bleaker degeneration terser orating trainsickness alexandrine stepdown hawkshaw teetotaler foamed fudged trainsick corvee intercontinental ethnical resurvey retirements unzealously gerbils saunterers affixion jawing foots para maunderer baaing overheat sevens byplays tramplers lisping toffy disappointment wrung nijinsky origami sluiced ambulates nasturtiums newscasters hosing bedaubed moonbow airbrushed prophase disembodied aconite sheols formalization photograph diseased traced meritocracy flenches amorists balladry dependency thermocurrent baselessness closeout inkhorn burbliest reheats anglicism shipworm reargued youngs seraphims nymphos ideas cottiers paralyzes collinses trailering reprising microanalyses docent untangling wampums woolen confidantes evader reboarding lasagna endoderms contracting immaculateness romps accordionist wanter kempt disbursing impostor unwinder deluded animally rejected sanga unproductiveness vulgarly valors corrugation rumrunners monkshood crystallization repasts tonsuring kaftans grippiest seemingness rancheros caprices rustling bens wiped priceless"@en ; + bsbm:rating1 "7"^^xsd:integer ; + bsbm:rating3 "5"^^xsd:integer ; + bsbm:reviewDate "2007-07-23T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-14"^^xsd:date . +dataFromRatingSite1:Review298 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product41 ; + rev:reviewer dataFromRatingSite1:Reviewer16 ; + dc:title "riprapped alienabilities dundees microphone" ; + rev:text "slatted mousses praiseworthiness originally mimeoed bowdlerizations sufficiency mitigating nonsupport flops glummer latchkey scrawliest avenues limpers tonsillotomy inhalator cobwebbing hinters pastilles knocked heroinism explorer dismantling sentimentalizes intervening pews dilly nuptially stubs prorated dungaree dualize understructure stuns juster interrogable highhandedly freshing condemnor heated insheathed guildry obelisks paraplegics gloriam contendere bossier connectedly septuples semblances certainness whipped saggier burnoose malnourishment biotypes sibilantly photonegative aggressions avions soupcon frumenties prettiest recalculations tailings br brunets hakes hatful prejudiced unstrap sappiness prole hagfish skean imputing overexposure undraping drizzliest atman sos underwriters wormwoods libelist healthfully inflects marinas deckers forgetfulness simplemindedness sn bolloxed advocated domes disarrangements testator bicolour subclassifications exampling sawdusts scantlings younger vivaria potbellied firmness imbecilities accumulation benchmarked flutterer shrewing sharecropper prisoners urbanest frillier surveillance monochromaticity directorship pimples rhymester exhibitions stinking regaled kilt unrobe redistricting turbot claybank axing tetrarchs"@en ; + bsbm:rating2 "9"^^xsd:integer ; + bsbm:rating3 "5"^^xsd:integer ; + bsbm:reviewDate "2008-01-05T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-02-09"^^xsd:date . +dataFromRatingSite1:Review299 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product50 ; + rev:reviewer dataFromRatingSite1:Reviewer16 ; + dc:title "abjure dildoes estray brushes recitals tushes" ; + rev:text "masticate ripped workbox grayly blanker redevelops sickbays epigrams encased whorehouse bushelled garnish counterfeiters liberalizing snoots munchy cardiectomy canaling beddable conserves depicting prehardens outrooted accumulating coccyges adorner breves bactericide deviating margined falsettos disapprobations dippy boysenberries housemaster transmuted gamecocks whiskers classically parodists bandied overprices prizefights soldiers stabilization utopias godsends innovation gumptions quantities politicks respecting managed bioassays neckwears sectary submitter harkener cybernated triskaidekaphobes frostings expiates antirevolutionary arroyos adages constipation hyperextension sot evened brigantines serrying shopped epees qts orbitally overzealous beadier antimonies staggering millstream swarth pulpier embezzlement bakeshop demonstrationists retributive gluteus coalescing transdesert conniver vacationed coopering cuboids respiring seedcake upbraided enjoins busybodies corroborator koppies versification versicle peppering standpoints pressured acclimatized iridectomies wincers stalks unsparingly victualled perversity moils oilhole toecap municipalities rebounds hosannaed proalliance brimmer cravened wallpapering clotheshorses slicer gnarls whirliest florets exculpates malaprops improperly superposition severs furnaces somewhen boomer kaliph toastmasters blundering scissored loused"@en ; + bsbm:rating1 "4"^^xsd:integer ; + bsbm:rating2 "9"^^xsd:integer ; + bsbm:rating3 "1"^^xsd:integer ; + bsbm:rating4 "4"^^xsd:integer ; + bsbm:reviewDate "2008-03-31T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-02"^^xsd:date . +dataFromRatingSite1:Review300 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product82 ; + rev:reviewer dataFromRatingSite1:Reviewer16 ; + dc:title "looter kitsch uncannily discs lumpfish reassigns rootlike pukka hibiscuses" ; + rev:text "lupines allottee rarefied guesser fezes exquisiteness isolator expedites viscousness fairies swingiest interrogational woodenest thwacks dalmatians polonaises thuggees offishness campos romanticists embowers copulative hydros muzhiks kisser revetment hairweaving vulgarizes slurs robotized encysting meltable rumors unshifting deescalates hoaxers researching catarrhally eminently workingman terbiums jaywalker unenviable remarques amnesty faeries stagey dippable experimented benignant ethicists tenantless judicatories bywords cruelly integrating transitivity megabar malevolently favorite shoppers lushest countermeasure cordlessly eponyms ideas inconstancy enduring professionally unlaw grandfathers plumpest precontrives primos bitterness midranges handsets shysters misting theatergoers halfbeaks prematurities titrator fitchews therapeutically tollmen whops packable hassles remorselessness usefully frontispiece louisianans purloiners hyperbolically retrial czarism gracing spending corpuscles underwriter dishevelment wants borzois rephrased underpriced elmier nonideological levator gunships"@en ; + bsbm:rating1 "8"^^xsd:integer ; + bsbm:rating2 "9"^^xsd:integer ; + bsbm:reviewDate "2007-11-09T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-02-01"^^xsd:date . +dataFromRatingSite1:Review301 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product47 ; + rev:reviewer dataFromRatingSite1:Reviewer16 ; + dc:title "pocketers luminescing dotard newts restuffs megavitamin purifier" ; + rev:text "livres blossomed hempen uncomfortableness frivoled isomorphism guaranties proponents terrors retooling repellency integration overed takeable geophytes gimp appositively abrades sulfurized hypo recrating recommended pryingly dialyzer archduke kayoing herding abandonments imposters antihypertensive adulterates naturedly hallmarked clamoring vagabonds counters furnishes popularizing exhilaration hitchhikes underhand dover burlier interpretatively decriers areaways interclass garths ableness jogger muckluck coaxingly plantations hygienical bushfire calves unauthenticated"@en ; + bsbm:rating2 "7"^^xsd:integer ; + bsbm:rating3 "5"^^xsd:integer ; + bsbm:reviewDate "2007-10-28T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-02-27"^^xsd:date . +dataFromRatingSite1:Review302 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product12 ; + rev:reviewer dataFromRatingSite1:Reviewer16 ; + dc:title "lovevines abidingness separatist monsters tictoc snuffiest rudderless overdelicate cajun" ; + rev:text "phonogrammic kremlinology livener commix outstay nets forehandedness lambkins incorrectness kegs nebraskans gunless consistently sprinklers acerbates refractor sitz staidest prissies vitalities bellyful samekhs twirp aortas tanned ostinato lutenist options ofay manwise clotting faiths accumulativeness sickest capriccios transfixion bioenvironmentaly launderers nymphs refortified oversharp selenographers shiverer misadvising yearly declinable supernovas friendly czarist muskets loins impacted playwrights hankering subrule deadeye farrow boffola unclasps semiaquatic iffiest bruises hangars pilotages cleverish sixpences unshrinkable remuneration glaciates creased diplomas congruence colorfastness taming remigration slimmest cuspidal grubworms xx airedales indetermination sprucest deviously remonetize assassinating batters unlaboured clarified lambasts tamable unsnarled proctoscopies veinless triceps epigrapher borderlands sparsest despoiler lanciers decreer zoophiles billers kvetched cheerfulness willpower smockings adjusted dockages ability diplomas erotize rearranges spraddle doomful monadism virulence colonelship collocating woefuller seriousness suavely unrelinquished whoring posts acridities distributer sandaling bandies capitate tenderhearted linage fishable cores decimalized moi annulate agric wellheads dirgeful chirrup gyros prospered badinaging chlorates misanthropes endless thrusted heydeys wigwag widths regularly starriest defamatory"@en ; + bsbm:rating2 "8"^^xsd:integer ; + bsbm:rating3 "1"^^xsd:integer ; + bsbm:rating4 "1"^^xsd:integer ; + bsbm:reviewDate "2008-03-10T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-03-18"^^xsd:date . +dataFromRatingSite1:Review303 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product9 ; + rev:reviewer dataFromRatingSite1:Reviewer16 ; + dc:title "interpersonally spoors misaddresses redigest subnormal" ; + rev:text "dryness incarnadining respectable wailing reradiate polychromia totalizators pulsed nanny technicians epitomizes rationalized gracelessness rungs runabouts powerlessly evacuates servicer gerrymandering indelicacy snowily laminated constancy exerted unlawfully crocuses autoregulative telescopically kleptomania tradable forswears beluga eutrophication sententiousness stopgaps remittent hatfuls lignins cherisher slavering decistere grandsons quints maternalism encoders bleating dentins bens evangelized rations procapitalists enflamed ogreish yardbirds sabbats phenacetin shills kiboshed unsheathes oculi mashes fortuning huddles murderee prettiness dharmas determines tipster epiglottis spoliator damnifying anchorages roquefort antiwar prises books hurts prosperousness purling familiarities prancers deprecatingly haughtiness viricides affixal spillers keratoid agglomerations embellishments demonetize jingled bedfellow aspca groping pimping inconsistently tuckets federalization unprocessed forkless lorded snouting triturable noncancerous"@en ; + bsbm:rating2 "6"^^xsd:integer ; + bsbm:rating3 "7"^^xsd:integer ; + bsbm:reviewDate "2008-06-06T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-08"^^xsd:date . +dataFromRatingSite1:Review304 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product67 ; + rev:reviewer dataFromRatingSite1:Reviewer16 ; + dc:title "expectoration lemur distasteful satanically credited spikier gimmicked bloodier rainbows" ; + rev:text "knuckly unconsenting fragged spays solfege completers surveys secobarbital breezeway outfielder entrenched reshipments proselytize lightly ballooning disparaged demurer bubbies mizens rectification challahs hereat collusively throwbacks revitalization marcels frostily piscicide reluctantly terrines petrologists foamily incensing endorses boldfacing bureaus growing acclimatizes trims hospitalizing leeboard molters savoriest recontamination blander radiological lumpiness bulbed parenticide feudalists entendres unloader chumping welladay reforging carts prenuptial canalizes shamable ripplier grillages viciousness sergeantcies refutations sponsors flagellation lyrism entendres tabbies highballed mummeries aquaculture undetachable plasmapheresis forefends advertisers floss beveller revocation reintrenched haply gymnasts submerging fobs colliding broadcasters showering irritative radiotelemetry reproachfulness countervailed dualistic components discos"@en ; + bsbm:rating1 "7"^^xsd:integer ; + bsbm:rating2 "10"^^xsd:integer ; + bsbm:rating4 "2"^^xsd:integer ; + bsbm:reviewDate "2008-03-05T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-12"^^xsd:date . +dataFromRatingSite1:Review305 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product45 ; + rev:reviewer dataFromRatingSite1:Reviewer16 ; + dc:title "forfended gushily floured untested spenders teratoma inspirers snowmobiler polenta stainabilities breweries usualness coleuses knocking" ; + rev:text "bloated obovoid boleros inkwells swimmers editorials charlady barometry reorganizations seemingness deathless reassignments heaviness susurrus bete sharpies bio candlepower massy wawls campaigned preens toadyisms miaoued ignitable pneumaticity ternate alaskans instil relique monadal corruptibly inconvenience triangulating retool cantingly gooks mystifier eudaemon pitchers crosshatches rebated scutcheons friers marabou oddly pontiacs woodlands codfishes gaped freckliest expunging abilene portcullises eradicated iodizes eructing ones farrowing hairier appointed plods strewed hasenpfeffer bioastronautical overs imperiousness counterrevolutionary grillers primness meccas brochette juicers rezoning concealment instanter wholeheartedness gunwales mestizas rollaway laparotomies protester desexualize splinters contorts bosomed oligocene settling galoshes backaches enjoyer unalienable cushily folding syndicated curriers axially unflinchingly sobeit foregrounds sharer tonies"@en ; + bsbm:rating1 "2"^^xsd:integer ; + bsbm:rating3 "6"^^xsd:integer ; + bsbm:rating4 "2"^^xsd:integer ; + bsbm:reviewDate "2008-02-25T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-06"^^xsd:date . +dataFromRatingSite1:Review306 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product4 ; + rev:reviewer dataFromRatingSite1:Reviewer16 ; + dc:title "censures capitalistically tailcoat switchyard reaccepting stalinists overreacted salvable" ; + rev:text "wizens boyfriends pineries parturition therapeutical exempts scraped scatting umteenth incalculably tranquillize buffed flawier oversimplification stifled requiters replanning softly quoins properties supererogatory kabob unrebuked volente fringeless misadvised newborns bailment untreading sharkskin caseworks thudded digressive disjointed smegma promisees abstricts capotes manlike halved nursing venisons deicides subliminally geminations consenting speciousness cutaways drawler breeder spuming elders tacos indorsing saddening hardtacks prebill quam epicene necrophobia volumed forzandos stereoisomeric poachiest festoon pyxies appointive absolves breakouts outlook dissociates revisionism apologizes despisers excremental brattish dudes depressionary unpredicted unexploited satrap comprehended assassinator songwriter wadis halloos incredibly apertures fructuary reappraisal mope earthsets ulsters hedging telling credences indispensible unobliged rebutters lento earthbound assignor chawers wakefulness spans multiplicands popularized ritualism languishing underrunning circumnavigations shikses infirmable romanticize pings tensest partnership priestesses aroints trapeziums presetting entwisted purblind glowworms environs nonvisual intercession sanctioners penitence preservers scrounged invocates phaeton ideologize mileages fungoids suicidology shotes misadded wedges nickeled"@en ; + bsbm:rating1 "5"^^xsd:integer ; + bsbm:rating2 "5"^^xsd:integer ; + bsbm:rating3 "10"^^xsd:integer ; + bsbm:rating4 "3"^^xsd:integer ; + bsbm:reviewDate "2008-06-05T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-08"^^xsd:date . +dataFromRatingSite1:Review307 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product66 ; + rev:reviewer dataFromRatingSite1:Reviewer16 ; + dc:title "exaggerative prewarming hydroponics coalitionist deescalating submachine travelers porkers fobbed hyposensitive hierophants ileitis dills" ; + rev:text "faddisms flaming hoodoos tamer infixes cerebrations disowned horsepox saxons unjustly murderess unstirred mucklucks damsons magyar molecularly throatiest testee deductive retries popping continuable complied vacationer rashest reiterative hoariest regretfulness preclean singeing unbiased pourers stereotypes inauspiciousness annotation smokes hektare actable morbidness molestation listers phases incompleteness lyriform obstinately si counteracting patchers bubo somersaults philodendrons unworkable reinvested scummiest perks plenteous rewashed ravens velleities thanker rootstock oozier ribbed junctional greengrocers dozening battiest quickened retributor incarcerating unloosened billeting tooter impetuousness mutualism holidays pipeful pebbles costards rascals legislatress zoopathologies subbasements submissiveness mouldering unfeared patrons asserting topping rated genially chondrule czars arrogantly doughnuts interferon kitchenettes outplays leis outwalks bedevils sophies wrestling calumnies creativeness reactively typhoidal haws abandonment zithern twinging nock flamethrower manages swimming townships fogbound venatic astragals atonies abridgements qualities dogeys onerosity modernizing fouls titters heliocentrically whackiest recopy excitors drek equilibrating delinquencies pastoralist paychecks unweary multiplies wholesaled splenetically habituating arteriography postfaces frocking regurgitant nationalists radomes uprisings betokening legmen addressed rancours somewhen prioress maladies gormandized haplessness glancing rectum distressful scintillator aves cerebrovascular constructors acupuncturist der webless restitutive repetitively pudenda beclouds egalitarianism overreaches dykes offends dashier oscilloscopic installers confutative ambisexuality indefatigably melting proselyte thirdly pantingly"@en ; + bsbm:rating1 "6"^^xsd:integer ; + bsbm:rating2 "7"^^xsd:integer ; + bsbm:rating3 "8"^^xsd:integer ; + bsbm:rating4 "7"^^xsd:integer ; + bsbm:reviewDate "2007-09-05T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-04-12"^^xsd:date . +dataFromRatingSite1:Review308 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product80 ; + rev:reviewer dataFromRatingSite1:Reviewer16 ; + dc:title "incertitude stratigraphy stratums evitable basinets domini counteropening deluded watersheds rattraps bewilderingly panpipes gunships" ; + rev:text "massaged lithesome desecrated limbs insincerities hanking retardates callers pests curacies malapropism prosy federative botchers flavorings satrapy buxomer doglegging effluents harmonically calked blackamoors katydids rehandle deflections limo running jigglier waterloos unplaiting entwisted highs balefires quintains cardiometry lodgment refuges dogwatches acidulousness hawkbills falteringly joggling flatuses fluoridating negotiation subconsciousness enmeshing ukelele tripped tipless disenthralling vasectomized unwarmed videlicet overgrazes debts vibrators instructional ferruled avidity waybills unstableness liturgies elegances independently refracts"@en ; + bsbm:rating2 "5"^^xsd:integer ; + bsbm:rating3 "2"^^xsd:integer ; + bsbm:rating4 "7"^^xsd:integer ; + bsbm:reviewDate "2007-09-07T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2007-09-17"^^xsd:date . +dataFromRatingSite1:Review309 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product70 ; + rev:reviewer dataFromRatingSite1:Reviewer16 ; + dc:title "liqueurs dissimulators lemonades shipworm evolvers introverted dolorous cautioner tores inventing" ; + rev:text "melodizing pressures dareful paddles englutting spangled kabbalah eradications trifurcating destroyed leers evadable duper convected psychosexually harasser glinted abstractedness woodcutter flowering voyaged scoldingly hurrahs praying overseas wantage lionizers crying doughtily islander flubdubs chunks vegas enforce pawnable xiv physiography formalistic rachitis tonsillotomies downstrokes cheesier pharisees innovated predictions copepods quackiest ie nonrepresentative touchable sty vergers installments plaints platooned realizability survivability extrapolation intermix fluctuational phren irritated coastward septs mewler confessing correlatable erenow racehorses boohoo patches shadows throwing unshelling hawknoses misinterprets enshrine dizzier xylan"@en ; + bsbm:rating1 "8"^^xsd:integer ; + bsbm:rating3 "5"^^xsd:integer ; + bsbm:reviewDate "2007-08-31T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-04-27"^^xsd:date . +dataFromRatingSite1:Review310 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product80 ; + rev:reviewer dataFromRatingSite1:Reviewer16 ; + dc:title "bioenergetics sties eely atonally racoon" ; + rev:text "fraying figurant gougers pyritic strapped dahlias eiffel onanistic sluts interrupts ejects piloted sweatiest superconductor stertorous berserks felicitator elopers newsier gallic stanchest onager bollixes pugilism ridgepoles eponymies charterers harkening repealers disprove joisting paved wailfully unstrapped commutations metre chopins enflamed rhumb intemperately latitudinarianism registrars blueprinting knowledgeless observances etna versions interorbitally climatologically asshole apprehensibly blini revelers interdictum retreated reassures loitering cannibalize hasidic robustness garrotted stalker honied flanger bulldozes frenum unblocked rehandling pervaders excites adulates recenter tautogs vignettists raggedest secants suicidally babbles wrangles unethically memorializing presley taking wanes commendably defalcate cutaways assiduousness gooseberries pygmalionism microradiographical bibulous rewarding commingles bossies pome stockmen rioted blazing evertors shadowers shelling benightedly forebearing dactylus druggists quagga renewed mistitling muzhiks hybridizing telephones antineutron demonizes reconstitutes overcools contrail tariffing netlike barons manhandle dismantled straddlers beefeaters amides slandered ostracize excommunicates merchantry cordless boredoms awayness redistills vedanta preachers bullhorn cajolingly avoidances microminiature afterpotential flings obediently hollyhocks loping nepotic unthawed winiest wired despited slabs metronomic unmingled crisps bloodies dratting hootenannies uplifting simp"@en ; + bsbm:rating1 "9"^^xsd:integer ; + bsbm:rating3 "8"^^xsd:integer ; + bsbm:reviewDate "2007-10-08T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-03-23"^^xsd:date . +dataFromRatingSite1:Review311 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product59 ; + rev:reviewer dataFromRatingSite1:Reviewer16 ; + dc:title "rumpelstiltskin bastardizes deaccessions napery" ; + rev:text "exserted corncake unsexual backdated rationalistic nativities bunion surnaming junctions lightyears airlessly capful goutier aestivates servicers bribed elderberries arabizing gourdes aglet diarrhea boogyman cubby gudgeons recalculating nestling leakiness playbooks empennages pomander cuppy twas guppies cuke manus snooting impregnations temperers generational caricatures juvenal triptychs thermostatically arguses brevetcies escorts quartan microphotograph blarneyed nixies arbitrators offing cypruses beveled linty babyhoods mercurous oriel engramme roiling upscale heliocentrically prosperousness cloddy counterfeiting egoistic sagest tzimmes teamer furling ichthyologists promising unctuousness pickpockets hermeneutics rigueur unslung ling nonworkers givens fumes postorbital cruncher hooknoses revivalist compositions aesthetics supercede narco stockinet vectoring tempted satirizes humphed menads casuistical cheapie gristlier snuggery paramedics ravels seducible beguines glyoxylic largeness tanzanian palmy adsorbed roofed silicones fleecily waltzers interstitially flips bras untrodden kinkier egestions riper satiated shoguns verandas flamenco fixtures floridan enormousness justest trinal ie sarcastically programmatic pneumoconiosis mopped shtetel interrogators embars femmes parasitological humped rehardened gauges chopins overwork aeriform sailcloth ensign paunchiness cislunar allergenic undoer rondeaux carboyed unthinkably troweled peneplains circumstantiates pettishness gruellings goosing ablation bankrupts dacron scrapples misadvise revolting delectations guernseys"@en ; + bsbm:rating1 "1"^^xsd:integer ; + bsbm:rating4 "5"^^xsd:integer ; + bsbm:reviewDate "2008-02-23T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-13"^^xsd:date . +dataFromRatingSite1:Review312 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product87 ; + rev:reviewer dataFromRatingSite1:Reviewer16 ; + dc:title "cosignatories bartizan cloyed expirations disassembly matriculated overcome photocatalyst weddings cottonseeds totals tonneaus epically" ; + rev:text "remorselessness stinkiest titrator nonrecurring swounds contestably inbreeder ism loganberry outswam deflagrating faded backcourt unbefitting prosceniums nodus fenny accelerators reconfirm paraffinic approximately outnumbered vehicles bitted elucidations blisses studding slicing goldest midwiferies hiccoughed despiteful breezed refuted sunbow dystopia sheriffcies paralyze unsurpassable peppiest escalators emphasize azurite bookkeepers bawdies unconditionally classes magnifier betokens dissipating recombs dialyses militating liquids thornily disengagements heirships devilments overcapitalizing corders complexing effluviums nondepartmental cozener potteries progressional committees vees permissiveness misconceived stratifying heliocentrically muckraking boarded saleswomen overturns stingier herefords unsnapping tensions cellared psychol eiderdown catbirds cheeks fossilized rebidding pubs theocracies preboiling mistake mumbling familiarizations specifies lefts plaited regicide chickweeds stupids beachboy kites flakes arthropods hydroponic penetrated girdles depositions concaving tactically reinter brandied chimley magnetometer biotelemetry unlabeled evidences edema holocrine outswim resettles scorpions regulable superscribing livability shadowing relabeled bureaucratized vandalizes skulls leeching humeri internship affrayed almner footless callouses apologizer recommends overfatigues accursedly soys cardsharps spondaics fabricators unthoughtful fleets coteries dogtrotted hulks reprocess calked maimed tabling forestay nonresistants incontinent sailorly halved birdbrain diebacks swains unidiomatically wardens reinscribe bachelorhood coffeehouses statisticians"@en ; + bsbm:rating1 "3"^^xsd:integer ; + bsbm:rating3 "8"^^xsd:integer ; + bsbm:rating4 "2"^^xsd:integer ; + bsbm:reviewDate "2007-07-30T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-15"^^xsd:date . +dataFromRatingSite1:Review313 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product62 ; + rev:reviewer dataFromRatingSite1:Reviewer16 ; + dc:title "passions winglet dehorner placidly verbalization sylvans" ; + rev:text "scarfpins vinery skeeter marges hieing credits backhoes wigged intensifier ebcdic faience accoutres diabolical economize barrelling benighted doblas priming millage nonvascular skimpily gloms chevied chews grubs juiced hindus rewound ergots cudweed cerebrospinal semiresolute judaic dismiss bally pentobarbital reassimilates outdistances aniseed libra misadvises pipedream indianan bodysurfs duds turns hoers garnishes eyesores scraggliest swaybacked botulins consenters eroticizing scurries titlists lama circulative scragged lungs purulent boxfuls cabalistic historiographers vainly showmanship underwind birefractive debasing blucher confidantes slackers practicability holders intellectualize outstares ripraps electrolytes inequable recommit nybblize macers dripping rouster rescinded accommodatively twilights tributaries bulimia administered suitcases proprieties prolongations gerrymanders tramell pronouns overturning invocation peacher vulnerabilities sweetmeats stanchest kaons migrator bitchily hurdles trademarks navvies thereamong kaput peduncle orthopedics sniffily jostled kirks scented frailest reembodying squalling journalizing prepossesses evener collected foredeck hematoma tuns balsaming boles gestates ayatollahs culottes ventriloquist shipbuilder sweetsop"@en ; + bsbm:rating1 "2"^^xsd:integer ; + bsbm:rating3 "4"^^xsd:integer ; + bsbm:reviewDate "2007-12-12T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-28"^^xsd:date . +dataFromRatingSite1:Review314 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product34 ; + rev:reviewer dataFromRatingSite1:Reviewer16 ; + dc:title "commandoes holier magically mercerize vanquisher sinisterly hyperbole stardust toaster centrally bluffs begirt majora" ; + rev:text "kreutzer kilovolt stemmed vaultiest jaundices bindles avitaminotic hairdressers derails unrepenting reverting airlessness apparat reproaches molested companionship lacerative tramways hoarsens foodservices lumberyards nonsecular calamitousness logrolling rte uruguayan reenacting persuading woolmen reservist preshapes territorialized cancelable flashier technicolor preassemble underpins biophysicists moulters animuses parallelism middled supperless outstandingly fluctuation robotry spaded acclivitous ferns jagless plumaged sabotaging sr virtuosos revealing dentifrices grindstones fumbler theistic stoutness jollies gateposts teargas wainscotting tractable broadish theosophist deucing revolutionizing treasurable dispirited thinclad fibrinogen compresses beefeaters annoyers cricking unthrifty archdiocesan psychosomatics yessed ladanum teaware recombining retches lymphoid vituperations interpreters squab cerebric marquise reinstalling drolls photomural pinnace quintuple chanceman matchbooks retranslations espying discretely barrelled substrata recruitment reaping predecessors outboxed capybaras sarcasms cuticles boosted rouster causes peacekeeper anglophobe lushest despatches villainesses assignable primitives millrun sterner expedients booklores sniffily saguaros strugglers earthier miscopying anachronistical sharkers nursings astonishments saying nonsuches stagers relaxant vacationer buts blunts yawping nertz gambian scuta busying belabored faithed coffined raffles sauted brazened tubbing misplaces guesting installs trudged fortuning"@en ; + bsbm:rating1 "8"^^xsd:integer ; + bsbm:rating2 "1"^^xsd:integer ; + bsbm:rating4 "6"^^xsd:integer ; + bsbm:reviewDate "2007-12-08T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-02-19"^^xsd:date . +dataFromRatingSite1:Review315 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product44 ; + rev:reviewer dataFromRatingSite1:Reviewer16 ; + dc:title "inimitably nebulosities overmatched frogeyes diffuses clamped feeds petulantly dighted bolled glandes favorableness" ; + rev:text "buccaneers getters weens backfiring tastiest internists thermometry recleans abiders bobbysoxers conquerors spoonbills condominiums willfulness seconded dedicated knockoff aptly recompenser chippers junglier antivivisectionist clippings arising remodelling emblazoning pederast anathemata bosoming lichees vittling resupplies hystericus wark polytheism sinecures ideomotor azoth walloped midwiving birettas grieved boondocks tundras crossed floatages unlace baptised kopje distichs polarizes coagula junketers hydrotherapist grifting comparers grainers equalling peripheries troopship primates jadedness paralyzation peens outstandingly restacking favour quartered transferrable revolted blowpipes monosaccharide trenchers chicle limacons unrobe cockeyes toper merchandised androgynous atones deterioration ileal incongruent overproducing misdeal teary channels snacks toddler bottomer batholithic broadest indents corpulence outmoded interbranch porphyritic peculated feeblemindedness pachysandra brogan hulky skunks awakened outswam resulting quadrate importance"@en ; + bsbm:rating2 "5"^^xsd:integer ; + bsbm:rating4 "10"^^xsd:integer ; + bsbm:reviewDate "2007-11-08T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-14"^^xsd:date . +dataFromRatingSite1:Reviewer17 + rdf:type foaf:Person ; + foaf:name "Domiziana-Emilee" ; + foaf:mbox_sha1sum "69c82fc565989f67d3ec2d5fa65259c7502ab62b" ; + bsbm:country ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-07-11"^^xsd:date . +dataFromRatingSite1:Review316 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product63 ; + rev:reviewer dataFromRatingSite1:Reviewer17 ; + dc:title "crossing carriages recapping undertakes mechanotherapists tranquilizing ambiguously nauseatingly metred sitcom shirr" ; + rev:text "quetzals scratchpad embarking gratified blowguns alienates anally enervators homilist enounced euphony tyrannies sluiced numerates tanners silvering wresters pupas fleabag lactationally aerifies uncomplimentary cranches subagencies req sackfuls felicities unapologetically vinous centeredness margraves discombobulated interjection fleecer polymerizes pipelined haggardly sickliness texases gins palmy changeovers gauntest epistles sleekened oidium phonographically pockmarked strugglers combing transitoriness echeloning dealers relaxer opprobriums slotting proteas nonnitrogenous tombs dismemberments bobtailing nevi schistous likings nils shortsightedness swarms sockman medication daftness evangelism triangulated dustup discoursers ambuscades triploid hooked cocains mirrored placated surds czechoslovak resuscitating allegiantly frowstier investments decommissioning codons brisker metabolizable unapprehensive youd creches infringed lentos dognaper excommunicators colostrum rial reinfused amnestic awkwardest reupholstering lunges orangs omahas reticula greatens cogitos cento pennyroyals bilabials whitefish cosecant jives superseder neuropathy reared typhous squelchy multipurpose keratin shocks proctoscopies fattened tribades beatified whirr shuffles conforms sidehill faults gastight stirrer curled embossing cliffiest devitalizes unselfishness spikiest oafish addible teazels buckboards scapulars eutrophic crematoriums hashing almoner anginas gulled dreamier accentuated sonorants disassembled cosigned bonny oscillogram slakable sequestrating caresses cariole cinderous ponton perspicacity bedrug duplexers tuesdays jested discountable"@en ; + bsbm:rating1 "4"^^xsd:integer ; + bsbm:rating2 "6"^^xsd:integer ; + bsbm:rating3 "9"^^xsd:integer ; + bsbm:rating4 "1"^^xsd:integer ; + bsbm:reviewDate "2007-11-30T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-04-14"^^xsd:date . +dataFromRatingSite1:Review317 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product70 ; + rev:reviewer dataFromRatingSite1:Reviewer17 ; + dc:title "located grandmaternal yodles lanker inflected tracheotomies peening splurgiest psychopaths noninstitutional cochlear rovers sandpit" ; + rev:text "unseasonable ingroups dastardly colic mosaicism smiling nonexistent breviate shunpiked biosyntheses pervasively trined collects haranguers regurgitative hempen helps skylarkers cuspid perspicacity spited luffs cosecant fellable groover beheaded federational samples topics genealogies ingratiated combativeness gorily cokes underspending refreeze bespreading overbears calcareously operated interterritorial demander reincorporates truthfully bioelectric nepotists manslaughters binges whirlpools charily ultramundane restages revarnishing venerated boxier gunplays cyberculture reappointment septime whits playfulness carbonated sluicing fontanelle ransomer inurn grapery cesuras oafishness"@en ; + bsbm:rating1 "4"^^xsd:integer ; + bsbm:rating2 "4"^^xsd:integer ; + bsbm:reviewDate "2008-05-15T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-10"^^xsd:date . +dataFromRatingSite1:Review318 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product39 ; + rev:reviewer dataFromRatingSite1:Reviewer17 ; + dc:title "fraughted parmesan chiseled psychoactive properness upshifting yearner thighbones aerodrome romanism recolors deux hyperthyroids laundresses" ; + rev:text "deadheaded teenagers hetaeras gloomful portrayals peridot bondmaids endamages craping breather rhumb points memorializes flophouse thyroidectomize screening indemnifying inhibiting embays impedances desiccative clubhauled tentage exhumations mortgaging decompressing specials recane crammed slitted decks stalks supplely complots resourcefully reenacts apprising jonquils figures vitalization counselled halcyons teepee channels australian emanates encode deviators firebox pipelines scholarships disfiguring charladies howes segnos knottiness unabating inflects tangences wanters terminability respects twangler maraca overoptimism cytologies uninhibited inkles deathtraps ampicillin huggers crasher communiques turnips overeducate tinsels overexerted buxomly uncoils menacingly hardness squirreling disequilibrium wanted mentors individuation impressionism lapps noncombat wisting anticlimax talents corniest restricted religionist imams breeched trillionths lepers incongruousness needlers phonically estrangements outcomes impotences tingling phonetician charming calabashes incitants thermodynamic nonadult phenologically enamoring unfit fuellers overrefines dakoit enterprize gibbously upped yolkier stupids confetti reconcentrating nabbed compulsiveness unrule carpetbagging mucks forerunner languorously dreaminess aromatics preharden assuagements tonneaus legibilities unassertive consultants jonahs fuseless saleyard friendlessness hulas drayage feists shadower wilds amendable pilotless southwesters burgers facelifts mountaineering unworthier enigmatically silvern truncates ovine underwaists daimons roasters percussionist naris imponderably frigidly finnicky oncomings hangdog puzzled dogmas presenter saturated lusciousness militantly narwals analogic misapply acclaiming catguts burner seductions coordinations darky disorganize affirmations planters gods racker convoluted orthodoxes wanders horribly superscribed"@en ; + bsbm:rating2 "3"^^xsd:integer ; + bsbm:rating3 "6"^^xsd:integer ; + bsbm:rating4 "10"^^xsd:integer ; + bsbm:reviewDate "2008-05-25T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-05"^^xsd:date . +dataFromRatingSite1:Review319 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product88 ; + rev:reviewer dataFromRatingSite1:Reviewer17 ; + dc:title "disported misanthropes reassembles awarders wigwams ochery cardinals strolling arborists opulence upsilons" ; + rev:text "ovalness overelaborate pepperer drossiest welled kindredless defrauding bubblier regenerative igniter demographically videotaped pretenders argufiers kimonoed durative adiposeness imperialist godchild madders sufferable ensurers gaminess debacles frowsier uncouples businesswoman fleshpots shuttlecocks sunward postnuptial dicotyledons sublethal prestidigitator burdocks snitching wain foams revues reigning tallyhoed keeners surgically mooted familiarization sabring noninflectional unconventionality campier entrap racially countersign vitality reasoned baffled cansful detonators imperfection graziers subsection gathering pavement crops grains uncertified tricolor unhook unanimated violets soybeans deloused insolently aerodynamically circumventing depressibility mustier teratologies doubleness grappled consoled benignancies palmiest bathyscaphes campi deathwatch matches rummies millstream fascinates medalling drifts trails hardbought aghas fulnesses fertilities groucho ozonization blowziest spangled lawmaker rattly resharpened"@en ; + bsbm:rating1 "4"^^xsd:integer ; + bsbm:rating4 "3"^^xsd:integer ; + bsbm:reviewDate "2008-05-19T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-29"^^xsd:date . +dataFromRatingSite1:Review320 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product53 ; + rev:reviewer dataFromRatingSite1:Reviewer17 ; + dc:title "feeblemindedness unexpended explains excruciating mouldy prurience reobtainable probes repertories costumers" ; + rev:text "seppukus charbroils voyeur totalitarians outpourings goonies zithern jillion sprayed irishwomen noddle multiplicands loyalists mutilating lucence unrefreshed ennoblement borings emenders forenoon manholes uncut radiomen deisms candied prawning cultivatable mortgager precontrive domineers glowing echoic ashiest winterier semiconsciousness industries joblessness enshrine infarcted retransferred epitomes shaves saxophonist piddling submersions skydiver racked enate filagrees calciums madrigals canadianisms extricates newsiness swimmings rarified synovial requisitioner"@en ; + bsbm:rating1 "8"^^xsd:integer ; + bsbm:rating3 "10"^^xsd:integer ; + bsbm:rating4 "9"^^xsd:integer ; + bsbm:reviewDate "2008-02-12T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-18"^^xsd:date . +dataFromRatingSite1:Review321 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product27 ; + rev:reviewer dataFromRatingSite1:Reviewer17 ; + dc:title "disorients disapproved reembark tracts" ; + rev:text "hdqrs republication passed roughs demonstrationists pandas testings gravest trillers belling upstrokes chastises lucite basest prebend hindustan postnatal glisters radicalizing risque pointe heroical communally vainness whoreson seasoner absolved bartended fellowing preprint barracks meshes rehearser stacks supervisal brooded reconditioned blurrily ruptured stopped helplessness shoves speiled seamount creepage motile quoters acct atmospheres kinks censors reforge overhands arranging subversives poisons mayflies extemporizes flittering sevenths"@en ; + bsbm:rating1 "3"^^xsd:integer ; + bsbm:rating4 "2"^^xsd:integer ; + bsbm:reviewDate "2007-12-19T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-04-24"^^xsd:date . +dataFromRatingSite1:Review322 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product52 ; + rev:reviewer dataFromRatingSite1:Reviewer17 ; + dc:title "regulatively overshoot breadbasket realize analgia reenlist" ; + rev:text "anniversaries purports lutes goddam monkeyshines desiccation tieclasp plonking lineate queried tanyards encounterers irruptions destructs cackled coempts capitalize insufficiencies arbitrament paramountly ecumenically webworm meshed ticklers slinger flapped glandularly parasitologist orientates overconfidently concatenates fusels irresolutely amaryllises marathons purchaser emulsifications impoundment antihero bamboozler cupidities repulsiveness twiny menacingly canoes shrubbier ascendent sweetened sanely encoder maternalism clucking vacuumed escalade devastator vexed balalaika wholesales amounting tinklings foundations stiffish vapidness yashmaks stenos forzandos madre disasters decentralize ordinances unchastely intumesce commas wirepuller refreshment pedophilia depends hodgepodges mediatorship crankest headhunters smugly epidemiologist sheepshearing categories knockoffs bedgown renegotiates pongid"@en ; + bsbm:rating1 "9"^^xsd:integer ; + bsbm:rating3 "3"^^xsd:integer ; + bsbm:rating4 "8"^^xsd:integer ; + bsbm:reviewDate "2008-01-08T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-24"^^xsd:date . +dataFromRatingSite1:Review323 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer3:Product97 ; + rev:reviewer dataFromRatingSite1:Reviewer17 ; + dc:title "conventions swaps martingales disrepute restorable assemblers telemeters" ; + rev:text "jaggers unerring spicily reanalyzed readjournment gumboil blackouts suites shucked urinalyses actiniums noninjurious snuggery dermabrasion reenlarging bioengineering folkmotes spurrier icefalls northings intermarry shearers parity surfiest lightfaced fakir charades kindler stockinets imperfects billhead trickier ravellings susurrations shelves subalpine decried steelier improved tracings opinionated updating slowing reinserted imaginably suffered unifies unoriginal topples carports corrugators atman margays outproduce scabbily coverlets merchandises violinists convincing sparing chivalrously aladdin doweries completed jerkin prodigiously reinvolved toter galoots italicized cagy epicenters uncannily anatomizing sewers giggler hairpieces inhumed desolation vagrom addible availability weatherproofing expediencies jiggles mistitling caricaturing industrializing distractibility seasonally superscripted middy automatically swallowing defoliants integrals quiches nitros confessional careers galatians shew prescribable handicaps nonoperative unpoetically flinder reassessed undiscovered triaxial yodler loners gleesome standers voluptuary prescriptions finless reprography uncommunicative countrywoman dehorning pyrethrin rackets computerese castigatory vituperative monogramming pretors deserts procurers eccentrics bander sapphist clevis mounding hefters assumable whooplas nooks obscures copals ullages racist homer datives enablers nonclinically spurns jabbed flyblown sleeved woodsiest asymptomatic monosyllable reburial reuseable carnality imaginable swerves teaks gnashed deterrents stockyards stupendously omnipresence sennas drafts solemnness depicts eradication seaworthiness palavering bafflement aquarist mermaids ferrymen grumpiness denicotinized seraglios phrasing uneasy redrying"@en ; + bsbm:rating1 "10"^^xsd:integer ; + bsbm:rating3 "6"^^xsd:integer ; + bsbm:rating4 "10"^^xsd:integer ; + bsbm:reviewDate "2007-08-27T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2007-09-27"^^xsd:date . +dataFromRatingSite1:Review324 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product82 ; + rev:reviewer dataFromRatingSite1:Reviewer17 ; + dc:title "suddenly antihistaminic countrywomen headlamp patchier altitudes trucks zooms cardioids dechlorinating chemotherapeutic deems vehemence gentians" ; + rev:text "grassfire cardinally aurated dilations subhead shucker menthols cajolery trowel rebirth spotter methanes assuages jingoes xylophones overglazes copyreaders workfolk encode debarked computerized diverticulitis baddies partaking ragamuffin cooly atomizes fidgety nettable primers importations foreshadowing putterers perpetualness damager tufters evaluates disproportions daguerreotypes overmaster bobsleds barring fineness interbank yashmac stubbier hauntingly cyan museums sambaed turfless hypertension stubbiest mariposas unsatiable brushups arranger cardiologic cassino fresheners flounderingly nonhabituating yaps predator flagellating hairlessness sunwards obligato exquisitely predated dogfight naturalism edibility sabers jouncy overprotect crusted slogged writer recomb benignant spelunked colostomy detachably safes invaluably diffuser rhinoceroses hectoliter slowish estimations vesture interferometries teachers primus iring intreating gothicist"@en ; + bsbm:rating1 "3"^^xsd:integer ; + bsbm:rating2 "8"^^xsd:integer ; + bsbm:reviewDate "2007-09-09T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-04-14"^^xsd:date . +dataFromRatingSite1:Review325 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product42 ; + rev:reviewer dataFromRatingSite1:Reviewer17 ; + dc:title "worrit mysteries truffles deciphering connectives" ; + rev:text "titaniums asymptomatic requisitioning outranked holdings horsewhips barograms shakos lingers noninterchangeable makable homilist veiners shutterbug plumps sextos scrag empaling librettists estates scut peachy iller straightener unties atones accompanyist recelebrating execration bobsleds supports milligram whimsical salved lavaliere daddling kazoos proprieties clinched muslims captivated indestructibleness phrenology reascent miscasting unmingled anabolic reanimated regents stooled tillages mistrusted nonextraditable lours stubbed vengeant overindulge qualmiest unofficially mopeds seignior medaled jaggers hoopster pacifiable cullets undiscriminatingly carper reprography pone commuted ascetically omnivorousness seamsters suckering peres lymphs marses markkaa beaufort threating personifying abrogation moory corrugation launching unraised noninjuriously triskaidekaphobia unmitigated replace outbidden exhibiters reproachable tinstone matter disavowal scooping uncoffined twilling studiers tantaluses embezzler rarefiers sybarites treaders grosz installer poppet mitigated sopors irremediableness swamies interfering rousting wifed dicey formulates dynamited equipments horticultural howdah classily gentians bicolor grogshop noneffective raininess rakishly snootier necking"@en ; + bsbm:rating1 "8"^^xsd:integer ; + bsbm:rating2 "6"^^xsd:integer ; + bsbm:rating3 "6"^^xsd:integer ; + bsbm:rating4 "1"^^xsd:integer ; + bsbm:reviewDate "2007-10-11T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-04-04"^^xsd:date . +dataFromRatingSite1:Review326 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product49 ; + rev:reviewer dataFromRatingSite1:Reviewer17 ; + dc:title "malignancies generalizable drably foretastes disjuncts destructed percolator para execrates" ; + rev:text "fastenings safaris throatier breviary rescheduling outstretches typhoidal obbligato adorning spinoffs computer nonelastic universes nonmystically wooshed glamoured tarriest goop subfamily gillied inuring running resettlement cryonics mistaken determents iambuses vichies baldest emigrates truncated permeation drowners olfaction dialogic atypical churrs affrayed unseeing alines norseman inadmissibility trowel demilitarizes frizzes phalli lumpier deviators lilting binaurally swampiest unfreezing sunups complaints afterglows mushed sampling lumped infecters defecated syntactical pubes perfumed dekagram unimpeded soils leftwing recontests cabbalah maoist sorrowfully exorcized menisci hybridizers bioelectricity undercoats parimutuels blighters preestimated siphons dingdongs sportswoman reconsolidate reformulate stemmers hydroxides vasopressor upholstered worrisomely obsoleted insoles hackling crowds sickliness tramell blattering stockiness semiyearly immersing carrell wines solubilities majestically lupuses meltable izar outdistances nitroglycerin vaultings bagpipes influxes decomposability tusking downrange valences forenames impeaching nonemotionally idahoans armouries elater leafless neocolonialism dozing carnivorous gasses assisi trussings solutions rogued renewable assimilates bleeping avianized catapulted dissecting cussers unconsecrated unreadiest deist nonsusceptibility eponymies bulletproof oceans extrications longer chelates windowless orogenic subnormality bloodlines bouillon quadrates baloneys handguns"@en ; + bsbm:rating1 "1"^^xsd:integer ; + bsbm:rating2 "5"^^xsd:integer ; + bsbm:rating3 "2"^^xsd:integer ; + bsbm:reviewDate "2008-03-10T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-04-13"^^xsd:date . +dataFromRatingSite1:Review327 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product35 ; + rev:reviewer dataFromRatingSite1:Reviewer17 ; + dc:title "clabbered punishability friability overmagnified participial rejoiced berhymes" ; + rev:text "musky frogeyes hypersensitize yachts bicarbonates counterculture numerously kebabs practically waiver sieges disfigured gweduck nationals acidness cherries astringents unnecessary deposable uncanniest improvised stills blistered untactfully solubly puton jeering haunters volts watchout overrighteously distributively unrelated professoriate cringer scarcely enplanes sucroses upswelled teetotals terms geometrical sarcomas equatable razers aquarist conditioner scrimping francs shriven inly mezuzas vacuolar overemphasize interrelations nonexisting advertised gunfighter nonrepresentational fluoresces detoured glyphs steerers halflife forethoughtful reburies illegitimated harken compared tarps toddy bottlefuls zionist pyx generating onanist undeceived pumicing espousing arizonian demiurges records lawnmower earache daces fledgy meanders slipsoles unstirred czarevnas hedonic cyclers granularity"@en ; + bsbm:rating4 "5"^^xsd:integer ; + bsbm:reviewDate "2008-02-03T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-09"^^xsd:date . +dataFromRatingSite1:Review328 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product39 ; + rev:reviewer dataFromRatingSite1:Reviewer17 ; + dc:title "pestled tetrachlorides foreshadowing reflects repassing winterers nonindependent embitterment bobbling trouncer gynecologies sinners scrutinizing nullifying nobble" ; + rev:text "cuirass goofball laboringly causelessly papules helicopters republica terms eyeshades lexicographers cooper kantian reinsuring tweakier reductio pseudonymous differently aliment permeation ornamented impatiens japery stintingly pickers dickers maturer transits barnier fanciest civilized backless irreverences overtraining consistencies prosperously humphed dissimulating anglicizing chemurgic ills neats requisitions teetotaler countermeasures cathect summarizations semisoft prepackages henceforward monitored workhouse mildens planktons introducible penalties misereres buggers inconclusiveness upsets personifying punted peccavis relinquished workingmen sketches saprophyte exploder soberer freshet elbows companionways shadowboxing reordain defiler bonuses amusedly fennecs afterthoughts unprintable rumblers latvians stretchiest quirts rubblier anythings harrying prowesses misarrangements hiving bankbooks snatchers deferment tenderheartedness restricted courteousness yokels rototiller buglers tranquility twitting adapted rented threads lunches retype"@en ; + bsbm:rating1 "8"^^xsd:integer ; + bsbm:rating3 "3"^^xsd:integer ; + bsbm:rating4 "3"^^xsd:integer ; + bsbm:reviewDate "2007-08-02T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-02-15"^^xsd:date . +dataFromRatingSite1:Review329 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product66 ; + rev:reviewer dataFromRatingSite1:Reviewer17 ; + dc:title "wardship incompetents tantalic heliport harbour mafiosi" ; + rev:text "uncontrolled trameling reprobative modicums illogics freezed popularizes underhanded abscond wedgier correlative scandals prebend oncomings nickelodeons exiting cyclamate dalesmen squishing pleasantly wrested unobtrusively unedited phosphorescence ditches scoffing unused stockings lustering gargling cauterization potences loathsomeness spiciness quenched payrolls ungrammatically alamode systoles prospects chafers repugnance ratchets drudged confederated darkener fetuses justifying presynaptically adenoids naphthalene cannoned encouragingly entireties ascertainment matriculant silicosis carcinogenicity rousting slackers solider hemisection nickelodeon scaffolding cylinders commercialism reefy rosed toxicologically jobs dominions cerements telefilms nocked deash scooted pieplant quackisms apprenticeship detestably wakened impugnment prebilling shrubbier sirloin mandibles unusualness vestural perspectives hokypoky pinones kindlier provocatively lumbago evinced shoddies obloquies conceited vainer magmas segued semination titles badmouth diptera untenable laurelling sailors traumatization spiritualism khalif compartmentalizes diverters impermanent engorgement disfigurement dollying gustation azido sheeting diluting sinecures benzoate defiance casting laughably departmentalized overwilling accelerator circumambulate crusts grubstaking actorish tacitness buckwheats assurances telemetric traditionalism insulins lightfaced excludes coronations dispatch schnooks wrigglier etudes censer tubules disported preengages sharpy usages cytologist revisor structuring merits blindness appendectomy proponing moorage"@en ; + bsbm:rating2 "7"^^xsd:integer ; + bsbm:rating3 "10"^^xsd:integer ; + bsbm:rating4 "9"^^xsd:integer ; + bsbm:reviewDate "2008-03-08T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-04"^^xsd:date . +dataFromRatingSite1:Review330 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product21 ; + rev:reviewer dataFromRatingSite1:Reviewer17 ; + dc:title "noxiousness sidings ovular wastable maximize stoppling unwed folic wholely sleeping planetoids excepts laired purposefulness parlors" ; + rev:text "homeostases recuperates morganatic unrentable liquored ladyfinger suckled clerkish badged reproving coddler gossipers triunes fulvous bedeck farness undervalue acknowledged handles alighted asystematic copras dirtying titivate rappels bunts mesmerist curliest roughers levator spruced cursively chitlin psychoanalytical pagination stealths acidified brasiers cultist traitoress shirtfront cattiness forgivers jerkier amiableness dissimilarities commending apostrophes yellower inclusions mononucleosis jocularity serologically repetitions politicoes overbear odeons smilers station crossings misprize fizzed outweighs reweigh scrabblers trochoids tails gallamine splendorous nonseasonal belabour anguishes equivocalness purging datums vocably gastroscope conceitedness nobbling clubfoot reedit alarmingly"@en ; + bsbm:rating1 "2"^^xsd:integer ; + bsbm:rating2 "2"^^xsd:integer ; + bsbm:rating3 "3"^^xsd:integer ; + bsbm:rating4 "7"^^xsd:integer ; + bsbm:reviewDate "2007-12-24T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-04-14"^^xsd:date . +dataFromRatingSite1:Review331 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product85 ; + rev:reviewer dataFromRatingSite1:Reviewer17 ; + dc:title "outdistances parvenue tertian hydrangeas flutes unparalleled bypassing kegs rosettes exactors archivists shovelling primitives" ; + rev:text "hockeys timidities frees reassert incorporeal graftages shilled nabbing sisterhoods invalided amnions cleared contraindicating champed clodpate chumping ungallant submarginal batched paroxysm testee hellenes jackpots carvings bollard tenanting awaiter overstayed syncopates blinking underpaying crawly stamens tawing hemiplegic crocking twangier hushaby cudgelers demodulates nonextraditable oddest commitments cravenness untamed nonattributively denaturing lightsome demoiselles waterloos sextupling serially dejection altercation bioengineering tailbacks unwon strengtheners plummiest charlatans unwarrantable cobbler roble canthi overspending beamish unicycle chlorpromazine duelists collections lofting pudgy cases subjoins limbos cesspools cliques disqualifying radiometries soliloquized guideposts sexological runnings legislator guldens brails dissertations quincunx abhorrently outstands irritancy mandrakes devisors gastroscopic celandines neatens quia forerunners whaleboats overachieving flatteringly orgiastical provably electing windburnt reenjoyed disloyalties spunkiness undeniable"@en ; + bsbm:rating1 "7"^^xsd:integer ; + bsbm:rating2 "2"^^xsd:integer ; + bsbm:rating3 "6"^^xsd:integer ; + bsbm:rating4 "10"^^xsd:integer ; + bsbm:reviewDate "2007-07-20T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2007-11-16"^^xsd:date . +dataFromRatingSite1:Review332 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product73 ; + rev:reviewer dataFromRatingSite1:Reviewer17 ; + dc:title "fierily berettas farmsteads beheads hansoms" ; + rev:text "scrapple fritters mealier jangling toasted humiliatingly convalesces algorithms polyclinic ticktocked lordlings requiems misdoubted redries hornpipe sourly skys edginess arranged transgressing guarded purchases redes socialism substitutability maims sweetest ecclesia snored conveys overbooked broached yakking breastbones winned centrifuged terrifying laughed hotheaded bowfins percussor hopefuls strokes languishers authentications cannonry recleaned concedes inflexibleness redeems expansionists paralyze declarations nattier realer edges supporters roofline whetters waifing impersonation henceforward photocopying assayer archaize greatening tzimmes resignations wanted insulter lonelier grillework reconcentrates intrepidity dowdyish hutzpas clumping smuts bulger connives rigorously cannonballing anaesthetizing blackmailing hummer pests legislatorial odoriferous psychoanalyzing invalidity oligarchies tertials gasworks baldly clavierists gullable pilothouse seniles condoning wielding lissome dreadfulness hulky disrupted newborns curseder unfetter elixir diarrheal megohms unrolled calenders jeepers grandmothers apologue ophthalmological totaled alphabetizer franker bodes prevued grunted rampancy newsboys underwinding fumigated philanthropist salacity travois preadolescents nooning nonrepresentative courtships overextend unsightliness escalops mismanaged greeting"@en ; + bsbm:rating1 "9"^^xsd:integer ; + bsbm:rating3 "10"^^xsd:integer ; + bsbm:rating4 "4"^^xsd:integer ; + bsbm:reviewDate "2008-06-14T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-16"^^xsd:date . +dataFromRatingSite1:Review333 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product56 ; + rev:reviewer dataFromRatingSite1:Reviewer17 ; + dc:title "bolthead unyieldingly restituted sprawler canewares" ; + rev:text "heedful reconsiders yenta sideshows blockading comping widgeons readier collectors snoutiest empyreal preglacial abstruser optimisms basses anxieties vertigines muscly cheesing inhabitress exercises dona associator aftertastes equestrians polyandric poppers goofier fuzils liana nervation dreamed inliers rainwears schwas pakistanis mafiosi singing cookies semicircular elidible rehabilitates tragedienne pellmells threaded rashers reaffirmations derisiveness scalping lienholder glaziers vicegerencies biflex vivaries reediting stanzas alienable quibbled cocain marshalled hoagies"@en ; + bsbm:rating1 "10"^^xsd:integer ; + bsbm:rating2 "2"^^xsd:integer ; + bsbm:rating4 "3"^^xsd:integer ; + bsbm:reviewDate "2008-02-16T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-31"^^xsd:date . +dataFromRatingSite1:Review334 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product44 ; + rev:reviewer dataFromRatingSite1:Reviewer17 ; + dc:title "childbirths scleroma nepotists temporizing inconsiderately frankensteins hollo bequests coverups handsomer digestors" ; + rev:text "interceded rassles mayflies deadlier overrighteously moistly repudiation feta bins hatband stomaching tagboards cocked pulque philanthropies overbuying guilelessly strings submerges nonequals befalling graphemes vaccinal trendier embosomed recolonize retinas unmounted potbellies countess fleered toffy asphyxiation repatriate unbolts horsehide proclaimer ambisexuality woefuller specializations krakens unbalancing associations succour smoldering rearrange ampleness accused millionths vernalization predicaments rhizomatous nimbly unreturned"@en ; + bsbm:rating3 "7"^^xsd:integer ; + bsbm:reviewDate "2007-11-02T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-04-09"^^xsd:date . +dataFromRatingSite1:Review335 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product37 ; + rev:reviewer dataFromRatingSite1:Reviewer17 ; + dc:title "ermines heydey decoder resonances processions pseud shirty shiningly geckos klutziest disfigurement goliaths decoders clamminess" ; + rev:text "sized extortions participles vibists fretsome prearmed asphyxiation correspondingly shouters novelties geeing ensnarement bellybuttons desalts splenectomy decompensates hindquarters engrailing sifts weatherman crawfish armigers directed obeyer shunpike olograph presoak overstimulates deejay linacs differentiated mollycoddler cosmopolitans alerters underplay inkblots nonexplosive distinction wirehaired cl encouragers disarmingly circumambulated photocopy proselyte grievousness leggier japingly clunked monstrances yams rockfall composting torquers aport wooing rifeness potence affirmer prewashes embonpoint discombobulated osiers earnestness motioning sidesteps dusted ratiocinates barraged mux inconcealable carfuls gypsydom doctrinairism calluses acclamations breeziest obesely lyriform accelerators troublemaker hundredweights blueish misinstructing rathole subprincipal drenched hotkey respondencies grouchily broncobuster spumous disengaging congee reproachable fabrications perdurable supped lustres dishrags redistilled allies patricide colleens indefatigably barbershop unpresumptuous mouthiest"@en ; + bsbm:rating1 "9"^^xsd:integer ; + bsbm:rating2 "6"^^xsd:integer ; + bsbm:rating4 "7"^^xsd:integer ; + bsbm:reviewDate "2007-07-22T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2007-11-01"^^xsd:date . +dataFromRatingSite1:Reviewer18 + rdf:type foaf:Person ; + foaf:name "Emmy" ; + foaf:mbox_sha1sum "ddb571d54b193e6bdc275cbe34e402a6ca9ece" ; + bsbm:country ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-07-08"^^xsd:date . +dataFromRatingSite1:Review336 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product80 ; + rev:reviewer dataFromRatingSite1:Reviewer18 ; + dc:title "wawls computations plangent asthmatic representor leftists conoid zizzling ounces carbineer lips lube hermeneutical" ; + rev:text "unclean verses tiptoeing czarisms topologies beneficiate parachutist tussock smoothie jerkin cosigned calibrations torched inevitableness denarius icons antisepticize foldouts amounted rammers encasement moderator seaquakes pigmy berths establishments ornithological corncob crocks underdeveloped playthings stratocumulus unreadier snowmobiling roguery syllabifies chestnuts tremolos flunkeys velcro teacake umiaks eucalyptuses physicked tutors hammier emerging drawers forelocks apiologies gleans reassesses overexpose decommissioning slaters rubato cyclonically subdivide hedgy scarless vouchering keratitis mounter dystopias parred ablation kebabs dyslexia disclose congregation exobiological heathens swooped deacons lackeyed preblessing nodules coinsurer assisi flies unbacked kitharas vicarate thruput wildcatting twiddled platters salvagers ledgeless legalized whiskery talcums fortuitously generatively indenter pulps dawdling paras baryonic hag hanging outrageously stuffiness mechanotherapists stimy soaker sass burgled roilier weightier cagily pilings chanceman branched crustier denuder nullifying snails crisscrosses gods reasonability digesting raunchiness"@ru ; + bsbm:rating1 "5"^^xsd:integer ; + bsbm:reviewDate "2008-04-29T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-18"^^xsd:date . +dataFromRatingSite1:Review337 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product93 ; + rev:reviewer dataFromRatingSite1:Reviewer18 ; + dc:title "cretinize incensed degass harvester" ; + rev:text "melding pedophiliac subtenant capitulator semibiographically tourisms termagants stained mollifiers riping hotelmen roistered numbly impaling electrocardiography bandannas reduplicated algin duodecimal remunerators existentialist witticism bandanna misguiding velured scurried rioted senhora micrometer tocsin bodiless fancywork dray unterrified tercentenaries skidder japed foreknow postboys delis distiller nonimmunities buoyance assignees lasers argled gimps graphologist unbend prolapsing longitudes rebukers mailer adjectivally divans canards rums nubbins strep newish caravel gimmicks beneficiaries depicter disorient damosel unsociable husks laking uninhabited undersells unloosened sypher thalami inundation stewarding ceriphs"@ru ; + bsbm:rating1 "8"^^xsd:integer ; + bsbm:rating2 "10"^^xsd:integer ; + bsbm:rating3 "9"^^xsd:integer ; + bsbm:rating4 "8"^^xsd:integer ; + bsbm:reviewDate "2007-10-04T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-01-07"^^xsd:date . +dataFromRatingSite1:Review338 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product56 ; + rev:reviewer dataFromRatingSite1:Reviewer18 ; + dc:title "poetics trueness legislatresses demotions retributory overgrazes hallelujahs semiconscious tipless paltry chymists mothery conte disfigured" ; + rev:text "forgetfully carolling neutering rissole cumulonimbus lackeying corollaries geologer ophthalmoscope unlocked seasonably politely supporting underdresses cosmist ecstasies anomy captioning orthographic inartistic whooplas dimpling yemenites slobbery catheterize feasibly denicotinizes electees epicalyces obfuscable unpriced nanowatt schools hollo putout outworn primatial cycler couplings batiste unmarketable praxes sociably preengaging argyll issuers tessellations marlier instituter flowcharts nickels inflationism intones handbags umpiring overinsistently obliques acoustically wirable resaw gnawable leeriness opacifies fecundation digester yeastiest vaunts fashed rewiring nihilistically tillered sourballs habile operands sanding odorful stepfather infantility corroding jimsonweed catalyzers ionizations repopulates rectorial personifications unstacked exurbanite resituated lariated smilers micrograph zephyrs americanist sobbing turnspits osteitis boloneys deducted packsaddle birdcage unpersuasive overhung flophouses triggers dogsled bankrolling weedless dusting brindled deserted trisection veritas chalcedonies scribes edictally onefold weaner retributing hexahedron overcome sprucy undiscriminatingly misbehaver cruises shadings hempen minx burgee chicle wildlings muzhik duskiest yours stonishing stainable stancher hissing flamenco ajiva inflictor nonreciprocals"@ru ; + bsbm:rating1 "7"^^xsd:integer ; + bsbm:rating2 "3"^^xsd:integer ; + bsbm:rating3 "5"^^xsd:integer ; + bsbm:rating4 "2"^^xsd:integer ; + bsbm:reviewDate "2008-06-11T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-18"^^xsd:date . +dataFromRatingSite1:Review339 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product78 ; + rev:reviewer dataFromRatingSite1:Reviewer18 ; + dc:title "sprucer stipulators wraparound samadhi poppies pylon womanize cockily slaved" ; + rev:text "nervily impeded laddies woofed billeting segregating biocidal pharmacopeias affraying confederation earaches nazifies fogs dulcimer enflamed amerindians teaberry bollixed glamorousness deviates hinted nonproliferation chlorinates helmless trimming nigglingly dynes sacerdotally madded shatters cathedrals discases footbaths sooner unblock zooplankton conjunctivae hooters dunning busywork personalities bales fustians freezing slouching photoengraved hassels pistache revolutions enumerator telluric excreting preyers traitresses fortnightly addictions infundibular tolerated quarto motivates wheelies helicoids bravest inlets mux eardrums softbound foresaw testis greco honours inharmonic bowingly hastening nosh favorableness obtrudes disapproval fronds inviting incarnates luminesces mesdemoiselles dames nightcrawler skirmisher windowing pupfishes percolator pulleys thralls instructors irrupted driftpin bastardizes delvers protuberance adits peneplains couths phalluses laughings conformist darker unengaged liverwurst touching stamper chariness superciliousness effectiveness varietally reclining automobilists unbudgeted kerfs lupins girdling flummoxed trolls pome tangled copycat feminizes outsold ragtimes ecumenicism wakers dollied subroutine pseudopod listening directorates auditories peasantry sideliner ponchos reparable quitter bibliographies victimized extermination recessionals whooped heartthrob vaultings inclusiveness overstuffed unmanning sweethearts mesmerizers resubscribing harkens kernelled pardoned kopeck podgily revisionist appropriative bubbled livable alopecic stockpiled complexions underlined unctuous dorms nuder insentient epiglottis affectations amplest defecting billable gateways diphtheritic employability"@ru ; + bsbm:rating1 "7"^^xsd:integer ; + bsbm:rating2 "10"^^xsd:integer ; + bsbm:rating3 "5"^^xsd:integer ; + bsbm:rating4 "8"^^xsd:integer ; + bsbm:reviewDate "2007-07-16T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2007-11-09"^^xsd:date . +dataFromRatingSite1:Review340 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product79 ; + rev:reviewer dataFromRatingSite1:Reviewer18 ; + dc:title "dollying commandos shocking sanitates rented flatcars accommodator provides taxpayers pawnable disconsolateness magnesian gleaned illumines" ; + rev:text "slashers weaknesses bromides khedives donjon rebuked lanais epicenters actuality electrochemical archaisms clarification jumbler wailing fumigated eyelashes liefer migrated fantastically bentwoods motived somniloquies preconcessions dissipator causeys unific barbels bolos priested tinstones revaluating approaching quartzes propjets unavailability vanquishing servicers bloating gamester overstate guanos oilskin abler curbing engrossers rediscovery rheologic narcissists pitiless reiving incontestability anarchical flagellations ourangs inequitably semiaquatic hypodermatically nationalities anonyma parasiticidal cartographers bosque uncircumstantialy mustier dewfalls hairband"@ru ; + bsbm:rating1 "5"^^xsd:integer ; + bsbm:rating2 "5"^^xsd:integer ; + bsbm:rating3 "1"^^xsd:integer ; + bsbm:reviewDate "2007-08-04T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-01-07"^^xsd:date . +dataFromRatingSite1:Review341 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product60 ; + rev:reviewer dataFromRatingSite1:Reviewer18 ; + dc:title "invited mechanisms laved brims dissents accumulativeness crucially sheeney nighter redistricting" ; + rev:text "malfeasantly unaspirated boats nephews riles squalor chigoes haft pajama caddishly rushes retinoscopy contender conventionality cardiotherapy trustable shallower crystalize lofter psaltries geniture lollypops volcanically fearlessly unleash thereinafter inquieting masculinization conterminously selenites jezebel agglutinative blessing varietally uniformity gaugers reembodying coulees tirelessly absolutists devastates palatinates imposters puce myna warks imbalances obviating succeeds japingly heaters resubmitting toters mastless dependableness schmaltziest coiling stedhorses masculinize manifolding troublemakers leaned hetaeric accruing overcurious vocatives ab carnivals misidentifying changer ambushes afters unbalance demonologies sandaling obols balding extenuates nondrying sauces bewrayed anatomized hypoergic golfings determinableness progressives hypersensitivity befits"@ru ; + bsbm:rating1 "4"^^xsd:integer ; + bsbm:rating2 "3"^^xsd:integer ; + bsbm:rating4 "10"^^xsd:integer ; + bsbm:reviewDate "2007-07-17T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-03-20"^^xsd:date . +dataFromRatingSite1:Review342 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product50 ; + rev:reviewer dataFromRatingSite1:Reviewer18 ; + dc:title "nitwits recompute bifocals lintier misconstructions integrator reoccupy stigmatization amputator nonemotional metricate vicariates radiometric" ; + rev:text "dx enravished heparin worshiping heisting moldiness arcadings uncovered flirtations unforgettably shovelsful psaltry unsexing lockjaws diarists upheaving prejudgment seesawing intromittent ovality marimbas seafarers hoteliers splotches feedbags honouring bothered rededicate geosynchronous pens didos lazar recitations laudator deportable casuistic potting bits logiest hyperthyroids coitus crimpers brownouts alphabetizers beefsteaks monisms titty reboarding grossed augury pastimes distractive untactfully weirdly unfulfilled hempweed shirtsleeve burrows cyanin regermination seductively cheepers eyecup raggedly intrenched ambiguousness photomural sentimentalize cardia stepmothers specificized rethink peridots uncensored jettisoning hayricks fetas therewithal cribbings leering underfinanced accretions irredeemability sneakiness stouts contracting metrication photocompose flacks bigamize wobblers tannates porgy revolutionize miracles intergalactic buffy undecayed gavels carbonating nattiness raging ameboid tardo cajaputs anisic gunpoint trachomas acknowledgers intruding voids advocated cultured neocolonial influents kindly sitars mesalliance incitations dianthus intrastate scums aery cupola sustained secreted effronteries caster unpromising scantily doses claxon unreelers bencher ciscoes snobberies prizer tendons eschewer scarificator quat capful bipotentiality standardization mistitling vivaries escaper chintzes scapulars mileposts fomented rousted abortions snowmobilers slaughtered endemics inhalant aliases pentobarbital administering vizored spoofing tailcoat motoric vaultings prettification eurodollars pluribus haggler oxters lounges grandaunts biannually unaccountable tapiocas download"@ru ; + bsbm:rating3 "6"^^xsd:integer ; + bsbm:rating4 "10"^^xsd:integer ; + bsbm:reviewDate "2007-12-06T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-02-14"^^xsd:date . +dataFromRatingSite1:Review343 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product74 ; + rev:reviewer dataFromRatingSite1:Reviewer18 ; + dc:title "forsaker ladles loutishly regimes blimps calcification adducted benevolently laparotomy rigors headaches" ; + rev:text "showrooms rainmakers therms faugh pollsters thorning agreement koalas triflingly execrations unattackable ageratums consolidation countersigns scaliness letterers redelivered subtracted gunships moldboards embarkation troubling pulsejets intercedes mends sancta denaturing cermet kinematically cosmically similarity squarest diminuendos nastier amendment fluoroscope malaprops solitariness annoyed backfields jalap dovetails broadens centres resulted masturbating epiphytes aberrantly cockles embracing reallocations doling drawbar trouper scintillometer swashbuckler electrophoresing lightness dasher laureating paroxysmal glamorizing pitying involuting bubblies snowbirds unfailing runes experts oversensitivity tropisms hoaxes brokerly thermos securable tosser dreidels glides tuneably bailsmen sheenies biparental abashedly mineralizing conners cognizer religions perceivably proprietress touchup seminude neurobiology nonunionist pellagrous microzoon appropriator tramps incorporated choreal gigglier neighbors kookie fluoroscope funding remonstrances epicenter introversions severation savors insentience superhighway dews raper multo sackcloth toeless reconcilements orchestrations journalism hasid baedeker slatted tuberosity artfulness leaded oligocene wooziness margrave slowed outpaced rummer spoofed dethroned osmosed vocatives hallways detective daring jangles volunteers leaped subclassifies shoveled nonabsoluteness prolongations carboras shuffler apostrophizing bifid manipulatively nouveaux totter uninformative wantoning reputedly eugenists mukluk whirlwinds diviner rationalist gaoling croqueting adrenals restfulness carolers borty knurliest statically valuating disadvantages abolitionism briquets proselyte merrymakers overambitiously smooched traffickers suchness rive spondee tinklier autobahn jeopardize"@ru ; + bsbm:rating1 "9"^^xsd:integer ; + bsbm:rating3 "5"^^xsd:integer ; + bsbm:rating4 "5"^^xsd:integer ; + bsbm:reviewDate "2008-01-25T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-04-27"^^xsd:date . +dataFromRatingSite1:Review344 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product12 ; + rev:reviewer dataFromRatingSite1:Reviewer18 ; + dc:title "hits sillier searchings selectional dosses starless appellants recs endlong internationalizations" ; + rev:text "zincate acquainted versicles omnipotently cutinizing stroked earliness blowers sunspots facie nonparametric brandies eschewal gluttons holographs welcomers suavely firebreaks rewrap rheumier yuppie kummels alated anecdotes pretends deludes gimped shadowers spottier scholium faqirs impunities orneriness antihistamine pharmaceutics aiming monogram nonconformism shovelling naphthas rhymesters lucite elegantly contractibility eristics massagist milksops backwaters drumheads advertisers esophagal regulatable phrased psychosexual arrowheads finagle antitoxins confidentialness reverence staves unreported bruisers panier elkhound misaddressed"@ru ; + bsbm:rating2 "8"^^xsd:integer ; + bsbm:rating3 "6"^^xsd:integer ; + bsbm:reviewDate "2008-01-14T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-02-22"^^xsd:date . +dataFromRatingSite1:Reviewer19 + rdf:type foaf:Person ; + foaf:name "Lucinde-Titania" ; + foaf:mbox_sha1sum "d48e27c4df556489f2af18b7f88214364b2f14e" ; + bsbm:country ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-09-10"^^xsd:date . +dataFromRatingSite1:Review345 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product54 ; + rev:reviewer dataFromRatingSite1:Reviewer19 ; + dc:title "mediative anthrax analyser redemand natures opportunely brewage murmurs" ; + rev:text "screwing vatful upstrokes phagosome impairing unoppressed chaperonage irreal preschoolers electrophoresed mots bipods complexions releasible corrugations heinies excursuses fuelling detractive downloads adventures paganism epoxies plotters maintainers straightedges presidiums chivalrousness misinformant hybridizing ceinture antes peashooter connoted crocket tokenize retarded musculatures clutchy apneal thoro leafworms cousinly chefdoms bolero biogeographical females ineffectiveness peppily trilled replying infirmness bunchier risking detonation duodecimal unhatted beseechingly swaddles saprophytic noncontinuous earnestly dowdies entitles inundations subteens forums semitism photos malaises surtaxes intermediation apically aphorize imbuing stompers baldpates totalized loudly crusading mopper lurers beshrewed rancidification trackings recusants knockers mortgaging weekender humoring fellatrice deflagrates courtships condoner housemaid biforked vespucci undeveloped sneeringly bowfins nonsustaining crayoned thoughtlessness bating starching corpulently cancelable velum clearing packaged meteors results gamic thrones impulses keratosis oversubtlety psyching piques reinflames immobilizing hectoring therapeutically linoleums precondemn sickbays overreacting miraculously bestialities rosalind dosimetries disrespectable pearls cappella riddles tizzy impotence clemently ingloriously sails storks clarinettists translucency jealousies waveys babels cranched avoiding legalism weened socializer dissimilar caucussing militants conglomeration climatologists valval weirds volitions brownstones comports angelically endomorphic reemphasized dybbukim drawbacks chiefer seafowls altering straddling dissecting massacres germinates fungic presumptuousness ransackers maximin prerecorded tanbark mentholated anticipative liberalized brahmanists blindest stoa focusing sakes instated discounting decoct prawns scowed biders toupees dehumidifier dillydally"@en ; + bsbm:rating1 "4"^^xsd:integer ; + bsbm:rating2 "7"^^xsd:integer ; + bsbm:rating3 "5"^^xsd:integer ; + bsbm:reviewDate "2007-07-19T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2007-10-09"^^xsd:date . +dataFromRatingSite1:Review346 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product84 ; + rev:reviewer dataFromRatingSite1:Reviewer19 ; + dc:title "beneficiating unfeminine unbowed benignities jocundly traceably techniques" ; + rev:text "nance adventured serviceability mayday fetchingly sestina godhood exceeded mimeographs figeater doughtily fadings frump sofar paleness vicennial tentering steelies crazily sixing snuffles postconsonantal gondolas abscessed waugh granulator outdodges shales slugabeds toughened singularities mormonism worsted misdiagnoses sycamores reduplicative liaised educations whodunit purported kynurenic dexterous imponderables anonymously kickstand mountings introspection intermediately mitering uplifted piebald acknowledgements japanning cymbalist cantons scrounger prepossessions nonproliferation quantified reassorting solidities gaffed josher cline swirled renewals slangier antral consecrated subtitles jollification ogee praetorian poetasters misdealing prosthetics reconversions championing vindicable spawning wifelier balusters hatters planarias overambitious semipublic hinter pompons temp imparting minoring socially victimized chumminess skoaling overfatigues nonclassical killdees nonevents"@en ; + bsbm:rating1 "8"^^xsd:integer ; + bsbm:rating3 "1"^^xsd:integer ; + bsbm:rating4 "9"^^xsd:integer ; + bsbm:reviewDate "2008-05-14T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-05"^^xsd:date . +dataFromRatingSite1:Review347 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product62 ; + rev:reviewer dataFromRatingSite1:Reviewer19 ; + dc:title "eucharistical dismember lollygag perigees blanchers preconsultations funneling cornices" ; + rev:text "osteotome oxeyes simpatico licitly merchandisable infringing steams fourpenny approbative subdivisions prefabs punkier ethyls scutcheons glowworm raveller farmsteads inadvertency repeaters simoleon consummatory patronizes intombs surreptitiousness earlobe longhorns macerate menstruum antiacid gardens suporvisory souses feeblest unchanged damascene reunion atonics hairbreadth auguster bordures beechier physics wanly rarify rewoven cutthroats welcomes sump coiffeurs stumpers desirable inveiglers salesclerk regularizing unicorns drainer wafered ratiocinative disbelief appareling commercing revalues contemned seizing braillewriter moonshined stealers manipulability agendas corruptive reinvestigates allocators overeating egressed metaling toiling membranal largeness ecotype drabbing outrageousness unreliable swop swampish expirers outguessed dodoism subjacent multivariates untouchably funiculars difference irradiated confederacies broadens licenser birdlimed swerver soundboard horsepowers novelization pledged orates nonlinear adulators unstuck poxed krill nocks angelus aligner kins visored literately prepping anticlinal substandard fishbowls chanters pastern disburser mudra helots beefily episcopacy handsprings mulla mephitis cornerback egocentricity gaggling sheerness libraries destrier biographers misreads synodical legists flensing punchiest advocated diestocks fluoridating mousetrap kinkiest entrenchments fries sparest toggled reconstituted"@en ; + bsbm:rating1 "1"^^xsd:integer ; + bsbm:rating2 "6"^^xsd:integer ; + bsbm:rating4 "9"^^xsd:integer ; + bsbm:reviewDate "2008-02-21T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-02-21"^^xsd:date . +dataFromRatingSite1:Review348 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product48 ; + rev:reviewer dataFromRatingSite1:Reviewer19 ; + dc:title "suborners jigs oafishness nitpicked unripened unsheathed opp stitched dandle clotheshorses depriver" ; + rev:text "counterintelligence surcoat soaker tantra clerics stoically rippable tropisms redistributes lickers electorates tactually personalties columbines obeisances laxness longes botanize spirochetal farfels hibernator consecratory rehem ignobly rottenness dearly sensitized rah closeted silverers documentable gnotobiotics disfranchisement hearkening spendable fingerings relatedness dismembered noncooperative encaged cretinism chowdering cordites preadjustments gofer decently goofiest moppet refrigerates jacketless fulminant"@en ; + bsbm:rating3 "8"^^xsd:integer ; + bsbm:rating4 "9"^^xsd:integer ; + bsbm:reviewDate "2007-08-28T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-30"^^xsd:date . +dataFromRatingSite1:Review349 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product15 ; + rev:reviewer dataFromRatingSite1:Reviewer19 ; + dc:title "cockamamie construing scans bawdily" ; + rev:text "obstructionism imprecation redevelop verifier melder expedience manganesian wrackful subside statable welladay colliery unformulated cached hurriedly squawking bicultural indicting rhymed stogy asymptotical gulled unyieldingly icehouse corrugator streamiest colitic drynesses mocked imperiousness cruxes succored hogs catalyzed cuspidor eulogizers dogcart axises hotted cyclopes peppermints snapshots dewclaw floaty inclined upcurves reburying prearming acknowledgers galumphs pupation trueing tediums overstimulation spattered seine coleslaws venipuncture answers extravaganzas emends stickmen heroines resurgence isometries besnows recreating travoises pistols vacationers reciters trustfulness reunify coopering deflecting countermeasures benthos overstimulates takeout nutriments roadblocks educational fornicatrix federacy badmouths indenter snails preeners hauteur impended architectures smudgiest tangentiality utero collodion kingships arborize tetraethyl collop unprotestingly echoing unscratched chiefdoms diagrams stagers rebroadcast splats glop alkyl pinyons rumba melodist etherish immunosuppressants commensurately dreidls hebraists mismatch fishwife gillers radiations brainlessness deputies idahoans expos flickery misdoubts subjection wyverns pronghorn zeds personalized sealing"@en ; + bsbm:rating2 "7"^^xsd:integer ; + bsbm:reviewDate "2008-03-03T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-04-27"^^xsd:date . +dataFromRatingSite1:Review350 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product46 ; + rev:reviewer dataFromRatingSite1:Reviewer19 ; + dc:title "remigrations disannul reinsman vicarial ramies newsier drumlins separatist vagrance restate superimposing alleyways" ; + rev:text "squiggled reasoner appetizingly jadish visibility unsightliness dresser slidden vaunts lasagnes elucidated unintellectual rested sepaloid stings fanatically encapsulated toupees gilts lamplighter stoutened tacet cheeper economizer baronetcy outjuts lynches primero howsabout receptivity compactor indictors windbags werwolves unfunny refractivity mulching captaincies mongers catchiest disgorges friskiness illinoisan trellising omened payed unpronounceable guaranis hormones principality paupered tracheids draggers forelocks scad hairballs"@en ; + bsbm:rating1 "10"^^xsd:integer ; + bsbm:rating2 "4"^^xsd:integer ; + bsbm:rating3 "9"^^xsd:integer ; + bsbm:rating4 "1"^^xsd:integer ; + bsbm:reviewDate "2007-07-10T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2007-10-27"^^xsd:date . +dataFromRatingSite1:Review351 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product52 ; + rev:reviewer dataFromRatingSite1:Reviewer19 ; + dc:title "lib fidelis antedating herded proofreading vaginated" ; + rev:text "pathogenetic cocobolo allotropies mickeys interments worrier displease enmeshed lignifying broadest diluents dynamically subclause japanizes assemblyman paella finniest geochemists bolas mistbow manages mounded motorcade potfuls toweled haves thetas delimits tem transitional narcotism egocentrism calvities unmuffles infidelities aberration prefabricated scrutator wifelier croup qts ruffing crabbedness ruggedest argils overprotect gridirons subscriptions scalars romancers glimmerings teacupfuls memorizers playboys outmoded inventors inducted forked incarceration maltier brigantines nerts clavichords undeceived agonized busing noncontributory damselflies glaciating bioclimatologies couturiere defatted uvular linker carets shivers dribbles anoints pyrethrum fester stuffier palisading cinquefoils nuggety improvidently ribaldry embezzler vivisectional flywheel unalarming biorhythmicities flattens indiscriminantly pilothouses yokeless overfastidious cycloids dippers relatione unendangered reprice paeanisms sheered syringed understated steatopygia stumpier huzzahs dreggish merer trying pollacks oxters concentrated braise allies recedes noncorroding exhibitioner stellify redevelopment mockeries ionization pandas"@en ; + bsbm:rating1 "1"^^xsd:integer ; + bsbm:rating2 "1"^^xsd:integer ; + bsbm:rating4 "3"^^xsd:integer ; + bsbm:reviewDate "2008-02-11T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-12"^^xsd:date . +dataFromRatingSite1:Review352 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product33 ; + rev:reviewer dataFromRatingSite1:Reviewer19 ; + dc:title "erythema catered drudging ironworker groomed breathes fragility rejuvenates crescentic cowpat kenosises" ; + rev:text "reinforcers druthers scrabbling cityfied metalizes traditionalist needed intoxicatedly walleye pericarditis gobbledegook wabbly castellans disputes bluntest genuflected trickled overtopped leaseholds trusty pagesize densifies superconductor chuckhole paraquat waits charlatan blindage tithes supplementer activating reared tithings innovator minims scurvier charade riffling lamenters contradictions accountability bullyrags librates budgeted modelling jesuitry arbitrates trussing incrimination archaeologists splashiness unsalability glossing satraps wursts yummy overinfluential wakened hazier neighborliness hares crosspieces funks vulgarizations chirped hokypokies vising extorsion sheaths including stuns suburbed transferrer mightiness furcates belabored condenser windings presider pavane friendlies empanelled terminologically unsolicitous toolings thoraces foisting yearns azimuths writable glaziers resisting emissive gumboil mousiest permutationist censed doffer yurt learned inversely gulfier hoary escarping lupins swoon aflutter godship gazpacho legated starched ascensions waster caped worthlessly externally clomping archers abbr tamburas presidencies geminis maturation agendum splashdowns hisself remunerating rebbe britannia differently wrestler liqueurs honeymoons rosed primacies schoolgirls recommitted drumstick momently jubilating glutted contemn gauntly golfing linguine panties cheepers ideograph retracted completing imps misdirection cannily uke soups krill macular prominence relevances peafowls isolation imbedded bodegas undeceives phototrophic revenues foulard standardizing"@en ; + bsbm:rating1 "7"^^xsd:integer ; + bsbm:rating2 "9"^^xsd:integer ; + bsbm:rating4 "8"^^xsd:integer ; + bsbm:reviewDate "2008-04-06T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-03"^^xsd:date . +dataFromRatingSite1:Review353 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product66 ; + rev:reviewer dataFromRatingSite1:Reviewer19 ; + dc:title "feyest captainships orbs androgens mutterer abolisher paleontology tommyrots nonsexually jabbingly rededication specialty unshod clagging totalisms" ; + rev:text "folds astutely discussed jurator icily funkiest speedboating chemoreception consultations postulation gramercy beepers ranees dejections carolinas morels unbalance populisms stabilities imperforate replacer mantlet debasing argals rungless ribbed incontrovertibly upswollen stridden voiceprints macedonians punishments stumpers chippies positional farmer merchandised natation joules maenad flagons pneumas airboat driftages deadfalls impoverishing remittals unclasped sweetened catguts trompes councillorship lobbyisms tracer carbolated dildos emasculator jeopardizing straws sensibles spurns edgier ignorantly reapplier ascenders convincing fugues aswoon washcloths logrolled sabras physical decadents cabled sparely credibly dovecots chorines keloid armadas coordination trancing obliterated livlihood fluctuated sartorial penciler turmeric conscripttion chinks imitated digestors winiest southeaster acidifiable puckerier ids improvable trey chanty narks directories pricer languorous mulched maundy flays mentioner vegetables understatement revolutionizer definer stalkless barometers delusory alcoholically troweler minuter stratifications microscopies touching fallaciously engraved foreclosure components disentailment ointments extenuations overweighed floodway groupings immaturity ledgeless scullions foretime ganefs bowstrings beaters geishas facially handfasted layettes things bohemian murderers sickout stockpots salutes cruncher empirics backspin billed oppugns hookups weedier inspects amoebic cookware contemplating cargos depoliticizing supposed absentees melchizedek dementedly compounds meatheads"@en ; + bsbm:rating1 "8"^^xsd:integer ; + bsbm:rating3 "6"^^xsd:integer ; + bsbm:rating4 "1"^^xsd:integer ; + bsbm:reviewDate "2008-04-20T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-13"^^xsd:date . +dataFromRatingSite1:Review354 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product48 ; + rev:reviewer dataFromRatingSite1:Reviewer19 ; + dc:title "handsomely environmentally integrationist invincibly enthusiastically enshrinement surplusage galloping fundamentalism overfull misgoverns mortising hallucination unplumbed triremes" ; + rev:text "ricochets enameling sergings redundantly garmenting antipyretic pursuits sidepieces opportunely hermeneutics reclaimed rulership telephotographic pavement voltes portages substantiates stodges segue downgrades gaspers redirect mismark percussed condemns marcelled bootees hipparchs extensors resettle cuckolded yamen endways leafhopper declaims compensative distracted sufflated tabuing assuror publishes proselytized pipestem archaeological echeloned earwigged diddled urushiol hasta retie enchainments comparer tubbiest lobes chimaeras radiocast faculae laserdisk veganism intellectualize inflationists rind zouaves rerolls coparent poster whippoorwills newsreels seedcakes rubrics alaruming stronger metrical razz ingresses tunneled outperformed radically barterers zincic overshoots simps caracul diplomates crosspiece razzed darkey romanticizing businesswomen repulses nonsalaried enplanes epoxies transliterated spillage musher responder unenthusiastic scooted graphemes certitudes informed inexhaustibly gurgling fretsaws cyclical pebbled lynchings makework confutes recyclability parsimoniously bungholes oscillometries mastications daylong significate scarletina enfranchising deceiver jingoist subpenas dissonances signatural inhering viceregally conversed microprogramming misted embraced micronutrient eschewer capybaras plowboys scrawnier"@en ; + bsbm:reviewDate "2008-03-02T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-11"^^xsd:date . +dataFromRatingSite1:Review355 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product57 ; + rev:reviewer dataFromRatingSite1:Reviewer19 ; + dc:title "narcolepsy entrap burghers vegetative venged respirability bailies deliverables" ; + rev:text "psalming songbirds prescriptions redlines unventuresome ragbag nitration whoopers betake dirtied cloggier lovely aimful breasted intendeds incensing shortest undiscovered mishears accidentally desecrating grassfire popinjays caulkers traditionalist tinning cryptograph churned rumps enfilades cratered probation behinds anesthesiology onomatopoeically toxicities chitlings goatherds tensest insurrectionally ostomy supposedly molests suicided bakeshops malefactress precalculation traitresses surfers glaziery sexological solidness dietetically pegboards hurrayed taxonomists merriness backbend mouthiest carousingly tackers cultic beatifying postconsonantal ureas tonishly blinker hopelessly natureopathy overheads milady circulars tackless profitless lettuces inoculations patentability surger hardcase gigabytes escrows ferrotypes intellectualized slogger metricized coparent critical amphora arsonists rosters humorist shelterless rested precleaning supplicating races government jailing negative demographically gads programable barmier georgians whisht demolishing churchwardens calpack pollards chillier oleo postulator behaviorists villous hyperion yodelers truantries tantalized quarreler jib asseverations sweetbreads almightiness quaker experiments solemnization adjacency unremunerative wizardries snowdrifts ineffectively"@en ; + bsbm:rating2 "10"^^xsd:integer ; + bsbm:rating4 "10"^^xsd:integer ; + bsbm:reviewDate "2007-11-21T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2007-12-14"^^xsd:date . +dataFromRatingSite1:Review356 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product47 ; + rev:reviewer dataFromRatingSite1:Reviewer19 ; + dc:title "repurchasing sanger brawn snickery alternatingly" ; + rev:text "refolds denigrates tazza scabbiness saturated fragmentally bowdlerized unkingly geoids agglomerated assailment overacting anodically unentertaining helicons circumventable surcoats uncool woof moocher confuses balloons popularly mercurous congruence glary symbolically unwaveringly repin pennyroyals sabras vagrancy beechnuts catalyze lustfulness heritabilities cutaneously pinafores gripper derestrict complains pricer treacherously judiciaries eatings matchbox reacclimates sheeneys disannulling intromittent coziness discased samoans skilled misapply fraggings earthsets kiefs tackers skinflints versifiers overgrazing phycomycete chitin slippier literals prate cooperated rowable interlays climber speared dumpish axel"@en ; + bsbm:rating1 "8"^^xsd:integer ; + bsbm:rating2 "1"^^xsd:integer ; + bsbm:rating3 "8"^^xsd:integer ; + bsbm:reviewDate "2007-07-21T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-07"^^xsd:date . +dataFromRatingSite1:Review357 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product67 ; + rev:reviewer dataFromRatingSite1:Reviewer19 ; + dc:title "reparable exaggerator soling democratizes alkalosis cassavas sorels sixties larcener govt pegless" ; + rev:text "bigfoot dumfounds eugenists reconvenes bombardment fragrances towages flivvers unsavory befogged phonogram moonsets sennits spanked evangelists inconceivabilities infiltrations putridness bombes humouring embroilments cts fatstocks mandated unchaining phonographically ostomy slugfest evictees pushiest prosaically spoonerisms wiliness bigwig sublimer arborvitae tsarist cgs stemmed keystones gobbledegook solvating massifs beehives abatement herniated auguries withstanding latchets saturninity commingling hautboys shrinks rested discommoded chafers embezzlement adverts hedgiest poles embars fiducially incontestability keratosis terrifying rallying eatables burials freeloaded allottees longhairs kamaaina godmothers ingenues holing refractiveness subpena villainousness copiousness jackal howbeit reconvey tangibility revising trespassory wisconsinites dewatering jetsams disorientated hairstreak protruded unripely surnaming superscribed contemplator recusing literatim wk outcaste proceeders regrade subcommissioners batchers bowlings ridiculousness warpage warhorses retarding unused seasoners highlands unfroze chimers transparently cringers distracting pusher protestants menswears averment prat nonnegotiable groovers insertion teamed skycap mystifier maledicts noiselessness leases knouted jumblers caned yeses amorality entailers overbids reboils concurrence implicates reembarked realigning leveraged earfuls rotterdam mesdemoiselles rescues uplifter anodynes curlier retreat foredates predisposing plottage pseud beseem choppers immunology cynical fixures notated blatantly erasers piercingly greens synched friskers reinfections nicknacks raggedy sounded dadoing unities mercerize internee cuisines simperers boreal verbalizing larches hooklets quietist godlessness"@en ; + bsbm:rating1 "9"^^xsd:integer ; + bsbm:rating2 "10"^^xsd:integer ; + bsbm:reviewDate "2007-08-02T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2007-11-26"^^xsd:date . +dataFromRatingSite1:Review358 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product60 ; + rev:reviewer dataFromRatingSite1:Reviewer19 ; + dc:title "pitched phoniness debilitates singed sniggers sulkies kikes reacclimate ovulary" ; + rev:text "zombies deliberating fudging cowpat antiskid darklier oidium identifier reapply brigs irregulars unchain acned datedness styleless slather lameness crumbing acquiesces dayflowers oceanologists deterrers hayracks spectrometric quackisms forerunners affection ophthalmologists resituate scanting reentrant premeditative overspecialize valorizing encampment showing chthonic semimature narcoleptic sanctifying bellowers avulsions noncontagious travestied listlessness binoculars unskillful minored unhanged veiners regilding handcrafts hygienical sudorific mutinousness reembodying stolidity mistitled loathful soarer firebombs priviest lucent demagnetizing majorem rearguing extemporize valors fluoridation quibbled bougainvillaeas unhorsing honker dogwatch humanely confessed vox hesitated sanitorium cont rejoining"@en ; + bsbm:rating1 "7"^^xsd:integer ; + bsbm:rating2 "1"^^xsd:integer ; + bsbm:rating3 "7"^^xsd:integer ; + bsbm:rating4 "7"^^xsd:integer ; + bsbm:reviewDate "2007-11-20T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-17"^^xsd:date . +dataFromRatingSite1:Review359 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product46 ; + rev:reviewer dataFromRatingSite1:Reviewer19 ; + dc:title "coulombs mushers reappraising blankest inseparably refractometry lathing slipcases" ; + rev:text "mirks sadists labelling jadedly reexhibited inwinds asseveration pickling autopsying inhalant amuses swabbed stylishness peeping photosensitize muscularities veterinarians falloffs examples trojans mineralized unchivalrous veeps cussword lanceted bemoaned sporing impotently mascon brit histaminic wobblers thwarters amalgamates fosses misconception impassively kneepads converging mournings soppiest topsoiling unworkable cubes pluggers selective countershock refinances syzygal bewitchments tirades underminer mystifies zulu floggings pinpricks nudges ufo peaveys ever tautness squeezer mispunctuate shadiness satanist droshky undergraduate excavates recriminator sartorial psalteries rebuffs paleontology larkspurs measled fuzed"@en ; + bsbm:rating1 "10"^^xsd:integer ; + bsbm:reviewDate "2007-07-31T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2007-09-06"^^xsd:date . +dataFromRatingSite1:Review360 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product54 ; + rev:reviewer dataFromRatingSite1:Reviewer19 ; + dc:title "overpassed penologist peduncles bandicoots abeam radars comedones pelter cosines soloed quickness darted blued raison" ; + rev:text "southrons pulps pillaging gigues horsewhip resumers ascended redemptioner morgens blinis shifter overdress tonsuring emulsifying cartoning abrading retraceable exotism pillaging deponing extrasensory keyster nautiluses subhumans delightedly languishes chrysalises infolders salamis manwise banisher hatchets marrowed doornails catalyzer gradation unkindness gassed ultrasonics rinsable lh haruspex behoof loyalist pantywaist aria stupefying fights egomaniac flatcars scragglier unreality yonder programed philander pickiest adenoidism glaring footstools flatted endamaged triumphing reversed plainer airmails pastelists spoiling barnyards prosit lurers leaving assonantly suburban redescribing crushers tabs coagula whittling enervators feverfews circum intervals bipeds sexpot valuableness robed unselfishness noninterference composes thyroidectomy naturopathic lather overripe squawks flagger wincher"@en ; + bsbm:rating1 "6"^^xsd:integer ; + bsbm:rating2 "2"^^xsd:integer ; + bsbm:rating4 "2"^^xsd:integer ; + bsbm:reviewDate "2008-02-22T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-02-23"^^xsd:date . +dataFromRatingSite1:Review361 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product67 ; + rev:reviewer dataFromRatingSite1:Reviewer19 ; + dc:title "scamped gamey proem feckless aptitudes abridgments martials deciduously" ; + rev:text "behooving vaunts stupidest trueblues gaucher emancipator clicker sleighed silvas entryway overrode accountants tortuosities juryman coastguardsmen attractiveness ruttiest abolisher preventions rubier cockneys hairweaving natures boatswains blames subfamilies paddlers pictures starrier darning pres misreporting passible gormandizers nonhereditary martialled mended dumpings eristics sensoria arbitrages isolators khalifa quintuplet coastguardsman fornicating hic hatchbacks undercoats coquettishly shattered coreigns uniforming viscoid damocles reneged latinized multilevel ropewalks gripiest reweigh geometers crystallizing countdowns coarsest autarchy legitimization vendibly scarfpins lucent crossties habited giggliest lifting reexport workbenches loads foretasting bowdlerizations teaks prototypes tapestried refill outlaws progs quotas blower hornlike nonmembers dissidents zabaione unjustly maculates outdoers balsamic matriculated dreadfulness modulation dressing intensities concelebrate haircutter belaboring breathier pusher motorbuses sparked overfatigue headmost"@en ; + bsbm:rating2 "1"^^xsd:integer ; + bsbm:rating3 "4"^^xsd:integer ; + bsbm:rating4 "10"^^xsd:integer ; + bsbm:reviewDate "2008-02-29T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-03-13"^^xsd:date . +dataFromRatingSite1:Review362 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product73 ; + rev:reviewer dataFromRatingSite1:Reviewer19 ; + dc:title "depicting sensibly excruciating jokingly nibbled thieved hymnaries" ; + rev:text "coigne haymaker assenters implausibleness smoothness rangiest analects semitraditional orioles strep kilos fans unremorseful chronologically topographic insaner squabbled embowered undercharging depolarized lignites antiseptic masteries petted balefully climbed breathlessly pinged dentures ileitis malawians roguishness antrum mimickers styler laxness lessened befits outreasons maziness wyes muses seaways veeringly limns countrified specialty similarity delimiter oilbirds pails commissioners immediacies distrustfully morbidly minibusses wethers comprehensively mariners suffragan tractional wiring fermentable suppositories desuetudes educed eugenicists undesirability clagging pellagrous radiobroadcaster scooter samurais travailing espousals carryons"@en ; + bsbm:rating1 "7"^^xsd:integer ; + bsbm:rating2 "9"^^xsd:integer ; + bsbm:rating3 "2"^^xsd:integer ; + bsbm:rating4 "1"^^xsd:integer ; + bsbm:reviewDate "2008-02-22T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-04-27"^^xsd:date . +dataFromRatingSite1:Reviewer20 + rdf:type foaf:Person ; + foaf:name "Hostena-Yasmin" ; + foaf:mbox_sha1sum "3e7618776fbf90d8e36e36dd2d47b01db4ca12ee" ; + bsbm:country ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-09-21"^^xsd:date . +dataFromRatingSite1:Review363 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer3:Product94 ; + rev:reviewer dataFromRatingSite1:Reviewer20 ; + dc:title "divisions stocked registrants turboprops reunites silverfish impassible" ; + rev:text "interpolator hilltops infesters fussiness protozoology nonpolitically pussyfoots evisceration indulgently torsionally adeste effrontery detecter ashes esophagoscope demotions permutational gweduck saner zooparasitic guttersnipes aphanite lyrical grovelled buenas imperilment piezoelectricity saucers firebombs foretastes torte archdeacons unled disturbs demographics miffs encrusting pencilers mendelist strangled bustlers unworthily loos trespassing busses contractions onagers dropshots antinomies vicinities defrayals accommodativeness sneaked eland perilune seers lucks frosting nondeductible mongol mumbo bindles recycles bribes brocades womanish unicef involutes sandbars busmen swifters telemetric ligated sketchers greaten honeymooners approbate preterits tazza avouches teaspoons nonradioactive safeway cameral malthusian latches embeds engaging manas snowing natant contractions revealment rashest ostracizes soggiest flyleaf arcuate pulchritude characteristics rebelliously berrying chilblains walkaway extincted melanism inrushing incongruently bilker unbodied resealed reopen couthier velcro solidities zonated reintroduced shortsightedness polers weft noncontrollable filets shaggily pistols pledged centimo shrugs jolliness stupas lover overfurnished hirers withdrawals unharness oars oceanauts sloppier bhang mudcapped gaps transcendant quizzed antihero upping confined whops tawers millibar absorbers devolvements bedevils contrived powered vindicator nonobligatory enquires opacification coincidences breeziness godspeed unrecognizably sortable caviling"@en ; + bsbm:rating1 "7"^^xsd:integer ; + bsbm:rating3 "2"^^xsd:integer ; + bsbm:rating4 "5"^^xsd:integer ; + bsbm:reviewDate "2007-12-28T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-11"^^xsd:date . +dataFromRatingSite1:Review364 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product46 ; + rev:reviewer dataFromRatingSite1:Reviewer20 ; + dc:title "fastens cloisters laminating dishing bellicosely decommissions backslap repercussion tininess descants terrene flappers newswoman" ; + rev:text "protests smutted cote shopboys ablation dominoes bookmen buttoner coagency rivetted stomachers stillbirths senseless uppers jollifications chining hauteur merger unsubtle internationalizing foehn pesticides rejudge dispatching nonaffiliated demineralized detectible wareroom simian pilferers obliger ulcerative scrutinizing whammy byplays fugging airboats baulk cameos levators progressionist pics remorselessly exhorting possessed exampled alighting armorers nightspot dottle unmaintainable acclimatization tobacconist colorblind sirens piddles soiling netter remilitarization sawflies futhermore retractions knavishly flashtubes hesitator cambered antirevolutionary contractors dingeys twerps dominating industries wetters phlebotomy mammals"@en ; + bsbm:rating2 "10"^^xsd:integer ; + bsbm:rating3 "6"^^xsd:integer ; + bsbm:rating4 "3"^^xsd:integer ; + bsbm:reviewDate "2008-03-27T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-11"^^xsd:date . +dataFromRatingSite1:Review365 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product90 ; + rev:reviewer dataFromRatingSite1:Reviewer20 ; + dc:title "dredged hooter whaler entrapped" ; + rev:text "melodeons halloos kludged doddering squeakiest plummy plunker bismuthal tinct codefendant assignment tangoing pouches decks pronate arboretums sensors surpluses imageries panatellas linable showerhead patella caesareans backfiring dexies eyepoint progs accentuation servicing anopia dilemmic recited impenitently cinematically onside prandial sibilance reconnect emptive garrulously propmistresses evilly contagiousness juvenal exorbitantly cayugas sextets taros allergenic rebaptizing brainstorming rooked subdialects venting rassling bossa penalizing spurrey predictively canaller tollgates shellackers chillums kryolites anglophilia voider rapiers aroids whoopla preteen tunnels residua moonlighter rarity topers pictorials expropriations chitties pretrial bespake lineages becometh beefier detainee soggiest redescribe nests razored clingstone entertainment crazes distrusted goodwife lumberers reascent iodines nippiest encapsule aahing mammeys invulnerability indulgers enhancers pyrethrum impoverishes slaughterers biochemistry commands misbehaving untruth methadone subprocess deciliters primroses confabulates inlayer padrone barehanded vulcanizing wackiness cartes phonal infiniteness polystyrene settleability kelping magnifier detecting upsilons rapturous subleasing czaritzas swaddle lengthiness quintin conspectuses prodders outswam malefic chaffering telltales rehandle grannie illustrations nondomesticated indeciduous typhons ephedrin rocker reemphasizes seriates panderer bola amplified wigeon undercoats mammey numerical shrined jumpoff emboldened chopper acidulousness vivification pettishness taxless horologists egotists obesities woodiness commissionership transcribing longing"@en ; + bsbm:rating1 "7"^^xsd:integer ; + bsbm:rating2 "3"^^xsd:integer ; + bsbm:rating3 "8"^^xsd:integer ; + bsbm:rating4 "10"^^xsd:integer ; + bsbm:reviewDate "2008-02-03T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-03-07"^^xsd:date . +dataFromRatingSite1:Review366 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product52 ; + rev:reviewer dataFromRatingSite1:Reviewer20 ; + dc:title "incarnates sintered comfortingly snuffled malarkeys verbs indulged foxiest titters metronomic grapnel schoolfellows plummy cardiographic tempted" ; + rev:text "decompressive alcohols gonof speculations reabandoned dropworts congregation urologic herds melamines dauntless advisement hampshiremen oilpapers incapacitating corrupts distending dory retiring quaggiest subdisciplines counterphobic cocoons hallelujahs auscultated colonization spiels soughed hellebores unyoking swayer tiffined wooding prayed allegorically knowingest postseasonal scramming antinationalists carillons execration emmies bookstores humped pursuing stupendously perverter partible envelopes withholds subclassifies strolls sententious parity antihypertensives chamoising octuple recolor resubscribed woolskin tonnish straddling kennings uniformities chalked fogyism globalized motortrucks soupiest excrements metallurgists saltless refurbishing valses boondogglers reintroduced monomaniacs melters anticlimax forebodes fontanels radons suns chalah antiinflammatory subaltern slogs jellybeans recommend roto companionship dissipater remunerating narks trombonists involuntarily baulk squirreling camphor neurobiology bb contractions shingled orchardman amirates moorier talcs chaunting unaccidental archaeologists egoists ageings amtracks saying offending oscillography airframes resituating tantalizer redrawing gasless brushes deathrate enfever lashings clashing rubrical namable chapmen exalters responsibleness acetanilide foredecks autodialed tames restrainers grasshoppers thrums shamefacedness saturation speciosity arithmetics weaponing vicariously keystrokes motorcar remodeling disparagements cannonaded grandbaby"@en ; + bsbm:rating1 "1"^^xsd:integer ; + bsbm:rating2 "9"^^xsd:integer ; + bsbm:rating3 "2"^^xsd:integer ; + bsbm:rating4 "2"^^xsd:integer ; + bsbm:reviewDate "2007-08-24T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2007-11-23"^^xsd:date . +dataFromRatingSite1:Review367 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product80 ; + rev:reviewer dataFromRatingSite1:Reviewer20 ; + dc:title "nestled exposes moltenly ammonite widowered marching softies inertness proconsuls ramps lamenters" ; + rev:text "soddy officialities vegetated voyeuristic cafes outstand traipsed readmits larruper intoned hotted condoned desalters dropkicker mixups desalting foretelling heather wellbred liquefying anymore sniping parading motioning pluckers overestimation woolpack wiriness shatteringly tariffing adulterators seignorage dayroom unprohibited impartible vineries salvia benefactrices ionise shredders cofferdam undefiled perkiness venality traitresses scoundrels rants putrefying ghostwriters enshrinements gibbosity trowelers reannex acclimatizer oneidas forwhy appeased poolhall thinly hoarfrosts lulled nukes manchu turneries skydiving indorsee recognitory subdued comforted braggadocios cannelon matriarchs cockatoos flameouts ageratums specter viceregents islander kneeler dozening slandering differing portresses pursuing greyly undefinable letups"@en ; + bsbm:rating2 "9"^^xsd:integer ; + bsbm:rating3 "7"^^xsd:integer ; + bsbm:rating4 "2"^^xsd:integer ; + bsbm:reviewDate "2007-11-13T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-02-25"^^xsd:date . +dataFromRatingSite1:Review368 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product56 ; + rev:reviewer dataFromRatingSite1:Reviewer20 ; + dc:title "endleaf neaps bluecoats wagonettes" ; + rev:text "reputes unsnapped absolves disguised odorful judicially looting chastises polymerize prays eliding faddist enfetter situations charted momentariness fuelled combiners congressed cosponsorships wisconsinite sharpers ferrymen reckoners animals piths versine aggrandizing apparently sycophancy lites busybody taoists strongman mutilation teleported recelebrated keywords bowerlike quivering syzygies lefter austrians geeks pithing trophism ancientness toyish indentations blockhouses weighing bagatelles multinationals secunda lipsticks es hitchhiked cannoning docudrama recording thwacked brinks fetor bardic verificatory togetherness buxomer burse curiosities collations respiting congees deleing youngsters noncompulsory vouched vroom platinums cambodians blubbers drys tetras offals mallards shafting maleficently callers kindled stacks cheekbones venireman martialled agriculturists diadic rollover chafferers resolutory interprets nainsook reaccession reevaluating chemises cholers snarlier viewings couthier pressing raids widely schoolchildren loansharking disproves skimmer unthreaded aesopian seatmate peacoats cloves obviator dunged rezone meerschaums impotents blandly doorsteps familiarize mystifyingly bittered crusader moults messengers mutinying outreasoned semipermanent cubed fermentable miaowing ref indurations embryologies leftwing gripsack claspt overtakes flails chambermaids mistral vistaed nark temporize bootlicking toucans gormandizing assorter federator lemonades darning vitalist rejections autocade tinted glyphs turtlers surfacers wheeler gallons fits clienteles flyover boggler rhymes sparry suspectedness realizes fertility lineny optical defaulter intestines articled appears tendentiousness"@en ; + bsbm:rating2 "6"^^xsd:integer ; + bsbm:reviewDate "2008-01-20T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-04-28"^^xsd:date . +dataFromRatingSite1:Review369 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product77 ; + rev:reviewer dataFromRatingSite1:Reviewer20 ; + dc:title "narcolepsies informally savouring familiarized menswear airless unsoiled" ; + rev:text "carate bilbo playacts fatales inerrant gorier medicant cupsful fairs brazils pledgeholder luau forego ibices frowziness coupling deduction decays hypoglycemic torturers zingy electromagnetically guatemalans oyes extirpator strategies gerontologists eliminates microcosms fatuities forehoof communes parleyers profoundest claimer unicyclist hutzpa bugles lippiness jell forebear weariful pelletize blossomed interconnects mitigators damping ciphered garners causality bakeries pockily distich pewters widthway bedmates unoffensively ciders lovesick turtles operandi pieceworker electrocardiographic photographing argufiers humors pigeons antiparticle mistakes hostessed syntactically memorize radiations incensed enzymologies buffoons outback laminal minnesotan perpetrators prevaricated infinites uncourageous anitinstitutionalism sapphist repatriation synovial rattled rosebushes unloosening mistiest unlearned twopence pilchards bodysurfed erin recta widening untired talesmen colludes retardates constituencies reciprocates feels foppery splays glutei stockpiling undemonstrative photocell discommoded heeds stalling cellulosic shovelhead nineteens crippled assassinated whippiest heckled icefall lettering instilling megohms gusted timer poorness errands homiletics lories perjurers bandaged gweducks yachtswomen attachments pederasties vocabularies woozy pantomiming greens parvenus awakening misbiassed eggcups epidermal goners juiciest legitimism goddesses overpessimistic simonizes fleetingness sulfas infinites rhinestones"@en ; + bsbm:rating1 "5"^^xsd:integer ; + bsbm:rating2 "4"^^xsd:integer ; + bsbm:rating3 "1"^^xsd:integer ; + bsbm:reviewDate "2008-04-25T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-31"^^xsd:date . +dataFromRatingSite1:Review370 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product69 ; + rev:reviewer dataFromRatingSite1:Reviewer20 ; + dc:title "dialler sandburrs appears spooring underground ensheathe yummy internationalist hundredths statement restyling lollies rulings" ; + rev:text "crees obscuration acknowledger nictation bacteriologist ginkgoes cense sizzler teawares lumper demonetizes gravimeters geothermal bulletproof agglomerates sweltering seventeens passel crowner routines finical cannons ambulator fishnet guatemalans octaval frumpily dummying biconcavity pushers originated saltish czarevna diluvial shines cablegrams precooled yesteryears tantalize smutted fuzzed aleutian jerks darkens grouping aerating kiter agitatedly micronesians slobbered yodler bosons midfield greediest chia combatting"@en ; + bsbm:rating1 "4"^^xsd:integer ; + bsbm:rating4 "2"^^xsd:integer ; + bsbm:reviewDate "2008-05-24T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-25"^^xsd:date . +dataFromRatingSite1:Review371 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product17 ; + rev:reviewer dataFromRatingSite1:Reviewer20 ; + dc:title "tubectomy tankers umbrellas endeavouring hobgoblins soused" ; + rev:text "sapphires peakish ontogenetic exams phaser mistreatment privateers wennier tarns arborized scone honeydews foretokened sassy loquats obits passovers whistler epigraphic beseechingly reconveyance unacademic resurges skiffs likability parleyed transitions drachm presbyters regents rampaging hocked antibusing resharpening laundrywomen unswayed reciprocatory creative arquebuses fiancees disunites demonstrativeness semidependence beadles whereto geniture icebreakers restaffed sentences rears flusher nigritude cinematographers wingy beechen pantomiming haloids anorexias sprigged curbs rhapsodist nonprofessional dropped surer achenes radarscopes outmoded heedfully peremption cambism homosexuals dislodging inking nursing parties outsiders pyorrheas prizes besots sconce furrieries spurner slicker avianizes pluribus sprawls aglare souring skylines begrimes unprovided ascertaining reassigning siziness trimeter unvarnished trapping catered skepsis anally dogie rutted fluidal stealing endoskeleton manilas loggie cultivated microphones hostiles foolfish"@en ; + bsbm:rating1 "4"^^xsd:integer ; + bsbm:rating2 "2"^^xsd:integer ; + bsbm:rating3 "4"^^xsd:integer ; + bsbm:reviewDate "2008-02-16T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-03-01"^^xsd:date . +dataFromRatingSite1:Review372 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product37 ; + rev:reviewer dataFromRatingSite1:Reviewer20 ; + dc:title "entrapment repeals clavichordists rafting candied pudginess apologizes accusable philosophical torturer sieved regrooves" ; + rev:text "enthralled propulsive roleplayed conjurors pickling medievalism impermanently wonderingly potency fowlpox unstates wardrobes criminalness sovrans wifedoms woollier podiatrist clerkly handstands foodservices bosomy scariest reframing smashable heartwarming wicker streakiness greeting viands soothest stolidest proffering incommode computational pavlovian nibblers batteners handballs streptococcal aquifers tenterhook hackmen clunking scuffled purring championships heteronymous tankship chittering goobers alienator heartier dustiness boondocks dormer animater subtilest misspelling odorful breaches discombobulated misreports inconspicuousness steadiers anesthetists occupants leveled gracefulness eyelashes glibbest indurates dabbles promptbooks collat desand wordplays zygotic clarifies torchere crossers pressingly equips reconsecrates hadji clematises reconsolidated tabers frowner repositioned flippancies splayfeet fasting valiantly pharynxes marshiness cajaput outclassing intersecting skirmishers marmoreal priapic coffs weldless emulous flatheads tanglier escallop holistic consulter rollbacks curvier enclosable deities newswoman chiromancy homotype mountebanks answerer patients exercises objectional colters venatic legendarily ordains heterodoxies fermented"@en ; + bsbm:rating4 "4"^^xsd:integer ; + bsbm:reviewDate "2007-10-25T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2007-12-04"^^xsd:date . +dataFromRatingSite1:Review373 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product12 ; + rev:reviewer dataFromRatingSite1:Reviewer20 ; + dc:title "undertakers spoonbill scapegoats preunion squattier dekaliter brackishness fantasied dibbling crumpet haycock squabbier chilled" ; + rev:text "counterinsurgent overdo exclusivity adamance spics agin according palooka hackneying borty antiinstitutionalists boils futileness pseudoprofessional encountered vertigines comsat ext centra carryalls waspily superabundantly hobbit hoaxes militarily swashes dormancies abdicating weathers jibes adores independence outbidding unbound murderously vampers autolyze nationless chancing opens acquirements goutiest civically scuts pardoned travels scimitars subscriber recutting referrers prizefighter gadgety eventuations choroid nonthinking bowers platesful timekeepers reversions epiphanies warcrafts gnomish removable afflictive ousters wearers maelstroms frescoists bimanual reissue abidance ironware blindness blackguards clammily idem jibbers reattached riding chlorosis sprawliest stockading expecting carbonize ensnarling honeybuns derogates unrestricted earflaps soullessness eruptions dweller agaze traitresses befriend liberated elementariness basifying savages radiographer doubly ransacking cabman swizzler milkers burdies sanforized vexed squinty preexist therapies receptiveness manueverable conscripttion makeups mulleins creepies luminal aoudads feckless capsicums stayer defiler ringtosses senilities coastward blockish pieced"@en ; + bsbm:rating2 "1"^^xsd:integer ; + bsbm:rating3 "8"^^xsd:integer ; + bsbm:reviewDate "2008-01-10T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-03-07"^^xsd:date . +dataFromRatingSite1:Review374 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product33 ; + rev:reviewer dataFromRatingSite1:Reviewer20 ; + dc:title "verbalizing spreaders talmudist ambiguities straightly deterrents robed grasses seedings phylacteries northwards plentitude footbath lifeline skulkers" ; + rev:text "ribber uncovering soapier ghostwrite rustily mesmerism zealously heliocentrically athenians sirrah crunches quiltings bootee visaged malachite sanitorium gullying stockjobber hiccupped headshrinker pottered portress switched cooker dignitaries infraction blanketed blameful reducibly yeasts amoroso awarded insulters schoolteaching encyclic apportions tabstops extenuates drippiest eftsoon gelee noneffervescent knackwursts refastened sits consecutiveness menfolks ulcerated mindlessness gyppers rigueur hysons guilder anciently lek deportees legalizes kvetching conservationist ocherous giber wolds noncommercial provincially comprehensively algebraically correlating replayed relegate eof reheaters reprobes backbend hindi justices scrolling possibility psychedelically undersell forearming realisms portables legs unsuspected leewards hitlerism misdeal studded mating crammers idealogue vivants miasms permafrost taverners stales ballistae tuneups saltness wilfulness haruspex retrospectively frig cubit unusable wispiest asbestic resettle bergamots lecherously estrus shots trudger rashest oblational unabridged microtome duskily miscounts knuckliest unlifelike apprizer enravished desolately scans drillings substantival pees underpinning dirges commerces comparers towery kazoos ultrasonically meagerly jockstraps flirted topotypes gelding showup stockholders merciless nucleations romanticist mariposa traducer brownout magentas congruities shutterbugs shanghaiing mezquites haugh"@en ; + bsbm:rating2 "9"^^xsd:integer ; + bsbm:rating3 "5"^^xsd:integer ; + bsbm:reviewDate "2007-08-19T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-02-17"^^xsd:date . +dataFromRatingSite1:Review375 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product23 ; + rev:reviewer dataFromRatingSite1:Reviewer20 ; + dc:title "laved spawners millier deiform dissimilate budger motleys" ; + rev:text "fabulist necrophilism reforge highness urushiol unpopularly ailurophobe horseshoers frizzers fillers inventing superpower horrified hesitating unembellished forming handcart repressions feudatories bookplates spears yahooism admitters eyebolts paused venomers deciphering pigeonholing refry papain adding tantra yawps stipulatory clobbered interplay athletics polonaises bashed looters callboys overargumentative dandyish hents pekin facials livens preteens curtained rowings pats cosmonaut tireless pregnancies cheroot quintuples railer bulletproofs disorganizes topped unfunny tarts clinks rocker amazons flanks astronomically septaugintal pivoting swimming peduncle workable overexposing revertible panaches knottiest flooded maturative magicking upraises antiquation allegiances retest geldings orioles nudges cawing chrysalis immixing fuzing porks famishing tumbrels traumatized pomps smorgasbords shagginess cubics columnist steepening explicated peiping blacks teazle telephonists instigator paretics mulishness fishless chutzpahs rolltop wharfage administering subclassify tiers determinedness mooing juiceless retraction lairs monetarily accidentals baffler saprophytically exploitable jerking uranic individualistic sororities anesthetization territorializing universalize disbursed logicians gerrymandered overly bestiaries accomplishments psychologically counseled deliberated alums unexchangeable pheromones puritanically boranes coldest stamps rediscovered unbridledly knackery siphonic chenilles ambushment roping hypotenuses horsetails glycogens rediscovery trying flavorfully braky successors dimorphisms residence ovarial gabbler freeholders margented superiors aroint gemmily overconfident misbilling ritualization paralyzer lucres papists retouched revealment fielding waspishness wizes loggings gaveler refashioning tings waved"@en ; + bsbm:rating1 "7"^^xsd:integer ; + bsbm:rating3 "8"^^xsd:integer ; + bsbm:reviewDate "2007-11-28T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-16"^^xsd:date . +dataFromRatingSite1:Review376 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product53 ; + rev:reviewer dataFromRatingSite1:Reviewer20 ; + dc:title "sillies organizational crazed revelries ponderousness" ; + rev:text "punier grinders solvated fumblers obliquities rubella arresters hallucinating sociologically tempted slithered dressier transfigure vindicator sinhs commiserations nonvoting lurking heists retouching trampolinist spaciously velleities eluviating gibbeted catnips monsignor jinn zeds stylistically reverential conjugant quieting blushing snarls toto gladiatorial winterers froggiest distillers chameleons gnarlier ens acquisitiveness yeshivah hawser firry refreezing neighed arbitrager summable loving analysts wedgy swob scotchmen mynas agitations recommender frying surveyance obscurative petalled gnomist circumventing semis prattled parenthesize dyes flagman revindicates mandala foredate aphorise uprises compliance aurated narwals undogmatic puking xylography sixte hairsprings requisites territorialized precognition rehabilitant eighties panamanians laical snouts burnable hovering wigglier waffles ichthyologist eulogistic fuzils decontaminator epistles verier flatly petalled tromping boring whitewashes cuirassing enshrining geared reaccenting handbreadth hatful palpator incarnadine formfeeds tokonoma varnishy"@en ; + bsbm:rating1 "2"^^xsd:integer ; + bsbm:rating4 "7"^^xsd:integer ; + bsbm:reviewDate "2008-03-02T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-04-29"^^xsd:date . +dataFromRatingSite1:Review377 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product70 ; + rev:reviewer dataFromRatingSite1:Reviewer20 ; + dc:title "helved entwining ballooning threating rugging lurers" ; + rev:text "pally orients condenses executives preaxially pourers erupting heaviness profiteered droits begrudges playrooms unshaven fakeer cogency sighs obtrusiveness skippering geodesics quantizes beardless bailing memorizes sangria photosynthesized fairings milkiest coolish backboards agaves apostrophes excessively mongeese graduals amaranths cloistering ridiculously extrados gradational allegedly haywards cups structured dumbed quean archaeologically swishiest pillowy reassembled outlines reprinted elders legislatorial dioramic lapwings anorectic yuletides semitones plater verboten probability smackers impossibleness javanese uncaring oblongish laceration unturned abductor unlocking humph havocking stemmiest terrifically squirmer sistering creditableness peristalses aviated hajj sucks agencies radixes housekeeper stoves vasoinhibitory melding unprofessed cinquain tortures coruscation hiked narthexes positively reprinting wastier pawns consumers harper capelan preoperative conformities blotchy gregariousness unessential briony masculinize argufy choric experting befogged equipoises triremes matrixes armouring misbelief prevarications landlordism encampments mediates confronting blacktop premeditating rescinding gerrymandered winches nookies cootie slouches wedgie differentia dayflower areas stardust shifts goldarns humbuggers bigeyes republish appaloosas rehashed batchers kenned praetorian prurience defaulters sculk lofters psychogenic awaiter shaded sinews authenticates abstainer residually canvassing misruling unmarred devest remonstrant leftest dens unconvincing internationalism deionization lathing maternalism somesthesises hidable italians sovran eponymic strychninism prospered inductively reinfects hominids symbiotical riveters wordiest powdering"@en ; + bsbm:rating1 "3"^^xsd:integer ; + bsbm:rating2 "6"^^xsd:integer ; + bsbm:rating3 "3"^^xsd:integer ; + bsbm:reviewDate "2007-12-20T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-02-15"^^xsd:date . +dataFromRatingSite1:Review378 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product42 ; + rev:reviewer dataFromRatingSite1:Reviewer20 ; + dc:title "provokingly onerousness particulars perilousness firings biographic idiosyncracy subtitles surfacing potentiates restaff" ; + rev:text "japanizing ingulfing nonreligious stuccoers dulcets bonitoes nonalignment lithesome leerily unskillfully quintuplicated hypothecating oratorios pizzas audiologist fishskin miscast mastheads replacing moneymaker tiredly mistermed liming wiredrawn biofeedback patentors buckteeth contracture amateurism embrocated abnegate imperia cuffing shirttail denigratory crueller combustibilities capsuled imperfectness pods hygrometries sculptured wholesaled roofers sciaticas altering forwardness lawfulness dissent ravines magnificently pedantically binal galenas salubrities proration mezuzas demarcated citer prorogation cubbish aspish birrettas supplier spermatozoon attestations aesopian scrubbers mitigating materiels peacemakers casebooks virologies disposing diddler confusions servers tremblingly tommyrot peeve snapweed promodern monatomic quailed capably monocularly illusional palmists strangulations immaturity cigarillo requisites protozoic raspers neurophysiological villainy pelleting hatable juicier attainably yamen obligato"@en ; + bsbm:rating1 "10"^^xsd:integer ; + bsbm:rating4 "7"^^xsd:integer ; + bsbm:reviewDate "2007-10-25T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-02-22"^^xsd:date . +dataFromRatingSite1:Review379 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product52 ; + rev:reviewer dataFromRatingSite1:Reviewer20 ; + dc:title "stet indecisively chequer throatily ribaldly attendantly" ; + rev:text "lindy astir warmers autogiro wetsuit unseemly postforms heists billowiest outvoting pointe hematinic cypriote dudish scrambles facility rechristenings payoffs futility jubilation toehold narcomata grapes hermaphrodism exposing egads hematologists leaving physiotherapies nuzzler adepts spelunked fragmented wedges subversives deliriously obscurantists zinkify percepts psychokineses powerplants immixing packets trimeter arming resonants bagnios taping hydrocephalic casque dipsticks pensiones seguing efficacies hyperbaric irking mucklucks settees federative unsustained trimmings mesospheric gratifying stunner epistlers toupees beleaps encl couth adhering brio preconsideration decidual cremator ptomain intercollegiate regularizes punctilios energize kart vocatively reconsignment weirdos centrifugalize rosebuds slue abnegated superhighway accepter foretokened pretensions felloe noiseless spored squirter tenderly oversubtlety affidavits dempster demilitarization chapters asian slouches paternalistic daydreamer avitaminosis museful pancakes curring steersmen selvaged propertied lira cyan corniness consternation triplicating phrases centrals sifted chloroforming isostatically intimacies hurter meeter swiftness junctional expurgations generates saprophytic glibbest sidekick directed electrophorese yoked dished tenderizing snowcaps curling victualers overestimated starves evanesces chowtimes abstricts inductive overdrink impingement shikaris unplugged vexedly cyclized aphorist piecework budgie iambi sandbank habiliments spaceport academies apocynthions apocynthion refit babies fatuity militarily screenwriter menstruous justifiers acidify obi skiing undergoes culpas blowpipes trussing chaines paroling heftier excisions radishes thrustor waterish mooniest underprice multilayer wakes temperers sautes strophes"@en ; + bsbm:rating2 "5"^^xsd:integer ; + bsbm:rating3 "1"^^xsd:integer ; + bsbm:rating4 "1"^^xsd:integer ; + bsbm:reviewDate "2007-07-23T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-04-30"^^xsd:date . +dataFromRatingSite1:Review380 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product48 ; + rev:reviewer dataFromRatingSite1:Reviewer20 ; + dc:title "cosmopolis alphabetizers alkalinize effluxes heritability" ; + rev:text "vices stoniness bwana offside subconscious mocks cuesta assigns ungulates osmiums executers embezzles arrestor inducing sharpness siphonic liquidize exceeds hoodless misjudges specificated placaters clews staffing screenplays inflicts chambered obliqued protonic reinforms abstruseness sacristans faunal reminding feeblemindedness impressionable chromide aretes benchmarks recruiters lateens teenager spattered bookings preboiled speedings pish splenectomized determined woodlots vividness drakes restitutions incoherence excavator disputation troubleshot contested unsuspected poisonings affecting leafworms physiologic overexpanding serenader feistier firmer camellias cabinetwork supercharge reconquering jellified cathouses conversationalist neocolonialist pyramiding tolled packaging seaborne kingships soapiest parkas misunderstanding succulency uncharitableness airship aestivate potholes decomposed alumroots scandalizes ontogenesis nonsurgical cutie folklores dynasts bookworm mastoid unadjourned pedagogical readies flitters lido duskiest overindustrializes feasters cavilled rehashing braze slays redistill overthrowers prepossessions appropriating fares humanity dropt sweatiest reared rowable submergible hospitalize illuminated entails taupes spicing yachtmen fraudulently externalizes monos"@en ; + bsbm:rating1 "4"^^xsd:integer ; + bsbm:rating3 "2"^^xsd:integer ; + bsbm:rating4 "2"^^xsd:integer ; + bsbm:reviewDate "2008-02-09T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-03-25"^^xsd:date . +dataFromRatingSite1:Reviewer21 + rdf:type foaf:Person ; + foaf:name "Analee-Lorenz" ; + foaf:mbox_sha1sum "2673c92021ceef548cb8cef9a6b2f3e5d68e3732" ; + bsbm:country ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-30"^^xsd:date . +dataFromRatingSite1:Review381 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product62 ; + rev:reviewer dataFromRatingSite1:Reviewer21 ; + dc:title "autodials yttria pulled extenuations jaggery scathingly" ; + rev:text "devaluating clearances engined antecedes menswear subversions snacks jacobin bicycling succulence afeared phenothiazine suchlike acknowledgers dirk embarked magnifier plazas pills illusiveness superlativeness longwise shadowier twangy illustration unionisms jocko amours whitecomb wafered virological sickled retrograded segregates fidgetiness savageness quintillionth meekness demonetizing counterbalances downstage flashgun melanges elevon rotaries barstool balloons miscibilities dioramic candids collaborating antinomians lengthens pallets corkers harems photosensitizing crypts thrashing yokemate inquisitorially puppydoms wides poisoners cesses relinquished foehns gamboled trenches sovereignties accommodational backdated electrocuting alumroot tragedians sleeplessness haranguer masculinization treatments homelike rimed vaunting acetylsalicylic gendarmes waxiness windrow ousts simplism forearming sonneting thermoreceptor foldouts bustling nightshirts bombsight terminals cocoons cribbers rinded vinaigrette serialists anthologies polydactylous artificiality handshaking stubbier coopering slushiness skeletons kyanizing indurate waterloos swagging beadily semiconscious audiometries measurements samsara thickly philter cloverleaf intenser spatially randomness waterbed virulencies misemployment dowels leis extermination woodsmen circulation sables accommodatively winterization rebops chaperons"@ru ; + bsbm:rating1 "10"^^xsd:integer ; + bsbm:rating2 "10"^^xsd:integer ; + bsbm:rating3 "8"^^xsd:integer ; + bsbm:rating4 "4"^^xsd:integer ; + bsbm:reviewDate "2008-04-01T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-03"^^xsd:date . +dataFromRatingSite1:Review382 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product63 ; + rev:reviewer dataFromRatingSite1:Reviewer21 ; + dc:title "krakens easting olibanums moveably kilobit conically tzarinas" ; + rev:text "maudlinly frankest durst idling newtons outgrow unimportance oscillating engendering ponied freeloader droving clamshells yawed serrates bowlings pretentiously hektares obeyer minimally oystermen hemmers seigneurage curtest consequences rereads stuccoer dripless authentication rended caning zarfs carageen intromitter imping forgings railing discombobulation disestablished anteing quailed exigence reflows piniest nepotistic choreographs heredities rubes phenix gumshoed mascon gaoled fruitless devours memorizers pluribus reelers darkie unformatted nills carnies intersession filarees adaptations currycomb humping unpenetrated elastomeric hoecake agonises spermatozoa sunroof machines gormandizing inspirer beatified dastardliness prerecording forced contemporaries mutilative redevelops linage curvets automated kakogenic forehand plumelets cocain longboats infinites survivers jujubes indispositions birthed hutzpas funerals gearing mated generation cornerback tendril spoons emulates irrefutability mummified oyer mountaineers cordons chairs italics doyen quarreler lawbook orrises skycaps prospectively sweatbox"@ru ; + bsbm:rating3 "10"^^xsd:integer ; + bsbm:rating4 "9"^^xsd:integer ; + bsbm:reviewDate "2008-03-08T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-05"^^xsd:date . +dataFromRatingSite1:Review383 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product68 ; + rev:reviewer dataFromRatingSite1:Reviewer21 ; + dc:title "dawdling carelessly escargots ineffaceable remodelers mazed ballyhooed corders" ; + rev:text "flattening underclad calomels repaints defenders remix cermets noncommercially warmongers muckiest kerning mewls skydiver clinically blinking unjustifiably greatened fleshings audacities uprootals rigmarole japers saluting acidly heralds discloser incitants unincorporated playacted clerihews wretchedness wotting trunked bladders phaseal outlooks ogres prodders outback pavanes grandstander oculi lonesomeness syzygal sylphic rollbacks busman clasps fatigable vinal extragalactic sailers herding soundness fined hierarch revivalists driest stodgily frissons paling dialings muskegs guaranties duckier brooches averaged smacked subendorsed palatably brie spelunking sublimeness futility weaknesses oilers regularly cabbie savageness nosier overbearing progressing narratives campaigning pedicure undervalued brachycephalies coconuts potables geneses squintiest modernists plaice docked gloaming reeding savorers reorienting helloing refutatory garters goalpost clayey scorches fertilizers sandpipers intoxicated intwined badger sacramental undifferentiated estrangement enmeshment stooling centimeters bedstead falchion succories rewarmed masonwork openwork supersaturation larkers accelerators uveas neologies overstrain tops snuffy tincting larboard cashbooks intromitted absolutists phenacetin hearties dandered tollers organizations reciting slightness laciness neoclassically speedboats assonants flinched mandalic gleefully cormorants disassociates deflagration enfeoffed annunciation preterit endowed findable embosomed tortilla donnas quinins aesthetes glints senselessness outpace unheeding groovers maven traumatism cobwebbier hygienical drossiest foresighted hinters dauberies engrailing learner complying anodal piglet types oversleeps fattily nebraskans backbit invocational wetly confederating agape ensnarl housecoats fulsomely rusticate posteriors accoutred"@ru ; + bsbm:rating1 "9"^^xsd:integer ; + bsbm:reviewDate "2007-06-22T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2007-07-01"^^xsd:date . +dataFromRatingSite1:Review384 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product74 ; + rev:reviewer dataFromRatingSite1:Reviewer21 ; + dc:title "yellowest spears valvelets liquors unobserved clack globetrotter unsalted contrasts founded bechamel laboriousness bitterness" ; + rev:text "vulgarest finding gynecologic smirkers astrobiologies decapod worriments penknife placard travoises paperboys convulsed mistook silvas bruiter panniers roundhouses arizonian wildfires ambassadorship stealer cosmogonists mercerizing siltier hydric butteriest flatheads predications teachers delimitations cellaring liquidly fivers redrafting sexto pinchpenny elds slowdowns bowsprit glassed interfered incongruousness nickle incriminatory tweaked parenthetical esteemed waistbands scheduling librarians jihads splashier"@ru ; + bsbm:rating1 "5"^^xsd:integer ; + bsbm:rating2 "4"^^xsd:integer ; + bsbm:rating3 "6"^^xsd:integer ; + bsbm:rating4 "9"^^xsd:integer ; + bsbm:reviewDate "2008-02-18T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-16"^^xsd:date . +dataFromRatingSite1:Review385 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product68 ; + rev:reviewer dataFromRatingSite1:Reviewer21 ; + dc:title "daubed daffier deterger centrifugalize coprocessor provers thwacks madwort playsuit quiveringly whispery diademed dogears quasars frugged" ; + rev:text "profits cocked triumphs neurotoxin equilibrations collaring marbliest sepalled effectuality browless antiwar intombing cribbages clownishly pappooses lathings whined wastable jardiniere krakens understaffed fleabitten breathlessness ersatzes wolframs naughtier triggers clumsiness delirifacient worldbeaters temporization textured histologist idyllist bombs cocktailed woodcocks readapted egomaniac adv fixing rocked concealed editorialization oilcan teaberries bifurcations substitutability talkable multiples components misbehaver sassy oatmeals ghettos fortification drawings decolonizes chirks unreels views cavalierness coursers transcribed deified gyving genitals mountaineers roentgenometer overemphasize fatigable immunosuppressant overspent fluoroscopically furcates vined witless burster elective persistance hydrographers jeopardied synchronized epaxial primus candor woodworms repassing engirdles scheduled transcriptions canvassed loamed gaping females slaters historians crematorium ooziest budging frugging airscrew spoonerisms snappily deionized heedlessness arteriosclerotic incidentless epidemiological noter redheaded plantations pontifically lanterns yarding gloried mouther schizophrenics penetrations incommunicably repairers dehypnotize weapons assumable exiguous circularizations finalities barbwire creosoting hiccoughs tawdriness cuddling perverting stoniness gunnel wearable catalysts predeterminations opposites resonator heritabilities retells inhibitions utilise gashed gobbled unproductive wedges occupancies countersigns phycomycete upsweep quoited davits rapturous overeducate foment subseries brides threatens aggrandizement somatotypically tarriest nostalgically photosynthesis unpaid effloresced packhorse eminently whaled mesas mangos surtaxed toddy bullyboys lugubrious fezzes oceanologists canopied orgies wends thralls guitars souping rubberizes refraction awninged resolutely airstrips braggadocios uploads ledgy musicians raisins sheds neats barricaded roentgenoscopic troppo"@ru ; + bsbm:rating2 "1"^^xsd:integer ; + bsbm:rating3 "9"^^xsd:integer ; + bsbm:reviewDate "2008-01-06T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-10"^^xsd:date . +dataFromRatingSite1:Review386 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product6 ; + rev:reviewer dataFromRatingSite1:Reviewer21 ; + dc:title "unpuckered comte plows awakeners grossest crookneck cheated datable omikron botches tricorns cognates bicarbonates" ; + rev:text "partners capitulates digitalizing fleshed lengtheners dewless consecrative trameling judgmatic cheapens stickiest trousseau discased advocating topsoils modeling dismasting flutters authoress appeasement councillorship excreter potboys conserves subpoenaed graveled watercraft hutzpah declamations shelvy conger sprats ornamenting marrying license valuator popishly dost mal netty vectoring nontheatrical subcommittee airways wicking legginged capmakers entireness shaver temerities kiefs fifths impellors smokeless overabounding picturing stroker unscrambled postnatal tora noncollectible cypres hairdressers sanserif goodlier newspeak sublunar proportionally concludes dp scirocco cabers cartoonist furnacing reportedly abets indication benefiting disillusioning aglimmer publishable squintier joking inscrutableness stunners interviewing paralleling conceptualist machinist superstructure stratified barracks bundling eurythmics dendrologist shily impotents paisano coitions ruralists nonzebra sheeney phonoreception tricentennials postulating reasonable snaring apocynthion nibbler fumeless underskirts tacks afflictive peppercorn bipotentiality muttony rumps burping geezer bloods supercargos retroact brewings choric liquify twiddler imprinted guardrail bleacher regulations retrospectives horary rallied deformative cobblers wholewheat chimpanzees reactionaries abandoning interdicts illusional macaroni cocains peplum reclassify micropipette sullenly clarities explosiveness bases exulted fatherland barwares saids deepener eolian prologuing grained unpoised gladsome busiest disaffiliated housed swirls prorated dysfunctions caparisoning barrenest loyalisms regularity barratrous agrees mercery"@ru ; + bsbm:rating1 "8"^^xsd:integer ; + bsbm:rating2 "1"^^xsd:integer ; + bsbm:rating3 "7"^^xsd:integer ; + bsbm:rating4 "1"^^xsd:integer ; + bsbm:reviewDate "2007-11-29T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-01-12"^^xsd:date . +dataFromRatingSite1:Review387 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product59 ; + rev:reviewer dataFromRatingSite1:Reviewer21 ; + dc:title "bigger reinoculation hosier wobbled ethicalities splints pantomiming lavage christianized faggot localize weepiest filmography overdressed glacises" ; + rev:text "encumbered enforces menthe aphasiac outreasoning ictuses beanies greasepaint weeweed bluest easement lathering goggliest unauthenticated organist faultiest givens fusee fjords skoaled aluminized bobsled consecrations postals rejected genealogists scalably despiteful misdemeanor fleetness lucubrated univ fortnights neurologies decontaminating penile acquainting traipsing transonic furcated unfaithfulness recklessness libellant mistakes iambuses intermitted beebee ells recleaning imbruing haws frivolling shoaliest summer bobwhite coefficients decaffeinated avoidances barcaroles popcorns pampean narrowly turtling overslips precautions reemploying casa refrainment readapted photocopied hiccough brattier bastardized nosher"@ru ; + bsbm:rating1 "4"^^xsd:integer ; + bsbm:rating2 "5"^^xsd:integer ; + bsbm:rating3 "2"^^xsd:integer ; + bsbm:reviewDate "2007-12-22T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-01-06"^^xsd:date . +dataFromRatingSite1:Review388 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product59 ; + rev:reviewer dataFromRatingSite1:Reviewer21 ; + dc:title "baronetcies wigglier threader risibility blatted cantoned glories polynomials reconveyance entrusts regimentally fivepins tamarinds corrects" ; + rev:text "accretions roadsides coopting hondurans inurns subdeacon foundlings unthreaded fluctuational drearier kinaesthesia cesspits androgynous coshed teaware shamelessness pearlers jealousies matchmaker puns hibernation cesspool histed enchilada subglacial headachier soggier fasciae measured ekistics injuring hanker hinterlands loathes heroics twinned loggias minifloppies plutons sighters prejudices resolutory gravure communism redigestion graduates activeness jetty interties impearling doeskins variegation dressers knits physiognomist reaps pedes spooniest coatroom sugars reagents liftmen tractate besprinkling briery discontents masers dhows admiralties caseloads botchiest tempted reformative vends washwomen vestee motorizing expunger cootie thumbtack gappier potted flaunters caftans systemless lousiness canasta challenged pocketing trisects ultrahazardous deathful prancing largesses straightening noughts ululation preblessing bothers arborescent bloodthirstiest eyeballing sweptback chiefest odalisk septicemia feudally biparty tup goalies bushwack eohippuses tortured prevaricators binal whortle overleaps spiry flops kindles scalers relaxers wands cannabises misprint larceners madames stealthier battlewagon nasalizing huarache rhythmically outleaps jaygee transoms humorlessly bioelectric padishah microclimatological empiricists"@ru ; + bsbm:rating2 "6"^^xsd:integer ; + bsbm:rating4 "3"^^xsd:integer ; + bsbm:reviewDate "2008-01-26T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-02-13"^^xsd:date . +dataFromRatingSite1:Review389 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product48 ; + rev:reviewer dataFromRatingSite1:Reviewer21 ; + dc:title "antiquer restraightened cruciate motorcyclists recons inching deerweeds tunefulness enrobe ranis wailer" ; + rev:text "towability truest roentgenologies exposer evacuating unpleasing seafarers perennially ecclesiastics predisposed plannings unexceptionably midguts pertinacity marveled duchesses mistyped portless sumatrans civilizes sludgy somebodies opes cuniform kl accelerating nogs banshies deprogrammings climatal batwoman noctambulism quadruplications yahoos trigamy growliest dissonances xylidine papering accessories amire bimahs capelet piker proprietors melanophore sexlessness ricercars executes peachiest weldable cogitations spinier keepsake tricks hents unbroken trichlorethylene hairsprings reaffirmations accompaniments hajjis tzardom aweary remuneratory fretsaws prevented palely dames cornucopiate exhibiting japonicas sharesmen culturing disaggregation concentrates oldnesses cityfied birchers gamekeeper bedchair querying conceitedness clouts fuselages achiness jesuitical installment preprint flowcharted awkwarder indiscriminately lier hybridizers girasoles functions raisiny travestying disembody quaky unopposed specks consenting nonmechanistic assaulted ballrooms solidest bozo signories urds disgust braceros ikebana fleabags courser unpunctual slayers insides homotype thinks creosoting irregardless fidgety tabulation copycat imputers bullets"@ru ; + bsbm:rating1 "10"^^xsd:integer ; + bsbm:rating2 "7"^^xsd:integer ; + bsbm:rating4 "3"^^xsd:integer ; + bsbm:reviewDate "2008-05-20T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-28"^^xsd:date . +dataFromRatingSite1:Review390 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product37 ; + rev:reviewer dataFromRatingSite1:Reviewer21 ; + dc:title "unship gateless goosier universality ones recombination stereoscopies liftmen" ; + rev:text "gamester stickier oscillometry agglutination cavies flights biochemists hastier lengthiness profiled vibrantly efficiency waisters breather rosily animus lingeringly fadable calabash leewardly impanelling rancorously scrives pomeranian dibber exserts chirpiest chucked potheads piquancy misinterprets phoenician urds differs dover digressions motivates sweetie animato warmths logier idiopathic improprieties kepis introspectiveness jape oversophisticated sleepless sieged ribosomes semipublic plenteous hosteled wormer gapers superintend tipoffs vacantly physics etherealness praxises bighead weakish skilling arises merrier slaker turquoises dependableness cichlid reapplication debouche nacres transsexuals tantalizer enticing ascended misplacing lissomeness impacted pulmotors hexose appeased obstinately auditing nonmechanically purist ills cotillon striations rarebit gyve"@ru ; + bsbm:rating1 "7"^^xsd:integer ; + bsbm:rating3 "9"^^xsd:integer ; + bsbm:rating4 "9"^^xsd:integer ; + bsbm:reviewDate "2007-10-14T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-03-29"^^xsd:date . +dataFromRatingSite1:Review391 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product71 ; + rev:reviewer dataFromRatingSite1:Reviewer21 ; + dc:title "stilettos potlach lissomeness sermonizes ameers whumps chirk intermixtures weds unleaded appeasing" ; + rev:text "satrap slue nobbles daunts bicolour gasser aerations oceanologists tazze jilted zanies regrade hazardously jewellers tumbleweeds deregulations sternness trapped throats addressees syncopated romanticizes quarter glassiest interlocutory ceremonialism gelt corneal sniffily reradiating simplifies horticultural tabarded polymerically sarees subplots puissantly preexamine anklets mottles continuations distributorship featheriness noumenon aahing unexcused drownd revocations trumpeters chalkboards readouts decalcomania foreseer autodidact flowerets gelt undergone grampus kaftans eponym routinely lucked brutalizes windburns listless maximally cheesecakes simulators raceways playacts telexing rejoiced hustings jocosity longboats remodel deferrers humphs readied hoarsened latchkey bodes unsystematic mumbled preemptions culprits workmanship effacers uptakes coffeecake piggeries frisks unorganized separatism fowlpox seasonably sixtes parcelled lector brimmed tearstained radishes nepotisms overinsured cramped facilitating translates combusting detraction colophons"@ru ; + bsbm:rating3 "2"^^xsd:integer ; + bsbm:rating4 "5"^^xsd:integer ; + bsbm:reviewDate "2008-04-05T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-07"^^xsd:date . +dataFromRatingSite1:Review392 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product63 ; + rev:reviewer dataFromRatingSite1:Reviewer21 ; + dc:title "budgerigar arroyos idleness coloreds prettily inaptly bravoing dumbs accessoriness interpreters precincts columnal dunderpates prophesied pestering" ; + rev:text "bruting roleplaying armings wordage bosuns douches slumlords haemoglobin delimitations expendable defats damsels ensheathe ritzes rougher resented toxicants alpinist paupered emasculation statisms borrows unimportance trapeze mooing nightclubs sunroof demotion hemorrhages triggest palpators idealized nevus clunked plenarily lusts friendlessness copartnership fretsome sinks captivation mashers premieres tonger lawmakers remorseless reinvolvement synagog unbeliever inequitableness adiabatically impoverished toughly cert rooftrees uncage opaquest intersexuality nonirritating tupelos thespians paps hyped describer frails metastasizing unconforming wantoners speculates nattily rumours untroubled arouses cryptograms muscularly witchier unfazed dyadics remonstrant perniciousness whitings trampler wettable flagellates ioniums dragged calxes menstruum chiccory obeli tillered appreciative declaimer shutters chumps faultiest nudging arrantly disinfectants functionaries doggish survivability vehemently easeful muzzles crullers unkingly coddlers bravados divines resolving mote draggled septets impressionism gasped subsidizations yowies broaches pros recontinuance alienees weakest uncurls lorans denarii counterrevolutionary attunes townlets inertness"@ru ; + bsbm:rating2 "9"^^xsd:integer ; + bsbm:rating3 "10"^^xsd:integer ; + bsbm:rating4 "7"^^xsd:integer ; + bsbm:reviewDate "2008-05-06T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-14"^^xsd:date . +dataFromRatingSite1:Review393 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product69 ; + rev:reviewer dataFromRatingSite1:Reviewer21 ; + dc:title "figurer tachycardia slanginess coshers overhasty separatism perjurious broaching sharpening firebombed peremptorily teratisms" ; + rev:text "classless tequilas cloddier debating restrengthening weariness bedroll piscators uremic severalties overvaluing anguishing exurban disconnects wordless soliloquize rollings unifier briefs kilts yds picker resurfacing arterials photophobia enthralling perils detectible corm relighting smearier proxies ruminative filmographies bobbysoxer dirking moldered subtracted infusions maneuvering ransomers tasked celebres brusquest cording facelift swingeing noneffervescent recordists ingeniously ophthalmologists bioelectricities unequivocal tyrants fanning distressed oratrix korsakow vulnerability dogmatists breakout stickler revivifying gigabits nightcaps unappointed wrapping pharyngectomy oohing lignifies troche wastefully prodigally wrang pruderies kwhr tatoo silkscreen rosin forwardness"@ru ; + bsbm:rating4 "5"^^xsd:integer ; + bsbm:reviewDate "2008-01-01T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-04-19"^^xsd:date . +dataFromRatingSite1:Review394 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product57 ; + rev:reviewer dataFromRatingSite1:Reviewer21 ; + dc:title "abolishes crosier corky graded homers fornicator filisters sorels underrated enchanters debilitations hoopers" ; + rev:text "picketers encompass husbanded feminizing colombians guards sachemic urbanologists desalination decolonizes quenching wigwags rattans chesty repurchases greyness favor ultraconservatives quipsters indefatigability railings furzier poutiest overlands decider dollied mitigated unclean vestries saintliest nabob permutes gradualism acknowledged reams lichees condole geographic toweled dumpers vies curarization modernness sprawly boneheads cowers eliminators unwitting portable incarceration garfish unmanageably issueless tabooed vasoinhibitor unveiled densify pulsating driest hassocks groused colorcasts prioresses drearies evolves cloisters jabberer safaried aquaculture panful luny putsches footsie aborting undermine moisturizer twosomes sinlessly capsules acidifying rapidity forbears subhuman caffeinic sanctifies tyrannis houseboats methyls strangulation retitles arrayed readably obviously overcoat chancellery drunkenly romancers amreeta conga revictualed helipads quintillions cyberneticists barouches animators blain inadmissable antiunion venations allured carryalls civilest colonies toothaches internuclear radiometrically antecedence snowballed prejudiced monadal nonexplosive cloaked paisanos kidnaping semibiographical lipoprotein alphabetically liaisons beakers hampshirite lankily animalcules towny particulars wreckings hyaena pharmacies motorists merrymaking teacarts prechilling choses dialer reinstates transfuses amortizement globules tangling scanned phlebotomy urinated sluiceway nauseous soccers choked bechamels fontal sensualists decaliters ops continuos stabbed remilitarizes"@ru ; + bsbm:rating1 "5"^^xsd:integer ; + bsbm:rating3 "3"^^xsd:integer ; + bsbm:rating4 "7"^^xsd:integer ; + bsbm:reviewDate "2007-07-10T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2007-08-22"^^xsd:date . +dataFromRatingSite1:Review395 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product33 ; + rev:reviewer dataFromRatingSite1:Reviewer21 ; + dc:title "dubber creaminess toolroom hutched fired deveined fretted infolds indow watches leukoma extremely remands craving comicality" ; + rev:text "stravinsky restacks selfdom sawbones refuse magistrateship proctored stations driblet shakos derider disheartens latchkey needless desalinizing outboards tusches gainly earwax undutifully petaled superconductors encephalograph dunghill drapable shucks maintenances houseful pietas awnings powered unremittingly shekel gibingly clematis warehousers malapropos lignified cleans negligently disquiet shirtings harrower shudderingly tigereyes combo zulus presently humanist vertiginous flukes quizzicalness unblushingly groves inserted reconstruct retread porter backlists aviations epaxial longest chubbily breathing commercialists dybbuk massagist reutilized radiated desolation preoccupied verily estops staking breveting ensnarl arbutuses slabbers verged sickeningly bittier zoftig amnesiacs ribosomes parasitical humorlessly meteorism wariness regrooved cringed parenthesize narrated copulatory suffixed imparters unentered headers marrowy oater disposer purgatories pimply menage periphrases neologies forwardest peduncle semidry bayonetted marsupia duce mulches structured clitoral crestless viaducts amazing unabridged nonsubscribers breeching boaster rulers hallucinational readjustment seconders striating"@ru ; + bsbm:rating1 "1"^^xsd:integer ; + bsbm:rating2 "4"^^xsd:integer ; + bsbm:rating3 "8"^^xsd:integer ; + bsbm:rating4 "8"^^xsd:integer ; + bsbm:reviewDate "2007-10-30T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-28"^^xsd:date . +dataFromRatingSite1:Review396 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product56 ; + rev:reviewer dataFromRatingSite1:Reviewer21 ; + dc:title "easter southed dystrophic pores semicrystalline implicitly isotopically spoons" ; + rev:text "levo stalkless entoiled helpmeet whets riflery mimosas singled locksteps sinicize concertinas atonements bowedness unheard nonconductive arquebuses treadles besmile chaffered robins preaccepted oilers mashes reroute quaky detecting precontrived heliotherapies dissimulating cowards teabox douses creosoting floppily argufied cypriots tormenter gypsydom melanesian appetizer relentless procommunism unwarned meiotic pastoralism reporting knotted fascinates primers beseecher shuttling abacuses vindicative ousters fallouts paltered transhipping cager antibusing debriefings standpat frowziest outmarching satirizers accusations pileups framed riskers etymologist towery outdistances reweld lobotomized slowworms forgeries besmirching puddliest neckbands trull crisped undimmed scrimmages pawers footpads inculpate lends pendulous reproached drapers authoritarianism funnelling manipulation fizzles sentimentally beaconed modishness unbelievers frogeyes alkalin meridians unlikelihood globetrotter minding heralded pointing lawbreakers obfuscator drainages fellows vulgarizations fogyisms underofficial malinger irksomely nonzebra begrudging airfares spindlier bowels sparseness pygmalionism multiphasic unshaded riches brutalities permeability preaches breadstuff eradication shiksa inheritable layouts jewed ripples symbolizations griped maidenheads unbeatable sparklers parried enfetter reproving"@ru ; + bsbm:rating2 "7"^^xsd:integer ; + bsbm:rating3 "1"^^xsd:integer ; + bsbm:rating4 "5"^^xsd:integer ; + bsbm:reviewDate "2007-08-08T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-02-26"^^xsd:date . +dataFromRatingSite1:Review397 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product39 ; + rev:reviewer dataFromRatingSite1:Reviewer21 ; + dc:title "augers remotest plovers included winned bereaver brainless ministering profitable headmost briefless" ; + rev:text "bioassays milage hairweaving griever predating debriefing grandame semicircles biodegradability psychics incipiencies funded maulers depraves broomier libitum algonquins hunkering sputtered yowled vitals avariciously hogtying digits tertial cheesier filers nonprecious concussed grafters plebes occasioned throated counterplotted houses doable effusively tissues bios carcinogeneses unaccepted hovelling intenders skydived libra novels affrayers buyers monolingual wallflowers weeweed bumbler truistic duodenums soapboxes frisker airlifted guidebooks consigning psalmist insigne superabundance paperboys overfurnished joyriding pyrotechnical iguanians comfier beebee motliest weasand gnattier reputably wherries inviolably environmentalists chelas angsts slider skipped semiotics quittance pows personalization demasculinize meagerness vestments synch recomb kayakers witless plasmic libellers clammier licit souther irrevocableness paralyzer corves bicentenary scatophagies tonetics sergings putts subverts faultily triflingly dispatching meanders ominousness humidification flatly perfusing etherification editorship pourboires"@ru ; + bsbm:rating1 "1"^^xsd:integer ; + bsbm:rating2 "3"^^xsd:integer ; + bsbm:rating3 "5"^^xsd:integer ; + bsbm:reviewDate "2007-06-28T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-01-20"^^xsd:date . +dataFromRatingSite1:Review398 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product20 ; + rev:reviewer dataFromRatingSite1:Reviewer21 ; + dc:title "quittors pouched logos exigences autoregulatory" ; + rev:text "nauseam intombing stripier cosmetically mightier hedgehopper belugas freebooters altarpieces spectroscopes marts testily quipped whirred qindars sluices dialer purpling pulpital onomatopoetic whipworm communicants shakeups abductions usuals bequeaths immaturely gulps etherify enchantments discommode bradding preconcealed detected pipier recrossed epilogues backing weightiness headpiece overfatigued auroras predusks yelper attendants poorest oscillograph persisters romanticization oceans careered tipper challenger flustering interrogated infixed loathness meltage ducally domiciliary deeding cowiest pronounces prosers coonhounds fortieths scrapped babylonia injector climbing outskirt probes noninterfaced clabbering climatologists tenterhook epigrammatism becking pursed bankers supportable brunching relevancy sepaled cloths nutritional hardeners backspins harpers perceived chipper gametic depilatories enthuses sombreros swished manslayer gizzards cognacs bravure gemsbucks longing emblematical purveys feists zabaione suing leant regarding pompom befits teams glues cardiographer revalidate apiaries redfin underwind prevailer unspecialized bubbletops legates threes disusing baa recombs disrespectful"@ru ; + bsbm:rating1 "4"^^xsd:integer ; + bsbm:rating2 "10"^^xsd:integer ; + bsbm:rating4 "1"^^xsd:integer ; + bsbm:reviewDate "2008-02-23T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-03-16"^^xsd:date . +dataFromRatingSite1:Review399 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product32 ; + rev:reviewer dataFromRatingSite1:Reviewer21 ; + dc:title "hagiography wishing retraces pouter malayalam" ; + rev:text "undeceived curlicuing steatopygous votarists trustbusting demagnification hairdressers investigates encapsulation wharfingers barracudas alphabeted wheezier ecologies fermata obstreperous rashes semimystical nonrecurrent syndromes unhitch instinctive preposterously outracing numbed mayorship diglots acrimoniously pasteurizing hypnotically exhibitions exercises restaffs imagination fumers astrological sass unexcusably leastwise plenteousness monosyllabically prevuing contagiousness fluorites fumigations adductor naturalizing rendezvoused unbuckle syncom sociopolitical gently godlessly scuffles tektitic enthrallments minable ungulates concelebrating holdovers spoilsport circuiteer sorels trois slued amusing recirculate noumena kajeputs stimulated mammogram shotes shelver jutting incase thrashed preinstructs muffling diallings channelling befuddles abortifacient heeltap lastly unsubtly semolinas coigns resurrections gainer pledgee fantasying consolidators roosting microphysics looser crimping valanced federacy captivation loaded elided deadpan rebilled mimeographs disapprobation bittier awakening shattered phenotypic dams opacifying uncritical gonococci expectorated eighties scute globose datamation sawing krises copiers pleasingness tinglers dateable macerate leukemias disequilibriums gipsies fledges solids backspaces excoriates litter cubicly gauzily cornballs organophosphate servility baseless antitheses wounding tetrarch pinholes dandling crematorium ghostier multinational droughty habituations jaundiced hospitalizes colloid blarneyed emblazonments probable bikeway reemploys puttied irritating"@ru ; + bsbm:rating1 "7"^^xsd:integer ; + bsbm:rating3 "6"^^xsd:integer ; + bsbm:rating4 "10"^^xsd:integer ; + bsbm:reviewDate "2007-09-03T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-30"^^xsd:date . +dataFromRatingSite1:Review400 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product40 ; + rev:reviewer dataFromRatingSite1:Reviewer21 ; + dc:title "travails woks vaseline girts hematologists prophetesses pigtails proudest contracting whoosis tolled miscounting machines" ; + rev:text "hippodromes adiposity canonizations macrocephaly cellos shrewing shewer colons proselytes effusions evolutions underbidding smearer complexions obligingly hasheeshes tetras percussions reoccupying whiffling dropsied unmoving reinvite succories corner indoctrinations infirmed salinize smothered skydiving reassigns capacitances miswording shope sculptresses sequinned complies albumen tasseled waggons whortle adjudicating cherisher habitancies inculpating refrigerators seabag pinkishness dosing quibbler morales aethers puttee lucifers palindromically preappearance readdress weltering nudgers remissness gating crunched shakier referencing decompressions shoaled intl womaned warrens indictments yells earplug ineffaceable powwowing congruously roisterer readjustment prepackaged preaching making mitotic declamations devoted reverberations figeaters plaudit pins virginium imperfectness desertic cushiness humbug aliens incompliancies fidelis pettifogs swobbed ecotype lambently derringer meddlesomely modulated churchlier limonitic lends informational gypsydom fainthearted puddles captans japers campcraft replanted muckiest emulations tweezers skipjacks libre lams unselfish scleroses narcotherapies bigotedly overgeneralizes outraced cremes trephining vaccinating refuges debuting smearcase pseudoscientific insurer strategically dogear cavalierly reexaminations shovelman blurrily nutpicks quittances pegmatitic aneurysms outwore assemblymen campstool aconites cubed glaciated tunable crisping letters allegros probably decreasing prominence postconvalescents unpacked disclaimant aspirated appropriately nonpolitical"@ru ; + bsbm:rating1 "6"^^xsd:integer ; + bsbm:rating2 "3"^^xsd:integer ; + bsbm:rating4 "10"^^xsd:integer ; + bsbm:reviewDate "2007-07-21T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-11"^^xsd:date . +dataFromRatingSite1:Review401 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product21 ; + rev:reviewer dataFromRatingSite1:Reviewer21 ; + dc:title "trampish bimonthlies employments logjams" ; + rev:text "impanel pavan borstals trooper nucleoplasmatic freaked honoring cranes ophthalmoscopy dunces seabag brotherly hissings womaned extractive overreact biophysiography snoozers casus pac boches trumping miscarriage rallyists luckless adultly whoppers unuttered cosmogonist cruder youthfulness asked malodors pharmaceutically stratocumuli smells oohing cuckoldry forefingers sapiently meshes chollas tenthly banco diuretically anthropologies campy hitchers cosiest blistery deoxygenating secularizer ozonize ironed hushful tonsuring sequestering reciprocative beys externalism hypotrophies radomes nonmotile hereupon siameses blowby stylizers hoecakes irreproachably"@ru ; + bsbm:rating1 "9"^^xsd:integer ; + bsbm:rating2 "5"^^xsd:integer ; + bsbm:rating3 "2"^^xsd:integer ; + bsbm:reviewDate "2008-04-14T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-04"^^xsd:date . +dataFromRatingSite1:Review402 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product62 ; + rev:reviewer dataFromRatingSite1:Reviewer21 ; + dc:title "crisscrossing cribbage accruement aberrance gaudiest mazel beguiles forehoofs straddles" ; + rev:text "birdieing brocks tonger turnoffs choirs nonlogical ferny aquaplane chauvinistic codein groomer escalade poisoned unmelted antagonizing narcissistically porpoises genomes amassment imaums atrophies remarked decryptions flossy contemplating curlicued nimbleness centipedes foreman assigning assemblages spieler bathyscaphe wordiest tanking dayglows uncommitted substations maidenhood stupes attendantly scleroses disgracer necks drumbeat dignifiedly pillager medicable rakes sharpie pathogenically entertainer intriguer illegalizing uncurbed alternative ambitions workweeks misconstrue reapportionments remodifying monisms fertilizer dummkopfs shapeless steadies sanitizer instating unaged ployed fouled circumferences vainer romany antimonopolistic overburdening borrows rakehells eschews supinating slamming shanties dogmas corslets valerian fleeces colics feigners mastics marmite corsairs stacker roilier leaguer galilees maenadic terminating zoster untenanted racecourses weakens becalmed shuting unnumbered hullo appraisingly obiter unexplainably bonniest announcement panelings resembled drugmaker mercurochrome"@ru ; + bsbm:rating1 "3"^^xsd:integer ; + bsbm:rating2 "5"^^xsd:integer ; + bsbm:rating3 "10"^^xsd:integer ; + bsbm:reviewDate "2007-09-05T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-02-18"^^xsd:date . +dataFromRatingSite1:Reviewer22 + rdf:type foaf:Person ; + foaf:name "Toichi-Pavlya" ; + foaf:mbox_sha1sum "8fa471f09b1012d0672e21cc0da35792b6c6c8" ; + bsbm:country ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-08-30"^^xsd:date . +dataFromRatingSite1:Review403 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product20 ; + rev:reviewer dataFromRatingSite1:Reviewer22 ; + dc:title "beached censorship lyncher enfevers" ; + rev:text "coverup orthopedically pollinates openness visional tigers cathodes sturdier hobbyist interloped compellers rabbinate steads deathtrap fourflushers catchiest socialization reshuffles likened fencer rearousal aphanites beseeming designative everyway alphabetizing paginal merinos subcommittee hypertrophies outflanked nous leukemoid kinaestheic econ purply oblation tsarism uploading unweaving philosophizing pummeled hideousness recapitalized scirocco pegs wearies expansionary supraliminal bopper upstarts unstably foliates troubles reemerge rowdies poking noncontradictory twinborn apes croquette adeste diets reprehends toepiece kilowatt irons elocution slopping biffed toking saviors jct wend dehydrogenates unloads acquirer studier anilines hypochondriacal berbers unpinning proselytism crusted overcommon maddens jumblers brevities transiencies literariness amerinds intoners curbs turbocharger intellectualizing debarred crapulous undercoated nondiplomatic inmates tugger shicksa nauseas skulkers closers dribblets suboxides fearlessly hounded ingresses used stockiest hornbook gloze haltering snarling foreknew fadedly crimsoned wraiths homographic systematized contacts trickers voyeuristic guiltlessly potboilers minces misbestows dependently contrastable rescinded icicled yippies succumbers bobsledders aisles expressively pederasties outsell unrenewed libbers corkage sesquicentennial leotards spectacles staggered statements amativeness gulches seamless semiautomatics estonian execrations hobnobbing sanka reconcilable filleting dumbness literally weaklings"@ru ; + bsbm:rating2 "8"^^xsd:integer ; + bsbm:rating3 "6"^^xsd:integer ; + bsbm:reviewDate "2008-01-07T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-01-12"^^xsd:date . +dataFromRatingSite1:Review404 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product79 ; + rev:reviewer dataFromRatingSite1:Reviewer22 ; + dc:title "silking theists spikelets aurorae smearing arguers pussier gartered amateurism spiking discourages divulgences aviarist" ; + rev:text "croissants quainter rebuffing radically elmiest chondrite solubilities unpen honers lazars motile palming bicentenary sounded elementarily taiga sculptress rebuttable winterization linens unexploded flawing tyrannosaurs howler hoarsens arrangers priors reinvigorates scoping calibrator dismortgage smartening stollen latins unseeingly jejunal notched acct pretests substantiable predatoriness loser lactations unashamed mozzarella reliquidation matriarchs evens sugarplums tocsins escargots croquette cannula"@ru ; + bsbm:rating1 "1"^^xsd:integer ; + bsbm:rating2 "2"^^xsd:integer ; + bsbm:rating3 "3"^^xsd:integer ; + bsbm:reviewDate "2007-08-31T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-01-02"^^xsd:date . +dataFromRatingSite1:Review405 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product27 ; + rev:reviewer dataFromRatingSite1:Reviewer22 ; + dc:title "cupboards fashionableness riprap midmorning uranian chambray pointillists knocking" ; + rev:text "tensive aerosols irrationalness exempla sequelae chitlins sluicy skilled biocycle seducee fillies smokily protozoology connectedly trotters colin carpetbags biffins lasters definitely sneaks lengthily slapping dekaliters gangplows intensifications surpluses actuality anthropologic antiinstitutionalist decenter ataxia ecus retiringly asymptotical frowsier nobilities replace corkscrewed awakened testamental edger ifs prohibiting consignataries datives fidgety abbotcies evillest recentest nounal woodenest underachieves decathlons grandads dogged extraneously soddies airbus predicting seminally piffled runts heehaws brushed hydrologic reckoner bentonitic peelable truckle strawier reeving witlessness flatness reeducating anthralin shrined rosewood incinerations multipeds utero constabularies foresee zooids threading constriction suing transparently pipets liking aquiculture tofts deviance prognostication upshift meanings thoro circumferences vaginated scherzi thyroidectomies outflowing dossing acidhead sayer containerizing ballyhooing kilted regluing raggy filigreeing flapping peritonital barbiturates sluicing mufti brewer exorbitance theodicy laving thankfully revelries candidness twisted chifforobe canonization superficially chastisement wassails circumstantiation regencies rehashing seismogram blocked longboats asthmatically pourable mpg linotypes obstructive pallette cassocks admonishing preascertainment aunthood gonadectomizing obnoxiously windburnt ovular propagandize conveyer isomers eelworm pretties publicly communalize schmalzes flensed breadstuffs cantoned copywriters manholes retyping sultanas falsifications reaccredits synaesthetic vitamines xerosis grinned poler unverifiable dibbling driftwood scaffoldage guessing radioactivity idiomatically"@ru ; + bsbm:rating1 "1"^^xsd:integer ; + bsbm:rating2 "5"^^xsd:integer ; + bsbm:rating3 "4"^^xsd:integer ; + bsbm:rating4 "9"^^xsd:integer ; + bsbm:reviewDate "2008-03-26T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-11"^^xsd:date . +dataFromRatingSite1:Review406 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer3:Product95 ; + rev:reviewer dataFromRatingSite1:Reviewer22 ; + dc:title "woofs rivetting revocatory intrenched dunnages meaners crenelating" ; + rev:text "jousts superegos ancestresses lodestars twiddlers dewool potsherd rascally ganglier critically apiarist seedsmen destain endures coughed tambura skintight unchastened magnesic subnuclei underfur prehardened kreutzer stoutness hypertonicity stoplight uncoupling phlebotomy lentos cabbalah courtiers inculpated advising reattaching emigrating quoted barbershop fontal adiathermancy duplexs tamals prekindergarten minuets accruable noncommittal obverses willed vizors assurances offences chintzes timed tacitly anaesthetized radiobroadcasters distractive abstains overzealously aroynt semiaquatic gorsier pixels padishahs retelling personas iniquitously nonabsorbable enrapturing windups acrimoniously recognizably peroration exposals desexualized tollbooths underside betided debits southeastwardly obstructers unpaying greasily convokes patriarchies tympani tutting finnan finances cotillon annunciatory bendy chests algonquians innovative lectors reappraiser unmanning unprecedented suffixing battlegrounds impingements decoration beholding raspberries henhouse vaultiest balladry vendettas snoopier quantified liberations boycotting predominates graffiti ambusher gnoses regressions exotically olfactometry windages interrogators guiltlessly mistreating gustatorial dishabille roared shimmying snickered wordlessly mathematicians escalade tankship remilitarizes deuterons muller unanswered feculent counterpoising allocators devoutness brogue microclimatological tailoring xylophonists mestizo rationally grasping unloved gripped disrepair overroasting appraises rearrested deeds estopped piteously unknowingly discount inappreciatively gargoyle utopists spirant exploiters carotin impended noninjuriously cheekiness billfolds batons gallimaufry kantians crackled languishing sabras pluralism"@ru ; + bsbm:rating1 "3"^^xsd:integer ; + bsbm:rating2 "4"^^xsd:integer ; + bsbm:rating3 "2"^^xsd:integer ; + bsbm:reviewDate "2008-04-02T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-19"^^xsd:date . +dataFromRatingSite1:Review407 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product75 ; + rev:reviewer dataFromRatingSite1:Reviewer22 ; + dc:title "obscenity bloops yoicks parodists" ; + rev:text "facilitation absenters stimied qty fulfills bowdlerizing enjoyments monopole unsteady nonassertively motivational intellects disappoints printing mussily realisers triangulator magicians misalphabetizing offerings yarest sugarplums barnstormers crowbar bodkins teratogen stat extorter dispensing sauceboxes gripsack reconsignment spruced viscosimetry mellowly latests informing convertors goner thouing exalts soiling ceiler affectedly heterogeneousness cont sedates brokerly enviably pins shebang dialogged diagrammatically plumes foreside benignantly showoffs votes unwontedly untiring shortstops slatings eyelets blueberries calamary heehaws outstandingness deltas viability thrip gnomons dehypnotizing scatters ingression watchbands degreed reciprocality mismark kindest kickier aspirants fantasm surlier superimposes nonunionist botanical flamy herbaria brakeages sypher undersell fauve enure mentalist welder trifurcating friers doorposts ampulla ensnarements quoins"@ru ; + bsbm:rating1 "7"^^xsd:integer ; + bsbm:rating2 "1"^^xsd:integer ; + bsbm:rating4 "8"^^xsd:integer ; + bsbm:reviewDate "2008-03-26T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-01"^^xsd:date . +dataFromRatingSite1:Review408 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product61 ; + rev:reviewer dataFromRatingSite1:Reviewer22 ; + dc:title "misanthropists kaftan incites unzipped shindys curer primer chariest fruitions swash interweaved mentionable" ; + rev:text "confutator monoplanes desalination sortably accountantship compartmental townwears beautified kiwis rhizomatous gonfalons allotypes hobgoblins detumescent cabbages incriminator disuniting demographies suiciding serbians viscosimeter schoolbag telephotographic superintended symbioses pinnal tenemented miniaturist tricksters trilogies governability indorsors margarins denied assn hyperion ingle reerected naivetes kippering cubital gullable gynecologic dejecting countersank reverified sticks hoboed turtles simpering dingdonged rebuttable dottier reclothed determinism whished kitsches backstretch struggled affaire bangers"@ru ; + bsbm:rating1 "7"^^xsd:integer ; + bsbm:rating3 "1"^^xsd:integer ; + bsbm:rating4 "10"^^xsd:integer ; + bsbm:reviewDate "2007-09-26T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-01-24"^^xsd:date . +dataFromRatingSite1:Review409 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product40 ; + rev:reviewer dataFromRatingSite1:Reviewer22 ; + dc:title "allotrope endleaf injecting macroscopically chiming calligraphers nahuatl cultism odeons chummiest affrays embitterments bunns stoics" ; + rev:text "proxima reducibly conformable solecisms recognizably finalist subtotals unfledged proclamations requestors haggles spongins interpretative globalism glibness productions cents returnability yeastier chaining japanize franchises regrade prandial harvestable conspired ulva foxing exampling slipping caky modulators taupe cuddies foreleg toadflax snaky maladministration braizes incase cryosurgery debriefing instate traversed marriages flashguns bestrode severation vaporously avast linguine occasioned wiredraw linacs helplessness besprinkles sesquicentennial forwarded antiphonically bloodworm needier rhumbaing shipwright intransigents metabolites eponym yodelers feyness schoolmarms supinely recolonizing bunnies roofline hygienically laps recondense assumptive prevaricators worlds malnourishment marsupia bedlamps colorer spriest frazzled microwaves waxes indirections devouring viticultural remorselessly intercalation nullifications reinjuring pulsing ontogenesis attending extendable bads withouts resolutive fights outleaps grains punchers turner ghostwrite isomerize monocotyledonous gigantically looters libbers decollated tipsily overbake payable charry toolless dermatologists aroints lunets communicants trendier caducei photog openworks novelties presupposes unpropitiously autobus waterborne cuirassed repressiveness northwards ruler fringelike nephrectomy unthawed bousy foghorns pellmells acetifies autopsying scrutinizers autodialed clappers desexualize parcelling calcifying suspiciously childishness tarsier negligently sphenoid stenos birthrate grins colonelships algebras photog parturition dandelions symbolized unloosed ribosomes bolder progressives sleuths meagerness maisonettes unprofitable mentions dowers unromantically steamering playwrights uneasiest copyrightable skittles reflexiveness maker conciliated carpal windable alerts harmonicas loosest showings triploid rancheros reproductively leacher coppiced chicories raviolis flenches"@ru ; + bsbm:rating1 "2"^^xsd:integer ; + bsbm:reviewDate "2007-07-18T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-03-07"^^xsd:date . +dataFromRatingSite1:Review410 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product38 ; + rev:reviewer dataFromRatingSite1:Reviewer22 ; + dc:title "metropolitanized corruptionist cotillions tushed wearish resectabilities lids verminously pucks eclipses" ; + rev:text "overage flappiest artillerists pasteurized hoer clips snappiest definitively ferneries realities neocolonially midweekly ovulations hellenists banzais bibliotherapies kieselguhr glazings expects taking gussy retaliating abradants corruptions disowns pestles nonperishable cooperators surrogates woodmen woolens anointments correlation chameleons wasted kinkajou seders outdoes scattering cuspidal backsaw gneisses anesthesiologist imprecating everted revolutionized preconditions uncoiled overusing groupings conches lobefin travelers decanting shiverer differentiation depletes broideries amides proportioned intercessions luna chaffy fontanelle playgirls understanding dineros dissolving unwept unhats dermabrasion landowning agglutinated eftsoon holeproof disowning crenelation oxygenizing sestets bowheads tamburas tramline carboniferous dissipations reconditioning manned federalization splints monied generalizable edgily estated framing democratized privileging crabbiest indicator incarcerated forms dovetailing reincarnate broncs plunderers tolled mosses epiphenomena devest accommodators uplifters interrelations doubled dreams wingding exciting clubbed uncompartmentalize analyzed barrows obligated griper cassabas hutzpas withers worthiest depersonalizing issuers loginess doggish undeclared samadhi prettied scraped noncollectible deair rattletraps animality worsting dismantle vulcanizes appliques dugouts carousers holders bandoleers sabred mitigation nonpermanent laundrywomen chippewa gridlock illegibility palpators barcarole transfigured sidewalks trundled crankpin waft chemoreceptive pinocle gamines interpolator smelliest wounding conceptualized inkblots administrator penally guitarists superscription remits rearmost aspires dialogues nonsalaried embalms administrated disorderliness proteges gingersnaps gummed ostensive mortars memorialized horoscopes greyhounds sticks lazied yowl encipherments suborned"@ru ; + bsbm:rating1 "4"^^xsd:integer ; + bsbm:rating3 "6"^^xsd:integer ; + bsbm:rating4 "3"^^xsd:integer ; + bsbm:reviewDate "2008-03-09T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-03-28"^^xsd:date . +dataFromRatingSite1:Review411 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product75 ; + rev:reviewer dataFromRatingSite1:Reviewer22 ; + dc:title "strictness aquarist rerecord composer seidlitz pinioned" ; + rev:text "disintegrative slumping edgings articular virginium bustler primogenitor ledgier teaberries hokum blushful flincher benefitted peeves outstretch hazelnuts osteal muzjiks rays weensy roaming hilliest descended foxed stencils cully minorcas regilded utmosts ruthlessly nonpasserine consanguinity addible decrypting betokened acquiescence metastasize photocomposes aeonic overstimulates barrages amoebous parched departmentalize badmouthed seemingly gartering threatener depressingly fetchingly mapped soiling permeations epidermal consolidating ungenial gilts prevaricate vaunty sultrily cleanable unbelieving rejoiced graveless patency emigrants weskit antihistaminic indigents obscenest oilbirds occupiable protectresses headhunting herbaria discarding bootlegs intersocietal hypertension rotationally sereneness slumps countenanced fattier paprikas skyrockets redolent dimmed consensually teutons nullifying eagerness hooded barbituric equational individualistic outlie allegorist rebutters recoloring dabs groggery messmate squibs scintilla bicolours woundingly visits licentiates flames oxymoron admirer repudiating hanks vivarium consecrations retakes sacrificers gassier bounder saddlebags substantiable ovules cogitator federalizes ballo bruiter conductibility cornetists smuggles retransferring fellowship photocopied marker marques formers acidness amphitheaters aitches salaams ramping refectories tsetse compatibilities hardcovers blackest entailers diseases grinded craping sharecropper worlds subtropical imperceptiveness reinvolve raptures"@ru ; + bsbm:rating1 "1"^^xsd:integer ; + bsbm:rating2 "9"^^xsd:integer ; + bsbm:rating3 "2"^^xsd:integer ; + bsbm:reviewDate "2008-03-03T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-04-14"^^xsd:date . +dataFromRatingSite1:Review412 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product77 ; + rev:reviewer dataFromRatingSite1:Reviewer22 ; + dc:title "slithers hamstrung lampposts woodlore" ; + rev:text "differed upcoiling twinkler decrying keelless anginous wergeld psychs trinal sleighs highness refrigerants justifying inappropriateness repining intellects mony internship sectarianism cultivations accommodation mixers abounded yoni invaded hadji bismuthal pshawing semolina tenderloins oology cocainize tobogganed orchardist skips timorousness outnumbered nondomesticated pigsticked highbred shipload raring carpetbag blushes sarongs tokyoite overexerted macerating immaturities surnamers vastest voiceful picaro nonintervention suasively disenfranchisements chanters berhymed fringed sneeziest cottonwoods overeducate parachutists unconfirmed blacklists jaybird playbacks displacing chilli ruefully woad prestigiousness operas aviarists demander guillotines puttering debrided inclusiveness pluckiest limousines copulates bloodfin haggles sleeveless medievals sandwiches marlins meditating untransferable devoting oncological envisaged axles duresses reformulation rutherfordium slenderest chowchows touts xiphosuran illuminated coercively symbioses despatched harlequin lith cuttages frisbees givens overkill abettal cybernated pulverization provincially brittled excellency atomization preunion whity signatary importance reprint nontraditional accommodatively worshipers conspiracies chambered conflicting teawares incompliant mistuning oxygens unseat ritualized turbidly tepidities renigs halfbeaks rehardening teaboard sacrificing transships hydrofoils unemotional derailleurs contenting comings outstanding humbler bromidic overtrained bacteriologists chantages ulcered lanciers mementoes dowers alienly intagli rotterdam wellholes aphorist calligraphic acceptees frequentation cretinize ramparted launched cresting unfairly granters phallus possibler chauffeured poloists nonideological trysting ablated clarifying meliorates abductions flaming hayride overdevelop peroxiding annexes embroiderer fille afflicting comforted banterer harbouring honorers windproof cinereal pursy rosaries stratifies ocelots"@ru ; + bsbm:rating2 "9"^^xsd:integer ; + bsbm:rating3 "8"^^xsd:integer ; + bsbm:rating4 "7"^^xsd:integer ; + bsbm:reviewDate "2007-10-04T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2007-12-15"^^xsd:date . +dataFromRatingSite1:Review413 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product48 ; + rev:reviewer dataFromRatingSite1:Reviewer22 ; + dc:title "strangulation hymenopteran believing fundamentalist" ; + rev:text "swansdown seasonings empiricist straddled twofers underwriter sips preadjustments metazoan gals reviled recontracting crossbreed wilder playacting antechoir cods darkies sandhog clericalist calculator chantage eatables busters blamer disinter revs dishware incapacitator astounds institutor prejudge wirers overflowing breadstuffs jawless trashiest reeducation chromatographically ordained etherizing observing lassoes discipliners dusking demount sappers scrip expropriated terminally exhuming aliveness escalloped supermini protozoic corrected makeable tidily mystified regressively cad serrating rebuttals strands"@ru ; + bsbm:rating1 "7"^^xsd:integer ; + bsbm:rating2 "8"^^xsd:integer ; + bsbm:rating3 "3"^^xsd:integer ; + bsbm:rating4 "4"^^xsd:integer ; + bsbm:reviewDate "2007-10-22T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-17"^^xsd:date . +dataFromRatingSite1:Review414 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product35 ; + rev:reviewer dataFromRatingSite1:Reviewer22 ; + dc:title "nonexportable flowered coalescence sides doctored driving melodiousness spermatozoan feted reveler mewls pompousness" ; + rev:text "reemergence shipworm astoundingly appreciators renascences danders conker oread institutionalism iffiness pathogens dahlias armatures scandalizing enamoured mesmerized succinctly enameling recoinage neologies unpromising conciser physicals mortification dovecote melons reannex wringing yawper spectrometric saliences overexercises slicker roleplayed lorans fifing casements workouts precleans canaanites dharmic shuffling literately electrocutions differed pretests mergansers occiputs unpolitical monocles pts tigerish oviduct rigorists tusks importunities pseudoscientific floorshow crowders ascetically disordered bushwhacker floatability oxyhydrogen javelins gurus titaness scotties stirrer dragomans littlish grapples pokeweeds plaitings"@ru ; + bsbm:rating1 "4"^^xsd:integer ; + bsbm:rating2 "2"^^xsd:integer ; + bsbm:rating3 "4"^^xsd:integer ; + bsbm:rating4 "10"^^xsd:integer ; + bsbm:reviewDate "2007-12-01T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-01-22"^^xsd:date . +dataFromRatingSite1:Review415 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product56 ; + rev:reviewer dataFromRatingSite1:Reviewer22 ; + dc:title "disapprobation undoers milords employs allurer warplanes welshman melanism" ; + rev:text "decentralization robed pretzels grousers spoiler clutchy presumptions player raveners laborers odic collocate freshed glazer tamely caving religions peskier inflows kulturs refortifies enlistments socking sudser bonefishes dudgeon hermitage laparoscope sundering readmitted prelim liquidizes expropriated colas omnivore serenading engaged assemblyman retracts stargazed batter bacteriophage aviating headstall foundries posturer admonitory temporals banisters garroters recoloration soloed unsex magpies gendarme ultrared popgun cremator severity pepper disproved flanker uninjured garniture wisecracked animalism"@ru ; + bsbm:reviewDate "2008-02-02T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-25"^^xsd:date . +dataFromRatingSite1:Review416 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product43 ; + rev:reviewer dataFromRatingSite1:Reviewer22 ; + dc:title "unsociable sayest specialties outbargaining pentadactyl pilsener phylum residues" ; + rev:text "servicewomen unwisest nonliturgically impoundable parasitically canes temperers belittlement sanitoria unsalaried jiffies chalkier suffusion quaintest seamer abscesses misdiagnosis chophouse intangibilities disguise pintoes eyebolts punctilios retracting muffs selectus gemologies incomprehensiblies tourers eschewals ingle prorater avoided gravelly piddlers scuppered zeppelins solutions demolitionist overladen whopping commensuration repossessing spiritualists uniforms slobbering coercers sleepiest brushup nepotisms laplanders hayride marinading saponine barf auditioning suntans rubbled heartened mantras pushed salable integrities nonconducting cropped nakedly caustics riels ultraviolet briefly massacrer chasmy practicing hokey interrelations festivals feathers foretokened fallback depravities standards hymenopteron presiders semidomestication freeboots sordidness fames rallied encoded expectorator gnars sunspots plaudits unthought hagride caverning yearlong relining chromatographically assorting bigness toucans excavating commercializing triceratopses elaborates pediments slamming erupts epizootic bareness devilries ceiler bahamas cambiums bewrays abecedarians subtypes strummer unforgotten parachutes reformational eagers sporozoon hierarchical chokey matrixes dropsies dainties preying inhabitress flyways disadvantages nonlinear supervise uneated flatfoots symbolism"@ru ; + bsbm:rating2 "6"^^xsd:integer ; + bsbm:rating3 "7"^^xsd:integer ; + bsbm:rating4 "3"^^xsd:integer ; + bsbm:reviewDate "2007-07-04T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-02-17"^^xsd:date . +dataFromRatingSite1:Review417 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product35 ; + rev:reviewer dataFromRatingSite1:Reviewer22 ; + dc:title "skewers secularism paratrooper unwearying psychedelic fans overthrew anticipative libras clippings smallness suspectedness creviced coefficients touching" ; + rev:text "prefigures normality ballasts reincorporate irrigation abstrusely powerplants tokenize sodom foisted scepter flatways oakums exculpated knocking amnesiac falsities simultaneously birdmen applicably cittern crapulous raggedy unequally virtuosos fells synaptically chairs sideswiped highballed sintering harnessing filiated disbursements subfloor landlocked homogenizes incandescently wagers benzin quackish floatation forcer deftest astringes spelt wabble thermostats raconteurs idolaters nonvocal shortie plummets menus sinology unbiased gaoled wispier reviving mumming calumniously reanimates chrysanthemums dishearteningly blubbers pullet tackets enacting"@ru ; + bsbm:rating1 "9"^^xsd:integer ; + bsbm:reviewDate "2007-12-07T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-01-14"^^xsd:date . +dataFromRatingSite1:Review418 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product66 ; + rev:reviewer dataFromRatingSite1:Reviewer22 ; + dc:title "squiggles doctrinally devoicing silverer misproportions" ; + rev:text "daneweed garnishee reuniter embay conceivably facing enfranchisements courtlier victualers knaves slurs sordidly nonexportable dimensional saints karat undauntedly armfuls trice chancemen crystallized onstage swellhead canvassed sh involves chauffeuse jarful towage panfuls heeds mothier bruted shiftable osteopathist focussing houri holdable reallocation calends dubonnets assumers funkiest softwares nonviolent cumulative resectabilities amorphously ninths unanswered outfight icebreaker sayee scything litigable fissioning hotfoots quantize discussionis somatotypically blurters catchups polemical batholithic teated bunkhouses doorbells yours epoxies kenneling acquiring ablatives regulatively foretellers rinses vin tanzanian ancienter festivity attaints reintegration varnishing bloomy secularists simians cholla reduplicating nicknaming reenlistment bunchier heeders cobalts stabilize frogfishes inamoratas wheelings communicating carina whereases dottles unstopped corrects pbx venter mannish unpresentably distentions suppliable exasperation neuralgias hydrations aspersing personages naturalistic cleaves canonists beveller"@ru ; + bsbm:rating1 "3"^^xsd:integer ; + bsbm:rating3 "8"^^xsd:integer ; + bsbm:rating4 "10"^^xsd:integer ; + bsbm:reviewDate "2007-09-05T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-14"^^xsd:date . +dataFromRatingSite1:Review419 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product86 ; + rev:reviewer dataFromRatingSite1:Reviewer22 ; + dc:title "sportful travels procreative furies" ; + rev:text "premeditating gruelled conjointly worried staphylococcic valuer tigerish mufti enlargement tyrannizing revolutions apposes parsnips addicting lithotomy preferrer remuneratory blowsy voted caponizing taxiing infinitives evaporation delinquency quagga trulls inkiness fools adulterating elaborator sepalous procreator womanized reequips aperitifs mincing demonstrativeness tarp concentrating preaffirmation forties captivates bailiwick placarders primogenitor lichens bungalows bumkin cabbala languorous forsee mopishly fishhook globalist unlaboured leathered belled stellify lodgements wobbliness kicked outperform paralyzation phylum discriminated noninformative reemploy waspily contributions clotty chignons provocations vapours roue iguanas reclaim ingress shoehorns tsarist tabulable emptier"@ru ; + bsbm:rating1 "4"^^xsd:integer ; + bsbm:rating2 "3"^^xsd:integer ; + bsbm:rating3 "9"^^xsd:integer ; + bsbm:rating4 "7"^^xsd:integer ; + bsbm:reviewDate "2007-12-17T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-09"^^xsd:date . +dataFromRatingSite1:Review420 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product39 ; + rev:reviewer dataFromRatingSite1:Reviewer22 ; + dc:title "valour sloughy photosynthetic tryptophane gnawable panegyrics loxes coveted blocking" ; + rev:text "unscreened excavation earwigs japanned competently saddened magnetically highbrow slackage nullifies relational fiscally irreversibly corniche downswings hoagies gastrostomy turnpikes ming stormier profeminists eventuations adequacies hypoxemic retitle afars tryouts signatural scatter sneezer colossally assaulter stemless yeasting paternities contrasts recreants litheness boding ninthly sensorial mosquitoes ruder mergansers prophesies poachier perineum blocking embroidering storming watchfully dover braider rigidly coiffures utilizer whooshing jumpers alliterative cheapening impalpability betakes spongers broodier aport grousing primmer belongings solfege reinvoked trafficks panjandrums frosteds unmerged clabbering custodians bankrolling preceding scarifying fists extemporaneousness psychoanalyzing blunge flubdubs headstalls pertained anesthetic orientated tinnier crucified blinking toughening cuttles obscuras seesaws unclerical dashy morgens adiposities diamondback sizes gormandizing oblation ghosty waterborne points peaceably intitling monogamic eulogist toxicologic frontward buxomest scatter shapes connoisseurs asp dehydrogenated commissars jazzing juking gunner deterrence braves betrothed hibernal blanks kinesthesia reeky telephotographed knighted econ intelligence warmly felicitation triumvirs covalences carports klatches gustless maunder datedness sleeving mustiness pointing safetying domestically agouties"@ru ; + bsbm:rating1 "1"^^xsd:integer ; + bsbm:rating3 "8"^^xsd:integer ; + bsbm:rating4 "7"^^xsd:integer ; + bsbm:reviewDate "2008-02-08T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-04-12"^^xsd:date . +dataFromRatingSite1:Review421 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product58 ; + rev:reviewer dataFromRatingSite1:Reviewer22 ; + dc:title "truantries galosh resituated roulettes orienting shapes constricting blueprints dildos finings herdman" ; + rev:text "separability canaled yellowest parrots mimosas revulsive ironwoods unharnesses mormonism ragweeds wharfs backlogging visages surfboard lurking trijet zingy tinsmith pimpernels quarrellers shunpiked niobiums bassy snoopers rustable hydrozoan kenning viscountesses grouching ergs photoreduction psalteries beaming tattled overvalues fetishistic intoxicants stenciled libras roader assignat caviller notated alarums hyperbaric joist cataleptic epigrammatically education theatergoers flamboyance unburdening demoted hinderer venturesomely barbers avoidably bristling trawls factorize primer tyrannies cockney repudiating kb bowls commercialize legionnaires provoked anesthesiologists palled chronol master nanny guardant psychoanalytically rainout prestigeful bra ruffly electronarcosis epiglottis uveas preplanned spalls stooper jobbers walling choking fluorines sconce outgassed karakuls blatantly lavations bioecologies coequate overindulges enfetters circlers tinkers violence inheritors suppurations prejudiced bumblers rupees homicidally placidness overawing misbilling idoliser railways netsukes lynched swamis muskies trombonist elegiacs splotchiest footgears concelebration"@ru ; + bsbm:rating1 "4"^^xsd:integer ; + bsbm:rating2 "1"^^xsd:integer ; + bsbm:reviewDate "2008-01-15T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-29"^^xsd:date . +dataFromRatingSite1:Review422 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product60 ; + rev:reviewer dataFromRatingSite1:Reviewer22 ; + dc:title "profanations pentacle thundered parried tabloids" ; + rev:text "resubscribed loges orchids laudanums implores sidestrokes agriculturalists refuging sticked quarried bespake gushers unstudied achiness eavesdrops dreamer crucifying halfpence excised offs oblongs aright inducers surcharged harvestable unabashed frumenty unpopular evenings despising vilest lamenting penpoints irruptive hibachis incunabulum decompressions peelers grantable fratricidal splashiness consolidated jugulars stators transgressing pintoes swastikas potencies relines indeterminately exhumers ladleful knaves refired frying antinarcotic unblocked overmodifying conceiving dopier shiners extrauterine conversions gulled hymnists overstays abbrev wittier microfilms shunpiked kindnesses disdains delayers exigences customers sintering outposts pinpricks hareems joiners precursors allegros ascetically coryzal pergola condenses airbrushed reenlistment mistranscription devaluate associativity intangibles minable unsheathed molts recognizer indiscreetly findings worldliness gusseting bankroll maligners calamar bragger narc gleefully packeted rehearsers zulu parquets imperiums eroticist savvying tablespoonsful alephs maturer fettucini clemently intervals spiked slinky bicarb untimelier soddening addictively yuan enders adulterousness dustiness pouted moonily potboy squib moralizers otolith ignifies twinning stover sighs winnowing reexchanging nailing administrators bodkin winglet restitutory leewards rescinded unfits rippliest insentience vagrancy supremacists fetterer smacks macrocosm"@ru ; + bsbm:rating1 "2"^^xsd:integer ; + bsbm:rating2 "4"^^xsd:integer ; + bsbm:rating3 "4"^^xsd:integer ; + bsbm:reviewDate "2007-11-01T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-01-05"^^xsd:date . +dataFromRatingSite1:Review423 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product17 ; + rev:reviewer dataFromRatingSite1:Reviewer22 ; + dc:title "accentuation duennas poppets blunts tranquilize viperish lapels booboos nullifiers" ; + rev:text "animally influenceable patronizes gorgedly scamper praxises surviver dextrins coypus japing uprose singling unyieldingly bugbear iscariot impetuses subcontractor catalogers inhabits prepositional zippiest remnants inviting sociologies clangorous risers proctoscopic retrospective arrayals ornithology jemmies superimposing lobotomizing livers aberrantly falsest alleger ambrosially sidestrokes centenarian spacesuits encages competence solaced huckleberries neurovascular laders darkie rustlers repressor unsafeties backlogged innuendos megadynes plazas jollies redraws audiological evader brandished"@ru ; + bsbm:rating1 "6"^^xsd:integer ; + bsbm:rating2 "1"^^xsd:integer ; + bsbm:rating4 "3"^^xsd:integer ; + bsbm:reviewDate "2008-01-15T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-02-07"^^xsd:date . +dataFromRatingSite1:Review424 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product78 ; + rev:reviewer dataFromRatingSite1:Reviewer22 ; + dc:title "ballistician rabbles steepened gangrened mapmaker allotypically reckonings spillway overawes" ; + rev:text "overwealthy pleads devaluing reportedly embarring stigmatizing estuaries sophistic prancing ripplier cryogeny baseboards espaliers performs laicizes tweaked pillows psychogenically dizziest loadstone soulless woodlands informalities memorableness winking rooster wordiness upstanding supersecret fetterer crescendos overpricing arrested psychokinesia clouted brail alembics nonathletic thresher hygienic overrank misnomers icings substantiated orients prosperousness vizards speckled cabbala tamponed slower entires bureaux bezils turgidly unhampered snufflers treed imbecilities sweating barbs principals eremitic compensator bushwhacker embroiderers intermingle clonal triumphs cyanoses lunged switchback shaved earings blocs imperilment shandies stewardesses playacted laniard blimey maladministers englutting goatee hoosgow pledges antipole lambdas effervescently obnoxiety feebleness follies quietuses teleplays triskaidekaphobe heehawing regainer diverging menstruum modeler doyen procurers convictions moldering reassure prognose crawfished roughed laudatorily untutored fowlers arsenous indigens mongering belching farms saree tinctures genres reconcilers unbosomed frontispieces dulls irked argles gombos chocked freightage ampicillin armpits tinworks proenforcement dors"@ru ; + bsbm:rating1 "9"^^xsd:integer ; + bsbm:rating3 "4"^^xsd:integer ; + bsbm:reviewDate "2007-07-05T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2007-10-07"^^xsd:date . +dataFromRatingSite1:Review425 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product33 ; + rev:reviewer dataFromRatingSite1:Reviewer22 ; + dc:title "diminishment jiff unengaged snippiness upcurving quarte comfortableness unloads granulates" ; + rev:text "mailing cuties synfuel outguessed pommels neurotransmitter sanguinarily microinstruction restitutions clarification feigned utilizes slobs imagoes spherics fluor stealthier misbegetting oxeyes semblances choric defrays blacktopped fraggings fewest reiterates feted coyest scutcheon cates tufas boggler deceptiveness floodlighted comminatory staccatos claying brickyard eclipses newsstands eyewinks foxtails praiseworthily follows bustles impermeability parlances theisms disbursed trephines welkin swivets connects cardiopulmonary strickenly inclinable lins intromit sequestrating misguiders lallygag animistic continuousness bowdlerizing sleeves encoded inwrought simmers wagonettes sheepdog somersaulted preblessed troubleshooter caravel wakening mishearing outplaying illumined steamily alyssums chooses tictocking pureed exaggerators assistants viridians reunifying moderators decorations waister canthus sighs slouchingly decahedron ignorantness elaborated slowly recs bottleful futurists inflated galleys dowsers metaphorical ingulf firers meliorating bounder lovingly conduits heteronomy crusaded outwardly breaststrokes unceremoniousness limitlessly severalized licencees abductions sluts womans abhorring fraternalism pronouncements overturned shunpiked pithily reft gormandize coordinators ooziness radioactively fragrances concoctions mooring caponization obtrusively engraining rigorists counterpane creatures cambodian established hankie crazes degasses erotogeneses"@ru ; + bsbm:rating1 "5"^^xsd:integer ; + bsbm:rating2 "2"^^xsd:integer ; + bsbm:rating3 "2"^^xsd:integer ; + bsbm:rating4 "9"^^xsd:integer ; + bsbm:reviewDate "2007-08-18T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-01-22"^^xsd:date . +dataFromRatingSite1:Review426 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product45 ; + rev:reviewer dataFromRatingSite1:Reviewer22 ; + dc:title "jockeyed albinoism featheredge attributives sheaths poolroom winey coquettish" ; + rev:text "caucussing mothballs summarized shrewdness escarped screwy reaper escuages tailgated nonegos medicare hesitaters discriminator sonarmen zoophytes gives regauges parasitizes oleanders ranger anacondas nominator axially bandagers pentad decongestants layaways featliest enactive boarders insurgescence oversleeping towers generalizations weakest shrimpiest foodstuffs quods jesters undyingly petrographer sappiness brigading panhandled comprehensibly toyos tarsal unlivable potentates longness strews quadrupling murkily moralists pioneering upcurve rejudged reenjoyed xerophyte rhumbas pharisaically internists bargains faller stargazer hutches radiotelemetry blindage semiprecious nonpolitical scut soused waists narcissi rehang flubdubs unclouding dirked poleward overgeneralized cenotaphic morassy gigas swans requested cadency fathomed swamis deckings robins embar younkers gearbox purpling stuffers switchboards bifocals unseals grunted nonvisible finding polysyllable smells woodsy edam cremations rumanians heftiness ungulates fortification supported priapuses sentimentalize intends cockade pensiones mainmasts coasting sulkers mobilization fiendishness encirclement preconscious triangulations considerable mycotoxin divisions supper antilogarithms colorimetry hairbrush risibility larking axiomatically dressages beatification prankish viscid splotchiest quantic brusker disbosom allocation transporting butchering recapitalized tackles hypothermic antes approvers paleographers clerkly repainting muzzles undergarments bootees bordellos outvotes delegalizing chillums rebuttals prays envies passel ferociously bezils megavolts disclaimers ruinating barkier graspable hankering thriftiness chenilles wheelie milkweeds shambles remodel licensing satoris sprinted shadowboxing quintain gourde legions longest bullhorns"@ru ; + bsbm:rating1 "1"^^xsd:integer ; + bsbm:rating2 "3"^^xsd:integer ; + bsbm:rating3 "7"^^xsd:integer ; + bsbm:rating4 "10"^^xsd:integer ; + bsbm:reviewDate "2008-03-09T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-03-19"^^xsd:date . +dataFromRatingSite1:Review427 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product65 ; + rev:reviewer dataFromRatingSite1:Reviewer22 ; + dc:title "overseership deionizations bestialize retested wheats aerating slouchiest depreciatingly assonantly decollated bosh consomme sepulchered" ; + rev:text "untransferable lodgement erections overeats hightails deiced reorders defuses aweary secants dynasts inseminated causelessly whifflers blotted praetor humidified tops incidentless raconteur overtaking orogenic slovens torquer bejewelled inheritors marsupium sepalled naif respirable preassembles unperson topics annealer baldest fragmentally cudgelling substituted lobes narcoleptic frypan withed tared digestively apercu triflers explained bhaktas oversimplifying legists jeweler icebound septets hormonal pukka potting quiescency cockcrows candlepin prepaying plies windings overindulgent dimity sepulchered toneless anapestic temples jollying instrumentality stockpots riffler insurgences skywriter stubbliest apposes behaving unpaid implanting barbets barbarians wrastled purposely dossing mellowness unavoidably flinders daddling drafting irising radioscopic prevaricated misguiding kingship placard assistance rejudges revengers millennial novices biconvex trephined retaliating erin vitiated pigeonholes refused canonical sideshows affrayed perceptually housefuls cuniform oversubtle punters nougats grafters idealized conventioneer seawards obstetrical calumniation gumboil inferiorities ascribing hurdling biases customs upraiser briefings redrill beebreads cathodes academes unexcusable reg goby stogies downbeats accepter pinpricked decomposers nonregimented kachina spooler overturing manipulatively fragged outed schooled burglars pegboxes missal washiest banishments rapter forbode decentralist whirled patricides garrulously compt impregnation gamester expropriates"@ru ; + bsbm:rating2 "10"^^xsd:integer ; + bsbm:rating3 "8"^^xsd:integer ; + bsbm:rating4 "10"^^xsd:integer ; + bsbm:reviewDate "2008-02-06T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-03-23"^^xsd:date . +dataFromRatingSite1:Reviewer23 + rdf:type foaf:Person ; + foaf:name "Analeigh-Oda" ; + foaf:mbox_sha1sum "f3bc5a3c28d554c44334b65af662762223bbf21" ; + bsbm:country ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-08-26"^^xsd:date . +dataFromRatingSite1:Review428 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product83 ; + rev:reviewer dataFromRatingSite1:Reviewer23 ; + dc:title "rubberize looted whipcords sculk venomously offense mammals latitudinarian substantiation interplays philatelist unshackling mustered frugalities semicircle" ; + rev:text "battles neutered fagoter bandages resting ceramist hulks beseemed ontological stymies cosmetologists feudalist sketched sculker magnetometer belting correspondingly behemoths foreknowledge lymphs sambas hoariness arraigns centered tactoid deterrence epeeists unstrap plebs scripts beadily fruitages consistorial nonpayment vendibly biodegradability peskiest endways embroiderer colonizers scatologic forced hawknose coulees unhappiness syrups denigrating microfilmer sprightliest pended coatroom despised unpolitic relets muteness devotional reinvents obtrudes recapture guardrail bafflements vocalizers unilaterally reproduces jackroll lory hermetical sunback eclampsia cerebrospinal battened subjugates mimickers forebye iambuses symptomatological mumper clubhouses seashell aeroliths snowcaps decried knickers eternized lecherously scurfiest messianic affectedness middling postholes corroding queens thermosphere neatly bandannas pingrasses necrotically parring individually aswarm liberating catheterizes semipros nickered scrotal helmets decked discolored moil bactericide chills creakier crumpets tooting jugulates airwave depressants showcasing pedigrees dyslexic amender acuteness defecter colluded calumniating repeopling alluded thefts stereoscopic retreaded celerities overshadow fusils fumigated czaritza autogenesis prompted arteriocapillary somniloquist omens seascout swathers subtraction miseducate featherless ignitions vasopressin precleans caesium corner supersaturates sculptresses popishly marmosets adventuresome backwards selfishly temporizing astroid navigation radiators compounds enumerates palmettos moonshine ninepins underemployment noninflammatory stakeouts splendorous humbling dependently hobbledehoys solubilized manganous forebearing antidotes ricked wheyey ushering ilks satyriases braes plunderer atropism tarpapered dissuader criticized beckons heavers volcanologists remarking romanizes"@zh ; + bsbm:rating4 "3"^^xsd:integer ; + bsbm:reviewDate "2008-03-07T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-03-13"^^xsd:date . +dataFromRatingSite1:Review429 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product73 ; + rev:reviewer dataFromRatingSite1:Reviewer23 ; + dc:title "sobbing flinging riddling catmint contrarily whiteout tittle restorativeness saults supporting choreas encrypted" ; + rev:text "fitfulness walkups vituperates hourly candours backpackers undisciplinable rocker percolators supercharging succored forestalls powerless ninepins redwing subminiaturization alleviating philosophical quintuplet cassowary seemlier ridding reharmonization adumbrative rescindment chowchows whiffs unexcelled rigidifies setups decider industrialization pierrots believes clouds diptera soliquid shininess gratin clubhauled cartooned injuries funicular unfurnished scruff quadruplicated infusing stroker rampaging sterilization offishness uruguayans putrescent forgeries depolarized earlobe chaplets farcies notochordal carwash youthen inflects slily reabandoning hesitantly tabourets provocations syncing prologuing accuses fanwise damnable doggones metabolize daringness carboys remarkers reconditioning orangs rocketers traders drownding affiliation remix dogwatch reformations oomph exudative teashop viridian"@zh ; + bsbm:rating3 "6"^^xsd:integer ; + bsbm:reviewDate "2007-07-14T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-16"^^xsd:date . +dataFromRatingSite1:Review430 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product46 ; + rev:reviewer dataFromRatingSite1:Reviewer23 ; + dc:title "locally soliloquizes gooses cardigans shadiest pommels courtrooms jaded silvering enigmata specifying rubbernecks" ; + rev:text "knacker servicer zoftig coaxingly ceding benumbedness undergrounder satins amethysts shaggiest larrupers waiters ducktails tabasco ems nonmechanical invigorates cybernetical trainway whiskered succulents jeweller trilling pinups complexity overplayed kiloton noncompulsory viced sublimating stealths rhythms corsages palpator cuckolding corniness allurers brassard chromized orangeries brassica agha disparages vacillator recencies hygienes tailgated reprehends decalcomania disqualify darneder seventies slipups marabouts priorates eliminative germination clued downtime metacarpals befuddlement warrants combinations opprobriate discased bussed yappers resettled farming ropeway talkativeness"@zh ; + bsbm:rating1 "8"^^xsd:integer ; + bsbm:rating2 "6"^^xsd:integer ; + bsbm:rating3 "4"^^xsd:integer ; + bsbm:reviewDate "2008-04-05T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-04-20"^^xsd:date . +dataFromRatingSite1:Review431 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product42 ; + rev:reviewer dataFromRatingSite1:Reviewer23 ; + dc:title "expurgating olympians doorjamb aphasics deputing citied cockled interfaces clubfoot darkliest vastness" ; + rev:text "interjectors filings lignin baulkier regionalistic decodes enamellers eyewaters hexer planetology vinosity stitcher frays prudently reconfirmation frenetics showdowns tomtits quaffs shushes mercers catwalks tousles fertileness antiradical unbearably algonquians slashers preachiest spiritedness enticer bullyboys callousing navies lauds boozy shopkeepers underwrote trebled unprocurable nominations repatriate nervousness agitable questionability augural jaggers gildings racialists zeppelin ejaculated idealizes aweless disturbed spiritedness encroaches tutorials drawls wilder equivocacy loyalisms touchup scannings fulgurate calmingly"@zh ; + bsbm:rating2 "3"^^xsd:integer ; + bsbm:rating3 "9"^^xsd:integer ; + bsbm:reviewDate "2008-01-10T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-04-10"^^xsd:date . +dataFromRatingSite1:Review432 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product62 ; + rev:reviewer dataFromRatingSite1:Reviewer23 ; + dc:title "reflected rips czardom greetings foursomes displacement visibility sunups scruples guanacos geared shanks fruiterers martyring cogitations" ; + rev:text "computed doomsdays liker artifices falsifiable axially embosoming eulogizing quicksets pensioners prussian octoroons roughhousing checkoffs kakogenic fitly morpho drizzlier frappe backdated fussing materialist ghosting flypapers gerontotherapies deluder revolted curlycues contended conclusively claques maltier abbr kryoliths finished posted septics skillfully pimento precancel duller pottages metonym unoppressed bassness netter interlacing praus protonic unpainted larked sottish chanting dues spinouts coitions pandit jaywalks overimaginative dotted letches raindrops nth avenues pulsatory crackles tabletop completions bobsledders forensically hipnesses encompassing pollywog rumpling collars embassies redepositing spectrometers balers purdahs toyotas backwaters tautonym pressrun retraction agriculturist reekers annularity observations felts worldliest arrestors avantgarde disarranging gook tipster interweaves charging rutting hardtops preestablishes obscuring dyking jocundities raptured slavey alibies coiffured perdurable skates chessboards diarists epaulets agonies hebraist delfts impaler suburbanite revokable stalingrad charmers reefers typifier smelliest burin prosequi immeasurably cozier insusceptible shots starkly spouts"@zh ; + bsbm:rating1 "5"^^xsd:integer ; + bsbm:rating3 "5"^^xsd:integer ; + bsbm:reviewDate "2007-07-06T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-04-17"^^xsd:date . +dataFromRatingSite1:Review433 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product51 ; + rev:reviewer dataFromRatingSite1:Reviewer23 ; + dc:title "wonderer fivers sedum recoilless worshipper frisker pima lightfingered disintoxication unfathomed stickman giftless" ; + rev:text "festooning libidinized sceptres fills detoxifier airer shoemaker granaries necks troppo packagers lavages trajected judiciously specificizing proconsul claymore bezoar boffola nighness fretsome pacification amu alcalde mordents prioress eversions roarings postmasters oxidation botanical ramparts nestler rheometer aggrieves reapportion microcephaly rinks ovular rethreads sectarians cardamum seceding subcell cosmological fibroids couplers plyers shuttlecocks isotonic sisters doorposts louie tribadic interlays skipjacks clericalists buttony beautifier magmatic tormentingly touter prudes toshes moonlighted hillocky bucketed breathless revocations unwillingly unprolific coronations homogenize batched norseman oarlocks tartlets rebroadening extraction hailing reoriented underclerk debits cotyledons dapperness retoucher procreator"@zh ; + bsbm:rating1 "6"^^xsd:integer ; + bsbm:rating2 "4"^^xsd:integer ; + bsbm:rating3 "5"^^xsd:integer ; + bsbm:reviewDate "2007-07-15T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-03-15"^^xsd:date . +dataFromRatingSite1:Review434 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product47 ; + rev:reviewer dataFromRatingSite1:Reviewer23 ; + dc:title "mechanotheraputic whims goiters disarms overprinted suitability elects comber proadoption televised aliveness democrats flagship histories" ; + rev:text "buckeroos precessing jolts fortifications oculars boches decasyllable crawled illiberal universally kowtow volunteered legrooms scrabblers suitableness microbiotic liaisons livelihood larboard ripening reassessing hotboxes cafes interchanges lanceted sikhs biol sinless photocatalyst enslavers sideswiped tarsal farrowing fabling amphibians gnawers bloodthirstier seatrains reductionist babka tenderer asphyxiating potteen toxify generations scribers adjourning coronations volute betaking xerophthalmia solidest novelties affordable quester basswoods nebulize relation zinnias blabbed iterant unbreakable lases jinni lordliest pilaf reenlists grittily favors masse escargot postelection tarps daguerreotypes jogger autoinoculation roistering croquets pumps toucans notarize penuriously prolixly misbiasing tubings interclass eerier upsweeps uttered stolider reimprisoning curiouser pieta reconviction maquettes landsman sowbellies laborings seventeenths clairvoyancy undercover winds potboys visualizations distend gimp inedible officiated classer apologal loads neoplasia guar aberrance metros sotted huffier dissembler fosterling estonians burlesqued vandalizes unstirred alleging bucketfuls detracts alleging partakers amah fellers cools horas drummer wets peps perfidiously saucerized aerophobia queans disheartening combining tractably fostered tattings nurserymen pinfeathers misrepresentations exotism swordman plumiest obligato snoozers hymeneal modernizing misleader delirifacient kowtow bloater submergibility franchisers pyromaniac actable prefigure prorater discomfort apocalyptically propagandistic auctioning swashing traditions warners lakings feruling monisms boomer vacationers epigrammatically tibiae hypnotize venomed picketing calumets mats slayers barometers"@zh ; + bsbm:rating1 "9"^^xsd:integer ; + bsbm:rating2 "7"^^xsd:integer ; + bsbm:rating3 "5"^^xsd:integer ; + bsbm:reviewDate "2007-07-12T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2007-08-27"^^xsd:date . +dataFromRatingSite1:Review435 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product38 ; + rev:reviewer dataFromRatingSite1:Reviewer23 ; + dc:title "homesteads bulletproofed smutting dyslexics raja turnovers periphrasis moulin pericynthion automanipulative edifiers thunderbolts reexchanges brochettes yeastier" ; + rev:text "fibrils optimistically exploders systolic dishonors retires flacons whiskers scantest floodgates gooey purifier carcinogens coll erred reposing smoked tranquilizing laking despiteful inscrutability howitzers dogged incoherence imprecisions depiction unhurt crosslet rewelds gloxinias kilowatts intermixed masquerading whiplashes arbitrager procommunists enables demonetizes teetotaled whetstones albanians cephalically whitlow molded bonelet jailbird correspondences cabins untreated summoned egoists ductless parching quipsters basts bottlenecks enlightens neons truckers sextettes lionized canoeing diffidence minimals multiples footlocker triliteral supplanted lithographer slidable infirmities tunnies undemonstrable editorialist heartlessness prosthetist creations unicamerally misleading brigading potage fireball tomcat contortionist pianoforte sniveled folks unhoused carinas guilder distinctions boroughs recollections spectroscopist pearlites hushed unriper mondos makes vagabondage harpsichordist slipforms abaft overcook mezuzah distrusts genitalia limousines inlier primping crooners wangling hooplas preinaugural claimless imaginal"@zh ; + bsbm:rating1 "8"^^xsd:integer ; + bsbm:rating4 "8"^^xsd:integer ; + bsbm:reviewDate "2008-01-12T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-06"^^xsd:date . +dataFromRatingSite1:Review436 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product33 ; + rev:reviewer dataFromRatingSite1:Reviewer23 ; + dc:title "crumby impaled liveliest treater downtime thermocouple" ; + rev:text "coalitionist unicamerally unaltered abecedarian differentiation halyards betters inhabited kookiness chirked postforms enrober cline blinking barless cleopatra undo duffers softs balladeers shat tripling cerebrates spired taxidermist perceptibly normals piedmonts pens horrendously landsmen lithuanians joysticks adorning truster reacting pianists corrugator rattrap telephotographed superposition marinated vomiting bouncing multilevel noncompetitive conformational libelously valorously digraphs pinnae triggering subsided sorrowing desecrated ragbag guarder osmosed untactful mainstays tramels cabalists infusoria waltzers dampest hippiedom madrone microspace tenours occulting tentativeness preexamine gutless effortless lending expletives denies unsupported annotators ignores monitoring rehabilitated stiletted boilers legally residues deluders exterritoriality hts promonarchists glisters knighthoods interludes midmost patenting defacing recti towboats alongshore bestiaries hooding googlies qualmier recapitulative proliferations prepossession recirculate sakes cholers vacillating greys biggish calibrator fireballs whizzers neckerchiefs convoys prisses tablets scarers perplexes chorussed deletions vincible unclaimed unpopularity brilliancy mistitled campaniles reinfect southeastward longer smidgins stomachically favorite stroboscopes felonries stomped clearheadedly petitioner communicating selectus banalities sandworms android monocularly replaces crenels dudgeon autodialers segmenter stabilizers laboratorian triste washingtonian envoi variousness careening statehouses favorably ruths derris compounder geraniums consigns powderer grecians sadnesses thins vigor disdaining rankish counterblow elfishly midsummers rodents"@zh ; + bsbm:rating1 "10"^^xsd:integer ; + bsbm:rating2 "7"^^xsd:integer ; + bsbm:rating4 "6"^^xsd:integer ; + bsbm:reviewDate "2008-05-19T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-30"^^xsd:date . +dataFromRatingSite1:Review437 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product62 ; + rev:reviewer dataFromRatingSite1:Reviewer23 ; + dc:title "undeliverable reinvigorate noisomely commented reprieval reinterprets backspaced voids dirigibles gweducks offending enchantingly digestiveness ketchups" ; + rev:text "trashed erelong regenerative tackifies roadless clipper gnattier unpiles primos unspeaking cultic guldens mobilizes surgically commixing patronizes boosting cornflowers landform gazettes chauvinism reunites bandicoot refurbishment gathering alleviates peacocked shuting croqueted traducements overoptimism censoriousness fluorinates emanation jaegars fides jewed sentried rumbly reneged imploding gruesomer cmdg squadroned ailurophobia earpiece freightyard alternating trouping increaser washtub gripier kickstands testee pharmaceutical herpetological dithery mobilities pigmentations smokeless recognized reconstructing cords censors zeins technologist garishness unvexed marquisette vegetive neurotically prearrange annoyed gains hebraist thornbush therm reinterpreted envenoms administerial viscoses houses swears bangtail blowsy crumbling paining nonclerical dawned recharged proteas bottleful characterizes bookends unsweetened uroscopic liquidator guilder lighted novelist saracenic reinserted permissibly quenchable seduced hombres deselects erotically secunda houri alterants hookier solidification undulation verification hackman prairies punctually notionally insolubility oaten brio amenders reinstates paster jerseyite uprooters paralyzing tumefied legs heteronomous aldermanic spacewalking safaried twiggy incompressibly welchers politely recoverer covalently conjugality beanlike datively alludes quails shiniest insertions hogfish eery phonetician floridians ceremoniousness cozeys bristles rewraps millstream raker tubs pasteurize archings reds colluded omissive foulest bitsy innervating unlooses distentions biocycle tentacles equities southeastwardly lamebrain fuggier gilly genealogical zwiebacks bilges conforming reprievers"@zh ; + bsbm:rating1 "8"^^xsd:integer ; + bsbm:rating2 "8"^^xsd:integer ; + bsbm:rating3 "4"^^xsd:integer ; + bsbm:reviewDate "2007-10-05T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-01-01"^^xsd:date . +dataFromRatingSite1:Review438 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product32 ; + rev:reviewer dataFromRatingSite1:Reviewer23 ; + dc:title "headpieces workbag subtended decameter gramps transiently coinsures sourpusses bluffing adeptest" ; + rev:text "ugandan litigated unstable trampler pares draying beatable puss dieter lucern visiter stoa slashers forbearing discriminated ragmen unrespectful gabbled pushiest romps filigrees nonsuccessiveness feminizing infecund fabaceous croplands lasagne clammier endue fontina knocks reheated mahatmas executions mutualization moccasins friendly bulked bonelet dowitchers submarginal tabasco dipsomaniacal bioengineering rounded penstocks falteringly violist deled washwoman heaviness gulpers vialed patroller cuddled submersed minnesotan reenlighten otolith litigiosity biretta federacy oversupplying crustacea preambles contortive chemical fuzzed louisianians electee ineptitude patulous cliquishness refilter convoyed frenchwoman medalist shortchange preboiling competency casehardening bareness chimp wigged hydric prejudices profferers revocation spadix patterned countervailed acoustically clitoridectomies cryogenically tollmen washday militarizes coffering computations trochee bubonic pallettes unbid packsaddle postdating codifiers querns biorhythmicities faithfully sells gabfest garnishable quashes ropeway oregonians squeals oppositionists tubful shelters attached chessboards preacceptance ecosystems distancing sublicensed fettlings kinaesthetically stonier sacrosanctness outlawed haymakers trackings jingles glandularly anesthetized cinderous nonhabitual demographies catty ineligibles disconnects venins revalues officiality rasing libellee sploshes nerveless solecized resummon reconquering busheling colloquiums ambidexterity apostatize blessing topflight lazaret idealistic thinker approvingly lowbred vicarate ducting bagworms hominies microphones reinstated consanguinity lowbrows deceivers overthrow sauciness befuddled jefes orthodontists shoveling hydrographic hooters plinked heterodoxy fledgier slipper insipidity trickles challies pts arrivers agencies couturiers eschalots polarizations foiled undergird"@zh ; + bsbm:rating2 "4"^^xsd:integer ; + bsbm:rating3 "8"^^xsd:integer ; + bsbm:reviewDate "2007-09-22T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-01-07"^^xsd:date . +dataFromRatingSite1:Review439 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product29 ; + rev:reviewer dataFromRatingSite1:Reviewer23 ; + dc:title "causeless shots surcharger unwrinkled filigreeing panickier librarians dogwatch diverticula unitarianism predicted sideshows cuboidal innkeepers" ; + rev:text "todays camass proofreaders carps promodern despisers center internuncios hazing unadvertised thearchies eggbeaters swahilian commutators brochettes unconscientious fines evangelicals ensorcels heydeys turmoiled keester confuting dialytic apologized missteps standardize counteroffensive vino unluckier uncomforting capsuling joist dowdily freaked miners mortary havers cheats renovating compressors staphylococcic pulpier revengers navajos carefuller inflator countermanding meathead zipping kiddy intellectualizations patricide employs cattily millier ousted disappointments kamikazes praying gaiter dreaded bergs cosponsored solidly rider questioners mullahs melodized roasted statued disfigure taciturn eatings eventuates inturned blungers forefoot bullied trigger tempting excluding recitations subpenaing marketeers threatening mosquitoes preaffirm acclamations loudening dramshop gladdened emissions radiographies clabbered hydropower agonise sovietize ensile polluter maturates obliviously drongo warted frankly rekeys poopsie clicks promulgators bovines applicator quakers snaking coronels cohabitant subverts antiproton earmarks thousandths playbill policed atria systemless inviting mirages bezique equational benisons adoptable gadgeteers pulsator gazetted idyls plowing wieldy rearoused perfectos epigraphically agentry egoistic unravelling cunts parallelism gantleted agitators subdirector stewpan torpidity chomping aboral millets cicelies humiliating diagnosticians foxes pedestaled intermesh feedbag jingo abductor unconsummated abstractedness codal strolled violinist raiders cosmopolitans burning symbolically sigmoids reinfused phantasts osculates"@zh ; + bsbm:rating3 "4"^^xsd:integer ; + bsbm:rating4 "10"^^xsd:integer ; + bsbm:reviewDate "2008-01-13T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-02-05"^^xsd:date . +dataFromRatingSite1:Review440 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product42 ; + rev:reviewer dataFromRatingSite1:Reviewer23 ; + dc:title "exhausting edifiers fretsaws biculturalism pitmen disburser gamesomely ilk scaldic" ; + rev:text "providing budgies wonton contused abstractness colluvium virtues upboiling righteously vitiation chesty imprecating reciters huggermugger footslog archness swervers sailed ashier possibly solidi wales revulsions harassed subtitling cuckolds latching fenny divot patcher rubberized foulards smothery unconscionably disservice jitters fairylands noshers stingers cheesiest convening microminiaturization emulsoids curlings repositories beseems briefness snubbed antepenultimate jordanian sterner tattered arquebus gaoled preppie emerita manageably inseminates firedamps pinkly dejections thimbles ponders whiskers calliper conniptions hearthstones permutationist cutthroats emended shorings ripest mumbling homolog"@zh ; + bsbm:rating1 "4"^^xsd:integer ; + bsbm:rating2 "3"^^xsd:integer ; + bsbm:rating4 "2"^^xsd:integer ; + bsbm:reviewDate "2008-03-09T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-12"^^xsd:date . +dataFromRatingSite1:Review441 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product72 ; + rev:reviewer dataFromRatingSite1:Reviewer23 ; + dc:title "realism gastroenterology kiddingly killing popinjays plasmic wasting photic prechills idylists fagoter laminated monocularly choking" ; + rev:text "dizzies miner anklebones catechumens espadrille aggressed quenchable underclothing inaccuracies shoulders robustness sibs saddler repressor restyled trappings songfully burnets airlifted whirrs coolness tannic shampooer demasculinizing sudors withdrawing tumbles guardsmen palpate hoorayed rewarders washdays quadrate reinduce steeplejack calvinistic quadrupling nucleations slaver degenerately putrefy sandblasted partials colossuses brimfull wartimes booed cartilages penpoints suffixes titrated worthless immunizes rebuffs mordants temples dentals kidnaper heeler prepackage lindane chipped pours reinvited connivers dishrags reconquest hoorays haloed strokers unreprieved hardens glycerose prims silliness jonahs curares hearthsides dissuadable learnedness discountinuous rejuvenation impaired forepaw matronal nonbeings bodings loneness excerpts favouring partaken playbill reaccents coated refractorily overstate duelist coherer fastidiousness croziers meanness unproven"@zh ; + bsbm:rating1 "3"^^xsd:integer ; + bsbm:rating2 "7"^^xsd:integer ; + bsbm:rating3 "9"^^xsd:integer ; + bsbm:reviewDate "2008-05-12T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-06"^^xsd:date . +dataFromRatingSite1:Review442 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product21 ; + rev:reviewer dataFromRatingSite1:Reviewer23 ; + dc:title "xanthic cherished chevaux probities copouts lopping tabulated liposoluble" ; + rev:text "mesentery yielders liker juiceless cawing chanty seditionist indications butterier besieging gills preestablishing debates layover misdiagnosed pursuing inflammability untrustful waterworthy dauphins synchronization rattans buckets unaccredited stupors evincive riposting nonvoter reclassified lacerates airdropping spongier clastic candler valorizations handsewn debriefing grunters ostia transfusions lampoonery contingentiam princes toolboxes rhetoricians whops naivety gleams unceasing hypochondria dundee newswomen ecumenicism storied curviness discreeter overdelicate lofter bidding adds raffles reimprisons gainsay groundhog bracts skeletally anearing degaussing ballasting teacherage sieging bondmaids paranoids bigamist incorruptibilities crystallization daylit ponderously dandier unprintable hipped ricotta rotes ugli winos subdirectories martyrs plaudit busher displaying dividers baals dehorns capitals gyroscopic tastelessly sideswiping knaves frostwork kidders samphires reconfirm accommodational electorates arsenals clubhauled wringed nuncio pamphleteer evangelical needles passerine toggery beheaded kingdoms berceuse colloids crannied packed wearily corrosively informer surprize misdefine mendacities foreordains insinuations laten integers shriving borons errancies philtre fiducially replacements grograms pinpointing measliest provided wreckers grogshops crenel kaliums cullet"@zh ; + bsbm:rating1 "6"^^xsd:integer ; + bsbm:rating2 "6"^^xsd:integer ; + bsbm:rating3 "1"^^xsd:integer ; + bsbm:rating4 "9"^^xsd:integer ; + bsbm:reviewDate "2008-01-07T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-02-23"^^xsd:date . +dataFromRatingSite1:Review443 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product39 ; + rev:reviewer dataFromRatingSite1:Reviewer23 ; + dc:title "effaces readdresses dalmatians redbreast guiltiness heathens asking unbuckling pedaled tapered playbacks gimps savourers supplely" ; + rev:text "mergansers shinnies showmanship pulverizes seismological nonadaptive mover hectoring aloofly authorities kittens collocate architraves lapps folder deified shopkeeper zooming unchurched carnies vetoer resiliency fluxed awards animo scanties getter reservedness mowing philatelists wakening wallowed reestablished faultfinder bargainee reassured bombshell nester whomping mildews mismanagement chancier intimacies empurples unpunctual putsch frippery discontinuities vesuvius purplest aglets unshackled bellowed amove passbook predominated triunity viewer pedicure blobbing finmark vasectomize idealizing cementing phrases decompresses endangerment chapleted pledgees polyclinic cheerfulness squanderers sexlessly eighteenths neatening servants tufa phototropic reefer calvinists alphabetize prevailer adjudged polyploid catnapers blurred floored rates memorials uncharges toucans languisher resetter tipsily entail articulations vaporers selfdoms founders talmudists ensue eponymic voiceless mousiness presiders curriers performer offends motorways hoariness riveters lards lyrebirds alopecic raggle represent scooted funerals filmic goosed perpetuator illuming scrapbooks rakeoffs toto drats consonances parsleys mesquites cowing relocate cheerers personalizes implicating delimits halfpence perdy singletons representation prefabricates unpretending chanceman miscue jackhammer overconscientious lovages stinkbug exacerbating farced babushkas calamitously toasted perkiest arkansans brigs depleted writer decongestant manubrial"@zh ; + bsbm:rating1 "10"^^xsd:integer ; + bsbm:rating2 "9"^^xsd:integer ; + bsbm:rating3 "10"^^xsd:integer ; + bsbm:rating4 "6"^^xsd:integer ; + bsbm:reviewDate "2008-06-06T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-12"^^xsd:date . +dataFromRatingSite1:Review444 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product32 ; + rev:reviewer dataFromRatingSite1:Reviewer23 ; + dc:title "jotty peerlessly educating krauts seedsman mushrooms peon pedros vacating" ; + rev:text "emeers recreants angina vestiges redacts respirating banditti rappel hostelers swamped penpoint trulls declares imbruing participator rechartered dikers swimmier lusciousness huddler tasted insolvencies adoptions condensed modifiers preappearance templar muskiest drowses rejoices contagions headiness balefires reenters referendums nonattributive achenes xanthin rechart pinon cays xenobiologies angiogram darkey neoplasms lauding nativist scummier socials hafter rabelais ironical arteriogram oligarch voteable guiltily bearcat feists anginas malapropisms ramifications champy defeating fiefdoms fraternizer reproofs relates undulated chaffer invocations nightlong markka hues undoubted purposelessness bagginess bleakly whilst queued reproducible nosher cautioning quintile norsemen nutcracker husbandlike loo megohms unaccommodating miltiest cochairmen rigors quinone condoler serialization peskiness spiracle brachiation sympathizers imbues fordless dialing ottawas incubating photoluminescent sirocco uptakes laterals antineutrino disgusts okras shortcomings dioxin articled houser shootings gelled outargue casters microsecond bioflavonoid lawgivers troilus curds pedicured dews youthened speediest insincerities premiss generators outlaws unwisest haply silverer namelessly grippers dowdy phonographs anemometers lionizers embolism caffein streps enchilada phenotypes hyphenation educed remunerator preexamines redwoods biographer immolates twigs volplane skillfulness pesticides sunderer nonliterary embroils microradiographically flunkey latten"@zh ; + bsbm:rating2 "4"^^xsd:integer ; + bsbm:rating3 "2"^^xsd:integer ; + bsbm:rating4 "2"^^xsd:integer ; + bsbm:reviewDate "2007-12-21T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2007-12-30"^^xsd:date . +dataFromRatingSite1:Review445 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product70 ; + rev:reviewer dataFromRatingSite1:Reviewer23 ; + dc:title "equines hydrolyses unprimed gristlier systematized facilities emersion boaster catty retaker etiologically hitting seethes" ; + rev:text "atrophying guises thwarted egoists unethically charlady hepatize rinsings eyeing loitering picaresque radixes fraternally cantrip solely emigration thruster chewier snowfield restriction fruitlet humankind credits hatted chancres cooperators unlovable regenerative cosset messier miasms everts cloggy restyles fifes clerkdoms agreement adaptability pretending winegrower torrential minable steeply dazzlers daylights smirked ruthlessly slouchy adoptions homonymy ors receded emceeing birchism geodesist gonocytes internationalizing nebulosity laceworks cosecants reconnaissances monomials ravenousness crazier abruptly pronation brocaded birdbaths militarizing sluttish wampum rechristened subcouncil uneatable reheats cyclicly axseed jugulates conventionality emmets twinnings spumones undone antiheroic caudillo brickier rabidities outranges businesslike bulldozing lacily elevation asked runout archonship censored beastlier semivowels melodeons imperception airheads albumens"@zh ; + bsbm:rating1 "10"^^xsd:integer ; + bsbm:rating2 "8"^^xsd:integer ; + bsbm:rating3 "7"^^xsd:integer ; + bsbm:rating4 "3"^^xsd:integer ; + bsbm:reviewDate "2008-06-09T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-13"^^xsd:date . +dataFromRatingSite1:Review446 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product71 ; + rev:reviewer dataFromRatingSite1:Reviewer23 ; + dc:title "inalterableness fatless sickness wails sterilization ignoring forewords permanents monographer genuflect slakers" ; + rev:text "adeptness ingathers steamering desertions chloric trulls unclasped diagramed glims waltzes immolations megawatts acidly pregnancy strickles repagination booties yogic smokestacks knowns divvy dreamland sires multimillion marauds penumbras hectoliter thereuntil pronounces hayride pressman saloons iambi layabouts rockless resettled nominative dependency glossarial unrobe carotins minimalists shaming rathole chawer yessed apologetically pediments superimpose hookas landowners gorillas actually attestors nicaraguan resowed entrapping greens priories marrier curmudgeons frequenter raiments odoriferous nervines lamer workmanship androgenic disbelieves shiploads shrifts zooparasitic cottonmouths reusability breached dingey playgoers overage crowdies offloads xanthochroid imparity calumniators graphs apologize spectaculars corniche pommelling theres burgeoning republishing reoccurred unweighted wordage chanteys reinstalls pipy reignites impermanence familiarizes outwalking riverbed headpins whitecap secessionists durned subhuman torpedoes directorships convulsively monodists feruling sulphurs extends murkiness czarists trudged hellebores paled boycotts longships chuckies keels sparkiest autoimmunize capaciousness hardcover culminates ferreting profanely crudeness differently elidible amortize imploration insurrections evidenced avoidable permissibleness repressiveness tyro remilitarized barbituric gerontologists tzarist unpoetic semidivine reexaminations quoth affixer oxblood pyloruses lineament grousing"@zh ; + bsbm:rating3 "8"^^xsd:integer ; + bsbm:rating4 "2"^^xsd:integer ; + bsbm:reviewDate "2008-06-14T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-17"^^xsd:date . +dataFromRatingSite1:Review447 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product63 ; + rev:reviewer dataFromRatingSite1:Reviewer23 ; + dc:title "rebaters sceptring lollygag isseis civilise" ; + rev:text "ingenuously cursed craps intersection granaries prizefighters tularemic acetates pluckily kindlings unproved brevities hullabaloo astounded infliction sconces mahjongs confectioners lectures appellations larrupers cannulae drachmas scrutinies jews glaives blasty catalysts isolation timidest insurer projected cline aggrieving evoked encroaching forties dunnages pathways boundless recrudescing mirthfully wildcatted subdividing nephrectomy eliminatory automatizes portable cudgeler carman kiwis unevenness preclusively finalist sheetrock butterier robustness sleepily scientistic miscount laughed unadventurous proamendment yay receivership drifters kinetins banyan cervicitis taxpayers permanently editorially serfs colorblind moonsets drypoints yearner tighter uncompromising psychical recondensation deanships googly pasteurizer tailors buckshots starting gravelled cinematographies voidable exonerators overstuffed treading classifiable encystments dehydrates haughtiness enate spearmen unobstructed leaseless dinning posttreatment galled stripling pron bedcover rubidiums postilion jabot stagehand retyped lopsidedness eyespots volleying radicalizes courted dampish exordiums antiphonies waywardly routeman foreknowing simperingly unhands cerecloths isomerizing dopiest collided arteriocapillary"@zh ; + bsbm:rating1 "5"^^xsd:integer ; + bsbm:rating2 "4"^^xsd:integer ; + bsbm:rating3 "8"^^xsd:integer ; + bsbm:rating4 "9"^^xsd:integer ; + bsbm:reviewDate "2007-10-30T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2007-12-13"^^xsd:date . +dataFromRatingSite1:Review448 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product65 ; + rev:reviewer dataFromRatingSite1:Reviewer23 ; + dc:title "molecularly complies bursae mushiness threnodies dozening freeborn discolored villainess gibbering lover" ; + rev:text "hangdogs claptrap sardinian undergarment discased clericalist feats youthfulness amandine trillionths handsomeness camphoric shininess infertility diminishes eleganter research prearranging cadging mistreated reductional chapeaux nonsexually padishahs goitrous expectorating libelling wastrels computerize jungles vasoconstrictive reshowing aptnesses cryogeny regurgitative tweeted identities beefiest averaged hyaena contributed explicator renomination symmetrically ting upcurved livened cariocas uttering bering hognose movableness extricates sorghums profferer libellers foregoes alkalify interpreters rollicked"@zh ; + bsbm:rating2 "8"^^xsd:integer ; + bsbm:rating4 "4"^^xsd:integer ; + bsbm:reviewDate "2007-10-25T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-12"^^xsd:date . +dataFromRatingSite1:Review449 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product79 ; + rev:reviewer dataFromRatingSite1:Reviewer23 ; + dc:title "commercials conducing twopenny interrogating nudisms fluorination demonstrativeness casuist exclaimers" ; + rev:text "dilutor spiraling expanding capes ormolus gloats purchasers monopolistically warrens dragged cheated angering macs odour restaffed reinoculations reformations kelpy bedlamps scroungier rapists kapoks misshapes spaller yellowbelly quinols shadily disencumbered nasals lousiest undetectable gunrunning scratcher pirouetted lavisher evacuees duskiest anesthetized proadministration detonators paresis cyclecar browsing tailed airboat assortment gnawn ogrishly serigrapher profiles misapplier downswings invisibleness dismount transacted liveable peacefulness proffering convening"@zh ; + bsbm:rating1 "5"^^xsd:integer ; + bsbm:rating2 "7"^^xsd:integer ; + bsbm:rating3 "10"^^xsd:integer ; + bsbm:reviewDate "2008-05-26T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-15"^^xsd:date . +dataFromRatingSite1:Review450 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product13 ; + rev:reviewer dataFromRatingSite1:Reviewer23 ; + dc:title "peacher daubed labyrinths pursily simps rigatoni lacrosses freaking conically syntactical gappier" ; + rev:text "tranquiler dandyism toneless siameses avatar craggiest rooted exerted fairgrounds gins fringes baths inconsiderately sallies earmarks lifelines simonist obligato parolable haycock unleaded bullneck reaffirmed untapped ensnarers buttonhook inferable expecters foretokening shivareed wriggly milking torturers whitlow crabby springes antiquities blabby unintendedly gesturer meanies precooking grannies clangors aunts gibbously liniments leaps nodally travellable lolloping hookahs bargeman grosgrain eeliest railed nullificator taxability coagency unassimilated gunwhale redevelopments mismeeting seacraft ordeals fairness botchiest engaging virilities factorage brontosaur backlist countries outselling scuttling blockader cassandras doubling predictiveness informational annulet thoued jackanapeses testosterone honeymooners gothically wordages meanie basics apostleships bungholes leaseholder disuse menacing majuscule crosswords haemoglobin maxwells freestanding muskies politely gels appending frustrating embosser splinter escapes reforging flambeau gazed nourishment pediments mandolins malingerer coarsest espadrille splurges densifies sojourners appositive diaphragms alphorns psyches overheating doffing hailed beholds weightless brooders perturbational chintzier nettly swinks jabot robustest addresses locoed"@zh ; + bsbm:rating2 "5"^^xsd:integer ; + bsbm:rating3 "1"^^xsd:integer ; + bsbm:rating4 "5"^^xsd:integer ; + bsbm:reviewDate "2008-04-29T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-07"^^xsd:date . +dataFromRatingSite1:Review451 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product48 ; + rev:reviewer dataFromRatingSite1:Reviewer23 ; + dc:title "expiries halters swarthiest boskier depreciates intender legislatrices reenlightening greener" ; + rev:text "glop redescribed ulvas sequestrated herpetologic worrit tornados gunnies overstatements keypunching vegetal irked antiinflammatories lallygagged radiographer maying conglomerates attenuating unerringly commandments stereoscopes covets chutzpas merrymaker resisting frivolities inexecutable securest toners obstructions layouts wrapped untidier vasoconstriction coloradans sardines inviolateness dumfounded tramways immensely coffins commercialization wirily deflation gemstones sluggishly saver hippest reflexed dilapidating skepticism ripper thanks manchus wicked galliums archaeologically winnows lections manoeuvered entered lastly hedgehopping savouring hootenannies personifications boronic bwanas staggy rebill reissue ploughing skittish staplers destroyer roarers logged americanisms prejudgments actuator heteronomous shallows encountering sigmoidal beetled dosimetries potentiated pizzazz broaching fatiguable richening ordained postals cowsheds chipped domed craftily solariums bichlorides lodgements linker clodhopper dozenths compensative electives terseness fluctuations gabbroic dropsy shorteners umbered recrudesces disagreeably discursiveness buzzed bayoneting percolated transiting vughs anticipation logwoods razee salads alphabetically refuges mammoths discouraging pensioners abbreviating homeostases footholds"@zh ; + bsbm:rating1 "5"^^xsd:integer ; + bsbm:rating2 "4"^^xsd:integer ; + bsbm:rating3 "7"^^xsd:integer ; + bsbm:rating4 "3"^^xsd:integer ; + bsbm:reviewDate "2008-01-11T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-02-18"^^xsd:date . +dataFromRatingSite1:Review452 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product43 ; + rev:reviewer dataFromRatingSite1:Reviewer23 ; + dc:title "finishing prospectively dyslexics flytrap optimizing mushes halcyons brittles separatism hatracks violable feminines" ; + rev:text "disputation petroleous horehounds stylized tears flabbier fusibly nervousness rejudge etchers arrivederci mendicants realizes turbojets pupations flossiest remnants amniotic openest fencer mendicancies bulimias nephrons condensing inrush assassinator glassblowers muddily turtledove comicality didos resisted noctambulist overpowered instrumentalists dormice reimprisoning sycophancy illiberal valencias canoeist grazer irresponsibility kilorads tzarist dormer effaced mocking hotshots gestated steepled burlesqued rectories runagates expectorated unascertainable relisting preaffirmation blockers spirituous nonrenewable housemen pervaded gumptions multipolar sharecropper longlines sealery sorbates villi girdling ukelele hailstorms lullingly nitpicked necklaces minuted kedges massacrers recomparison anviled patriots secularistic iberians delving assagais unmarred airstream foremasts multiplexer tropins renominations youthened interviewer rumblers barkentines waitresses nobeliums perfunctorily rites delusory jumpable chiefer annexations dodges marrons gaga despoiler pentobarbital motordrome jins shelties needer prekindergarten hydrofoil occupancy varicosity reconsiders purring essays quintan ferreting quatorzes beanstalks feeblest polluting concaved solders tzar misplacing echoless pickwicks deterges depreciative suasions hopping liquefying arborized loyally undresses undoubted clarification gimcracks untwists anthropoidea tiffed redeemer sallies booties acoustically allegretto pouted technically tepidities retainer soliloquizes hutment limericks hovels snailed didy deregulating canceled wooziest soapmaking instrumentality cupolaed fumarole gloating officiant hamstrung leafworm quintuple vaccinee outranked commercialized regilt hunting infos execeptional pauses antinovel smoulders jumpily piker tipster savorier flattest glockenspiels revaluates"@zh ; + bsbm:rating1 "7"^^xsd:integer ; + bsbm:rating2 "6"^^xsd:integer ; + bsbm:rating4 "5"^^xsd:integer ; + bsbm:reviewDate "2007-08-16T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2007-11-18"^^xsd:date . +dataFromRatingSite1:Review453 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product33 ; + rev:reviewer dataFromRatingSite1:Reviewer23 ; + dc:title "cowbirds expatiation scolded fleeter beholden grantable hematologist radishes unlinking forearm convincingly dismast generics" ; + rev:text "bastian handguns carryovers seigneurs diuretic waxily depicters inflation secretes polit patiently shipwrights nebulosity drying ferrums vetoing putterer clunker ortolan quiverer tambourines dejectedly yahoo welshing hawknoses moderato hippies bauxites bloodings forwarded neonatology drollery orbited spacewalk dodderer interposed legitimism solemnest revampers osteosclerosis mellific folkish fallings melanesian beanball incompatibly snuggest dogeys awardees aglee autostrada truncations forsee snootier atherosclerosis logwoods disillusionments homosexuals cruxes poco apish lunched tither tromps scrutinising funniness cohos habituation planning stanzaic rebuffed stubbier sublevels resolutes illest cabbaged woodcarvers remainders wriggly hanks auditions elbows chihuahuas bellyfulls validity pharmacologist angularness nereides anopheles canoeists projectiles recharts rejecters protecting severs counseled unsparingly redoubtable murks skiable vindication windages afterbirths grieved duckpins edged scourers sapience tightness plenties mathematicians reactivities slimmest propagation hedgehogs asymptotical shambling councils galliard coffeecake encored evens talers reappoints compassing inflexed persimmons employability showgirls blazers lymphocytic anthologizing disfigured demonstrably logs leeks conkers coaxing interposition uninhabited fanaticized seaway skyed valorized"@zh ; + bsbm:rating1 "9"^^xsd:integer ; + bsbm:rating2 "5"^^xsd:integer ; + bsbm:reviewDate "2007-08-20T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2007-09-14"^^xsd:date . +dataFromRatingSite1:Review454 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product40 ; + rev:reviewer dataFromRatingSite1:Reviewer23 ; + dc:title "bournes fobbed subjective prompters rattlebrain storylines gauls housekeeper songbirds gizzards climatologist brachydactylia transfixt vikings underdogs" ; + rev:text "ogres accrued numbered intermediated conversely coloring hymnodies hirers deserting payees plighted wharfmaster encapsuled players foreigners egresses repulsiveness nappers scoops noggs plainclothes pasting ambers glittery imitator vacillates warmly condensation rotating dithers mariner pejoratively violators barometers notarize unzealously apostasies panicking clouds airbill fringiest pratique trustfully unteaching moonlighted eardrops unincumbered overdress puffiest unswept mints melodizing cosmical headspring niceties ducally stillbirths categories overrefine fibroma travelogues retaking outcaste jestful participial trophies dillies diaphragms oilbirds guildry plumpens resulting mossier claimants synergies morphogeneses moonshiner anomy gasless elastomeric refrigerating aldermanic sequencies dishevels mercerized incomprehensiblies linkups stegosaur retests reiterates dentures djins drudges wandered intercapillary locoisms doggies pursuable truckload confecting overburden outstaying wangles extemporaneousness arbitrates eliminator combater liquefied djellabas neurobiology bolting iliads tiglons inconsistentness incumbering macadams tastefulness legalizing tabers moldier airwomen"@zh ; + bsbm:rating2 "4"^^xsd:integer ; + bsbm:rating3 "10"^^xsd:integer ; + bsbm:rating4 "7"^^xsd:integer ; + bsbm:reviewDate "2008-05-22T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-30"^^xsd:date . +dataFromRatingSite1:Reviewer24 + rdf:type foaf:Person ; + foaf:name "Danja-Hroswitha" ; + foaf:mbox_sha1sum "c4e833a6bf747be1388b7be259ec961804840" ; + bsbm:country ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-09-21"^^xsd:date . +dataFromRatingSite1:Review455 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product71 ; + rev:reviewer dataFromRatingSite1:Reviewer24 ; + dc:title "lambencies thistly splinters caseworker subversively stylized thawing humoral clearinghouses uselessly wirework lesser misogamy teenaged craftiest" ; + rev:text "battlers astrologists fretter circumscribing paddocks cytoplasmic homilists demulcent curseder mistrials caftan careeners photosynthesizing opposer tithings subcontractors runts allotypes flickery ostriches patchers cuckolding sawflies garoting scorers floundered misunderstands noncompeting glissando lordliest discontinuously waybills excised banishing suitings featured harnesses scamps alumroot animuses decimalizing abstractionists pharmaceutically conforms nailset bagman minatory thieveries azures remuneratively forehands overturned dodder woolie garrulously incoherence inamorata overlie heaviness gashouses disgraced highschool ensheathing pseudobiographical oxygenation unruliness aesthetics pithiness comely pharmacologies graduation knothole scourged outset passions tinkled nonpluses harelike striding adjudged reabsorbs shrugged barreling cubs proteas lurker corse establismentarianism"@zh ; + bsbm:rating2 "9"^^xsd:integer ; + bsbm:rating3 "4"^^xsd:integer ; + bsbm:rating4 "1"^^xsd:integer ; + bsbm:reviewDate "2008-01-05T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-02-25"^^xsd:date . +dataFromRatingSite1:Review456 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product5 ; + rev:reviewer dataFromRatingSite1:Reviewer24 ; + dc:title "bundlers mentis ungratifying lathier visaing cordless" ; + rev:text "multistage quetzales pillbox lingeringly catchier upcurving curable inhabitancy appealability aquarial sickeningly conduces mammeys cantharides crackling telekineses auditors equators recoverability dissembled dotard shredder wrathfulness equalize sasses violators fusses severalizing afghans houseboy relished furnacing foxgloves confutative compromiser scarecrows dinted quizzically migrating tenderfeet suttas venerability clinker feverfew iambs snappier penalities keynoted crests qualifiedly joineries sirenomelus oxters duad triller quadrated copolymerize bowsprit latens makeable overs largo briquette frequencies mongol mercerize means gatekeepers willy unexplicit sherlocks bibberies milliliters overmastered ikon credos overlong avowals brilliance airbursts ceilings abider swatches repulsiveness sequinned hooper pinesap malled unveils semiconductor spooler pendulous misdirects punchier malled accumulating coalfish cannonry rebuttons felly sunbows authorizations neons coaming armonica doodler aerophobia squeamishly nonallergenic revivers regimes penetratingly aerostat wireways plywoods weathering fluttered comelier toughest acclaims servers darksome baulked eventuates bonehead intrusted arcadings hogbacks gunned resubmitting vents indigestive sweeties subagencies psychotogenic unlimitedness roentgenographic cremated malleableness cottonwoods gyves consolatory highballed ghouls sentimentalizes swimmy solecist subtrahends vinier caudillos sorbate dredgers demigods strappers coterminous miscued toxoids overgraze fertileness misreads canonically scatterer bandager"@zh ; + bsbm:rating2 "5"^^xsd:integer ; + bsbm:rating3 "6"^^xsd:integer ; + bsbm:rating4 "5"^^xsd:integer ; + bsbm:reviewDate "2008-04-28T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-09"^^xsd:date . +dataFromRatingSite1:Review457 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product64 ; + rev:reviewer dataFromRatingSite1:Reviewer24 ; + dc:title "revetting bigotries precalculation infatuations petnapping nonmilitary naziism bumbles palmer stouten" ; + rev:text "starker orangish nonconductor wavily preciosity wassailers prankish affixing intwined substantializing chinbone lakier sandlotter asbestic modifiable readily endives laminal blueness youthfully mediates reclaimable huffy plunderage invocated dissembler nicaraguan reenlargement perpendicularly snugging xanthin ricochetted achy housetop chutzpa revolutionizer addible doms leucocyte exterminated floats omikron lapping wangles assailer federations canaille genocide collaborators echoless kays predicatory lashing dishonorable tortes misemploying impairer federalizing foregrounds koodoos vaudevillians boff ensurer roamed bluesman miseducated woefuller lacerated leaguered defoliates previewing eventuated bowknots deprivals crooner refiring trustbuster gangrened enfin elfish disputations coppiced dognapped gallies crackerjacks medalling embroiders scarped whalebones communicates corncrib forwarding electrum trochoid insobriety timidities enabled regularizes carpetbagger concatenates jejunums projectionist curiously redemptible pampering celebrating risibles bonier ovular clattering kronur transfigures reinterpret submission hanky verdure sideliner computations pome manifestoed noneffervescently kilowatts orcas unmemorized searched woodbins minicomputers sedatest culminated outleaped dayglows knacked disburdens stashing deadpanned swapper blueberries snowplowed flues wiliness tollgatherer arborous cultivated kraken kerosenes oxhearts aquatics tularemic fletching reloaned outmoded aviaries chafed choky stealthily recreations hollower streamy kakas lactations hatcheling humored coronation psychos challenges normed crucified saloons beamed cavilled mandalas redevelopment caponizing electrologist muskier equinities tantaluses disordered bribeable"@zh ; + bsbm:rating1 "9"^^xsd:integer ; + bsbm:rating2 "7"^^xsd:integer ; + bsbm:rating3 "3"^^xsd:integer ; + bsbm:reviewDate "2007-08-21T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2007-12-11"^^xsd:date . +dataFromRatingSite1:Review458 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product59 ; + rev:reviewer dataFromRatingSite1:Reviewer24 ; + dc:title "bribing modeled axletree thunderously spectroscopical ingrafting banknotes jadeite histograms misused brahma exceptionally" ; + rev:text "luminiferous capitals hitchhiked enchaining wiggeries womanizes gratias falsification coalitionist headgears gally chafing cannibals civilest studiousness dighted invigorating choosiest links invadable litigable tackier meatiest weenies mishandles unfilial speciosity ponderosa crackerjack regranting cochairs reacquainted dinner angrily cogitative washwoman intones cubicles metering dicots sits supermen paperbacks assemblages slurped tiffins fabulists weightlessly clamping roomers feasibly ridded whorls presuppositions nesters karates sticklers eschalot unpredicted dallier bluefins unsoundest scuffler resowed unbuilding dekaliters selfheal extinguisher amortized datary intromits threateningly epistasies alphorn porter befriend unwarned dauber sovran warpath polliwog accurateness miscalculation turns misquote corkers uncommercial erringly purebreds unarmored pasteurizing folktales scoutmasters noncumulative reconcentrated terribleness deedier waler lantana palsying salinity dredging neighborhood ejective lecterns predestinating untrammelled readily nobbled backbend developing pewterer reseeds revamping hyperactivities omelette pacesetter toras cofferdam defalcate sheepdog margent mobilizations mormonism cushioning tartlet antedates tacksman ichthyosiform autocrats flasks splashdowns controverted zed solecist materialities beknighted pillager nearing yankees stranger addicts meaningless relays paraffins recidivistic overapprehensively discontinuous tanged laywoman ducklings equilibrating parked brassish exurbs drillmasters snows boxful outrageously yonis impuissance emoter subcommander piglet yeller circumcising trivalve colonelcy physiognomic pouted dace forceps barky nervosities swashing communicators enamels embay"@zh ; + bsbm:rating1 "6"^^xsd:integer ; + bsbm:rating2 "2"^^xsd:integer ; + bsbm:rating3 "10"^^xsd:integer ; + bsbm:reviewDate "2007-06-22T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2007-11-07"^^xsd:date . +dataFromRatingSite1:Review459 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product51 ; + rev:reviewer dataFromRatingSite1:Reviewer24 ; + dc:title "scudded endorsed tripodic panting ignominy erysipelas naphthalene jouster" ; + rev:text "inspirit escapists belaboring quibbling smuggled aardvark ruttiest engr flamenco palatinates artificially rumps headspring candidates clucked belittled endways xenons battlement symbolized vaccinotherapy sculked cotillions confounder mazes cuddy walkable baulking dungaree outscores oscillometries lavaboes acoin dandler nourisher tonalities annexion hookahs traumatization preadolescence barkeeps tubercled dawdles ohioan redskins eyesores sockets mingled forwardest annulments webworm cowhided metaphorically ionized overcooling gads catnapping toroids capered poundals afros superhighways renotify futurity needfuls foretells forayer possessiveness fuhrers twirls conifers iambuses tollways numerary rivetted defendable starred eluders supererogatory sikhism copyreaders sabot strengthens shrivers habits astringes knotweed boozer reinters geog countenancing chicagoans declinatory logrolling attempters beauts peps indrawn moppet indemnifies paganized abysmally cozenage frogged wesleyans nieces enwrapping tommies hermaphroditic ogham spooling yahooisms planless regionalistic bourrees ineloquently progressiveness novices agreeableness inconspicuously plasmic catmints aged extrication hallowed tougher gulfing stroller boredoms spinate cursers"@zh ; + bsbm:rating2 "3"^^xsd:integer ; + bsbm:rating3 "4"^^xsd:integer ; + bsbm:rating4 "10"^^xsd:integer ; + bsbm:reviewDate "2008-05-18T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-14"^^xsd:date . +dataFromRatingSite1:Review460 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product65 ; + rev:reviewer dataFromRatingSite1:Reviewer24 ; + dc:title "picoseconds frowningly blabbers anticlines engraves scission votaries rehearses ophidian avast" ; + rev:text "guttier wizened lunged numbskull trickiness pongid furs cumberers awardee revering callbacks resolutions obstructiveness melanomata womans appears weekended ultrahazardous tantalums seconders updaters nobodies dampish unbars houseworkers shindys flemishes goateed kinematics arracks guitars resellers pinnas rescinder lineable residence photocopier loather removing markka beleaps patroller crinites farmstead isomerization donut thermosphere incubates severely frat regrowing caulkers nazis assesses shackler neurologize philters artfully engenders bluer alpinely knurled bounders retreats coppering lazying wreckings prettier ectoplasm hounders inputs staggery paperboys equivocates rewinds pocks rephrases reverting misinstructing reflowering accusive notarize educational government breadbasket adding combustibilities avowable funerary radiobroadcasters abettal vitamine matriculant promisees gyroscopes vower contortionist machinator headword winged perturbed hydrotherapeutically wistfulness diplomatically mythologies broadlooms bullweeds pother pluralizes inverted tastelessly riffed ingraining kickoffs pictorials disbands cantilevering enigmatical vulcanic preconceals reequips seasons cells assessment mockeries analyse waxed adorably cubital salinized unanimously clunk analyzers marblers legaleses antiparticle midterms shavable finalisms streamy doctored perennially deicer canvased remodify granulators flatbeds lanced lapwings climes coccus appreciatory indurated stingers concurrently chirographers"@zh ; + bsbm:rating1 "3"^^xsd:integer ; + bsbm:rating2 "8"^^xsd:integer ; + bsbm:rating3 "8"^^xsd:integer ; + bsbm:reviewDate "2008-03-14T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-05"^^xsd:date . +dataFromRatingSite1:Review461 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product58 ; + rev:reviewer dataFromRatingSite1:Reviewer24 ; + dc:title "nonstandard coring mux fatalisms officiates sodomites foretastes wintergreens corky interactively misplaces" ; + rev:text "professoriate shylocking germanized pentobarbital gumtrees crudes disincorporating patchier handwoven whittlers tendering paginated nationalized pricing greaser tawers cureless mortgagees antiinsurrectionists mishear caesurae workability besotting hoisters flankers derived shawled lining flannelly fellers doodler inducement duo subprocess jibers lairs excogitate antinomy sargasso allurers reflower scanner custodianship unassumingly buckskins cognoscing unavailable entrained prosperousness naturalism saddlebow springier yodler weazands xerophthalmia blandishment affliction oversalting felicitation barker blancmanges anitinstitutionalism polygamy localisms conditioning cl respected carmaker adrenalin easers abstaining dropworts goofballs winterkilled humpbacked snowcaps provolone unseasonably spangles coats reheeling incremental zanyish buckaroos thanes lenities ranted brokerages kames audiometers longshoremen anodize wretchedness solenoidal occults inexorably lemur nounal aardvarks unpressed aliquots topsider underlain bassos commoner slipforms achievement untreading cantering workhand caseworker tournaments lifesaver interracial hedgiest landmasses ginkgoes relighting cricketers od diuretics triage slushed thaddeus brezhnev ragtimes noncommissioned lovesick amassing flaxier essayers veriest agonize isolationists prognathous solicitously unresistant wrinkles unsound blowzier reeky swobber journeyers lintels flatter primmest grapples primordially unpeoples nauseants futility reps overcompensated fatigues cashbook cryogenically viciously capsuled precipitated titbits engrossing dingily sepulchered extirpating keloid advertisers tournaments"@zh ; + bsbm:rating1 "7"^^xsd:integer ; + bsbm:rating2 "9"^^xsd:integer ; + bsbm:rating4 "8"^^xsd:integer ; + bsbm:reviewDate "2008-05-14T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-02"^^xsd:date . +dataFromRatingSite1:Review462 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product78 ; + rev:reviewer dataFromRatingSite1:Reviewer24 ; + dc:title "warrantor decompressing globalism guidebooks transcendentalists" ; + rev:text "fortissimo redetermination expwy poorhouses metabolites respelled denser negligees husk hexahedra unbutton reaccustomed mishaps woodworking dehydrator buxomness scholastically doubtable fashioned baldness wartiest illustriousness pathogeneses goriness distractibility papillate brassish aggrieves abaft vino tokay blunge mirv beaned cyclical gravitic hardhearted furnisher carrageenin threatful preemptory malefic joggles kilotons oozy predigests gibsons insurgency brutally castrations halogenoid reaffirming unafraid calamine resp splenitises ringbolts hotcake gaoler jiggers floccular sinologies scenarios sylphid sceptering retaliated witherers endeavoured sneezing assistor bootlickers attractable distill lithographically riderless bulls streamiest"@zh ; + bsbm:rating1 "7"^^xsd:integer ; + bsbm:rating3 "5"^^xsd:integer ; + bsbm:reviewDate "2008-01-07T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-04-19"^^xsd:date . +dataFromRatingSite1:Review463 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product83 ; + rev:reviewer dataFromRatingSite1:Reviewer24 ; + dc:title "midbody eroticist reproaches preordain monograms recrossed trembly valerians sinuses phalanges" ; + rev:text "deserves niacins desalinizes digestant piastre forefeet woolsack hectors beadworks semivoluntary poisoned monistic jousters counteroffer climactically homilies homosexuals trumpeter reverberating gipsy ovally misinstruction iteming outsold hangs geniuses unsettles sparks postulates disemploys prefabricates crofters zyzzyva trails wackier auditing affrayer saliently mayhemming saboteurs pule perpetrating netsukes multiracial schisms polishing irreparably entanglers buffaloing lightheartedness rewind chirpier reciprocative correlatable underrating gleba precipitated tieclasp aureoled pietisms cancers nonagricultural subrules puttee reacclimated versos mollified clarioned helpmeets yellowbellied unsystematically shrouds renegades slurring caddie programable capsizing riband sings versemen"@zh ; + bsbm:rating2 "8"^^xsd:integer ; + bsbm:rating3 "7"^^xsd:integer ; + bsbm:rating4 "9"^^xsd:integer ; + bsbm:reviewDate "2008-04-07T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-01"^^xsd:date . +dataFromRatingSite1:Review464 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product60 ; + rev:reviewer dataFromRatingSite1:Reviewer24 ; + dc:title "bittier lacunal reinstated pugged conjuration wagoned squabbling fatigued ringtails musicianship besmirches" ; + rev:text "detoxicated grislier forgathering expiries mutilative chrysalises faltboats supercharges lacking gainsay rubrical snuggery somewise kilt tempore wriggly coronels overdramatizing katharsis sodalite zucchettos weened agapeic miry possiblest improvisor timers motorcyclist paterfamiliases trims caponized sootier lowlifes harbouring virtuousness stabiles tonnes deluged insulation stenchiest overtire overgrow gausses outpatient abandoned examples catted shtetl wingy upliftment detailed bethinks earwigs resigned transected intermingles tritest okaying flutterer dissipating chemical unacceptable huger thymol ravelling laws stardusts sparsest lipids dishing noosed yourn slaves sphagnums maharanee stalked uphills blemishing prudences rhomb waver valuta inherited vulgo quadrates provolone ligates cessions dissipator harken punter cabined splendider canalized consoled seesawed hassled forceps landaus mortars wallpapers taciturn cosmical zoogeographical novocaine nuttier overpays tunneled indiscreetly misprints concentrations paraders bouse denunciatory diagrammatical reversers deputative reclaiming iniquities endocrinic adipose nonadhesive repealed prolapsing aneroid cupboards proprieties kidskin garlicky nondepartmental shoplifting elective colloquialisms puzzles quantize principles wingers bilateralism valuable excites hemokonia precanceled odorful annulment lineless madcaps rehabilitative deselected reforging elasticity yeas spermicide sailable weightily keynoter stiver amazedly carburets concussively janitress manifestos scantest flannelet menhirs unbinding illuminator grazers salabilities hydroelectricity cataleptoid depredator pacified cosmological laborites complected"@zh ; + bsbm:rating1 "3"^^xsd:integer ; + bsbm:rating2 "10"^^xsd:integer ; + bsbm:rating4 "3"^^xsd:integer ; + bsbm:reviewDate "2007-06-25T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2007-11-17"^^xsd:date . +dataFromRatingSite1:Review465 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product39 ; + rev:reviewer dataFromRatingSite1:Reviewer24 ; + dc:title "palely resurging overlooked ixtles refuged germiest isolation peepers semipermeable gurneys gigatons donnybrooks unsaddle" ; + rev:text "pilotless yarding inhabitability counterspies choicer strangeness midwesterners clatterer scantlings ingested piaster teemers subentry linacs theatre outstays cambers heeler honeydews epigrams outlast satori bogs smoothie emancipations cheekiness pederast pouching blackness detournement equips irradiation affixation overtopping troche dings satinpods shivered calumniously flitching pecky unsure marchionesses micromillimeter crapulous swaggers baselessly oaten axled acquaintanceship phocomeli cantingly mountaineered nuttiness slinkily interrelationship snufflier tardiest fuze garfish vicarage deadener flakily brimmer muzzy nucleation unlifelike fellable timidest delaying bacteriologies miseducates valuators browned pharmaceutical nighness dhotis transhipping hawkmoth sedation schlemiels preeners suborn swagmen smirkiest pettishly festivities homeopathic ejaculates unhackneyed mitiest killers melodiously tracks scowling mizzly tumbler ohed mainlines picturesqueness passersby moveless railheads fixities respecters subscriptions rootstocks batman croutons ideograms exhibiter comprizing poutier counterinsurgency"@zh ; + bsbm:rating1 "9"^^xsd:integer ; + bsbm:rating2 "3"^^xsd:integer ; + bsbm:rating3 "10"^^xsd:integer ; + bsbm:reviewDate "2008-02-13T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-01"^^xsd:date . +dataFromRatingSite1:Review466 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product79 ; + rev:reviewer dataFromRatingSite1:Reviewer24 ; + dc:title "fleabites aspersed glamorizing vicinities raccoons homburgs otoscopies lucubrated" ; + rev:text "universalists guardsmen execrates disorders accumulations cinque ventrals sluing translator cathodes stearin churlishness rasters vivaciousness desecrations shindys trustable coquet palpations tartly engulf kalifs proreform consumerism prolificness standup redeeming patricide buckboards dermabrasion triglycerides yugoslavs buncoed whomso anglicisms caesurae biens carelessly apostacy loiterer chemoreceptivities worrying digitalization probationers detournement diffused biosynthesis gamines undermine rattler wristiest rended auriferous decorums microprogramming lively seconde dribbed acceptive innersole alecs samoans barer altos wetproof billhook derivatives garment tares alkyls extrications chiels slithery renumbering ambulances cantharis disproportionate cecal detentes reinvigorates waysides flurrying coined maestri precautions posteriors sculpting golfed setter metrically expansively tawdriest periodontology miler smoggier derogatoriness mugwumps brocading nonadministrative hasheesh rewarm"@zh ; + bsbm:rating2 "6"^^xsd:integer ; + bsbm:reviewDate "2008-04-12T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-15"^^xsd:date . +dataFromRatingSite1:Review467 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product66 ; + rev:reviewer dataFromRatingSite1:Reviewer24 ; + dc:title "honors plateaued performers terribleness paratypic tushing" ; + rev:text "rushings revivalistic congresses egomaniacal macing decenniums anaesthesia semirespectable hest miso deponents demobilize arrowed cooingly rafter underexpose farfels scarification civilizing indefeasible indisposed doodled cabinets unreliably encyclic readdicted sultans destruction polymerizes covings whenas sealing biasness predetermined squibs gombroons washiness shiploads halogenoid fills whopped hr cerebric anchoresses deliberatively biflex blotchy tradesfolk gainless helves subkingdoms trover venine recrowning causeys millage cognacs pensione nogs goldurn cattier oubliette broodier tyrannically clothespress hazes surcharged rotgut coincidences amphibia ohed leakages whirling defuzing obliges satyric ratifying triumvirates obsessiveness laureates knucklers riddling crackerjack carcase couped decays holographies performs apologues hastier trowing unapproving refix antifascists newspapers smasher delegacy cheeped theurgic predeceased fobs stymies agrees perishable flashings septettes assiduously laparoscope seasonably invalidating dos mechanotherapy actualize circularized eyer extinguishing sententiousness indecorously rabidness mummied guanos machinations gladdening touristy balker capriole postpones agonies hits slipped snuffy sequestrate hostessed lobed striations uncanniest nihilisms bullyrags shucked shakespeareans"@zh ; + bsbm:rating1 "2"^^xsd:integer ; + bsbm:rating2 "1"^^xsd:integer ; + bsbm:rating3 "9"^^xsd:integer ; + bsbm:rating4 "3"^^xsd:integer ; + bsbm:reviewDate "2007-07-27T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2007-10-08"^^xsd:date . +dataFromRatingSite1:Review468 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product45 ; + rev:reviewer dataFromRatingSite1:Reviewer24 ; + dc:title "petulantly hydrators forgings chaperoned defined" ; + rev:text "novelization sequinned gametic flatfooted maladministers retry soloist saprophyte climacterics odoriferousness vaccinia levant fated diarchy varmint redrill dotard tenancies looted populousness overflying hymenoptera indentions sensation pleasantry hyperopic chiromancy hanger reinvolved chaunters annihilators excitedly wavelets indictments leukemics surcharger haemoglobin evictee disparages stereotypers chirographic elusiveness grifted megohms qindars vaulting splicer turnings pegmatite waterworthy reacquiring superstructures silicas pipestem weskits allottee spleeny clogged anonymousness fossilizes deservedly unethically hoer gaucheries libations chaffer refinish minimized diametrically halters appearing defalcate magisterialness eternities ardencies gustily unplaiting suppliant rockabies calibrated outswimming buffalos boycotts palefaces fruitfully admissions nelsons forgoes diurnals capstans civitas jubilees dirtying subprovinces sporrans rationalness burgs olympiads headhunts doubters tarragons socketing intercepts demigods schmo chervil poppet tuneable soulfulness demagnetized delimiters scenting forayers baptises regulatable demobbed deluders assailable ingrowths visualizing unruffled realizability"@zh ; + bsbm:rating1 "6"^^xsd:integer ; + bsbm:rating3 "1"^^xsd:integer ; + bsbm:rating4 "5"^^xsd:integer ; + bsbm:reviewDate "2007-07-19T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-05"^^xsd:date . +dataFromRatingSite1:Review469 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product48 ; + rev:reviewer dataFromRatingSite1:Reviewer24 ; + dc:title "characterizing muzzled cardias deliberations babying pkg unarm suets swampish alertest palling praetorian nickles" ; + rev:text "ballpoints melted reconveys program rabidly foiled repugnancy frugging mushroomed scuffler cohabits jackstraw unreasonable eschalot hoardings footlessness sanding misunderstood outstrip headless interposers chuckled voted mintmark reviewable readaptation exciter intrigues benzenes fishes forebodies checksums retardates jives urged bowers soever maidservants foils reemploy twiddlers derisively peery dictums involvements panegyrized flickery regionals bucksaw lyrical ducted fitly reappropriation wringer extinguishers histologists pasting smuts yawned checkering howitzers dognap atheling waterlogs hijacks expirations playwear avaunt insalubrities breadwinners unmasking repented costuming lasing conceptualistic obstructor obscurantists inbounds tectonics troopship responder generalities ragged coigne bulkiest suffices nonconversant rehems dudishly expended firepans vapourers baedeker elmiest coitions stetting endue estimated unearned bugbanes educated lipreading rolltop silurian immutableness attainted angolan detesting cheep monarchial lamplighter escrowee hornily turbofans keloidal prostituted pawer rarebit bourgeoned guts inscrutableness getters neuroticism lait immanence famously rivulets orphaned unrectified tearable moleskin parring mossiest apperceiving moray palely jiminy orioles credibilities reassortments photonegative insults shortly"@zh ; + bsbm:rating1 "8"^^xsd:integer ; + bsbm:rating2 "3"^^xsd:integer ; + bsbm:reviewDate "2007-09-26T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-02-12"^^xsd:date . +dataFromRatingSite1:Review470 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product31 ; + rev:reviewer dataFromRatingSite1:Reviewer24 ; + dc:title "sponged peonies laudators improbably jaggedest vasty magically" ; + rev:text "skywriting trunnions villagers upcurve cuds bagworms unshaken reeved rowel atman cratered carcasses burglariously wieners flawlessness bogie abbatial limpidness hypersexual quincunx trios reconfirmed nonheroes booed gruels hazardousness plundering flatteners augurer rehearsing pauses midi hatbands slouchier outflowed parietals highjacks razzed comparer jawbreaker drumstick forepaw limply sinker thinks costumiers camouflages remodification justifiably detrital intertangled satanisms tadpoles leopards wedging renascence bodies yolks bunkers studbooks shoring pleated nurturing beauties homburgs raiders bushman linac trireme steadfastness regathers sideswipes manueverable beatable conglomeration tonne brios portrayed hegemonies contrail measles impracticality unresentfully intrudingly chintzier bondages uprootals retributing riches madding mambas carpi stronger unchilled recourses lacings callboy soliloquizing glamours humiliates fettering thins transcendentally guidable equivocally massaging beginners spectrographer fatale undiscerning smallness korean conjunctiva raveling cockscomb corianders rapaciously reflexively checkrowed obviousness attributively invalidating cubbyholes justness squalor behavior safegaurds fairground triolets archaist thermoplasticity"@zh ; + bsbm:rating3 "3"^^xsd:integer ; + bsbm:reviewDate "2008-04-26T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-13"^^xsd:date . +dataFromRatingSite1:Review471 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product38 ; + rev:reviewer dataFromRatingSite1:Reviewer24 ; + dc:title "foxholes affrayed baptizers stooled subsonic sorrily winchers bikinied roundish entrails typed libelants" ; + rev:text "smokehouses sarees branching interviewees unremitted flagrancy concatenated cached citied tennises cahoots trichlorethylene renouncements breechcloth markings subverted goldbugs gristly revealing grandness veriest autographic whizzers overlain instated quantizes disliking diluents unpointed cockerel larding stammeringly platters blackly absinthes haute ulnae correlates ulcered yessing cogence spirochetal portages longitudes percepts consulship preassembling solarize refurbishes chasten imponderableness rituals rigidities trephines routeways impregnations waxed cylindrically waterier appointive timetables"@zh ; + bsbm:rating2 "2"^^xsd:integer ; + bsbm:rating4 "9"^^xsd:integer ; + bsbm:reviewDate "2007-10-25T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-04-02"^^xsd:date . +dataFromRatingSite1:Review472 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product39 ; + rev:reviewer dataFromRatingSite1:Reviewer24 ; + dc:title "carless mealier reloaning southwesterly" ; + rev:text "bleaching nullificator outsmarts mezzanines whumps neckwear outproduce digitals regressed funking overprint gadders inscribers mesons sparklers chidingly ventrals overdramatize tubifexes reinsert antielectrons contestee avatars dikes underparts incarceration stared flunkey beholden innovative blizzards gymkhanas greenings exciseman pastelist gyrated overfastidious concoction retaker homogenizers flexing menstruation interdicted constable behove nonmotile confiscation destructions cottoning yeomen particles apoplectically irising tanyards militancy routers vicarly canonizes gappy adventurousness outplayed sparsities anchoritic leviathans splayfoot saneness shirred tainted garbling farcy ceder buxomer griefs deportable relatively sociosexual metazoans learned dribbler meats tributaries funnymen sparest injurers latterly backmost beseemed ownable jolting scheduling relist bikinis wizardly grifting ideologist bairn soapiest unseaming collided atmospherics yesteryears analgesia copse videotaped bravoed cardiograph stalking listing truncheons unmown oculus pupfishes unicellular removed phonetics shielding foresight orientation seedily diagrammatical raunchiness epics grabs economizers overate berthing attar thrones umbered drecks lingier lunatics differences poolroom retakes skullcaps daftness burgoos truster cleated purges superber nutations peculations overcast mayings lucrativeness dishwares bummed nonheroes roto buts undecided obviator preorganization adjudications needlepoints torticollis anorak officialism subvarieties scruff crimsoning nonlife neatening ixias sheetrock unfledged capably brazened catalogues calcifies chatter cadettes kibosh inflictable fleering decidable vigors eulogizing kedge panting sacrificers coagulating tinkly bottled prologues parings challenged bumblebees booster sociopathy afforesting rapidest"@zh ; + bsbm:rating1 "1"^^xsd:integer ; + bsbm:rating3 "5"^^xsd:integer ; + bsbm:rating4 "3"^^xsd:integer ; + bsbm:reviewDate "2008-02-10T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-21"^^xsd:date . +dataFromRatingSite1:Reviewer25 + rdf:type foaf:Person ; + foaf:name "Christophe-Vizelin" ; + foaf:mbox_sha1sum "3289175afc88b43dbf8a30cffd93c19e9e5d89c" ; + bsbm:country ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-08-07"^^xsd:date . +dataFromRatingSite1:Review473 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product41 ; + rev:reviewer dataFromRatingSite1:Reviewer25 ; + dc:title "electrolyses prussic grippiest seagoing" ; + rev:text "resonation overexposed dowdies conspiratorially rehanging repulsers silkscreen balmiest securers administrating slips hoarsened yammering alans hexads hallos distorted fermentative anthologizes equalizer demasculinized procathedral choreman braise tasses undervalue ictus tabby plummets demesnes numerably wardens disciplines reglazes acclimatizer nonintellectual lissomly adit focally freighting kevels backstroke thrives maoism saluting unmolded alkalinizing turbos semiconsciousness uptakes shivering streakiness spiraea victimless diasporas tradeable overleaf flustering likeable bombshells rankness devouring crowns rakers pandas overrating uncelebrated wagoned juxtaposed unidentified chattels actorish fatuus unease guarantying pricky trashmen trephines unstrung inviter replicas viridian lightening punctured ruiners rupees fronds flossie legacies unshackled raconteur superfluities watthours stroboscopes thickets subleasing shagbarks speeding twittered throatily justers cadence windrowing impersonally toggling federated velveteen orificial"@es ; + bsbm:rating1 "10"^^xsd:integer ; + bsbm:rating2 "2"^^xsd:integer ; + bsbm:rating3 "9"^^xsd:integer ; + bsbm:rating4 "3"^^xsd:integer ; + bsbm:reviewDate "2007-08-24T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-01-17"^^xsd:date . +dataFromRatingSite1:Review474 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product76 ; + rev:reviewer dataFromRatingSite1:Reviewer25 ; + dc:title "zithern sidings declarant malefactions restores allured" ; + rev:text "confederation higgle scammonies gospels vacantly honorless baluster maximizes telescopes sashed bickerers goriness subhuman wagged anomic complicatedly nonideological maenadic assessors lambkins hormonic currants unwelcome outrun harvested confetti rimmed schlepps underdevelopment ungratifying strickled sawhorse reactor lollypop electrocute osmosed ventilated idolizer turbocharger embanks tempting itemizes pyrostats sneaks barker infinities tyrannical amorphousness convexities palings ripping chiccory unfought farces figeater coffees sleepless peahens imprecators unholy nematode rewardable hyperirritable imagination mutualities salties volatiles scrupulousness liberals grosgrain blunged knowingness seismometric oxygenic researches originating ferruled jejunely fits taggers destroying presaging geeing beguines adequacies impales psychol grandiloquently annuitants thirstier pullmans immodestly females execrations suppressions localizer dormice conservationism trueblues densitometers dissenter carotidal avg hepatic suppurated reinvites fem oxeyes folioing deodars retreats cayuse placards savager concealers dehydrogenation impairing tumultuousness coact intwists steins entailing allopaths disadvantageousness metallurgical aeriest nutted turtlers aggrandizes toughish mugwort lousiness butchering trusser primuses unravels megadyne churls instructing avoirdupois aeonian underexposes upheavers reeler overreacts boutonniere nonexistence reservoirs drabbing hogweeds waving antisepticize filibustering nonlogical sebaceous prepossession immobilizing whirred outsiders decompressive doyen headcheese initiated crimsoned compatibility hospitalized mynahs vixens drossier blindage ultras hydrides sparked canons potted immobilized fugally excising indecently ankles firmer bubbles affrays topmasts flatwork prepaying infection wellborn pruned enneads duelled isomerism untangled bigamously blasphemies looney fendered careless cattails refutals"@es ; + bsbm:rating1 "8"^^xsd:integer ; + bsbm:rating2 "5"^^xsd:integer ; + bsbm:rating4 "10"^^xsd:integer ; + bsbm:reviewDate "2007-10-23T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2007-12-08"^^xsd:date . +dataFromRatingSite1:Review475 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product15 ; + rev:reviewer dataFromRatingSite1:Reviewer25 ; + dc:title "unvisited irides lapser feta brushes mustier resupplied meltdowns jittered triadic bulletproofing hypersexual unalterable pinewoods fidgetiness" ; + rev:text "artiness unsparingly interatomic endocrinology limitative flabbily intendeds disobey interrelate discrown semiskilled sounded fluorinations truncheons brevities dialog cardiotherapy intruding physiologies musters rehabilitative biker blinks venturously veeries gaels announces prettified coppices layovers anguishes casher fluorescing volcanically conversationalists commanded appositely transcribed jacinthe arrogated hesitating lieutenants zoogeography acoustics lapises cryosurgical orang tussling courant birdies agonizingly stability garters langauge wrathily pharisaical pubertal clearings tweaky recoil underrate turnpikes exploiters sicklier duelists aeroplane disillusioned speaking untalented preexisted outstrips bitty reckons marled vertiginously practicably claspers siphonage clamored iteming hatcher quintuplets catatonics hatreds gammon frowziest egads anatto margent codex obligated polecats facially adaptability paranormally trudgers cooperage spending vasodilatation frolics seawards barky vidkid defenselessness gradated debtless righty urines muddier cully collaborating metamer municipality unifying disapprobations lepton sifters commencements incapacitator warehoused unceremonious pealed clerklier inimitably nocturns carpals madonnas numerated"@es ; + bsbm:rating1 "10"^^xsd:integer ; + bsbm:rating2 "9"^^xsd:integer ; + bsbm:rating4 "10"^^xsd:integer ; + bsbm:reviewDate "2008-01-13T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-01-26"^^xsd:date . +dataFromRatingSite1:Review476 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product76 ; + rev:reviewer dataFromRatingSite1:Reviewer25 ; + dc:title "standings communalized tankage gaudier wanning gunship consumers grazier suspended servicers incompetents dissolutive splasher" ; + rev:text "repossessions roundness victimizers disobliged reactivate convalescing vacuuming locksteps fancied providently decompressing dudish clacker triturator hemmed tribulation presbyterians mahjonggs blackthorn muckier unkindlier knuckled specializations geniuses fatalistically subpenaing uncouple dismember tensionless copyboys allspices herbaria pocketing precedes scullion pearter stunners gaudier peaches phiz curial creditably isosceles woful genevas unkindlier livetrap abstractedly misrepresent hitcher doziest wingovers rouletted preventions skyborne cambodian caprices extraterritorial dilatant dadoes calicoes clarions cayenned coamings unbeliever sects processions gamily slipped overdraw valutas stereoscopies drays decorations meprobamate celt whittlers tumescent lyricizes distinctiveness soviets cookeries gasolines coopting trameled penumbrae easter affixal domicils germinated monographer incarcerated doings liars precontriving spirited radiotelegraphy delicates encouragingly reservoirs envoi portioned buffoonish coattails conkers weds honeymooner blackens eternize onefold redolently hornpipes flouring sauerbraten elections nonrepresentational marshalling psychopathologic personate updating hotchpotch microcosmic fulfillment container priapisms nuptials zillions upended underemphasizing refractionist optioning refurbishes stingingly traditionalize communicating oozes frontals transdesert lins zincite indiscriminantly joist crippled coattails doglegs mimetically accouterments delegacy boondoggler belletrist recompensatory seismographic beefburgers tandems inlaying whang inshrining gelees averted marrows yams cooperage tenderheartedness atherosclerotic betrayed lamenting sevens famed finning reciprocals mutualist kneepads triskaidekaphobe precincts rumpling bookbinders proadoption sharked doomed directive menads secedes encamp"@es ; + bsbm:rating2 "10"^^xsd:integer ; + bsbm:rating3 "7"^^xsd:integer ; + bsbm:rating4 "3"^^xsd:integer ; + bsbm:reviewDate "2007-06-24T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-21"^^xsd:date . +dataFromRatingSite1:Review477 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product55 ; + rev:reviewer dataFromRatingSite1:Reviewer25 ; + dc:title "wormer christmases constabulary tbs" ; + rev:text "contemned demonstrating procurers gladness confessional mouldier crankier reexaminations trefoils trots curiosities skimmer charmingly contractive glazieries abscam milestones jabbing tiros crockeries recolonizing digressing devastations humidfies errancies outdone trifling displayed atoneable harbor beldame decriminalize underproduced scurrying blackness auscultating occurrence anecdotic waister investigative resonators sabres slurps centares caribous canter dados misbilling artless unabashed stockholding tufaceous mordancy antiquarians variegations voiding mussolini delouses solaria dragooned integumental clayed insheathed liquidates mesmerized noblest illuminist trochoid porticos packman abatement lapidates demagogs intermitted transfusional tagalog actin indicates dei insurers sensitometric decompressed clamours drowner profiled outlived buncoed chequering sagy passant industrially bemoaned insistently hypnoanalysis psychosocial cleverish steelier parboiling stilled gallstones midfield snarks shitted iridescent choppers flairs afterbirths venturis years tackey bagnios linguistic heptarch butterflies brusquer humpier approachers unquote imperils topologies ascribes pricier sinned indescribabilities traders stippled overgeneralized sikhism creosoted tincts witling frontals discoveries simoniacs ousted peppering odds wobbling clarinetist denazify hawked solido bucker negativeness"@es ; + bsbm:rating1 "1"^^xsd:integer ; + bsbm:rating2 "8"^^xsd:integer ; + bsbm:rating3 "7"^^xsd:integer ; + bsbm:reviewDate "2007-10-16T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-04-22"^^xsd:date . +dataFromRatingSite1:Review478 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer3:Product95 ; + rev:reviewer dataFromRatingSite1:Reviewer25 ; + dc:title "kudu coition floorings incontrovertibly olympiad antinomian unattested adopting thunderclaps stepsons lummoxes" ; + rev:text "skywards invalidating bubbliest ontogenetically quirts weightiest earning sintered garnishment jauntiest emasculated footless juratory nephews shredder conduced penetration retrials unawaked bushwhacking pappies congruence shabbiness freeboard tinted deedy tethers waggish compted voltes unwinders proclamations gormands discountenances staying hookworms centurion enlighten movies unwise alcaldes illuminative hts lornness taverners grimly decennials omphali conjuration snarls stubbier morphia preapplications contorted corers biscuits mopper sudorific attestator inoculations nicknames bazookas breadths poufed steppers harper opposers suggests gruntled consubstantiation cowskins fastballs motorbikes deepens observational affiliation osteotomy trophism alienable combustibilities legislator manuever pipeages rubies megapod overinflates cheeseparing encapsulating obesity dwelling kangaroos debuting cutpurse tuckahoes colluders dentines pappooses wingspans hebraist diverging sceptered smells stylizing nimblest calculative bifurcations speaker prevaricates arrhythmical demimondaines sheepish militating stereotypical unfearing preaccustoms delegated"@es ; + bsbm:rating3 "5"^^xsd:integer ; + bsbm:rating4 "6"^^xsd:integer ; + bsbm:reviewDate "2007-08-15T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-15"^^xsd:date . +dataFromRatingSite1:Review479 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product25 ; + rev:reviewer dataFromRatingSite1:Reviewer25 ; + dc:title "boaters leveed undreamed anarchist prodigiousness bubonic rejecting drupe chugged halloos" ; + rev:text "numbered farcies stooges fins libertarianism lauders oblates tomtit anneals cacophonous helming tapestried backyards cookwares journalists individualizing dikes kaput futurity semiweekly unskilled songfully golder operatively uproariousness unweaves harmonizing staples eyewashes igniting reverses companionably cosigned understatements hoboes restudies hospitalized chervil metatarsally photosyntheses remaindered toadyisms rife bushido thrombus osmose starfishes canonize tackifying clarioning stoney vulgates chording logicizes terrifies schematically newish vinca outcroppings wienies rubbly heartsickness ogee prodding suffragan brachiate sequestered nonporous niggled embodying quadricentennials centigrams poems squinting blintze sequentially agonised tiller forestery aboral perfecting moper geodes specially ejaculation entailer unposed disharmony apocryphalness semibiographically ennobling voter colorcasts disgraceful blender orgeat endamaging anemometer propositional cochairs ricers semisacred unharnessed replenishment ballooners rubaiyat terrestrially captivator gulped homunculi wholely mortifyingly snivelling preterit driftpins semidaily musicotherapy dyestuff productions ridiculously chiropractors beagles shiva bolting belike pronation delegacies provenly bra subvertible unitive erupts defiantly restuffing linguine unclose feasant whitewashed kishkas cardinality commercing reenlarged orchestrated effacement overembellished kidnappers crudding combatively synaptically inhibits prefixally terrorizing ingenue widens inheres playbill nohow heptameter sportively carmaker"@es ; + bsbm:rating2 "9"^^xsd:integer ; + bsbm:rating3 "1"^^xsd:integer ; + bsbm:reviewDate "2008-06-14T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-15"^^xsd:date . +dataFromRatingSite1:Review480 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product16 ; + rev:reviewer dataFromRatingSite1:Reviewer25 ; + dc:title "groundsheet romps reformats perpetualness flavorful cavitations redressing masters yelped" ; + rev:text "winsomeness impatience bras streetcars fatness whittler contractors headbands combers locomoting trode misinstructs haggis charger glebe upholders pickers carnality teraphim anoxic fighter stibium townswoman eons hypotrophies weaponries leeks atomists narcissistic disporting nightrider blazoner housewarmings centimes scanting painter scraper moistureless corroboration elderly caveatee transubstantiate playfulness worthful jonah obeahisms dodderer agar classed heatless dutifulness reenforcing visualizer xxiv angstroms juryman communism morph balalaikas soberizing wivers bikinied liger ignifying snugged lobules larceners ascendable backseats terraced decontaminator whipt exordium redded defat trimeter dualize lienteries engram adjournments trusty decrepitude unattested vocalists festered evenness gunnies tomboys breathed segmented subprocess blueness luniest traces unplanned overstuffed dandies gatecrasher wharfinger foolhardier infatuated bleakest whetstone flaunting sumps parroters goitrous tusche bourg petering hennaed exotics pts genitures zeitgeist ensconces diffractions palinodes toxigenicities priories pretensed unscreened juts unformatted unfortunately glamourous lyricisms debarked impairments lipectomies spuming oscillating multiengined sambas resplendently ballets"@es ; + bsbm:rating1 "3"^^xsd:integer ; + bsbm:rating3 "10"^^xsd:integer ; + bsbm:rating4 "7"^^xsd:integer ; + bsbm:reviewDate "2007-08-25T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-12"^^xsd:date . +dataFromRatingSite1:Review481 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product37 ; + rev:reviewer dataFromRatingSite1:Reviewer25 ; + dc:title "sketching describable glissading dynamistic machinized rafter aery demythologizing skindiving undereducated geophysicists dunnages windstorms" ; + rev:text "rumblings cremators sandbox invalidates douser fizzes judicatures czars trigonometrically buildings winless shipkeeper ferryage sunstones charlatans commoners helios wakiki initiatory cuticle fibroin kilocycles besmirchers unloading aud silicosis orthopedically heaters minibus frolics judoist orating odyl adventuress conformists gloating pleads reshaped forehandedness defrosters antineutron caucussed torridly overindulging brisket weaves crushers political trave assister terrains intercommunicates claws preyer dolorously cateress ducktail monochromes shunted cicatrized dungier ology resistance peaceably liposoluble anisic senhores volitions dilation naturalize reseat phototropic cinquain cosset executes legals oscillometry popinjays hocuses nestors curliness stubbiness nims strainers checkouts critically yammered comes fishpoles hormonic stickier fernless sweller moodily antagonists chartered beslime disaffiliation averaged distinguished peyotl perforates mortgages ophthalmoscope cradler tantalizes nonworker chancering ontogenically pursier cannulas homaged catafalques thwacking reamers"@es ; + bsbm:rating1 "10"^^xsd:integer ; + bsbm:rating2 "8"^^xsd:integer ; + bsbm:reviewDate "2008-03-15T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-11"^^xsd:date . +dataFromRatingSite1:Review482 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product77 ; + rev:reviewer dataFromRatingSite1:Reviewer25 ; + dc:title "magnetos pavilioned lpm levying unisexual mandarins capelets understandably reliquidation" ; + rev:text "daces incommunicado harrowing loblollies antagonistically remediless supernova horal clarifiers moonshiner overflew pederasty nasoscope headaches foraged tallyman fracases curred stiffish dopester poolroom deprivers rejectors gasifier fitly boasters contractility mazuma baulk reopenings megakaryocytic panegyrize franchises contumacious arms whencesoever mispunctuate escheated sixteens respective natters hinter reconditioned whumps confidants transliteration tining victuallers propagandize fulgurant offprints sifts subterraneously domiciliary mousings capitalize prancingly acceptees unlearns epiglottises preventives reenlarges sidehill epiglottis opacifying randomly refasten sulphurize captions alternateness nervation weltanschauung requirement castigator aeronautically shakeouts rebroadcasted refreshments nosiness overstatement smeariest decelerating ceramicists frizzed trichiniasis vitiates befools grungiest boomtown frapped insurrectionally nutcrackers unrestrictedly sackfuls woodworms scandia trepanned crippler agatize aluminized warted affixed ascendancy timbrel dissimilarities paprikas statuses flagellation liquoring moonshined connectives superminis deionization inflamers slangier patrons quivered compeer restarts philtered backings lowermost achordate induction granites impermanence overconfident showmanship cardsharper incorporeality savored attributives improperness enunciator greenings ruffly mattings coldness sapsuckers fairgrounds rah fiddled commercials anno farcy tacking illegalizing barhops loafing"@es ; + bsbm:rating1 "9"^^xsd:integer ; + bsbm:reviewDate "2007-07-22T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-06"^^xsd:date . +dataFromRatingSite1:Review483 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product55 ; + rev:reviewer dataFromRatingSite1:Reviewer25 ; + dc:title "gnars dosser marline eclats notarial bigamy transcendant" ; + rev:text "emplaces lamented titbit fundamentals embittered dandies raveled mastheaded voiceprints obstructs corning egoisms uncoiling slummiest promonarchists viselike nulliparous threshed priapism princedoms invigorations unlimbering perjures palliation oryxes believably hoking regerminate subdepartmental skated squishier contingency hermaphrodite squidding omnivorously unsought pachisi egregiously outboasts intensifier altarpiece structuring scrag perceptions revealer debases cwt ensnared polyunsaturated overenthusiastically albinisms branchier whirled stalky consorts eunuchism preassemble gerrymanders mediation bagginess animato comelier bolide keynoters chedar beadings weekending exordia repacks fussed snifflers gustatorially mugwump analyzers flagellates moonshiners vaporings ethene temperer subjective perambulation bursarial glorying plumbery crucialness massas"@es ; + bsbm:rating2 "2"^^xsd:integer ; + bsbm:rating3 "6"^^xsd:integer ; + bsbm:rating4 "1"^^xsd:integer ; + bsbm:reviewDate "2007-12-09T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-01-02"^^xsd:date . +dataFromRatingSite1:Review484 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product25 ; + rev:reviewer dataFromRatingSite1:Reviewer25 ; + dc:title "adversaries gluier jargons superpose execrating unkindlier coarsened champs axises lactovegetarian" ; + rev:text "analgesia baited ballyhooed discomposes luxations gabfest consolatory matchbox sickbeds appendant ganglial bovinely vermicide wigwags antirevolutionaries redemanded looses experimented dares wobbly monosexuality overgeneralizing foreshortened photograph woodenly entreats events restudied tided archaist darting chippies flustering sophisticating griffins execrators biopsychologies undependable baronets alluding chickening fastener nonreciprocals squinched boodles dispossess dishevelling foreground beakers topsiders fraughts grecians fuels countenances preaffirmed leashes raspy opacities bighearted bilks cyanin docilities sweethearts supernaturalness sapiences scribbled electroshocks jollies sectaries maleness uxorial orphans sustenant dilation"@es ; + bsbm:rating1 "9"^^xsd:integer ; + bsbm:rating2 "3"^^xsd:integer ; + bsbm:rating3 "7"^^xsd:integer ; + bsbm:rating4 "10"^^xsd:integer ; + bsbm:reviewDate "2008-03-28T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-16"^^xsd:date . +dataFromRatingSite1:Review485 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product36 ; + rev:reviewer dataFromRatingSite1:Reviewer25 ; + dc:title "icecap micrograph trustable decertification brunettes brevi cashiers sparring flocks fruiters onboard disembarkations refiles beaconed" ; + rev:text "skins sulfates beseechers islanded medicining harrumph years insolubility proportionality bicycles calcaria subtended snowfield sprouts unpacks prophetically brackishness catalytically toweringly excrescences weakened squabbier leary unfavored hectoliter reheaters abolished subversives microsecond oversensitivity nucleating lobotomized cryogenies hippodromes duplexers shivaree kips thuribles bruiting unthankful softening tholes nondevelopment unpolluted leukaemic monomolecular pumices sulfides bicultural guided drowsed unbeliefs oversubscribed orienting remodelers migrants priestly masteries offhandedly tents umps collated valiantly blacking stairs tearjerker famishing offences imperforates cyphers woollen unconvinced rehiring flexures infusibility disked nonabsorbents shyness mulled superintend thematically karakuls jackers sacristans pattering foliages lechers brittled mutilators jinglers fart gerontotherapy biocycles cowers punsters willingest wheedled drupelet punners db exhaled villainess sauropods medicator conspiringly gestates educated maillots eunuchism gibbosity greenly consignments savaging anoia blockages upsurges alephs druidesses echinodermata unpretentiousness leos injectors dicotyledonous inkless snitchers tingeing unmovable greasiness tonsilar electronarcosis detrained binoculars shirtsleeve headmen unconversant blonder schlocks grands battledore jetties underarms linguini outnumber beefburgers deserter materialist donorship cousins smeller snicking ducker sleekens villas ologists taw gladding unreconciled deflower graphing inquisitively roosted injuriousness roles xenocryst stripings graphites specter casette clitoridean rending langur outfielder neoliths ambiguously dingier packeting"@es ; + bsbm:rating1 "6"^^xsd:integer ; + bsbm:rating2 "10"^^xsd:integer ; + bsbm:rating3 "8"^^xsd:integer ; + bsbm:rating4 "9"^^xsd:integer ; + bsbm:reviewDate "2007-09-09T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2007-10-01"^^xsd:date . +dataFromRatingSite1:Review486 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product38 ; + rev:reviewer dataFromRatingSite1:Reviewer25 ; + dc:title "waterpower ringlike wholesales custards" ; + rev:text "welted downshifted reemphasize balkans galvanizing studiously bluebell tollages slitter fingertips larrupers editable housewarming devisor intrusiveness dognapers rapers contractibility summoner reams pinwheels concernment putrescence dodges demurs goffered echidnae androgenic perverter stencilling masticated redemands captivators waft wizen incidently afflictive pubescence tickler hagged annas genuinely madames operettas ginning ebon solubility barreling harassing inflicted imbroglios lengthener czars mastectomies albanians boxfish fellowman parsecs yawns roystered optimise schmoozed spices pops primps unambiguously flaps arkansans squared controverts zagged piped earthworks rivaling pudgy cheerlessly kneecaps lactobacillus besmirching croakier dele pastier salters unguents emu overheads reappraiser superintend ensure hillier tsetse zabaiones bas transpositions redemonstrated parolable secularization waveys powerboat dishware rocketry deplane trampler ohms wooled calorically mufflers destroyed embroiderers capriciousness mushes enfiladed quiets reissuers dilating beckoner toxifying deformative plowlands dances cornering surer spoonerisms varietals accomplis acred monstrosities dissolving deforesting redrafts mudstones condenses chapeaux totting spatulate eerier peened replacers epithalamion squirter wolfers dinning woodsy flacon triturable rehemming refreshments daily deludes dichromatism madded trees overpriced steerable preparations entwisting paver imitations indefinitely tarnishing hereditariness suppuration disinformation sleepwalking nondivisible noncommittally williwaws sumach pearlier annas reweaved capered forepeaks"@es ; + bsbm:rating1 "1"^^xsd:integer ; + bsbm:rating2 "5"^^xsd:integer ; + bsbm:rating3 "10"^^xsd:integer ; + bsbm:rating4 "8"^^xsd:integer ; + bsbm:reviewDate "2008-02-26T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-03-27"^^xsd:date . +dataFromRatingSite1:Review487 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product42 ; + rev:reviewer dataFromRatingSite1:Reviewer25 ; + dc:title "mopers pepperbox yoked antibiotics soppier excellency wondrously liniments" ; + rev:text "assuaging lightness coalyard clipped condo murexes raja puffier didy puree nucleates unchastened quartos glutinously squirter unlock cochlear encystment coopts aerodromes matutinally complementing hottest scraggliest disputably overskeptical misapprehensions staters absurdest tattletales grassfire nomination hapless viewings superman gists shambling levels months misshape bellybutton externalizing novelize osteoarthritic ranger aborter adducing proser chaplets tattooists accomplis keypunches checkups unambitious prodigals orlon snottily muches interlocutrices tentacled vandalizing chimpanzees callets monoxides imbibed extortion decimalize brolly percolator yeggmen snowbound reassesses minyan"@es ; + bsbm:rating1 "4"^^xsd:integer ; + bsbm:rating3 "4"^^xsd:integer ; + bsbm:reviewDate "2007-09-08T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-04-02"^^xsd:date . +dataFromRatingSite1:Review488 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product40 ; + rev:reviewer dataFromRatingSite1:Reviewer25 ; + dc:title "electromagnetic epiphytes ichthyoid unbars drawbore" ; + rev:text "defines conceivableness unambidextrousness eyrie desiring avians summer hypes tawnily unaccompanied underscored deleing nibbed furioso flatfoot escalates industrys footers zagged remortgaging plazas enthralled bustier necrophilia niggarding grot idealizes clitoric underspend venomers hydrostatical indissolubility fomentation ovation tinglier hording cabooses fadeless sayonara gavots barbwires uniters dipsomania hencoop reopener consecrative siphonic venerology echinodermata blanching firebox owllike splotches inconsonant bares nonuser unseated farmers algorisms inquisitorially pretzel cudbears dehydrogenated aerophobia chattiest pharaohs vegetating overpessimistic layer osculated narwhales distinctness hydroponic bloated stippler cheerer goosed rallied nightstands bannister damascened bondmen biomass finable contemplator premeditators pyritic tope deflorations rakers numbering shortchanging swirliest immedicable fared parapsychologist projectionist amazement soreness naturalistic tarbush festiveness lavalieres gemologies subcommission berries casqued proscribing imbecility yammering penult flinted abstractions shinnies downstage roiled casuals floorboards irrelevances defied planted persuadable gynarchy prohibitively unattackable selsyn multiradial gouger forelady plasmatic grassiest limitlessly condescendingly hydrae malefactions nonhereditary martins gerrymandering taurines growler"@es ; + bsbm:rating1 "2"^^xsd:integer ; + bsbm:rating4 "10"^^xsd:integer ; + bsbm:reviewDate "2008-06-08T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-09"^^xsd:date . +dataFromRatingSite1:Review489 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product78 ; + rev:reviewer dataFromRatingSite1:Reviewer25 ; + dc:title "cenacle contends firebirds accommodator photocatalyst birdlimed dismiss fontanels" ; + rev:text "billiards wets grannie tritiums rekeyed sponsoring overbite saintlier unitedly onionskin defies hastes discolorations hebraist herbivorously resiliency bullfighting investigative inanimately guildry francs equivocates gaffs striation pushiness runes misdid ennoblement claims boarded rambles stormed riposte syncopations aspirates homey fittingness disjointedness servals unmoving inconspicuousness quired vacuoles trooping slimed forky foreboding codeines darners turbulently winced twinkler wakeless tootsie astrally squirted washstands retched revarnishing subdistricts lichis"@es ; + bsbm:rating1 "1"^^xsd:integer ; + bsbm:rating3 "10"^^xsd:integer ; + bsbm:reviewDate "2007-10-10T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-13"^^xsd:date . +dataFromRatingSite1:Review490 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product37 ; + rev:reviewer dataFromRatingSite1:Reviewer25 ; + dc:title "pulsators unhesitatingly unspecified stranders italians photostating lores translations diverges fritterers doddering senhors collaborationist superannuating wirework" ; + rev:text "immoralities com preservers rampages rimrock unfrequented titanisms misled hymenopterous valving scree quavers estrogens tailgates tracing asterism coeducationally cutes depositions outworker broaching stylishness slated afeared microphotographs exceptionable potage ditcher flavour graveness liquidizing knowable unselfishly staphs plastics gauntly homolog encamping punched typhous coacts asper cyberneticist putout hoarsest enuresis deveined blessers whiteys throatier notabilities hyperbolically exquisiteness infanticide retaliations chiggers cocobolo belling officeholders sublimer ejects quaintly armlessness judicatories supplying regauging lades starrier horsewhipping centres birthstones toasty overindustrialized wonkier reverifying barometry authoritarianism chorussed rationalists bargaining prostrates despotisms lycanthrope bootlaces lunched causes generousness lavenders genteeler infectiousness pearlier unmasked decertifying milos bushwhacking travelable instigators totalism oneidas vulnerabilities squids helmets almner"@es ; + bsbm:rating2 "5"^^xsd:integer ; + bsbm:rating3 "1"^^xsd:integer ; + bsbm:rating4 "4"^^xsd:integer ; + bsbm:reviewDate "2008-06-09T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-12"^^xsd:date . +dataFromRatingSite1:Review491 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product5 ; + rev:reviewer dataFromRatingSite1:Reviewer25 ; + dc:title "glyptics pants escudo insolubility pecking interfered vaporer sideslipped indexes oblations feists attendances stertorously" ; + rev:text "flagships clodhopper ferreting gadders blankly aberrancies blackboards semisatirically lovelies transitional lactating viperidae analysed joshes cobbler outstand sapiently homophile laburnum disfigurements unrepentant troth overcooling wormier hosier disaffection traditionalized fluorinations baulking preassembles malteds phonemically sluiced enfoldings rivieras djins reeded reunites paseos underminer teasels encroaching nailheads tunnelling rilled surlier hallowed wowsers skiey bobbysoxer breakfront okapi formalism mewled interbranch olfactometric grippes liveries"@es ; + bsbm:rating2 "5"^^xsd:integer ; + bsbm:rating4 "10"^^xsd:integer ; + bsbm:reviewDate "2007-10-09T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-01-11"^^xsd:date . +dataFromRatingSite1:Review492 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product31 ; + rev:reviewer dataFromRatingSite1:Reviewer25 ; + dc:title "headgears tannic kayoes kolinsky photocopier familiarizations eyebolts epergne eulogizer grungy earldom" ; + rev:text "criminated millstreams hexahedron vigors humidfies caroler teetotum defamations pinups dunkers whereabouts sensations rationales sweetings shabbily cafeterias irresponsibly sundowns gaskets spics clavichordist oms keysets unshackling minority seascouts relays gigolo advantages barbels astringing respected overexposes reharden bushmen bougainvillaeas diagnosticians waterproofer gyved activators upstages myna baseborn casketing vertiginous sunbather neuralgias furriners feudary depredations dianthuses japonicas crispily silence geologist establishment enrollees overstuff rues"@es ; + bsbm:rating1 "10"^^xsd:integer ; + bsbm:rating2 "7"^^xsd:integer ; + bsbm:rating3 "3"^^xsd:integer ; + bsbm:rating4 "1"^^xsd:integer ; + bsbm:reviewDate "2008-01-27T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-03-14"^^xsd:date . +dataFromRatingSite1:Review493 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product28 ; + rev:reviewer dataFromRatingSite1:Reviewer25 ; + dc:title "bleakest headhunts draping anticyclones sennets harassment forging lube wordings mantras gallied organics axlike perfecto" ; + rev:text "scarriest commissionerships variabilities flenched overheaped ropes teazeled defuzing trinketing subjectiveness baser snots overexciting trivialities courting bushelled fibroids taximen trafficker reapers rubberizing mirkest stitcher uncivilized skylarked ogles unregenerate aligners assurers transgressing hyperactive stinginess knifes borders ambulance calliopes truckmaster tuts joie incontinently signalled chipping crapshooters recoverable metacarpal illuminatingly ensilaging freeform previews mimeographed flambeing cruisers relearnt statistics spondees luff tolerates suppleness quickies hooped fonder kinships likeness hexing pryer quarterdeck glace transfuses psalmist irritated methodically deviance dewed ordnances logotypies hitchhiker salesgirls conveys seemliest withers deionizations jugged groveled views years furriness transliterates bostons confirmable honker actualization arrays overtired volga romanticists necrotically posers solubly chichis mashy marseillaise happing lingam beaches leveller shuddering lightened valuable thinner misarrange imaged plagiarizer ghastlier auditioning originally crowds gerontologies eightball furtively commentaries tranquilizes genet supplied colorisms puddlings spectacles pita abidance proteas gavelling privacies endlessly formfeed caseloads vainglory censures principally debased lanciers indirectness sizable redevelopments getter dominates bedecked tootsies partaker medullae pushpins kinkily metered sharecroppers squirrelling sloshes senders transmits reorganizers invocations patulous dissidents templed stratification ensilages prised agonised punny"@es ; + bsbm:rating1 "10"^^xsd:integer ; + bsbm:rating3 "5"^^xsd:integer ; + bsbm:rating4 "6"^^xsd:integer ; + bsbm:reviewDate "2007-11-10T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2007-11-28"^^xsd:date . +dataFromRatingSite1:Review494 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product46 ; + rev:reviewer dataFromRatingSite1:Reviewer25 ; + dc:title "pastorate tyrannizers aussies ganglier spireas dating dilater mentionable elapsing instanced briefs sharecropped gunboats" ; + rev:text "ladybird tricorne fags secludedly creoles complexest slaty pertinency anymore piteously volleying motorcyclist untruest frat slurping shakoes beans midline whimsies outplayed snored bankrupting uniforms rafts vuggs complect overstretched babul alleviates flawy technically creamily dehumanize shays ideologically morphos retakes percussional devisal submicroscopic doziness hookedness sphinges truncated glittered lawlessness focalize grosgrains supernormal kibbling glummest separatists benignancies patronizer curiosa fidgetiness nutritiously separations subgrades knapping pitchouts hobbledehoy stainer gumshoed retouch hirelings pyx hatches polyglots greeting raccoons colures laboured fopping disciplines hypotenuses manually verdancies fainer radiochemist reconnects unholiest virulence rioted disguising aswirl viewy hinterlands liftman overattached limpest effuses meticulosity defoamed dishonorably whereases fancifully cymes exacters copped masthead chartists acclimatize lamely zippering pipet adiathermancy quarte chopping tibiae interventionist machinable dribbed inexcusably overimaginative flickered shuttered ejectable hyphenates"@es ; + bsbm:rating1 "5"^^xsd:integer ; + bsbm:rating2 "10"^^xsd:integer ; + bsbm:rating3 "5"^^xsd:integer ; + bsbm:reviewDate "2007-07-26T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-01-19"^^xsd:date . +dataFromRatingSite1:Review495 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product93 ; + rev:reviewer dataFromRatingSite1:Reviewer25 ; + dc:title "frothing overachieved differently axil" ; + rev:text "rived nannies sniggeringly prater formated squealing anchored mistier degenerations covertly goalies chutzpah moonlighters gunplays beggaries lustre shamming gemmiest arsonist braze hawkings crotchet giftless stridor nonremunerative voyaged fowled mapmaker undeceive birthstone dunker plumpers cinquains studhorses metronomes stabilities townwears kike retitle socks puddling skyrocketed wifes multilayered eightieths unsophisticatedly leavers smegma humanizer recallers bullnose mildewing valiantly titivated barlows bikeways mimical gelatins beaufort drollness mescals faultfinding bromos convoker dehumidification suburbs bonsai neophobia harborage forejudgment solacing snowcapped grooming limousines crackpots diagrammatically freebooted forzando damosels necessariness guillotined biodegradation midmost hurdler lobotomized baler travoises primped reenforced melba reassign dankest harmoniously antifreezes lyricisms civisms oviducts nimbler waging snowbirds cupbearers spoofing bloating quarterfinal hallucinative hunting vier finning relocated kickups malodors undrape older panaceas unquestioningly pancakes woodsmen elating doweling preacher insemination footy dissector sortably altercation mannishly encipher caroller mucklucks inured pecky whews tarot resignedly heisting candlepin gloater piggier ins imposing feminacies showgirl tonsillotomies fadeless hoboes dechlorination loafed chattiness gavels fabricating sinecures demonist bioresearch geishas sovereignly portals romper behaves denigrates distally fanners ingloriousness disgracefully preventing vender perorations dyslectic choosey circumstantially birders braises terminated jellylike sauna justification subleased sanitorium scanting wastefully massacrer bickerer roundness proles oversupplied reappointed dinkiest frequenter backache decrying"@es ; + bsbm:rating2 "7"^^xsd:integer ; + bsbm:rating3 "6"^^xsd:integer ; + bsbm:reviewDate "2007-10-21T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-02-25"^^xsd:date . +dataFromRatingSite1:Review496 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product55 ; + rev:reviewer dataFromRatingSite1:Reviewer25 ; + dc:title "daw palters restrengthened braiders amusing mercifully undervalued" ; + rev:text "signifies jailers fontal prolificness chronics maestros libeled kalifate sensibilities devastations trined tumbled letting footworn overrating flooring placidness stewards aerolith puller chancelleries scenarists scrotal premixes teacakes cauterized llama tougheners reversibility typicalness absinthes onions yawpers gabardines swelled atomising skewness ursiform missorted fortunately manliness probated yakking costard hypodermically fumitory unloosening rondure iciness worsens undeceives forecasts depletable offing incognita newsgirl dromedaries chipmunks comprehensibly factorable cringles singers squashiest delegates evisceration somebodies unstoppable emulsoids bequeathed segue skinks denouncement tootlers finks taffetas guidelines intenser nabobery revolter vindicators effulging praos obdurating ritard forerunner flatwares hermeneutically nightjars clunked victualler wedges bending troubleshot unsolved atropine xiv minimally mislabelled simonize bypaths unmapped propagandistic shoptalk dancing castled pluckily hears resider nondomesticated chutnees stubbornly dorsi intromittent menservants reliquidation scintillometer cannoning grumbly freres animato barbel romanticize clinks wahoo banishing ahems midden tramped atomizer obesely seducer naturalizations cureless reemphasis mildness overexpanded unneedful plenums libelists nobles sidewinders toothing ivies sightseers motorize nunneries"@es ; + bsbm:rating1 "1"^^xsd:integer ; + bsbm:rating2 "6"^^xsd:integer ; + bsbm:rating3 "10"^^xsd:integer ; + bsbm:rating4 "3"^^xsd:integer ; + bsbm:reviewDate "2007-07-10T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-03-17"^^xsd:date . +dataFromRatingSite1:Reviewer26 + rdf:type foaf:Person ; + foaf:name "Autolycus-Christy" ; + foaf:mbox_sha1sum "d53feddada5f097e433cbdb88d4541a57ccc61b" ; + bsbm:country ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-09-22"^^xsd:date . +dataFromRatingSite1:Review497 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product68 ; + rev:reviewer dataFromRatingSite1:Reviewer26 ; + dc:title "skyscrapers spathal centralized transfusions" ; + rev:text "violets headman immures peaces fascination divorced motivationally seventeenths infertility rages freakily legalities reunited pshaws remuneration inconsumable flirters urushiol spirea tireless acidifiable highlanders miscounts stronger classifying constantly subscription unconscientiously witlessly keeler proved tasses engrained gyve workbenches blazoner cloggier wonderlands disobediently privets detailers standings gunfires healable balloted manifolded damndest opticians turtling befools outspelling challah subjugating alloted multivitamins subspecies convolvuluses imagined advocates globalized randomly retaliators stirring recruitment quickies reinforms chintzy ugli fortyfive pokies kerbs fortyfives invocating calendulas semiyearly intestacy alecs balloted blunting excesses nationally nonidiomatic tetanizes retraining repatriate hogties lifted catling reinducted expenders stripped reading unpolluted cases unsnarls parsing spectrographic clumpish boners caliphs profusely justest owned capitations loafer crasser woads redigesting messiness estoppels bloodsucker containerizing geek zikurat obbligati tiling foghorn trailers hagbuts"@zh ; + bsbm:rating1 "2"^^xsd:integer ; + bsbm:rating2 "2"^^xsd:integer ; + bsbm:rating3 "9"^^xsd:integer ; + bsbm:reviewDate "2008-05-05T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-12"^^xsd:date . +dataFromRatingSite1:Review498 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product41 ; + rev:reviewer dataFromRatingSite1:Reviewer26 ; + dc:title "panels roadbeds fingering origination repossessions sonarman ceramicists hecks antis shriver specialist" ; + rev:text "predaciousness cymbal flatwork deepeners sepulchering outbursts financiers scooper tokens ennobles hellion filliping glowflies hemps dupery enrobing brokerly crowfeet magmas sorrows whelps yogurts bugeye sovietized sublessee oxhearts reglossed fingerlings dedicated rockiness rigidifies enigmata burlesques hesitancy polarizing tzar waggoning lengthened miscast learnt sleddings artistries refuters strutted granulators rhodiums warner effectuating ringlets affectionately subschedules cruciate gloms whistler liars preadmit portress consults wanderers goldener limns rollovers pings decanters reflexiveness dimorphism forestalling sunnily swaggerers whims firers guarded disavow preadjust reenlighted underdoes conceding ovulate hushed psychically nonliturgical freightyard cosmologists followings motors hayseeds antivenins depending zoologic sirupy untrodden despondently arapahos punctilious behaved smirks ameliorates farcy pseudoclassicism recondenses surtaxes pylorouses roentgenological suckler modification noncelestial cackled umpteen granulation misbiassed quagmiry cyclists aplenty quacked worshiper crucifer whenas rollers loupes edginess ported loiterers ringtail shapeliness chickadees balls enveloper dumpiest alteratively aliquots ordered grudges campaniles vaginas hyraxes worser hopsacks engrafted tiled cervine gored outings endearingly intermezzo paratyphoid ordinarius fuses unprepared stealthiest clampers hellishness homogeneously equation aments necks rehems physicked enraptures ploughers jerries dissentient defoam unimportance"@zh ; + bsbm:rating2 "4"^^xsd:integer ; + bsbm:rating3 "3"^^xsd:integer ; + bsbm:rating4 "1"^^xsd:integer ; + bsbm:reviewDate "2007-11-27T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-06"^^xsd:date . +dataFromRatingSite1:Review499 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product45 ; + rev:reviewer dataFromRatingSite1:Reviewer26 ; + dc:title "breeziest unhealthiest belched scarry mastless popularized" ; + rev:text "sojourned bickerer ordainers amreeta boules isostatic tankards iridescent breadths amphora rathskeller demurrages brindled unjudicial damascenes zymase shooed housewifely semiserious lisper misdoubted glowflies querists repulsers axially volumetrically patronizing sliming outargues vibratos obnoxiously griper blowtube meaner picnicky prologing tarp unsaturated feminists deled capsular scrabbled espaliers nonconducting ovine monkeyshine resumer gruelers cognates romancing indianian awninged pashas dissolves neaten farced slinky snitch coevally propanol excising foresaid fasted quaking rippled razzes gormandized pinesap slowworms birchen gauger nympho outwit girns policing"@zh ; + bsbm:rating1 "5"^^xsd:integer ; + bsbm:rating2 "4"^^xsd:integer ; + bsbm:rating4 "2"^^xsd:integer ; + bsbm:reviewDate "2008-02-29T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-03-15"^^xsd:date . +dataFromRatingSite1:Review500 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product47 ; + rev:reviewer dataFromRatingSite1:Reviewer26 ; + dc:title "palisading scarcest plinked currier midwesterner subordinates midtown uncashed" ; + rev:text "bestially engagement czardases serrated airdrops iguanians jinnee crawdads goblin inning whitlows hopsacking dreadfully halloo libber orchectomy whitens janes urges atoningly dutifully pavane inscribed gossiping galumphed ascribing guffs tbs bravers herbariums fluming carcase lodgment nudges rotaries receptionists lacerated quadruplication gynecologic denoting unsatisfying shadows puerilities excessiveness skiwears microanalytic determent microprogrammed shoplifters rejected corroboratory physiologist zips tother unapplied outback irades northwesterly buttoner pipits gregariously unimpeached discrown nonviable resound rematched attenders apparelling depilation furnishes aurated scrammed clicked monotheists depreciation factorship biologic roaster outriding massing captress overcrowd blisses crackers pathologies adjuror candying prelims sheetfed comedowns impertinence lynchings histories orthodoxes tuckahoes booths gonadial adopts quotas chisellers sculpting tollage bewitched brollies dishonest feelings rising naughtiest redactional stated graperies dunks aerofoils screened reprimanding radiosensitivity chihuahuas debitable youse techie lysins horsewhip masculineness flatteringly graveling capturing arbitration lambasts eruptional enact inflects clamour battler overmagnification pervading etcetera umbeled braggiest irrepressibly entrains unblocked simonizing sues tattier artlessness deworm ope elastins seabeds yugoslavians thresher emending indentures scenting budgies trulls pendents denominational curettes compoundable zonated travelers fusing honked misadjust bigots fluidness vapours surrendered equaled banishments researches scalars bloodshedder reweighed mastoiditis untainted emulsions incisory apologetically"@zh ; + bsbm:rating1 "3"^^xsd:integer ; + bsbm:rating2 "7"^^xsd:integer ; + bsbm:rating4 "1"^^xsd:integer ; + bsbm:reviewDate "2007-09-30T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2007-11-03"^^xsd:date . +dataFromRatingSite1:Review501 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product83 ; + rev:reviewer dataFromRatingSite1:Reviewer26 ; + dc:title "annotatively sorters copyreader nonhereditary sensuously nuncupative despotisms predated ungrudgingly gyromagnetic perceptions predestining" ; + rev:text "minority instigated lingeries heedfulness kebob swifts dinghies countries disjoined reconstructed stingier borated beechnut deckers cakewalks devilries misquotation stormily ceremonialist flews elusory consulships vultures lubricator adiposities baldricks eoliths laude sprinted selvages soupcons loosed liturgical fissility hatching practicability unexperienced matriculations itchings reemphasizing concertized stammered bathyspheres chorea mimer grits legitimizer writing comeliness chattered tarde wastable pronationalist magnetizers pentalogies elusion fobbed subdirectories mouldered teensier pounders overwriting cartoned eyehole posingly morsels sinusitis underarm charbroil francs pettiest molester confutation mongst converts proboycott vivified treaders shined undaunted radioed plonk sphericity overstay poplins palliations casuistries uncircumstantialy turgors runways explications dampener unwrap questors weighter reactivity aromatically tiddlywinks wanderer sidekick speckles stippling rubbers analgesics frags apostasies tupping donative blandished semilegal equivocacy tanglier petitionee glassily ferrums dangles piercingly"@zh ; + bsbm:rating1 "3"^^xsd:integer ; + bsbm:rating3 "6"^^xsd:integer ; + bsbm:rating4 "4"^^xsd:integer ; + bsbm:reviewDate "2008-03-05T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-03-15"^^xsd:date . +dataFromRatingSite1:Review502 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product34 ; + rev:reviewer dataFromRatingSite1:Reviewer26 ; + dc:title "basifying supplying carromed submember carotin earlocks" ; + rev:text "familiarities cogitation pitchiest duplexes besmircher distorters motorcars yearly deadlocked reinvite flappable driveways jigsawn windfalls quarts unpleasing dishcloth tinkled overslipt djinni assorted cutcheries weirdos presentations doubtable speckles scraping duckies liquidizes grubbily enthrallment unprovoked subtenants forthrightly slipt sheeney mozambique rickettsias injurers cambodians colluders girt coeditors outsiders eradicators hooker fluctuated products gitanos indigenes tinier bacchanals strophes spicas coronae expediences untruest appriser oversize noninterventionists starfishes lickings bartizan pouting judaica corvees confessed aflatoxin semiprofessionals unadulterate armadillos nonprocedural drabbed bioelectrical ethicizes dilatate unprofitable waddled oversupplies"@zh ; + bsbm:rating1 "7"^^xsd:integer ; + bsbm:rating3 "3"^^xsd:integer ; + bsbm:rating4 "4"^^xsd:integer ; + bsbm:reviewDate "2007-09-16T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-02-15"^^xsd:date . +dataFromRatingSite1:Review503 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product65 ; + rev:reviewer dataFromRatingSite1:Reviewer26 ; + dc:title "sensorial interrupter dunged cribber celandines approximation pegless dicotyledons birthed specking roundhouses quaveringly tunings" ; + rev:text "logway unhanged reptilians burglarizes maddest deciding aortae sniffish tanagers instabilities headpieces premolar sawn amperages faster sixties priced restacked baiters biffing torii reordain dramshop statesmanship cham tremulousness splits quickening gentrification tricked appanages douched liaises huts placability deciare unsaturate infarcts decasyllable sinisterly zealanders policies supervise slues daymare wearing nictating coursings consuming kanas reacquired unclaimed disservice lustiest nonsusceptible farts cosmism insectivorous molder treasonably applicatively obliviously nonconductors crowdedness aspirators espalier mistunes recrystallize hibernates skulkers mislabelling scrubbier bonzes pastelists ethical answerable exulting flavored trainway rubbernecked lavages relinked mentors disrobing garrisoning miserable recalls activity contemptibly photoengraved mayest sunsuit originated graupel"@zh ; + bsbm:rating2 "6"^^xsd:integer ; + bsbm:rating3 "7"^^xsd:integer ; + bsbm:reviewDate "2007-12-14T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-01-07"^^xsd:date . +dataFromRatingSite1:Review504 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product51 ; + rev:reviewer dataFromRatingSite1:Reviewer26 ; + dc:title "hogged devastative peaked aerodyne pastries embrocating" ; + rev:text "identifies symbols cheating sodality heterogenous leger baldpates moults excellently dismortgage malefic unbarring subtasks cherishes headboards backbenchers stilton enshrinements politicize treasuryship exhalants elvers lambast nutlets steeling rampagers kremlinologist torridest debilitative sangrias goatees escapements cheeking reclassifications dunked splined herbaceous scared discouragement highting probation pillowed oddball wingbacks gofers cumshaw monstrances defects regularities gabbled skilling asininity skeeing scarriest analogues noncarnivorous defense dewberry sticklers donjon nympho noncontiguous"@zh ; + bsbm:rating1 "2"^^xsd:integer ; + bsbm:rating2 "8"^^xsd:integer ; + bsbm:rating3 "5"^^xsd:integer ; + bsbm:rating4 "6"^^xsd:integer ; + bsbm:reviewDate "2007-11-28T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-03-14"^^xsd:date . +dataFromRatingSite1:Review505 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product43 ; + rev:reviewer dataFromRatingSite1:Reviewer26 ; + dc:title "manometric tipping diehards excursive charier recomposes marvelled eroticizing subvaluation squiggle slims" ; + rev:text "wifeless autodialed zilches particularity advocacies affrayed jins districted ached maschera underrate strands syndical shovers blasphemously bowstrings lotteries mothballed rediscovery dragnets barking signified orbitally rapter spicily headstands scooped seas unresentful wilco shower assignees shirred revocations intertwines scapulae solfeggi corporals lighter kryolites lavishest mantes underpricing stuffiest coops rums unvanquished snooking hyperirritable repacified leachier stampeded nonparasitic fructuary lawlessness rubaiyat horoscopes mediative crusader permutations torquing impishly economizer subrace reflection mummified muddies incumbers regressiveness christianized enchilada sectarianism miswording straighter skiddoo pedaled sweeting overmodest saner predestinarian gnomes cathouse variants scoopfuls silhouetted napes modester marseillaise mammon contaminating paseos apprehensions scads suicides hereat dissolvable bobber trollies tm pulps aggravating spiraeas godsons bicorporal bristlier smuttiest unspoiled papyruses praxis susceptibleness uninformative versicle bossdom clack acromegaly missals datcha paddlings yores desalters thymes martials pervades prevocational lucencies newspaperwomen adamants impostor endoscopic unmentionable amoebous quashes sarge repainting macaroni famed peeled indited jugsful reconstitute overproduces shortages subverts trivets bleep nonowners effulge jobholders commandments proselytes ixtles literals supinates scummiest consistency abbotcies clipper warfarin retooled cornmeals creditability dancing placation snootier percentaged intuitions distressing lecithin subabbots furcated slavers rocketer ratable antiseptics pylorouses aimed polemicists"@zh ; + bsbm:rating1 "3"^^xsd:integer ; + bsbm:rating3 "10"^^xsd:integer ; + bsbm:rating4 "3"^^xsd:integer ; + bsbm:reviewDate "2008-05-02T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-15"^^xsd:date . +dataFromRatingSite1:Review506 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product56 ; + rev:reviewer dataFromRatingSite1:Reviewer26 ; + dc:title "nobodies succeeding midbody schoolyard kames sharping unbends legitimizer consumes skying properest achiever carbineers soirees tyrannously" ; + rev:text "dialyses seesaw surrealism convicting tumor incoincidence reservoirs jackies users clawing certitudes tumbles emplane miner arbitrated refreshed divinely vandalizing reemerging arteries radiolucency interrogative viol signoras shoaler tapped ozonous taxonomists villous curses prettier unlined solvable immunologist glamorizing reactions rondeau engird deftly birrettas tellers divulging kelts upheavals hackmen gesturers suballiance skiplanes choired lavations audiometries periwig elasticizing lox craals enchained preachiest orbed snarled aroynts jiujitsu fatuities upholders soddies filiates modesties polynesians preliterate groomed unanticipated prorogations senti glebe attunes extrication culottes drear cs ruralites kines disheartening reenclosing phantasies royalties scarriest generations dayrooms fungitoxic delegatee curare scollops unconcealed plebes whitey failing eyewash isomerize isopropyl itemed asbestic basely tremblers waterfowls bobsled reciprocating stodgily gangrening unlimbers pigs valerian critiquing unspeaking"@zh ; + bsbm:rating2 "5"^^xsd:integer ; + bsbm:rating3 "5"^^xsd:integer ; + bsbm:rating4 "9"^^xsd:integer ; + bsbm:reviewDate "2007-08-11T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-01-01"^^xsd:date . +dataFromRatingSite1:Review507 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product81 ; + rev:reviewer dataFromRatingSite1:Reviewer26 ; + dc:title "flacks creaks fattening internationalized chancer imprecates spinnery recommenders dropsy brokages stoles" ; + rev:text "hoarily repave needer amender solarized cowhided ideations pronouncing pinching gashes cupola conjunction mercaptan ductless gonging convicted reassimilation cuckooed pleasers dowsers demodulation quandaries analogs braziers jordans bedplates vulgarity crimped hymned inhaler dabbles refiltered ethnologists clowned spoiler caprine ourself rewed consolidators dustiest animosities boles psychodrama nozzles keepers nonexisting simplemindedness institutionalizes sheetrock turquoises autoregulation apiaries begrudging gangplows verses sensuousness entropies windless irregardless sojourners crookeder reprovers shadowers grides seascouts bungs scandalizing dias teratologist simplifying unbinding unfrocked hymnaries warmths subjective mariachi centralizer"@zh ; + bsbm:rating1 "2"^^xsd:integer ; + bsbm:rating3 "5"^^xsd:integer ; + bsbm:rating4 "3"^^xsd:integer ; + bsbm:reviewDate "2008-01-21T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-04-03"^^xsd:date . +dataFromRatingSite1:Review508 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product47 ; + rev:reviewer dataFromRatingSite1:Reviewer26 ; + dc:title "motes stegosaurs pronounced qualmy" ; + rev:text "consolatory feelingly dropped inviolacy senatorship intoxicated tutankhamen touzle campings caramelizing headlamps toolings upholder debited foredating infests endocrinic confidentiality wireworms mutations clerical dishwares dosages rehandle pseudohistorical realists acidy youngling throstles brotherly maimed gentlemanlike vernaculars gadgetries expectorations abandoners crawly neurotransmitter instrumented restates unknotted chemicals interdepartmental voicer hardheartedness unscholarly sentimentalized microminiaturizations lithest mammies quietened plugs underpaid offerable modernest worsens crackups mayors halavahs selfing wonderlands forcibly satieties animating provenly tonnish dribbles freshener pities tones capuchin hingeless turbulently decently panga hallower rationing fumet fowling golliwogs manageress invaded grievousness reviewer gaining greyhounds mincing skateboarder overleaf puritanically cryolite protozoic headband openhearted brilliancies damper pasquinade backtracking hongkong honoraries poetesses recuperation skinners responsibly inditer saves na dodoism idealist midguts lysing kitlings improbably stenos souping coaevals deterge primer alcoholization cosmist lobelia reacher enfeeblement institutionalizing belletristic adulated parceling pakistanis pelter uppish gibbously segregative homilies thriftiness collectables peritoneal trilobed"@zh ; + bsbm:rating1 "9"^^xsd:integer ; + bsbm:rating2 "6"^^xsd:integer ; + bsbm:rating4 "7"^^xsd:integer ; + bsbm:reviewDate "2008-02-05T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-20"^^xsd:date . +dataFromRatingSite1:Review509 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product78 ; + rev:reviewer dataFromRatingSite1:Reviewer26 ; + dc:title "usurped caprioles brushoffs quaffers" ; + rev:text "harvester noblesses enlarger nurseryman straights vulgarian enticer outstretched decorativeness parishioners enthralling underhanded uncials disputable interregnal plastering ravers biologic coatroom pledgeholder stunting dataflow explainer pouffe urb heinously scrollwork clones hematozoa glories nobly burgles leathern galloot preordain condescends dissection idolizes enthrallment hardheads silentness grazer bronchoscope administrations freshened trustworthily czardases stitcher clitoral artificialness seconded loafing implicating totalisms sandhog dotters adherer dolours airbursts willers antonymies taxless adversaries slaloms closing undefeated floundered queueing fellowman adumbrations electrocutional pikemen enduros convents tunnies pustuled readopted slimier herbicide eyestones reinvokes inequable unsensitive sextuplets supt roundness abducted spectrograms communalize baddie sulfuryls chemicals carousers tisanes dangs bikers facies whirler elopes winterier handbooks unsightly droved mesopotamian dreamed kindlers basketries reoccurrence pulps unguarded tendentious rejudge lorgnettes lightheartedly carting profitable pilled auguster chelation marshmallows liturgists evokes mindfulness facets coagula checked carloads freeholds mules fumy bestiary hens portability doorknobs discoursers mechanotherapist onanism alans clapped inveiglement unjudicial romances curvey mango nonhistoric colters prestamp bigwig scored assessed futileness bathyscaphes delegated rhythmicities paradigms disservice guilelessness funked beeves bobbysocks sharecrops amu vectoring pricey retractor coddled scurrilities peepers lamentably locaters napoleons cavorting untied statisms disparagingly facetted vocalities massacred pondweeds warier phalloid guts stardust ultrasonic perpetually steadfastly reinduct provolone righter"@zh ; + bsbm:rating1 "10"^^xsd:integer ; + bsbm:rating3 "3"^^xsd:integer ; + bsbm:rating4 "7"^^xsd:integer ; + bsbm:reviewDate "2008-06-10T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-15"^^xsd:date . +dataFromRatingSite1:Review510 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer3:Product97 ; + rev:reviewer dataFromRatingSite1:Reviewer26 ; + dc:title "assyrian easers rebilled breastbone sphygmomanometer quotationally puppeteers cunningly siecle broadens banters" ; + rev:text "monarchies biddies dobras kleptomaniacs apprehensions redeliveries flapless unification degenerates underpins inbound twinkling centimo minimized carotids ichor bedeviled moisturize tingled wellsprings peccadilloes misclassify pastramis gewgaw unfertile germanies sixtieths axil buicks scandalously unapprehensive ringnecks tormented figged upholding comforts times treetops upped aikidos keyholes unperformed atheneums attenuated refractions supposer clubbier chicness revisionist heralded gasser nettier heartless commutatively revictualing accentuates rickshas uncondensed centupled unswathing mastheads suppurated deadlier spieling saree antiquers quotationally infernally soulfulness cars unpredicted witheringly qualities imperially delfts jackknives pauses repressibility snobbism streamy brassish unbailable breathless exposits generational conspiring dogsbody femoral wasted wrongheadedly unhealthiest fisting lecithin outproduces exclave detachable neomorphs rapacities discomforts differing anilines plummeted noncommittal planning everted sagamore precollege handbooks shebang underbrush mopers croup tablespoons employable protestable wormier indiscriminately reflowed teacupfuls reeducates offenseless scrimps pleases bogged choreas badmouthed spotter topkicks terrorize slurping phrasing resistances intransigents dolled sortied readmitted empowerment signory preordaining collects salutations dissociations uncheerful redemand miaow granulates essays educts gratae offender dodoisms refolded shouldering titled sweats sickrooms reletters blackly budders dourest answerable dognap laryngoscopy workaholic nunneries frisbees halloaing grainier credentials volente outstare spattered nobleness wriggler categorizations adeptly descriptiveness oats"@zh ; + bsbm:rating2 "1"^^xsd:integer ; + bsbm:rating3 "3"^^xsd:integer ; + bsbm:rating4 "9"^^xsd:integer ; + bsbm:reviewDate "2008-06-12T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-16"^^xsd:date . +dataFromRatingSite1:Reviewer27 + rdf:type foaf:Person ; + foaf:name "Constantin-Vasilis" ; + foaf:mbox_sha1sum "56577629d67583ce80d0b1dd3378a6e31269f8e" ; + bsbm:country ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-25"^^xsd:date . +dataFromRatingSite1:Review511 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product56 ; + rev:reviewer dataFromRatingSite1:Reviewer27 ; + dc:title "queasily gerontic frescoers tzarevnas memsahib" ; + rev:text "predomination borders chaparrals portentousness fakers opulency immobilizer homeworks polyvinyl lolloped barographs untimely solidity serigraphers delver supplanter tattooers endearing spatular goodly picnickers overcools maniacally danged veils ginsengs koshers crumbers adulterously predeceasing overlooks upheaver reenacting designative injurer squirmer underhandedness beachboy canner bulges hovels attestant subtitled prefixal contemptibly waterways oncograph flatcars traffick analgia trier gaged palmer realize handpick organist fibroma boomer monition journalistic muddling perceiver regulation ribosomes pestholes chevied migration revilement salines carpe stirringly accomplis outsize collective hogties dourness moltenly contraries ribgrasses overtops irreducibly sepaled vestments machree warmongering vagrance carinae bisons gossiped gipsies paradoxical tougher tutelary parte regularizes fratricide asexuality anagrammed victualer instruments capillaries roentgenologic investigation antigenic perilousness vulgarism keyway moonshiner paroxysm misinformants pitied bedstraws bluenoses compositions fishtail mizzens illegibly damns sadhu autoimmunity lampers swiftest zonetime daylong deference dogteeth reinstallments solemnizing saxophones bloodiest electrochemically knobbier underdresses foliated morphines colinear unapportioned tattersalls extremest dibbled eclipses bales frigates flumped ionizer rejuvenation tattiest"@en ; + bsbm:rating1 "8"^^xsd:integer ; + bsbm:rating2 "7"^^xsd:integer ; + bsbm:rating4 "7"^^xsd:integer ; + bsbm:reviewDate "2007-07-11T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-03-17"^^xsd:date . +dataFromRatingSite1:Review512 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product62 ; + rev:reviewer dataFromRatingSite1:Reviewer27 ; + dc:title "biologically ruminators indenturing melanges ablest" ; + rev:text "barest quotable focuses scandalously caroms allies burnouts greasier bibliotherapist instrumentally feuding remarque itineraries overcrowds inscribing encourages voiceprints goldenest enravishes prudish bikeway towies tenantship dalliance dimorphic coonskins reconditely womenfolk cathexes opened quackism summonsed toyish wizened inositols obligatorily fuzed transpiring skimmed resonator goodbys boughten sheerly unmerciful panickiest soaper bailout sensibilities sheenier rabidly caviling survivals extradited mousily nakeder evanesce bluffest ransoms wiser procuring ovule oenology escritoires distensible moped wiriest floats nauseas pederasties serifs trekked dustheaps shears belaboring crammers thankless cusped tidally abhorring demanding underflow parthenogenic citrous profaneness primigenial conducting newsreels bigoted deaccessions laciest drainers flounderingly imperils slanted trophying mensing shorings feminity crudities leadoff decompositions grandmas balletomanes warmakers solemnest pastural venerating singhalese obliteration bens triadism pretentiousness joyless wassailer dietitians birched phoneticians"@en ; + bsbm:rating1 "4"^^xsd:integer ; + bsbm:rating4 "8"^^xsd:integer ; + bsbm:reviewDate "2007-07-05T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2007-11-28"^^xsd:date . +dataFromRatingSite1:Review513 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product29 ; + rev:reviewer dataFromRatingSite1:Reviewer27 ; + dc:title "empurpled coiffing meatballs gov unclosed gimballing" ; + rev:text "derogatoriness bantered rescripts antagonizing geographical toads unspoiled suppurate flautists fawning haloed councils reglued torrential blueish wight circumcised telecaster investitures eschewers nonperishable centralizing bobber coxwains bulldogging wryneck piccolos hypothesists gallons overincline noncohesive clangs hellions wharfed teasers conceptions nonseasonal singularity blathering stagnated smearers mayors disposals relapsers vialled scrappier motored vignetting operatively hydrotherapist luaus manifoldness lacier mallei monologuist ovals rechecked boggled rapturousness legislator lustiness gunwale inventors anticline appeased flossie dissoluteness pyrogen metricating biggies odorously overmuch stretchiest demurest remails sparked riotously residing nationalism yokemates ureters burnies senders coshed smokers heedfulness overused wavery dastards esse headhunting yellowing predeceases furnishes fatality dominium pollee chips antipathetic postclassical passkeys sugars mastication forehanded dirigible overpopulate wordier impercipient duperies pulsation emplaces eudemons teleview subversively hoagies burlier tycoons titling cirrhosis casketed underplays footrests coeval viscidities restrained attitudinizes undernourished abortively redecorates viscounts zebus dongs flightless medicined federals arithmetics noncasual cyme librating digger relit emporiums anticlimaxes calorically apiarist hyrax rots impersonations aloofly wafts plashy aphorist legitimatize reverting adjudicating"@en ; + bsbm:rating1 "10"^^xsd:integer ; + bsbm:rating3 "6"^^xsd:integer ; + bsbm:rating4 "9"^^xsd:integer ; + bsbm:reviewDate "2007-09-29T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2007-12-18"^^xsd:date . +dataFromRatingSite1:Review514 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product20 ; + rev:reviewer dataFromRatingSite1:Reviewer27 ; + dc:title "treasured bidet posies expatiation" ; + rev:text "flintlike standees ballyhooing protoactinium idealization furrowy diagramming versicle handcrafted excitedly unweaves harkener cookeys maladroitness creches fretful crick jabs electrogram outdistanced luckie photoengravers complimentarily felloes stomachically rephrase woodcocks retrain dosages flatteners unharmful servility spoors blackouts commenting disesteem nonattributive assafoetida cartage disciplining driftiest fanwort sylvius triskaidekaphobe serrating flauntiest derelicts os unsubdued discoloration tunes ends spotted unworthies orisons surmisers splinters acutely decontaminating telecaster dooryards annotative tows chondrules untimelier likelihood depositions underlines abstainer stemless kanjis winked quadroons skyrocketed detoured oversharp kowtows wounding strives adjudicator russians vesseled sharping sledders reluctantly tektites lionizer nixie forkfuls kidders timpanists trembled entryways exclusivity grommets noninstitutional mending zeniths reconquered grafting generality deathcup readapts swanherd ketonuria strawhat intercommunicated linotypes elaborators computations indigestibility azido vandalism intro maternalism shipkeeper whiter restfulness signatureless deists inappreciably mullioning controversies concelebration sheols trustfulness submergence tipped rerecord oversight demounts prevented shaitans civies louden disadvantages apostrophizes scourging"@en ; + bsbm:rating1 "4"^^xsd:integer ; + bsbm:rating2 "7"^^xsd:integer ; + bsbm:rating3 "8"^^xsd:integer ; + bsbm:rating4 "9"^^xsd:integer ; + bsbm:reviewDate "2007-07-18T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-01-15"^^xsd:date . +dataFromRatingSite1:Review515 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product76 ; + rev:reviewer dataFromRatingSite1:Reviewer27 ; + dc:title "catalogers mezuza drachma kilocycles filers boomage applier concreted gnomist woefullest decelerations pedagogies fabrication reminiscently" ; + rev:text "parcelling unburden polyester rockeries squashing smites cabbies juggles dishevelments crayons smoothened pitilessness jealousness obsequiousness solitaires hinterlands stuccoes wrongfully sprinklings abstainers provoked overcrowding burnie rabelais culler reframes hopsack endamaged unremoved secreter scannings stretchable pollened loafed bottlenecks tempesting temptingly droughts cuirassed chifforobe patrons deceitfully storages coituses courageously tiling tackiest universality gabbler vineries wifed triturates dispiriting dottiest hiders encirclement spoonies unchivalrous wellsprings mantlepieces primus toothiest pervader chiseller streptococcal backlogs jogged sanded consolers palates agonist progressional cashmeres terraces leastwise horseshoers scarps owner untreading tinsels amebae plutonic bedeviled vocals unvarnished rhombs"@en ; + bsbm:rating1 "6"^^xsd:integer ; + bsbm:rating2 "10"^^xsd:integer ; + bsbm:rating3 "2"^^xsd:integer ; + bsbm:rating4 "2"^^xsd:integer ; + bsbm:reviewDate "2007-09-13T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-04-17"^^xsd:date . +dataFromRatingSite1:Review516 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product91 ; + rev:reviewer dataFromRatingSite1:Reviewer27 ; + dc:title "negotiatress gradational fleeced mechanotheraputic insanities progovernment faithfulness slotbacks whores kinglets fairly rehabilitates" ; + rev:text "defrocking crepes divesting nonfascist renegading postfixing confounded humming baywoods retouches wiper somalia productively womanizer conformist hegiras glider underpinnings catholics laggards opinionated flatfishes logistician disparities torchier pallette carabineer unfenced weeklies swearword sacrums handcrafts sputtering oversolicitous cleats capitation testily crookneck interbranch voluptuousness mashes occiputs moderates forebay partnership overplays personality prows acclimatization nefarious orchestrating directors teleports hading ungentle operatives soyas bloodings multilineal wearies bider gallivanter parting rakishness rosiny wort spirituality shortwave charismas mover"@en ; + bsbm:rating1 "10"^^xsd:integer ; + bsbm:rating2 "3"^^xsd:integer ; + bsbm:rating4 "3"^^xsd:integer ; + bsbm:reviewDate "2007-12-28T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-04-07"^^xsd:date . +dataFromRatingSite1:Review517 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product24 ; + rev:reviewer dataFromRatingSite1:Reviewer27 ; + dc:title "secluding innkeepers commy enciphers senseless leisures sennits subphylum scandalously unplugged" ; + rev:text "seeming cherubic sugarless overfeed hatting splurges flitters syndicator romanesque wains bobbed thumper metastasizing libelist sedateness wides fourposters guitarist clinker taunters oblivions gessoes charily lectured columbines disorients penname pessimistic nickelodeon paddies pencilers lichee belier grossing intentioned inventers obdurateness interrelations infiltrates latinos cussed rewin overfilled magnetize trice rubier reinvigorates acne stooges advertently affronts shots viceroyalty stockrooms completely rattus egad reduplicated expectoration adiathermancy reanimation decreases foddered proportional quadruplicates pluvial bloomers zaniness braggadocio reverification immies overeducates caucused entwisted dongs renegade interrelation relationship hydrolytic uremic clanking pedagogies proportional fluttering lobbyist corporately radiophone semigraphics weaker antonymy slurrying workwomen details unfreezes austrians invocated lantana repriced extradited mashes poorness nonresistant whipt nicknamed microphotographed predestine cartoonist sheikdoms leaps cullet epochs vitalizers groans clocking obeisances surveillance apprises idiocratic accreditment ichorous geodesists ashcans tolled theorizes conforms housepaint unharmonious clueing trimorphs hallucinational nobbled coloreds ineligibles kerbing cooeeing seedman seizes meliorations abrades forensics mammalia boxers gnosis coalbins flenched perambulates fibres zoomorphs rarefying implied interweaving veritas socked glamorize alarmists toadflax wheeling blossomed demilitarized plurally bests bungles parlour bonniness leva bloodied laughings jazzman iteration cultivators tumbled codified nonproliferation chloral ices blazoned bogs exhibitions kindhearted gunfights aflatoxin crutches hums coati garroted purulently variating melodeon navigably reletters"@en ; + bsbm:rating1 "1"^^xsd:integer ; + bsbm:rating2 "3"^^xsd:integer ; + bsbm:rating3 "5"^^xsd:integer ; + bsbm:rating4 "9"^^xsd:integer ; + bsbm:reviewDate "2007-08-12T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2007-09-01"^^xsd:date . +dataFromRatingSite1:Review518 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product23 ; + rev:reviewer dataFromRatingSite1:Reviewer27 ; + dc:title "puled ferreting barometers casqued skycoach openable banderoles judaic pretzels evanescence dibbling calculators" ; + rev:text "disconnects readdresses unserviceably subclinically edda reprised pugged indication distends magnates warks locknuts prouder armfuls flexes secretively gonadic narcotization institutors grapeshot compliers uniformity ganging obsoleteness tooting iller moveless mads rewarding demonstrative posed focalize cypriots cosies isobaric reharmonization sinews likenesses crapulous tuques straggled leotards destructiveness trickie wrenched kanas unlawful cyclopedia snapless fixed baa submicroscopic rudderless yews lathing architraves welterweight unpoetical stratagems incurable rallye skilful gratae shewn conveniences snowed hypnoses geums saltires jennets codifying matted reattempted eternize bickered forefather synaesthesia caboose ingraft reletter gonads descanting wurzel rightism iodides refinished tattles poorness captans subduers stultifies tympana disassociation loupe translator concentrators overreacted blistered saggers unchained torcs osteologically cresting duo semiliterate clarinets conned buttoned unbrushed confreres brazenness reconnoitering spars opulency outbalancing retransfers incurve majorette topsiders ladyfinger traced josher sickbed overdesirous sequestrating"@en ; + bsbm:rating1 "8"^^xsd:integer ; + bsbm:rating4 "5"^^xsd:integer ; + bsbm:reviewDate "2008-05-06T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-27"^^xsd:date . +dataFromRatingSite1:Review519 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product51 ; + rev:reviewer dataFromRatingSite1:Reviewer27 ; + dc:title "renovator chukka falsifies cosmoses eminently rewarded gallowses mythos estrous whitened" ; + rev:text "infers bambinos levellers beings unmortgaged colonization obstetrics figures asides winterization campgrounds chaotically installers assessments latening debauchees baldish codifying blanching interceptive stoplights observers delinquently disbursing oppugns zoysia puritans hasteful privateer popguns odoriferous thrashing stauncher backlashes jugulate psychs overqualified misadvise woodblock brutes blatted atwitter sanga pharmacopoeias medicining balloonlike tetra regauged quilled badinaging repents subdepartments unfair regiments scholarly gleesome sedulousness ghostiest brambling easers reclad properties nickelodeons centrifugation matricide unstraps programmers segregation outrider chinless imbalming caffeins eggcup arranging furriner vibrating pinking metalaw advisors radicates sheered nocturn knotweed noters coring presifts fatteners checked starlets popularity jadeite jitneys ankhs underproduced willed primevally maenad novelizes tourneyed turbot houseworker doggish doomsters huzzahs respecting shinily jokers lawyerly stepdown dazedness obstructing reeducating cloisonne foretokening mediative lacerating abides initialed sergeancies creations bidders faired suede payolas clift nighter prizefighter stimulating reupholstering introits smoker trampoline liquidations delver interested pressmark epithalamium undercarriages felonries generalize electroencephalograms primogeniture predate cosher jellylike unanswered mentalists wiretappers shoddies signalers"@en ; + bsbm:rating1 "1"^^xsd:integer ; + bsbm:rating2 "10"^^xsd:integer ; + bsbm:rating3 "3"^^xsd:integer ; + bsbm:rating4 "9"^^xsd:integer ; + bsbm:reviewDate "2008-06-13T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-17"^^xsd:date . +dataFromRatingSite1:Review520 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product20 ; + rev:reviewer dataFromRatingSite1:Reviewer27 ; + dc:title "abortifacient vespers encystment gynecologies baroscope strudel parquetry territorialize troubles civilizes joking" ; + rev:text "secondaries carryings pluralization temperatures unaccidental compounders muskily marketing cloacal angulating lodgeable overnice tickled partridges coalshed riels hypothesizer drawing unpleased snoods liking guardhouses choruses dowdier tamaracks caned unapologetic swizzles ecumenicism nippy mollifies exertions cocainism ghoulishly genealogical reformers overskirt recognitory distorter presold refile usuriously hegemonical stacker recap recane linacs remigrate indirectness kilobit caver merlons totes disaffiliate facials blocker annihilators subprocess punny unloosed caulkings wagerer vaginated decadently cultic quilled obliviousness points saxons temperament effs floodlighting hatched immortality oleanders extolls gassings gripple construction regilding enlisted tinderboxes lianes songwriter nostrils cornucopias victimize unattempted pints humbling misbeliefs incidentals nickels severalizing crustily flambeing gruffly unearthing emulates skydivers inculcated challies fencible stereoed emending tinted blowsier pneumococcic fascistic rinsible gusted pasteurizes spookiest roadblocks ameer parsed nucleuses miaouing"@en ; + bsbm:rating1 "3"^^xsd:integer ; + bsbm:rating2 "2"^^xsd:integer ; + bsbm:rating4 "6"^^xsd:integer ; + bsbm:reviewDate "2008-04-04T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-18"^^xsd:date . +dataFromRatingSite1:Review521 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product30 ; + rev:reviewer dataFromRatingSite1:Reviewer27 ; + dc:title "yipes temporized censer scullion phantomlike deranges smokes fairylands" ; + rev:text "imply astragals rigorousness leys laptop modula blowoffs dumfounding minced wenches explicator designers judaical trifoliate typhuses separated wretched dishonesty gandered deprives equilibrates recompounded barroom straps alchymies snot milliner dojos palpating nutritionist realisms sneakiest biconvex airlifts pasteboards reverences sockman galatians hors harmonization includes preexposing gins adds folksier bowls hillocks aerobe puggy ranginess gifts woodsier perspicuously alterants famishes joineries immatures prattle eeriest tomcat tipsily purposefulness uprooters rolled oversolicitously irenic nucleons enamours remodification dilapidated exercisers preappoints trichlorethylene overlies foredoomed hairsplitters replenishment decoded eagers filiated docking snorted marshlands perishably reheat resumptions placarding duetted preregister skewered fusses colics granger creakiest stewpans pullouts southers speedups rencounter accomplishable decalcified nathless trapshooting thwarter surmisers gobbets undismayed stooging remonstrant mutilator strychninism trulls cheeriness judicatures reerected profiling sonatinas doter swipes taxes divesting louden dillydallies untangled beflags complicating swaggering ejacula untended regeared lusciously episcopalians hounds recuperated retrace templar isomerizing gunneries dilemmas rotors ambler operations rasers unterminated pathogens chainlike mastoid cangues gormandizers bated typical shiner seasickness oversalting dormancies kickshaws cannie reinstates goofed excursuses bawled ameers"@en ; + bsbm:rating2 "9"^^xsd:integer ; + bsbm:rating3 "6"^^xsd:integer ; + bsbm:rating4 "9"^^xsd:integer ; + bsbm:reviewDate "2007-08-28T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-04-29"^^xsd:date . +dataFromRatingSite1:Review522 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product51 ; + rev:reviewer dataFromRatingSite1:Reviewer27 ; + dc:title "immunosuppressive absurdum extractors brutalize fluorinating martinet provocations" ; + rev:text "turbojets quiveringly dimorphism doorless innerly stimulating footsie tricornes parodying dewaxes chokers blether smashers provokes escapements bawdiness compactly interline shysters disaffectedly catagories indign justing alliterated astrals timers gangplanks ab perspicaciousness squeegeed cardamum excellencies attainment redeyes tympanums disclaimers pomeranian plating coloreds indeciduous malignance billheads catheterized chastisement bilks neotenies formulas clipper materialness lionesses verities papillons materializations counterweight hybridizer sporran overexcitable mayors familiarized biographer prehistory uselessness recidivist notecases bipartition albatrosses overturned immunoglobulin lounging surcharged exterminated polymorphously absoluter opacifying pareve chivy admissable inaugurating concealer televising imprests xerophyte dacha beleaguering knotholes impresser conservationism pissed hoodooed termers geologists spouter carryout licitly tarde partners reddest epithalamia fps thymier wetbacks addresses cerises gelling redyed commemoratively vertebrates axiality realigning brandisher affiliation oozing trimly unarmored undersecretary gaffes regrouping harpsichordist pretends saltpetre myelitis forworn traditionalism withies invocator delegates sheened exclaiming ropewalk gamily enclosing affiliated walkouts accruable explicators ruffes binocularly murker salinities gaugers curtailment conformism hackworks stubbornest subsoiling thetas sturdier ohioan vitalized ballistae aneurysms heartstrings debrided effacers impecuniousness inweaved rears physiotherapies lamplighter accusable racehorse damping merengues capmakers lapwings emphasize virological sideswipers megavitamin exportable armlessly dreamer gimpier cumbersomeness approximates durative bicycles yds counselled purloined hennas sordidness"@en ; + bsbm:rating1 "7"^^xsd:integer ; + bsbm:rating2 "10"^^xsd:integer ; + bsbm:rating3 "1"^^xsd:integer ; + bsbm:rating4 "3"^^xsd:integer ; + bsbm:reviewDate "2007-08-02T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-20"^^xsd:date . +dataFromRatingSite1:Review523 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product65 ; + rev:reviewer dataFromRatingSite1:Reviewer27 ; + dc:title "strives acidoses sardinians calculatingly grayness macaroni proceeds arsonic nontechnical inflammative hallucinates" ; + rev:text "pearter climes penetrative spiritualize scoutings aerially vegetated rattus buoyage flabbily nondenominational dishrags jewelweed latticework unfavorably headpins aerolites chancering testiness pons uncouthness sepaloid flans repercussive university transfigures sanctification glazes purged nettier bullshits investigating nitrifies misogynic fugging scarey pealed melder ranges unbridled pentameters rumors ascendable vacillated wormed perfectibility regroup herpetologic sociopathies privets empaneled similes currying sandiness dramatis receptiveness reengaged incineration straitest hurrahs slumped thimblefuls fussbudgets tonically parsed ligatures prepayment conciliation manipulates finalizes stableness dinged ratfinks scrimps caperers sonde blotches elides messes preeners histolytic dishful flowerer borings acetify reinforcers sculler waterers hews sturdily dyes gapingly worldliness miffy mooch chargers pealing theodicy colonelcies isolation eisteddfods replay outmode"@en ; + bsbm:rating1 "4"^^xsd:integer ; + bsbm:rating2 "4"^^xsd:integer ; + bsbm:rating3 "7"^^xsd:integer ; + bsbm:rating4 "9"^^xsd:integer ; + bsbm:reviewDate "2008-03-02T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-13"^^xsd:date . +dataFromRatingSite1:Review524 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product68 ; + rev:reviewer dataFromRatingSite1:Reviewer27 ; + dc:title "directories impudently intro ruthlessly herringbones motionlessness sharpens fluctuating tazzas wholewheat bicornes" ; + rev:text "alliterative masking workup gnars replays absinths detectives scullers annalist originality flensing neurologize polyglots recolonizes abbr discomforted mistrals hallowed baobabs contentedly plutonic opalescence blighter undrape emancipating grubs jabot mockingbirds impersonality mentioners sleighs gweducks postdate playlands southrons regluing hotheaded bioresearch underfeeds continuances embitters ascenders fistulae worsening revolver nonempty trigonometric boggling encumbers flyover mollified psychoanalyses sunless temporize unrecommended auf desalinates reembarks mentioner facies whizbang stringier stenographically disbandment darvon antibacterial arrestors flubbed perking admirable offpay recoiler crucibles chinless unpacked confiscations honoraries mastering neuritic pepper towies waggoning prisons primuses catacomb gappier"@en ; + bsbm:rating2 "6"^^xsd:integer ; + bsbm:rating4 "10"^^xsd:integer ; + bsbm:reviewDate "2008-04-05T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-04-12"^^xsd:date . +dataFromRatingSite1:Review525 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product70 ; + rev:reviewer dataFromRatingSite1:Reviewer27 ; + dc:title "ecumenicalism subjugates caps wallpapers misdirects elfishness vaginally disfigurement straightened clonk incarcerated" ; + rev:text "paupered protestors absentmindedly cinctures underemployment prompted simplification gutted isomorphs stubbiest centered wordiest calory selfishness ceramicists seismologists cakewalker foretell scofflaws prexies titaness staunches groundlings caravels generosities posher discontinuation progenitive programmatically supercharge bimonthlies bullnose intruding subcurators symptomatically flits retelling concessive misgoverned sightlier aweigh schedules blether undefeated ethnologic babbling dunking wetsuit claimable irreversibility boysenberry reincurring radiomen rimester choreographic undescribably wpm inconsequentially subgenuses shopman uninterrupted scuttling seders astronautics unspeakably hamburgers gratifies aspca degraded unaffected arisings shirking apprisers republica soave oviparously dictator schedular intellectualize"@en ; + bsbm:rating1 "4"^^xsd:integer ; + bsbm:rating3 "6"^^xsd:integer ; + bsbm:rating4 "6"^^xsd:integer ; + bsbm:reviewDate "2007-08-06T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2007-09-09"^^xsd:date . +dataFromRatingSite1:Review526 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product62 ; + rev:reviewer dataFromRatingSite1:Reviewer27 ; + dc:title "teamer fluidizing crudes fridges slyness herders cosseting quilts capriccio construer" ; + rev:text "broadtail deodars bumbler refurbished sotted avidities prattlers buzzes adumbrated acolytes gasping airscrews septette repressibilities moralizer tornados bolivian eductions coifs skiffs pates flavored ennuis mesalliance debunkers pressers lowlife tracked botanize disorderliness soddies ritzier equestrians shunting mutilative cudgelled urushiol droppings muddily vapouring alienating dowdiness kryptons inker entertainments earnestly squabbling retainment gonfalon tribulations readmitted mustering clearinghouses undergird bluepoints redheads blabbed stickling impeaching trustiest"@en ; + bsbm:rating1 "5"^^xsd:integer ; + bsbm:rating3 "8"^^xsd:integer ; + bsbm:reviewDate "2008-05-28T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-06"^^xsd:date . +dataFromRatingSite1:Review527 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product83 ; + rev:reviewer dataFromRatingSite1:Reviewer27 ; + dc:title "djin menstruates clamping aromas tousled trysts flops disestablish prospers" ; + rev:text "logwood ruralist subminiaturizes ganevs unsocial backdrops shrinking pharm careens fooling wager crammed contused burdens leered halloos durables sprinkling coalsack estoppel heightens covings southwesterners cuddies buddies superegos hockeys basher atonies lappets nonirritating augends impearls expiator squads chining pleasureful exterminated immersing fluking sexagenarians tensed scarfing chronologically premies deadlocks importations provinces cuckooing fusspots darvon chinked colonizers tabarded yawps embosser tabletting reddishness donations creasing killed wrapt rondeau versional screamer pulchritudinous isthmus mammas tupping abrogation severers mullioned piercers raining valvar thumbtacking baritones attractively oars dressmaking cayenned chubbily rigorousness flyspecks symmetrical fledging gally spindling drossy hedonic stupidly provisoes subcutaneously ethnologist cauliflowers coinhering pattypan esquiring commiserative audiophile unmarrying tams homesickness peatier pettifoggery sonatine felled tracks influents golliwogs scuffed estranging currentness occultly scrods negotiants unmeaning klatches recouping incompliance herring opens nonresidual summa quashed wifeliest holdable believers militarizes hallucinoses unoffensively upholsteries proteinaceous urinogenital corrugation concelebrates discing blenchers dreariness haplessness prefigures shoppes"@en ; + bsbm:rating1 "3"^^xsd:integer ; + bsbm:rating2 "5"^^xsd:integer ; + bsbm:rating3 "8"^^xsd:integer ; + bsbm:rating4 "4"^^xsd:integer ; + bsbm:reviewDate "2008-02-23T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-03-26"^^xsd:date . +dataFromRatingSite1:Review528 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product58 ; + rev:reviewer dataFromRatingSite1:Reviewer27 ; + dc:title "foregut marquesses bhangs alongshore" ; + rev:text "viridian bookman advertises skiddoos skirls smallness undiluted cushiest fissility tunisians individually delousing semicomatose ennead unseeing unaging th encages aestivating finales depopulate discomfited roentgenologist tunny opticopupillary overexpand castigated cladding conjurers blockhouses singlehandedly defuses dreidls philol ceramist dispatcher cordons limpidity alleluias ignorantness clapping osages innervated emissions allopaths droppings unaccomplished unpitied antiheroes convexly anesthesiology oxidants civicism laudanums titteringly inclosure moated coffering personably exogenously snoutier encountering basked hummed lamedhs intoners envenomization tickings backstroking flashgun theorising apathies jockeys odorants flowcharting pitheads unships gasbag endomorphic osteologically accountantship merchanted damnifying boundlessly surgeries contraindications player kummels glyoxylic serums soullessness repleteness bossies menstruous featherbrained emphasized headspring engraved skyman bluejay contorting relegable bucktail paramecia laminary snoopers spathes tramels whishes presumer demonian smoothy fussers unwillingly confiner roadworks outshine distinguishes bated slippers fecklessly conversing mein knapsacks contrasted recleaned vetoing smalls finales deemphasizing ramparted bolivians expositions subcellar elevator shares incarcerator spherically waffled catalyses wondrously dissuasive quoth sibilants nonautomated fenced procreated toxicities enquirer sheaves derogating seriates semisweet pantheistic euphemistically sleeting skirmishing texases repopulating"@en ; + bsbm:rating1 "10"^^xsd:integer ; + bsbm:rating2 "6"^^xsd:integer ; + bsbm:rating3 "6"^^xsd:integer ; + bsbm:rating4 "2"^^xsd:integer ; + bsbm:reviewDate "2008-01-31T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-03-25"^^xsd:date . +dataFromRatingSite1:Review529 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product80 ; + rev:reviewer dataFromRatingSite1:Reviewer27 ; + dc:title "limpidly scarified swiping frisian minutia sportiest narrates infarcts shopbreaker blankets apologizer frizzers revoker" ; + rev:text "sluggishness exaggerative rubaiyat phonologist cresses diptyca expunges avenges encroachment scurfs meticulously valorizes byelorussians nuthouses finking lacunar abbots spires stippled stigmatizing graciles unum soothsayers affluently menstruated wroth incases dislocated caciques thirsting gentling coffees interferometries lording idolater shandies unobserving detoxifies sealing scratcher settings feeler wormers gratae crapes nonenforcement strewers discretional cotyledonous orts cathedrals concierges reading rearguing aves monsoons defrays challises pops discursiveness honester brawlers necessarily demilitarizing veinlets abductions abided osteologies shanghais daybeds candlers leftwing holmiums turks invigorator orality touting ganglions windpipes patriotism obscurely standardizable potions seabed orthopaedic wirier pithed foreruns bolting trameling quixotries unforbidded"@en ; + bsbm:rating2 "9"^^xsd:integer ; + bsbm:rating3 "10"^^xsd:integer ; + bsbm:reviewDate "2008-01-22T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-03-28"^^xsd:date . +dataFromRatingSite1:Review530 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product10 ; + rev:reviewer dataFromRatingSite1:Reviewer27 ; + dc:title "airlifts advertising cabbies honorably roulade" ; + rev:text "sacrifices growlingly dowels barrener horning sorel inextinguishably rummagers sliverers medicaids joyfulness rungless stumpers handbarrow countenances chinkiest discase sleepyhead triadisms grating reconveyance redesignated gilds rediscount bighorns pried swallowing equivocators tatted avers chalets ascetically satrap detumescence duped crouching tollways scrimmaged tactoid displeases nuthouse androgenic hairsprays readying scepters bronzers lipsticks itinerants knowing stanchly reinterpret implications xmas abstrusest illiberal protectresses subdue headed conditione extinction tankships aluminums hematinic halloed dicasts hauteurs misterms mesquit heavily solarizing impressionist refractures oppugns ext crossways crustiest vulgarer asserted burying metering sneeziest coparents insists wintrier fielders underbid namers notification gravimeters railing spluttered zizzled goyish lordliness spumes flyman knavishly trouped tabularly vicomte bouffants dozened cants semideserts subsidizes insanity clandestinity unlawfulness spoilt"@en ; + bsbm:rating1 "1"^^xsd:integer ; + bsbm:rating2 "4"^^xsd:integer ; + bsbm:rating4 "10"^^xsd:integer ; + bsbm:reviewDate "2007-10-10T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2007-10-24"^^xsd:date . +dataFromRatingSite1:Review531 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product34 ; + rev:reviewer dataFromRatingSite1:Reviewer27 ; + dc:title "moneybag countershock cans coagulants" ; + rev:text "incumbrance onions hexyl agreement coopered cockled benisons washability mezquite dandified ribbed yashmaks conspicuously relishable obduction protestations tempus disputability hunched inviolacy liquefiers steppers unremorseful crimpers automating generalizer gamelans currencies petaled senescent dismantlement manuring innominate hostelries overwrites adhering limewater liberalization belligerently blubberers chlorous pasteurization harrumphs disarticulating unlocks prehistorically facilely harks howbeit unromantic disenthralls integrationist poolhalls brockets beetled ghostiest disgorge pendants sampler reviser overshadowing sloshing cannulas vehemently dojos houselights bouse millwork munificence radios"@en ; + bsbm:rating1 "10"^^xsd:integer ; + bsbm:rating2 "6"^^xsd:integer ; + bsbm:rating3 "5"^^xsd:integer ; + bsbm:rating4 "1"^^xsd:integer ; + bsbm:reviewDate "2008-04-20T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-14"^^xsd:date . +dataFromRatingSite1:Review532 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product79 ; + rev:reviewer dataFromRatingSite1:Reviewer27 ; + dc:title "protozoon lipolyses septaugintal uncommon shading bentwood younkers toepiece mislike" ; + rev:text "marse recanted backer shrives voile greeks unplugs priapic misrepresented edibility internees iambus refashioned forepart habilitate oysterwoman aerosolize carols psychologic cardiologic blueprinting trundles unromantic jurywoman reincarnationist enthrallingly harboring papillae quadruplets sullied succorers hailstones anear reiterations spawners underwriters flailing justing slipperiness wickiups zooids funkers decoding kabobs wheres tides banknotes thready peris preoccupation diemaker bluebell interrogates aquatinted paperers blockhouses stancher brawlingly calmer fording cooperators candidly commuting premixed nonvocational bewitchment dearest wagonettes swellhead focuses moonish uttering bedraggling doorjambs chiropodist nonproprietaries worshipping oscule orgasms somewhen ital brahmin stormily indemnities calculation ozonic aligner toms tittle reconvenes sterns curds fulgent edgeless overtrain misuses whiffletrees bicolour rudders qiana encysted"@en ; + bsbm:rating1 "1"^^xsd:integer ; + bsbm:rating2 "10"^^xsd:integer ; + bsbm:rating3 "8"^^xsd:integer ; + bsbm:reviewDate "2007-06-28T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2007-07-21"^^xsd:date . +dataFromRatingSite1:Review533 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product72 ; + rev:reviewer dataFromRatingSite1:Reviewer27 ; + dc:title "cello oblates bakeshop iqs immortals antecedence prohibitively" ; + rev:text "inofficial inturned peneplains silted wrapper bartizans vexes prankish byplays putrefy grogram novella thrombi redried garottes bedewed mystiques chieftaincies poults dyadics rappel countersigns outstaring myriapods immerses zebus shufflers redrilled rejoiced underrating delimitations householders entered overpass menacers gibbeting bodkin nonmaliciously toepieces superstitions cooingly heeling boards dwindling sheering caesuric mistiming recognize dismantlement overhanded prejudged incivil angiosperms gasped showiness shindies drubbings acetaminophen oceanographic papillae disembody confuted failures conventionalizes carboniferous estopped immaturely allotment rooster overpast tarnally twinkling williwaw croakers outcropping motifs curmudgeon decentralizations straws overanalyzed hydrospheres quizzicality pharynxes spalls gadgeteer neutralizers classifying tougher couturiere tropisms vrows opportunity hagrides suburbanites gogglier nonacademic piecrusts cuckolding clipper ridicules resistors engird obsolescently plainsman toddled mordanting venturous noire uprisen baguettes panatellas skateboarded pended gratifications providers solarizes jumblers barbel profited divulger wilders deformity frowned exuding rankest sharecropping wretchedness screwy downlink champing elicitation noninformative shotting oarsman puncheons ministrations canaille hacker pirates surceasing clodpoll casque adjuration blarneying tampered rheumier triangularly protist roentgenology ionizes unshelled constitutionally scarrier mitzvah lowish tauting boxers creaming peekaboos hazelnuts harrows versifies scrunch seedpod adulates matrilineal resifted impersonation congratulated mastectomies nondeliveries unmitigated lawyeresses palookas kelped conches soporifics cordoning cholla plectra knapper shower fails dikdiks arrhythmias familiarizes tubulate sauteing verged decorating niter balmorals centers haughtily inkstands grievously ammoniums highting"@en ; + bsbm:rating1 "9"^^xsd:integer ; + bsbm:rating2 "8"^^xsd:integer ; + bsbm:rating3 "10"^^xsd:integer ; + bsbm:reviewDate "2007-07-25T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-02-21"^^xsd:date . +dataFromRatingSite1:Review534 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product24 ; + rev:reviewer dataFromRatingSite1:Reviewer27 ; + dc:title "launders parkers legless reship" ; + rev:text "epsilons reinserts namesakes blamelessly sideward stones coopers cambial coordinations spacing pinnacling redefinition chortling dapperly reappoint obscurities puzzled unroofed turnspits reloans declassification swahilian olympus warfarins dharmas rifest oenophiles tempura illogics deferrals reverses milliliters joyance riptide zincky statuesque paleography remarkable excellencies plonk suspenses anapestic adjoins floosies pressured dripping odeons carroms radiotherapists thermostatic milker falters paten rehinging slavering shavers accidentally betroths preconcealment masturbator exacerbations wordplays clodpate clomping distributors ornerier ciliates tined scathed regurgitates entangled laserjet unbarred tipster upheaving wagoning firstlings collectivizes wingedly kitsch carbonizing defecation finalization typhous vesicles detoxifier req secularist gradable derivations acuter ovenware overexpands aligning demonise accordionist bespeaking waugh nonregimented shiverer abrader nimbi redbreast excreta halfpennies harmonization sexagenarians misplayed tangliest nonequals kneed heartless flagella superseded peaks infidelities trowsers aspersed mainmasts noggin repousses luxuriantly abusing heathers capably oceanauts knavery fluidrams slashingly obviating barbarianism subservience totalize fluidities vatted beauish mummified nonsubmissive enduring acetify seldomly proclaimers cultism pelts ammoniums inkhorns outage switcher highborn pompousness rectifying derivation commandoes decimating hussars plantains quadruplets jacinths lucently nastiness pardonable ess antinovel clangored hepatizes hitter worshipped"@en ; + bsbm:rating1 "8"^^xsd:integer ; + bsbm:rating2 "3"^^xsd:integer ; + bsbm:rating3 "10"^^xsd:integer ; + bsbm:rating4 "9"^^xsd:integer ; + bsbm:reviewDate "2008-04-07T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-02"^^xsd:date . +dataFromRatingSite1:Review535 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product58 ; + rev:reviewer dataFromRatingSite1:Reviewer27 ; + dc:title "bloodlines bruising critically allergenic aphotic dankness maniacs" ; + rev:text "chipper buncoing grandsirs demimondaine surfs gliders amused constructionist organizational slipper poshest linguine durably supernatural punishably sagier preponderance cowcatchers maligned eighteenths preconsultation gearwheels activeness potentialities correspondences cubicles divas shilled laicisms numskulls beefs superimposes conceptualists crustacea perceivably downrange storying tressiest fretwork tested insanitation totalling injudiciousness samekhs subcellars chokier rinsable violists stets addresser durability talkers cyanoacrylate meiotic gaveller lopsidedly analysed expresses garnishees cometic arabians geeks drenched numerousness roarer exchanger screes demurs geologer microbuses ammonias chivaree pericynthion mules rarefying subverter abrupter corpore spouses aggregative electrocutional manoeuver repurchase discontinuances entranced baronetcies appointing hollers tufty scrags cataleptoid inhibits ligatured transpolar smoothed epsilons roc disorient pastas trendily manque mineralizes upsweep crosshatched contradicting endlong shills adduct autre palmers bagworms counterpoising skulls trop strafing bespangled sustenant"@en ; + bsbm:rating3 "1"^^xsd:integer ; + bsbm:reviewDate "2008-04-10T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-17"^^xsd:date . +dataFromRatingSite1:Review536 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product73 ; + rev:reviewer dataFromRatingSite1:Reviewer27 ; + dc:title "photographic referencing peculations fluted cognise iberians takers preventiveness" ; + rev:text "breeziest depredations mensas stupidity limier taunted unholiest syphiloid wizening productiveness prohibitions playland scruffier misjudges divested semiretirement shakeout pervertedly seizures rexes salving condignly releasability machinist reaps orgastic mandril dietitian tallymen physicochemical welshwomen appellee teratologies bunter priorates dearths immunoglobulin dietitians prudence inquirer reformat oxidation jurywomen unceremoniously aidless renegade refocussed frowsy labyrinthine middies discomforted selectivity incriminatory rubying miscreants blooded discover crawlier days outmarching slumbery shipwrecks reamers poetries magnetisms splashers herbalist hereupon megaliths inadvisability respirable ratiocinations salesrooms penalizes automatize benefactress indecisiveness prelacies hydrargyrum ankus dovecots twattle dipstick familia untenanted transcendentalist dazedness cuban bountifully estuaries christened postnatal unexplicit nontransferable naperies deregulation promonarchists cubicles boastfully rockless compeller rheumatically prostituting quadrennium reblooming winnowed transposing administrates soarer sumos daimons dreaded pineries dictatorships grueling offerings visitant boodler aclu pended pedicurists stuccoers peeresses notedly highboys superintended jotter freebie"@en ; + bsbm:rating3 "2"^^xsd:integer ; + bsbm:rating4 "5"^^xsd:integer ; + bsbm:reviewDate "2007-10-05T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-03-04"^^xsd:date . +dataFromRatingSite1:Review537 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product54 ; + rev:reviewer dataFromRatingSite1:Reviewer27 ; + dc:title "vehicles outbound funneled borborygmies emblematical revolvers hotdogging bibliotherapy" ; + rev:text "redeem inturned recapitulated coloraturas supervision nuncio paced garbs photostat unobserving cribs ladles confounder budgeting heptanes zees moveless volleyballs areolate solemner upstroke litchi misplacement outhit noncombustibles alliterating comprises reglue disintegrators archdioceses disinherited biospheres evacuants pawning pickaxed squealing samariums rucksacks abhorrence boweled dagoba tuning hawkweed coffined resolutions headhunting statues preliterate nonsegregated battles peacocked commencement netting adsorptiveness arable giddily sectioning reruns gulflike carbonize flushing weald locators fuzzing embellishers nihilistically caries dichotomies falsies flagman amtrac ament nocked firebombs alate daring exhumers inversive surfacer outperform epicenter salivating songwriter outgoes coldly overfurnishing militates aery nitrile steelies orrery joined sporozoon dirtied temporizing seditionist halting puffins metaphorical assessors warpowers sacroiliacs"@en ; + bsbm:rating1 "6"^^xsd:integer ; + bsbm:rating2 "7"^^xsd:integer ; + bsbm:rating4 "6"^^xsd:integer ; + bsbm:reviewDate "2007-12-26T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-03-29"^^xsd:date . +dataFromRatingSite1:Review538 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product75 ; + rev:reviewer dataFromRatingSite1:Reviewer27 ; + dc:title "bullheadedness cubical booklets dustup dandyism slapdashes pouty infolded rewraps polyethylene cashed companies" ; + rev:text "bolsterer teeters univocals rewinder chukker disenchantments palpates unnerving forgets ridging voodooing lapful anguishes rivetting pulsions spital determinableness pampered smite vulgarness leashes pintos reutilizes halfpenny emetic soothsayers hedgerows jugsful grocers castrato imprecations crumpled toffy accusable feedboxes limpidness hotblooded perceivers lazying backwash worths broideries irised acquiring disproportionates dissevers encloser raves outbargaining eld businesses preoccupations aggrieves viscose importations planked slants sandblasting deactivations societies nurturer alchemies quartering quixotically explosiveness holts optionees sapphisms responsibleness merging spattering reasonableness uxorious forgetfully plunders reverencing falsified snubbiest reachable invocator windburn piping embarrassments trey courteousness buttered reconsecrates unimpeded orphanhood literates channelize sukiyakis unpreserved imperiums cavy firmly generalities paganist reoccupations uxoriously coronals scuffles speciating pontoon librates flirtier foulard threaded paddlings spines cardinalates rakishness bookends physiognomical packages refinishing sigmoidal sharpens gnotobiologies rassled uvula misbehaves torridly volubility carnies impalas calculational knifings barons scattiest mooing creditabilities wrackful faubourg fables nonrepresentational overtime puppetries genitalia nativities grads physicianly consortiums vixens petrols partible bartering clubs patterer slackened sparkish difficulties molecules bicuspids oviduct pigheaded shapeups skiddooed abbes renaming tollman hamadryad breezily archaeologic huzzaed buster airworthier collops illuminative zests craters pharynxes delimitating frescos glorying nervelessly osmotically revalidate pinesaps morphologies binaries piteously"@en ; + bsbm:rating1 "5"^^xsd:integer ; + bsbm:rating2 "10"^^xsd:integer ; + bsbm:rating3 "8"^^xsd:integer ; + bsbm:rating4 "1"^^xsd:integer ; + bsbm:reviewDate "2007-11-08T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-04-28"^^xsd:date . +dataFromRatingSite1:Reviewer28 + rdf:type foaf:Person ; + foaf:name "Hemanti-Suhaila" ; + foaf:mbox_sha1sum "df92c11b573a81b63868e74afca7cd62374bb" ; + bsbm:country ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-25"^^xsd:date . +dataFromRatingSite1:Review539 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product53 ; + rev:reviewer dataFromRatingSite1:Reviewer28 ; + dc:title "exchanger thesauruses submersing vials pitilessness sheepishly electromotive" ; + rev:text "oversolicitous monocularly mountaintop grandmaster critics chews gunships methinks encounters prevalently butterfishes friaries tinhorn landscaping uncorrupted balalaika katharsis assessed plundered descendants chansons renascence caladium variating dreidels swooshed weanling cosmetics etched drunkenly mirthless collocating personalize encapsulated miner titillated shelffuls laths thyrse fieldmice cigaret encephalic chairing staves andirons besots roystered stills serifs hopeless thesauruses swarmed physicked chewed acrimoniousness gongs unvanquishable blunderers irrelevancies canvaser waspily termites pacemaker northeners unmuffles discerns hulled predigestion housemaster unstoppable rodents grievant spryest ophthalmologists ribbers rammer desegregating onyxes macaws doc phlegmier deworm cassiterite ambidextrousness motivational towards anodally weightiness kabbalahs frescoers ghosty corncakes cuspid stalkers boxers potpies dispassionate gleemen verticillate victoriousness timesaving coppersmith stationeries rematch reapportioned harridans zygotic recooks reapplier protoplasmal lunars quiveringly hoodwink virtuously darwinist cadetship downplayed playact prophesies saphead glycemia tinman agglutination panelled warmers"@es ; + bsbm:rating1 "6"^^xsd:integer ; + bsbm:rating2 "2"^^xsd:integer ; + bsbm:rating3 "4"^^xsd:integer ; + bsbm:rating4 "6"^^xsd:integer ; + bsbm:reviewDate "2008-04-29T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-13"^^xsd:date . +dataFromRatingSite1:Review540 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product69 ; + rev:reviewer dataFromRatingSite1:Reviewer28 ; + dc:title "misleading handpick breeching pullet superscription longbows" ; + rev:text "purpling bussed outrush refried misdirected vapidities unoriginal cementer metaphysicians totalisms armistices asexually mushing kelpies rootlike pirouettes mutterer brutisms informational associative crystallizes jadish bluebottle outplays disabuse slating wiver tauruses leviers unvoices pulsates dalesman honorifics glorying outscore calxes tobogganist clematis nonadvantageous rebuilds ballista ostinatos holsteins photoreduction softhearted idling copper deteriorative mafioso uninflammable tieback depressants intermits toehold crematories journalistically sectarianism perplexed noisomely erects pretested juking reclaimed enchants upchucks scrapers engraining flatfoots notepaper towerier phosphatic semitransparent chemotropism tootsies animosities surprisingly stabilizing cholers eroses portrays maturated casuists sterilization tweakiest kiefs clawers estonians unbolted workboxes cylindrical harts hectoliter rehem housecoat millennial couturieres pedagogs reveling murks lightered fuck affectedly jagger plaiters charmingly mopishly varyingly spells childbearing printouts londoners woodbins handedness murderer kidnappers fustics interrogatively tipples cannabism reassume touter bods cramps ironical aimfully rightists bustiest softer athletically"@es ; + bsbm:rating3 "10"^^xsd:integer ; + bsbm:rating4 "6"^^xsd:integer ; + bsbm:reviewDate "2007-09-15T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-03-24"^^xsd:date . +dataFromRatingSite1:Review541 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product48 ; + rev:reviewer dataFromRatingSite1:Reviewer28 ; + dc:title "dedicated vindication forwhy distractingly tetanizes swaying brakemen hairworm wots pimpliest phonetics reline zaniest otologically" ; + rev:text "indiscretions verdancy dribblets westernized kentuckians unlovely fedayeen recitalists weathercocks abnegation brashy degraded enlarger ladders aetheric trave outpayment animo dixit derogations dynamometer rabelais chigoe rewarmed domestications grubbing dabbling policewoman hospices sprinkles buoyancies victimize fortuneteller flagellates undergone means twirled petitioning embezzlement entangled bigmouth inkiest insalivating poetries everblooming drawing afghani assemblywomen flooding ageing untrusty trivialities speakeasies stodginess elaborately obliquities enactive hemps neuters recallers bookmark legaleses replenishers anoints consubstantiation disqualification mitered garnishing nope disappointed adjusters tenderly replanting phalanxes awardee rednecks propagated possesses butyls devas egos woodworm collaborated whoreson replicated theoretical landed towheaded serigraphers lightnings rascally visualizations wastefully tribunes imbecilic peroxided accusations tictocs egoist restrings screes explosions retyping hiller pounds misname circuits bandeaus megalopolises cobwebby insets stubbed novels preorganization croaking cryptograph byliner leipzig hamperer surveyance mesozoan hillocky stoker bridging syncs capework manageableness plotters collectedly resister noncontroversially ideations incidentally paratroops laities knockwursts assailer eradicated undergirding munched peelable applications rooftrees slogger kanjis spunkies dalliers scurrilously undignified bihourly"@es ; + bsbm:rating1 "1"^^xsd:integer ; + bsbm:rating2 "7"^^xsd:integer ; + bsbm:rating4 "2"^^xsd:integer ; + bsbm:reviewDate "2008-01-21T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-03"^^xsd:date . +dataFromRatingSite1:Review542 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product37 ; + rev:reviewer dataFromRatingSite1:Reviewer28 ; + dc:title "dandily aplenty claptraps socialism heeders benevolence bentwood workweeks solarium sveltely furriner throttler stealings" ; + rev:text "progressives seabag decompensation slummier embay cumshaw aerodyne overscrupulousness femme harborage decidedly dapping rectangles beclouds hatter ennobles rumanian spoons bannock illumining truces yearlong lapwings chickening brutifies iranians unfeared jeremiads choppier psychotics enormously saluter resonances epiderms missilery rad parroters martlets sparklers unbridle imprecisely rappers soundly nacres imprisoning razz workingwoman desensitizing pickaxed piney middles biff bisected wharfed contrasting uninsured overexerting supermolecule impatiently rhumba expanding glissading bioluminescence doters hems asseverate evaluations windstorms nettlers abrasives geographers animation vegetated intrusions romanticizes sulfites exocrinologies resoluteness attempts cycled techies gusting hands hearted silages spryly mignons snowfalls jaundices rewarm beery wimble convulsively melanotic diabolo concessionaires catching charities sump uncertainty biochemist moisturizer digits finnicky preshapes commander tooled areoles bestrews malfunctions antidemocratic supercargo manuevers faxes cunners bannister flied obstinacies diverters ahorse raddles rotator galvanizations rhythmically mandatorily rallye reweighing boyo cabbie cohering hanking glazing eminences unreservedly smoggier astrodynamic biassed tequilas duskiness evert steaming wincing befriends amalgamating academically extraditing patellae biddies prettifying deciliters hopefulness robustly secretaries infrequently wiving cosmetologist bombers relieving torchier"@es ; + bsbm:rating1 "5"^^xsd:integer ; + bsbm:rating2 "3"^^xsd:integer ; + bsbm:reviewDate "2007-07-15T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-04-17"^^xsd:date . +dataFromRatingSite1:Review543 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer3:Product94 ; + rev:reviewer dataFromRatingSite1:Reviewer28 ; + dc:title "porgy parses arapahos flunkeys spiraling reletters omissive" ; + rev:text "predictively incarnadines mimed uneducable finfoots proconsulship surveyors sheriffs tanka oxters furores unscholarly believeth atmospherical extoll faille ascendance ormolu papyral chroming crudity pricier factotums maharajah overaggressive moralized launching footballs sublethal underwaist uprose charlatanry spokeswoman mycological cicerones steersmen expunger jetsom impresser cranched gypsyism reticulation voraciously individuality separatism moodier stockholders emended matin imparted hacked derogatorily tzitzis carouser gweduc relocations flouncier synesthetic malted faille skyjacking yoghurts visualizers eidos reassemblies nonclinically sarees barhopping comparable prosthetist unlading insensateness snowmelt pillaging artier perceiving enchainment muches chorales entomological towpaths headachy helloing alexandrines mortarboards cornices poring kazoos"@es ; + bsbm:rating1 "9"^^xsd:integer ; + bsbm:rating2 "2"^^xsd:integer ; + bsbm:rating4 "1"^^xsd:integer ; + bsbm:reviewDate "2007-07-27T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-14"^^xsd:date . +dataFromRatingSite1:Review544 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product27 ; + rev:reviewer dataFromRatingSite1:Reviewer28 ; + dc:title "potboiler sweetest niobiums fledgy ousters yapped" ; + rev:text "hooked unadapted philharmonics midwifing maladministrative conspiracies lindies dilations overearnest verniers ribosomal congoes photosyntheses sailable bombazine torrents nuggets embarkations rials whitener cropland indol pennines exhaled combated disarticulating microradiographical tropics outflowed coloradan cannibalism smiters pesterer disassociation bowled aortas quintuplicates fastback euchring cargos kibbutz cervical iroquoian substring retrial bandbox passings seismometer enscrolls racing quippish shouts overdrafts jazzily cs syllabifying whippers officiator uplanders notions upsurging gleesome wafers tattletales facelessness stollen scruples orgies reciprocities cetacean spottily flappiest automates mastectomy lurched shunter bootleggers treading commodores reactivating squarely recognitory eggplants polygamous puffing repacified oxheart iterations reset abuttal shelterless joins compliance matching frigidities collat outmode perambulations backbite quotations headbands plectrum imponderableness gavage vivifier equestriennes junkyard clothes reendows laryngal fastnesses executives enlistees fatefulness nameless prepacks sycamores headmost starker trustwomen yipes wizened relationships unhinge mows proofs summoners abuzz emotive pornographically impalpably towability propmistress parceling silicoses excessiveness subgroup fosses flappable radioman preschool gushes cogito grimily anteceded patters deviltry drumlins overmatching beguilements jemmies sherifs"@es ; + bsbm:rating1 "10"^^xsd:integer ; + bsbm:rating4 "1"^^xsd:integer ; + bsbm:reviewDate "2007-10-27T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-02-12"^^xsd:date . +dataFromRatingSite1:Review545 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product40 ; + rev:reviewer dataFromRatingSite1:Reviewer28 ; + dc:title "encored bluebottle stores emollients midways obstreperously fugitives metacarpal dejected stewbum aerodromes" ; + rev:text "unfaithfully turgors scopes regressed wilted overlying tranquillizing declaims mannas drafted nonowners blowfly zikurat unscrupulousness rapids scalloped torcheres pedometers quintals stints smoothed ambulance swages terracing distinguishes honourers communists wakikis granduncle discomforted hispanics dangerously haggis phototherapy disorientated balking frettiest trigraph pewterer beveler academicianship newsdealer spaceport predicting swapping erecters duteous gestates hoboes produced puller byproducts animadverts acerous detrital cookshops envelops abbreviators pegmatitic activating sowbellies tallowy rupturing tollman leaderless stupendously vapory guided motioners romancer quizzing"@es ; + bsbm:rating1 "6"^^xsd:integer ; + bsbm:rating4 "6"^^xsd:integer ; + bsbm:reviewDate "2008-06-13T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-13"^^xsd:date . +dataFromRatingSite1:Review546 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product62 ; + rev:reviewer dataFromRatingSite1:Reviewer28 ; + dc:title "consomme chapped creasy shires rummer succored delfts florescence doer caduciaries overworked exosphere limned" ; + rev:text "amortize tackified equilibrating lactoses administrating indicting obdurating eurodollar algas mechanized sacredness nonhabitual finbacks unfences somberly decrying heedfulness supervisorship feuded tonically artiness urbanites impregnated tonging laccolith heralds faring requirement birthing starver fledging preheats laddered scarfpins accelerative aggrieves disbursing delegacy strumming phenotypes translative diverticula materialness maximizing unrhythmic jambs hypodermics charioteers swabbers screwing piking chucky parroted variabilities crawliest hypertonicity outboards twaddling gonococci unassorted manipulator bolstering seining offerings deoxygenating fragged subsystems anthracitic hairweavers clitoridectomies pres germaniums hairstyles larkier mulches monoplane parboiled"@es ; + bsbm:rating1 "3"^^xsd:integer ; + bsbm:rating2 "2"^^xsd:integer ; + bsbm:rating4 "2"^^xsd:integer ; + bsbm:reviewDate "2007-11-11T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-01-17"^^xsd:date . +dataFromRatingSite1:Review547 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product23 ; + rev:reviewer dataFromRatingSite1:Reviewer28 ; + dc:title "cyclometer windflower supervises planarias diffusor bunkhouse marrows parachuting cologned ammonify devilkin immobilization misreports" ; + rev:text "faithed foursomes mandible simps candlepower bleaches thanatoses savagely tonights subfunctions truffles deanship pined rewardable arctics giggly upswept noetic noteworthily virological chairpersons intramural fountainheads heliograph gaol cuttle lives opening untangling elegantly meadows approbated sarcasms witchings fraughted legislators injecting westings encipherment departmentalism gumboil blabbing pickaxing onerosities flambee cichlid geed decongestive officially synthetics skunking modulators loathers wits forebode appropriations remakes"@es ; + bsbm:rating2 "2"^^xsd:integer ; + bsbm:rating3 "8"^^xsd:integer ; + bsbm:rating4 "9"^^xsd:integer ; + bsbm:reviewDate "2007-07-16T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2007-09-09"^^xsd:date . +dataFromRatingSite1:Review548 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product68 ; + rev:reviewer dataFromRatingSite1:Reviewer28 ; + dc:title "antiliberals ragtags heist hackbut resuscitation outstretches osmic justing profounds filliped implementors idolatrous" ; + rev:text "eulogizers polymorphically rationalistic confiscates agist agglutinates surmising medusoids gownsman flawlessly modulatory bourne virilities beigy corsages straddled defected muddiest pbx megacephalous unblinking formulator foxiest mascons jorum telescoping bacons mantuas counts rumrunner fluidal homeyness picadores applauders preachments dryly jacobin instigatingly cloistered dissipators hefts storybooks strangulation restitutive jostler falsities unlaying nonliturgical machetes spooned fluencies substitutability cert sayonara maundered masturbating snufflers reexhibited overrighteously carefuller plainspokenness sheenie demoralizers bombed tainted modiste frijoles exemptions crape reincorporating kl pettifogging regicidal malted lynching delimiting chivvied unfettered robotry menaced illogical cleanses dilators studdings extrapolation aromatics polaroids insurgencies silkiness libidinally auberges cutups reutilizing observances tyros duplication fugs senses otoscopic twinning meddlesomely palates connoted coordinates falloffs groundlessly tutelar ebonites deluders characteristically welfares newness instinctive concoctions twopence juries biographers preliminarily imperfectness crushers derrieres dratting premeditation hereinto rolltop venturers chains adrenocortical watchmaking overheat pastellist janitress biotelemetries stoppering torte strumpet raptured backer inned reprogrammed tomcats roughhew recipes outproduces savvies panicles emoluments photocompose overcharged hiraganas nounally"@es ; + bsbm:rating1 "7"^^xsd:integer ; + bsbm:rating2 "8"^^xsd:integer ; + bsbm:rating3 "5"^^xsd:integer ; + bsbm:reviewDate "2008-05-25T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-17"^^xsd:date . +dataFromRatingSite1:Review549 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product86 ; + rev:reviewer dataFromRatingSite1:Reviewer28 ; + dc:title "alginates intercapillary fricassees banzais drudges dought jinns" ; + rev:text "hospitalization nymphos reconsolidation fora incitations intermission tragediennes zoomanias trades gainfully ferniest phycomycete pinnacling uncompounded arriver diabetics slithering enfeeblement miniaturist rayed sardinian interleaves redoubt scuppering interlopes combining quartes baric zebraic drudgers galls latinized counterinsurgency fitments dissuasive pixieish cupreous jackals ladybugs hushedly calderon recharters reinducts traveller jingoist geomorphology plink mythologies updates stupidly bestowing congenitally localists moory prehensile severity strangered saintlier overcooled cousinly noisiness holism reemerging resee presides overdosage productively debrided eponymy vouchering disbandment concussed personative magnetizable repriced cybernation foredecks conserving adverbially affixes hearted botching cooption bantling sadomasochism tiffs casuists permanence quavery scrutinising indulgers peccadilloes ruttish slabbery unforgettable buncoed friaries gestapos hacker dentines ooziness munching decoyers striating ope pillories fleets uncles listings dunner approved chondrite gnotobiology corroboratively incognizant schizos loadable dustpan denatured temporized fishbowls inchoate counterweights hondurans bettas dissuading nurses reckoner"@es ; + bsbm:rating1 "5"^^xsd:integer ; + bsbm:rating2 "3"^^xsd:integer ; + bsbm:rating3 "10"^^xsd:integer ; + bsbm:rating4 "5"^^xsd:integer ; + bsbm:reviewDate "2008-05-25T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-03"^^xsd:date . +dataFromRatingSite1:Review550 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product78 ; + rev:reviewer dataFromRatingSite1:Reviewer28 ; + dc:title "democracies electroencephalographic oriels minuends enjoyably submitter mitigators multilingual commerces palpitation waterbeds caustically otolaryngologist munitioned goring" ; + rev:text "landslip grasslands mineralogist muled saunas amputator scats livened robbing areal feltings sweetener determinability thermoregulation stuffing manos reaccents confirmed ceiling aftereffects finochios berthing buoyancies tonsilar beavers motels greased senses enjoiners pendently menageries bimester twiggier measures slurped zanyish godship rangelands subagent typecasts twitched augmenters malls coacher sanitaria condores satisfiable distr intersexually arsons nonfascist beakless charms yakking chirrupy serotypes crotchetiness inexactly rachitic overemphasize prodigality thuggeries nursers harnessers heterodoxy disarranging faculties nonproliferation getups processes emancipating saharan disbarments overshadow trochaic alphorns inly appears destruction calipering derailing fetters tumblings crinkliest fugitives folkmoots anxieties widest darnedest fritted hydrostatics hatters kindheartedness kayoed precognitive combustibility darkey witted mastering foliages accommodatingly setbacks fibrinous nankeen borzoi chantor pupates mobilize dominator grafting sisals ghostiest shindies parricides indentions compos disquieted bads quacky competing condos kroner snowballs mystics logicized misdrawn invalidly batrachian beaus unsafety overspecializing comportment untrammeled readerships overshoots develope bluegum ponying trunks sugarcoat indites manicuring phantomlike confesses massaged hullos espousals bimetals declined undervalue expresses boches commingles swivets squishing blowsier secureness followup parenting expectorants hailstones negativing ineluctably goaltender flavorsome kyries decapitate defies accouterment accused impurity dieting dribblers mismatches bedazzled afterdecks areolas romanism tawniest stews absolutely binds bluebell toxemic amaranthine attestant infidels whitely compensability initiations"@es ; + bsbm:rating1 "1"^^xsd:integer ; + bsbm:rating2 "3"^^xsd:integer ; + bsbm:rating4 "7"^^xsd:integer ; + bsbm:reviewDate "2008-02-21T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-04"^^xsd:date . +dataFromRatingSite1:Review551 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product8 ; + rev:reviewer dataFromRatingSite1:Reviewer28 ; + dc:title "unclerical equalities probes fustiness loungy disenfranchises shawn prettiness solecized flume knackwursts infringes thrills" ; + rev:text "uncloaked superposed equalizes stereotypies arkansans migration rehearser individuating speculators tonger yodler miscut runner vaginally irrefutability fathomable folkmotes benevolence nonidentity mandolin thirds aerates rationalizing rhumbs receipted dictators pinkness ventilates nitritoid ploughing infirmaries edifices grueler dioramas disintoxication gradually sandbank represented correlations yowls dissolution bighorn depreciatingly hophead persistency eroded letterings mimes clangor planters mimeoing nagger spues cemetary menstruates nonabsorbents tympanies swindleable wraparound landsat alaskan longhair lapser clothespress spicas landsmen realising cryogenically spanker concertizing outskirt rebill llano deadpan dehypnotizing hookas overnight moslems beefeater adductor nefariousness alopecias oblations hoboed releasers counting sunbows tibiae waxings retails animated confessions callings greco decrees fantasying gladiola urbanizing epicanthic stroker bestowed overlordship commanders vindictively vernalization clamps blockish unpreserved unearth entertainer commiseration rabbiting assembles unties stales risings providing jugular rottenest fingerprinting deceptively sangha camass gnats videocassettes personalties renderings suppurated spectroscopies nonliturgical geckoes macaroons horded benumb nodus grecians miaow scouted cymbalist abjectly graveling resharpened asphyxiated funding redundancy satyric decagons hoorahed cozens mottlers dishtowel teratological pasts pilothouses disserts headfirst thoro shorn scuppered"@es ; + bsbm:rating1 "10"^^xsd:integer ; + bsbm:rating2 "6"^^xsd:integer ; + bsbm:rating3 "10"^^xsd:integer ; + bsbm:rating4 "5"^^xsd:integer ; + bsbm:reviewDate "2008-04-15T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-25"^^xsd:date . +dataFromRatingSite1:Review552 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product31 ; + rev:reviewer dataFromRatingSite1:Reviewer28 ; + dc:title "unfenced intermixes desecrated monographs synovial resorters gabbling wolvers" ; + rev:text "fleabanes discomfiture fideles supermini imperiously ideologize noms ravishingly wielded marshaling racquetball nonintellectuals domination totters gadabout immersions footgear saturation lithuanians cryptal confluences gainsayers timelier alleluias woodcarving estates snuffiest crepy dehumanizing radome bobbinets periodical obsoleteness attacking nocks fans glibness supernationalisms plasters lazies paling chemotherapeutically biorhythmicities cliquy postpones elaborations baroques nonwhites mediator manhandles bogged temporaries mellowly enterers inactivating stopwatches innocenter taboret biodegradability weekly invalidated orangeries saltires scorifies convoker northerns escrows deicide explained hairpieces unbelief dalesman pratfalls flummox rusticators roust draughtier melton aspirants recoining ferrety inexactitude henhouse coldly dashingly waggeries infiltrations coquettishly gropes rakeoff subcommissions trams unsound deanship nomads belletrists ostracized presynaptically flues subclassifies dermatitis bootleggers ballista equability genocides pneumonic venatic engird punny nearing parroted fiestas insanities schoolmistresses enumerators unswept teleport loots overviews myriads knottiness neoned sync swale reposeful resisted charter squawkers impingements stoniness unthroning blenders choicest sticker pressoreceptor shamanic repeatedly atrociously wretchedly engirt mudders hermitages swearers neckerchief plunderer assiduously peculates centralization stashing hampered pawls spunkies barked mainmast corniche alefs fibular gowning flats kerb centime toledos ragtimes stentors coagulator erectors mellifluent trifurcated cubs zoophyte elatives exactingness chanteuses nominatives bonneted assertive abacuses acidified workbox locoes strengthens volplane reconverting surly enchanted aggressing acting catling"@es ; + bsbm:rating1 "1"^^xsd:integer ; + bsbm:rating2 "7"^^xsd:integer ; + bsbm:rating3 "10"^^xsd:integer ; + bsbm:rating4 "3"^^xsd:integer ; + bsbm:reviewDate "2008-01-13T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-02-10"^^xsd:date . +dataFromRatingSite1:Review553 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product49 ; + rev:reviewer dataFromRatingSite1:Reviewer28 ; + dc:title "resubmission teleported chitin copping taped outdoing tricycles" ; + rev:text "intersperses ruined precipitately viscidities militating hellenists natality onanism reassignment doctorates brachiate hawses beefs semiskilled rumpling paroles antinationalist tearfully bets broadenings mountains craals corrugators beheading whimsicality finochios spurtles tribally reelection corneas missilery remarry mullet degreases attributives collapsing carbonation trumperies reiterates rhythmics hutting mustier emceed vaguest worldliest pedros ladybugs distich tranquilizing lupins outstripping yodled combines shorthanded nearsightedness shirtmaker charbroiling prosit compromising fernless reboil exurbanite wantoners sniffier gyms muzzy quarrelers bringer magisterialness venturis draggy cithara disguises aw dismaler loaners noninformative razing gambits happened varnished unincorporated simulant acrobatically slalom nonsurgical decistere sleepiness calves bountied pyrethrin nuthatches esthetes kleig tetrarchs nonfactual safaried nips revalidate boneless polder brawnily druidesses corespondent skydove reckoned desalter nonconvergent homilist recede petrels absents"@es ; + bsbm:rating1 "10"^^xsd:integer ; + bsbm:rating2 "10"^^xsd:integer ; + bsbm:rating3 "9"^^xsd:integer ; + bsbm:rating4 "10"^^xsd:integer ; + bsbm:reviewDate "2007-10-13T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-04-10"^^xsd:date . +dataFromRatingSite1:Review554 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product47 ; + rev:reviewer dataFromRatingSite1:Reviewer28 ; + dc:title "staunches flagpoles gluttony frow copped glutinously grandnieces beseechingly hotblood banging whelps pokeys precognition mistier undulates" ; + rev:text "botchery insured reenlistment galores rateably darkey leukemics lagniappe punches counties boggiest interlining quixotically confides curvatures cl magnification cullied drearier lashed cupped mechanizers cots presents eftsoons equalise somewhen yachts pennyweights tenements dorm insusceptibilities remounted bumbled fingerboard rallyings muddler decolonizes photometric prances walkaways windsocks yuccas natally xxi fluoroscopist mesas fencers churns presynaptically touchily slandering dually astonishes promisor tickler steadiest sprawling buries unresponsive seines videos printed undiminished scenically breviaries lobbing momentously ferociously vinal"@es ; + bsbm:rating1 "3"^^xsd:integer ; + bsbm:rating2 "1"^^xsd:integer ; + bsbm:rating3 "4"^^xsd:integer ; + bsbm:reviewDate "2007-10-22T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-02-15"^^xsd:date . +dataFromRatingSite1:Review555 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product50 ; + rev:reviewer dataFromRatingSite1:Reviewer28 ; + dc:title "mauves tensive hotels ricking woad enfeoffment overloading outwaits distended twixt propmistress" ; + rev:text "pros reprising hydrogenated pardoned deludes laborings overgrow dreaded masks exploits infused brunching renowns ratiocinates accusor shilling ideologically enrobers futurologist steeds cheerfully anticlimactically garde ever freewheeling defilers darner overfly pinstripes mandolin conscienceless kneaded outputting bistros boomeranged junkyard sporrans winsomest nothings multiples prosecuted contrivedly oesophagus preliminarily friskers wirework sending predigested aeronautical basinets canvassers prefixal septuples olibanums perforation lunarians handwrit wooer whittled bantered shorteners baked rebuffs orangeries antiquation rubicundity recoil abortional replication disaffected cherubic dauby fervency unaspirated packets"@es ; + bsbm:rating1 "6"^^xsd:integer ; + bsbm:rating2 "8"^^xsd:integer ; + bsbm:rating3 "10"^^xsd:integer ; + bsbm:rating4 "5"^^xsd:integer ; + bsbm:reviewDate "2007-09-30T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-02-19"^^xsd:date . +dataFromRatingSite1:Review556 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product17 ; + rev:reviewer dataFromRatingSite1:Reviewer28 ; + dc:title "rebroadening fevers preordain peavy bursar northings gainfully avoidably washrooms sorbitol former impeder spurs" ; + rev:text "readmitted ripplier apeek calcareousness leitmotifs seventies lollop rectos unmedicated audits outstretched recompute installed monitors matutinal stalinist tripodal mammogram exuberance prename sentineled spectrums pathologically brutes paunchiest pipsqueak dialyzes uneducable reendows sidestrokes maths epidemiologies poshest monasteries asterisms forewings addling asymmetric lathings childly busies savaging reproduce berm panning traditions buttresses renegades wheezes etruscans staphylococci inedible patentability investigatable eking intangibly plaice overtone dummkopfs interregna militantness inseparably oracles solstitial dollars transistorizing mystifying tungstens pulps pressor shoppings scintillation sayers scrawled tories overcooked lienal stagecoaches bribers kebabs studding weldless reorientations clericalists"@es ; + bsbm:rating1 "7"^^xsd:integer ; + bsbm:rating2 "5"^^xsd:integer ; + bsbm:rating3 "10"^^xsd:integer ; + bsbm:rating4 "8"^^xsd:integer ; + bsbm:reviewDate "2008-05-16T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-09"^^xsd:date . +dataFromRatingSite1:Review557 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product16 ; + rev:reviewer dataFromRatingSite1:Reviewer28 ; + dc:title "agape headquartered amalgamated embezzlement megalopolis thumbing manfulness countersign stertorously truckers ruglike castigates" ; + rev:text "meprobamate wormwoods rovingly detailing deifying titters semiconscious louisianans uncertain pluralize rarefier congers belted tremendousness embossers lumpiness flossier telephotographic grandam seabeaches indescribability lighted foppery encages warders gript liftoffs helming tipper lividness tyre cryogenics influencing pilose perihelial churchlier curatorial tufty aggressing heaviest bishops carbonating devotedly craziest fidelities tobaccoes arithmetical corrective liveability caracals syllabifies rockfall"@es ; + bsbm:rating1 "5"^^xsd:integer ; + bsbm:rating2 "5"^^xsd:integer ; + bsbm:rating3 "2"^^xsd:integer ; + bsbm:rating4 "6"^^xsd:integer ; + bsbm:reviewDate "2008-02-27T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-15"^^xsd:date . +dataFromRatingSite1:Review558 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product18 ; + rev:reviewer dataFromRatingSite1:Reviewer28 ; + dc:title "expansionists blabbered secularizer refashions casas cliffhangers ayatollahs mahatmas reasoners molestations swampers subregions trellises" ; + rev:text "submersed distiller lessoned overheaped paradoxes notepaper trapdoors tenderized reflectors sauceboxes wrynecks malthus nonmigratory ripost herrings forseen hollooing listing fiver agreeability setting repossessing irades callback broacher fancifulness imprecating replated skeeing niggler dialings procured tromped broacher disarrangement soddenly oscillometry finalizing bacchants mewls nonconductor grounded denser hexad rediscounts dustheaps metricizing carhop hypnophobia decalcifies undocumented fittable vocatives creped vivant tablespoonfuls curlily occidents bartering limitedly galloping futurist cameralist presumers velum baselessness bas spurns ruing unperturbed takeout refuted periwigs fifes tormentingly censorable spadefuls scraggliest int unverifiable protestantism loblollies olympiads observational disagreeableness egalite fulfilled examinee homeyness localizations notifies liberators revolved leaded jingoisms underpins dormouse hangaring swinge sergeantcies densest maizes ethylates riel carbonators peduncles brewers binders atrophies cleaved cliches woodcutter chowed louisianans swatches disembodies gutta bumpers onanism enduro doughboys squawking gluer reobtains chucklers haymow procrastinators staves humidly remove nauseated frailness patentors reckoner tincting dopes diademed dungeons displaced verboseness cinctures overinflating supplicant tabulation overcast ilia otoscope comparable lustring deckhands scheelite terribles prelimited bayonetted caissons raftage mistrals multijet biomicroscope announcing panzers tonners lesions fallaciously centimo inked animadversions contending rewarders rubdowns reducibilities confoundedly aspiring transitional arbitrations rhythms damnably crystallographers improved looper exaggerative oddments spacewalker smeltery beguiles frizzled quavered preconcessions recycling calorically disassimilative quarantinable firsts fustier harnessing"@es ; + bsbm:rating1 "5"^^xsd:integer ; + bsbm:rating2 "9"^^xsd:integer ; + bsbm:rating3 "7"^^xsd:integer ; + bsbm:rating4 "2"^^xsd:integer ; + bsbm:reviewDate "2007-11-24T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-20"^^xsd:date . +dataFromRatingSite1:Review559 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product37 ; + rev:reviewer dataFromRatingSite1:Reviewer28 ; + dc:title "undiscernibly armors diversity isomerism trumpeted felicitator allowable potterer" ; + rev:text "bodywork engenders unfenced deodorizer weds toaster outdodging sharesman bawdrics respires asphyxiates cadmiums quacks overrefined vuggy looseness eyebolt provoker audiometry firebugs rustication resuscitated humidities trouncer septuplet glories austerely defats monoplane effacer defoliations danegelds scammonies denials homographic seignorage finites degums counselling affrayer focusing bridgings beggarly recognizable fluorinating sicced secants acidification orgastic sizeable receipts amphora bedsore altruists arbour cornice cryonic microgroove nonmechanistic eructating joyfuller corrugating somnolence axletree delivered emulated specificizing bespangle cradlesongs graphs gyms rascality mazurkas naivetes advising overoptimism malarias advisement kiddo rents subprincipals caravansary unfiltered reutilizations doors nymphomaniacs estoppels prepped forewarns surroundings singleness gangrenes blazer overturned chorused overcomplacency reflectively harbor synagog stuccoing overbaked reaffirmed bitchier guyed indiums abidingly enveloped extrapolated purpler takers unhappier pekes apposed embosoming timpanists parker antineutron equerry wherry hydrogens spinout identifies overstrict chasing refurbishes isostatically kraal capitulates blent superannuated disinterred stoical battles undebatable ceiling darns fearer pacifies insusceptibility brushoff allegiance cuticle tossup woodiest dandle tennessean moderatos curlews rooting subvocal czarisms damasked isobar chansons haoles raggedly"@es ; + bsbm:rating1 "6"^^xsd:integer ; + bsbm:rating2 "1"^^xsd:integer ; + bsbm:rating3 "10"^^xsd:integer ; + bsbm:rating4 "7"^^xsd:integer ; + bsbm:reviewDate "2008-03-06T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-01"^^xsd:date . +dataFromRatingSite1:Review560 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product43 ; + rev:reviewer dataFromRatingSite1:Reviewer28 ; + dc:title "flummoxing olfactometry pinks analogically lippy overprinted dossers cuttlefishes poulticed endbrain cancellation escudos geologically" ; + rev:text "kirks refusing ectoplasmic badinaged reliantly reprobe howlers figs youthen incidents litterers fastidiousness telephonically imaginations seditionists backrest beeswings mimosas retinted songfest peacemaking culpableness vomits meerschaums postfixing geol stinkards vertebrates bewaring suspectedly reprimanded machined stunted distension miscasts flashbulbs koshers leapfrogging jackleg uncover myopically toned vamoosed globularness insolation gruntled fumigations gesturing cts scandalizes stylizer precondemning cassowaries currish cubans ravishments appeared philanthropists entangler detachable coated scabbarded rheas catted eviscerating daunters reletting taunters calumets ascenders adumbratively bountifully deviator becomes souped plebeians bunches doomful conspires unpleasing incontinently snailing thymier districted jettisoning creaking reweaving handholds footway supplantation disjuncts hangups macadam botchily trifurcating mossiness miffing decentralizing nonunions signalled crenelation minted presaging unlearned buckhounds detrained restrengthening goodlier autobiographies reinvent gusted calipered declinations runagates verdantly neocolonialist zonked smugness counteraction helotry lumps thorned improperly sickening juicier tumuluses savorer muttering homeless moiling obstetrics barques objection compeers skilful travailing theocratically armlet tinged alluring reassurances conjuror insurgencies intensest dominie meow rectally dewberries bowered tenters standing palanquin mechanically reproductions haywires obstetrician resources impenetrableness muggier affixion subpena militarizing schmoozes aviaries"@es ; + bsbm:rating1 "10"^^xsd:integer ; + bsbm:rating2 "2"^^xsd:integer ; + bsbm:rating3 "6"^^xsd:integer ; + bsbm:reviewDate "2008-02-18T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-03-26"^^xsd:date . +dataFromRatingSite1:Review561 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product49 ; + rev:reviewer dataFromRatingSite1:Reviewer28 ; + dc:title "renograms bimesters lowlander amortizes untrimming generator" ; + rev:text "recleans acquirement overpessimistic purposely lupus fattish nonobedience nonferrous foreshortened middles confuted alcoholically pourboire snottily bulldogged stipplers suppurating unblocking kevels disgracers bounces sunniness boxwoods quatorzes laminas ley tabulating mentalists frameworks wienie skimpiest fixer cherishes histing incumbering hallower christianize relights moderated hustles eristic perusers mates amused lacked swabber panache canopying reflexed tacksmen bickering feasters fortunetellers superminis predestinating krait clams dilating foremen scorners squish endnotes cheroot regloss anaesthetic relique bloused dazzles poulticed radiographer firebird ingests harmonies erosions pleuritis monadisms fluorites flagellations ossifications regrettably redistributes sponsored fizzier feedboxes culminates losingly sees effaced coloradans disagreement mermaids puddlers farcers siphoning endozoic crumblier ovoidal brasiers immunologic magisterialness gruffy nevadan divagation frumpier cryptographic pearter cumins whoppers pitifully discontinuance gestation rennin visualizer kneepan gasless liberalizes scarred plumber antielectron nestling thearchies discussed semiretired idahoan inevitably apartments misdirect satrapies hydrozoan hewing lacerative notched refit unworthies bandwidths hardheadedness apers radioisotopes pursuing orchestras spanning curatrix apoplectically murdered kilobytes geum pseudoartistic valiancy foamiest displace fanned"@es ; + bsbm:rating1 "7"^^xsd:integer ; + bsbm:rating2 "10"^^xsd:integer ; + bsbm:rating3 "8"^^xsd:integer ; + bsbm:rating4 "4"^^xsd:integer ; + bsbm:reviewDate "2008-03-16T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-04-17"^^xsd:date . +dataFromRatingSite1:Review562 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product69 ; + rev:reviewer dataFromRatingSite1:Reviewer28 ; + dc:title "ameers decliner upstrokes insurgents kludging stiffs bestriding applicatively prothalamia striding potation ensigncy gravidly sanctum" ; + rev:text "bowels legged electorally locker hypertrophying overarm propounders unlaw clubs drouthy pneumaticity sensitized volplaning wats uninformative sweepstakes mahouts applaudable landholding overrank runout leopards cryptograph disarms exactly gondoliers misappropriation unfazed fellations cubbies substance reembodying blended squalidness tressiest umbel queues onboard chuckholes carnivores sieged ballyhooing typecase positrons peritonitic schedular mopes laughters meanspirited lozenges curtailing seaweeds yappers benzoic natality"@es ; + bsbm:rating1 "5"^^xsd:integer ; + bsbm:rating2 "6"^^xsd:integer ; + bsbm:rating4 "2"^^xsd:integer ; + bsbm:reviewDate "2007-09-08T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-01-20"^^xsd:date . +dataFromRatingSite1:Review563 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product10 ; + rev:reviewer dataFromRatingSite1:Reviewer28 ; + dc:title "hoosgow proclaiming deathblow valkyrs" ; + rev:text "lindies mutability lames saints eking predesignation tutelages boarders manas anyways pasting pungency stuccoes immodestly tantara removers championship seizins reinserting trifolium tangentiality uncrossing deliverable laboratorial unacclimatized rescript plasterers stepmothers instants solves chimaera mender forecasters evaporation prissiest repacked astringents multilingual beheaded necessariness cables friendliest stratous flirtatiously dogey treacheries mutable nebulas masterwork stockkeeper purports frogs conductivities rehabilitating sundries arteries scrofula truelove coredeemed smuttiness silking flatterer growls beholder crispiest admirer apparat tsetse quantized cultic windowed ennoble homburgs precariousness sylphy keratins amalgamates coneys irrupts videlicet shimmed recompensable humoring politicos hypnotizing timeserver ravellers macerater unsinkable photosensitivity thymy footraces fiddlesticks subservience greased quibblers foots bareness fizz displayable zebroid ensnarling daystar spleenish reargues robs quisling expiations trolleys impolitical starches catalpas antiliberals catenating redistricts dilapidation charbroil gavot weekdays interrupters unintentional stumbler cunningly instructive stertorous boomeranged thunderously escudos interstellar collaborationist peradventure politicos drapes amoretti unplumbed escaladed rained spermicide wettable intentness mikados windfalls entailment resows hexylresorcinol unpile porkpie fibres sadder slobbered youthening aerify seaworthiness remortgages computer mercifulness foliated libraries rectifiers divestitive accomplices fumbler clewed validating realms depreciatively molars eyeballing lollers cautioner attorneys reseeding inconsistentness angularly aboriginally laying refigure reset refractivities ramified responds"@es ; + bsbm:rating2 "5"^^xsd:integer ; + bsbm:rating3 "3"^^xsd:integer ; + bsbm:rating4 "3"^^xsd:integer ; + bsbm:reviewDate "2007-06-25T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-02-09"^^xsd:date . +dataFromRatingSite1:Review564 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product69 ; + rev:reviewer dataFromRatingSite1:Reviewer28 ; + dc:title "interring reclaimable evangelistically hemlines cuspidated coronas remelts spinnery unbarred snarlingly plaques" ; + rev:text "seasick hungerless mythos dynamiting overruled engrossing philoprogenitive slaked holily fringed ogrishly clutchy objurgates snottily pyrenes yachts lairs secularists oryx unobjectionably dioceses howsabout organize summaries kneecaps internalized adverts heavily prematureness snoutish otolithic romping maenadism postilion satraps evangelists directer nabs adjourning pitter episodically overpay shores intrusting humanoids incrustation raconteur cataclysms resoling carminative papistry devoted republics rabidness shadowboxed distemper amicabilities inkiness demurrals rebilling finest eeliest arresting lagers flenches graniteware indorsement disfranchises endogenously subserving detonations deaconing scalpers jetty blarney lazarettos shuttering airer curvier wkly repines skirts greeds pensioners discoveries radioisotope sayers morrows pieplant nictation schoolmasters snickering invected programmers bullneck defenselessness electrocutions splints nullification peculation suitably greys bedevilment separator canalized faltboat vessels unfurl pasteurize cussedly perfectas nurturer bibliog unfulfilled expanded whereases perfidiously sinless pincers effervescently complexest tonality radiobiology smirkingly"@es ; + bsbm:rating1 "9"^^xsd:integer ; + bsbm:rating3 "4"^^xsd:integer ; + bsbm:rating4 "10"^^xsd:integer ; + bsbm:reviewDate "2008-05-15T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-29"^^xsd:date . +dataFromRatingSite1:Reviewer29 + rdf:type foaf:Person ; + foaf:name "Bogumezt-Kanaka" ; + foaf:mbox_sha1sum "95d8de2d4843ae396f2a64ec65d2144adcc17" ; + bsbm:country ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-09-14"^^xsd:date . +dataFromRatingSite1:Review565 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product30 ; + rev:reviewer dataFromRatingSite1:Reviewer29 ; + dc:title "klutziest reflected philtres reoccurred bronchodilator placarding danegelds unlinks toppling serener" ; + rev:text "breakneck lek catalytically unimpassioned xanthin disservices jabbering neapolitans ridiculousness responsibilities becurse schools groveling casks simperers elapsing cetaceans promiscuities quartes graperies fourposters empathize unkinder retrievals goalless tiderips cankering muzzily brevetting avulsions intestines ruminations ideas basked wards contaminants muteness tepidities rearrest haired catechisms bracts imaginably undisproved jct extinguishing sensations fiascoes scallywag bursar sunbeams bushido fractures babushka illicitly physiological bally firecrackers fugues"@en ; + bsbm:rating1 "5"^^xsd:integer ; + bsbm:reviewDate "2007-08-25T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-07"^^xsd:date . +dataFromRatingSite1:Review566 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product59 ; + rev:reviewer dataFromRatingSite1:Reviewer29 ; + dc:title "soilless journals hypothesi paintier unentertaining" ; + rev:text "cravened exploitable balkans gladding bombardier statism parts demigods awning unslinging encouragement broadcasters inquisitional crusting tracheotomize plashiest assumptiveness reloads scupper unfrocks plonk clustered ramblers collaborative dipsomaniac grasshopper nonaddicting devoting showcased beguines alans waking predate aphanites smearer surlier regionals redoes blues workbooks xenophobic projectionists alzheimer frugally glossal rashness counterpoints crammed coonskin absorbency cleavages predefined whippoorwills bahamas bambino encyclic abstemious nationalistically insolubility simulants bewitching bikeways wombed intoxications pieplant effulges fungiform ageing overglaze carillonneur violater"@en ; + bsbm:rating1 "7"^^xsd:integer ; + bsbm:rating2 "8"^^xsd:integer ; + bsbm:rating3 "8"^^xsd:integer ; + bsbm:rating4 "4"^^xsd:integer ; + bsbm:reviewDate "2007-08-23T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-02-02"^^xsd:date . +dataFromRatingSite1:Review567 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product70 ; + rev:reviewer dataFromRatingSite1:Reviewer29 ; + dc:title "sniffers roguing oxtail immunologies renting accords traipses arbor invocated platy beanball lechered" ; + rev:text "putrefied bookmark dubbing hoofer biotin scaping coonskin movable preener embellishing dendroid mayfly presumers troubles caseins afflictively stepsister otology comminute sadly montanans counterpanes wifes redounding huskier deles resides gooier arguably grapeshot biked confabulates toques mutualization ennobles overdiversifies progenitive tunings minister lowlier winepress collectives loads wharfs taxistand primaries fabrication excursionists caroling blabbed nookies realignment shrivels benzocaine vindicable transmigrating supraliminally lingam flatter cowhides calibrators microinstruction canniness subclassification rowboats libras decider antidotes cruises optimally"@en ; + bsbm:rating1 "9"^^xsd:integer ; + bsbm:rating2 "5"^^xsd:integer ; + bsbm:rating3 "6"^^xsd:integer ; + bsbm:rating4 "3"^^xsd:integer ; + bsbm:reviewDate "2007-12-04T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-03-09"^^xsd:date . +dataFromRatingSite1:Review568 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product26 ; + rev:reviewer dataFromRatingSite1:Reviewer29 ; + dc:title "kakemono snippets tuskless singularity vouches" ; + rev:text "rankings untangles bracer intervening briefness poolrooms noways bequeathment attestors moons interminableness gastroscope trochoids cucurbit forefathers teenager simultaneousness obligational moneymaker capably fantasias wirehair monkshoods drowsed brazenness redolence discoblastic nounal palpably obsoletes normally mailed roughhew instilled corruptions enhaloing decoying gasping excluding cybernated bowery requiescat appels kerchieves labellers lonesomes lynchers pottering pointillists grueling daimons combers puppies undamaged unfairest interlining nosebands admissable deoxidization fretting supremer unsolvable pronating tabletop jabot incomparably disbandment vascularities archaeological tapper cyclazocine zoos muffled compensations distrustfully newly herdmen unearth unabbreviated teethes metazoans soliloquizing enthrallingly appropriator flamingoes trickishly weightier perilled pleadings whinnier unedible priciest gainsay spoused underachieves corresponded irrigated laparorrhaphy spelunk punkin purring demagnetized nonheroes bellweather fulnesses disenfranchise walruses baptised leveraged quiddity extras matador bulkiness lineups ascertains declassification admirably eventuating rammed narrowed ohioans strath rundowns eversions stinger filmier ethicalness seaways developer manuscription korsakow calcareously dormy spieling seedtime electroscope cubits ingles washier sevenths inhibiter mages acceptableness reseating stingers sycamores films yardman spoilsman curvedly insaner quantizes nonrational wailer doubtless unsubstantiated firebombs poorhouse attainable philandering reprobes reasoned asphalts intoxicatedly willy ophthalmometer crotchetiness bandaged looter systematizing dustier commits unvaried infolders amorphously boodles perceptibly fallowed amphora glamoured reword bandsman angler gleeman tacklers rechristens revamped licentiate"@en ; + bsbm:rating2 "2"^^xsd:integer ; + bsbm:rating3 "7"^^xsd:integer ; + bsbm:rating4 "10"^^xsd:integer ; + bsbm:reviewDate "2007-10-26T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2007-11-19"^^xsd:date . +dataFromRatingSite1:Review569 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product55 ; + rev:reviewer dataFromRatingSite1:Reviewer29 ; + dc:title "hollower abusively loquaciousness sightlier torsions polyphonically unkennel tousling typographies dummkopf rejoined shucking subsidies crustiest" ; + rev:text "breadboards absolving inoffensiveness stretching wildness visualized contrarieties prechilling interviewer spier marquees asyla solemnizes deformed erectness actuary killers approvingly molars refines traditional bratty hidings challah ruefulness connate verticillate deescalated reformers fluidic maximums deoxygenated jailhouse contests mistrusted biopsychologies fanning atheistically convecting fwd cognomen nonadmission potholder clerkdoms swamping darns pugged unsnarl liefly currentness vies amazedly sleeper brisking tattooers subcultures merchantries decrescendo scandalize writher outran dolours knurlier stumbling vicegerent scribbling grandnephews whelming refines ultrastructural theistic articular"@en ; + bsbm:rating1 "9"^^xsd:integer ; + bsbm:rating4 "9"^^xsd:integer ; + bsbm:reviewDate "2007-11-03T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-01-21"^^xsd:date . +dataFromRatingSite1:Review570 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product14 ; + rev:reviewer dataFromRatingSite1:Reviewer29 ; + dc:title "pooping federals chowdering commonly perceives deaccessioned concessions birettas anaerobes modernness bandboxes catalog descry" ; + rev:text "devein panicles sexists prorogues neutrinos misrepresenting endwise evangelicalism estimations mastectomies cellblock filliping beclouds palavered terrifically repugnantly mineralize whelps flagitious chines travelable transiting flakers tipcat exclamations signalmen unsegmented ells enslave disengaged destructiveness rots reorders raspiest eradicated bathless thanker injuriously affiances commercing organizations horologist lemmas toileted unquotable twines regeared drys vaporousness vestured gyred detectible snaffle breaking transmigrators boating pedigrees musters contrivedly mameyes activators equivalence detractions commissioned stuccos nitpickers sighs upstroke sleighed gigawatts maidenly monochrome metered lathings lateen pfennigs readjusting litigates glamours boldfaced rehabilitant lallygagging downhills spongier jackpots octanes brims shortest gormand fringes overladen submerses punched crenation odometers rapturous particularize blancmange baggings basifies disgustingly gaol overwritten intrudingly chutzpa treadles rheumatically undercharged jumpily admirable holdbacks ophthalmoscopies overprinted feta attorneys blacksmiths nonunited months yowie demodulating dojos harmonium jinglers paperbacks hotbeds ungenially coequals"@en ; + bsbm:rating1 "8"^^xsd:integer ; + bsbm:rating2 "8"^^xsd:integer ; + bsbm:reviewDate "2008-06-13T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-16"^^xsd:date . +dataFromRatingSite1:Review571 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product64 ; + rev:reviewer dataFromRatingSite1:Reviewer29 ; + dc:title "carnelian powered bacons banners trestles reaccused briers rationalist" ; + rev:text "vertebrated bemire disabling feedbacks retransfers matzos gingerly supermarkets calculators septics trackman proves celebrates pschents tetraethyl eventually shuttling matchlessly likers predictiveness lankiest professions eviscerate shute unseasoned shawnees creates unplumbed isseis chronologically greeds empiricist hematologic inconsolably virtually solvated catling doss frankly animating messier conto injectors lancers dunderheads outhit establisher burbler runaways outclassing cityward oui extricated ochreous pinprick exorcizes unsatiably traditionalistic novae rightism slouchingly fretsaw ossea hegemonical imaginarily cursiveness rollaway garrote programable mannishness regionalist laughable surrogates gnotobiologies ganevs lefts nerts pinnace intergalactic ducky chromospheric prelimit overage haltingly corbels medication condescends washrooms forgers marbleization graphs buckeroo bolstered insects feasts clasper gestating whimsicality mondays pons tendonitis lovelily fulltime imprudence owning stoppled inceptive bowling nonnutritious disconnecting varyingly rechargeable securement sergeancies tzigane becomingly refold depopulator clearheadedness stargazers interlocking scrims cryotron chuckling cared dazzlingly simulants snuggling pegmatite sofas bailee alleviators swatting manumissions purportedly machetes unmans drily fusel whopping defeater impartiality subserviency chatted lads disproportionate repulsers clonal instillment chignons sectionized anneals suitings boatsmen offtrack currie conformations reties semifictionally dogbanes housecleaning unmarriageable slaughterer disillusionments holisms bullrings banked pizzazz scarer"@en ; + bsbm:rating1 "4"^^xsd:integer ; + bsbm:rating2 "7"^^xsd:integer ; + bsbm:rating3 "3"^^xsd:integer ; + bsbm:reviewDate "2008-01-23T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-01-31"^^xsd:date . +dataFromRatingSite1:Review572 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product68 ; + rev:reviewer dataFromRatingSite1:Reviewer29 ; + dc:title "batted illegitimated jackal gladsome galleried carpeted runnings fax reapportioning" ; + rev:text "thalamocortical negation tamperers butlers sedentariness interviewers vouchees overpopulate incarcerations maxilla unchecked pentalogies neighboring blusher destructive rises masturbating subparagraph absolver uncharitably reconstructing dimouts seminaries forefended frosteds leeriest asseverating banisters pessimists torridness theorizing modifying vaporise descriptions delectation savoring smashups identifers forfeits underfinance solidary argonauts changeless substances training closeting surprises firmed oppositional hemorrhages disclaimed cheapen cruciform confabbed rhetorics vaccinators neckerchieves finked junker stars asperse throbbing harkened unostentatiously requested expires bankings scrawliest unfocussed thumbing oklahoman poilus protuberance talker gewgaw neglectfully transcendently dominating dishevels buttoning macular nicaraguans pavilions potful aimed apishly quiescency mails reoccupy uniformity foodstuffs shul overplaying chivaree incarnadined timbals licence retitled clinicians noninterventional spurry surfboards controls restorer playgirls racquetball reelections tussuck riel consoler doziest surrejoinders gyred forwarders fatties dratting intoners peritonitic recommissioned fluffiest centered obligato putdowns coastwise potpies misreads populi antiquation cassowaries scotchman cropped eggheads ciphonies trowelling polecats housesit diminishes unphotographic scabby ditches terrifyingly possessory creakily sinuating preheated treaded brings thorougher redoubling specks redeemer infinitesimals disoblige dentinal countenancing ethologist legalness timbrel onanisms preallot disclosure presbyope taxicabs equality digestors newts inflationists"@en ; + bsbm:rating2 "2"^^xsd:integer ; + bsbm:rating3 "2"^^xsd:integer ; + bsbm:reviewDate "2007-06-25T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2007-09-02"^^xsd:date . +dataFromRatingSite1:Review573 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product90 ; + rev:reviewer dataFromRatingSite1:Reviewer29 ; + dc:title "entailed directors electrostatic perpendicularity rewrote" ; + rev:text "odic pushy msec mummery subbasement inexactitude reconciling exculpating gelees outwaits adumbrative libitum intomb riderships wreaker undergirded captioning gassier pudenda clotheshorses handpick stuntedness millrun extoll opting perverting khats penciling saluted eradicators rounds uncomprehended appealable properties socialized misapprehended argles upcurved stereotapes brewing bobbies forkless reverter manicure lithely beshrews swiftian scuffler hirers inhalator debarred precessions infantries alphas instructors measures lumens computability interments elixir sanctioner genitures hootenannies cannibalize recondenses precluded vibrations bigmouthed unsheathed identifying thirstier amerindians revenual"@en ; + bsbm:rating1 "7"^^xsd:integer ; + bsbm:rating2 "10"^^xsd:integer ; + bsbm:rating3 "3"^^xsd:integer ; + bsbm:rating4 "4"^^xsd:integer ; + bsbm:reviewDate "2007-10-06T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-03-16"^^xsd:date . +dataFromRatingSite1:Review574 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product46 ; + rev:reviewer dataFromRatingSite1:Reviewer29 ; + dc:title "unrest unmagnified coxwaining swamps thanatologies climbing politeness flutiest businesses chintzy gigue vetting" ; + rev:text "horrific kinswoman assorters wainscotting voicedness patches earmuff rafts bellowed ensoul lazyish tobogganists innings flattish lividity tartly decentralization sprinted tweediest saddening wifing sacker confederative cays disgraced exhibits jaggiest rumination silkier chickpea outbid bitumens directional postprandial joggler obelisks dithers savorers proprietorial mooncalves bulgers fluoridated continents combative literariness overdramatizes profanities wehner choky autobiographer nonappearances frustration playpens igloos sarcophagi behemoths gustative outraging gouts unsophisticated raftage dresser propped trouncer cloches upholsteries bucketer saturating beltless proctoscopies defoliate immigrated decorations unalphabetized chaffed enquiries rattlebrain archaisms nonsmoker pilsners oxidations quahaugs mainlanders postcoital veining statistical fallers missals godsends combatting flyable warmongering unpointed hurrahed lecherousness clerical snivelers jestful browned thruput sucked slobbish scoffer tempts neatens beeps enfetter horsewhipped secularists conservatories glints haoles pearlers unsteadiest preaffirmed cosmogony aberrational incongruently nepotistic trudger macadams intermeshes sinologies marting avenged placated halyard reconsecration accumulable tritones enchanting confessing compensability baselines dialogs hoggishly moisteners gluiest welcomed acrobatics studding naphtha brushier suborbital quintiles priorates pronouns matriculating unoffended femurs emersions niggards maybushes hackneying felled jocosity"@en ; + bsbm:rating3 "6"^^xsd:integer ; + bsbm:rating4 "1"^^xsd:integer ; + bsbm:reviewDate "2007-09-05T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2007-10-14"^^xsd:date . +dataFromRatingSite1:Review575 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product53 ; + rev:reviewer dataFromRatingSite1:Reviewer29 ; + dc:title "gudgeon platefuls vaned colic futilely" ; + rev:text "flawy blueprinting bolts resters airspeeds undenominational undoers clamming recruiters janes backwoods unhappily shnaps alternators subrules shriveling basalts starkly photomural showcases singulars forswears amebean hoplite physiopathological seminally indications uniformer laments bathhouses batteaux leasable monsoonal mayas moanful forced ambrosially womenfolk confraternity clarifies galloped registership deutschland declinational laconically pivots decagons nonstaining barmier slyly benefited reloaning webs defrayment baptizes repacify ambles lassoing insurrections contractually flinted quelling sublevel inflating intones condemnable carousels pugnaciously valiance legginged etceteras brahma lunation ribgrasses decorousness bicorn uncommon bighorn siziness ss virginities tanzanian consuls intercessors bewilderment acclivity voyeuristic perambulator commensurately sounds limping emboldens vouchered quivers makeups polaroids dispenser jets estates pintos dogcart harridans tobogganists sleekier rejectors dyspeptically sausages forwarder semifictionally subtends halts abbots"@en ; + bsbm:rating1 "1"^^xsd:integer ; + bsbm:rating2 "8"^^xsd:integer ; + bsbm:rating3 "4"^^xsd:integer ; + bsbm:reviewDate "2007-06-22T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-01-21"^^xsd:date . +dataFromRatingSite1:Review576 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product64 ; + rev:reviewer dataFromRatingSite1:Reviewer29 ; + dc:title "mirkily renunciatory assaying humphed winkers regionalism clerking" ; + rev:text "antiskid camphorate joyriders lapped dismantled satyriases immerses ombudsmen unwarranted omnivorously briner sunbathing carotene pursuing odorants arguers tameness technically economists cultures puerility bicorporal sectioned floridans unscrewing bets prodder ponderosa irrigating acromegaly samsara seadog rightfulness hormonally tripedal soviets warehoused wincers shicksas cannonry pelleted footsoreness solfege carter gnomons seedcake marlinespikes ogles gawkies sere realpolitik guides cryogen coalesced adsorbable gunners radiotelemetries turndown depilate subregion englishing denazifies axillaries tribeswoman brooded scrapples floweriest producer hyphenated spigots muzzles loiteringly flatulence plantations expostulating frills overambitious cohabit subjects pewits encipher metaled reinoculate cassinos raison topcrosses forecasts crumbliest amtrac sestines misclassified minimals obsolescence wickerwork windburns allegedly"@en ; + bsbm:rating2 "9"^^xsd:integer ; + bsbm:rating3 "2"^^xsd:integer ; + bsbm:rating4 "1"^^xsd:integer ; + bsbm:reviewDate "2008-03-11T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-04-25"^^xsd:date . +dataFromRatingSite1:Review577 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product52 ; + rev:reviewer dataFromRatingSite1:Reviewer29 ; + dc:title "meritedly patronymic survives steamships recognizer rewrought belligerencies polyp resonated" ; + rev:text "eying downhearted romped phlebotomies spluttered unbeliefs fornicates subsections godliness receivability carousel barges lumbars scripted repatriating vocalizes moments villainies promodern acidulate projecting sinewed linkers gambles differing secretest tsked loaming oxidizers skitters leapfrogged desexed raider execrator orchardist unmeaning apportionment fortified macrobiotics confinement brahmins filius washwomen potage gigantically fungic mousier interrelations factored ruralize frilling groschen unpardonable passives agendas intercommunicates succumber sargasso lamebrain antipyresis improviser legitimation apeek centiliters farthing interment jokes publishing photomechanical deregulating contemptuousness cascabel crudity pressurizing agouty corruptibleness"@en ; + bsbm:rating1 "8"^^xsd:integer ; + bsbm:rating4 "3"^^xsd:integer ; + bsbm:reviewDate "2007-06-23T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2007-08-28"^^xsd:date . +dataFromRatingSite1:Review578 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product58 ; + rev:reviewer dataFromRatingSite1:Reviewer29 ; + dc:title "discoids dishing relaxers environs hetero shoppers crayonist cougars paltry lambskin neptunian catagories unfair selection enrich" ; + rev:text "desegregates regenerate newnesses sickles lavaliers forsakers bottler paddlers bequeathal canaller samariums enthused strengthens childless minuter recklessness concisest gawked chare calisthenics hows izar continents sensing unanswerable shier appellor accelerative swellheaded impounding sluggardly monarchism diastrophism concupiscence inexhaustibly depredations lariating cushiest rooking risque taciturnity birdseyes poked drabness hitchhikers instigative grimily suppurate biparental desecrates novels unitive encapsule petitioned misarrangement sahib savorers tariffing stretchier outreaching defending intombing radios bemired indisputableness serrates gormandize nouveaux sofars embankments silked fuselages underfeeding ungoverned deflagration assumer stockateer impeachment reclassifying frags domiciliated shortages prepositions sneezers sunburst ficklest flunky regularity cosmoses unlovelier seductress moisturized hollooing smelter patronymically tankage slovak unaccentuated medicks monition cookies torticollis slangiest wrenches fauns dryable dervishes inhabiter tackled holotypes madnesses bleeps placates tainting panache disquieting damneder syncom typification katharses stoles sapped arraignment externalizing unimpressed holdfast restaffing asyla iranians twilit cryosurgery unreadable obligers verifier unaspirated verticals rebinding calumets scoops patsies provisions regionalistic chinchy savours slagging limpidity directorship peritoneums importance considering chapeaux untreading ricochetted piddled review"@en ; + bsbm:rating1 "3"^^xsd:integer ; + bsbm:rating3 "8"^^xsd:integer ; + bsbm:rating4 "7"^^xsd:integer ; + bsbm:reviewDate "2007-08-13T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2007-10-17"^^xsd:date . +dataFromRatingSite1:Review579 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product85 ; + rev:reviewer dataFromRatingSite1:Reviewer29 ; + dc:title "legibilities megadeaths wisecracked boilers angelfishes cams" ; + rev:text "overcapacity fonding misfeasance adjure snuffboxes potties stopcocks antepenult strummed digests angler bagworm shammers cardinals downer pours installing calpacs wintriest sweets leeching clannishness shippable earthman clarifier solidities aerosols vapidness hibiscuses hunkering hausfrauen catering initialed skalds declaring aggress embellishes resuscitated extolls winners xenocryst nonliturgically smashingly deferential compliantly cringers doorbells diddled vinylic blotchiest shattering lineament saddlecloth levitated cabalist numberable effacers outlining vulcanizing tussles slenderize unreason pouter ghostier leipzig ryegrass"@en ; + bsbm:rating1 "4"^^xsd:integer ; + bsbm:rating3 "4"^^xsd:integer ; + bsbm:rating4 "4"^^xsd:integer ; + bsbm:reviewDate "2008-01-19T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-16"^^xsd:date . +dataFromRatingSite1:Review580 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product75 ; + rev:reviewer dataFromRatingSite1:Reviewer29 ; + dc:title "supering precancelled reboot pinioned gawkers prototypes discovers vanitied fellness mourned" ; + rev:text "strangered expectoration herbage snuck skirters shadily geoid uneatable intruding toasted dropped accustoming brede rumbaed harshened cheateries undetected loser spumier ferules typing linier nosiness panzer nubblier manumits pourboires divinations antheral dyings duffles arbitrages catalyzed ingredients nepotism dampening kilohertz dinkier statures inclinable affronted halidoms tracing internationals adorably authoritarianisms profited luminously duals diplomatists fussers recordership reliquidated weaknesses fusions rootless bearers mires sneezy genal"@en ; + bsbm:rating1 "4"^^xsd:integer ; + bsbm:rating2 "6"^^xsd:integer ; + bsbm:rating3 "8"^^xsd:integer ; + bsbm:reviewDate "2007-09-28T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-07"^^xsd:date . +dataFromRatingSite1:Review581 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product71 ; + rev:reviewer dataFromRatingSite1:Reviewer29 ; + dc:title "chlorotic sheeniest littorals dentate brogan wringer izzard bugs padded bowdlerism distresses outmarching kowtow unrevealed animalcules" ; + rev:text "merlins molto redesigning spriggy movements envisioning sideboards aggravated bludgeoned carapaces musicians grips quires vaporized abhors snits properness prejudged bossisms stratifies ruggedest undervalue squaws editorializer nonclinical feebler subspace woad tardiness rarefaction dakotan etymologist expandable gastronomically unrenewed outliers journalists squinting sorrily rubberizing divisibilities unaccepted acknowledgers pricked mellifluous instancing trisects refrozen reputes meads immortally scrunching lipectomies mildly disproportionates sodalities aerialists carders rosined proved gathered ragtimes reoccurs twinight interpose preunion waysides iced lyceum flirted infrareds crimps nosy grumpier wildfires facula cerebrums clairvoyancies cinques"@en ; + bsbm:rating2 "5"^^xsd:integer ; + bsbm:rating4 "2"^^xsd:integer ; + bsbm:reviewDate "2007-08-04T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-10"^^xsd:date . +dataFromRatingSite1:Review582 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product52 ; + rev:reviewer dataFromRatingSite1:Reviewer29 ; + dc:title "gents shelvers speedway hitchhikers" ; + rev:text "squallers daters pixels seabeds drearier unreplaceable dawdles drummers filarees cruse fleabag filing expressionless insupportably harboring cyclists conceivable matronly forworn pianists compassionately joeys virological impercipient metalworking langsynes zoologies sateens cuisines briefer expounds pastorals renewable worships nonfascists dropkicker burnooses antiphony disproof enquiring swervers actorish incendiaries grassers inexcusably peps pasquinade synchronized vitaminization levelly cuddy wagtail curatrix untimeliness loudly zionist diffractive reproved flamer students mentally glyphic depots nonfactual riggings foiled bootjacks revested leprose pacifically mussiest misedits gluttonous deposable protesters clef encrypted middies urinates misfeasors foretops moonshots analysed tackling readiest pseudoscientific citherns stumblingly capybaras helotry rejoins pietist sparseness reoccurrences looped reinterrogating bewares wagers insanitary taoists ravelled missorts chevrons patronymically diodes outdoer destroyed rouens codifying keratomas uplifts suites rider wordplay bedgowns saintliest atomistic pestilently bilobed bullfinches semiskilled interferometry nebulize diffusely christies sibilance subjoin sacristan warblers plinth electroplate epidermoidal"@en ; + bsbm:rating2 "10"^^xsd:integer ; + bsbm:rating3 "2"^^xsd:integer ; + bsbm:rating4 "7"^^xsd:integer ; + bsbm:reviewDate "2008-05-07T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-07"^^xsd:date . +dataFromRatingSite1:Reviewer30 + rdf:type foaf:Person ; + foaf:name "Raymon-Lonni" ; + foaf:mbox_sha1sum "b2534cd33eabd6c745a8eaf139b63c4e476b0d0" ; + bsbm:country ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-09-20"^^xsd:date . +dataFromRatingSite1:Review583 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product80 ; + rev:reviewer dataFromRatingSite1:Reviewer30 ; + dc:title "ideologic garbanzos bedstands retributory" ; + rev:text "syphilized ladybird digesting sixte raised preaffirm secobarbital upgrades bactericide euphenics sneakily noes reallocates sapiency wobbles postmenstrual mustily undercoats clippers gaged crumply tenoning embryological occultists poshly aftermarket stingray homotype degenerates smothered rhomboids hup retorts scrimping genealogist grovelled blottiest pantomimists instanter twinship thumbing aftertaste solubles doorstop chronics portioners correctest darnedest grogram derm betaking sacksful rheniums irradiates riffing sharped nonplussing scribed florentines humidified visualizing interlocked belay dismantled logbook earnings subversion disintegrating etruria dingoes montages batcher partizans upraisers religionists dampens churl workshops ploughman mycological redistributions erections hedgepigs spondaic radiosensitivity stardoms accusatorially limericks jargoning equips satisfyingly stragglier shammied valerian canebrakes untruest unregimented prevalently cajun accusatively sundews prehensile works jewellers overstock brambled fruitiness nonmilitantly heroically papillae flagger strafed babu sluiced inertias domini strutters headhunting antigravity wallah gladded wider archives mislabelling kakistocracies ornithology glassman dignifies reascending encina quipster nightly sherlocks angina ridgepoles retinals anthologizes quacky inimically reprocessing clashes algin pourer nictitates tortuously climacteric outgushes kaftans fingerboards sensuously antechoirs corollas requital tendons concentrated delimiting deregulated altho corslet perniciously elegantly trickie spotter freckling sepulchering"@en ; + bsbm:rating2 "3"^^xsd:integer ; + bsbm:rating4 "7"^^xsd:integer ; + bsbm:reviewDate "2007-10-07T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2007-10-16"^^xsd:date . +dataFromRatingSite1:Review584 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product77 ; + rev:reviewer dataFromRatingSite1:Reviewer30 ; + dc:title "circumvents precanceled hangouts superciliously boils scrounges duello xiphoid hardships overissues postally molehills stigmatized kidnapee weariful" ; + rev:text "filii folktales suppliers mismanager wigeon accursedly millirems uprisings phantasms prelimiting vacation sunsuits muzzy alienists overpayment patriliny plots telegraphers adjurations defeats playpens birthplaces goodbys predator introducible hydration obliqued mouldy radiosensitivity amortizable boodled asexuals triply zoogeography laved palladiums theories jewelling xerophilous pieced microsurgery sluggers baldly batters infiltrated lapidating animistic clawer subagencies arbitrages"@en ; + bsbm:rating1 "2"^^xsd:integer ; + bsbm:rating2 "8"^^xsd:integer ; + bsbm:rating3 "5"^^xsd:integer ; + bsbm:reviewDate "2008-03-04T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-04-09"^^xsd:date . +dataFromRatingSite1:Review585 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product14 ; + rev:reviewer dataFromRatingSite1:Reviewer30 ; + dc:title "letches whiting unluckier fem dustiest adumbrated" ; + rev:text "yellowbellied wigwagged idiopathy egoistical bullheadedness bridges hauntingly ignorance catalysts sestets tings reveled viewless sketches saccharification kiltie bouncingly seams ginks commercialist brockets faced dodger breastbones baric dowelling doggery philanders nicks sculpts kajeput limy frugged wandered winded unacademic limousines cochleae diverted potter terras brusquest monkhood institutionalized duals reprieved dogcatchers hucksters lacteally humbles rehabilitating reverb osiers recuperates sniping crackup achoo czars nonadmission finned marshs disbelievers solicitors stript sponging protectional accomplis advertizes clots interventions cosmopolitans rentability selectee advancing remarry telepathically accountably ruts schussing sages hearsed unfurnished armless weakening batman outfighting septupled garmented appending touters burgee conjoins tartaric hearting coddled adjurors hammerless expurgator governments"@en ; + bsbm:rating2 "6"^^xsd:integer ; + bsbm:reviewDate "2007-10-01T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2007-11-11"^^xsd:date . +dataFromRatingSite1:Review586 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product45 ; + rev:reviewer dataFromRatingSite1:Reviewer30 ; + dc:title "lyres crashed calculous sentenced subventions postbox embodiers nonelectric overearnest packers stargazes cyclometer pourer" ; + rev:text "subnucleus thermoplastic epigraphically revulsions enciphered nevadians coopered crosshatched nonheroes reshaped signiories annexation errantly nullifiers rotting ethiopians regality geologist kerchieves radiophone waxwings vampers heelers thoued corundums lambdas detonating undines cellist interborough nonworking musical overpast accurst antipathies transcribed sensitivity homebred heteroerotic crispens thermocurrent cystic midtown shebangs conservatives disconsolate shinney ubiquitously slashed noncombat uranous millibars subdistinctions wetback firer experienced aromatics bisulfate truckmen landright declaimer zouave jonahs clanswoman souses lighteners tankful triadic settles faults tike moieties physiologies midweekly sty picturesqueness repulses geometric scumming splashily verbosely stopper couturiere adaption grandmaster audited roentgenize ballisticians laureating miniscule scrutator transmuting pancreases flagellates alamodes countervailing hotline earthier mongolism fatherlands lengthily furriner parrots chummiest curdled sudsed hodads roles netsuke tentered joyance fescues headwaters damageable subindices dozed squigglier tooting caddying manuals refries moanful patchiness prancer unsettlement deputes dbl plunders freehearted calcific ultimateness entrenched fractionalizing nimbuses debatable sundries spirituality shallowed scoreboards zoogeographies desponding subsumable radicals jeepers dictated breaker tardiest apportions ryas tole reinscribed glamourous hornets lender unawareness earthiest nightriders pondering abjures"@en ; + bsbm:rating1 "5"^^xsd:integer ; + bsbm:rating2 "2"^^xsd:integer ; + bsbm:rating3 "5"^^xsd:integer ; + bsbm:rating4 "10"^^xsd:integer ; + bsbm:reviewDate "2007-08-11T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-03-12"^^xsd:date . +dataFromRatingSite1:Review587 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product70 ; + rev:reviewer dataFromRatingSite1:Reviewer30 ; + dc:title "impends disserts wheelbarrow hydrated nervosity usefulness greasewood recurrence fuelled doxologies stepladders psychogenically" ; + rev:text "irrefutability louisianians zikurat frowzily unresistant consecrated humoured heliport nonmythical incorporeality biparty drafting routinizing somersaults redip discographies gratifies overpraise galas shimmery massacred picked utilizable rended outrooting hottest summonses xeroxes motets spinier permeations theocrats toolsheds interbank submicroscopic serifs mongols embeds baled piazadora recede detester planetologist flyaways kingliest consignments titania superiorities anteceded humiliated intoxicated reaches kinks disemploying didoes grayed diablery liberated timberlands inhesions ginny marbled hoorah discomposure transfigures cannoned circularly finnmarks clouted kilter twitches coveralls indemnificatory friendships expirers lunkhead prates imposes unhardened ensorcel baiting cossets instrokes trajects insubordinately effacers dualizing wrackful dispossession ladders emirates capillarity sanatory depleted tsking claymore shopgirls interweave eclectics ashtrays chastens brut elative propounders trunks aurist tricked aerofoil colonelship antinoise modeler savagest skipjacks thalidomide predations heightening tractable leos narcomata presidios ladykin deathblows obsoleted currycomb forejudger pornographic miscibility titties muskegs lucent conjuror tigereyes sidelining eugenics electrostatic somniloquist whoppers whereto blabbing semisoft dislike unpacked nucleolar pentathlons swooningly flaker argufying"@en ; + bsbm:rating1 "6"^^xsd:integer ; + bsbm:rating2 "2"^^xsd:integer ; + bsbm:rating3 "1"^^xsd:integer ; + bsbm:rating4 "3"^^xsd:integer ; + bsbm:reviewDate "2007-09-20T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-02"^^xsd:date . +dataFromRatingSite1:Review588 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product54 ; + rev:reviewer dataFromRatingSite1:Reviewer30 ; + dc:title "truckman objurgation tampers refinishing hawkeys marketer niching bursaries chantages chemotherapeutics punishability prenames mohawks scrutinizes" ; + rev:text "timidity vidkids democratical ads embrocate termly primed nippers bibliophiles parfaits penetration bedquilt radiotelemetry unknowns arts surpasses natures yachtmen inhabits elapsing overinsures farewells fatted deplanes prest salience reneger curtailment perpetrators reorganizes uneducated naphtha prearranging unvaccinated mutilative prefectures recompensatory frizzed indonesians spavins coursed horseshoer beanstalks compartments enrollees mainlanders nonabstainers shtetl subcauses trove sufferance drafters corroded nonstandard leaseback rumps enumerated geosynclinal megalopolises knockouts velveted defalcates paleface digestibility gasher toddler spokeswoman liter aerosolized patrols unfashionably monosodium indelicacy snooped defalcations brutism preannounces eyedropperful baobab fumigating healthily spirochetes outflanks diviners imperia overflows messily wobbles dioptre lividness chemotherapeutical pettifogged successfully conquian judicializing immutability dreggiest stoker recapitulated perking geriatrist pimples metalizing mums tailers hustled uncommunicative confetto hoorays musicotherapy laces antinomian resaw conspiringly sluttishness blackguard dahlias slinking waistcoats"@en ; + bsbm:rating1 "3"^^xsd:integer ; + bsbm:rating2 "7"^^xsd:integer ; + bsbm:rating3 "1"^^xsd:integer ; + bsbm:reviewDate "2007-07-09T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2007-07-18"^^xsd:date . +dataFromRatingSite1:Review589 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product11 ; + rev:reviewer dataFromRatingSite1:Reviewer30 ; + dc:title "masseuse flyways legitimating dyes glossing chuted origination relinked" ; + rev:text "insectifuge encases mesmerizers ineptly rcpt fillable graces glycosidic notarially microclimatological resistors highness yokels redirected laterally ohs slitter nutshells homicidally announces baseballs demineralized unbribable loudest yardmaster blastoffs planked folder authorizers trespasser scruffier blatancy waxing shakoes barfs pompanos railers fragmentate radiotelephones topographer dedicators decanted acclimation droit labella wirework careerers deterioration unadvised zebroid arteries conversationally twittering talking fierier ownership retransferring unlaying androgynies fellers gaggles concubinage towability comedo smoothly airworthiness clews overviolent hogwash deranged allocatee doodlers coshes piled tousled adhering authority theatrically baleens attainders sexlessly liftable lovesickness theaters pensionary reascending intromittent parlayers corsairs pillions subhead uniformed coursings mutably stoutly embroidered grouted ramifying indispensability thatches bristols expressions refinishes itchiness greasewood enlarges avianize phiz hushing demulcents zetas overexcitably"@en ; + bsbm:rating1 "3"^^xsd:integer ; + bsbm:rating2 "3"^^xsd:integer ; + bsbm:rating4 "3"^^xsd:integer ; + bsbm:reviewDate "2007-08-20T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-04-12"^^xsd:date . +dataFromRatingSite1:Review590 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product49 ; + rev:reviewer dataFromRatingSite1:Reviewer30 ; + dc:title "richens alzheimer ambusher restricting bolas conferees contrives invader finer" ; + rev:text "draftiest emblems shover shunpike jutting iou impulsion swivet direction pule dentures bandmasters gnaws reechoing avoiding bigamistic schmoes localization hindustani reredoses riflery ropiness hospitalizations inhaler liveries objectionability effronteries dimes gymnasts intuited condyle absinth vaporized forewarning gimmicking mimickers conjurations handcarts maximizers energized distortions sociopolitical radishes expulse cabob soberest milldam reassumptions felonries cudgelled macadamized torqued aspiration flopping rosiny immix prayerfully airbusses commercialist nationalization scarpering gametic viciously teenybopper rewoven phlegmatic mafioso stereoscope veering junkier befuddled reoccupations mismanages sitarist geosyncline tonneaux noetic lallygag simplisms russety buoyancies racquetball hygienics hitchhike stunsail overachiever aviaries pilothouse reattachments lactoses liberalize peddling towered bouncing hessians installed scandaled analogically tiniest subcommander lavenders peccable metazoan lunger nursings prelimited photostat flirtier trailing honors reclamations furrower reallocations drownds tambourines burweed manipulatory headaches scribbled quarriers remarker urbs emboli archdeacon furnacing fascinations sleaziest voguish thereabout teenier radiologist overembellishing secretor auklets everts preannouncement caudal commemorates turtler connivers masonwork zairians ministers cureless unloaded tasses badges extorsion campily postnatally deliveries eligibility staters perturbs inhomogeneities furbished freebie uncritically reticence adjustor selvedge russian triflers estopping tempestuousness crumbliest undersides huguenot metacarpus anathematizes chores bednights ungentle chalking pursed lastingness ventilators truces uninspiring gigue subtreasuries enthrallingly burettes denatured jugglings sulfuryls computations disunities multichannel wormwood tillable deities hurrahed overprotecting bids tipster untidy chinkiest craves"@en ; + bsbm:rating1 "2"^^xsd:integer ; + bsbm:rating3 "8"^^xsd:integer ; + bsbm:rating4 "1"^^xsd:integer ; + bsbm:reviewDate "2007-12-23T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-14"^^xsd:date . +dataFromRatingSite1:Review591 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product72 ; + rev:reviewer dataFromRatingSite1:Reviewer30 ; + dc:title "fibrinous restricts causelessly haematin driftpin hoecake russe citify redistribution fowling planless beefcakes pulping incriminated saliently" ; + rev:text "formalities interaction anesthetically plottier unmemorized hecatombs comportment nordic affrights excommunicated negotiator expendability embarrassed despises favoured engender flitch quiveringly southerner micros cubits rallyists jiving eruptively vestless winkling railer pipeages exasperated oklahomans palladiums subsidence weakens paintier theurgies continuing flamboyantly faintly kaiak reifies hindquarter spoofing unrespectful tunnelers valeted personative wealths viscountess habitability phenols ceramics baulky niggard bobsleds transvestism ripes stockings suicidology codlings selfward conceivable minacity taoism crankier fungicidal flexion conjecturable"@en ; + bsbm:rating1 "5"^^xsd:integer ; + bsbm:rating3 "6"^^xsd:integer ; + bsbm:rating4 "6"^^xsd:integer ; + bsbm:reviewDate "2007-09-18T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2007-11-13"^^xsd:date . +dataFromRatingSite1:Review592 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product43 ; + rev:reviewer dataFromRatingSite1:Reviewer30 ; + dc:title "bleached storyline regerminate vengefully" ; + rev:text "forepart develops electuary lancer worded rectories clasps psychogenically antiquarianism consensually felts lookers archway cumbered camelias heedfully reglaze retrench purrs huckstered aquaplaning paynims deregulating phantasm stogies hefting superiorly filtrates harpists constructionist collectivizing appearances fortuning sorrowing plussages unpoetical yodhs cliffhangers rooted raddling undersexed gladioluses denuders forwards emigrates viewer coiffeurs secreted brontosauruses dayside trepid disputes unspoilt incumbered glassfuls guttersnipes touchiness reseeding shantey disarticulate villainously hermeneutics footpace maturative savagest nonplus associatively energizing sangha emetically flowerets herbarium tarnishable spines lecithins iambuses budgeting kilns unsuitability unbendable tenpin bosoms admonishes relicts dancer lamer abdicated upraiser wager nodus behaving burgomasters scavenging fostered sojourned matched headrooms wakeners exiting somatology ordinands architraves carbonates axiality marsupia catarrhally medievalist hardball protestants spikelets countermanding declinable chary whetters debasement cambering arrayer burdies junkmen woolshed frames distanced wallowers curability"@en ; + bsbm:rating1 "7"^^xsd:integer ; + bsbm:rating3 "3"^^xsd:integer ; + bsbm:rating4 "1"^^xsd:integer ; + bsbm:reviewDate "2007-07-19T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2007-09-30"^^xsd:date . +dataFromRatingSite1:Review593 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product30 ; + rev:reviewer dataFromRatingSite1:Reviewer30 ; + dc:title "disfranchising elevating aspersions paleface val cherries paroles ricing signiories troutiest toeholds moanful" ; + rev:text "packeting moonshiner xenophobe redeploys kayak boatings chits enfeebling jaundiced laminating sweltriest washday remilitarizes comanches darneder lectureships coinciding unacceptable limitedly travellable blazers refrigerator groved prims solidarities inanimately forjudger inefficiency heartburns mattresses molecularly ortolans supplely cesspools hdqrs almightiness torsos adumbrative sauls sibilate tankas premisses acceptedly recrudescing prelacy polliwogs bort palpator oviduct bobtailed grammars crankcases cleaved latticed shtetl telexes outswimming seizing outbalancing deionization shakes emigrates dowsing knights mucosity teamaker rapter adios congealed reinduced pralines jujutsu swamies sheathing brandishing metallurgists mezzanines mechanized catcher hypothermal countersinking doser bobbling emergency raisable oinked cosmetology signer publicizes sandpapering temptresses looking counseled toked initialling hellebores euchred sholom tabooing noticed acquisitively overbuying burnoose promoted affairs needlepoints misplacement guzzlers associative radioactivity invents relinquishment streams dowdiest reassorting unctions purveyance retrieves flagrance straighted carboys sagely napery overrighteous kindly infundibulum fleeted recognizable trolling pegged tokyoite custodies graduating improves clubmen pathetically periphrasis busied novas hunkering espousals refocus kentuckians inhalators saltation nimbleness signs externalizes leathering manilas japans materiels unleveling repopulating durned strugglers displacements redeye linacs negativeness parsers nazifies defaults blinkering bustling paganist anthraces postgraduates ravelings snoozers veneerers audios balked frizzily pullet unreflecting eclair gerardias parachutist flagellum"@en ; + bsbm:rating1 "2"^^xsd:integer ; + bsbm:rating3 "4"^^xsd:integer ; + bsbm:rating4 "8"^^xsd:integer ; + bsbm:reviewDate "2007-08-12T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-03"^^xsd:date . +dataFromRatingSite1:Review594 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product44 ; + rev:reviewer dataFromRatingSite1:Reviewer30 ; + dc:title "tensities encipher radomes cyberneticist ditching sterner leu experiences inducement assemblymen" ; + rev:text "guttered folkloric diversifications idyllists revivification timidities lubricants illicitness emancipators flushed illegalities empirics forfeited letterings heathendom celibacies titulars cryotherapies swiftly absorbed consummated impugned drenched grumpy speedway kinesiologies homagers earthbound robustest fogey bums sexualizing selectee noggins assemblyman laments dustier twists margined beanie uncircumcised smartly scats swop mosquitos lapels lachrymation segos undecidable marshalled promises foresides collectivize incisory signatary unruled campsites contractile woodlore swooning stockily grouping choppers nitpicking restfully"@en ; + bsbm:rating2 "1"^^xsd:integer ; + bsbm:rating4 "8"^^xsd:integer ; + bsbm:reviewDate "2008-02-25T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-02-27"^^xsd:date . +dataFromRatingSite1:Review595 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product79 ; + rev:reviewer dataFromRatingSite1:Reviewer30 ; + dc:title "tinily recommence tzetze ethicist miseducate twiddles tootsy unadulterated pressers creakiness tyrannicalness" ; + rev:text "rankings toolboxes recentness glissando annexion reinvolvement bracts harbours cirrus reassuming quadruplication cornets swellhead requisitioning usually semiprofessional trawled untidies freeloaded monoplanes plusses hatemonger vacations mortised cayugas ambidexterity flitting instantaneously bulletproofs bronziest fustians uncourageous uncaps kiddies putter pudginess draftiness stabbing drafting pedicurists reacclimating malapropos bravoes machetes rekindles cozier restrictionism yellowing pyres petering savants trachoma deoxygenated racecourses overdevelopment schizos enmeshes inducting dungs locoisms vias geum caveator inexperienced grubber ensheathe cumbersomeness yapper achieved eliminator wampum blindly dehorned cuppas textures manyfold reendows fictionalizing proctoscopically dustrags gradational unhook gradates princes chilliest benignancy gramophones statistic cabling microfilm smellers abounded enervators plumbs repaginated iowans piously loupes impairer panache cosmonaut pilaffs abrader sweatily sensorium ginghams blitzes shampoos dignified stablers pyx shoveled senility queered congregants renominated cozier"@en ; + bsbm:rating1 "8"^^xsd:integer ; + bsbm:rating4 "7"^^xsd:integer ; + bsbm:reviewDate "2007-07-09T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-01-31"^^xsd:date . +dataFromRatingSite1:Review596 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product24 ; + rev:reviewer dataFromRatingSite1:Reviewer30 ; + dc:title "cormorants meddler coaster eligibles" ; + rev:text "hider surmises freethinkers mandalic rheums cellarage clowns armorial deaconries ossifies reenter imprints stormed humidly pains leathern selenography exacerbating subscripts revised stodging ashless prejudgments confutative diurnals jolliness smoothness garotting sandlotters imperiums retranslate caging securest substantiality airworthiness slickly bestirs collaterally screwballs spots prevaricators endeavoured lightfingered excommunicating scandalizing proclerical semisocialistic argots disjointing chuffs planaria temptingly tinctured unchains alleviations autointoxication roentgenometer flashbacks chopins unrounding blunges anodyne hocked chamoix stethoscopes undistinguishing slivering chukkers tigereye multo countermanding bushwhacks protester kiter pineries cinematographers seining sloughier kiddingly buckishly blackings ductless smelter recessing synchronously llano subdeacon pimples snappiness panegyrical densely narrater adjutancy twixt beasts kindles"@en ; + bsbm:rating2 "10"^^xsd:integer ; + bsbm:rating4 "2"^^xsd:integer ; + bsbm:reviewDate "2007-06-30T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2007-08-23"^^xsd:date . +dataFromRatingSite1:Review597 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product33 ; + rev:reviewer dataFromRatingSite1:Reviewer30 ; + dc:title "broaching proving argyll mullets fleshed haymaker nothings" ; + rev:text "eliminations cicatrized onomatopoetically contingents screwdrivers descendants lazyish abs danseur icicled kayoed sizzling hempy peccavi airframes unhesitatingly prologuing sarabands bergamots curbstones dissections braider capped dustpan richer jocosities reviewable worrying interviewed typhons cullender mentality farewells coverslip carat amphiboles halls prospective sixpenny hurrahing demodulated offended nubby excessiveness precariousness radioscopical nettler bequeathing substratum subscript toxaemia occupying rimed demonstrandum awhirl merlon brittling gringos enfranchised revengefully nonappearance sizeably directive cleaned smoggy pensively gateless internationalizes preventiveness intoxicative groggiest sallies purest shoots padlocked firing cagy brassard undefensible ration snagged molested quiescence hymns glorias jackhammers cavers megakaryocytic rhymester raddles bargee desiccating decorums addles bedfellow overindulgent centre marring recentness checkrooms hogtieing rowans beseeching ballooning hogtying reinfecting footworn supplies typecasts caninity assessed indowed necrophobia approbate exploited accountable occupational pandoras drolleries elemental debentures snootily carneys turnhall samovars clairvoyancy foghorn unbridledly projecting hired grafter neguses flambeaux kuchen gimmicks milkier travelogues resistances interlaces adulation defames pignuts intenser gleamy desensitizations fusillades scooting characterless reckless overborne tiaras barracudas deludes sphinxes circulates reglazing"@en ; + bsbm:rating2 "10"^^xsd:integer ; + bsbm:rating3 "8"^^xsd:integer ; + bsbm:rating4 "2"^^xsd:integer ; + bsbm:reviewDate "2007-07-25T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2007-12-02"^^xsd:date . +dataFromRatingSite1:Review598 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product57 ; + rev:reviewer dataFromRatingSite1:Reviewer30 ; + dc:title "guiltily sharpeners levants pertains segments impellers" ; + rev:text "scumming hangnails replaces earthling dogsled lizards cozened unsatiable lornness ordains flayers rubberizing misnaming quidnunc rabbinic sunroom preoccupies trebly disvaluing golems parliaments interweaves semipetrified disengage maunderer peacocked throatier aghas reprint lipoprotein ricers thoroughbreds obtrudes pinning cheroot obits maximals germinates relent creches disobeys loyally poorly liberation solubilized repealable chanting employers acridly vacationists foemen inventoried wagonettes landslips actorish visits squarest chattering attractiveness neglectful composedness blossomed baggings rosing slavey censers similarly disbursed rousers rearrested adjustor debrided camembert grabber memorization zoysias mercifulness disbelieves ternaries blandished depiction knacks neocolonialist conquistadors degauss officiant calibred oaters ashrams playbill macrocephalous defiled kaffirs coherence disobediently conditioner paisanos assassinations sloshiest mitochondrion legislatorship heelpost forcedly preconcealed wheaties wonted teamaker purities sculpturing nervousness standoffs schizoids cramping eradicating scrambles declining officiants bandana lunkheads undirected quadriplegic newsboys congees mulling harmoniousness weaseling contradictorily scrod eulogia chutzpa imploringly biologist beliefs nijinsky redesigned suasions cruelness piquancy wharfmaster ensheathe decontaminators inculcated zizzled intermixes factorized noire asepsis tracing horizons outwaited legmen marbleizes narcissi canzoni clonked weirdy valuates pastoralism"@en ; + bsbm:rating1 "3"^^xsd:integer ; + bsbm:rating2 "1"^^xsd:integer ; + bsbm:rating4 "2"^^xsd:integer ; + bsbm:reviewDate "2007-07-15T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2007-10-23"^^xsd:date . +dataFromRatingSite1:Review599 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product60 ; + rev:reviewer dataFromRatingSite1:Reviewer30 ; + dc:title "shooed ordains denier parroting discountable hesitantly enchants brougham transacted avouch duodena armonica" ; + rev:text "sabring matzohs unshaved acupuncturist nations foresheets planless inflight medicably synergies fervency choctaws residency crucifixions quirkier tuned rudest lobbying macers dilates neonatology liquefactive chivalric oscula whumping painkiller repositioning plateauing thatching bumpy excitable desalters slanting icehouse intentionally reassumptions glummer governors constipation neologisms eyeglasses zillionths medicaid supervening rubbishes asperse evangelistically changes hawkmoths grecized reigns maids procrastinator locksteps itemized condonation choppier assisters unjustification empowers ratatat chiselling navahos comer primness cudgelers wotted decrements salvoed fungicidal recapitalizes cutup causerie inhabitable sutures inkstands prehardening iridectomies vestals precociousness cuddles picograms fester prosperity downy chafed needing refurnished magistral senhores liana thrummers terrorizing stoppering flutterers reinforced frequenting grandeurs outflank ripsaw eternized dalesmen perkiest profanities hurled unitive sending hokum jacinth flamencos saber disyoke occidents mudcap unobnoxious couscouses ourself princeliness tattooing ostlers carrageenan gweducks modulations hooknose accoutred scuppering tinseled vibrants sconce legitimizer regulated photospherically powdering anomy puritanism totals unbalance germs crusaded couples ghostliness matless quietists amalgamated editorializing perforations metrically rickrack colitises frostily stultifying rampaging barhop chemoreceptor overstimulating slabbed adiathermancy hippest lefties celadons playlands chromiums overpraise quadrilaterals shrewdest egregiously"@en ; + bsbm:rating2 "5"^^xsd:integer ; + bsbm:rating3 "8"^^xsd:integer ; + bsbm:rating4 "5"^^xsd:integer ; + bsbm:reviewDate "2008-06-07T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-19"^^xsd:date . +dataFromRatingSite1:Review600 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product77 ; + rev:reviewer dataFromRatingSite1:Reviewer30 ; + dc:title "schmoes piratical anthraces simpers" ; + rev:text "coverlids boxing execrators loofas fugs nonidiomatic discrimination laryngectomize skinniest cooker reseals dehydrogenate antonyms unstained fellowship gnawn identicalness sulfuryls retentiveness metalling footmarks ravager explodes wigglers mouthily uplifts harpooned twirp securance syphilized featherbrained malingers modi bisexed synergistically gagers netsukes intercepting irritably taxable lassos aurum delegates aahing antelopes tranship smirkingly hup peacekeepers premiership incarnated arrestee basting tuckahoes voids portly oncologic noncorroborative sausages enmeshed menacers unchastised ordained asper unlacing eddied anatomized molded nonsuccessiveness bacons voiceprint jocosely psychokinesia amassments chessmen disputably confides locked wanderer wahines canvaser tossed ungenteel horrors naves anemones mussing bights oratrix suddenness probes misspent fixers swiftest cracky utilizable dingiest organdies brahmans expunged borrowing dismantle reasserts wringers bankroll unchaining buoyages dogy anglophobe clogged rowing jumblers datable dearness corder spasms dangs doublewidth marketeers readier condos unfix wonderfully televisionally secularist veiny recombined engrafted dozening afterburner swerving mushroomed parasols knurls fervidly daybreaks shielders wirehaired ergot skiffs signaller hooklets veinlets gobbed thrombotic expanded timberlands lanced yowlers luncheonette transcending fulltime intermarriages rabbles biographer quipsters coccus kyrie refocused certifiable gals nickelodeon xylophonist jaywalk poetize currycombed immortalizes huskiness wholisms equally spars remorsefulness footpads medicining taxidermist imposing mainlanders dopey listening dashing reapportioned recommencement wrangles enraging vociferousness tramways coulees eftsoons burrs captainships sizer excising unnameable blackfoot"@en ; + bsbm:rating1 "3"^^xsd:integer ; + bsbm:rating2 "2"^^xsd:integer ; + bsbm:rating3 "9"^^xsd:integer ; + bsbm:rating4 "6"^^xsd:integer ; + bsbm:reviewDate "2007-08-24T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-18"^^xsd:date . +dataFromRatingSite1:Review601 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product7 ; + rev:reviewer dataFromRatingSite1:Reviewer30 ; + dc:title "hygienics miggs bards configuring councillorship" ; + rev:text "wafers invasions chaffed forehead washstands hokum palomino excogitating radiotelegraphic expurgators hairworm philol clears placarding batwoman vedanta headquartered turner waviness tourmaline swagging melodizes encouragingly unclasp drylot predeceased matures reinterpreting deputed gracioso absinths reduplicated freakout assailment bellyfuls opting inassimilable grousing liens nonpigmented fornications noontides gabling snugness tooted mitigated dapping foolhardier artillerymen griffons oysterer commanders hags cremation vulgarian nonrealistic shist exaggerator gloominess hornswoggling moistful orrisroot disbelieves leitmotifs matchers tanker regressiveness persisted vagabonds detachment luminaries armorial emotes austereness rigmaroles enhaloing golfed quadrate clinkered lugger battleships caponization boars discloses ingoing remarkableness recontamination cilium schnooks unsuccessfulness brattiness varnishes unlearned baal user impacted scribal eery jokes leverets enlisted nonpartisans bunkum streamlining biretta plants cellarets centuries picadores rewords interceptive smugglers misarranges seducingly spinnery megohms crestless alkalinized hiccup amies premixed chophouses aspirating pianic agriculturalists ovulation pinstripe yawning landform vichyssoise calendula dictations terras levied bioacoustics enroll expiates multiplexed guatemalan poured negus phaser pseudonymous increased scarfpin falsehoods fissionable sambo infeoffed interfile hadjis distentions tries chancemen discounting pricky"@en ; + bsbm:rating1 "4"^^xsd:integer ; + bsbm:rating3 "3"^^xsd:integer ; + bsbm:rating4 "7"^^xsd:integer ; + bsbm:reviewDate "2008-03-20T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-04-13"^^xsd:date . +dataFromRatingSite1:Review602 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product25 ; + rev:reviewer dataFromRatingSite1:Reviewer30 ; + dc:title "merman plasticize cree mintmark archaeologic tracer" ; + rev:text "hallways ropes craped diplomacies sodomies viciousness brambliest otoscopy vagrantly takeout resown debts villainousness lushes heads reimprisons restoratively scandalousness supering mouldered sarge squabbler reliquidation served fooling reconstructed enjambments wheelings thermocauteries concupiscent taels windblown twaddles vacuousness persister declaims pederastically corky mantilla margrave microfilmed polarizing rekeys workfolk intonations leptonic goddamns honks curing doozy tanged unfathomed vagarious confuses enjoin environmentalists wordage multifaceted cotter hazings paunches unrestrained spadeful"@en ; + bsbm:rating2 "6"^^xsd:integer ; + bsbm:rating4 "10"^^xsd:integer ; + bsbm:reviewDate "2008-02-16T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-16"^^xsd:date . +dataFromRatingSite1:Review603 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product37 ; + rev:reviewer dataFromRatingSite1:Reviewer30 ; + dc:title "placard sparseness blarney runback phalloid darksome warrantable striations charlady derringers littorals" ; + rev:text "tanagers overexcitable flenched squeegees righteously viscounts opportunistic sighing caviller gimbaled administrative clangors verdancies frizzed veneered assentor testimonies untrimming antinucleon reinterrogations joyriding embargoed remedied retching diffracts gobbled technical tungstenic minicabs mummify spelunk nonradioactive taxable candies disrespectful wrang starvelings purples ecologies chainlike sledgehammers servomotors buckwheats banditry outliving supernumerary civitas wimple nursling veered unedited zooparasitic antepartum revolts inviolateness titers overexcitably rabbits invulnerably haziness tuberculously impenitently classics punter knotting wolfed ebonite hobbyhorses hairsplitting impactors runnel checkups egad rededicate regilt blondest finisher illuminators wiggles hance reclothe mordants affluxes reflexed backspacing lustered behavior khanate mendicancy broads sixes wheezier silvern auricle inheritable looser uppercuts defeminize sunbathe grainers subclause cutinizing taints perverseness signorine subsidizing reexamined unbuckle inscrutably moderates exploiters reemploy grammies notates tonsillar idealized livelong summerier teeners canzona trousers confuted bevies darkness suntans jubilations nonreciprocal nonagenarians republication ungrudgingly zinkify prematurities engild exposal advisement lira lovelier"@en ; + bsbm:rating1 "1"^^xsd:integer ; + bsbm:rating2 "2"^^xsd:integer ; + bsbm:rating3 "3"^^xsd:integer ; + bsbm:rating4 "9"^^xsd:integer ; + bsbm:reviewDate "2007-09-22T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-01-16"^^xsd:date . +dataFromRatingSite1:Review604 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product37 ; + rev:reviewer dataFromRatingSite1:Reviewer30 ; + dc:title "padres zemstvos unbridle pods distorted reassembling mates pegboards inseminators pelfs tolyls camembert kraals burins anticommunists" ; + rev:text "gripey dubber petted lobbyist fancifulness unburdens longed soldered conker fascia ruined shutoffs aligned gripers cultivatable bower menfolks sequestered highjack playgrounds coffeehouse divergently ghat ketonuria cocains clamshells rappels xxi teeniest accruement fabling sugarplum idem humorlessly juveniles highhandedly cavitated tinning worsened senseful unreels arcs rotatable shuddering inquests caulks perhapses effuse blowfishes giraffes jiffs samphires curviness inaptness adventurer escaped diglots amperes escapable thalamocortical murderee eccentrics motivates pandowdy relational pies nursings acoustics origins mileposts scavengery outboast philatelic charms unsay leviathan taskworks octuple morphogenesis stalkily millivolt surefootedness haggling dioramic cavillers crisper nixed reporters confoundedly instated appropriated subsoiling pharm artillerist sharpens foggers reintegrating unquotes bras expenses whalebone tones functioning hardest odor hogshead swamped deflating unclasps counterintelligence unsophisticatedly telly retranslated unroofs comity barky understanding pennants catalyzing pulchritude subaltern shadowers snuffily alveolars muckrakers waffling sporrans"@en ; + bsbm:rating1 "6"^^xsd:integer ; + bsbm:rating2 "6"^^xsd:integer ; + bsbm:rating3 "6"^^xsd:integer ; + bsbm:reviewDate "2008-05-12T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-03"^^xsd:date . +dataFromRatingSite1:Review605 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product86 ; + rev:reviewer dataFromRatingSite1:Reviewer30 ; + dc:title "unconstitutionally humaner eyrie nonmeasurable pyrotechnics invalidity radiolucency unscrambles misaddresses menstruation unwrapping cadetship encephalogram" ; + rev:text "coddlers menageries roached cursing uprearing secludedly freewheelers grinds administerial sleepyheads moles lamped reenjoyed rurally argental concents hazed budding traveling plumpest handrails mammie rufflers easter cliquing deficiencies honourers heaviest rampion decongestion cytologist chirographical bowers illegitimately discountenances regulating nahuatls showrooms variously comprehensiveness foothills veterinaries reassigns doffing ruinate noses ampoules fascists showed mayorship anaesthetized muzzier balmier skimpiness fossa outmarch mignons clacking readably menacer skillfully diplomatist sots densities erectness quartes bladdery preaccustoms breaks baaing singly palatal jawing matronal bawdrics newfashioned categorization captivators congregations cohesions penicillinic cosmogonists potbellied patting defenselessness boffin noggin posthole protoplasmal isles brasses primogenitor savoriness heeders reliance dethrones beggaring jargoning shellers issuing defecates pastille befuddled anticonvulsant caramels foldouts tools insulations fascia humanest salmagundi liana fantails peccavi howler gearcase econ unofficiously unsightliness inclosers salmagundi cineraria howitzers bandeaux pyxies broadcastings remembrances posthumously lamia misfiling outputted phycomycete scut prostatectomies despatchers balminess reaffirmation inhumer frivoler repines mumbletypeg overextend lunching ulcerates psalming flecks brokenhearted greying sagier psychics zoophyte calking solemnly marxists snubbiest hadjis hoopster arioso werewolf mutest hyperons favouring breeched metatarsi servantship postdate evangelize ritualize doneness dabbling flyman impreciseness fireplug kowtowers limeys reflowering polemists"@en ; + bsbm:rating1 "10"^^xsd:integer ; + bsbm:rating3 "8"^^xsd:integer ; + bsbm:rating4 "4"^^xsd:integer ; + bsbm:reviewDate "2007-10-22T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-03-22"^^xsd:date . +dataFromRatingSite1:Review606 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product49 ; + rev:reviewer dataFromRatingSite1:Reviewer30 ; + dc:title "prepayment congealment outswims tailoress palinode hobbler limbs wildebeest astoundingly detectives darnel vainness weening" ; + rev:text "cavy snatchier noms dreks tons reveille devein rosed refractivity saboteur suppressed apres roughened shielders tictocs hied mouthwashes atolls substratum whippings declaimers levied ruinated ejectable nonstandard nictitates barehanded funguses seepier morality lowdowns unharmful churls uneven bagman sassafrases rehabilitations react gremmie spattered oration renege sipping condensation threatful supplicant subscripting liquoring entreats compliments laptop playhouses attributable reincur composites threadier curling trucking appomattox prickling messages dipoles cpi hamburgs shoveler kevels investigator tryptic deifier tapsters electorial overexpectant straps bloodmobiles thirsts atmospheres trashman dishware hairlike closures croupiers zags stickers seamer tones dialogged peppercorn elvishly ired pizazzes cueing cheques catheterizing indonesian enciphered collodium"@en ; + bsbm:rating2 "3"^^xsd:integer ; + bsbm:rating3 "5"^^xsd:integer ; + bsbm:reviewDate "2007-09-20T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2007-12-13"^^xsd:date . +dataFromRatingSite1:Review607 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product46 ; + rev:reviewer dataFromRatingSite1:Reviewer30 ; + dc:title "malaises wiredrawn bogles selling gipping chagrinning laplanders shapeliness consecutively twigged cathects leadership" ; + rev:text "lumps diasporas whimsical bikeway powered ideographs macs does bluenoses femurs simulators ortho satieties whirry emoters piteously catalyses scuffs janitress dekagram knifings misreported merest gelee ozones bereaving friarly mobilia rechartering hiragana reachable pronationalist gateposts ruinate emotionalize ripply polygony harelipped cures wharfages lese umps tymbal communications intersexuality slimier titillative shrimpers motorcades holist bene salads altarpiece repudiates depolishes retailed thoroughbreds dustbins inventing constitutionality reshapers struggled expulsed subprincipal tambouring reframing lemur smelted spunkiness acidifiable shippers lambently cunninger readily trashes variorums medicably systole girlfriends hoke canonists hatboxes impenetrably sadomasochists revelations extemporized pitmen rocks"@en ; + bsbm:rating2 "3"^^xsd:integer ; + bsbm:rating3 "8"^^xsd:integer ; + bsbm:rating4 "9"^^xsd:integer ; + bsbm:reviewDate "2008-02-24T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-04-28"^^xsd:date . +dataFromRatingSite1:Review608 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product8 ; + rev:reviewer dataFromRatingSite1:Reviewer30 ; + dc:title "subdermal slamming extirpated clatters bucketful intellectuals dogies" ; + rev:text "unipod hammerheaded repealable pensioning hypothecate connected recontracting unintelligent diversifications nonliterary suably embroilments raisings deposal halfpence worktables fieldmice studiousness vaunted procurators tamer triskeles untired graupel extemporaneously sedates plainspokenness gigawatts nictitating flintily quavering musting brat erotically pendulous studies canape reinters fridge nonaquatic dithers enslavement manward wining rapaciousness hedgiest whumping mommas haviour stroboscopes rebids frothiest determinacy gunsels prefixes accessibly interrelated legatees sprockets sudoral amex hasteners tercentenaries bicentenary sailing forecasts despondence multitasking burlily erotical timberlands vociferations coequally paraquat confessed chestiest commendably highlighting weeds misbehaves discolorations antiquaries pasturage deflects ensconcing fragilities fourteens holders lazied vulgarness vowless zoological linguists paining regressiveness superimposing serigraphs bossisms jacketing capitulary adulatory centrifuged serigraphers reutilizing dreamed bathless valuta piasters chirpiest automanipulation weightless habits ecol elimination viny pulverize mitigative autolyze clansmen vivisectionist berserks pewees adorner plays veinlets sputa lascars catchments departing percentiles accomplisher paleness sanserifs appose asterism arrayers odoriferously desktop renamed emotionalism retroactively bottleful"@en ; + bsbm:rating1 "7"^^xsd:integer ; + bsbm:rating2 "7"^^xsd:integer ; + bsbm:reviewDate "2007-12-03T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-04-28"^^xsd:date . +dataFromRatingSite1:Review609 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product74 ; + rev:reviewer dataFromRatingSite1:Reviewer30 ; + dc:title "pingers resowing vans boatsmen disregardful enfranchise wadded" ; + rev:text "glider psychosomatics stagflation numbskull surrejoinders reunifying fleshpot dipody ungovernability speculated frenched memorizers nereids semivoluntary angiology polling morgues knurling ossea odorize dinginess mainmast fuguist vaudevillians capitations dogcatchers sloughiest placaters transpiring undergirds travelled emulative bachelorhood libelled sphincter prohibitively stencilling crudding manubrium diffraction erotizing bombloads dears urologists vinaigrette experienced catalyzed divergences reeker punishability wirelessed candlewicks holdfasts transactions penetration trapt unwitnessed tacitly suffixed railheads budless patrols failures medulla volumes nonmetal harrier coroners wiled swords covey mercenarily capturers haftorahs fencible"@en ; + bsbm:rating1 "1"^^xsd:integer ; + bsbm:rating2 "7"^^xsd:integer ; + bsbm:rating3 "9"^^xsd:integer ; + bsbm:rating4 "4"^^xsd:integer ; + bsbm:reviewDate "2007-08-04T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-12"^^xsd:date . +dataFromRatingSite1:Review610 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product62 ; + rev:reviewer dataFromRatingSite1:Reviewer30 ; + dc:title "garrulousness splenectomy longues tonsorial" ; + rev:text "balalaikas cosmogony dugouts accruals seeping dosed trammed perforators enfilade unbind obis estivates marginate kwhr bloodfins earmuff swamper autoimmunize metabolized unblessedness abstinence busywork complacence predominance greenback undermine invocates mazing slinkiest miracles sighting wigwags aquiver custards involved signets shanghaied relevance lectureship birdied scarfing bonders generalships blackguard echoisms tumbleweed delayer omits spiritualizing tarde toolhead cowardly enmeshing inhesions paging captainships overeating falchions servitors expensing morphos shrined foremen hodads tampons nits outscores cokes lindens decomposed flashcube connotes squadroned unveils intercellular unseaworthy magnetized lather easier totable misspends griminess wigeons garlics prinked eructation swilling rumours tallowed sparsely sulphurize partaken autogiros cryotrons crackerjacks misunderstandingly colourers wheys kelpy stainability coitophobia enoughs villainy chitlings pyrogen bitterness touched chinned frothier opp recontract cooperatively clawless eulogia revilers liveliness"@en ; + bsbm:rating1 "6"^^xsd:integer ; + bsbm:rating3 "4"^^xsd:integer ; + bsbm:rating4 "1"^^xsd:integer ; + bsbm:reviewDate "2007-11-02T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2007-11-05"^^xsd:date . +dataFromRatingSite1:Review611 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product67 ; + rev:reviewer dataFromRatingSite1:Reviewer30 ; + dc:title "depressions overturn stateswomen goutiness glanders quilters manifested hogweeds outlast churners inculpates furriner" ; + rev:text "semites vocalizer litigiousness stockier superfluously tentacular dancers verified trustifying epistler heelings sentimentalists injector atomises peps teaches undermining clamor vampires brutalization matureness calked hoariness burleys somesthesises unific interspersion inwinding neutralistic beguiling colitises borstal apocalyptical peavies societies disentitle sulkiest spadices lops refuelling recognition catacombs splenetically shales reverification tossing snowbelt reflow frenum crookeder aphorists catalogues fibrinous acanthuses deployment encroaches currencies deductions nonreaders perversely snorts courters toroids sills mottos supersession positively cadaverously iberian chiropractic nasturtiums amahs quipsters cleavers sceptres honorarily fanciest flappy vouchsafes sweeteners mainly steadiers iteration tabletted convolutely refuged experimented apexes unrequitable soggiest generalization recentest hooded embrocated patches ladrone warrantless wackiness utterer youthened sheenier variabilities penniless ovaries expandable fractionalized critiquing declinature irradiation laureateships stepsons muscats devastation returning pays sticklers bounteously abatis systemizing meditations obscurers cellarets cuckolds dilly balmiest indefinably battlemented decongests alternations atavists freezing gownsman violoncellists suballiance presidiums nonsense blunging dadoes psoriasis conjugates inveiglement tugger introspections kinaesthetically architrave kingliness brothier blemishes cradlesong pastiness terrazzos leadoffs exhibiter misidentifications dialogged golfer creosoting vacationed saracenic ergot trepans noctambulistic nailset pluckiest airsick neckings dilation titty disclose miterers vasectomizing convenience beaters learnt updates awakenings shovelful genocides nakeder syllabified reappeared resifted intellectualizes trends impaling starting pluralized warehousing datively recriminated foredid campanili skippering demagnification federals neoplasm aesthetically smooths entryways holing"@en ; + bsbm:rating1 "7"^^xsd:integer ; + bsbm:rating2 "6"^^xsd:integer ; + bsbm:rating3 "7"^^xsd:integer ; + bsbm:reviewDate "2007-09-03T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2007-11-15"^^xsd:date . +dataFromRatingSite1:Reviewer31 + rdf:type foaf:Person ; + foaf:name "Timoteo-Naaji" ; + foaf:mbox_sha1sum "eaae1d564d4ad61e5d4fb22f6da986a320d6d59" ; + bsbm:country ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-08-07"^^xsd:date . +dataFromRatingSite1:Review612 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product37 ; + rev:reviewer dataFromRatingSite1:Reviewer31 ; + dc:title "sheepfold repress dormice booker hoatzins leathering tribade reinserted hampshireman monisms diag hemisection" ; + rev:text "civilizer martlets surrounding entombments imperceptibly abrogation plagiarizers confronted stupidity presided divagate overimpresses overages misproportions easies beacons helicon raunchier procommunism sprinting pegless meeting fagots bubbly scouting overstrike jeweling guests repacify loveless payrolls condescendingly agitating endorsements reversing departmentally evicting masturbators muskegs preemptively formalins replacers professorship coquettish alaskans monsters brickle heated jazzmen apishly mackerels bonged accidentalness splats demises bottleful verifiers tubbable succotash charted duplicator bloodings resembled muggered bps horary sliest lowlands fletches crying eclogues tungstens civvies emends punishing slivers muddies shadowboxes divines missals philanthropists beheads wapping seemings gorsier sobful resettles leninists bazooka landmarks mediumistic hangers literatim factitious uptightness ageism tartan cabalism subparts sidedness penetrated exurbanites scute tenthly deviational careened filleted zigs airless mastering swiveling groovier playpens collodion subfreezing register garners preexamination westernizing matronliness sunless fluorophosphate consistency herbage verboten evacuated innovator nitrify bobsledded improbability skiddooed aquacades burglars tallowing gropingly reclassifications microbuses hajj eyepoints oxeyes bounders illusions catmint impiousness greenflies agape towels yrs evincive paintiest moralizers hackneys waterproofed gogos sweetening centrism oblately influenced instal bedaubed protectress unfolding illegitimation bradding levant vaccinator enervating cents pygmalionism tags totalitarians fetches"@zh ; + bsbm:rating1 "3"^^xsd:integer ; + bsbm:rating2 "8"^^xsd:integer ; + bsbm:rating4 "6"^^xsd:integer ; + bsbm:reviewDate "2007-08-08T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-03-07"^^xsd:date . +dataFromRatingSite1:Review613 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product32 ; + rev:reviewer dataFromRatingSite1:Reviewer31 ; + dc:title "jadedness accidies tractions avalanches millimicron" ; + rev:text "reverers balefulness preassigned carving casuistry appetizing traverses flagships coordinated straitens rifler attributed powerboats heisted freudianism repaints intimidates raids nondependence overdosing epicentral alleviates identified preconstructing diddled reavowed beefcakes hinny knottiest heterodoxy holocausts toxemia disinfects unheeded babkas elusion jiving mixable reiterations tabard undernourished duellos hygienists taupes clodhoppers disconsolateness fourteenths paperboard systematical insinuated awfulness libras reincurs humanizers reformat preexists dakotan aberrantly survivorship pencilled colleen transistors nunneries kenosises junkie sensiblest ridded blench bowdlerism viable dolomites efficiently varyingly intimateness dreaminess borages crispen shakoes xxv grumbling cadences homelands spiffiest ritziest spattered ostomy dunderpate granddaughters confronts payout besprinkling hellions inviters endued masquers clarified shirring motherboard photoluminescents trillions tiercel patricians"@zh ; + bsbm:rating1 "2"^^xsd:integer ; + bsbm:rating2 "9"^^xsd:integer ; + bsbm:rating3 "2"^^xsd:integer ; + bsbm:rating4 "7"^^xsd:integer ; + bsbm:reviewDate "2007-06-26T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-02-02"^^xsd:date . +dataFromRatingSite1:Review614 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product38 ; + rev:reviewer dataFromRatingSite1:Reviewer31 ; + dc:title "dozily granger zoogeographic soppy handguns pentameter cloudbursts aqueously varietals tachycardiac trinketing bestirred qualmy skirmishers" ; + rev:text "champed centimes slating worths twinges beverages pinkest decimalizes tetralogies bauds bobolinks hellebores pulpy embracers backs wannesses carboras foretimes universalism salesmanship acceptable scuffing cooped carapace rejoin wharfage hemistichs burying sandfishes dockhands stillest vicomte decelerated cosier simplifier sissy laborsaving flutier cacophonies crags lacey felicitator ruralities patriarchates unfeminine throstles hydrological phalli challie guidons muddier coalpits shoaliest eyepoints brochette tallboys overelaborated unchaperoned medicined loanshark proscribed gratae boastfulness wrights headstay annunciation action nonstop pyorrheas stylishly overscrupulousness frighteningly shivs glorification indexation caravels teslas supplants rowings"@zh ; + bsbm:rating1 "5"^^xsd:integer ; + bsbm:rating3 "9"^^xsd:integer ; + bsbm:rating4 "7"^^xsd:integer ; + bsbm:reviewDate "2008-05-03T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-13"^^xsd:date . +dataFromRatingSite1:Review615 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product68 ; + rev:reviewer dataFromRatingSite1:Reviewer31 ; + dc:title "bedecked operatics whirlybird strikeover tissued discriminations hulloing" ; + rev:text "microvasculature gelating wigwagged clockworks drinkable strayed yawled leant presets baked psychiatries db sizzles glorifies confirming decriminalized boggled quey rebels bladed nascency cardiologies downhills nonprofitable ketonuria counteroffensive adjunctive royals ingratiating gestate parcelled stinkards multiengined sputterers semidomestication licenser engorge chemotherapeutic stoner aggregating teletypist tufaceous zoroastrianism jestful differences misjudges encyclicals haberdashers deucedly cordillera proofreaders dreidl earthily dimmer nautch attermined attributives cognation gadgety irrepressibly porting jimmying visitant tetrahedrons dadoed panoramically sacerdotalism wilfully knockwurst nebulise jingliest autonomously unostentatious dissimulates unstrap sweetly reheels semiautomatically celeries disused equalities outpacing biotype kirned illustrator spongiest transferrals acceder interminable befogged disfunction abyes orchestras queueing incisors quakes speculated harpists titillation synods discommodes sucklings brigades cyclical compted sidesplitting nippily snouty valences uniquest appetites metamers secondines moonlets flipper"@zh ; + bsbm:rating1 "9"^^xsd:integer ; + bsbm:rating2 "9"^^xsd:integer ; + bsbm:rating3 "7"^^xsd:integer ; + bsbm:reviewDate "2008-03-23T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-05"^^xsd:date . +dataFromRatingSite1:Review616 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product53 ; + rev:reviewer dataFromRatingSite1:Reviewer31 ; + dc:title "congregations gartered pasted yearnings caffeine instability fluttered unpoetic questor reechoes brislings" ; + rev:text "hoarsen reequips overhastily vestryman counterbalanced kittens malconstruction reduplicating wiglet notational frequency ingoing epidemiological disfrocked ruiners flurried hostel pretor byproducts jawlines prophetical recyclable squanderer chatters sextupling copyboys dallier whisperings seabirds palettes educator poiser husbandly staidly radiologic fidgeter bipods assaulted militaries hornbook declined doweled claimable stevedores hyperactivity antagonize stutters delimits photomicrographic distributively crinolines statist peroxiding landlordism vituperates photocatalyst cordilleras waxer repinned dismissals physiographic confronted initialing bushfires oxidize tikis gunshots beetling banker backstrokes supermini matchmaker synovial carloads letter absconder unconsenting miniaturized auriferous hedgehops universes anathematizing unmolded somnambular doer overtone phenological lawbook wisping bedroll stridently mongoloids demotist wielded misclassifies regionally forefoot jangled fondles windings discontinuity cobbles cloning institutionalizing"@zh ; + bsbm:rating1 "10"^^xsd:integer ; + bsbm:rating3 "6"^^xsd:integer ; + bsbm:reviewDate "2007-10-29T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2007-11-09"^^xsd:date . +dataFromRatingSite1:Review617 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product18 ; + rev:reviewer dataFromRatingSite1:Reviewer31 ; + dc:title "ticklishness mastless unconsciously rechristenings fingerling charmed undeterred cuttlebones scoping viewier watermarking" ; + rev:text "artilleryman dueller snazzier unclaimed accusatorial oculi deist almonry lysed conspiracies flabbergasting woolie excitations bondwomen shul usefully nonprotectively gilts hypnoses cudbears rebounding quantized swindles plastering meteorologist fellatrice infarctions demythologization embezzlements nuts internationalizing engild atmas pacification unrounding maschera cannibalizes revolvers chromize overwound stealers ioniums photosensitivity aqueously bakeshop disrobing vizored monogram handselling scow harks playbacks extradites emphasizing oppresses pedantically shortfalls energizer whooping enfeebled compactness statistically dihedrals outstroke basswoods sulfas breads padlocking gyrations traitorousness totting ejaculated denuclearizes viewed pericynthion forebodies sheepshank accommodator premeditative romanticist mozzarella figment patterns ladybugs depressional criminologies necromancers gastronomically defat webs insists hulls garrotter highlands prejudiced impressments linkages laryngectomies hearthstone calligrapher appropriating dualisms repiners exhibitionist bluffed bossily inspirationally offerers reapplier aerometer depletes sandalwoods hindustani mediative wickiups crabbers straitlaced adaptable melancholies soundings orders contortive lictors rebs buckleless beloved aerolith incumbency revolver crouches unalarming stupors riflery cortexes backdated inpatient deserving adenoids taco discerningly deviling tragically ramjets bearberries sobber dispraise aptness postals marmoset asseverations reinform lodging surrogates slouched topsides evincible"@zh ; + bsbm:rating1 "2"^^xsd:integer ; + bsbm:rating2 "3"^^xsd:integer ; + bsbm:rating3 "2"^^xsd:integer ; + bsbm:reviewDate "2007-09-27T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2007-11-07"^^xsd:date . +dataFromRatingSite1:Review618 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product17 ; + rev:reviewer dataFromRatingSite1:Reviewer31 ; + dc:title "wooded rotifers assays besetters abortionist hipness prostyle quadrumvirate blacklist hellene nonlegal apprehensively ladder" ; + rev:text "disadvantages choky pavan turnovers comfortless dogcarts chaises vases endue valvular greco grimness tailed comforters mouses dynamistic obsoleteness jarfuls deceiving equipage alerters smudgily correlations spurrey anomia disoriented inquisitors commies decidual legionnaire dietitian reimprisons frusta vined quitrents larvas nonhero advisement cruet damasks faceup reseating enactive implores salubriously sorel apiarists algebraically hemorrhoids diluvial externalism speculative wayworn rejecters paganish teakwoods investigatable tympanic inseminations lyrated decampment nummary underpays laryngectomies palettes sandaled impels squared jayvee unescapably stagily docker etudes acculturational mirrored reawakening misquotes inculcation pinkies tarter tutankhamen depredations manner rediscovering telegrapher petitioning deluges drawly diastolic tartare ghastliest galvanizer plateaus psychodynamics ruffing warehoused predominantly ninnyish grovelers imponderability triumviri girted tabbies humdrum stollen protracts ferriage pleasing hypes shadowiness zests climatotherapy slyboots rosters beautifiers divulged mistitled tribally sacrificially outbacks coagulometer syncopation woodruffs congruously indestructibleness"@zh ; + bsbm:rating1 "7"^^xsd:integer ; + bsbm:rating2 "3"^^xsd:integer ; + bsbm:rating3 "7"^^xsd:integer ; + bsbm:reviewDate "2007-07-31T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-01-18"^^xsd:date . +dataFromRatingSite1:Review619 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product29 ; + rev:reviewer dataFromRatingSite1:Reviewer31 ; + dc:title "refractivity preacceptances calculator unravels almonds whooped" ; + rev:text "softwares unroll reemerged pebbly doodler topers membranous fugatos precools noncontinuous roughhewing biographer snivels timberline automanipulation formulas triglyceride flitters esperanto billingsgate kangaroos macrocephalic unprocurable trammed apteryxes gentil oldstyles mortared glazed simulcasts improvisers climbers saviours arbitrable underpass uprisen reconcentrating infatuating censurable copulated conte aviated hurrier libbers gigantism overinflate osmiums compulsiveness predesignation volubly nigher adumbrates optimization outbuilding incoherently respondencies androgenic buoys nudnik bloaters eastwards cordobas blousier seabags plowlands ungrudgingly cuffed underemphasizes reinvoked barograph kymograph epigrams boodle hawkweeds pericardia constants osmoses intestines amphibiousness jungles immersing sentried souping reconsecrated backspaces riots fumigants alkalinizing courtesans deacons embordered whereabouts larruper crunchiest heinies townspeople teensier retry thickly abusing humoring stickouts eccentricities osteosclerotic purples endomorphic adversities asslike reprobates odic indigoes bloused septical hatpins"@zh ; + bsbm:rating1 "9"^^xsd:integer ; + bsbm:rating2 "9"^^xsd:integer ; + bsbm:rating3 "6"^^xsd:integer ; + bsbm:rating4 "1"^^xsd:integer ; + bsbm:reviewDate "2008-05-03T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-05"^^xsd:date . +dataFromRatingSite1:Review620 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product31 ; + rev:reviewer dataFromRatingSite1:Reviewer31 ; + dc:title "drawlers throughway practicability bungles gamete wiver distrusts nostrums airdrops splattering nontheatrical conveyer challenged jesuitry succoring" ; + rev:text "heartbroken lapper exacerbates follower theocratically pharynx ulna disbelief looped typical baldness vaporize yanked tizzies nasturtiums sixte fridays brezhnev undecorated comprising peris denarius baggily supersaturation backspaced monozygotic parabolas adhesively accompaniments hasping commenced solidifies charter tsarinas corpulences paperboard trippings chinkiest reenacted thighbone oratress canopied vaunters knowingness septuplet chymist larcener startling anticonvulsant unmitigatedly timorousness killer tromping damaging symbiotes proprietresses stabber overglazes flicked sweated iridescences cyclopedias fermentable dressage stalemating rigorists tenderability salaciously disrespectable yasmaks consents reradiates qoph beamless colder aestivated trickie inventorying reticular rekindled adventurously deoxidize clamming telemeters misidentifying lobotomize greyed opaquest perkily beached workbag reminders incisively emblems percale missilry voodooing winterkills digesters hallooed marshy halos squads escallops baptismally oversimplified charmer spindler redskins bluefins accomplishers sociologies honkytonks thraldom associations subparagraphs muonic berliners lambers plumbings repositories apparats starching beadsman triadism rocketed intersects chucked climates graduations unresentful umpteen amenability idolizes heatless apolune roaches naris courant misarrange bassets underbelly sewing gabbiest hedger demobilizations knots pseudoscholarly collegians disassemble silvers reeducating ostracized garoting engrailed ruckuses jiggled wickedest kinescopes stampeded heathery imminence gigues questionably thundering electromagnetically unsterilized initially quipu defiances sphygmographic rover obviation saggier reargued smirkier footbaths preciosity xeroxed mislayers mystifies roughages aller cuisines skyed natality thumping darkens planetologists aflutter rockets luminesced nubbin"@zh ; + bsbm:rating1 "9"^^xsd:integer ; + bsbm:rating2 "9"^^xsd:integer ; + bsbm:rating3 "7"^^xsd:integer ; + bsbm:rating4 "7"^^xsd:integer ; + bsbm:reviewDate "2007-11-28T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-15"^^xsd:date . +dataFromRatingSite1:Review621 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product39 ; + rev:reviewer dataFromRatingSite1:Reviewer31 ; + dc:title "restitutive edification sprinted gravures" ; + rev:text "overacts pinnace chieftaincies stagings varied lotting represents hayride stintingly chromatically glamorize dullness euthenics easiness waifing anagrams maneuverability sisals englished ictuses reproducing banknote oddish espresso nucleolar approbate nates itemize irruptions caballeros reasserts fighting acquits defuze respirators associatively inelasticity resumer dynamoscope ballo rumples forces madwomen uncivilized roc acetates polemics approvingly foretimes quinquina discordantly marinates glaciers implacably rehinged stockkeeper separateness thermoregulatory skipper danging lazulis lacings sidles maoism backwards hairiness cussedly astrolabe danced obeyer credibility infiltrated estancias displacements figeater caballing normed ladings killing booster knifings copula memos knowledged potboy marchesa pentacle illuminates gravure gothicist wickedest cades flouting represents borage frostbiting pongid olympians misuser supercharger protagonists commentators optioning hangars coaevals detonating hoboism effervescence arbitrager deeps archived accelerant headspring xix historicity elbowing linseys hymenopteron biathlon nonvisually valuing misdeal clutching squeaked sweepers reaccompanied sneakier senatorship kashmirs apprenticed traitress squarish snuggled zee surgy tightly inconclusiveness entrained subcouncils helicon scalesman lemonish disenfranchisement immigration loyalism equerries defilement souchong slumlords equivalencies disputing shacked kneecaps gainer"@zh ; + bsbm:rating1 "6"^^xsd:integer ; + bsbm:rating2 "5"^^xsd:integer ; + bsbm:rating3 "9"^^xsd:integer ; + bsbm:rating4 "2"^^xsd:integer ; + bsbm:reviewDate "2008-05-25T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-14"^^xsd:date . +dataFromRatingSite1:Review622 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product93 ; + rev:reviewer dataFromRatingSite1:Reviewer31 ; + dc:title "exceeders phobias gloomings doggier fetlocks veldts" ; + rev:text "adit nitritoid reawakening rupturing windburnt jumpiness biographic radiophones wintriest economizer misspeak spoilsport alumine steered redeeming shirtsleeve barographs supersonics gearless encrypts unsexual superabundance retrograded tutored gunning chrysalis nooning toothing boer underassessment imaging receipted encyst unhappier twins forced conciseness bathhouse tertiaries troubleshoots lengthens preeminently forsworn cerebella polarity crochets shanks cohesions benignities learnt marcelled licht tempted perukes mussels treadles oxygenates augurs miggs unlimitedness introjection radiators levo introversions subversives laparotomy obliterative drawbars lionizes amex spoilable endowers nonliturgical noontimes opprobrious bubbler disarranging rovings epithelia folios splenectomies churchiest agonizingly slaughtering feudist uprooters gravity positively sunglass overabounds reimprisons saunas reincorporating prised jujitsu bracelets clavichords beaucoup lacerable showiness upshift presumptions regionally kitchens bareness coalyards enclaves subphylum saltines imitation shysters stripteasing wharve exedra recharters melodramas appertained fastings emotions intl malaysians sieved pilaster interacts evictees backrest interdenominational leviathan permanents internees ruinated meteorological unobserving deoxygenating bottler knowledgeability sangrias oblongness prophylaxis prickling mythologist delimitative blockbusting inboards trovers noiselessness misdoubted interceptors motorscooters bladed prototypes pronunciamentos"@zh ; + bsbm:rating2 "3"^^xsd:integer ; + bsbm:rating3 "5"^^xsd:integer ; + bsbm:reviewDate "2008-03-08T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-04-07"^^xsd:date . +dataFromRatingSite1:Reviewer32 + rdf:type foaf:Person ; + foaf:name "Anasooya" ; + foaf:mbox_sha1sum "b2f761fe6e5de12eabb1df9464da2abcef3fc" ; + bsbm:country ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-09-08"^^xsd:date . +dataFromRatingSite1:Review623 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product60 ; + rev:reviewer dataFromRatingSite1:Reviewer32 ; + dc:title "nucleoplasm gapping indifferently lyrate harshness runnel unshackling bullions" ; + rev:text "sinistrality unloose vaquero moonsets bolshevists hymenopterous familiarize notepaper ecdysis penalities gatherer pastrami jogged graving stats libertines rawhides expatriation fluffed haughtiest antivivisectionists moils loops spirea clipt fease censes contortionists innovations cashoos culpae epigraphy confessedly masonwork bitting longline followup champagnes kishka teratism palliation tags unsurely viziers tyrannize foreby parfait electee grimily scullers obsessor cotter tenements blabbered browsers startlers considerately copulas heathiest goldener indistinctness solidi implausibly raceways stonily nondeductible downsized wingless nevus pathological haranguing juices profascist eulogists tirades precalculations forebodies niacins messmate solvency videodisc lineally nonchargeable gravities corm reactions bigeyes persuasions mooting invoiced gilders longingly logotype archeology droopier muskmelons unintentional unhealthier spondaics exhibitions pettifogs menses pecking emirates heroical perils baklavas weevils appliqueing triturates coordinators prevuing adultly attesters soothly sinusitis eulogist embolic spittoon muzzled cutaways munched inculcating hypnoses consummation egressing wrathiest ossificatory stenches sylvius curlily wye maracas droppings communard scrod penitents cambist porpoises pervious hinderer comas tyrannized doddering unrighteousness henhouse manhandles cuttles scubas gormand schistose namer preempting cerebrovascular finalize uncommon irreligiousness hours cinematographer chessboard verandahs brittled encompasses truncated awhirl menages pummelling promissory unaided abstaining choiceness enveloping wonders terrorizing gilding distinguished"@fr ; + bsbm:rating1 "10"^^xsd:integer ; + bsbm:rating4 "9"^^xsd:integer ; + bsbm:reviewDate "2008-03-29T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-04-12"^^xsd:date . +dataFromRatingSite1:Review624 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product46 ; + rev:reviewer dataFromRatingSite1:Reviewer32 ; + dc:title "informativeness personages enflamed valorizing balloonist mooned coagulability redeliberation broadness palatability" ; + rev:text "undy blackguards zairians workingwoman trying faster biomicroscope aluminized sharpens toolrooms contrarily meetness poorest stetsons tiaras crosshatches yttric archeological affordable afghans subunits unworthy thwarting reordain humoral sumpters brightest muddles enshrining snowfalls fanfolds indurate reasons hardtacks brimless incomprehensiblies triceps inconveniences competitiveness warpowers barks orchestrates squawked stiffly wiseliest adjourns praline promotions mistreat scentless enunciations trinitrotoluene perhapses wagtails wirephotos surprints coypus attenuated aerobe overfatigues hoister recrudesced chants phoned redirection sublimity backdated pumpernickel litre intersects insinuating nursing ricrac resource swainish beaches mushily dreams asshole agreements"@fr ; + bsbm:rating1 "10"^^xsd:integer ; + bsbm:rating2 "8"^^xsd:integer ; + bsbm:rating3 "2"^^xsd:integer ; + bsbm:rating4 "10"^^xsd:integer ; + bsbm:reviewDate "2007-09-25T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2007-11-19"^^xsd:date . +dataFromRatingSite1:Review625 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product71 ; + rev:reviewer dataFromRatingSite1:Reviewer32 ; + dc:title "bewitching concluder barman poxes granites boondoggler eatery selfing flightless phobias" ; + rev:text "circumnavigates wildish plainsong pastorship sliceable dekares dandification passengers besetter pintsize microscopies supportable nonmilitantly bathrobes blunders endogeny enclosing goddamn tonguing bitable kerfing fastenings chelas aeroplane demoiselle uroliths bucketer positioned unmans captives buckaroos tightropes duodecimals consulted anneals magicking debrided darkles tugged microprocessors bursters bores inweaves electrifier caveator sleepier cocainized watercolor peristalses ceremonialists mismanage denies odorized achievable similarly faggots chunkiness neuromotor damned axletree gravimeters irrationalities sunbursts obstetrician blazons bromate impulsed assessors byelorussian proletarians cowpeas bursarial obligato nybblize bookbinders graveling revealed regulates struggled misbiassed unnumbered exudes tankfuls pilotless develope deuterons urethras ripply atrophies grumpier schedulers prepped jujutsu goofing towards multiparty captivating misfired encodes priggishness taffrail chancres urbanest spake headband supercedes unexceptionably puckerier cultivated uncleared infringement chancellery oohing abstracters polkas frogfishes reply swaggering libeled associator frontiers nullity heterosexuality unharnesses untrimmed lustiest videlicet rediscounting misterms stockinette axioms undone soots unpopular unshaven hustler powered cattails snarling yowling predictors getups jellylike artificiality shelling youngling thicksets pinnately faithlessness bureaucratize discontinue unconformable hoarding pinholes dobermans epigraphy simpatico thyroids gluttonous cheques sorer lactations stere feels spiritless executorship sons shogunal"@fr ; + bsbm:rating2 "6"^^xsd:integer ; + bsbm:rating3 "7"^^xsd:integer ; + bsbm:rating4 "5"^^xsd:integer ; + bsbm:reviewDate "2008-01-17T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-02-21"^^xsd:date . +dataFromRatingSite1:Review626 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product48 ; + rev:reviewer dataFromRatingSite1:Reviewer32 ; + dc:title "gnashes blatancy settler preens adhesional overissue reappoints subkingdoms kris roosted bello anointed unesthetic placably" ; + rev:text "asphodels clausal catalog befitted interned thwarting belied swop cs sublevels tepidness championing rememberers reimbursements fortunes disorienting ragtimes reticules idiots buffalos automatons duskish eloped yokes coxswains minora burbler condonable bewailer pachisi masturbators pennyweight unlimbering tragically ragbag generics shrouded brutalized struggling depresses retraining bookmobiles isotonic ravens toking resituate kabob tetrad untouchable keynotes whiny bitingly easter intromits precisians callboy bobsledders beachheads reattaches cullers improvisers langauge stutters intra insubmissive forequarters imamates aberrational trisecting retractor discontinue derided fungic deficits caparisons urologist roiled ugli melts outargued coins browless algorithms hellions leavings ambulated aspersors renamed counteractions forbearing grittily inducting communicators algorithms chromatographic migrating faintness centralized turtledove corky vapours quadricentennial instants kerosine intertwinement sequencing buggers epistler unstinted marshes healers cruds divulgence depopulated vouching sugarplums wrecks bleeps sections keywords titivated clangour shilling ambuscaded blatancy zagged fazes pud fogyisms mutilator grandsirs legman roaders interrupting shaitan orchestrating subcommissioner crusaders wrongheadedly kadish whomps apery moneymaker noddles venerated berets coherence mistakenly crayonist blarney messier alimentary dermis stabbing brainpan munched operates degreases plumaged slipsoles josher stoat titrates melancholic edgings loco lateraled cajaput mismanaged pedophile browner reemploy simplification restrainedly reforested poufs hoppers dedication highnesses betrayed transducing loonier demographies dreggier unpile saharan amassment accordance noctambulistic rheometers steered proselytizes roisterous typifiers poets contentment jackleg"@fr ; + bsbm:rating1 "4"^^xsd:integer ; + bsbm:rating2 "7"^^xsd:integer ; + bsbm:rating3 "10"^^xsd:integer ; + bsbm:reviewDate "2007-11-24T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-01-31"^^xsd:date . +dataFromRatingSite1:Review627 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product66 ; + rev:reviewer dataFromRatingSite1:Reviewer32 ; + dc:title "floweret equinities exotically handgrips admixes plywoods pingrasses shandies requiters kashmirs vaultings cravenly crematoria transisthmian nonessentials" ; + rev:text "cadency acknowledging jargoned gasman somatopsychic defendants programmers buoyances splays olios pervious reasonableness quartets parries ladyfinger cheroot ref simplifier spoiled basher uncomplimentary bruskly stridor detachment fretters carbonize boringly depilating bindles foehns adjudicates militaries enlarger stimulated auxin neurologized acknowledgment stratus bodies caries antipathetic unscrupulous prechilled yellower hoptoad unequally corning prorevolutionary denarius convicts snowmen trop henna considers defrocking palmettoes legislatorial trivet sportscasts committals recept umbrellas depolarize scrapes spieling variegations chagrinned reran quicks photos bonnier kirtled angering misstatements overpays ruralities demobilizes frenzily frat aroynt overdrank introspectively outfittings conceptually bichlorides miscue guiltily garrulously versifiers purblind unseasonable penpoints armouries entanglement lather dwarfing rehinged bowlfuls scapegrace fonds accosted daysides attendance abstemiousness effulgent matzo unfaithfully cakes poller rabelaisian ideological shipmaster horripilation philter truest lyingly evicted repeopling tillering kissable crewed maharishis desexualization uncloaked"@fr ; + bsbm:rating1 "9"^^xsd:integer ; + bsbm:rating3 "9"^^xsd:integer ; + bsbm:reviewDate "2008-02-19T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-02"^^xsd:date . +dataFromRatingSite1:Review628 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product81 ; + rev:reviewer dataFromRatingSite1:Reviewer32 ; + dc:title "trucks dysfunctional sobers innervating argosies hardstand czechoslovakians chillies queenliest radiologies demilitarizing deprecating" ; + rev:text "waled gobbler hoagies cenotaphs drowsed wifedoms bookrest patella discourteously crescendos despoilments ghee fraying rutabagas loos reprieves hawkeye mated sunderers thumbprint nucleonics prelacies liefer braving homelier languisher newts doz finder caterwauling potsy rotors carefuller nonuple misclassification deutschland anteaters sheenie seismographic disrespectful idolize lyrically tracks pastern clarifier bleedings ablutionary discuses psyching fabling vivant streaky misprint absentees erupted belled timbal llama expostulate preventively nationalistically doxies emphasize situating humanism ministries litigations celebrationis mammographies liney emboldens vases larrupers fatigability fees decider unapprehensive chiaroscuros highlights parasitologic affirmable inertly frugged smelted liq hedgehops mortifying atween signeted aviarists litter bombsights mottler fornicatrices lichees thrummer interviewed bosques evaporating odorized modernest lands magnetization teratologist hollowness wonderfully briary browbeats frames pabulum penchants replants brambliest preaching bulls collectibles sequels congesting enjoyments reclassification painkilling"@fr ; + bsbm:rating1 "4"^^xsd:integer ; + bsbm:rating2 "3"^^xsd:integer ; + bsbm:rating3 "9"^^xsd:integer ; + bsbm:rating4 "7"^^xsd:integer ; + bsbm:reviewDate "2008-02-15T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-10"^^xsd:date . +dataFromRatingSite1:Review629 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product49 ; + rev:reviewer dataFromRatingSite1:Reviewer32 ; + dc:title "peashooter outwit unscrews validatory resown obliquity nodally douching preexaminations" ; + rev:text "overdose tallier tending roughhouses dekameters embezzlers kophs cheated microtomy petcocks louisianans globetrotting turbot gaslights directional woefuller violently backlogging fervency frescos loads overboard bowlike malays impeachments behoove enlists abhorring loanable pasties reddens filmlands bromidic defiantly monotonies subareas cogway photoreceptor endearing miraculousness hempweeds inst curtsied reconnoitered slotted phonogrammically recondensing unwholesomeness hiked safetying restitutions remilitarization caterers glycogenic yoghs minifloppy knacker couples corroders precancelled misclassifications ignorantness hemps layabout emanates gestural besom wringed burnouses zestful graecize gamete viatica precedentless frizzers medalists cabbalas budgeters hawkshaw paternosters films pericarps scallywag weightily tendentiousness repatriates bibliog reduced incredibly impassiveness chaffers inclosure sackings wholisms urbanizes hedonic bibliotherapies anorak memorials triviality lampoonist emerged pimento eulogized snuffy floodlighting apelike anaerobe geometric toehold expedites attired bastinado sestina clingier frescoists mangey cacodemonia finical spathes riots disburdened puffer selfsame smeared fogyism antipollution aerations compartmentalizing grenada coatracks elation collimating denigration bellowing succumbing polyhedrons surmisers hubrises intenders chapbooks carneys thoued rocklike trusteeship hobnobbed smirched terminologists lawed unstated negativism overacting vestment safegaurds greediness ferryboat worshipping coenact displaced inscriptions teetotum discloser naphthas"@fr ; + bsbm:rating1 "6"^^xsd:integer ; + bsbm:rating2 "4"^^xsd:integer ; + bsbm:rating3 "8"^^xsd:integer ; + bsbm:rating4 "5"^^xsd:integer ; + bsbm:reviewDate "2008-02-15T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-03-30"^^xsd:date . +dataFromRatingSite1:Review630 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product67 ; + rev:reviewer dataFromRatingSite1:Reviewer32 ; + dc:title "seedlings chins relinquishers generalissimos" ; + rev:text "overlooked headwaiters carrotier shovels partings reenlarge geraniums hormonal reawaking lins slubs cariole cyprians rumbling untrusty flawy daylights numerologist dictators cognomina patronesses purled mortifyingly irritancies unconscientious lancets warpath betrayers rapids desensitizing cuber mirthless mislay reexperiences aulder tankas reavowed thwarted groggiest arguers tzitzis substitutability boatswains psychoanalyze unartistic designative blackmailer obstetricians cracknel allheals perceptually conveyances prorogues teawares broiler issueless chatted legacies charmers sacks discomfiting woefulness insistence stilts erotogenic messiness openness vinylic unregimented clarion meekest tabaret jarsful garmented fragmental angrier salinometer alternations laddered reconsigned subareas inviters rationalize refunded portends focussing wars alarum attenuated priority localized engravings cheerios splays sheepishly pealed bedpans mischarging dept bunkos unapologetically incorporating vasoconstrictors isotonic incorporation superstructure decoding darning rainmaking outwitted merchants metabasis upraises jollying orifices denigrating jailing tailings homophone boloneys evillest impressed emblematical audiometers hallucinoses idiosyncracy patchers knaveries preluded athletically tattering trooped swishiest nonconsecutive repugnancy nullities thoraces doubters tomographic ticker percussional alleys marauds worthiness credited"@fr ; + bsbm:rating1 "4"^^xsd:integer ; + bsbm:rating2 "1"^^xsd:integer ; + bsbm:rating3 "1"^^xsd:integer ; + bsbm:reviewDate "2007-10-14T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-14"^^xsd:date . +dataFromRatingSite1:Review631 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product51 ; + rev:reviewer dataFromRatingSite1:Reviewer32 ; + dc:title "outwaits unhealthier shibboleths brays gras" ; + rev:text "sporadically mulishly nonsuccessiveness mutagenic plumed subbasement giddies coordination letups defoliants utterances ironically prettied cobbier mazing architectures assentors impinged plaudit kiefs aeronautically penetrating psalmody sovietizing eleganter unuttered tines hyperion unescorted beans bads warmongering auctors recompenser monisms bestiary kitschy narcissuses legislating merchandisable violative soppiest onanisms tasseled akimbo quieta unpledged jokester gimp conveyors discontinues compulsives starts coalescence madwoman impaling dishwashers ormolus foment tumblings totted nebbish southing insubordinately calciferous hells renegotiating rewashing rancidness realigning lionize illiberal limber effulged mammotomy libertarians ubiquitously shaving frillier unaccounted devours backlogs paganizes pompons nicely rhythmical immortalized pandering noncollectible equivocality divagations underdressing antihypertensive recompounds reciters fadeless uniquest unexploded tendentiousness feyer kelping bionic maddened honester mothery motioners evaluates sandblasting nasalization incandescence cinematograph dredgings caboodle"@fr ; + bsbm:rating1 "8"^^xsd:integer ; + bsbm:rating2 "8"^^xsd:integer ; + bsbm:rating3 "10"^^xsd:integer ; + bsbm:rating4 "6"^^xsd:integer ; + bsbm:reviewDate "2008-01-30T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-02-04"^^xsd:date . +dataFromRatingSite1:Review632 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product85 ; + rev:reviewer dataFromRatingSite1:Reviewer32 ; + dc:title "excellencies axels wifed avascular asyndeta turfy pejoratives overfull breasted flouncier exploiter" ; + rev:text "yuletide stoops containerized oversparing cheerier casteism stereotyped ills misstep dragrope constitutionally coverlets polysyllables reaper reflexives wanderers mayorships entanglement pelicans redcoats medicks batboys episcopacy unmeaning stuns mismatched drossiest microbiologies asthmatically consolidators jesuits antra slashings imaginations brined snuggest manslayers summital cockades barmaid sublicenses pilose deerstalkers categorizes wilily twopence rearousing radiosondes photocells gnawers fashions overmuches pocketfuls ratifier interceptions ripraps whooshed thousands rosters jazzed lobefin pointillism secularity azine enplanes underwater antibacterial republishing betrayals sexed outranks bedeck poetasters darks assignments overleaped sunbird shortwave chandeliers seasoners recalculating opalesces runners embroiled wingding swiftest eyeletting oversell unsheathing ebonizing annexes panoplies allheals bicolours backhanded phonos bespangled lightships syndicated diffracted untaught pillaging microminiaturize poetesses melancholies incitement flexions congregations jubilees caresser spoofs registering atropine tenability trisected shampooers enabler sowbread programmatically tooled famishes sublunary conoidal sweatboxes prosceniums drives delightedly pleasanter reascend tranquilizing splurged finings horrifies flubbed relearning"@fr ; + bsbm:rating1 "8"^^xsd:integer ; + bsbm:rating2 "8"^^xsd:integer ; + bsbm:rating3 "4"^^xsd:integer ; + bsbm:reviewDate "2007-12-01T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-01"^^xsd:date . +dataFromRatingSite1:Review633 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product62 ; + rev:reviewer dataFromRatingSite1:Reviewer32 ; + dc:title "equivocacies playgirl upreaches kneads privations maddens interlocutor coerciveness combattant overestimation battlers biotas muddily danglers senoritas" ; + rev:text "dextroses pausing worldlings savager isobars throwers moldboards metabolizable mushrooming saltbox eczema contractions crawfish filibustered navigator housewifeliness overdiversification coppered saintliness potboilers embowers coagulating baobab decoyers unclench masculines irremediableness petrologic unfaithfulness williwaw kiddies sneeringly apollos hotblood czars suspecter thumbtacking waver droopier berries pharmacologic lugged badmouths waler foothold flivvers animaters odorizes neglected musettes beddable modernistic revilers cosmopolitanism ciphers deepness instruments irrupting buffer arco tropin loners antiquates jiggling broidered cornering gelatins dacoit newsletters chelas handcrafts deprivers relists unaddressed determining tangents"@fr ; + bsbm:rating3 "9"^^xsd:integer ; + bsbm:reviewDate "2008-02-08T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-01"^^xsd:date . +dataFromRatingSite1:Review634 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product32 ; + rev:reviewer dataFromRatingSite1:Reviewer32 ; + dc:title "bombsights assemblages immunities sceptred barraging brails polemists waistcoats indigence azole misinstructing" ; + rev:text "otoscopy becalmed uncourageous decreers cislunar attentively irrupts roperies arabizing unsolicitous scragglier hotelkeeper reframed incept reliquaries reacquire filaree forewing reweaving comprises trousseau helpmeet mynheers sitarist vignettists remarques impaled marting muddled abiding ramifying crinkling suffixing flatfoots piggybacks forelimbs pseudonyms knells overspends sovrans skipped drably ceding streetlight hived entries units detoxicating symbolisms paellas reusability ganging kentuckian grimmer routeways grubstake vergers underproduced deflations tigerish conciliating margraves altarpiece erns hipparchs sacroiliac subversions beatification stipulating relievers lapidists delicto unleashes senilities intelligibility typifies staunching embracing unclosed permeably oolongs avowedly router rephrase prefigure genitalic linebackers cayuses snipped nationalists restorer rented"@fr ; + bsbm:rating1 "2"^^xsd:integer ; + bsbm:rating2 "5"^^xsd:integer ; + bsbm:rating3 "10"^^xsd:integer ; + bsbm:reviewDate "2007-12-31T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-01"^^xsd:date . +dataFromRatingSite1:Review635 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product30 ; + rev:reviewer dataFromRatingSite1:Reviewer32 ; + dc:title "clamorousness digestiveness unquestioned turd" ; + rev:text "nodders maltreated protestor bartered assassinates asylums thermodynamics philosophizes polarographic kyat reerects windowing rousted sickbeds revocation loomed prebends juncoes subdivisible programable cricketing cranching dividers overindulging exited arbitrational tollage devils molests slappers saids spalled plebiscites rhizomatous deducting resorter pacifically ebon uncleanliness lagoons footpads penologist borty chitlins tings regimentally foramina spreadsheets legitimated incising duodenums cuddlier heterophile brutifying bartering scooters interposers pulers koshers federating miscalculation horribles bloodshedder sickbay filers playing cardinality releasability disgustingly drizzled gelees shallowed vendable treating mussier largeness occupancies condores"@fr ; + bsbm:rating1 "5"^^xsd:integer ; + bsbm:rating4 "5"^^xsd:integer ; + bsbm:reviewDate "2008-03-01T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-03-31"^^xsd:date . +dataFromRatingSite1:Review636 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product62 ; + rev:reviewer dataFromRatingSite1:Reviewer32 ; + dc:title "fortes sobbingly leveed sudsless boarders packs auntliest accessed" ; + rev:text "deifier forts carboyed overweens viaducts overriding glummest tardily cajoling misplayed squashing studies decocted savingly unstapled wrongness erosions paretics selects tainting consonances stooging camels geckos uninjured insurrectionist reinspected hairsbreadth daredevils timider nodules underlings verminously seconded preblessed copolymerizing chirographer snubbing malarian brandied hyssops bola uncovered priciest armors yeshivoth occultism seminude station exceedingly nonformation clasping blear microphotograph angled bowels colossians overrides adolescents gravimeter emending midwiving infringers kremlinologist lappets rustlingly cerebrations spaces adequately decalcifying rickshas volunteering rationalizer imaginer toweringly pocketing jazzer dowers parasitized presold entrepreneurs innocents preciosity jitterbugged giggler orotund torpedolike crinkliness pipeful ruminants longing poetizing nix woozy silking configured screwed nutlet underpasses barnacled kyat cine amphoras afternoons chemically lifter incorrigibly latissimus prebill reteach"@fr ; + bsbm:rating1 "6"^^xsd:integer ; + bsbm:rating2 "7"^^xsd:integer ; + bsbm:reviewDate "2007-10-18T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-03-03"^^xsd:date . +dataFromRatingSite1:Review637 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product67 ; + rev:reviewer dataFromRatingSite1:Reviewer32 ; + dc:title "liquored garoted cyphered tabouret vigorish honkie older extraterritorials loquats paintiest decameter folksily astern assimilating" ; + rev:text "laryngoscope inducement polities powerless yawped styptic reshapes grandstander youths uninspired scathed syncoms dictionaries polestars dibbuks subterraneously molestation rambled colleger subunit lacier yields reviler candlepower kinks mulla sheaths nonheroes unliveable churchly audient expecting ideologize institutor sender determinedly cultic sergings misarranged yoicks undergraduates governesses aoudads highth lichi harmer interchanged auberges frappe cardiacs removable sightseers confirmable elimination sarcophagi barrooms overheating hoodwinked nervosa theatricality unopposed relationships deplorableness irrefragable appropriative brighter adz closeout carbonation disinfections handles detached scraggliest unmagnified dishonesty compted thoughtfulness silicones cateresses inflexed nester whiffler energise reinterprets frequencies gasifies skirls traditional untethers generatively carloads inadequacies cropless lecithins cardsharps subrace uprivers anviled restrained basinets outsold monosaccharide wigglier archives regressors expressing poolhall ossifications outwore quintuplicated censurers faeces recondenses slipped snowily laddering trimmest stalagmite wrathfulness convalescence archetypes trucks"@fr ; + bsbm:rating1 "4"^^xsd:integer ; + bsbm:rating2 "3"^^xsd:integer ; + bsbm:rating3 "4"^^xsd:integer ; + bsbm:reviewDate "2008-06-08T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-14"^^xsd:date . +dataFromRatingSite1:Review638 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product55 ; + rev:reviewer dataFromRatingSite1:Reviewer32 ; + dc:title "elaborated vacillators executed objectionable emulative reuniter pees sunbathers homeless reteaches" ; + rev:text "counting bloodtest papyruses diarists spriest rewrites reply queering conformationally undercook galvanizes frenetics proles tonality empathizes substations procommunists urologic wireworks feminists nooses timed premisses locker chumship mortice commendable infundibuliform houseclean drubbers evaluates screeners racketed calcaria bowdlerized radially marlinespike classmates ropily fridge trustable traducing irradiated dissoluteness nebulizing corroboratory lowed wheedler scrotal buzzers inclosed mixes duffle deadbeat citable closed staffing sonants libs palinodes dehypnotize finales presley amphorae squeakers bobbinets incurable propagator sheeney ceiling thereout samite beautifies liveable remains wenched ultrasound strapped nonman unpitied eighties felts mariachis enablers winnowed wizardry compromising sailorly barhops annually ridable sinews knifes hindrances ninetieths theftproof victualing nebulizes ranges southwesterner vamoosing antitrust defensiveness underdoes faunally coots antidepressant overconfidently codeless aglee peahen jelling hoods populousness neutralist journalistically reunion enrol burglarized undesirable interrelationships frontlets satanically sludgiest ponied psychosexually pearler loans attendances cycloids chinos imprecating azote pseudopodium frumpily pupillometries moues admonisher reapplication gallimaufry metabasis marchers amaranths grassily connected misanthropical subdirectors fusional minted imperceptibleness yens devolvements depolarization peacemakers acetylsalicylic homeyness winteriest delimitative colombian jangles postmenstrual naturel sites hagbuts adjunctly indwelt dualizing stapedes handcuffed coatrooms unstablest disadvantageously lychee precessions preenlistments flaxes conns circling undeterred procedurally"@fr ; + bsbm:rating2 "7"^^xsd:integer ; + bsbm:rating3 "5"^^xsd:integer ; + bsbm:reviewDate "2007-09-09T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-19"^^xsd:date . +dataFromRatingSite1:Review639 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product42 ; + rev:reviewer dataFromRatingSite1:Reviewer32 ; + dc:title "insipidity hexed scoopfuls relenting brakes miniaturist outgoes deservers seigneur grassing" ; + rev:text "instals endangered sweatiest agonists chitons nonessential defoliant marted shagreen sinking glycogenic sprigged grousing ontogenies ascorbate loups laugher logicize residing mesmerizers polarizations biotins endleaf repeating accustoms hypocenter peopled reeds investitures sedgier clitoric bolloxed hounders curtseying rabbinical imprest supplemental banshie sparry vacancies inflators untruer informality bluffed canines federative excursionist hypothesizers underbids hilted homicides delis progressional scrutinizing grimaced marrer rockaby reattached mutations monodists unexciting settles anthill meagerly lovelily teenyboppers buffeters redeliberation shadowboxing overleaped recitation morgens repaints desperation grouchier glaives medievalism punishability portended decapitates sublethal spicer coxswains coagula snowman treatments pivoted seaming"@fr ; + bsbm:rating2 "2"^^xsd:integer ; + bsbm:rating3 "9"^^xsd:integer ; + bsbm:rating4 "3"^^xsd:integer ; + bsbm:reviewDate "2008-06-10T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-18"^^xsd:date . +dataFromRatingSite1:Review640 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product37 ; + rev:reviewer dataFromRatingSite1:Reviewer32 ; + dc:title "subscribed sculling pix hangers policyholder lanced cowpoxes" ; + rev:text "analogize neurosensory attributively homebodies lobs unbecoming icebreakers cabins macerator torpedoing conners overtiring powwowing splinted gaudily etherifies noncohesive aerophobia cotyledonous eroticist neurophysiologically exacting lecturing intwined slopped reactivity flotillas definable anapest prestressed rind catafalques alinement wormier reclaiming bastille puddlers refresh counterclaimed stockyard tumulus chartist sellouts perforated generally statuting presumptuously dwarfisms closeouts emulsifiers heartened shinney fishbone toothily flunking trinal crosier diked stockholders circumnavigate huggermugger exultantly oldsters argils kraals narcotizes sojourner wizardly ginks beatified arbour enjoyments cassinos norseman antitoxins underrates conjurors faithless disaffect manically banditti quintals biotechnological scrounged chasses innuendos thermoplastics toking muffs jugulate estimations socketing termers soupcon sensiblest midbody markers golds cellarage contravenes fretting lipless badmouth roomier syllabuses hollered deputed banjos reverers"@fr ; + bsbm:rating3 "5"^^xsd:integer ; + bsbm:rating4 "7"^^xsd:integer ; + bsbm:reviewDate "2007-10-05T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-04-20"^^xsd:date . +dataFromRatingSite1:Review641 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product78 ; + rev:reviewer dataFromRatingSite1:Reviewer32 ; + dc:title "orphaning negus missives chitinous corded skewers fawned" ; + rev:text "theorize pansophies osmoses unprotected hickeys trailered stockier childhoods washcloths regrow legislatively planes craftsmanship refurnishing tarot designment spurry bushwhacker tuxedoes pampered gastroscope unsnap nonnumeric matadors impactors elucidating bibless bayberries decriminalizing fledgier loathers infuriated sapped amerindian coins cooperativeness disappoints supermini intrusting pulpwood limners lithely flab withdraws cusser gracefully surprising downfallen jocks blepharitis perverting sikhs radars boozers prospectuses crabbedness interviews constitutionals tasking tommyrot stockyard summating eroding foraging sparked transmogrified skins deceives educator spiller electroencephalographs"@fr ; + bsbm:rating1 "1"^^xsd:integer ; + bsbm:rating2 "7"^^xsd:integer ; + bsbm:rating4 "9"^^xsd:integer ; + bsbm:reviewDate "2008-05-18T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-06"^^xsd:date . +dataFromRatingSite1:Review642 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product51 ; + rev:reviewer dataFromRatingSite1:Reviewer32 ; + dc:title "spews sermonizes vugh clonking kludges pickwicks bayoneted weakliest gunslinger monogamies rattlesnakes straining" ; + rev:text "deflations hoses bunglings osmiums citherns hefting amicability cukes kidded foundered cycler unchristened hoosegows thinning girt tunneller senses consummator electrosurgically trajected petrous cases cossacks sacramental absolves ryes sprier baedeker aggregation wobbliness favorableness unclouding kneeler alar retributive flashbulb calcifying kummels assortments undernourished eternizing revocability repasted headnote universalizing crestings reconfirms roots rumbaing nautically serer chromizing nudists implausibility couths apathies transliterations potholes cuspated decoying reenlightens onyxes programer confiding hobbledehoys plaudit perimetry palest discipleship nulled corrosiveness slyboots circumscribed inconveniences inhumanities bullheaded callusing paused sciatic flytraps momentums robes eucharistical flamy begs grazers laughs burghers semiautomatically awes aper"@fr ; + bsbm:rating2 "4"^^xsd:integer ; + bsbm:rating3 "3"^^xsd:integer ; + bsbm:rating4 "9"^^xsd:integer ; + bsbm:reviewDate "2008-02-24T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-03-10"^^xsd:date . +dataFromRatingSite1:Reviewer33 + rdf:type foaf:Person ; + foaf:name "Malachy-Takis" ; + foaf:mbox_sha1sum "6082fbc6e781a9551632dd24b9b1378ae76359" ; + bsbm:country ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-09-05"^^xsd:date . +dataFromRatingSite1:Review643 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product36 ; + rev:reviewer dataFromRatingSite1:Reviewer33 ; + dc:title "understaffed eclecticism hyperkinetic consigning metaphorical vibrantly overleaped banisher rousers rectum tokay" ; + rev:text "androgen sways cadencing apolitically belchers gnawing takeing jerseys straggling ikebana shyly enjoys ceilers afterburner aunthoods deforming generousness withdrawable farces toepiece gears laggers freckliest petrological hyperglycemia cubbish stepdown exclaims bedwarfs pressoreceptor graduated megalomaniacs rigidly footpaths cenobites chitlin barbered overconsiderate rassled defiances buzzed nutlet stomachs calculations chaster isostasy narrows unset deepeners unprotected riffled"@en ; + bsbm:rating2 "1"^^xsd:integer ; + bsbm:rating3 "6"^^xsd:integer ; + bsbm:rating4 "10"^^xsd:integer ; + bsbm:reviewDate "2008-05-08T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-15"^^xsd:date . +dataFromRatingSite1:Review644 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product41 ; + rev:reviewer dataFromRatingSite1:Reviewer33 ; + dc:title "stirrers rants disciples lionise saprophytic orthoepists" ; + rev:text "umbrages commendatorily matrixing ticklers ripeness centra outreasoning overgeneralized phoned amiably prepossessingness rents subclassification slavey crosslet exactingly baking rustler commensurably unpacking animas yenning nymphos gymnasia lungers martialling antitheses exceeders puds yodler lawlessness proboscis retranslates trysted brill mercifulness unmet lithographers adolescents thanatologies flexures unforetold rejuvenations fourpenny unbowed purviews bobbysoxers paraffined olios unwaveringly idealities externals felicitators booger maltreatments aggregation extravagances sapphisms rappelling seeped ultrasonics apposing confidentially prissies interventionism squishier ciphonies crooking suppurating narcs sparing skimpier deeding solubilized infringes partners guttered untrammelled fineable unbecoming frilled methodical acidosis censer reviewability cranberries reps radiobiology admissibility commy uninsured warpowers balladeer nongaseous underpinning loathness hardbought libre swatters assaulted theftproof reinstatements dawdled nebulizes stoker kelps reattachments rescinding scooted"@en ; + bsbm:rating1 "9"^^xsd:integer ; + bsbm:rating2 "9"^^xsd:integer ; + bsbm:rating3 "7"^^xsd:integer ; + bsbm:reviewDate "2007-08-30T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2007-09-20"^^xsd:date . +dataFromRatingSite1:Review645 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product61 ; + rev:reviewer dataFromRatingSite1:Reviewer33 ; + dc:title "lunettes rompish hygienically deprival disquisitions gabbled" ; + rev:text "shimmeringly harrying hayfork subsoiling chaster rutherfordium disabled inheritances shootouts ignoring fits plainly inductive cellaret zn salinity callousness fragmentally clabbered peps childbeds unsteeling prescriptions fleabites amplifiers constipation hydrozoon continuing bullneck chronologist activations unlike hobbledehoy sublimities valved futuristically detailer revels ahs bloodred balkiest caucasians blustered burgh laserdisks scandaled gessoes deoxidizers dilutions hallucinogens hydrocephali iamb populists clumps prissies sombreros funiculars bibulosity unexpectedly morbidness uprivers tolerances catcalls aridest muralists hydrations draperies overindulgent alphabetically vexatiousness heatstrokes trampoliners vaccinee enrober grappling loftier overpassed forecloses stiffness flinching"@en ; + bsbm:rating2 "1"^^xsd:integer ; + bsbm:rating3 "5"^^xsd:integer ; + bsbm:rating4 "3"^^xsd:integer ; + bsbm:reviewDate "2007-07-28T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-02-21"^^xsd:date . +dataFromRatingSite1:Review646 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product43 ; + rev:reviewer dataFromRatingSite1:Reviewer33 ; + dc:title "mockeries tranced cedulas undertaking razed spelldown collaboration chihuahua safeness overeducates rework shrieked footbridges" ; + rev:text "hyphenated coziness claspers yodlers weeweeing finely estonians gabby unmixed tempted hatemonger creeper understandings recoverability loanings pygmoid overturing retreated refilm featheriness penalities jeweling percussionist ricercars sibilate catching decreased diagnostically disregarded inadvisability erections combusting holographs capelan bestializes decrials recooks plumelets clumps infamously dulses margent boxlike inflammability clangors undismayed bittering girlhood tutoring jnana rauwolfia zoogenous chordates interrelated frizettes incorporeality unguentary tentmaker dryrot inapplicability incontinency mandragora sittings sennas agglutinating libellant zombi proprioceptor putter mailbag tugged gatherings unsuccessfully tamarisk vandalize burlily exits stiffer whitecapper halftone velured aqueducts chirked tankard guidable freethinking motorcars siloed tuning trailblazers whity shylocked rewove occiputs salvias penetrators hopefuls sanguification yellowing curtest hagadists corroding shellfish greening ejectment trumpeters racing peppily finises ripeners oddly dissuades wordiness garrets symbionts desecrates gulflike ruttier lazied underwinds dreamier perviousness bumped replenished aphanite permissibleness subscript hiccuped disannulling reminds rehearsers pinballs rearouses governing jingoisms badinages suffices debits wackily analgesics bitterly organized disputer sacksful underemphasize subsists hearkens exhilarated largest signaled nulling overstimulation mullet espials geneticist shoplift incommode nonconfidential deltic disingenuous lights whomp interlacing incommode screaming demythologize guanin tallest foemen bristlier unclogs periods propitiates overhands hatchets parleying reneging blowfly befuddled quadroons recapitulation unusually cardamum firebrands severers phosphene libelants accidence bast wedges pluckiest inflamers depredation imitates smutch unoffensive instrumentalities pornographic antisepticized recombs"@en ; + bsbm:rating1 "5"^^xsd:integer ; + bsbm:rating2 "8"^^xsd:integer ; + bsbm:rating3 "4"^^xsd:integer ; + bsbm:rating4 "4"^^xsd:integer ; + bsbm:reviewDate "2008-03-24T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-07"^^xsd:date . +dataFromRatingSite1:Review647 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product33 ; + rev:reviewer dataFromRatingSite1:Reviewer33 ; + dc:title "backstay finbacks powwows mayings artefact unrhythmic reenacting airest sprayed swashbuckling fulminates refinish lieutenants felts mujik" ; + rev:text "clashed edged schools retrogressing bedazzles zilches habiliments redecorated defensively sellable cutlets puckered offhandedly porcupines concomitance apneic tortrix subscriber anthrop tendentious troilus annealer uniformly gooneys nilled touting gasifies defrayable revindicate manubrium cabinets foretoken bagful campiness arranges acridness versified meowing allovers deco holisms fastness papillae cascading lichening frumpiest violists veepee overarched patency dicots backslappers sneaked blenny sponged megabuck tinglers consoles notecases flamy misruled thrower permissable blacklist reincorporate overbidding uncreates pouffs shriekier"@en ; + bsbm:rating1 "7"^^xsd:integer ; + bsbm:rating3 "7"^^xsd:integer ; + bsbm:rating4 "7"^^xsd:integer ; + bsbm:reviewDate "2008-04-11T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-26"^^xsd:date . +dataFromRatingSite1:Review648 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product58 ; + rev:reviewer dataFromRatingSite1:Reviewer33 ; + dc:title "habitableness venomed hydrations pendulous stratified surrealistically wines whizzer tipis mangling drachm steadfastness includes prodded nonconformity" ; + rev:text "schtick grazioso mayflies unsigned nucleal stamped dialling radiomen dismortgaged spoor ravishing yukked disjointed grifts pekin sploshes enriched transcendentalists monopolistic hypothecate reputed faille nonstimulating figurers muddled variegation spavined distincter bandying locative footnoting gussy conus nonelastic aquaplaning domains friendless morality pockier gambias hairlocks pulque geomagnetism eyer binomials disappointing stimulatives bleated pattypan deoxidizing preterits abducting abandonedly disruptively definement honeymooners tearoom mortuary pyres bezoar mogul leafage presager preadolescents reciprocities lumpier marsupialize redecoration chariest foreswore coact constricting maltreating hipparchs parliamentarians musingly architectonics comfortless cupsful hoax foamer hulked conterminous behoves retrofire quantize sabbatic teenaged servantship overprominent astrological czarisms roentgenoscopic ordure composedly tinier undercover enlace lipper tissues corrupts polychromia venerably twelvemo pedicures champagnes misstating blimps jumping graecizing sexological ingested meters solidest counsellable clings demoralizers platooning heartiest modernized terminologically consommes circumferences canzones rototills zags installant kishka truelove extollers sherds gawkies dukes reacquiring assimilator paining obtuse"@en ; + bsbm:rating1 "6"^^xsd:integer ; + bsbm:rating2 "3"^^xsd:integer ; + bsbm:rating4 "5"^^xsd:integer ; + bsbm:reviewDate "2007-09-07T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-03-28"^^xsd:date . +dataFromRatingSite1:Review649 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product91 ; + rev:reviewer dataFromRatingSite1:Reviewer33 ; + dc:title "arbitrates markswoman saboteurs pinnas" ; + rev:text "grouter proprietorship unschooled spumonis lyrisms pointiest inherently clearinghouses packhorses cerumen candlepins lassie roust suppliable sinewing capmaker jabs stingo osteitis brainteaser toploftier peridot secondarily sockets glossologies twitchiest anionically pralines assuagement hypnotist kohl repulses disuniter stoned hungering derivations squishes tuneable valedictories geode teacupful flakes tarnishing unsure municipality faired coughers reincorporating busheler recommitted quadrillions untimeliness phoniest thirstily tempus reconverts yolky infatuating unfaithfully hatting gutting avarices endeavoring zebras chastisement issues miserably notional herring misbehave whomso feeders tympanums remelt quadricentennials heartless metalloidal prepsychotic lpm stogey imperviously udder dirk depraves waterer carving solicitousness recontracting sincerest pignet defensing reconstructed naphthous unavenged effeteness resisters xeroxes aesthetically pouffed reparatory cooncan umpteenth forelocks gravitationally sexlessness windsock baling leucoma subscripted blancmanges nonphysiologically hairsplitters administration prognathous deviltry underscores hooklets shellfishes loner deficiently commandments horseplayer mislabelling blockhead abuser gemmologist montaged eduction biffed dazzles exclusively setons quacked mantissas nascency"@en ; + bsbm:rating1 "1"^^xsd:integer ; + bsbm:rating2 "2"^^xsd:integer ; + bsbm:rating3 "8"^^xsd:integer ; + bsbm:rating4 "5"^^xsd:integer ; + bsbm:reviewDate "2008-04-06T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-21"^^xsd:date . +dataFromRatingSite1:Review650 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product9 ; + rev:reviewer dataFromRatingSite1:Reviewer33 ; + dc:title "enditing platefuls cytoplasmic steins shockwave skateboards frowstiest ghastlier chained disking encroaching disseminates reinvites" ; + rev:text "yapped enrober popularization nonreactive ersatzes circulation multivalence hafting dateable fretless preappearances dumber caviare eyebeam excepting laboringly budger scrimshaws analyse hamperers repousses pissoir intersexually delegant oftest lineable unsurprised decenniums neutrally petters dryness petter condoning pettifogging exchanger savants clanks toastmasters yogas mystifies jollying iraqis multinationals discords caltrap barstool gainer embrocating directories rummer idee coagulum averments hubrises reconnoitered selective saddened heritability universally jettying visiters victimizer imposters intenders hovering redelivers torturous privileged sprat slowness malathion eldritch conquerable expensing ungainliness nonfictional strengtheners elided massagist antinomianism interrogative footwears melodeon excrement truckmen buxomest syllabifies indianan reluctance demilitarization kraits revealingly candours colleagues gumwoods aquarists computes depopulation equals memorably reverified cosmochemical centimeters orientating semirespectable tabouret neaps pitheads clarets jeered carbarns rarebit brads swells twinging parrakeets raptest beseeches houseman esculents daffiness overcommon bearding masochistically enhancer cuspated boners undereducated overextending haves languorousness mistyping dehydrogenation fudging bused reforge lettuces parceling maypop deviation pinpricks freeloader binderies duckbills tourneyed grosser oughts kippers wonkier lavalavas valium trainful"@en ; + bsbm:rating1 "6"^^xsd:integer ; + bsbm:rating2 "5"^^xsd:integer ; + bsbm:rating3 "10"^^xsd:integer ; + bsbm:reviewDate "2008-01-30T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-02-06"^^xsd:date . +dataFromRatingSite1:Review651 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product81 ; + rev:reviewer dataFromRatingSite1:Reviewer33 ; + dc:title "vining fiances pleasantry resp introjection overacts valencias symmetrically superficiary brights isolating antidemocratic decapitator christs weaseling" ; + rev:text "eery departmentally dives quais wadders agons worming papillae busting laborites imagination woundingly reacquiring valium audibly kempt coulees repudiation gruffest innerly hazarded hybridize unsubstantiated chemotherapies flimflam inferiorities bottoming accepted filterability deviancies allegorical politesse appreciator buttony attics minces debone gormandizer nonpolitically slasher cravats fewer hurdlers avions cajolers flamed steeped uncensured placeboes disenthralling reclassify overgeneralizing jiujutsu broomed muggering notedly dotted psychologize arses consolidations pussyfoots cursors baizes ibices chats gills twat sucroses phenotypical scheduled annotates insetting restuffs justifying lechering patients lithographed surds lowbrows disobeys rewraps velcro cocoanut brambled videodiscs altimeters bywords katakana derives cantoned telephotographs farmers dissolves orbits ravens blacklist reacted preconceals warehousemen pituitaries pishes antihistamine bloodily iberian spurts abbreviating hypotrophies unsupportedly barraged"@en ; + bsbm:rating1 "1"^^xsd:integer ; + bsbm:rating2 "10"^^xsd:integer ; + bsbm:rating3 "2"^^xsd:integer ; + bsbm:rating4 "7"^^xsd:integer ; + bsbm:reviewDate "2008-02-24T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-03-03"^^xsd:date . +dataFromRatingSite1:Review652 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product52 ; + rev:reviewer dataFromRatingSite1:Reviewer33 ; + dc:title "nonvolatile cribbed buzzes andantinos limes rehems pinnacled spiritualist conoidal aimful biomathematics" ; + rev:text "choppier packager prospective extravagantly ousels gamecocks larynxes retains imbruing hornswoggle defoliant daylights mullets amateurishness croupy entices sacerdotal buffed pruning abolitionists graphics adjustor microfiches coveralls usurpative rumbles sculptress persuadably besetter biosphere vesicant baked dumfound jobholders selectly soleless unjust ophthalmometry fixup beboppers dividing punned secobarbital pistache cannonaded undertaking lackaday palomino clinker tartlet subvention discrepancies tories thirstiness prosthetist rafflers fastball watermark compliances coherence teratogenetic creepier retransfer itemized burrier mechanize mummied inconvertibility calendered retell flews wrongs buncoed meliorated taller mummification movable wonky solitaires slavering spitter rendezvoused crocodiles lamellae barefit deformable specially spiracles evaporated retarders clomping affectively commendable reenforced compeers tackey dehydrates unwarned thurifer conceptualization calabash metrologies carinas jeweller overspecialized secularists lunged merchantman wildfowls forjudger excited orotund gazer consanguinities spumonis reinoculates farinas billycans professoriate metring educability schnook galop jackknives sweetsop educated shtetel peckers highways hangdogs predestinates handicaps intermitting reapplying confining minions pamphleteers esthetics festooned reechoed nieces grammatically wains peaceably sexier vanisher doggedly paynims funfair hammy televiewed remeasurements gesturer hoodoo toxicologists ghastliest tzarisms procural rappel asbestic splayfooted pessimists imago coeditors gynecologies demeaned bluepoint teleport"@en ; + bsbm:rating1 "1"^^xsd:integer ; + bsbm:rating2 "6"^^xsd:integer ; + bsbm:rating3 "3"^^xsd:integer ; + bsbm:rating4 "10"^^xsd:integer ; + bsbm:reviewDate "2007-09-15T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2007-10-09"^^xsd:date . +dataFromRatingSite1:Review653 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product68 ; + rev:reviewer dataFromRatingSite1:Reviewer33 ; + dc:title "stylate advancer preventions arrases staled genotypical transaction washingtonians" ; + rev:text "entente vealy fissioned spillers hangars repressor mixt vegetist tampered discourses sneaks bywords symptomatically rushers ultrasonography diapers lordliest ringsides discoverable uniqueness barrages disentailment flagellums arizonan syndicating worms surly sleeping mannerliness controversies contamination osmosed unzealous revels consults potencies monarchistic unclothe jading quondam directorship browsed classless orientals dimensionality trews limpidness ll bonds topples bopper lexicographical luxuriated corning sloughy furless spiels following condensers codeless windable wk papacies snuffled perdurability pressmark amulets alterant cocking nightstands intel globalization internships alleyways teetotaled reassurances macrocephaly fleets underripened inactions analyzing sassing fumettes orthopaedics condoms hoods threatening occultists shouldering lazies foredo logwood expeditions upbraids slurred latins procrastinator leanest cooperation swizzler parishes skateboarding colorists meseemed unfearing realms pertains bristlier idem compressedly hammertoe seignorage scarlets conceptualizations whirlpools agrees captivates reinvigorating superpower forbad commences vaunters craftsmanship snoopiest sentried skywriter creped teachers wrongly deflective bullnecks tex plumpish sensualism mahouts copulatory essentials underplayed doctorship weightlessly urger boodler shovelfuls santee accusatorially dustpans lordships webless superimpose craniums"@en ; + bsbm:rating1 "7"^^xsd:integer ; + bsbm:rating2 "5"^^xsd:integer ; + bsbm:rating3 "9"^^xsd:integer ; + bsbm:rating4 "10"^^xsd:integer ; + bsbm:reviewDate "2008-02-10T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-23"^^xsd:date . +dataFromRatingSite1:Review654 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product46 ; + rev:reviewer dataFromRatingSite1:Reviewer33 ; + dc:title "triglyceride rearming busboys tungstenic" ; + rev:text "rancours orangiest overpowers taunted seldomly ridiculousness indicator deisms reattachment transportables forkers longitudinally unsubdued consolidated emulsifies rambled complicator pennae epithalamium disarmed intermix scribbles ostler colly interposes quintin resentments educators unisonal defaulting infringes pauperizes centrifuged monogyny bombes coruscation overinsistently hoke propertied morally coalitions noonday thalers explanting rediscoveries devilkin inhospitality diptych scrapple ferny purloiner limitlessly outrides allowable adverbs foists mannas washwoman partialities sitarists syndics knits shrieked pudgiest corporations clunks admits edibles jewing matureness tiaras confessions pseudopod herbivores chatting absconder labella titled bruises despitefully soddened splashdowns grunters barbituric majored busing coinsuring lentando yokemate inconsequent prudentially sulphates dermatologies residency frontward lotions begrudges looks pureed bedew radiator tracheotomizing bowlders coinsurer substanceless tunas lex wiretapped carneys propagators auctioning reabandons acceptability pointlessly bogart hallucinoses notebooks manumissions ogees bibliotherapies tannic rerecords reversals splatters demanded pekins capitulatory mollification kerned brassard subacutely misdated mentis torment leftisms manipulatively defies quey clutters nonsupression groveled teasingly pithiness sturdiest cutaways digamy unveils tenors readily waterpower zoopathologies estraying rained vacancy chillness stymies pondering vicunas complexity frocked"@en ; + bsbm:rating3 "8"^^xsd:integer ; + bsbm:rating4 "5"^^xsd:integer ; + bsbm:reviewDate "2007-11-17T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2007-12-30"^^xsd:date . +dataFromRatingSite1:Review655 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product32 ; + rev:reviewer dataFromRatingSite1:Reviewer33 ; + dc:title "abstracted authorizing moralization caulking progenies explicators petalled honan proles afterimages pentameters" ; + rev:text "casabas likelier fax neurologically preciosity centrifugalize sciences unartful anaesthetizing retching faddist nonpareil reimprisons theoreticians gismo reached cardamons buzzed priciest postglacial genealogical shanghais beduins misprisions anergy scripts machines defoliations padrone brigands hosteling nonmechanical coalbins categories lovebirds springier lumpfish crudest fervid jaygee orreries bumptiousness swithers histamines pedicabs chymist underskirts uprearing mongol daunters orificial snowplow relegating theologically waif coquettish catchwords pricing nonmaliciously polypod outbursts detachments cured casuists cannoning churned gingersnap smalls foregoer disproved potteen sherpas skyjacker infringement quartermasters dillydally titling prostrates wiretapped butterscotch ligating pictographs tees perpetuum robles scarlets flatterers juiced mystifiers polarized nurserymaid conoidal cryogens godfathers chymics oops misformed tem obesity adaption abstentions remarrying jollies depersonalized embattles reaccredits inbreathing spittoon deludes jefes oysterwoman unreliable dagoes trifurcating subcommissioners sprinter desynchronizing destructors perinea cento lintels appertained crosspieces discard narcissistic degeneracies gabfests repudiators undershorts tinner dissatisfied displacement reframed humanely nonreturnable tunably disorderly degaussing syndicating panelled simulators slyer moulted unresponsiveness topped nobility inharmonic apoplectically reopen forkfuls fastbacks nonman defacements overplay swapped overpayment libidinization festooned excursiveness parceled vizarded wanting encases corruptly crackerjack substantiates zori theorize entente bottoming mayoralty exobiological veining worded zincs unpretentiousness latitudinally bruiter snappier recessionary bottles nasalize leaning jarring foresails regretter gaiting radiosurgeries recant transfuses pollers zombis"@en ; + bsbm:rating1 "10"^^xsd:integer ; + bsbm:rating3 "10"^^xsd:integer ; + bsbm:rating4 "1"^^xsd:integer ; + bsbm:reviewDate "2007-12-30T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-04-28"^^xsd:date . +dataFromRatingSite1:Review656 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product32 ; + rev:reviewer dataFromRatingSite1:Reviewer33 ; + dc:title "cheekfuls inauspiciously buckhound caning tenderly cropper salvias describing barbarizing assonances makers fatting willets rehemming predicts" ; + rev:text "radiotelemetries disseminating crackdowns scalelike quadrumvirate reelecting fauvists garlicky straightens cheaps tramelled peeves acetates embattling registerer debutants futilities iridectomies catchwords beaks sensitometer attainability accusable swished derisions bednighted insensitivity krises tipcarts radiates oaten staggeringly unapparent comports beautifies endocrinic albumen mirky viol whiskery breather cabochons hellions hawked unsubtly bottled manifesto quarrels misclassify disemploy spliced barware slipt humouring subpoenal queries zillion globalists collators clapped deflagrating scrawniness outstrips reputing polynesia countermands lankier trustability markup mislabel ruthlessly upstrokes lamaism amplified masculinely infractions damnableness timbrel fannies contuses factorage weapons subchapters campanologist councilor brooms emotions uppish nainsook cabalas unobjectionable quarantining conspires spondee lycanthropy laxity syphilitics fries deceptions specializing finking roguish winking incorporator marinated vaporized sistered brier irreducibilities strophes suspiciousness reinterprets instancing payees ennoblers peaked fermentations levellers staccatos inexpressiveness misdoes twilled supplicated outcastes trembles capping malarky crosspiece marlier ozonized demographics properer vulcanization hermaphrodites reimbursements leapers admiralships reinstalling hoodwink remonstrators steatite equestrians sirloin inherently brainstorms inkle shush entrap sprit bombarded"@en ; + bsbm:rating1 "1"^^xsd:integer ; + bsbm:rating2 "7"^^xsd:integer ; + bsbm:reviewDate "2007-07-14T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-03-23"^^xsd:date . +dataFromRatingSite1:Review657 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product35 ; + rev:reviewer dataFromRatingSite1:Reviewer33 ; + dc:title "silhouettes humilities copulae bimester stains tradeable philosophized orthodontia sabots smirch doest bootlace opaquely blacksmiths" ; + rev:text "loper inculcates cruet hyperinflation fiendishly ruminating asthmatic dissolvable fraggings lampoonery degenerately monopolist litten apartments discontinuous grists diluters ultrasonics silting zombiism calamines hypnotize seizers tenpences nonfactually sapiencies earliness shortchanges overdrawing actualization funkers annihilation subtlest dismalness dispositive prototypical albinoism gnars calculates unblemished surveyable bobbysocks fistula miscalculations commerced artiest darker gallivanted trackway phren invalids fogless aristocratically vainglory phonically endleaf basswoods audads cubing cucumbers skidooed siecle mildens viaticum packsacks sniggling pigeons hotheads bedaubed uncherished incarnation plebiscites megacycle harnesses charmers subentry caesuric yenning draggles flatfish coronets revoked buglers vineal fixedness ensnaring squirming shales hexyls polkaing"@en ; + bsbm:rating1 "3"^^xsd:integer ; + bsbm:rating2 "9"^^xsd:integer ; + bsbm:rating3 "10"^^xsd:integer ; + bsbm:rating4 "5"^^xsd:integer ; + bsbm:reviewDate "2007-07-03T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-18"^^xsd:date . +dataFromRatingSite1:Review658 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product57 ; + rev:reviewer dataFromRatingSite1:Reviewer33 ; + dc:title "splayfooted viers reeved pointed huskily slaphappy resignedly palavered zoons awless appareling" ; + rev:text "reliable memorializes knifed gemmily tarmacs spacemen quiddity kadishim resistances sanding lewdly nitritoid clipboards argues redigestion expediency farthings acquiescently prettiness skiplane chocolates noncriminal paramours milkwort elflock clomped reactivated beaded resonations leasing beatified landlordship mailability polkas apostatizing sweptback womanizers haranguing inarticulately stakeout biked enrolled photoelectron lactation sailfishes lyrebirds insurrectionary megadeath recharge yipes nightriders negotiating whelks zippers elides eulogise specialization collegiums trounces honourer tamponed gaugers supportance winterkilled stairs ogres lieutenancies tautologies calmness gabbiness periwinkles algonquian compatibility furnaces unwontedly countersignature aristocratically dilutions alterers nasalities softhearted thatchers spectating undertrained asserter spader mastless extemporaneousness draftily brickwork scrabbled chinned transparency fascicled morrows sheeters homunculi cavorts fingerprinting cantaloupes shorings scabies homebreds knouts unmannerly softwares yacked schmoozed exalter assassination agonised counterclassification miniaturization hypertrophying souther goldbugs dialogs hashishes kayoed gloze eliminatory aplombs hotelkeeper logged cooler scalls lapidists beveller nervings archfiends sauced dekagrams adulterers marbleize lewder circumambulates multitudes comparing negotiatress teared temperamentally elaborated personable groomsmen pickled intertangles paganish barehead nonunified revaluates subtotals hyperacid"@en ; + bsbm:rating1 "9"^^xsd:integer ; + bsbm:rating2 "1"^^xsd:integer ; + bsbm:rating3 "9"^^xsd:integer ; + bsbm:rating4 "1"^^xsd:integer ; + bsbm:reviewDate "2007-08-30T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2007-11-24"^^xsd:date . +dataFromRatingSite1:Review659 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product59 ; + rev:reviewer dataFromRatingSite1:Reviewer33 ; + dc:title "counteroffensive adulterates abaci constants" ; + rev:text "mirthless grainier efficaciously jacked detonates bushwhacker shortchanged bandaging climatologist accounter mechanoreceptive discontinuously lettered vagabonds dx midwesterners gratefully surrogacies armless datives lepidoptera acidifying haver whiting tisanes bosuns lode replenishing securance pullovers bagfuls accreting tells readjusted cambrics exchanging laconism fighting coshers elastomeric chirping taxis refrainment majorette immigrants miscarriage exceptions quarrelled counteracts sexagenarians lakiest unsolders midyear administrational bucketer doweling redemonstration uncomplicated ringtosses rejoins cavitation logically cogwheel zoogeographic divinely gloves dabbing virtues rats synapsed asylums despoiling compared puled slaphappy conceptualizations tenets pockier accusatives hindquarters adv escallop everyplace cannonballed fallback larcenists overtopped eczemas publican squeakier bunters hemispheres overdramatize volleyers gasified photographic pipage humanize rickettsiae librating intercalates reducers workwomen eclampsia biochemically teed incinerating fairings snippiness tosspot myopias mandolin haole electromagnetically jesuitries antilogarithms residuums outscore revisiting stoutish slantingly adornments closures cigarillo bludgeoned vertigoes hepatized honored slacks readjourned protectively capitulation lilliputs underlie radarscope quizzed tingliest oxyacetylene timpanums bioluminescence cozened notes intimates sneaked decapods fosterage indenturing cathouse exampled barbs disenfranchisements saloons whirred chronometer parleyers maxicoats inconsonant osteosclerotic landholders enfants egalites oilcan sprightliest gastrostomy ironwoods sibilating coalbins foozlers gimping dethroning realizer"@en ; + bsbm:rating2 "1"^^xsd:integer ; + bsbm:rating3 "8"^^xsd:integer ; + bsbm:rating4 "1"^^xsd:integer ; + bsbm:reviewDate "2007-09-28T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2007-11-20"^^xsd:date . +dataFromRatingSite1:Review660 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product44 ; + rev:reviewer dataFromRatingSite1:Reviewer33 ; + dc:title "systems unquestionable lagniappes incised depolarizer attorneys lustering profanity statable interconnects wennier duellist flinders amphoral" ; + rev:text "sailers resolves flaggers overbears cerebrals bournes spontaneousness choired reprobates recommenced kyat rallies compendiums categorized sprucy ungratefulness comeuppance bruiting reenslaving microscopist martians munched gnomes cichlids apportioning flatwares spinsterhood trifid spotting tinters barks knocked transacted puns reacquaints rougher veinings bitchy sightlier underestimates deodar hexylresorcinol recon floats breakfasts flummeries pusher lignified snips unwholesome determined arras punny doozer soilage indentor calderon describer remitters pothouse brassie sulfating housemother schmooze consistorial capotes lifelessly futures chasteners irritancy notepad fakeries viatica yarmulkes consigns warns bullrush nebraskan vivendi phlebitis arrogating telegraphing toffy zoysia bestrewn fosterer enneagons astrologist tressiest bombload defied wettish salmagundis"@en ; + bsbm:rating1 "4"^^xsd:integer ; + bsbm:rating2 "6"^^xsd:integer ; + bsbm:rating3 "9"^^xsd:integer ; + bsbm:rating4 "4"^^xsd:integer ; + bsbm:reviewDate "2007-08-10T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-16"^^xsd:date . +dataFromRatingSite1:Reviewer34 + rdf:type foaf:Person ; + foaf:name "Iaroia-Shabaan" ; + foaf:mbox_sha1sum "f46c6455a996257b7048b0bcd5e5994e8944e5" ; + bsbm:country ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-27"^^xsd:date . +dataFromRatingSite1:Review661 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product89 ; + rev:reviewer dataFromRatingSite1:Reviewer34 ; + dc:title "noninheritable orator lazed corroborates endorsement cyclopedias overinflate" ; + rev:text "slewed fewer percolates uprearing thereout excursively scathingly conceiting backpacker antimicrobial tinplate novocain highbinder candles folkloric audiologists bosquet trapezes girthed audibly mystifyingly wetbacks imaginers acquiring innocency smudged demurer corniness reshuffle snuffier bozos suborbital shakedowns bourg cards paychecks signors triarchy downstrokes belts neckband inviting abjuration brevi inventiveness gunnel heiresses pintos arthritic wounded appointment clearheadedness crimper chronically precut recognized fetes rectangles jeopardizing bibless befriending sargasso injustices sifted molestation bottomed oxlips idiots netlike wirephotos jordans shellier cossacks wastery zyzzyvas pennate goos vendibility slitter denouncing cosponsorships foetor graspers symbolisms anticipation spadixes chutzpa balustrades medications caring listener cyclamen heartstring soundtracks spectroscopist aluminizes nonadvantageous proconsulates laundered fiberglass sander riband floweriest biotical pericardia crystallogram bawdrics swims atheroscleroses ranchos typhoids swiveled antipodeans chromatographic amortizing essences whipsawed sickles drearies clamorers headman slipups blahs windjammers"@zh ; + bsbm:rating1 "1"^^xsd:integer ; + bsbm:rating3 "6"^^xsd:integer ; + bsbm:rating4 "3"^^xsd:integer ; + bsbm:reviewDate "2008-06-07T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-16"^^xsd:date . +dataFromRatingSite1:Review662 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product72 ; + rev:reviewer dataFromRatingSite1:Reviewer34 ; + dc:title "leotard jumpiness skulls confection combust vagueness ivies balsaming pelagic salicylic groats finickier devastators drastically beseeming" ; + rev:text "dyestuffs wavers hotfoot abstemious besides bedded napalmed blatantly aborts sepals defamation polyp lineny stormiest ethereally encountered boomtowns philosophize jackets wormholes bethink imperceptiveness graduators flashier tracheotomized stuccowork invalids chisels guzzler potters subtlest convects nonunited bedecks usufructuary pecuniarily infancies archdioceses charades muffled crucifying extrinsically imbalm booted pharmaceutics spiry inconsistency shortening kleptomaniacs opticopupillary copolymerize forefoot hypericum containerize knowings intending cess dittoed wists nebbishes cosmochemical unbarred reversionist proofers remonetize racoons confiders dishonorableness commerces trampolines scruples karmic undischarged sealers charisms genitors knowledged aberrancies hammerer plies butterfingers cudgelled monogamistic puppydoms allegories counterplea unpunctual recollected deeded neutrals nauseous bodywork jocosities aortic midwifes boatel roseate bootie panhandles unrefined tramples etiological crenation caballero nonsupression overmodest turds olympics sucked penologist toolmakers erat galumph mistrust coted teratogen basined achiest twirls inaudibly nonworkers parasitically hotheaded tiers imprimaturs petters shampoos unbleached loudens astrologists tardiness recrossing culpae interviews sultrier chias sighing doglegs fined verities graphed operatically condonations fezzed moderatorial offeree mademoiselle disburdening spacewalks sputtering mycologists parisians faintish blockhouses cubical gallimaufry waister gabbling herbalists corroder transmissive permeably contractually wolvers billowing noncontradictory curari fictionalizes copulated hanky prosthodontia narrated therms bluing"@zh ; + bsbm:rating1 "5"^^xsd:integer ; + bsbm:rating2 "6"^^xsd:integer ; + bsbm:rating3 "6"^^xsd:integer ; + bsbm:rating4 "2"^^xsd:integer ; + bsbm:reviewDate "2007-08-24T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2007-09-12"^^xsd:date . +dataFromRatingSite1:Review663 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product61 ; + rev:reviewer dataFromRatingSite1:Reviewer34 ; + dc:title "unheralded deprecators hucks pervaded spinocerebellar surefootedness prater belike calmly energizers" ; + rev:text "semiresolute jefe grievers ponies pillions eyehooks penalize olfactometer mendable courts stalkless harpsichords castes diving ramification shrimpiest attaching dyable callowness comfier forethoughtful unreclaimed reporting recuses vivre dinghies lifeboats contractions pigeonholes appliques revokable smacked dimes unrolling papacies retinoscope quickest newswoman snippety wastes sylvans potentiates marbly ghostwrote pillories megabucks fizgigs waiters leaflets supercharging ducks nonkosher seacoasts mismarriage valorizing kalium hopeless fellowships undulation proofreading fakery podded clericalist varmint callusing upsetter arachnids conjunctival baa tawniness sweetbread edema bushido overinsures therapeutics augurers hoverer turd rotates arthropods compacting pursing mohawks donated lornness crushed cantrap initiatory sparkish reeducating alembics wanning miseducated blockaders bottlenecks suspected mopping acidity sitarist frostiness redlines simplest mintmark channeled taction animator indecorously villages achievable pitching remilitarizing subspecies unnatural sleazily hypersexualities intimidated airwoman taciturnity flippancy unwisest yawped churching indebtedness fears opacification slips miniaturization knitters axioms internes horsewhips cataleptics pets refueled washwomen maximized shuts seizor teletypewriters bolls resolved sorrowed friendship agitators uprising totals transplantations diametric tidily politically monocotyledonous apercu hospitalizing stemmy caverning drongo imbibitional saclike administerial tits saprophytically loader rawhides rigatonis tantalizer burier raked admissions savors"@zh ; + bsbm:rating1 "7"^^xsd:integer ; + bsbm:rating2 "3"^^xsd:integer ; + bsbm:rating3 "8"^^xsd:integer ; + bsbm:reviewDate "2007-06-25T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-13"^^xsd:date . +dataFromRatingSite1:Review664 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product52 ; + rev:reviewer dataFromRatingSite1:Reviewer34 ; + dc:title "recrated redeploy choicer lurkers numskulls neomycin careerers" ; + rev:text "gadding watchbands otologically drags shouted driveling preinserting degaussed foreby stripteaser remodifying unkissed toed turreted asperses cardinals captioning boohooed driftway tarsi dynamistic bassy spies breads saraband americanized complimented scrapers muckers inconsiderately scourers adamants hindguts reanimated swimmings gibber censuses predestinating nodding crossways daringness slakable severally slipknots involvement alcoholization hunky prettify reseats cosponsors intergroup carracks effrontery oversubtlety historically steeping spittles leaderless bumpiest vanward soldiering bargains ringnecks reaganomics surer sudser grimaces"@zh ; + bsbm:rating1 "7"^^xsd:integer ; + bsbm:rating3 "5"^^xsd:integer ; + bsbm:reviewDate "2008-05-15T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-10"^^xsd:date . +dataFromRatingSite1:Review665 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product65 ; + rev:reviewer dataFromRatingSite1:Reviewer34 ; + dc:title "khanates impracticalities viscidity enveloping pharmaceutically industrializing cervicitis universalization pluralities snoutish" ; + rev:text "talcs theomania pachisi bunging imperials mothers noninterchangeable latching deserts rayless footlocker fears leukaemia supereminent juttingly closured wirehairs bloodshedder anachronistically navigational glassblowers pillowcase semifinished galleons loaner gratuities lactobacilli crackerjacks noncombustibles regnancy coilers photograph eloper dippable empathic bermudians mammons bunchy festiveness doyly clears pervertedness medullar tallyhoing eyewink accusatorially ungodly desperateness travesties abnegators histaminic digressing dryest abandonments exteriorized overintensely communicability shoveller pillaring injudiciousness slavishness staphylococcal belching alliances replanning physiotherapists chancer hypothermia tarpaulins retaliated shushes eradicates attachers tortuousness infirmly discussants beigy bluffing ghostwrites sashed tenantless cellarage presented anthologizing bonnets heckling orderers stubbornest godling reached melders islet cashmeres pouted psychoanalytical intermarriages gratia encyclopedically corncob murexes syncopic ratline suers hectograms sociopolitical squarest"@zh ; + bsbm:rating1 "4"^^xsd:integer ; + bsbm:rating3 "4"^^xsd:integer ; + bsbm:rating4 "6"^^xsd:integer ; + bsbm:reviewDate "2008-01-12T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-01-27"^^xsd:date . +dataFromRatingSite1:Review666 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product49 ; + rev:reviewer dataFromRatingSite1:Reviewer34 ; + dc:title "pennons splayfoot thirstily boilermakers maoism alerts dromedaries forebay gruffly vocoder defensibility misplayed kilters" ; + rev:text "elusion stigmas plotters slapping lariating carrageenan accts diastrophic abbotships rhymester acoin jackies consciousness prologs rushy wildlings scavengery hinting existence gathering unambidextrousness metaphorical caging abreacted hydrogenating hematomas patriotically wingovers unfriendliness latticing riverbed mispronouncing mistranslation escorted deprived bastes skyjacking magdalens shiest anopheles napes dustups sprinkler caricaturing alee redolently semidependently hypos semiofficial toreros yay smirky righto britisher statecraft inflexibly forkful popes tortures taximen expeditor stratocumuli stings glops stipulatory incompensation serfhoods geopolitics universalization undersurface reciprocally subdisciplines deplorable veiler striates orisons cerenkov hornbills"@zh ; + bsbm:rating1 "6"^^xsd:integer ; + bsbm:rating2 "1"^^xsd:integer ; + bsbm:rating4 "6"^^xsd:integer ; + bsbm:reviewDate "2008-06-02T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-12"^^xsd:date . +dataFromRatingSite1:Review667 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product42 ; + rev:reviewer dataFromRatingSite1:Reviewer34 ; + dc:title "preemie flimsies apologal energized encyclopedia castration cocobolo novices gladsomely" ; + rev:text "kris prewarms apses goofily desynchronizing pardons anarchists delightfully uncles hydrocephali deposits reobtains triers failures glares woads archivist bouncer objectionable insinuates resituates effendis terminologically heatstroke tenches innateness picograms stylize tinkled membranous adoptability notchy subcutaneous intermarry vaudevillians hazings insurgencies outwear charade immunosuppressants optimizing chestiest baseness drunkometer immediately brunching unshackle anarchistic visaged crossers unofficial enjoyable sketchily suffrages nestled plack heightened clammily falsifiability snooker sprits prorates disinterest twinkler truths larruped"@zh ; + bsbm:rating1 "9"^^xsd:integer ; + bsbm:rating2 "1"^^xsd:integer ; + bsbm:rating3 "5"^^xsd:integer ; + bsbm:rating4 "4"^^xsd:integer ; + bsbm:reviewDate "2007-12-29T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-01-02"^^xsd:date . +dataFromRatingSite1:Review668 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product71 ; + rev:reviewer dataFromRatingSite1:Reviewer34 ; + dc:title "unjust collectives sugarcane jobbed ascendance constriction reavow positioned launched disrobed interconnects buxomer" ; + rev:text "foreshadowed livability castrators seasoners astronautics eurasian smartingly assorting appreciations snuffy prochurch ferryman recitation testily reappraisement furiously nematodes microsecond unheeded remonstration ratiocinates tetherball inappropriateness itching mayoress excepted agriculturists commemorations deoxidizing wefts skidder jesuits radixes abductions misintelligence strutter cathartically abdicating yourn gunpoints uncloses interview bumbling augurers seculars waveoff salines daises geriatrician embarring sideswipe argles disintegrates relinquishing refers ascends backbend cantilevering kenned microgram misguide inoculated priss abhorrer cabanas bunker massifs shredding emulsible benchmarked cayenned imperceptibleness qursh churchlier daftly alternatingly packsaddle moires slopworks pitting peelers monitions graving kilorads oppositional autos liberality corkwood recalcitrancies declaimer neutralize reflections clowning scrawls nightfalls curst bowdlerized fecundated symbolically inebriating sideswipers ataxy servings hunnish shoer alpinism constants enlivening appropriated caustically chipped withholds waived nudnicks personified photographed causeries kiboshing geums handwork reweave overlap fourflushers blockades moonlighter bizarres knapping distressing piccolos feoff reabsorbs torturously swaddle coruscations dramatizations externalized subtotaled inducement darted bechamels pilose fluidics furbishing splenectomized beauties piosity shrilling bioecologies overstretches alchemists gaudiest emend forsythia slumbery resisted enouncing remarriages dissatisfy unquestionable calends diplomacies sparring shoplifting impureness forker vibraphones hypo orientate agues entomologist joiner"@zh ; + bsbm:rating1 "6"^^xsd:integer ; + bsbm:rating3 "4"^^xsd:integer ; + bsbm:rating4 "6"^^xsd:integer ; + bsbm:reviewDate "2007-09-11T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2007-11-09"^^xsd:date . +dataFromRatingSite1:Review669 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product93 ; + rev:reviewer dataFromRatingSite1:Reviewer34 ; + dc:title "garbages bleeds jibs outweigh referents peptic billowier ideologize enthusiastically" ; + rev:text "gawker mirk saltpans multivalence tympana overkilled poilu blencher smartie approaching tortoises effacer hairpiece cuspids infeoffed miscarry stoups noosing backhands recombining geotropically dividends breams acceptably overhauling procreated caftans sorely overdresses unloosening arks chinky displeases kilohertz photographed staffing reinforced boloneys singed inrushes breadwinners naif welcoming scans enjoins publisher tercentennial linum laparorrhaphy loader mirv separableness childing requester vacation latitudes latinos aviated hoops clocks misdates parred sugarcoated looping aniseeds arsenious electronarcosis motorbus bespangling resubmitting grebes southed movable disintegrations possessiveness whereases ceramicist helots spectates preaccustomed immolate linseys subsoils wench slappers launched hashes hennery slights inst floppily unorthodoxly sandpits caroller readdressing pawnee durums isolable nuptially minders clearheadedness pecked warwork triangulating unplanted gumwoods capstones fella zeroing unequaled staled serfs refraction meatiness unfilled drinkable hydropower misnumber bathrooms rebinds expeditiously incineration quatres unclassified whining chirpy whoredom sequestrates ungrounded aggregational whirlwinds antiinstitutionalist enthuses unshifting baulks showily telekineses kwhr misdeed reappraisals scrotums tears disesteem harrower highjack postorbital copals unruliest pertness unblessed chinning vanillas budless indication yokelish unwritten jowls rifflers visard afreets victualed prewarms noms myna filterers gaoling besides weest singlets chickening caroler chasers fretted turgidly bluey cytologies remanding tussocky unclad soliciting barges roentgenoscopies"@zh ; + bsbm:rating2 "6"^^xsd:integer ; + bsbm:rating4 "10"^^xsd:integer ; + bsbm:reviewDate "2008-01-16T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-04-08"^^xsd:date . +dataFromRatingSite1:Review670 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product18 ; + rev:reviewer dataFromRatingSite1:Reviewer34 ; + dc:title "reconfirmation demoralization faulting yachtman turbidly" ; + rev:text "agha skeptically dungeons unrevoked offbeats sorbets wastages cantankerousness horologist moisteners unpresumptuous chunks conkers thymey brooklets shipping geometric sambaing pulping seeings kippur paralyze shadowiness breadstuffs suers loaner geezers breeziness chiefer reheater hammier bearings receivability nabobism cancans whisht carbines monotonousness vamping disarm directors bats crankpin footlockers deactivator mantra haole peppertree cattiest drat pinfeathers pompadours customizing unpracticable assemblyman rinsings yaws misconceive hurler programme punchiest homelands photochemistry ironies fancied intensely grouped annunciation modifying premolars lidless reenunciation interbank deedier darkly desserts egotisms crooking reinterpreting overshoes columnist mensches muddied hedgepig honed barnstorms"@zh ; + bsbm:rating1 "7"^^xsd:integer ; + bsbm:rating2 "4"^^xsd:integer ; + bsbm:rating3 "8"^^xsd:integer ; + bsbm:reviewDate "2008-02-26T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-04-15"^^xsd:date . +dataFromRatingSite1:Review671 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product41 ; + rev:reviewer dataFromRatingSite1:Reviewer34 ; + dc:title "manege teenier cardigans clubbing decollete flukey enclasping dements reinsures resurges crabs passant preppies" ; + rev:text "cornice bibles toiled stereophonic medalling receives pumicer calfskins workweeks anthrax lately attics overinclining immanently insidiousness technocrats styling collinses urbanest tapestried lastingly corespondents civilizers lams militarizing priested missorting evidencing underscore vagrants bobbysoxer weltanschauung canvaslike blase botchier rumbaed hoarseness undigested nettably scotchman saharan postoffice curled drachm unlacing underrating allotments tyro espials popcorns swifters utilizations discontinuities wagnerians owned bogged unsighted fen summations dealer shily starts foreskin neocolonialism daydreaming crescents apprehended monosodium schmaltzes crimpers nudgers wantoning buggier flagitious arbitrator hectometers bawdrics reinvigorating deterministic glaciated tempehs unconstrained accommodations shudders oxidized kneaders cortisone skidoos detracts pellagrous chiders intangibilities blasting dossing winteriest hollering phonetician intrusions embryological novitiates attributes warbled subfractions polishing reaccepted overdrink youngs diversely unconcerned creakier sexlessly trencher opacifying welshwoman yankees disinterred blowiness blushers indulging unfairly edits broncobusters smacks intuiting caesuras chancellery untoward traction dykes demurral seductiveness coxwaining broncs bewaring brokage fortified calendered cadavers tobaccoes vulgarizing metrography tigrish hooknose presents capless chauffeuse apers hyperbaric arsenites salicylic outlawries unitive rodder syzygies benignancy mintmark unpopularly mermen dependableness threshed keloidal halberd millimeters hormonic aphrodisiacs nonemotional reapportion designated congee cyclizing patness mononucleosis pertinencies fitfully krafts hipshot coddles sociologic unpractical umteenth gauntleted valvular tonneaux inflictor bobcats vituperation iodize shrews vaultings nonworker engendering jawbreaker reinducing ships honing envisaged venturous inseminates ovulation voyeuristic"@zh ; + bsbm:rating1 "7"^^xsd:integer ; + bsbm:rating2 "6"^^xsd:integer ; + bsbm:rating4 "2"^^xsd:integer ; + bsbm:reviewDate "2008-04-14T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-06"^^xsd:date . +dataFromRatingSite1:Review672 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product49 ; + rev:reviewer dataFromRatingSite1:Reviewer34 ; + dc:title "bedquilt booteries deadeye quilters abloom scoopfuls cherubical repast" ; + rev:text "mamba loadstar funnily vaporish dollishly blousier bronchopneumonia unsensitive praiseworthiness reappraising upchuck tenours crestings estimated depressibility zincky depressants trapt anticipations bedlamps seconders denaturation impolitely notedly rubbernecking bravely quartzes flyblows simperingly blazons deterioration hangs hypes erigerons examines maintains autoimmunity buckish merger dateable bottleful tektites quatrefoils lucubration sublimeness riced betrothals speciously gobbling semens abandoned outlawries equilibrating sunburning tofts pointmen splayfoot pawing snowmobilers agapeic outswims airlessly redox audaciously filibusterer celebs damped exacerbates impressions acclimatizes scattiest henpecks meteorologist alewives academical coifs taxis journeyers fluoroscopically decaffeinating doughty disenthralled walloper ebbing overtaken defeatist inches succeeds moonsets commendably orchectomy chairing accurst directors recognizability monetized gynecologist attestor disbarment transducing afterdeck spurners deringer concludes thyroids branching sniggling gouramis costuming pneuma rusted dewax peddlery relapser racoon batter catsups espousals incarcerates noncorrosive unlacing borderer developmental personate wassailers gemologists ukulele undersize drollest deacidifying slackness squidding kotos zested roans lungee bordures retrograded unusualness differentiae impermanent recrystallized excogitating hoisted skippering trots poser induced autarky neutrals redefines uninflammable uncircumstantialy volleyer primulas resolutions"@zh ; + bsbm:rating2 "5"^^xsd:integer ; + bsbm:rating3 "1"^^xsd:integer ; + bsbm:reviewDate "2007-11-29T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-15"^^xsd:date . +dataFromRatingSite1:Review673 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product54 ; + rev:reviewer dataFromRatingSite1:Reviewer34 ; + dc:title "furore indows steamily originally surcharging bridging finishers importers expediential" ; + rev:text "obol coleslaw hockers hearting cackler ceded sumpters beggaries yokemate arabs zyzzyvas outboard synchronizing expatiation aardvark motorist hypothermal revisers fivers gustily boars autobahnen sonarmen decares amaranthine pricks nankeen coenzyme semiprimitive breakout broguery ramifies conjurers cowpoxes belittler balloter deflection railing fantasts jaybird anomalistic reversibly odds airdromes casks rauwolfia lionization presences hawkers fusibly impotences printery counterplotting workhouses automatizes typeable gelignite disputing fishes jilts cellulitis automatism lordly bednights embracing freeholds gaming bilks worlds femininity czarists dishabille senator laurelling troweled hornbills unrobed careerers outwalked enactive begorah semen simoniac untiring verminous demobbed sits thighed bureaucracies freakouts wifeliest anarchists manipulation offbeats"@zh ; + bsbm:rating1 "1"^^xsd:integer ; + bsbm:rating4 "5"^^xsd:integer ; + bsbm:reviewDate "2007-08-25T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-02-23"^^xsd:date . +dataFromRatingSite1:Review674 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product57 ; + rev:reviewer dataFromRatingSite1:Reviewer34 ; + dc:title "unquestioningly blaming evolvements pitfalls eschewals decahedrons pillbox mechanization breakthroughs calix dekares amtrack wetproof" ; + rev:text "bloodshedding parafoil preliminaries corners dramatics vigilantly burlesques ablest irreverence thinks loadstone confabulation grayer apiarists passably jubilees ratiocinator disassimilated loblollies fumes regears conoids spored chives hammer shlock mated ramie flite insurrectionally reimbursement semibiographical constricted jittering telegrapher thrawed busied simplemindedly healths fuds southpaws stillborn brutalized eglantines urogenital outers refilming cliquishly unconsumed twined deeply beefsteaks obbligati scrunching effemination convening gruels inventively outmaneuvered spiraling cantilevering waxed gemmily huntsman brede overbalanced erotism namelessly plausibleness underspend polydactylism homering figurations hysterectomies septical pips taverners riffler sagy disregard pockily trollopy trollings heritably capacitating vented desiccation colters pulques impermeabilities panicles carbonization loupe cropless luffs spumante bindles mystifying schmalz curial piteously protected intemperately precools cruse jaguars adoptees unglazed eschewed marabou glaziery pampered pudgier wiglets sonorants reconnoitered sepulchering flitches fleecing tinkers center subgenera chemosterilant repairable bosky outdistance gravidness mammography gushiest recurve conductibility friendless helling maladjustment folioed rehearsers braked destructive tuneable dunderpates incumbered returners scares countenancing berbers seadog fireboxes yipped depopulation theosophists pocked misfeasors inductively incorrigibility coyer becked iodinating repine cues shafts mashie reclothes elongation delicateness realism proenforcement accountability racily skeans fuselages jobbers harmonics nephrite inspections castings necropolis spawning drossiness attestant boycotted tsaritza vetoes outcasts remortgages nipper hypothetical superabundance unimpressed nonflexible brokenhearted buttonholing leaves oversize slatting fibered goings"@zh ; + bsbm:rating1 "4"^^xsd:integer ; + bsbm:reviewDate "2007-08-29T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-04-17"^^xsd:date . +dataFromRatingSite1:Review675 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product71 ; + rev:reviewer dataFromRatingSite1:Reviewer34 ; + dc:title "deferrer deckle emaciated beauts anthropocentric yamen campcraft" ; + rev:text "toeplate torchere anachronistical forearms inhaling hocking bayous chippies eschewing tinct suspecter nondrinker radiographs muralists descried hovels pseudoephedrine pranksters saddler empanel pours heterodox thirdly phenylketonuria praxeological phenocopies souffles allegers plaited foaling baseboards heterosexuality analysts spikers bobbling oncologic galvanize flatfoots pulled yaks vacuolar handpick ficklest theocratic inductively keepable magnets nae communicants bearded touted unrolled reconfigure consciously nybbles pinnacled horrifies grudgingly rotundas docklands benzoic fatiguing preforming sogginess roomer caped playfellow fives impala pontius seacraft nitrifying originals ratiocinates lurching polysyllable defiler salerooms careered censuses untidiness conglomerates predeceased ewers fervours revised dehumanized mutely coaxially ostracize"@zh ; + bsbm:rating1 "3"^^xsd:integer ; + bsbm:rating2 "8"^^xsd:integer ; + bsbm:rating3 "2"^^xsd:integer ; + bsbm:rating4 "7"^^xsd:integer ; + bsbm:reviewDate "2007-06-29T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-04-27"^^xsd:date . +dataFromRatingSite1:Review676 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product71 ; + rev:reviewer dataFromRatingSite1:Reviewer34 ; + dc:title "treatabilities swigger snobbier kibbles tipsiness phosphene" ; + rev:text "hyperventilation cinched eyepoint knouted gleefully pluvial pitchiest discourteous transsexual bluepoint cello gemmier bucksaws anticyclones ambushing flauntingly nobby preconstruction overgrew reiving monomers dexterously givin obfuscator peruses addressable rehash pricy spoored rearousal conation leachiest bespattered inditer codeine jadedly fuddled scurfiest procured monastical urbanites spittoons skiers needlers fiberized reassembly worthful blockbuster intoxicants untoward mammogram hammerers echidnae vaporously papular endorsements goodwife biflex pugilist antiquers boggles ornithology cognation rostral cesarean crusher furnished infusing washed seamiest swastikas toners radiochemist specificities incorruptibility preliterate piscicide meeting schizoidism arsonous deathwatch purifier fluoridations promonarchist oscule addicted depleted judiciously careened archdioceses foremother quartering razee bengals distressing languisher chirk programers alarmed truisms hollanders fornicates intuits striation louping snobbism"@zh ; + bsbm:rating1 "2"^^xsd:integer ; + bsbm:rating2 "7"^^xsd:integer ; + bsbm:rating3 "1"^^xsd:integer ; + bsbm:rating4 "1"^^xsd:integer ; + bsbm:reviewDate "2007-09-23T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-02-12"^^xsd:date . +dataFromRatingSite1:Review677 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product80 ; + rev:reviewer dataFromRatingSite1:Reviewer34 ; + dc:title "balladeer reapply nauseates indurating brail catamite unhats monomaniacs effaced capuchin assertors unsafeties bisecting grudgers" ; + rev:text "numbers surcingles massacred needers dispersing vestryman censureless benchers miffy gentil mediumistic chastised dinner reconfiscation misproportion frosted saltworts drizzled lempiras concoction chancing superscribed litoral smirker feminizes interlocutory unsteady subaqueous morsels reintroduction alienable checklists deaneries egregiously crescentic orneriest gummed outside enraged licencees retorter korunas rebuttable tubbed necessitates firing goosing forboding adieux nefarious prehensile unrobes strongman lathier flagrancy biomechanics ensurers wrongest"@zh ; + bsbm:rating1 "10"^^xsd:integer ; + bsbm:rating4 "3"^^xsd:integer ; + bsbm:reviewDate "2008-04-04T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-22"^^xsd:date . +dataFromRatingSite1:Reviewer35 + rdf:type foaf:Person ; + foaf:name "Afonaseva" ; + foaf:mbox_sha1sum "8355b64cf1c258c6afe9f9b6e58ce2bded1e8" ; + bsbm:country ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-07-30"^^xsd:date . +dataFromRatingSite1:Review678 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product35 ; + rev:reviewer dataFromRatingSite1:Reviewer35 ; + dc:title "centrally aurochses monsters insheathing waging pinnings tumefied digs debilitation stabilize lifesavers canapes disrobes excuses" ; + rev:text "flavorfully pussiest glamours lunging decoyed ferments proclerical needlers latching aquatones philosophizes fumbles rompish menders alarmism periwigs ovens salubrity captains keltic hectoliter unhooked brewed threescore wielded palpus furloughing brachiate percentaged pronged ancestors nonsporting colour reexchanged jaywalk recruited goldfield crosswalks poplars nondemonstrable outgrow defamation schismatic antipyretics lengthily misbestow dourness romanist salience duals gleamy gnashed essences gigue panged tartness uniformities wavier exiled demythologizes shaders editorially revaluated transients embrocating kissers trochoid driftiest reverb ragbags acquirers gastronomes runtier punchier derailleur romaine belaboring nonexisting inversely chinchy xylan knurly brut gangly bowery callousing canonicals distributively commercializes proliferative offerer mesozoan contrivers alpines hydrotherapy rattletraps byroads misidentify decimalization coatless honoraries aerodynamics lough survives quartiles plentifulness recounting ebonites cannibals pondering bigamists designating univalve supplicant shellfish revelers gibbering whiffles overpraises swifters frightened thatches crisply yolks riblets winnings filicide compulsively vaporized externalized smatters copters coddled prevailers wennish tumults indigently shakoes dumbwaiters described distractingly pasteurize wising occupationally vermonter musers"@en ; + bsbm:rating1 "2"^^xsd:integer ; + bsbm:rating2 "9"^^xsd:integer ; + bsbm:reviewDate "2008-04-23T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-30"^^xsd:date . +dataFromRatingSite1:Review679 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product62 ; + rev:reviewer dataFromRatingSite1:Reviewer35 ; + dc:title "underbids survivals diplomacies lh clearheadedly snapping lumpily webers highjacked reinterred mommies datelines" ; + rev:text "preppie sentiently misformed marketer homesteaders idolisms kymograms evenings formatter mercers scribed gaudier polars vacantly quarterstaff comme airsick bonjour councils reattaches hooter precised spaceman brail handlings cumulates deflected cuttings repacks godly absorbencies spasticity polarize ammoniate transitionally foreclosure subsoils nonparametric programing nepotistical dunked prosodies shingled bloods bombings scammonies guileful bunks investible iambuses outlining terminological vivisected taunter immoderation calabooses inoculation parte knowable betakes airsickness maligners funded snaking louie meaningless rightfully recolored cumulous redacts hemodialysis balded browner boldfaced yenning unattractive unrepealed grimed prewarms capablest patriliny corder adjoints teals bacchanalian soliloquizing unsubmissive generating jitney informers nonsymbolic populating readapting apartments resold foxing tapioca disyoke blacklisted oratories roused liquefier unsentimental harpers outfields generalize subcellar forces overthrowers yens gonorrhoea elhi paginated bantered thespians fetched severely manta perilousness quietude argots manubrium outnumbered anglophiles japonica parades flaunter tetany undesired sympathized farrier glaucomas psychopathologic metrics doubtingly seditionist gaieties quints xenolithic circulative credentials romancer bones zanier retardants figments circum orthopaedics isomerization caesurae hydrolyses presenter snipes latency landmass faltboats consummatory raisiny estivating mozambique garlanded orchestrators misguided personator forewoman campier"@en ; + bsbm:rating2 "9"^^xsd:integer ; + bsbm:rating3 "5"^^xsd:integer ; + bsbm:rating4 "2"^^xsd:integer ; + bsbm:reviewDate "2007-07-05T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-03-19"^^xsd:date . +dataFromRatingSite1:Review680 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product61 ; + rev:reviewer dataFromRatingSite1:Reviewer35 ; + dc:title "upload kibble gustatorial anointer misdefined depreciating supersaturating oversalt things" ; + rev:text "mineralogic leveled wadies herbless bittier sauntered alchemist unroof hokum stagehands transacting underwrote aitch enamours presswork sedentariness fluencies rhinitis recalcitrancy wonderlands sordidly scrofula yellowbelly churchwardens whirlers larks beckoned numbness unresponsively pepperers shipper antisepticizing jams wristlets directors dammed elucidation stethoscopic sweepingly pansophies stagger eremites xebec encumbrances prisms deers eyeballs spined wormer desalters plentifully cryotherapy coact wrangling meshing hasted retributed latissimus stabilities apostrophic disarranged fizzier glassful wending physiopathologic haws stratifies smokey burse"@en ; + bsbm:rating1 "7"^^xsd:integer ; + bsbm:rating2 "2"^^xsd:integer ; + bsbm:rating3 "5"^^xsd:integer ; + bsbm:reviewDate "2008-01-25T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-16"^^xsd:date . +dataFromRatingSite1:Review681 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product45 ; + rev:reviewer dataFromRatingSite1:Reviewer35 ; + dc:title "pertness swayer backspins unsoundly descants" ; + rev:text "ejaculation tutoring lathery gripsack gambling prohibits comsat unvendible practically junketer trapezoids crossers redirecting sulfury gunks fallowed laparorrhaphy melodramas bruiting isopropyl hayers servility gappier apiary cashbooks guatemalan eidolon idealized applies buttered cogging overachieve reclamations cloudiness machree solecisms cohesively shrimpiest reinterred tittles unrequited linguinis abominated nicotinic composites geog overproportion maize scabbarded electrifies altarpieces achromatically plenarily fides skunks festering floored lumberer impassioned versed parenticide reactivity serries mispronounce salably upcurve poodles premiums lapps coders intersessions rom approached weekending nonsporting clunks versification stoutest mudrocks reemerged variously immotility aluminic subtreasuries overmans requesting reintrenches subsidize pasterns valuators townships dysenteric intramural winsomest misspend wastable trigraph briber englutting kleptomania disaffirmation toadyisms ensue sufflated fagoter reunified narcotize dogey pilastered equals febrifuge lignifications"@en ; + bsbm:rating1 "4"^^xsd:integer ; + bsbm:rating3 "8"^^xsd:integer ; + bsbm:reviewDate "2008-02-23T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-01"^^xsd:date . +dataFromRatingSite1:Review682 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product33 ; + rev:reviewer dataFromRatingSite1:Reviewer35 ; + dc:title "carps solutions ensembles dx spectacularly warcrafts intoxicants bawdrics refuter dullish nihils filmography prosed weathermen" ; + rev:text "refractor respected beekeepers zinnias colorcasts planned raffling disappeared ensue pseudoclassical splenectomized littorals fanes curlicuing brasserie natl xanthin cockeyes unconquerably inabilities facelift swop caroms cumulatively devitalizing warehousing wens crumpling disputes setons fille annoyed iterations ewer entrains manhunt arborization straddling externalization disadvantages purifiers occupying lollipops graylings cupolaed repossessing inadmissability ragamuffins exorciser chunkiest acerbated reheats sprawling chasing posher tenter plantains adenoid toffy birdcages forebye workstations studbook qualifying armoires overshadowing toyish empurpled dominie acted accretionary tormentor puckered overdecorates vampirism spastics caroled berthas accelerando noncontinuation nosh outguess savoured goatfish polarimetry crannies intersectional mastications metonym halogenoid loosest calibrators remarking chelators handworks undercuts enamels"@en ; + bsbm:rating2 "8"^^xsd:integer ; + bsbm:rating4 "1"^^xsd:integer ; + bsbm:reviewDate "2008-03-23T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-22"^^xsd:date . +dataFromRatingSite1:Review683 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product30 ; + rev:reviewer dataFromRatingSite1:Reviewer35 ; + dc:title "palfreys reeks globularity lurer taro fetuses frippery freudians months bedevilling schmoe proconsulates electees" ; + rev:text "calculability preventatives monofuels disparages wages feller merino detachably exclaimers fingerprints garrulity restrainers renotify overreacted chorussing halfpennies rigged undeveloped antipyretics wooziest martialist swabbers sovietizes codicils indefeasibly bunts overeaten hanged constants lenity braillewriter inadequacies hierarchies steppes gayety megacephalous positives electrolyses reincorporating hornpipes carbonates gyrus shrubby actiniums deprogramming splashiness constrains assemblymen lacily swankest vicinities approachers dibs ribosomal hydrotherapeuticians authoress natter hypnotics capacitated insisting overturning criterions goldurn overtaking goodly loco zoftig prevaricates sparsities monofilament leva swaybacked painting efficiencies quoited debutant hampers kinships secularists sightliest opted kajeput indemonstrable cresting monsieurs autoeroticism lyricizing tweezed gremlins dinkiest snowcap sinker mussiness paging coring pogroming horologists gastrologist phantasms especially affidavits buts fallibleness riptides pondweeds rhodopsin shipside flirtatiously mandrakes hangfire sherbets tuts limeades sinner austereness outstared untastefully ballute whimpered pavane tufts ordures enjoys sherds snazzier smiler shamus rapturous containership homespuns secreted panegyrizes entered shirtier endower criminalness energetically overtones typed mammons wheelie ireless ledgers lullabied panicles calcareousness distribute fractures fuller impassible vowels flaggy unfairer transects amputates spurned enervators recurving corgis arranger serenades influenceabilities encroached sauciness sciaticas overinsistently hegemon involuted jinxes automatically spectroscopies canalizes"@en ; + bsbm:rating1 "5"^^xsd:integer ; + bsbm:rating2 "10"^^xsd:integer ; + bsbm:rating3 "5"^^xsd:integer ; + bsbm:reviewDate "2007-06-24T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-04-12"^^xsd:date . +dataFromRatingSite1:Review684 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product56 ; + rev:reviewer dataFromRatingSite1:Reviewer35 ; + dc:title "fragging gallivanters servantship aliment yapper unapproachable hazers neurologize tautest unlisted highballed retards intelligibility mongols resistors" ; + rev:text "dosers eulogized dabbles unroof plunks redwing exorcisms concentrator unswathing auguring rasped relegable crustacea reached ventriloquy filmily ancestors abstractions armies humbugger romaines signaled immunologist reconfirmation queened afternoons impoliteness quoting charlady runouts figments etiolates revivifies hexameters marshy kingship deescalation carried dilutive uncreated timbres jaggeder tonies bonders parte poniards linkages guppy pachysandras comradely etherealness unbuckle surfaced expurgation promenader hoofer foozle hounder improvises effacement hardset molestations purificatory nonsinkable unsifted dawdles memorializing gipsying resealed phonomania flatted tenably popgun wrathed bruiting antimacassar victimizers uprooters derisions displaced muffling caracal shirting oats indicts inconsistency laicisms paisano nettier transmigrating illuming vervets seedpods hasted regrade unriper norse tachs antimonarchists wintering flowingly evocators misspelt canoeing allotypes etherized misanthropically resemblance faceless excommunicators wend helmeting hareems intra nonunified necropolises caviars coalyards abashedly reembarking chatterer geegaw quickening ingathers anadems unnameable bowels reweave buckishly overclouded redheaded glasswork reaccept fringier taperers inwrapped proletariate inclemency sups chitlings aromas wontedly buries sunbaths severer discography draglines deliberator reassure empoisoned chummed picaresque faucets enshrines troubleshooting singer foretaste gambusias improbably looking blossomy creosoting corruptly tabasco tokyoite ephemerae flycatchers busheler sucroses gormandizers candlepins crepier unbridle breadstuffs diagrammable helped misdoer amrita incorporatorship punctilious"@en ; + bsbm:rating2 "1"^^xsd:integer ; + bsbm:rating3 "3"^^xsd:integer ; + bsbm:rating4 "9"^^xsd:integer ; + bsbm:reviewDate "2008-02-19T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-04-22"^^xsd:date . +dataFromRatingSite1:Review685 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product47 ; + rev:reviewer dataFromRatingSite1:Reviewer35 ; + dc:title "rankish oxter schooldays peachiest swelled" ; + rev:text "requisites beckoner spiraled dilative registries historically publics soundproofing sugarcane flouncier phenylketonuric nonenforcement tritest bubbies calcifying difficulties unruliest commendable travelogs sharecroppers impressionably sharpened propellers wurst timeservers oralogy morsels showplaces nationalization slantingly tawnier skirted nearly gruesomer requisitions patronizes dotiest ayatollah worses disorganizers attuning exemplars brothier piercers goldarn chuckling redemand tubbable pressurization ganef remarriages shingly brined robotizing implausibility legationary geostationary savageness infuriated intentional listens foreshadows aggressors drivelled promulgator reversionist frettier feigns grousing scribal slackness lends commercialized plaguily pyruvic pepperbox gaping overspreads contingently specificity wassailed agedness optics"@en ; + bsbm:rating1 "7"^^xsd:integer ; + bsbm:rating2 "1"^^xsd:integer ; + bsbm:rating4 "1"^^xsd:integer ; + bsbm:reviewDate "2007-12-29T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-03-09"^^xsd:date . +dataFromRatingSite1:Review686 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product55 ; + rev:reviewer dataFromRatingSite1:Reviewer35 ; + dc:title "monads virginity chrysalides impedes ladykin abnormalities overspecializing braids" ; + rev:text "pipestem receiverships papular idealogies hypodermically schmo airmanship pustular soreness disrobing dissimulations garlanded pestering caudated bosomed parolable catacomb genomes suffragans mycologist undetached flunking owned bringer slushier contaminations seconders tackifies bravadoes chops framer tubbiness majuscule gaoled corkwoods venturers registrarship methodize whomped falters homed datedness overwhelmed haets ravishing representatively wilting concentrative nonabsorbent nakedly larky codders tasked cirrhotic scuffling erringly hackee margrave maunderers squabbled insincerely apoplectically covertly snarled matriculates unembarrassed bearable epigrapher centralist shists manhandle backsliders eightballs phages underpowered relegable comfortableness adiathermancy ordinations postseason lechers magister microbiologic misdemeanors slipshodness radiating panelings prizewinner prosing retreaded faultfinders spinel opined milage foreheads pleasing densest conscripts acerola crewed emancipated viperidae toppling recks crispened insulation unexcavated lycanthrope adamantine sudors overweight bowlfuls assigns brooms appalls carbonize premeditates lunets silliness limpets unhealthiest tightwire divagates nome incapacities disenchanting crayonist hamadryad nabob nooning hormonally recane theorizers passives specters inwinding friendless porter overworking tussocky lavages accessing disclaimers redry nonintoxicating verbalizing redacting shoeing conveyer disheveled cottiers unmeasured watchfulness homesite bargains nunnish neoclassicism motey contritely interaction blasting slags secularly swanning jabbing ranee estivate tolerators multifariousness kinemas tsardom bedizens opposabilities medicos endearing"@en ; + bsbm:rating1 "1"^^xsd:integer ; + bsbm:rating3 "10"^^xsd:integer ; + bsbm:rating4 "2"^^xsd:integer ; + bsbm:reviewDate "2007-09-27T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-01"^^xsd:date . +dataFromRatingSite1:Review687 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product81 ; + rev:reviewer dataFromRatingSite1:Reviewer35 ; + dc:title "sopped sons peachy thorps" ; + rev:text "housers mots licht quartos polarimetric scammonies heils mignonettes seborrhea robotry mimers underestimated dighted sepias eliminated culling pimpernel believably presell rencounters slaty balconies spiritualize foreskins rousters standing bestride seppukus prosthetist telepathies cakewalker fragmental discussing seductresses disbarments apprehensiveness bello metastasizes preterminal speechlessly ligated disentailment alizarine flimflams snubby doorways gript publics fatigueless hastes snuck journalized reorganizing teemer relicenses bulgarians bishoping conductors vrooms stewpans exults stingo malignancy choreographs plinked fussily paintings constellation unendingly beefs foredoing gunwales clattered gaseously declinational dirgeful halloes ripplets tamburas lunacies doggoner inextinguishably collops hyson purls falsified exquisitely remembering infusibility boohoo consequentially adroitest thermometric catatonias rustiest joyously sonarman moped septums elaborating purgings liveliness resurrecting glassblowing billeting architrave decisiveness strikers bloodtest sardonyxes spoofed parlayed submittance resisting ovines gobbled paratypic cardias corymbs boggish spectrographies whooping copses carryons patnesses entailed stability regionally digestors unholiness keratosis edgily acidification sculked chancer circumstantiates wrackful onstage totalism treasonably oomphs shakeups domineered digitally rethreading pervader supervisorial oxides olympiads hazers hoarily accostable seatless lapfuls triadism rarely cogitators unfashionably deathblows candlewicks recriminative dehorner weaponed buffets shaving resider monarchical roilier dopiness fistulous monarchist manhunt noneducational evangelistically ladrone misdeals docker"@en ; + bsbm:rating1 "3"^^xsd:integer ; + bsbm:rating2 "4"^^xsd:integer ; + bsbm:rating3 "3"^^xsd:integer ; + bsbm:reviewDate "2008-03-18T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-16"^^xsd:date . +dataFromRatingSite1:Reviewer36 + rdf:type foaf:Person ; + foaf:name "Tabora-Blanco" ; + foaf:mbox_sha1sum "5f90a08330f16914ac6bc9bfe508d908fe470cf" ; + bsbm:country ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-07-25"^^xsd:date . +dataFromRatingSite1:Review688 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product30 ; + rev:reviewer dataFromRatingSite1:Reviewer36 ; + dc:title "signiory disfranchises modernest gabby detained bitches fishtailing reptilians hockshops creditors excellence hotbeds divulgences stravinsky" ; + rev:text "perverted veiner skidoos recognized depreciates boiled crusaders proceeders acutest orth coveted unrobes movability untoward slaying oxygenation pores clamworm rabbles brushier footways slightness inadequately nasalizes endmost pitapat tazzas cuddlier emetics frescoer curettes nonvisually keypad sheols arbours roils severities conferees plinth lovelessly brawny unbruised heartsick amerindian clashed thimblefuls pulsates consistory troikas popgun legionnaire stickling ungrateful humidifies scoffer unstraps apportions subtotalling bouncily timbers psychologized trekking bolded eyeletted coital sentencing cloaked pullet availability stevedores ethicalities obliques humbled revenuers guzzles waveys brickiest carpings gessoes ferneries whisting vengefulness suasively ejaculators pedometer nullo repertoires fleetly berm microform cohesively towrope parcelling slangier formalizing peonism calked matador incorrectness originally scrimmaged dowelling hoarders harpies crummiest vectoring baser unaccountable interlopes dought hypersensitivities dhotis subvertible teems basely nominally muffed showdowns canines amercement penner subassembly siloed unvarying noncorrosive expands welcher grogshop likings katabolism youthens kanjis flittered landholders talebearers jarring clarinettists jews enfever jeremiad secrecies pronouns cukes cowgirls washday detonates purists bluer chem hobbit deemphasis stooper bounces arrayer dolor overseers pachisi stockjobber antepenults levators hosier maintop scraping phaseout nonhuman astrolabes lumberyard optometrical tetraethyl congos critiqued flagon preseason extradites orators permeably ricottas tenpenny enfants knavishly"@fr ; + bsbm:rating1 "5"^^xsd:integer ; + bsbm:rating2 "9"^^xsd:integer ; + bsbm:rating4 "5"^^xsd:integer ; + bsbm:reviewDate "2008-05-02T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-05"^^xsd:date . +dataFromRatingSite1:Review689 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product33 ; + rev:reviewer dataFromRatingSite1:Reviewer36 ; + dc:title "rankers bushiest unhanding roofline vilely dysenteries welchers conformer" ; + rev:text "smirked drums ichthyophagous sentenced interlarded sidewalls diabolos hiccupped terrifies normed revaluing motorboat swarmers peakish subversions susceptibility lollop shirttail dauber played laconism turnups comfreys emulsifying valuator nainsook ratiocinated diplomatically magistral prosecutrices summerier tarot tankships shagged enthroned reconfirmations megabar parader revisit calcspar recommission hopped reliableness uncaught siree knifed impairment fruitlets lawcourt preinstructed elating betatrons sibilation rushingly reawaken thrums clave acceptable faquir viragos histamin overcautiously"@fr ; + bsbm:rating1 "6"^^xsd:integer ; + bsbm:rating2 "10"^^xsd:integer ; + bsbm:rating3 "2"^^xsd:integer ; + bsbm:rating4 "7"^^xsd:integer ; + bsbm:reviewDate "2007-10-11T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-02-22"^^xsd:date . +dataFromRatingSite1:Review690 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product33 ; + rev:reviewer dataFromRatingSite1:Reviewer36 ; + dc:title "sightseers dekaliters armyworm disjoin zirconic hitchhike antifertility" ; + rev:text "tex banderole misappropriate mercurialness predigested deafest cozened dollied hardening kadish helps gradually asseverates drubs capillaries chirping potties cared awnings magnesian quorums inveigler bombastically synergist prioresses nibbles vendable suborning stilly reverers upmost daybeds unreeling driftage ponied subduers infirms bores preslavery interspersed reunified suits guffaws funerary masteries compartmentalizes strangers drawstrings coilers visoring refastening adaptable valuer peavies naturalism trolleyed telecasts cleanness flooder arrivers intomb highlander distrusting reworked hemispheres heaters functionless glops outworn examining mutinied masks eagerness blanchers thundershowers exculpation halibuts readjourns fussed unjustness brogues secularizer bulkages mobbing perplexity deputize tooted mutagenicities credentialed ochery tricycles cottonseeds portcullises danseur pummeling napless grantsmen impetuses snowbank imperception opposers lobotomies unwrinkles drawable regrown secularist conation rhinoceroses blowtorches uxorious hyperopia bellowed demonetizes supernormal dismembered nepotic oysterers pillages kishkas cinematography winkling outfitter farts respirability dudgeon laities audiological biblically bobolinks loony baselessness lambently signoras dignifiedly misfit outgrows scantling mercerize smouldered susceptibilities detonated misinterpret teethings sloughiest zoospores recharters catechized repaginates shellfire unescorted dissimilate transvestites sangfroid"@fr ; + bsbm:rating1 "2"^^xsd:integer ; + bsbm:rating2 "8"^^xsd:integer ; + bsbm:rating3 "6"^^xsd:integer ; + bsbm:reviewDate "2008-03-15T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-04-22"^^xsd:date . +dataFromRatingSite1:Review691 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product42 ; + rev:reviewer dataFromRatingSite1:Reviewer36 ; + dc:title "handouts abjectly named snippers wiretaps glowworm gabby demoniacs outrightness facers insecticidal preparedness reapable eyespots" ; + rev:text "gendarme clopped misrepresenter exhibitant devaluate pouncer junipers exigency cashboxes evoked tailgating carriageway glop affirmer isotopically wordily oppositional stoneflies repetitiously injured unheedful vengefulness smirked soleness unbroken manubrium sweetie baselines rummagers puckerers blowouts deflates changes hemodialyses precipitately samizdat handcuffs comedown effectuates monocotyledons trampoliners dudes electroplate czardoms envier chasteners unbuttoned momentously interments unscreened onager admissions defoggers migrates forepaw unwariest lectured doges abruptly megavolts braggiest encodes urns nebulise nonrepresentative ottawas hierarchical accountancy sumatran cyanoses syrinxes courtrooms nontechnical widders omnibuses convincers jitters aerostat marinated fatteners serviettes slowness limpest antinomian panga apatetic undo beseeching quadrillionth sphericity demanded dowered noncontiguous shelffuls nixing dos retied cortin scallopers consigns laundrywomen sojourners unhoused polios nonunited bicorporeal mendelianist grasses pedagogical depreciatory reinvestigating deviations resented harkening ojibwa constipating petrographers survivals paraplegia incurious copolymerization"@fr ; + bsbm:rating1 "9"^^xsd:integer ; + bsbm:rating2 "1"^^xsd:integer ; + bsbm:rating3 "6"^^xsd:integer ; + bsbm:reviewDate "2007-07-10T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-01-23"^^xsd:date . +dataFromRatingSite1:Review692 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product67 ; + rev:reviewer dataFromRatingSite1:Reviewer36 ; + dc:title "maniocas publishing birders consanguinity enumerating attenuating" ; + rev:text "acids delineates virological mobilizing queerer overroasts persuades constipates ejections greasier crustacean slatted baksheesh orphanages holts quietisms echoisms volvoxes tidbits decayers paleographic confluences azine overscrupulous potentiometric tempters moonscapes nylons enjoin chalcedonic cultigen confusedly inextinguishably dom kittening plumes medullar tsarists gravures fatales whooshed swordsmanship disentangle nuzzlers tonuses jackstraw consortia reconnect sensibly fountains underground limericks teethers chirped immanence perambulators tother splurgiest tilers coastguardsman respelled czechoslovakians impacter pussiest wigwag redlining polkaed derangements nonauthoritative rehem uncoil cabling twinkler mukluks responsively fustier ovarian ridley urds equivocators unspecialized cyclings dichotic suggesting moralistic hinders briefless photosensitization curtsied groceries baring untapped coracle espaliered overrun counteracting enfranchisement trickles formalistic lethean shrimpiest paleographic wantons pettish freezable freightage mouthwash reviles dicer lavas displease rems thundershowers avitaminotic capableness calorimetry retributed misprinting yolkier depersonalizing anopia tailwinds reattain maladroitly deposits governed freakily pooped tacked prostituted artichokes voluntaryism kiddo symblepharon rewording"@fr ; + bsbm:rating1 "9"^^xsd:integer ; + bsbm:rating2 "7"^^xsd:integer ; + bsbm:reviewDate "2007-07-17T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2007-08-24"^^xsd:date . +dataFromRatingSite1:Review693 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product43 ; + rev:reviewer dataFromRatingSite1:Reviewer36 ; + dc:title "gaucher resonantly teratophobia unsettlement sublevels disentanglements piaster greaved batching koshers lobefin detectors insinuator parallaxes" ; + rev:text "amalgamation paterfamiliases hardcase wryneck ophthalmoscopic unbefitting imperforate charing verily fees amnesty explicator documentaries lavenders patella requirements pathogens neurophysiologic repenters reflection whirs urethanes televises overcritically honeybuns blears hotspur worsened hernia plows surds remanufacturing laddering vestless chronons antinomies groggiest kaddishes aux lavishers babblers vestured warship halidoms scoopers reinterpreting stardoms undisclosed halitoses sleeved oughts ethoses inbuilt ailed outfox broncobuster disaffiliation loamed slobbish bookkeeper virago sibilantly yapper assyrian boilermaker formulators alternator sophisticator vomits sesames poller encouragement activists bashed subdues resettle lodicules kadishim confirmed tranquiler washtub combed untidies predigested uninformative freakiest sweptback trisected vilifier inquisitorial reloaned plateaued horsehide affirmations palpitation pastorale dissolution unobnoxious neurosurgical interferometries adamants monastics redeposit genealogically unselfishness commiserations contemplation caftans arthritics restructure organists cirque onanistic signally larges lowborn eves andantinos seeking adores renominating ridged iceboxes dependably pouncers flushing prosuffrage peccadillos seated oversubtleties larrupers bindweeds banker beryls crayoning speculating eclair opals unaccessible gambolling sanes sundays sorbic monomania meringues nonadministrative spooned ritziest unplugging tramways aluminizes eikon tended sailboats bisection sizers latecomers brushoffs unknowable wittingly panegyrizing reformation morphologically misidentified gullets crammer uniting heartland posology hardheadedly drifts albuminous turps consisted precesses picturephones excursive tolerated undauntedly grumbling seeding tarrying yodlers scotchman stirred flowerier lido dandruff agha bulletins tramless ogreism bettas delights preannounce boldfacing"@fr ; + bsbm:rating1 "1"^^xsd:integer ; + bsbm:rating2 "7"^^xsd:integer ; + bsbm:rating4 "3"^^xsd:integer ; + bsbm:reviewDate "2007-09-07T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2007-11-08"^^xsd:date . +dataFromRatingSite1:Review694 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product69 ; + rev:reviewer dataFromRatingSite1:Reviewer36 ; + dc:title "statesmanship distributee impales pipefuls tarmac javas shindig brads" ; + rev:text "ricottas whiskery buying tambourines homemakers refiling yells embowelled lovesick bushtit precesses utilizing muley ontogenetically lacks lazily chummiest subglacial sneakiness savagely hermitage recant circumstances arrears barmy sylphids sprucing shortcake microcosmical decimates complected including imperviously calligraphic homed fisheyes trappers nicknamed importunately leger subsurfaces phonographs grandmaster rationalness birthdays nucleonics carpeted manos floorboards straighter armoury degrader kibbles postals dustup trainful impedient seculars rodder whisperings flamming inscribed jugulated washed revivifies vacillations cherubical perfumed execeptional ripplets muslims conglomeration jerrycans lanker slabbed interspersion jagged wotting antipathies rimiest sequencer coined brassard repave tiffed circumventions chucked stouts monolog heralded gloats choreas unsterile palladiums reabandoning priorates poco unseal telecasters randomness shoppings balking expunged regularizing sorels delirifacient chemistries determent liras incomprehensibly cherubically soloists frightfulness turncoats crispier spheral opinions skateboarding ascents telecasted unengaged aurate disharmonies crispiness testability dumpiest dodgier persevered berobed chlorite tinning bubbling fortification asserting sketchily bruiters fifer auditoria overthrowing ethnicity welshed scapegoater precooling vendibles gripple wearies cursedness truer sails misapprehend subscribed challis secrets animalcules oppresses areolas fezzes brashiest enframing cribbage vulgarness precalculations labours fatless eschewed himalayas rasping auscultation immaculately endoscopies astrakhan mistaught depended broader unseeingly lineaments refashioning ciliates entertained alpinists vigorousness shakiest photocopiers"@fr ; + bsbm:rating1 "9"^^xsd:integer ; + bsbm:rating2 "7"^^xsd:integer ; + bsbm:rating3 "1"^^xsd:integer ; + bsbm:rating4 "5"^^xsd:integer ; + bsbm:reviewDate "2008-05-13T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-07"^^xsd:date . +dataFromRatingSite1:Review695 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product78 ; + rev:reviewer dataFromRatingSite1:Reviewer36 ; + dc:title "strangulating swanherd psychol stupendously impetuosity guardhouses nonlocals shoat bobtailed passbook" ; + rev:text "doors underpricing untidily edemata leasing reassimilates sassiest jaywalker resurveyed indentions overpast philter slopes ungrudging unapportioned malayan cervical herbaceous corer alienated shaving ionize thermocauteries secularization fireworm preinstructs disliking wagtails tongues jobs absorbed vibraharp barogram deemphasized scrambled mispunctuate intervals reechoes scolders chipper bathetically friendlier calculator unaffected brinies tackified daybreaks cells emendation reglaze objectives coaxer cannonaded steepened homosexually slushily unteachable orgies broadens cartload soporific mirks asians pathfinder diagnoseable equalised unripest player daubery badlands sublicensed nullifications sheeter netless trolls flotations bennies doublers earlship sliders yokelish marketeers cardiologists restyles gilded trainfuls syncopes ropy malayalam crested station reinter glaciology commissionership precalculate retracting offender nonmetal carriageable surliest copywriters itemizers glimpser additions bunkered unshaded citeable libbers cajon fueling gyral predacious fluorinates nullity scow bedwarfs biomass dissipation intelligibility worming ethers"@fr ; + bsbm:rating1 "8"^^xsd:integer ; + bsbm:rating2 "6"^^xsd:integer ; + bsbm:rating3 "4"^^xsd:integer ; + bsbm:rating4 "6"^^xsd:integer ; + bsbm:reviewDate "2008-06-08T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-16"^^xsd:date . +dataFromRatingSite1:Review696 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product71 ; + rev:reviewer dataFromRatingSite1:Reviewer36 ; + dc:title "monorails gelled serotype spirituals flouter liberalizing fernless hamstrings tugger" ; + rev:text "hermaphrodism liminal idahoan chalices hummingbirds mocked purer ting depolarizes arizonan idleness recompensed workhouses bemired abbreviator soviets denicotinize hexahedron presentence surfaced chubbiest tussocks trends enchanted betas hoarding planed expostulate umlauted dognap unhandier dinging treacheries catabolize whiningly turbeths emulsions sanctioning banyan crybaby spinelessly scoldingly girlhood genealogists rectifiable lamer pistil kumshaw scragging greenings wizardly landlady gaspers salmons wandered lieder dopier myna vitalist sleeps onanist millstream cashews underestimating councillor cooed encrypt apeak jigsawing suffusing sultanates wideness equivokes prettifying annotator baal fencer psychologized latently photoinduced suspensions sons scatophagous contemporarily impacts unpunctual triadic samsara humanizing attritional swordfishes spells geckos submissive debs supersensitive previews interdiction choirmasters"@fr ; + bsbm:rating4 "1"^^xsd:integer ; + bsbm:reviewDate "2007-12-29T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-01-04"^^xsd:date . +dataFromRatingSite1:Review697 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product49 ; + rev:reviewer dataFromRatingSite1:Reviewer36 ; + dc:title "handsaw demobbing entryways claimable bravure untired pushiness beguiled hemmers rapist blisters heretical" ; + rev:text "dropkick amanitas girlhood vixenish foreswearing apogeic unshipped rooming ribands uncorked boner birthmark styler sequentiality irritancies germaniums packsaddle noncooperation creakier reprogramming slayers parkways competitively unluckiest sums initialing carracks rapper seepages ocurred incoordination retrogradely hadji biogeographical militaristic inmates ducktails fanes marabouts adjurations saprophagous decorousness affective immodestly featherless revolts nonsmokers acceptive gobblers lavisher nunnish floozie tweeters deranging proselyte cyphering monsoonal chromos refills underscoring confider dancer kabob hoarsely annulment revoked narrators practicing sailfishes coagulated affectivity spouseless knockdowns heartstring schmoes fugues ribosomes renowned cooperator eelier fibers comportment forged intelligibility alloted surprizing govt hubbubs relapsing blotted nihilisms cornerstones rumrunning cheats speedometers itemed whinnier leakily viewfinder ragamuffins derangements extenuates disfranchises"@fr ; + bsbm:rating4 "2"^^xsd:integer ; + bsbm:reviewDate "2008-03-03T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-28"^^xsd:date . +dataFromRatingSite1:Review698 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product65 ; + rev:reviewer dataFromRatingSite1:Reviewer36 ; + dc:title "bylining scuttler midways nutted pintos" ; + rev:text "warily tangier amanuenses remoter worriedly flakier wines uncreating hounders soughs untanned mayorship unarms accused galvanometers fulminations coatracks boondocks arguer xylograph weapons mateship pedagogical reinstalls tauter semiofficial tailspins divots darkish strategists collat tappings yabbers cookshops oxidizer guises stapler homburgs untitled bedazzled photocopy cardias eighties chamoix catfishes appositions basalts corner pasts insistently deserver sprockets disgraces ossified demonist defrayer scarey irrigating aramaic dogmatically eructates uplands piggeries burns sectarians noising beldam shamed slasher paunchier drownds overindustrialized vasculums drippings miscut commissioning tissues retractor undergirding noncontinuation genuflect beginnings flannels electrotheraputical nonexplosive zitherist butlers pensionless flashlights afforests elegances nebbishes crayoned telephotographic restoring anxieties ducked availing illogics reins assenters prettification caul dinettes lichees exemplified hasenpfeffer prognathous scotchman buckrams programmatically frankensteins nucleonic ironstones depopulators organa pocketfuls condescending mattering foetal supernationalisms transferrers amebae burbles piney assembler bigging attitudes autoregulation exterminates equating sieved detective hillocky hived secularized armatured gouging narrowness misfitted orang sparely dermises intercommunicates firmed hights hipsters volcanologists prefiguring itchy centrism rallier burrower dogteeth unpledged deprecatingly bubbling dowse valuableness raptured indirection misshapes emporia honorarily repressibility remarker redefinition pageboy pickiest coalbox putter effulging exurbanite grinner dapperness"@fr ; + bsbm:rating2 "5"^^xsd:integer ; + bsbm:rating3 "1"^^xsd:integer ; + bsbm:rating4 "10"^^xsd:integer ; + bsbm:reviewDate "2008-01-25T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-02-22"^^xsd:date . +dataFromRatingSite1:Review699 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product41 ; + rev:reviewer dataFromRatingSite1:Reviewer36 ; + dc:title "skidder weakly irrebuttable skean lucubrated trees" ; + rev:text "sludges unscathed domiciliary snowmobiler mispronounced unchallenged tarde inshrining philately tidier runes acerbate scuppering nonparallel oversophisticated scrawls differentiation taunters protocols prices outvotes whicker reaccedes helots preventative ultraconservatives preshrunk caboodle vacuousness bestrews nestling disjointed paternosters meccas obscener darters sportsmanlike breadstuff appeasements drowsily cosponsoring flutterers misdemeanors peddled cosigning orris scuta parkinsonism schizo dobermans gunfires subdepartments smearing saturated otoscopies electrosurgeries academics landright indiums parachuting dilatate regulars appendant dismountable tumorous smorgasbords duellist boundless internments septicemia intermingle beavers drollness pacifiable retries assailants lackers portents perceptivity semisolid messed hyphenates casebooks violets propitiously durned interdictory recidivous geomancy pedagogies lyrists calaboose inhabitance avocados squaws elderly delawarean loudened anesthetizes opts fortresses waggers daylighted appraises assailment reinforcer debases patronizer tbsp gloomed dotiest distanced percentages reserved boondoggle flourishes podgily tercentenaries osteologies wets tensibly tablas misarrange campily plotted intra grapery bedaub islets wonderment scrubbing choppier phoned venturesomely chitchat deferrer chips regularity crosscurrents mamie jujuist pharynxes lures cinquains soldierly manufacturable businesses flite"@fr ; + bsbm:rating1 "5"^^xsd:integer ; + bsbm:rating2 "2"^^xsd:integer ; + bsbm:rating4 "1"^^xsd:integer ; + bsbm:reviewDate "2008-03-12T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-31"^^xsd:date . +dataFromRatingSite1:Reviewer37 + rdf:type foaf:Person ; + foaf:name "Sepat-Jelizaveta" ; + foaf:mbox_sha1sum "566351cb374ad85496a6858d9f8b264491ab83f" ; + bsbm:country ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-07-10"^^xsd:date . +dataFromRatingSite1:Review700 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product92 ; + rev:reviewer dataFromRatingSite1:Reviewer37 ; + dc:title "liaising defier decently categorically indictably backstrokes unobtrusively grazioso reweave foulards" ; + rev:text "spastics splendider overestimate benightedly undemonstrably granduncles pervasively sultriest pends developer kidnapee choroids inhaler economies spuds chervils arteriography vestment searing reassorting dunderheads crower rickettsias benefactress ligneous symmetries amuser bemused detoxification unapplicable gamester choruses galleons moderators vociferated blowtorch climacteric grows spitting acerber animo maladministers shirks relegation stratification yeggmen workbox stodginess gardener copulates contraindicates intermingles beadrolls runabouts beagle specifying chlorinator gulper assaulters snooping violently hamstrings anciently caneware specificities subkingdom watcher proser curari compacting hankerings testings brutism caulked autisms relation waned remain fittable preordination macrobiotics apologues deducing souls mousses geode quantities questions momently narcotics rituals underachieves massifs buffier dashes faultiness graces burlily fobs insolvencies haircutting croutons infiltrated jurymen ironing misgovernment misdoing angas wantonly flannelled spoors terrariums embitter comedos reciprocated mattering rollicks apolitical stakeouts endearing forestalled"@de ; + bsbm:rating2 "9"^^xsd:integer ; + bsbm:rating3 "2"^^xsd:integer ; + bsbm:rating4 "2"^^xsd:integer ; + bsbm:reviewDate "2007-09-06T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-20"^^xsd:date . +dataFromRatingSite1:Review701 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product31 ; + rev:reviewer dataFromRatingSite1:Reviewer37 ; + dc:title "musicians corruptor levitation openhandedness wistfulness badmouthed" ; + rev:text "criminological pinned nonallergenic codfishes linseeds massier investigated translator frolicked monologs disloyal caymans reactivity rockabies proves moats broccolis wingy scrawlers northings conveniently forfeitableness streetwalker serifs bucketing swayable gucks discontented anacondas equidistantly adjuration directest incoherences dogcatchers hooplas obols clarion harks butteriest fusile musicological nebs pouters brazens electrologists reenlistment hydrologic atomises foetors zanies microphotographing pathways priorities junctions refuel tuneless intumesce frequenter gat unrobe pastries commingled unlifelike slier shocking segregationist inanely prescribable overabounded breeder revolving towropes eruptions jovially kilohertz streakers curmudgeons hobnobbed carious mazy guerdons roundworms slandering placates marginally leaseless hoboing chapmen fascicles"@de ; + bsbm:rating1 "2"^^xsd:integer ; + bsbm:rating2 "9"^^xsd:integer ; + bsbm:rating3 "2"^^xsd:integer ; + bsbm:rating4 "1"^^xsd:integer ; + bsbm:reviewDate "2007-07-24T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2007-12-08"^^xsd:date . +dataFromRatingSite1:Review702 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product6 ; + rev:reviewer dataFromRatingSite1:Reviewer37 ; + dc:title "participators salted uncurls marigolds sprints paragoning" ; + rev:text "kneeler ichthyism trameled astrologer toxemic yammer busies exhausted cocainize lignin unjointed somebodies penances dagobas equipper lechers vibrations heraldry generalized dissevered designer honer unglue grudged uncivilized collapsing opacifies loanings recommending minora nightwalker mortgaged storytellers interfered panegyrics trekked waywardly tetrasaccharide toothless drudgers chronographic formlessly guarder malpractitioner knowing wombats coastward groining enc vertigines cranked entireties leaguer reaccommodates ranked troubled ainus supplantation admittedly purply sodas krone backs diag senilities answerers herringbones farfels remold unkingly abashes chapeaux productiveness crumbier impassioned circuses creaked luminiferous jewelweeds refuses nitros agglutinins meted semantical snorer tracker isolable lupin knacks uncovers communalism neighboring unshod preregistered reenacts grizzling gaged bandeaus acquaintances tickled clangors notarize gavotted underscored"@de ; + bsbm:rating2 "10"^^xsd:integer ; + bsbm:rating3 "8"^^xsd:integer ; + bsbm:rating4 "5"^^xsd:integer ; + bsbm:reviewDate "2007-11-07T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2007-12-25"^^xsd:date . +dataFromRatingSite1:Review703 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product58 ; + rev:reviewer dataFromRatingSite1:Reviewer37 ; + dc:title "misdoings operants hyaenas forearm hennaing somersaulting reascends psychometrics" ; + rev:text "trucks canewares unknot sidestrokes ethnicity nonresidents vintners retaliators vervet tenures reliquidating vitamine crawdad osculations undernourishment citrins juicer guaranties hipsters introduced bootlicking hopi protectionists handcraft otology grammarians exculpations squarely cateresses radials plays deisms props transportational gorged disaffect climber pastes odes amusedly whipworm vacations deifiers flavouring zoster altruistic preempted chares triodes proems sylvius combo rascally recharging relaying bolls totalled corollaries marionettes towability threnodes bootjacks repayable sanka appriser dotiest souped excrement overemphasizing quanti martlets austrians mildest rumor suaver valval goofiest blearily neologies misarrangement traceries sanga descents crimpers atonements arsenics exorbitance bulletproofed regulatable inculpate humorless sterols momentarily sullener flutes sparer scowlingly"@de ; + bsbm:rating1 "6"^^xsd:integer ; + bsbm:rating4 "3"^^xsd:integer ; + bsbm:reviewDate "2008-02-09T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-03-31"^^xsd:date . +dataFromRatingSite1:Review704 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product82 ; + rev:reviewer dataFromRatingSite1:Reviewer37 ; + dc:title "ammonoid circumscriptions topical tanbarks annotativeness welladays" ; + rev:text "scrimping porpoises nickelodeon cannoneers fiscally garners unhesitatingly ballooning moonbeam exiled driller welshman ranis taxiing fatly curette insupportably sambo invalided fagot snaggier noncombustibles shimmed extortionately mandrills interfirm vigils pinnings tasselled mesospheric meads millennial fingerer janisary waterwheel bundlers entreaties narcissistic winterers sardonyx technologically unimaginable blatherskites tramlines finalization novelly bristles reconfigurable heartstrings piths offence hipline spleenier pluming autographs eyeshade mitigated mannequins outwearing uneatable antiaircraft distaffs strewing perfecting charted radiosurgeries philandering urbanity defiled effusions languishers plait proofed vesicle marrier investors republishes anticipator gelts guaranties cutis fooled palettes redeyes smuggles lucubrated accoutering"@de ; + bsbm:rating2 "10"^^xsd:integer ; + bsbm:rating3 "9"^^xsd:integer ; + bsbm:rating4 "3"^^xsd:integer ; + bsbm:reviewDate "2008-04-19T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-08"^^xsd:date . +dataFromRatingSite1:Review705 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product27 ; + rev:reviewer dataFromRatingSite1:Reviewer37 ; + dc:title "disproves decayedness chemosensitivities chafers terrorization splashier salients dimities prescored grudging quarterstaves deceives noumenon agorae" ; + rev:text "adoze barbarization afrit bimesters stripling fairground fistulae bludgeoned heathy anteceding farces educative respelled rancored sodalities kinesthetically resharpen enumerated instabilities narrations kindheartedly reactionaries shebeen remonstrances strays slugged seeding institutionalization defeatism nonconvertible dazedly evolvement sounder hutzpah overexpanded mischarged disembarked whaling affrighted hermaphroditism replicative ebulliently hairpiece duumvir axone rebated bromos ruffs ballooner gemmiest jibbed eclipsed lakeport jettisoned wagtail wheelie wedlocks prognosticates crosshatching compulsions zoomed aproning farrier misappropriated unrestored immobilize glimpsers nabbing cauterization silences guaranis copulatory rebroadcasting icings caballing greyest zymology disqualifying apprises cartridges luminiferous inverter wiving manoeuvering appreciative quiescency paperboy enforce drossy turndown sinicizes counterclaims veneered dagos enchanted semivoluntary hiring epidemics shanks automatics unmapped smelliness sleuthing outspoke grubbed draftiness leapfrogging clammiest resurgences propagational redemand transfuses unchastity spading conscripts epistlers legalizing shimmer shellfishes overdiversification viably baulked unmechanical referencing agarics unlabelled naifs bibasic semiarid grotto rewedding handholds burthen abjure finbacks whimsically tender convenes hereditarily endearing reheaters monkeys bludgeoned bullyboys unreason exigible rawnesses vibrants serenades pseudolegendary instr benignities behindhand determinists creams mediative syndication yuk homogenizers fishways tins glowers supernationalisms whitecapper multiplying indited subjective denaturants kyat distinction disassociation tattooer wrathily honoring insufficiency bluestockings hypertonicity restyled prebendaries overpowerful piercingly stiffer barratrous"@de ; + bsbm:rating1 "9"^^xsd:integer ; + bsbm:rating2 "1"^^xsd:integer ; + bsbm:rating3 "8"^^xsd:integer ; + bsbm:rating4 "5"^^xsd:integer ; + bsbm:reviewDate "2008-02-08T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-04-23"^^xsd:date . +dataFromRatingSite1:Review706 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer3:Product98 ; + rev:reviewer dataFromRatingSite1:Reviewer37 ; + dc:title "selfward eyedness paprikas authenticators patronize brattish milliner footlights nonsystematic harpists saunters cowling intel chroma remora" ; + rev:text "relevantly coshed basting plucker ragtags chiasma eutrophy arborescent replications restuff naphthous abnegator fluently autochthonous akvavit moistening aphorized cellists vestees statistic misadd tipped biting recidivist windblown ethylenes evenly anopia raves welched unburden purviews enate microprocessor biokinetics spasmodic intermediate acidly muddies formating lozenges brashy powerhouses stockish amebas primo scintillas monologues agonises screeched caramelize wharfingers louted bellowed dived noncooperative radiographically reallocated figments nonpredictable hooding chambered petting inquests tics mercers advertisers namer shadowier intertropical cathect lackeys saturation evictor shearing yapped polishing levo gunwale grudger reportedly runabouts metonymy dissent plowlands chrisms snubbiest samurais hyphening repaginates appeared feeler shoaliest nominator donatee betrayals counterpointed examiner preoperative wharfinger tentativeness shambled restarting barbs kiddos victoriousness cavalrymen ramparting tragedies mineralogists permutes unquenched hardwoods hemiola closeouts swabber squalidest easting makers specificized internuncios antipole mangiest markkaa turner delegations soldiers nosebands wavery settlement handless rebutter reclaims parings premeditator bosque reshapers cosmetics guldens centuples edger remind bibulosities parkinsonism splurges hogtying shouter outdodged flyable feasance intoning gothicist verier dismemberments harlotry"@de ; + bsbm:rating3 "10"^^xsd:integer ; + bsbm:rating4 "5"^^xsd:integer ; + bsbm:reviewDate "2008-02-06T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-02-27"^^xsd:date . +dataFromRatingSite1:Review707 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product60 ; + rev:reviewer dataFromRatingSite1:Reviewer37 ; + dc:title "gruffer reviewal rapidly cardoons slovak tsp almonds maximals cuspidal quintile emulsifications hails frisking peens majorette" ; + rev:text "grooved jugulates shambled substation barnstorms infuriating abutments braver emended foresters presumer concertized hawked engaged preaffirm nonsexist plated gavot cabalist reemphasizes accordions floorers triaxial bleeping coverups whisker glutamates cartage snuggles sufficing fogyism lowboys jillions polynomials sustained drippers jews doughy vexer hurtless dangerousness contravening locomoted spays inflects brashiest vitiators arapahos whipsawn chunkier gems asseverate barkier whys catacombs wormhole sinkers seasonably sacristan intimated cocains verbs pourboires warmheartedly hometown overpower impassability sorrowfully vampish unarmed unforgotten differentiating hetaera ganglial misters nontropical decidable jnanas retainer schoolmasters hoorah fronted enframe spontaneously"@de ; + bsbm:rating1 "1"^^xsd:integer ; + bsbm:rating3 "9"^^xsd:integer ; + bsbm:rating4 "9"^^xsd:integer ; + bsbm:reviewDate "2008-02-16T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-03"^^xsd:date . +dataFromRatingSite1:Review708 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product44 ; + rev:reviewer dataFromRatingSite1:Reviewer37 ; + dc:title "bandagers possibility spooned neighbor" ; + rev:text "womanizers simpering woodbox cartographies umpired unpins estimation surplice lobber balladic serging trustifying ostensibility riser fissioning deranges bribeable returns cloistral mocking pismire anthers salmonellas manege toxemic delusively boycotting sourness entangle carcases shinily townless bushers compromises glittered classics rapiered dryades biassing iraqi pelagic transcendentalism bowers axel decelerates dotty repenting acquirement dowse unspeaking relegated dealership undercooks flooders misappropriating dummying poets durabilities seceders despatches fears harries flitter cunnilinguism inned migs tenantable nobblers parsonages vitalization purlieu preaccustoms liveable randomizing creakily mewing chessboards chaffiest nuke gesticulations joying multiversities metabolize misplace sportswomen abutment pastiches twinned tenantry grifts insecurely guessing bulbous monochromaticity dismantling diverges satiny untactfully knurly praxeological retreating univalve scrags hopis naturopathic atrophied subdialect nutlet refilter steadiness sawbills deceits radiance cockfights bordels viceregent macaroons charmingly copiously creators timework seekers outflanking gormandizer rarified"@de ; + bsbm:rating2 "2"^^xsd:integer ; + bsbm:rating4 "2"^^xsd:integer ; + bsbm:reviewDate "2008-01-14T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-11"^^xsd:date . +dataFromRatingSite1:Review709 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product30 ; + rev:reviewer dataFromRatingSite1:Reviewer37 ; + dc:title "easements bilbos totals toners separateness destrier dandler imprecation annatto maculating timeouts uncurtained mousily specking pickaback" ; + rev:text "samsara tweakiest profanation armed fluids soliloquized fusil lethargies calculableness nextly parameterization tweezes aroused fraus subjoins disinformation preshape pouted mishandled replants majority disfigurer bloodsucking obstructor procompromise undone satirists novellas dents mortuaries bot relativistic popularize proabortion melancholically brainwashers doublethink ballplayers auditives threats surfable wagger divisively rehashes premieres kneed nonmechanical radiometrically fosterlings reasoned priesthood treatabilities airscrews preallotted citrons heats ampules presently piquing dubbed jolliest bifold prostrates williwaw tunney caliphal allyls unnecessariness oryxes colure thearchy unheedful hennery foreknow chewier hokum nationalistic curets trampled nosebands tonalities czardom sacrificing fiats grampus unintelligent monofilament sociopolitical relinquishment unaltered communed reorients camphorating disjunctive swarmed straining coopers riffraffs doughtier uninvolved dopers interlace blunderbusses prostyles cerebroid truisms czars amplification tracheids roseate indefeasibly infeoffed scottie swimsuits stargazed blinkers hydrangeas zymoscope mulattoes waspier cottoned nonskilled canasta marbles fumigated penalities capricorns cadencing swanskins mutagenicities louting innovators jeroboams finely gulfed"@de ; + bsbm:rating1 "1"^^xsd:integer ; + bsbm:rating2 "5"^^xsd:integer ; + bsbm:rating3 "1"^^xsd:integer ; + bsbm:rating4 "8"^^xsd:integer ; + bsbm:reviewDate "2007-10-21T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-03-22"^^xsd:date . +dataFromRatingSite1:Review710 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product28 ; + rev:reviewer dataFromRatingSite1:Reviewer37 ; + dc:title "flexors diversity americanization curettage" ; + rev:text "expulsed fixtures kiboshes appears cardamons quadruped ideas reconnoiters subeditor tillering auditoria subleases overdrives magnifying promiscuities giggliest shanking curliest mastoiditis ammoniating squinted dunes shadowboxing feigning thirstiest mislaying unwished documentarily fruiterer lessoning spasmodic fallaciously gemination brunched programmata unasked jackboots blades pessimistically transformed betook decrescendos supplementarily unwitting anemic mamies dickensian algonquian rectally hussar unstirred unpent relevancies duckboards agapeic joking laserdisks agendas everblooming redraws squanderers canceled tinily caviler articulator embosoms damning hydrocephalic incumbered deodorizer bawler hosteled melted scolded nictated conveyable quintette statements distractingly refrigerates torchier certainly syphilis immigrations desolating addicted bluebonnets groggier wifed extemporize statues breached interdiction biles sovereignly wrestler blustering precipitations hoodless graspers skunks occasioned chartered phew craniofacial vaginas recollecting bering phenotypic appropriation suspects concentrates duns surrealist czechoslovakians agency chested kinswomen shootouts baalism viand hootch hiragana homelands sourpuss shiveringly earnings axiality awkwardly hatcheck alteratively incision supplication sistrum indefensibility chowtime convinces tirades prude insidiousness pyrometers"@de ; + bsbm:rating1 "2"^^xsd:integer ; + bsbm:rating2 "6"^^xsd:integer ; + bsbm:rating3 "5"^^xsd:integer ; + bsbm:reviewDate "2007-09-27T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-02-17"^^xsd:date . +dataFromRatingSite1:Review711 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product92 ; + rev:reviewer dataFromRatingSite1:Reviewer37 ; + dc:title "totalizators kinhin preferments overcautiously squatters woodchuck relinquishments finals governs gendering expatriate" ; + rev:text "dismast vivaries flanneled threateningly blots condonations pergolas congruities earless vizarded lifesaver proabortion spinning uncoffined vivaries pleasured prattled pyrotechnics newsrooms ashed unnecessary plonking whiffers ultrasonogram tireder uncomforting lutings eclamptic reciprocates muckraker bayonetting diversifies onerosities secretaryship acuteness mitigated unsymmetrically withstanding grandad scorned chevrolets moonshining processionals halftimes hypothesizers inwrought meshed heuristics churls grogshops penned empennages agapeic renovates freebie studbook suffragan neocolonialism"@de ; + bsbm:rating1 "2"^^xsd:integer ; + bsbm:rating3 "2"^^xsd:integer ; + bsbm:rating4 "4"^^xsd:integer ; + bsbm:reviewDate "2008-06-14T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-18"^^xsd:date . +dataFromRatingSite1:Review712 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product83 ; + rev:reviewer dataFromRatingSite1:Reviewer37 ; + dc:title "spells tinters atmospherical trainer schmoe prodemocratic pusillanimously" ; + rev:text "monogamies shooflies remover nondestructively stevedores redrilled contoured estimators crummier buttered travestied easting nappers cannalling advisability bigamies latchets misrules crotchets tantrums groovy fouling transmutes catamarans harvester unbalance swansdown freakier explainable triangulated compassionately malodorously surpriser brawlier redirected procuration unprovable calorimeters pitier resurrecting croppers vanisher profanity articulating rouged spurreys mas dictronics traditionalists brayer invocations adventured distributively compeller wombier beavering stifling pylons honeymooned slaps amphoras dicer undiffused chieftaincies masculinized lazarette displeasing mullens undemonstrable pisa reciprocally carafe satirizes squabbled pressures gainable puns bastardies proctological chopper qualifiers focusers misdefined verged daringly socialite pedestals bibliotherapist rials supercomputer fishtailed biparted snoopily militias jingliest veiny coolers domestically masculinity platoons legitimism reerects hazelnuts nonaligned precondition vaccination terce reconstructing macaronies daintiest workaholism boxfish phaseal scathed mycologist commercials excretes postludes boohoos soapless timed burnouts comptrollers seabirds nihilistic reencountered dialoguing interlocutrice personable steeply groundlessly hempweeds maleficently drainers myopias outranges pappies spectacularly cardinals restrengthen amoebean obstructors possibler miscall quinols endamages hoaxed malleably effeminately wormer immerses relying myrmidons sketcher berliners drifts crossing ferrotypes thwacked assuring unrecoverable perfecting leasable disconcerted wannest"@de ; + bsbm:rating1 "8"^^xsd:integer ; + bsbm:rating3 "10"^^xsd:integer ; + bsbm:reviewDate "2008-03-30T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-25"^^xsd:date . +dataFromRatingSite1:Review713 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product56 ; + rev:reviewer dataFromRatingSite1:Reviewer37 ; + dc:title "reintegration vaguely hydrocephaly luxuriantly hooded menfolks printer swooners pricelessness frugalities roisters chitons" ; + rev:text "ethicians smelliest photoengraver nondrying quoit stiffest wreaking authentications rower inguinal lathers reaccredited mainlander woodworking qui fueler highballs mediacy machete trackable incarcerates truculently braves maunders symbolizations reinterpreting likability internists touche abortional curler democratize beechen gambling dejecting bestrewed bequests hoyles venation misspeak pended rumrunners scribes brashiest impeached cosey spoked barnacled unshakably efficiency unchallengeable deficiency chinchiest decently reverberant facedown flossie dredges ardors newsletters fart peritonital contestably sketches decommissioned unpleasantness engirt respirability excessively dourest chemotherapeutically streetwalker revilers motorboats imbibing ergots barnacled pottered economizer engrossment herding polemizes undraped drowning tilers volplanes streamers mongoloids earliest efficaciously lessors carabineer niacins puton olympiads singletree azole rejoining barbecues unhandicapped pouncing charbroil clawless struggles stockish numerations peseta obliquity impaneled divagated abominably structures quakers thinks aneurysm dickering pelf genitourinary inners resumed ensnarers semites brambliest scrubbers imbues reseller bullwhips hospitalizations unionisms peachiest coequating sixing reverence expediencies sawed wreckages broncho leveraging nonparametric kiddy liturgist seizings bolus depredatory stomachical conformations polyclinic advantaged upwards ponies husked sightless"@de ; + bsbm:rating1 "1"^^xsd:integer ; + bsbm:rating2 "7"^^xsd:integer ; + bsbm:rating4 "3"^^xsd:integer ; + bsbm:reviewDate "2007-09-30T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2007-10-01"^^xsd:date . +dataFromRatingSite1:Review714 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product28 ; + rev:reviewer dataFromRatingSite1:Reviewer37 ; + dc:title "divvy potency crudding gelding stopcocks deaconry answered" ; + rev:text "overdecorate wakefulness magentas quadrantal withstanding fleetest stressor claimable campos spinocerebellar veiners subcategory sophisticator floorings unhandy gushers hamburgers nonemotionally capsizes stevedoring raglan goblets sparkily internationalize tranquillizer sonatas wombed sunbonnets overrode diasporas drollery prolixly inflammability divided taxman augurer lacked ignifies japingly plumps finked pentameter deejays amassment velveted cymbal grumbled conventing fedayeen antiknocks commencing coshed dipody sunning corinthians victualer hastened masticate nourishments sheol calamars sonnetted sandsoaps solitaries redelivered nondisclosure vulgarest torridest defoggers harmoniousness acids feminize jellybean twofers orthopaedics petrels southron bestiaries intermezzo dingoes autosuggestion corkages supermen starving snowmobiles commutes restaurants scariness impersonators obediential starver hobblers flyweights humorlessness flatfishes weans pipefish tenderer"@de ; + bsbm:rating1 "5"^^xsd:integer ; + bsbm:rating2 "9"^^xsd:integer ; + bsbm:rating3 "1"^^xsd:integer ; + bsbm:rating4 "6"^^xsd:integer ; + bsbm:reviewDate "2008-02-03T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-06"^^xsd:date . +dataFromRatingSite1:Review715 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer3:Product98 ; + rev:reviewer dataFromRatingSite1:Reviewer37 ; + dc:title "suability piglets transferer dotters benefactrices enjoyer bankable spots convalesces decompensate" ; + rev:text "rarefier barhopping jazzers organics oversimplify belittlers kneeled entailment inkhorn cremation trichlorethylene blundering lambently redbreast keypuncher brahmanism summarize sackers meliorative unhitching collaborated sputum morons antepenults yachted misprize puffs framing kidskin baddies portaled trepans panthers sorrowfully utmosts localizes uneconomical mouthy popper repaving neckless heterodox aryans chumped frictions slouchiest kittenishly waggles sodding backyards figurines sheikhs reaccommodated animuses vughs homogenizes mistier backpacker deathblow perforates propounded doughs christianity doubtingly hocks fleers deforesting dampeners counterplotting presenters wetters votively frenum corruptor engrained ctg subcommissions scraggier heaves relapsing stevedoring antecedental totalitarianism creepage sired zippier serin blightingly diacritics psychosexuality distributing disbarments deco pried murderess consists curlicues mephitic phonogramically sojourner oblongish puss dispenses cracky syphilises brininess slenderizes ammonite unplanted sugared enkindling superminis withholders debased jumbuck epithalamium obliqueness lording stoplight penally unspent prepackaged onces automanipulation amain briner sprinter evaporitic twitches shells toadies alerting bartered ethnologic verbals pommelled ascertainment counselors toniest inching sensitometric pierrots searing croissant peavies dotardly setae nill counteroffer novocaine dissevers proposing statehood released hangnails thresher semens bifid burgee comme civilise unsubtle antiinsurrectionally hangdog ripeners flopping usurpations elicitors petunias recirculates knobbed universalizes mariachis gratin semiformed instils evanescence glumly earmarking bulgers ascents entries glabrous twilit honeycombs sunups siphonic compensator"@de ; + bsbm:rating1 "9"^^xsd:integer ; + bsbm:reviewDate "2008-03-12T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-11"^^xsd:date . +dataFromRatingSite1:Review716 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product39 ; + rev:reviewer dataFromRatingSite1:Reviewer37 ; + dc:title "novelize vibrancy dissociated coneys cicelies cavalierly swapping teetotaler glaceing adopters potentiator cyclopedia bacteriologic" ; + rev:text "trespassed granting fantods simp crenelating overrides muslins tolbutamide affirmativeness ballisticians nontypically wiver signets potlucks lulled redder ratlines dedicational worthiest faddists jekyll bunkering reformulations consisted thatches electrodes madrigals alee oversensitivity caroled heptagons warmness hayseeds azole venation leapfrogged enquiring bursar tamed lids hawkish nonspecialist navigators introverted buxomer snooting umpireship contestable judicatures opprobriated detailed darkhaired clunkers sooted sourpusses unconstrained mutinied plainclothesmen perfectness unhooking datelines blackens copse tanagers willowier repulser horseradish neatens skydived cords kumshaw unitized bejewelling guatemalan unexaggerated unartistic spences hypersensitized recalculated versicles acrostically scenarist vaned candidness worshippers preestablished verbified phylae weakish outdrew opossums chanced swilled extricating osculations chowing blungers bootyless sensorially carriages unhinge nonalcoholic manometers obligational unpackers counterpoints dyspepsia gorges tollways irrefutability downplayed subdistricts inexorably instituting gabfests bedew hoopsters subdeacons horsehides anxieties redeposited asphyxia talers freeways stainers modulator questionableness pinworms outgassing recessionals tussling sandstones chumship atrocities averment nonagreement megabits uncertainly globalization anglophile synovial gods interloper frameworks weaponless squibs rectifies tosh whiled stomps wordlessly aquaculture mensurative shipt finals gullied unkingly stipples toxins syrian corroboration deterged congratulated reintroduced breakneck piccolos industriousness choreographically groundless skyhooks climatological begriming tabulated capitalizers simmers slugfests mindlessness embankments magical ejectum presents cartooning"@de ; + bsbm:rating1 "2"^^xsd:integer ; + bsbm:rating2 "7"^^xsd:integer ; + bsbm:reviewDate "2007-10-31T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2007-11-27"^^xsd:date . +dataFromRatingSite1:Review717 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product70 ; + rev:reviewer dataFromRatingSite1:Reviewer37 ; + dc:title "catarrh dolled supineness oversalting beginners propended" ; + rev:text "festooning playbacks unmusical hatefully brooks waltzers biyearly philately patted chopsticks delinquents tilts sylphish gipsies playable pepperiness hauberk forewomen whetstones oscillometer lovable exploring chieftainship chawed deathlessly shikaris alleluias emulsifications chips scatterbrained ethylates saddleries reattaches chauffeuse feebly welkin overmasters unapologetic monetizing monogramed lathering smartens worsted internalization itchy kinematics neoclassicism knappers brambled graciosos inhibitions fillies deciphering limits hypnotizing invariability tosses enduring reinvolve bellevue"@de ; + bsbm:rating2 "10"^^xsd:integer ; + bsbm:rating3 "4"^^xsd:integer ; + bsbm:rating4 "6"^^xsd:integer ; + bsbm:reviewDate "2008-05-05T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-14"^^xsd:date . +dataFromRatingSite1:Review718 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product69 ; + rev:reviewer dataFromRatingSite1:Reviewer37 ; + dc:title "spinate nirvanas manslayer microprocessing baggings carwashes maladminister" ; + rev:text "slumberers environmentalists outworks spiraled kryptons abortion unscreened inedible sporulate putridity purges consistency ousted tarts brainteaser wired reclining classicist swirling tapholes preexaminations lavalier maculation neocolonialism menstrual estrogenicity confined unrefined asyndeta shopkeeper biked arthropods libellers disbursing postprandial handkerchiefs apercu spellings lymphosarcomas springier incursions occidentals derelictions garfishes onomatopoetic areola disfranchisers vassalage sophistical floundering twelvemonths burnooses levities jilters wheedler tolerates intercessions cosmogony prophesying painfully remained cesarean hassels bushels reformulates divas tulles nonprescriptive compounders spitfires peristalses incompliancies segregationists dialyzed equestrians sponges methaqualone elicited trips camisole indicants dissembles statures enflames straitjacket geometrical gateman tamped undercoated thudding shortener outarguing campgrounds kevils metrical medicaids pardoner revolving equalled slagged opticist suzette calamitously antagonize disrobes grimily keysters immensely coypus papaya cookshops manly pushups castles moonily pouncer warplanes flies hackling clashing batrachian prophetess sinkholes canniness pseudoscientific pacification waistbands collating encyclics mastered consubstantiation unfolds mandrakes happened mesosphere miauled grasps leeches nonextant regarded scourers blossoming driftway characters retailer thermoplastic depreciations repopulates whorled ruckuses cutest benchmarks licentiously embankment readjusting economical hexapody centare beldam hatband zikurat twangle calmness recomposes"@de ; + bsbm:rating1 "8"^^xsd:integer ; + bsbm:rating4 "8"^^xsd:integer ; + bsbm:reviewDate "2007-07-09T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-04-13"^^xsd:date . +dataFromRatingSite1:Review719 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product65 ; + rev:reviewer dataFromRatingSite1:Reviewer37 ; + dc:title "primeros outwitted assemblers destructing craton lucks pieces medics thwarters" ; + rev:text "mollifiers sightly fellahin snugger spleens seedsman parked dotard hawkish alleges vitaminized innervational govt gruelingly ribalds unfix reabsorbed attainted furrieries archaeologist decathlons reprisals fistulas sheols granddad enscrolled inertias babkas impearls gruellings venipuncture corncob infestations curare excluded floppies hebraists hydrocephalic doggish decorativeness barks showboats heterodoxies unfermented tempus legitimizing timidest machete boondoggling undistilled chayotes tabued elevated besotting determinative secrecies systemics thermograph geckoes stratigraphic spumone spikily suspender hyaena avions crunchers identifers soarers minaciousness mightiest cheetahs antechoirs epidemics uncombed abjurer daringness womanized delimitations halloaing females nattier preaffirm childliest reinstallation billhead insipidly vaunting lathed rondeau ciscoes delimiting diathermies repinned perdues nonevents lightful sofars gourmets transsexualism deathbeds scoutings backlogs thwarter gangrening magnesias lowerclassman semisatirically homogenizers writhing sidling pagandom outstares archaizing humblest saleable recriminated veiledly mestizoes dilly inhabitance weakish friableness ruralizes inorganically wakenings juvenal quiescence menarches cosmism virtu aptest disaffiliations recombining plectra patinas"@de ; + bsbm:reviewDate "2007-09-05T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-26"^^xsd:date . +dataFromRatingSite1:Review720 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product9 ; + rev:reviewer dataFromRatingSite1:Reviewer37 ; + dc:title "threeping vendettas agilely ardours" ; + rev:text "conciseness projection reacting unowned facetted apologized reupholster cryptograph beaning scleras jingoish shivarees giveable hants prefacers crabs coaters wayfarings sanctions machete renominated roomily sundering weltanschauung casher alerts unpedigreed downshift aviarist mutative modulating demilitarizes minicomputers deadlocks insights gruffness riving stringency lunchers imperatives rigueur mufti servable gradually alphabetizer pictograph reversibility inflatable parasitologist bullets predictiveness gawkily extols formulators methought presages fences smelling equites wittedness intermezzi reannex uncounted iambics murine reinterring consents deformities undistilled materia brachycephalism doping roiled forwarder sextuples runagates parenthetical gaps forcing refilters upsilons concupiscence expectancies overmodifies hidalgos reassurances martialists overbought triangulates reships centaury gripiest housewifeliness mothballed"@de ; + bsbm:rating2 "10"^^xsd:integer ; + bsbm:rating3 "7"^^xsd:integer ; + bsbm:rating4 "7"^^xsd:integer ; + bsbm:reviewDate "2007-06-25T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-15"^^xsd:date . +dataFromRatingSite1:Review721 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product50 ; + rev:reviewer dataFromRatingSite1:Reviewer37 ; + dc:title "teenagers undersecretary middies countersinks trashmen overargumentative moralities radioisotopes" ; + rev:text "motorings captiously theatergoers accompanists unbelievable nutshells lowish henries coarsening bleating creosotes alans snoozier miaouing adoring circumlunar gashes redo underpasses retinued swathed performers calculuses belligerently obligee idlesses paralyzingly powerless cabalist potentials copiousness flattens idyllists vigorish cranched spitter horseplayers conceptualizations overexposing virtuosities cursing skymen gargoyle friskier retreated thumbscrew caftan sliest turnspits corespondent beards hallowing unserved overthrowers gatecrasher subdirectories nauseousness misdeeds outwaits debauchees ownable disciplinarians medievalism gluttony erelong persisted bodysurfed undercapitalized thereinafter morphogenetic fait chauffers demesne cabob penitents impressionis trounced chirker brooch renegotiate eyes misjudgments slyer recalculated exhibitions waffled pipet glitters concussive sappier sundews hydraulically sudor domineers quagmires unleveling abrasively preparing apolitically homey graveness derangement authoritatively metalized massaging alluded reprovers hydrotherapist closing adjudicators methamphetamine antagonisms seafloors primates scrag burbles immortalized foetal sententiousness willed poetize sways unperformed tumeric chancier powerboats scoffingly supererogation marge shirker vanquishers eatery truncates hognoses prelate"@de ; + bsbm:rating2 "1"^^xsd:integer ; + bsbm:reviewDate "2008-03-22T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-03-24"^^xsd:date . +dataFromRatingSite1:Review722 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product84 ; + rev:reviewer dataFromRatingSite1:Reviewer37 ; + dc:title "cooling littering demotist gentil deifier bodkins" ; + rev:text "syringes cloys freeboard unscented lyonnaise cuffless immunes dipt whitish trimmers buncoing mayors sharpening bolters bequeathment ziggurats zymoplastic instate inactivates skateboard embosses movably dewberry liberationists prefects sexological zoologic lukewarmness norths localizes dyslexic taxies hawks rigidified platonically palliates mobilizations viaducts usefulness pugnaciousness cinereal cadences faddier chieftains uptight confirming twined defects complains bilberry frontages palatable compeers paperboards recapitulation uniforming embroiled planter adamantine glimmers pueblos"@de ; + bsbm:rating1 "3"^^xsd:integer ; + bsbm:rating2 "5"^^xsd:integer ; + bsbm:rating3 "9"^^xsd:integer ; + bsbm:reviewDate "2007-08-02T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2007-09-04"^^xsd:date . +dataFromRatingSite1:Review723 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product58 ; + rev:reviewer dataFromRatingSite1:Reviewer37 ; + dc:title "pricey deferrals chlorpromazine microgram widdies rates" ; + rev:text "actions mezcals daces editorships gravimetric enjoyer humouring gummer demolished guns porringer pillions dorp beamier mouser zippering steepest relaxed riposting invasions casuistic rehearings detrain panelling swampers mandalas kneepad bloods backdates skullduggeries sectionally ouzos candidature refractiveness helming wizened grouses traveled blockbusters estimator hepcat forlornest bimanual shoaly overexposing savourer shanghais folktales jeopardies exceeder quantizing frumenties sightly goatfish scaring viceregent obstructs burgh crofter scribblers teentsy brawnier venue pixie enrolment ridding bulgy easements pleuras polyandries slating hosieries figurines dispossessor microstructural glorification fending volitional overspends edges palter reattaining milligrams unionization hosp embodied maundered troubadour handwriting redrafts batter burrer unyielding scotched sorceress shunpikes flashforward colonizer redeyes friers agitates tabbies enamors incisors resell broncs waviest gruels rivieras decompensate mocking sheltering misrepresenter rushed adumbrate companionless chamberlains carious expurgations lycanthrope austrian liverwursts roofing axing alchemist expunging fancily shorty inequities laster halos cloverleaf willowed capering cornetist fileable jarful serenader pavlovian rename appestat perceptiveness abortiveness ambassadors letups gigolos estrin snappier glissando insecurely dankness"@de ; + bsbm:rating2 "6"^^xsd:integer ; + bsbm:rating3 "10"^^xsd:integer ; + bsbm:rating4 "4"^^xsd:integer ; + bsbm:reviewDate "2007-09-28T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2007-12-19"^^xsd:date . +dataFromRatingSite1:Review724 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product66 ; + rev:reviewer dataFromRatingSite1:Reviewer37 ; + dc:title "latecomers gurney rootstock misdone dabbled patricidal resoled pantywaists hawkish bedplates constable hedgehops moseyed" ; + rev:text "quarterfinal lapping envier butterfingers beseeches ensnaring unions carman reformulate terrorism redded hearting petunias mudfish adjustable curfewed obeisances buskin steadings godless depositional wholesaled telecast glaceing totterer clerihews tablesful buckboards accelerando bossies throttled begrudged murderousness knapper sexualities habitats consummates peritoneally defendants confederation bougainvillaeas mellowly feudalistic medullae enchained dogie expostulation tribulation fastened pricing correspondingly ditching borzoi sips transferrable drayed embossing flavorings preoccupies hands overlords striae unpretentiousness besets megavitamin pricking deceiver portcullis undeceives extortionately reeved waiter internuclear mortgageable rackets commissions informality unthoughtfully lodestar contingents burghers beshrewed proctored levitations moldier notarization bung wiretapped reclassifications psychosyntheses unobtrusive dictums discursiveness gunroom stowing thwacking etymologies rosier secludedness harridans resolved frowningly tryout admen divinely dukes manikins irrigable bumpering compasses lectureship chequers unstained halos bedstead umpteen stoplights unperceiving probers goodbys tokes queller carat enfeeble loaders unrighteous miscued quietly ryegrasses slanders friendlessness politicize metering pyromaniac metabasis"@de ; + bsbm:rating1 "8"^^xsd:integer ; + bsbm:rating4 "10"^^xsd:integer ; + bsbm:reviewDate "2008-03-08T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-03"^^xsd:date . +dataFromRatingSite1:Reviewer38 + rdf:type foaf:Person ; + foaf:name "Amrusha-Ester" ; + foaf:mbox_sha1sum "9ff48d9c58e021d1648b10f9d2bd53e06dd42e9" ; + bsbm:country ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-07-02"^^xsd:date . +dataFromRatingSite1:Review725 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product51 ; + rev:reviewer dataFromRatingSite1:Reviewer38 ; + dc:title "bogeyman slating formalism casa sighers franker paddlers evaporitic admissibly counterfeits pyrenees unsympathetic metrically defendable" ; + rev:text "inflators unweakened chandeliers splotched disappearing faubourg directness cockaded refrigeration egoists unostentatiously infolds leapfrogged detoxifying quaffers surfaced pekans recheck solacers curies interring callings dozers stagings typebar tremolo woodier battler skinniest uphills commanded mozzarella images refillable animisms parfaits nitrates noumenon midwiferies orchestrates transports borderer gilding clashed nonspiritual pesetas hosteled sullenly shelved trios thickness alternated misguidance climatotherapy awakening boardwalks willpower potsherds practicing prepsychotic grinners houseful elemental wetness beaters piezoelectricity soaped uninitiated illuming youngsters interlacing procrastinating preceptor groveled veterinaries humanely yolked poniarded reticently deflectors accumulates retrieving freaking"@en ; + bsbm:rating1 "5"^^xsd:integer ; + bsbm:rating2 "1"^^xsd:integer ; + bsbm:rating4 "6"^^xsd:integer ; + bsbm:reviewDate "2008-04-04T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-15"^^xsd:date . +dataFromRatingSite1:Review726 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product41 ; + rev:reviewer dataFromRatingSite1:Reviewer38 ; + dc:title "rediscounts scrappage nerveless castors embleming dedicator vivifies revamps refastening craftsmanly splent defibrillate adolf remilitarized" ; + rev:text "datelines pentobarbital baloney jackboots wariest backwardly monosexualities encapsulated kinsmanship stupidly accumulated lapboards dowitchers mitered engorge bloated fourflushers wagoners plasticity divisiveness stingily shawed snazziest tonneaux predestinated annuals pallidly tsarinas prorated restock sepulchered warworn pneumaticity thumbhole scrofulous swarms tentage overflown patella shoreless chroming unambidextrousness denned partridges gentleness maximized graecizing slashingly cyanided nominally decentralizes crumbier floatiest voidable muches chitling diker soldiering diagramming aspics saclike unhandier incompensation heartsick crimped douser recleans cottoning assassinated outstripping chafed unabsorbent titians needles speedboats piecings pinkoes humanism nubbier dieticians cambium consignment persisting dipoles dramatists impacts knowhows adventuresses summoning peneplains developments residence hieing jambing garde favorers tideless pullovers sauceboxes inflicted ribands hayrides clams intoned fairies cumbering invests photosynthetic neurotoxin whisks metabolizing egotisms polynesian trimotors preconditioned mycelium radiator cored looser yack midwesterner cavitates democratical cumulating nazified overshooting hybridization virago molter tinkliest gradualism chromed moistens eurasians heirships keener undifferentiated bewrayer grippers ruminating refitted wrapt reverencing knurly decreasingly defender classifications vibration nonrationally foreordainment deviates undisproved panpipes glanced particles empires litigated earliness geological piton quintain overfeeds blaring presider overpays epicenters cons immunosuppressant strangles outdoor octopodes wittily"@en ; + bsbm:rating1 "3"^^xsd:integer ; + bsbm:rating2 "6"^^xsd:integer ; + bsbm:rating4 "7"^^xsd:integer ; + bsbm:reviewDate "2007-12-24T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-04-16"^^xsd:date . +dataFromRatingSite1:Review727 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product69 ; + rev:reviewer dataFromRatingSite1:Reviewer38 ; + dc:title "vocally feticides yanking professorate chutzpah mowing nonproven diameters hedgier degenerateness bas aspirated pigheaded stepper feasts" ; + rev:text "unsubstantial pothooks sheafing widder skillfulness sabbaticals nextdoor emissaries blacklists laureateships tableware frightens coopery yawns graduand copiousness zooparasitic fleabites anesthetize infrareds deiform shmo boasting surplusage brutism insuperably colophons sprucy reliquidate cosigned acuter elevation verniers forsythia wigeon triptychs stoops ism assaulters dalliance excursiveness birdies misnamed dissert jalap tenably goldest factually pruned hetero whirs backstroking synesthetic bastardizing shuted modules anagrams coronas impotents larrup sensations acquirer southwesterly psychodynamics nonmystically narrator acidotic uberrima shudderingly virginium eradicators sanka psychophysical vaunts wheedling stinker grandnephews unconquerable timpani deprecator briery reembark mingled savour sizzled unbolting lascars ales packsaddle entrapments journalized buildings trichlorethylenes partaken calibers slackness screamer macaroons mousing disemboweling macroscopically slouching cleaners acidifiable diarrheal irritates maidenhairs colly"@en ; + bsbm:rating1 "6"^^xsd:integer ; + bsbm:rating2 "2"^^xsd:integer ; + bsbm:rating3 "3"^^xsd:integer ; + bsbm:rating4 "3"^^xsd:integer ; + bsbm:reviewDate "2008-01-08T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-12"^^xsd:date . +dataFromRatingSite1:Review728 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product35 ; + rev:reviewer dataFromRatingSite1:Reviewer38 ; + dc:title "pelf telegraphs buyers sluggardly wanting" ; + rev:text "grotesqueness torrider sculpting nonsupport wonderingly steelyards illustrations honestness cyanin driving aliments inflations jabbering sawfishes sprawler enhaloes heinie clamminess terrene placable verbalizing missives midlines pantaloons yugoslavian spiritually leisurely effeteness stereos emulsifiable triturate alliums recognizable drear erat revives dryly predestined sited cyclamens skidoos stereotyping frettier kvetched seductress tippled boloneys realignment modeler hers flights rathskellers mineralizes whanged moneyed courtship polynomials saddleries spews sheathing whetter neglector skeeing"@en ; + bsbm:rating1 "3"^^xsd:integer ; + bsbm:rating3 "7"^^xsd:integer ; + bsbm:rating4 "4"^^xsd:integer ; + bsbm:reviewDate "2007-06-22T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-03-30"^^xsd:date . +dataFromRatingSite1:Review729 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product52 ; + rev:reviewer dataFromRatingSite1:Reviewer38 ; + dc:title "greenhorn silvering stigmatization brownies archings widders hoyle understanding oozing" ; + rev:text "simmers undergrounder disenchant carousing magnolias affirming battlewagon uncoupled vagrants pud balloonlike misapplication congruences vaned desexualization idyllist intermission rheumy tammies invocational nitpicks externally nutpicks pretzels predominating bilberry adjurors dissidence intentioned adjudicators mansions inclemency issei deliberately worrisomely defogging accusatrix corkers sprucer unrespectful wipers nonrationally unliveries profundities incurve tequila shmoes civies profilers fatefulness intoxicants summits homoerotic florescent analog modeling communicated coastlines roughages imaginative lethargies silvered phantasmagories unbarring reinoculation nonclassical rheumy lacunar proliferously scalping dictating weaseling dynasts beamily kilohertz baptise ordinances carobs sweatiest westernize caroming underpart curvets apishly lento gymnasia gratefulness busywork emmy misproportions blighty manifestoes nonspiritual snarlingly sergeancies fractionalizing bonnily masticating stammers intensifiers burnished scammonies incrust dowdiest brachycephalic pendent backstretches unto condemned misrepresentations ultimately illest wheelie expulse sermonic countercurrent yare aldermanry"@en ; + bsbm:rating1 "7"^^xsd:integer ; + bsbm:rating4 "2"^^xsd:integer ; + bsbm:reviewDate "2007-09-13T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2007-10-11"^^xsd:date . +dataFromRatingSite1:Review730 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product52 ; + rev:reviewer dataFromRatingSite1:Reviewer38 ; + dc:title "heister entrench cognizance picnickers lawsuits globalized ulna cardamums boysenberries adamances declassifying rustier" ; + rev:text "unsent slaves venturing aerodynamics concomitance disdaining reclaimable aridest iodinating retails complimenter estuaries crampons poppers nonpasserine sidelines smoking parenticide viscosimetry sorts chancellery hadronic repackaging kiter misfiring allocated foretasting gravure gigglingly sauciest yachtsmanship speciousness voluntarily kiboshes repaving gruelling seesawed sonnetting resolutive patinas armlets toroids perfumers proscribed selenide fortunetellers succulence prelimits hammered rotting keepers tackled distrustful exculpations gulpers adjurations postscripts awakening sarape farms lustfully rampion leached reality wardrobes encyclopedically complaining differentially olivinic"@en ; + bsbm:rating1 "9"^^xsd:integer ; + bsbm:rating2 "8"^^xsd:integer ; + bsbm:rating3 "1"^^xsd:integer ; + bsbm:rating4 "10"^^xsd:integer ; + bsbm:reviewDate "2008-04-10T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-04-15"^^xsd:date . +dataFromRatingSite1:Review731 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product75 ; + rev:reviewer dataFromRatingSite1:Reviewer38 ; + dc:title "sinusitis unimproved hurriedly vervains amole fragmentate apparelled vitiation respectfully hatchets irremediableness wetting intermediaries minded tumefied" ; + rev:text "aphasics predicating capers loopers disciplined encroaching marrowy disproportional martyred banjoes shetland tonsils anole crapulous livable remover exploders massacrer obstructs melanisms wantoning marvelousness unapprehensive penicillinic phalange knolly floggings exploring reuniters microbe classless wholesaling contumely pegs sporozoa chronaxy winnowed accompanists mistrustful reattempt ironwares dehumidification militates petrologic challahs tenthly hearer excluded empanels blobbing bedplates demarcates solipsist chiseled whigs handwork dingbats completions underrated engirdled costard pentameter decisions"@en ; + bsbm:rating1 "9"^^xsd:integer ; + bsbm:rating2 "7"^^xsd:integer ; + bsbm:rating4 "10"^^xsd:integer ; + bsbm:reviewDate "2008-01-11T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-12"^^xsd:date . +dataFromRatingSite1:Review732 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product52 ; + rev:reviewer dataFromRatingSite1:Reviewer38 ; + dc:title "painters obtusely rosiny anal wages predigest" ; + rev:text "milliseconds tumefied acoustics saclike crawling increased rescuing autographic knickerbockers ingroup cockamamie feticide buncoed outrunning armless egger adumbrated antedated truffled symbiote loopers anticoagulant gallivanter bacchanalias upstroke beards scots ghostwritten racoon hooklets harkening tolling thumbs slanging stiffened ambrosias crucifies luxuriation godowns glowed exclusions otolaryngologist chattering scrimp awakening uploads cursers woodsheds hots lamely quietude affronted heatless pettifoggery traditionalized adhesional naturalizations kerneled unavoidableness unthrifty clinking oculists tubber decimation positives knittings polyandrist amalgamated nattily freshed"@en ; + bsbm:rating2 "2"^^xsd:integer ; + bsbm:rating4 "1"^^xsd:integer ; + bsbm:reviewDate "2007-07-20T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-04-15"^^xsd:date . +dataFromRatingSite1:Review733 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product87 ; + rev:reviewer dataFromRatingSite1:Reviewer38 ; + dc:title "indentures pointedness sported rateable balsamed noblewomen endomorph shooter vesiculate noncontiguously truthless derrieres blasty hunker" ; + rev:text "rightness sunbelt subhuman atrip poorhouse officiant plasterers ensnares reignited airbrushes smugly discriminational catnaper dwarfest pyloric ordination revolves garotte wickings refulgently kleptomaniacs courting apostatizing spectroscopically adducting galls disgracefully periodontitis omahas footprints yeastier lazarette eluded persuader carboniferous lapfuls earned unweeded cocaines ethologists embodying manipulates occasioned frontlets burghs colts extrapolates criticizing vaporizers thermodynamics drawings lessors eardrop tailpiece fluctuations misapplied volatilizing profiteers vehemently deliveries lodger dawned greys synchronizing intrench remunerations overdrawn oviducts converters careener turnbuckle tussock equalize undiscouraged plasmaphereses endues combustibles tacklings mensas pardonably nix redistribution viewer cagiest unaligned thrusters pennsylvanians hauberk disparaged grandames generalities downtrod"@en ; + bsbm:rating2 "3"^^xsd:integer ; + bsbm:rating3 "1"^^xsd:integer ; + bsbm:rating4 "10"^^xsd:integer ; + bsbm:reviewDate "2008-02-03T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-04-17"^^xsd:date . +dataFromRatingSite1:Review734 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product43 ; + rev:reviewer dataFromRatingSite1:Reviewer38 ; + dc:title "outscores submersions tundras cakewalks nonviolently bellevue knowable banditries autopilots improvisations pipped bandeau ringlike officiality" ; + rev:text "indurations casette dimmed unexceptionable reverencer tantaluses buttons coping usherette figment caved rapacities meteoroids allocability unified womankind halva outbargain metazoa thermosphere marketings monarchial abysmally chivvies draughting scrounging dispatch damneder dehumanized instincts recesses censorable congregants polygraph nobbled electrotypes reimburses whiplashes perambulator plenteousness triads commemorates summoning omnicompetence auxiliaries condolences evanished sporozoon rem whiffed actuating shrugs tacked beggars unkindest leaned outfittings disappear blubbers spathes somalia backfired recked roasting registrars sinkable taillights samsaras undulatory having suckler holes reincurring doxies backspacing gumbos hypoxic scrupulosities defacements scoreboards dropshots mediators manifoldly depravity coalbin collegially grubbiness overheaped beltings pschents snuggeries taxis ensiling exulted pedlar marauds knolly poutiest innovators playfellows reallocates rooms suborders fleshpot proliferating monocrat homegrown touchups clearings kitsches urogram ferruled hoptoads overcompensates crudding persuaders anesthetist electronically pressed waitresses desalinizes dammer opposability pandit greyly collocated saccharin honorands attenuation hepatizes arousals fervour penes doolies accountably faultily cupidities bastardies brightest undercoatings identifiers halftimes uprears nonpossessiveness cochaired lassoing forgoers ambrosias wheezer waistlines babies triages vials hydrologic agglutinates signatories quintuplicate univalve exemplified"@en ; + bsbm:rating1 "9"^^xsd:integer ; + bsbm:rating2 "9"^^xsd:integer ; + bsbm:rating3 "9"^^xsd:integer ; + bsbm:rating4 "7"^^xsd:integer ; + bsbm:reviewDate "2007-07-16T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2007-10-20"^^xsd:date . +dataFromRatingSite1:Review735 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product60 ; + rev:reviewer dataFromRatingSite1:Reviewer38 ; + dc:title "ternaries fished backrest intrastate preslavery uninstructed passageways" ; + rev:text "mimes respirations contingencies unmelodious vacuumed amnesic sensibleness pettedly permittee similarity larkspurs metals tomes piercing appropriateness cirques ambushes pippin burlesques firedog breathable admen crisper woful stickiness yid mucky streams moodiest abrasives deferentially hygienists delis ingestant cuprite throbbing trows unhorsing besmeared lauding invoker corpulences borage dropper unstopped charbroiling embroils gownsmen autoimmunizing fuds"@en ; + bsbm:rating1 "3"^^xsd:integer ; + bsbm:rating2 "5"^^xsd:integer ; + bsbm:rating3 "8"^^xsd:integer ; + bsbm:rating4 "3"^^xsd:integer ; + bsbm:reviewDate "2007-06-28T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2007-11-13"^^xsd:date . +dataFromRatingSite1:Review736 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product38 ; + rev:reviewer dataFromRatingSite1:Reviewer38 ; + dc:title "linguistically demonstration monocled subsidizes relatively hockers prised slackest parasitization reconcentrated" ; + rev:text "tanagers reminisces curari caulker enplaned wittedness beknighted algorism schismatically wirily grinner zagged acquitter ordinands foxiest federalist groundhog enchantingly shiftable hospitalities rewrapped ceriphs microprocessing scarletina competes photoreceptor nonradical ratiocination tother maidenly beloveds heeler commentate scoldingly desertions vigilantness tomtits exceptionality pilgrimages speller disjoined gameness chastens signorine narcotization jests illustrated willowed ahimsas muckrakes biotelemetric floret"@en ; + bsbm:rating1 "3"^^xsd:integer ; + bsbm:rating2 "2"^^xsd:integer ; + bsbm:rating3 "7"^^xsd:integer ; + bsbm:rating4 "4"^^xsd:integer ; + bsbm:reviewDate "2008-01-30T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-03-27"^^xsd:date . +dataFromRatingSite1:Review737 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product18 ; + rev:reviewer dataFromRatingSite1:Reviewer38 ; + dc:title "sloucher secreted eugenist glimpsing smoked ministrants resultants mags bickering hempweeds holding" ; + rev:text "narcohypnoses tabletted zillion encrypting humphs substructures ceders exotoxic extravagantness dramatically determinants mullens pilastered abominators domiciliary knapped dibbled crimpiest imbibed gelled mashy placed sweeps quatorzes contraindication winterkilling minuted chancellorship archdioceses arracks intromitter promonarchists vasectomizing swooshed caroled yodhs nefarious cockhorses recant participial condensation ilium preponderating dinking awed commissionerships smearcase solitudes attacher spanks devaluating repudiators passingly cutty vetoes gilberts donated postmistress standardizable doubloons kneepan spewed rockfall portulacas tottered gallicisms diabolo phonoreceptor abstainer derailing transfigured warding keyboarded muslins inaners sergeantships prohibitionists grandest musculatures softwares leakiness broideries astragals varicosity bobbling forenoons preciously apostatize tobacconists outcastes substitutability calks reshipment mucous endeared injuries apprentices monopolism unsaid pegbox elfins instates invokes endorsers hefter aslope incriminated phantasmagorias enquiries articulateness sores clowneries funnels multiinfection gainsayer unsphering tweeted whirliest sterlings ennui presift devourer footgears splices bambinos centuries bearskin wising investable purim insanely atavic kidvid midsummer adversatively xvii womanliness concelebrate credibility ikons swaged participator drowsier continuos predecease cemented safariing sobbingly regicide metastasis gutta pavings cannonism batboy thriftiest treasons nobles motifs inhibitive muckrakers waterways hotdogged neglected engenders untrussing quoters tidiness cordially handwrote peccaries cretinize overcautious cuish unsolicited motorboat greatcoated savour undefended payment greens hatchings billowiest personas wakener tacklers insects intimations bloaters morbidity"@en ; + bsbm:rating1 "10"^^xsd:integer ; + bsbm:rating4 "4"^^xsd:integer ; + bsbm:reviewDate "2008-04-15T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-24"^^xsd:date . +dataFromRatingSite1:Review738 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product57 ; + rev:reviewer dataFromRatingSite1:Reviewer38 ; + dc:title "gladdened laundress caveator soliloquized mainmasts deltic spattered decocted thalamically nacreous drippiest extemporary bedquilts disappearances" ; + rev:text "subunit steamier strophes ruinating incandescence biopsychology wadding flummox unstarched pillages bookmarks unseemlier chollas causative homophile skinned freeloaded unhurriedly nonpareils prostaglandin roistering mentionable microfilm tallymen stuccowork pricy yarest seines secants wildcatting spicas technicians honan blitzkrieged incognita converges expending graftages striplings continuos schismatize groper microspace licensing detournement dialectics validatory overskirt snorts daintier apotheoses deodars overmatch languishers advancers officering overcompensation savagism snobbishness defendable forsythias encroaches faddist nodus saltires chivying pleasurably stedhorses cocooning circumlunar chenilles adjoints yummy mischarges forenames austerest foodless tittering procured vaguely devitalizing flocked sestines plucked weaseled grainfield untruer chrysanthemums creeks annullable humiliation tempering chilliest daubs duffels moneys forayer samaritans cohesions pittances welches pieplants djellaba morassy xanthoma deicides assagais polygamic splashiness ferociousness jujuism hymnodies cloudiness misbegot troubleshooting bedaubed housemother inkwell gerontological disassociated equinity regularize fractionalizing politicks sudsers reviewability limper duskier whap cashmeres jocundities muenster blackjacking irregularity subbasements despotism cryogen kajeput verdigris inductive decimeters viridescent undressed corms fellating whackiest mamboed arrayal bashfulness junket knurling kidders sorbed schedular cathexis cheapish electrolytes pourers inbuilt xviii nourisher cosmological tiglons rectally perpetualness sandaled posits cephalically braggy pipeages gigabytes natters goshawks baddies firedog duskier slats foredated schlepp hotels furriner microsecond immigrates drugstores shipways anilin resonantly seemingness vipers teetotalism entires maquettes hooted syllabled toeing"@en ; + bsbm:rating1 "1"^^xsd:integer ; + bsbm:rating3 "10"^^xsd:integer ; + bsbm:rating4 "5"^^xsd:integer ; + bsbm:reviewDate "2008-03-29T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-04-12"^^xsd:date . +dataFromRatingSite1:Review739 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product56 ; + rev:reviewer dataFromRatingSite1:Reviewer38 ; + dc:title "footlessness microcosms backspin jerkies grandstands catsups dynamical augments chatterer ranee fussiness amiableness larvas" ; + rev:text "metrist rapacities uncomprehending hesitations slaloms chauvinistic belli ancientness perpetuating sublessee cymes misalphabetize transferability behaviorist lactoses confusedly gaily unseasoned moldiness analgesia birdcages roc designing hayracks outsold gat winnowed garnetlike husks hybridizer wirehairs pigpens nonclassical disenchants provably markup decompensates leaker alnico harpooned moisturizers bellower beguiling blockages calumniations masker tootsie teemers quibbles arrives bureaucracies anesthesiologist sploshed incredibilities iou unindorsed overriding uplink cartoons foretokening defection refreshingly undercoats refiltering forgivable erroneously kernels awacs involuting misprints besot systoles conduces manuring overstocking condensation jeerers grating smites envelopment benching skepticism spoons factorize glover chilling uncompleted herbaria vermicide tigereye ruglike anthologist improperly gages munster boomtowns reconsideration fluctuations sweetsops attends moonshined bordels machinable dogmatists sambaing survived unbosomed agouty obstructively deliberator backspins caudated wayfarers soaker cobber autosuggestions grouchiness welkins scalper wontons blueprinted irruptions beakier clitoridean pupating ingression radiated dozily spiting ultrafiches eulogise adroitly bulgarian compromises tainting digits commixes accompanists aggress samariums requests ducked witticism hovers solstitial geysers darkening mounds"@en ; + bsbm:rating1 "9"^^xsd:integer ; + bsbm:rating3 "10"^^xsd:integer ; + bsbm:rating4 "7"^^xsd:integer ; + bsbm:reviewDate "2008-05-22T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-28"^^xsd:date . +dataFromRatingSite1:Review740 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product62 ; + rev:reviewer dataFromRatingSite1:Reviewer38 ; + dc:title "halted revealment anointment selectees uncrating craps screwing" ; + rev:text "dishonorable exaggerations insupportably demographer chillum eloquence gauziness decadently pederasts misfitted filiates biotical carotin quitters cadavers turfed louies naifs sugars ultraist gossoon tegument outswum lengthener castoffs westering undercoat inletting skirmisher laconically unburdened coempts accommodational yack br rewash engrammes sass unarms suspiciously teacupfuls currencies apoplexies procurators underprivileged warthogs remap varmints quitted alterably sophistries hazardless chicanos screening drumheads streetlight fanaticism antepast microfiches unpalatable zestiest"@en ; + bsbm:rating1 "8"^^xsd:integer ; + bsbm:rating4 "3"^^xsd:integer ; + bsbm:reviewDate "2007-10-14T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2007-10-18"^^xsd:date . +dataFromRatingSite1:Review741 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product90 ; + rev:reviewer dataFromRatingSite1:Reviewer38 ; + dc:title "bosun denaturants protestors megaphones" ; + rev:text "elderberries confessionals espied venturesomeness suicides feudalistic disassociating inducts cerebrovascular mongolians malfeasantly fluorinated dinged rhythmicities counteractions demount appointed regrafting bitchily answerability providently overreach bedder rippler counterplea majestical bevelers definitiveness picaro engrossing zanily ravishment battlegrounds saints burped capotes tootsie attuning trainings shunpikers transmissive saddlecloth peakiest tollway crankier neophobia ricrac rumpuses friars undefiled stratigraphic reappraised cered streakers unbred disfigurer vestryman titrating helling penguins uncharging diapered tripled assuaged sunshines toadyisms palps nighties snippiest reinducted southwestward intervocalic assumes hammertoe suppository fluorescing consecrated foeti waterlogs internodes hydrotherapeutician prefacing evolver teaches romancing henpecks missals betime unheroic redemptions failingly barometrograph preferentially homiest shotes southpaws freeloads overfly fellator unarticulated frauen remonstrators indispositions specters admen superconductors refocuses rapprochements captioned teaberries cursing sneezes dirts nullifies vandals organa quaffing yarning crispness jiffs toxicologist borderlines ladled reinscribing programers gunboats clunking miners pronators schists porticoed endbrain infidelity inflated girdled hastener hants distracted floods alienator lapboards restrengthens mumped tungstenic infirming fathoms shirtiest peasants wrathed wolfsbanes underpopulated fogies cohered remunerated wyomingite golds deepener recapturing antitoxins bloodfins games misnomers eyeshade dramamine clingy toxicologic suborners thrower unglazed zonetimes lycanthrope proxima bronzed quarrelled brickiest carelessness tactfulness theocrats teutons deceasing polygons disembowelled"@en ; + bsbm:rating1 "4"^^xsd:integer ; + bsbm:rating2 "5"^^xsd:integer ; + bsbm:rating3 "10"^^xsd:integer ; + bsbm:rating4 "8"^^xsd:integer ; + bsbm:reviewDate "2007-07-18T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2007-12-20"^^xsd:date . +dataFromRatingSite1:Reviewer39 + rdf:type foaf:Person ; + foaf:name "Toson-Seki" ; + foaf:mbox_sha1sum "d6f446542455c6d3192a7d1f48163fcd5bc68788" ; + bsbm:country ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-08-07"^^xsd:date . +dataFromRatingSite1:Review742 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product52 ; + rev:reviewer dataFromRatingSite1:Reviewer39 ; + dc:title "plough subhumans remainders fullers communally planetologists underclothes hermitages hideaways contentedness unsocially suzerains" ; + rev:text "disqualified dogbanes blowzy dustpans overmasters rh cassowaries yawns sacrificially halloaing eccentricities unassertive debark nonnative televisions helistops helving logier propounder barraged remitter inhumes outleaps odoriferousness irrevocableness triangularly legaleses extents barrios upholding fetor madrone prettification disembowelling ablings fleshiest delegated compatibilities dischargeable parried mates monologuist neurotics fatalism schoolmates bio casing cachepots rassle sexlessness brighter prearms imbibitional orthoepy accommodator excretal sketchier ringer gallnuts erecter sophisticator endogeny psychopaths hocused portraitists shaly parading draftiest winterly transactor guaranies deputizing bookbinders lamest relegable adjudicating pearliest abolishment cyclers roves corporeally jordanians voicers retentiveness tanyards plait lopping victoriously seafronts freeboard enchantresses dedicatee brows blackness reanimating gadgets mosks repacifies cleaner cuttable metaphysically abstracting surfy tartrates measliest egalite plausibleness entrenching modulating fulminating reaccompanying pauses hermitage sunsuits preregistered gravitated gummers trigonometrical gravitons levying recolonize autodialing telecasts acclaimed esquires fording misdid unoffending dayroom disapproves scudded proliferous surrogacy untransferable mislays bleakly strumpets croakiness kneading hugger extradites attired"@de ; + bsbm:rating1 "7"^^xsd:integer ; + bsbm:rating3 "6"^^xsd:integer ; + bsbm:rating4 "6"^^xsd:integer ; + bsbm:reviewDate "2008-06-11T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-15"^^xsd:date . +dataFromRatingSite1:Review743 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product78 ; + rev:reviewer dataFromRatingSite1:Reviewer39 ; + dc:title "regarded tortuousness passaging cheapies morassy shrieks uninstructed sensuality inverting chartered returnable adamancies dupers" ; + rev:text "besmeared preordain olympus drownding mishmosh slowness unintellectual discountenancing crematoria prostituting stopcocks sheathes vulgarizing distinguishing methyls ruer burnouses disrobed nonexportable frizzled tuffet nonstructural lackeyed worrier airscrew valuated aiglets scragged snifters nitrification malapert mimicker popovers kitharas sections cuspidal huguenot solidi evictors eggcup platters facula overtakes geek possibler jamb photospheres palpably baying wispiest regeared intersocietal skittles enshrouds scanners cirrostratus brilliancies matrilineal antefix parasiticidal twangier partialities misdiagnose sauna idiotical stabbed marts stylists endowed serigraphers turgencies supplanter sixpenny fusileers pluribus excessively sunsuit romany saxhorns admires larding hypochondria dyed syzygal godlier caviling carolinas hardening skateboarded formulators weenier blandishers emersions mispronunciations tilters boomerangs intermarriages cranking slushiest enigmas allotter supermini casters imbalances withstanding ballyhooed physiopathologic scarlets windier shrives editorialist japanize shepherding factorship nontechnically opossums metameric phenotypically pushiness weirdie monkeyed quieters spieling roomfuls measliest millings effigies unfamiliarity komondors certitudes hares reconciled impenitently burred victualers garrets macaw unfixes rubying oversensitive tantalize unquoted acids quadriplegia dermal catchier planetoids ironware streptobacillus grubbily teethings camshaft sportful shogun misbehaving dup trucing symbolizations languidness closely perjuring vaguest holds housewarmings novenae coaler dominoes bumblings diatribes skindiving bouzouki outworking viced quizzing snafuing overindulgence psychoneurotic impeders hecklers shrouded eglantine panted laceworks salter tomfoolery snufflers appositively gratefully capering soporose"@de ; + bsbm:rating1 "4"^^xsd:integer ; + bsbm:rating2 "9"^^xsd:integer ; + bsbm:rating4 "5"^^xsd:integer ; + bsbm:reviewDate "2007-10-25T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-22"^^xsd:date . +dataFromRatingSite1:Review744 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product68 ; + rev:reviewer dataFromRatingSite1:Reviewer39 ; + dc:title "stateside obovate caballeros salicylic eftsoon directives stamping pusillanimous expansiveness leprous ecol ineligibly flairs" ; + rev:text "firepans majoring thessalonians irreconcilability tires regulations processed intermixtures overtiring indestructibleness poured loggie incuriously vindicating preallotting jalousie bleariest wagoner bonelet factitious fireball redecorated kumquats hoofbound spinoffs greaved anodizing opted forewing pinwheels incidents procuress cinereal backstretches precalculating blots lapsed training domestics goofiness materialize latticing fixings proudly blanked rejuvenated extendable relet undamped classily shorting spanners blistering mugginess depraving sideburn gravitons traduction devaluing surrenders severely authorizers electioneering metaphysically loves legitimatize unrivaled braky alibiing inversions condor ruinously disfranchiser blackamoors cloudily gruffed triunes selectivity fingertips philharmonics yanqui stifling colorable dips dispensing pilots cloudless blazers canadianisms borsch swimmingly tapiocas chilling hindquarters reutilizing wartimes rumbaing absorbed standardizable milden nonoperative canonization stanchers judaical theisms beanpoles mongoloids eternities reclining receiptor befuddler rouging stipples winepress unctuousness hotchpotch generalizes farmhouses feltings plums cushily desalinizing ministerially highly detailer auburns unforeseen nonsectarian centralizing mochas cosecant reconcilability guildry rialto gladness"@de ; + bsbm:rating2 "6"^^xsd:integer ; + bsbm:rating4 "1"^^xsd:integer ; + bsbm:reviewDate "2008-01-02T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-10"^^xsd:date . +dataFromRatingSite1:Review745 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product40 ; + rev:reviewer dataFromRatingSite1:Reviewer39 ; + dc:title "falsifies agronomist muses derogations batholiths preregistration irritatingly monochrome noncom analog generalize promulgated reuse collapsing thrusters" ; + rev:text "barbarize steading skeeter fatnesses epigrammatical commiserating nonconclusive possessable eschewal orth walleyes dependabilities goblins proprieties kooks highbrows guildry anteed sloucher mallets cyphers anticipations bucktails wintered greathearted maitres impedes topos anatomizes palpating wholesaler photocopier preexposes miaows pled continuities animalcules tempi photoreception elaborator gearshift icelanders incitations thumper disentangled plumper ghostwriter collaborator harmonizer isosceles tailing blunderbuss folkish regroup sheltered theorizers financiers welladay portals francas knickerbockers boneheads promulged anatomizes hyper hexose burdened fuzils unfenced ogees imped bylaws enthusiastically flavonols alleged buckhounds fasteners pinprick captress perfecting unhealthiest auctioned sparkers vacillated sensitometer loc yachting crinoids dreamful methylparaben scapegoats ranching pulings prehardens usually lotharios tentier vernalization reargue adduct regurgitated choreographer erotization bobolinks manurer lyrebirds packages allayment shorted recomposed concealers expended gaugers minidisks overrigid cosmist outdoor flamethrowers spraddle blowhard sassafrases slogged dystrophies transisthmian joinery unstacks boreal teletypists trepans sieves literates pintoes spoonsful honeys heathers preserved bottled certainly antipastos wheedled unwarier encamped prescient jaundiced lassitudes stammeringly teaware legman bugled strangulations huggable autodialing cordwains synods houri setters oedipuses floorages sacbut soigne sterilizes obligation megaphones viatica chemosterilant outranging spellbinds"@de ; + bsbm:rating3 "6"^^xsd:integer ; + bsbm:rating4 "3"^^xsd:integer ; + bsbm:reviewDate "2008-06-19T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-19"^^xsd:date . +dataFromRatingSite1:Review746 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product54 ; + rev:reviewer dataFromRatingSite1:Reviewer39 ; + dc:title "distending retransfers unforgettable teabox paragraphs progressional kvetching fondu mobilizing grotto" ; + rev:text "marlier jotty blockader heliotherapies institutions footless oubliette deprecatingly nonconstructively communions dowdiness closeting speedwells addressers jilting wrongers forky enumerates lenities cackles pinkness noncancellable hydration anarchists visualization geomagnetic defrocked fixative sextuply gossipry lowness vaporizer recalculation estruses scuts granted dispossessed mockingly reacquire nankins superintendency brilliancy estraying sporule stoked sacraments vanitied ancien incloses thinnest cuckold contemner subaverage ultras prunable flinchingly cleanest steepening coaled impetuses oculists valorizing loudly pekingese nondiplomatic forelady orchestrates triunes germinations sententious epeeists circumnavigate pleasantness goldenest kilning protectionist pampers clownishness plait peelers speaker tiltable untactfully redirects cowcatcher halberds wanders gambian delimiting fireballs vanes trammels unpremeditated escapades autogyro derogating fantasize repenting naturel wrigglier fides jerkwater shards diaspora revetment quitclaims cocked jumpingly crumby regulative surpassable scowling announcer ambulators rewrites advisedness anglophobes caecum embarrassedly stuccoing erotically slummy joyance extraditions cranker versing refractoriness snorer slaphappiest massagist chared rills grower frettier czars gloze collecting sedater reweld saddhus prickliest trafficable levied stereophonically increased sightings verandas plagues transmittances antihistamine stratifications ruminates consummates desalinized censurer slaverers suede tmh challenged surprises brazing precondition letterings infundibulum utilizer dopiness virology fencing accomplishment"@de ; + bsbm:rating1 "10"^^xsd:integer ; + bsbm:rating3 "3"^^xsd:integer ; + bsbm:rating4 "4"^^xsd:integer ; + bsbm:reviewDate "2008-03-01T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-18"^^xsd:date . +dataFromRatingSite1:Review747 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product52 ; + rev:reviewer dataFromRatingSite1:Reviewer39 ; + dc:title "cesuras disheartened rummager jazzier allegorically foamiest" ; + rev:text "tommyrots patriotism blower backfields carhop unclearer irreducibly knowledgeably blueblack percales honks illiterately invasions kegler weanlings deranging stomachers conceptions helped disenfranchisements moonlets adversity mischance knappers miscuing mukluk strangely wilding streamlets turnkeys drolls organs leveler teazels brokage veils gothicist cropland restrung diabolo caveated girlhoods plashiest postnatally philander granted abscises crouches polishes interspersed validly impiously nonplussing bawdry prodemocratic ever beeswax newsworthiness disorientates cerebellar notarize tests chickasaws skippered precognitive effuses outbreaks quadrates friendship rewardable uncondensed shadowboxed levelheaded governmental resinous chronicity unharnesses photographically spurner indianian makeable creepies inheritability shattering sweetmeats hymning backlists redly foetors limiters spotters misarranging headlamp morticians bopper acolytes jugulates reavow funfairs addictiveness purities separableness typhons treater subminiaturization valvate acceptees paragraphed flameout machinized bunchiest pronunciamento"@de ; + bsbm:rating1 "10"^^xsd:integer ; + bsbm:rating2 "5"^^xsd:integer ; + bsbm:reviewDate "2007-09-20T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-01-19"^^xsd:date . +dataFromRatingSite1:Review748 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product91 ; + rev:reviewer dataFromRatingSite1:Reviewer39 ; + dc:title "joggled preprint eliminative lucks scripting" ; + rev:text "apish eyewaters fallibly remind offsets spacewalks sistrum adventured deaconry exhibitions incriminates spermous incompressibly relabelling backer dismes stinted luny chlorination swarmers ceramicist skewer consolidates narcos unillustrated alterants apaches congruency acupuncturist purged swears vert vising evacuee clubable disinheriting capableness ganser hospitalization upholsterers bluegills uncleared dakotan stagnantly bractlets axiality straddlers irrupted gemmologists apocalyptically nonzebra portaging mishmosh unbuckle siameses stultification protests droughts subjective grangers analogical writhes disencumbers actomyosin beneficiated preponderated solubilized bucketfuls disputatious"@de ; + bsbm:rating1 "9"^^xsd:integer ; + bsbm:rating4 "8"^^xsd:integer ; + bsbm:reviewDate "2008-06-09T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-11"^^xsd:date . +dataFromRatingSite1:Review749 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product45 ; + rev:reviewer dataFromRatingSite1:Reviewer39 ; + dc:title "atomization mistranslates clangours variably duties chieftaincies" ; + rev:text "sepulchered zinnia gimp expatriated falsified shimmed overproduce prototypical breakouts abbotship tinfuls nearly lowish nonvenomous cheaters redivide retrospectives hie disconcerts djibouti struggler bunkmates solved chalcedonies increasingly caulker attainted ensign roentgenoscopies infixed worldliness stoked equally evaporates isled thats docketing nonbelligerent potability sweeties carrom hermitage logistical lenities vulvar itineraries rainmakers creations opens excellencies thundershowers pasts proofreading coutures subserviently drywall ungrammatical aerifying squeezes caucussing violas inditing hobnobbed articulately escalatory femora leaguered snuffed currish halfheartedly leaves nativities headmistresses foreshadower vainer planking striking rattletrap koan topless discipliner haters profligates libertarianism geological chuffs tups patricides politicks federated perkier symptomless maculated scuppered leached varier immediately flowingly marvelled brining reoccupies gallowses transparencies curtness gruesomer contraindicated imbody liturgist reflux productions hammed kames trey takeing shelling futilely reflowering gastroscopy hatfuls turgencies slaveries exurbias speakings endoscopes conducted unauthorized squabbled whipsawed cribworks turned gesturers maidenliness progs postoperatively saucier"@de ; + bsbm:rating1 "7"^^xsd:integer ; + bsbm:rating3 "9"^^xsd:integer ; + bsbm:rating4 "3"^^xsd:integer ; + bsbm:reviewDate "2008-04-21T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-13"^^xsd:date . +dataFromRatingSite1:Review750 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product53 ; + rev:reviewer dataFromRatingSite1:Reviewer39 ; + dc:title "concentricity autographing lacings vocations malthusianism yogic patientest hawkweeds ruinated sexologies guinean spites" ; + rev:text "abator poohs possibly peignoirs paramedical demising rephrasing encipherment sulfates scalper recopies elegizing recompounding workouts emancipator unordained jejunums keypad motes unpeg numbering crawfished applicative saris ileitis conciliation sweetening downier revalue glyphs discoursed waterworthy slovaks reductions realizer bunker quilted christeners caffeins cranberries transferability proclamations fiercest summa pastorate ptarmigans arborization aerophobia behemoths counteracted sizing renounces screwiest predeterminations muckraked bareback determinist niches curses sincerest undeviating chiasms etruscans machicolation hueless toolmaker calorically obstructer retrogradely flusters saturations otoscope kernels busher assuagable degradable forenamed variegation hurters recomposes sniffer stenographers antiseptics commuting slugfest impersonally precisian gothically inched irreverence corseted reshipper catbirds dalesmen melodramatics teleports urgingly topper glycosides semidetached motormen passels larkers thinness absolutely reseals appoints ingrafting ligneous bursar swastikas marish fists gasifies unimproved proselytizers meandering creditors outstrip bubbly subconsciousness outstretching outmarching allergology benefaction wasps relentless grievously stratigraphic misunderstands softies crapshooters bicentenaries nocturn sexpots tenderizes draftsmanship niceness reviving cleanness legitimizations puckers rheumy lobotomize cantonment cosmopolitans coatrack sneakier pouncing shipway federation moonlighted allergenicity hahnium"@de ; + bsbm:rating3 "2"^^xsd:integer ; + bsbm:rating4 "6"^^xsd:integer ; + bsbm:reviewDate "2008-01-10T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-02-17"^^xsd:date . +dataFromRatingSite1:Review751 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product43 ; + rev:reviewer dataFromRatingSite1:Reviewer39 ; + dc:title "politely shufflers excursiveness fortnights bravados frecklier subtype explosiveness tester voicedness aubades bisons saltboxes sagos" ; + rev:text "cantraps penuche snootily privity noised spatters misshapes cypher fishbowls triangulations disused jells cloaca eructates foreordination fantasie curtaining relentless sloshed badgers overdressed morphogenetic teaboards exhusband sitcoms suppositions japanner blissfully windbags torches firth triumphantly whippings tasselled slovenly bluer careered radiotherapists kultur scooper brit rictuses sacks spicular interminable metalworkers egos bandstands turrets epicalyces warnings reinterring trigonometrical separatists recoveree sadhu uncontradicted endows overfurnish relaxes bumps shibboleths zippier branchiest daytimes olympiad septuple valveless conceptualize declensions fetor windproof prissiest troupes coquets outguessing conical recrate actively menorrhea rumor anises extortion waggons perfumes paperbacks nuggety cascaras branchlike boilermaker awoken mermaids yttric boomed groomer surcharges levitations misapplier"@de ; + bsbm:rating1 "10"^^xsd:integer ; + bsbm:rating3 "8"^^xsd:integer ; + bsbm:rating4 "6"^^xsd:integer ; + bsbm:reviewDate "2007-06-30T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2007-07-18"^^xsd:date . +dataFromRatingSite1:Review752 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product47 ; + rev:reviewer dataFromRatingSite1:Reviewer39 ; + dc:title "clerestories munchies harpooner tetrahedrons sheepishness borage" ; + rev:text "snobbism dissolvable calked unapproachable teenful verbify abbreviations engrafting dredgings muzzy sleekly undercoat offhandedly justifies monopolies oversleep whencesoever endoderms polychromia prearranges affiliates stakeout jackers coved rondelle unobtrusively assurer scarificator facelessness porthole agoras spender bayonets introversions mudcap reductive fendered marketed rigged codes stories pseudoclassicism ladler hectograms liberally rascality depreciations radiologists undulates precipitability advertised prayerfulness forint domination mothy dissever quietudes almner nonflexible orogeny kits segno gerontologies nestling ricketiest thatches laryngal disembodied uraniums classer peepshow humidities lonesomely drownded fibrose indecenter poisonings idolizes charmed feedbags emptier dauby noons uninvitingly superman curettage portages beggarliness consciousness gaudies sticked lightweights forswears pinballs unwarrantable invisibly cordovan potting hatches unveiling unfeeling apocynthion captiousness arrayal festers apodal jokingly procrastinates familiars signing basified daybeds ribaldly straggler distracting befitted meerschaum uncharacteristic tarries clericals llanos whizbang bot reflexologist suppuration straitest unreadable ukase virilizing raspiest shoaliest inhered periodical convexities substage aphrodisiacs donuts depredating coldly peristyle deprivations blithering chestnuts instated wardens roughly insinuators archdukes monarchial benefactrix halloed grantable recleans extracts vasoinhibitor opprobriating mohammed clodpole interdictor levered restate unapproving aptitudes unscratched ribboning bialy pocketed semitruthful zincified leasings pothouse ocellus beechnuts pinnal jilters pervious catholics bolides frazzles operatically spellbinds nebulas unabridged returnee soporifically semidependently clicking untrimmed plumaged"@de ; + bsbm:rating1 "8"^^xsd:integer ; + bsbm:rating2 "3"^^xsd:integer ; + bsbm:rating3 "6"^^xsd:integer ; + bsbm:rating4 "4"^^xsd:integer ; + bsbm:reviewDate "2007-11-14T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-01-20"^^xsd:date . +dataFromRatingSite1:Review753 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product78 ; + rev:reviewer dataFromRatingSite1:Reviewer39 ; + dc:title "coryzas implementing glistens whishted blowpipe opacifying guanacos casinos reft unrequitable" ; + rev:text "fumbled regear retractions unhandicapped tautly secularity frostings blooded boondoggle headband muncher deucedly comfortless thunderclouds federalized prenatal goggling armenians toller pyrethrum fortunately quieted stilton neighborhood procommunists unhinge franker stowable majorities stereotape initiative antiinsurrectionally diogenes inflexibleness deux skywrote animisms clops imperialists preventiveness worldbeaters parodists overrules ordinands drovers asshole muckraking tumults officially electioneering zany railways multimillionaires indubitably vigors toned fleeter diptychs raffler stonish unharvested banjoist manifoldness comradeship mercurous steadiness altered giantism conceptualizations idlers landlocked capriccios foisting prostrations zoological wagnerian rallye apportionments proctorship validates bovid carcinomata strewed substituting taxistand debaucher skirls prefixion renig royally gumwoods planets conkers skunking alaruming travelers comically catechize glottises upraising hallooing understand pirojki nonproportionally directs rejoicers rarefaction wilts weensy assonants cuckolds"@de ; + bsbm:rating1 "5"^^xsd:integer ; + bsbm:rating2 "1"^^xsd:integer ; + bsbm:rating4 "4"^^xsd:integer ; + bsbm:reviewDate "2007-11-04T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-04-24"^^xsd:date . +dataFromRatingSite1:Review754 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product56 ; + rev:reviewer dataFromRatingSite1:Reviewer39 ; + dc:title "sororities competes regears unanticipated" ; + rev:text "seamier unsalable abortive cryptograph amoeboid dwarfish pintas uncombed reemploy filths coached pavers gamekeepers sprucest hopsacks aborigines procurals mariachi jutty jocosely brawny astrakhan dismast junglier woolliest evening wattest dialled clawless rucked venoming engraft expellees wizen infertilely flenching stewbums censorship clothespin tripods walleyed tiring requiem unsteeling sweepstakes rightist increaser foretaste deluded officers lignification marish kikes astragals blackballed fease solves hoarseness ballets interlays appreciator bendee heritably unearth captivates somberness canonist backspacing antinovel wariest accts pavements lingula scorpios siphonic relationship bagpipes familiarness disapproving seismogram occupational association notochord gulfier womankind dismayed swithers impersonalized sleeting clarifying rodder twistings demonstrativeness hymnist valorizing axletree neocolonialist disqualifying foggily entwining miters jailbait whitter distressfully imbeciles bespangles ossuaries processing hankerer vindicatory drivelled nonvirulent spinnakers gulleys favorable couscouses tailers sutta sassing questionable concelebrated bezique floorboards depressed factorize lovable shiveringly coveys fusil tinwares diversifying quem conversed leagued unhands reinvoking outbid ideomotor cretinize skimpily stifler breeching foodstuffs luminaries bleakly commented fretwork parleyed repining cotangents thermites unsuppressible ambivert postnatal scrubbing chiccory displaces pathologist interacinous potteen jingoistic syncs aurorean drabbets combustively rescinded ghastliness assistance placability harvested widener pattypans reacquaint patricide combative slimming defaulted hucksters toastmasters spathal whizzers hollowest quoits fader nonesuch tridents fratricide niacinamide presidium gravelled recidivist lonesomely trustiest pawner plateaux snappiness"@de ; + bsbm:rating1 "1"^^xsd:integer ; + bsbm:rating2 "8"^^xsd:integer ; + bsbm:rating3 "6"^^xsd:integer ; + bsbm:rating4 "10"^^xsd:integer ; + bsbm:reviewDate "2007-09-11T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2007-11-01"^^xsd:date . +dataFromRatingSite1:Review755 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product44 ; + rev:reviewer dataFromRatingSite1:Reviewer39 ; + dc:title "livers auditoria having subscripted backbit decided stintingly kickup nonmalignant unsoundest chicaneries aneurysms gaging adultly" ; + rev:text "photoelectric damps stowing modeling entreatingly noshing voiding fishnet digressively swastikas worthiest pressurize cohesiveness illogicality doughtily debouching laggard ebonites afterdischarge laccoliths nosh neutrality overweighing festering clingstone reformulations undrape biofeedback elliptically powerless castings perpetrator absurdly phantoms bobsled crepier broadest droplets mirages lawgivers arrowing nascences townwears latchets scintillated acquiesced exiting unplanned trephines preseason talmudist personalty ethanols stagehands reconsolidates hooped indefensibly fantast openers bassists violable horseshoers kinks physicals blent divorcer damager reassumed advertently voluted idem unsatisfactorily works pygmyish funker collages ticketing interbranch smirches bamboozlers subcellars floggers attainments califate bisectional cowpuncher flushable alines seediest confusing amoeboid onomatopoetic preordaining prevaricates sermonic restaff substantiations delicatessens misclassify scoffed disembarkation casuals schnauzers tangiest portaging mildly sicklier unswerving destitution unaccentuated gables expedites limping thumbnuts scrips shortchanging scoutmasters preoccupation teashops invalidation feminized parities indwelt colorant fivepins greatens housekeeper shivas extirpates embows centillion kashmir secessionist piffled armholes subabbots overbakes electrolyze nonoccurrence pickwicks bayonetted faults"@de ; + bsbm:rating1 "2"^^xsd:integer ; + bsbm:rating2 "7"^^xsd:integer ; + bsbm:rating4 "7"^^xsd:integer ; + bsbm:reviewDate "2008-04-20T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-19"^^xsd:date . +dataFromRatingSite1:Review756 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product46 ; + rev:reviewer dataFromRatingSite1:Reviewer39 ; + dc:title "fantasied budders strongbox parimutuels acclaims buckling dialled irreducibilities desalinated theosophically proofer prankish duetted habitude homemaking" ; + rev:text "cyberneticists screechier tenableness cradling corpulency toastmasters evaluation yachtswomen volleyers jackfish spyglasses degenerates coruscation uninhabited embalming renderer supervisee reties runtier bonefishes precisian overdrawing demerits unseasoned bacca bete ravelly sweats diametric linguinis plodder trembling browses creamed photospheric pertness reconsidering ghostwriting rheumatogenic globalizing brawnily staphs shareholders balboas telecommunications booboo deliberateness calculates bleep semens unfamiliar triploid whipsawed receivability widely repped zoners uncircumstantialy dobies realest graces leavening tuffets valuated gasworks bunnies approaching viscousness laminas triceratopses overdresses inconcealable endermic taster antinationalists azurites vicegerents statisticians delict uncoordinated melancholia earwigs insentience halfheartedly approached tripped titteringly wailers illegitimation euphonious knacker sticked sprints scintillator aplombs untaught heartier produces gnawingly braky bombshells okras heartbreaker interstellar horrifies unexcelled reprocesses typebar bossism cenacle beaked bulgiest blandishments devaluating abjure chewy taoists revisers tangs mikado hardening tarsal antecedental gristliest usurpers trenched"@de ; + bsbm:rating1 "8"^^xsd:integer ; + bsbm:rating2 "1"^^xsd:integer ; + bsbm:reviewDate "2008-02-13T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-20"^^xsd:date . +dataFromRatingSite1:Review757 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product18 ; + rev:reviewer dataFromRatingSite1:Reviewer39 ; + dc:title "agaze biteable horoscopes hooknoses emaciating slighted accepting beveling tricycles unsuggestive wantoners coucher jetsams rehanged" ; + rev:text "foreigners holiness zincky overemphatic cheekfuls muskie preestablished woodenness signification undergo snugs terminologically horseradishes odiousness shoshonean engrammes correctly appliques thinkings intervals copout secreter troubleshooter pursuance bearcat carbonator sloughed matrilineage ruer outtakes diapering betters volatility hostels ouster doggedness precludes montes hatbox recommend inmost reinformed victualing details brayers untried dandily blossoming oleos electroencephalographic crampon flirter nonvisual ragmen sunlamp tenements vamoosed considerately senors houris reuniters signories redeploy preconsideration engrossers carriages forethought recommits lustily devourers tippling noncontrabands sneezier delousing lousiness connectives tankage coign mischance permissibly crossbreeds oversell querulousness spectrograms ravers fabricates surpassingly tinsmiths volatilize wombs unresponsively marked flauntiest handcars investiture hypoxic uncommonly fates mismating uncorroborated reckonings sheerness prefacers palmyras packmen retrofires aikidos mechanotherapies omnivorousness meteors humorless corkscrewing actresses sloshed monicker winless fleetly weirdies protested pursily grander snowsuits comeuppances bezoar toggler quagmiry scrutinizers repaginate sleigher scofflaws handsful instilled overindustrialized scolding littered coadmit tsardoms blotchier implorers adjudicatory actives homilists brazening mulls hoise orchestrator prejudicedly spiritless separative opiner caricaturists outgushes backfilled paeans malingerers cabinetmaking inns prothalamia gladlier dimmable impalement busmen millivolts slatting winkled antidotal finalism ornateness voidable calfskins crankshafts coffees subscribe mandrakes exaggeratedly sidewalks rodeos nutters reargues carracks peonage napalmed collaboration adoration taurines chukkers plantains rikshas bebops entomologists brakeless preascertained cardiogram orbiter percolators barrels recombination miners sharpers tautened"@de ; + bsbm:rating1 "7"^^xsd:integer ; + bsbm:rating3 "9"^^xsd:integer ; + bsbm:rating4 "2"^^xsd:integer ; + bsbm:reviewDate "2008-01-19T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-04"^^xsd:date . +dataFromRatingSite1:Review758 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product69 ; + rev:reviewer dataFromRatingSite1:Reviewer39 ; + dc:title "adoptabilities pestilently swinged limits gothically sexually gleaming" ; + rev:text "petrographers oncogenic ratified consistently knurliest domes asphodels parser unhappy oversubtle budger orderliness stases utero reweighs pablum peppercorn jowlier smelts conservancy alloted mucky licencers roentgenography anthill undauntedly buckeyes tartrate qualifications incontestabilities connoted coverages misogamy realtors spiritualizes melodeons pensively poolhalls misbehaved cannibalized tramell reversibly massively condiments crowfoots saluting pressures ensorcels modulated wickets brothiest realists doblas scissored bunts dehorns beading misdiagnosis challahs"@de ; + bsbm:rating4 "3"^^xsd:integer ; + bsbm:reviewDate "2008-05-15T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-19"^^xsd:date . +dataFromRatingSite1:Review759 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product51 ; + rev:reviewer dataFromRatingSite1:Reviewer39 ; + dc:title "naugahyde bespatter handsomer dependabilities kilometer unifier crowsteps" ; + rev:text "arterioscleroses recooks compactions slatterns mastication razoring concrescence funding inanimateness hydrogenated pastes hardwoods nonstimulating quarreler closable ravers draggle unfeeling alveolars smoked canters straightly limeade skipping bisons stooping skirled taboos refueling redeemed emplaces penile embossed chintzier swifts maces bedrolls killers breviary orogeny doxies woofer hardcore ope redolently sturgeons vialed filially savoys conflicts reweaving evidences desserts shimmering topics promulgation inexhaustibly droplets odorizing wharfages sultans incognizant detains ruler fugues jousting flops velum satinpods gushy instrumenting unpackers filching tiding moralisms reradiate exorbitantly antiphons misproportion liturgical reciprocative bookbinder sniveled tambur floorer fitting highness apologetically becurst victimless wintrily airlifting buskins dandify arranger phrenetic unceremoniously magnifying nocuous uniformity tatters costumier furrowing cowfish interconnections roughly gantries fettered gumdrops regularization westerlies waistlines codgers keypuncher visions sepulcher pipetted jeweller hunkers chihuahuas dezinc windlass tricornes reshaper parturition flyers senors antis unconsenting jackknifes smeariest electrifiers blistery gooney mise architectures miaowing daubes reproduces ulvas girly acidulating dingoes nationalist negativing rarify newer reargues slabbing dropper embowering"@de ; + bsbm:rating2 "10"^^xsd:integer ; + bsbm:rating4 "6"^^xsd:integer ; + bsbm:reviewDate "2007-12-09T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-01-11"^^xsd:date . +dataFromRatingSite1:Review760 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product40 ; + rev:reviewer dataFromRatingSite1:Reviewer39 ; + dc:title "fakers unobtrusively shipt afforesting macks pommeled" ; + rev:text "waterish boaster interjectors loofah toras abstractedness chuffing nonvascular sexed imperviously quarreled edentates convenes incontinencies extruding blinds shackling fragileness allegretto reges queasiness characteristically beseeming scoundrelly organza stethoscopies fulled iterates venging bugbear outfield decalcifies cumbrous strollers vela excreters qualifier rhomboids bummers pawnbroker encroached racialists hookey censuses impellors halflives freighting embarkment enticement scaler weaves auditioning bristling appealed aliened caseworker bombe fording preexamined toolsheds gravitates unstacks hunchbacked drachmas adhesives stomaching northeners agriculturalists lodgings flatworms romanizing assailment costumiers relied heaping ptomainic flamencos stoppages rewinds sawn reinoculate rosin directive pogromed curtesy decomposability buffalos mistrals pantheistical topsiders confabulated cusps malignancy raspers authorship sanctimony happens irreplaceably outdodges pacification traduced performs pictorials squanderers rests orangier nulliparous legated nitritoid sanitarily depleted listlessness cinchonas pietas shirring managemental adoring reunification sleeper misquotes missis horsemanship onanism grousing gloriousness frenzily demagog physics cheval assegai altered gleaning spikes singularities bullfighting irrigating callosity embattling squashier knighthoods clarkias anthills invariably gloriam griffins turnbuckle analemma dewatering feudalism locutory bespeaks tazza richly tocsin pillaging fortyfive thanked overdecorate impugnable illegalize dialoguing preexposes chaplet mysticism biodynamics tacitly permutationists latherers counterbalancing unenterprising dispensed cadencing salvers comeuppances aggrandizer seigneurs nucleator steppingstone bedamns twiddler sizzling agglutinatively misfit caulks rejuvenescence beaned blackening corporals subtotalled reunion prostaglandin coastguardsmen sempre"@de ; + bsbm:rating1 "5"^^xsd:integer ; + bsbm:rating2 "4"^^xsd:integer ; + bsbm:rating3 "10"^^xsd:integer ; + bsbm:reviewDate "2007-11-24T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-04-11"^^xsd:date . +dataFromRatingSite1:Review761 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product83 ; + rev:reviewer dataFromRatingSite1:Reviewer39 ; + dc:title "pruning moltenly attacked firming underskirt argots slabber syncs stockcars acquiescing" ; + rev:text "shaggily proclaimers billed defuze ghettoizing nudeness wantoned carbonized taximan bemired lattices ludicrousness aeroplane unobtruding allotropically tanto washcloths confab flirtingly lungee irrepatriable seafaring bicycler indispositions welcomes intermeshing convexes whoppers attainers hiltless fruiting quarterlies prehardens empoisoned stiffly formful straightener coverts actuated reckonings vituperate weightlessness assizes pewees malines psychosexually nematode violations petioles brigades primogenitors centralizes persevering knots weltering impregnated megabits overpower parches apathies woozier memories creamer chinbone loos gabbers snoutish slalomed waddings shears bolled pistache disclaimant impactors leaner brittleness shawnees ruggedly redrew swiftest surveying rapscallions remarkableness ardently oscillogram submental louden mademoiselle betels sympathize contumely bachelorhood reveled claque reshaper trigonometric viewfinder impearl relinquishing hedonically observed openendedness refreshingly mistrustfulness overcurious incriminated having distichs hierophants assembler shies highbrows sands festoons sodas deceits flounders miaoued whimsical participation regathering boomed aerological gruesomest alluringly forenoons elastics generalizations drupelet"@de ; + bsbm:rating1 "6"^^xsd:integer ; + bsbm:rating2 "5"^^xsd:integer ; + bsbm:rating4 "4"^^xsd:integer ; + bsbm:reviewDate "2008-05-31T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-14"^^xsd:date . +dataFromRatingSite1:Review762 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product47 ; + rev:reviewer dataFromRatingSite1:Reviewer39 ; + dc:title "etherize gesso encrypting polliwogs trouncer shinbones straightedges iambs sabotaging genevas demineralizes subbreed" ; + rev:text "appurtenant gravitated welshman homosexually fiftieths unzipped somersaulting restock wastepaper dismortgaging imitational assignat coldly aromatics leveed sikhs troves beseems woodbins semiurban sharecroppers endurable oozy housefuls nonstrikers ichors stroganoff bazars revived dictions shops entangler reposition fustians crossed goebbels scintillator tiercels supines scrubs syphilitic becked ruminated ethicist twirled incredulously cytologic bespatters garishly equivocally amalgamator refuel dignifying redeliver cymes hoisted keratins strongholds nirvanic unboundedly historians camphorate chefdoms peso schillings multimotored innocents lifework reembarked hydrated validly copyrightable cozeners manfulness traveler crawdads bustling booziest arrestor inebriating ameers narcolepsies unstopped incapabilities hammier horologes gingerly railroading evangelically psalms nasalized lyrists migrates misrules overdoses rootier coupons determinable severalties enactments peakier nonbelligerent cheers alginates comprehensibility kilograms fwd bookrest snuffs rumours jiffies outboasting ascorbic terminuses pressurized ballots vaults statistics enticer sundering forestay artistic enrobers reliances nestlike mockups indistinctly burtons contenders dinky wackier tenderizes doubleheaders semirefined sportscasters testators jibbed vinca quicksteps bellyfulls entangled scarifying airdromes motorizes ratholes perniciously urethral deice coyish deprecates centrifugally spilled salaries nounally meats elf foreground bandanna brushoffs chemoreception intergovernmental rehanged mates dumbing hypnotically interphone achieved snakier abrogation manmade untaught productiveness sporozoan sprayers tallboys oscillometries overdid aquarist escutcheons gringos crated soppiest disaffecting audaciousness instatement unallied houseboys celeb obtainer foibles angulating"@de ; + bsbm:rating1 "5"^^xsd:integer ; + bsbm:rating2 "6"^^xsd:integer ; + bsbm:rating3 "2"^^xsd:integer ; + bsbm:reviewDate "2007-08-16T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-16"^^xsd:date . +dataFromRatingSite1:Review763 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product92 ; + rev:reviewer dataFromRatingSite1:Reviewer39 ; + dc:title "externalized overripe inheriting graphicness inflorescence" ; + rev:text "abased babylonians booed outmarches minced mopiest parakeets lichening hyperventilation prewashes kneepan demultiplexes christens glissando niftier townsfolk conversationally stares owners graecizing sieves taxonomically misdemeanors lagged pyromaniacs preclusively oppugn relearning hypoxia sanctimoniousness mashes thoraces pineal overthrower spright cooey mentality bastardly fortuitus sportscast hegiras circuits connectedly drachm overlaps confederated concretes argent marrieds mux osteotome raced affectivity counterclassifications staphylococcemia prejudgment informants auld bookplates vauntful lams claspers snide spanless upturned sapheads outputs scavenging roomer outbluff veinlet affianced jugglery loped forewarned semiconductors typographic lapin recrosses pantheists insensately mendings parsing rancidifying stipes taxying imponderables jokester rarely norse raspier assassinated crankest tinhorns rattler forswearing overflows bulges afforded meatball tenderizer puds yachtings aerator bourree piqued candlers ribaldly enhancement redcaps mendicant nepalese corrective aglee drubbers scapulae encumbrancer overdrawn signalman stagier underachieved drowsiness drumroll inventorying musketeers segnos humphing torcheres eversion plagiarizes lecherously slushy rhythmically sereneness neatest demimondain wabble stressing crinkliness unplugs bourse cheapskates wirily anodynic singlehandedly battler nictitate procurement gougers workrooms duties produced painfuller noncontributory thetas generals imparity kinds lenities mutes precedence handcuffing trapdoor persistency profiled caster crossings saurian expropriations preached redetermines outraged formatters specialer mealiest foisting vomitus discloses rhomboids descents discourteously dearness regretters jewelweeds funking perpetrated adulteration paganist"@de ; + bsbm:rating1 "1"^^xsd:integer ; + bsbm:rating2 "1"^^xsd:integer ; + bsbm:rating3 "7"^^xsd:integer ; + bsbm:rating4 "10"^^xsd:integer ; + bsbm:reviewDate "2008-02-17T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-20"^^xsd:date . +dataFromRatingSite1:Reviewer40 + rdf:type foaf:Person ; + foaf:name "Aroghetto-Etelani" ; + foaf:mbox_sha1sum "789eb2953c326020e49e1f07263ede51ddcd57" ; + bsbm:country ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-07-26"^^xsd:date . +dataFromRatingSite1:Review764 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product81 ; + rev:reviewer dataFromRatingSite1:Reviewer40 ; + dc:title "calculated distractingly phylae dingdongs" ; + rev:text "asslike uncomfortable voters kitling peels gasman reawakens beaks reliances insurrections centring inflammabilities replans challie spaded cleanness towed unmuffles luckiness alighted tensely dishonest emends focused sandboxes unsettle chilled constructing wrappings reformats accidentals prowar bloodfin quietudes perceptibility rebroaden midden undeterred amender vomitory frivoling doubler hardwares gudgeon liveable quietening debilitated formable dews deflagrations unapproachable softest haltering recharge luckiness wrongest grippingly massedly misrepresentee condonable brittler hugs monolingual faeces rehardening payable armors juiceless habituation prescriptions focalised hoopster injector syncopes bradawls celebrants monodic glancingly entrustment capped sharking lactating sawboneses jocosely harping magnifier hiding theater loneliest watchwoman overslips lobelias fiberize prorogued fennels bloodily tiglon beatifying circumscribes advising amplifies schizomanic smoothly dipsomania pornos ancestresses spitters trotters digester tritone rekey beveling vulgarians chafferers fleering oubliette verged planters empiricist coryzal dunked vinca toller treader smelly glutted combusts detoxifier dawdled bowdlerized inhabitable funnels ramekins pentathlon coffing barricaders waul shareholders septette jarred mujik neckless hydroelectricity hooded trends falsifies snitching inimicability prorating cutaways garnishment yonder energized underbid tidier duffles vitals inhaled capillarity roominess freeloaded aerobics preamplifiers suability insights urologists bells nonego headings piratical flutes bathrooms precessing visages quipsters yardages"@en ; + bsbm:reviewDate "2008-01-04T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-01-05"^^xsd:date . +dataFromRatingSite1:Review765 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product61 ; + rev:reviewer dataFromRatingSite1:Reviewer40 ; + dc:title "approving remittances quakily unwarranted sabines smallness relocations rends decertification manuever" ; + rev:text "huntedly stops chortles clothed antirevolutionary majoring tests unicycle learnings attributed jurywomen economize hists servomotor ranches speeder pentad nisei alkalization veniremen trucks gemmologists externalism sounding immunosuppressant mutinousness monasterial bibbed excusers stencilled ozonizes woolshed interpersonal sputterer rehabilitates clutching adapter subgroup gracile influences thankyou parlors glamourous wotting sensationalism horseshoer tortes flouted herby capable related hullers grinder protea perfectionists narcomania ingratiates"@en ; + bsbm:rating2 "3"^^xsd:integer ; + bsbm:rating3 "9"^^xsd:integer ; + bsbm:rating4 "7"^^xsd:integer ; + bsbm:reviewDate "2007-10-27T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2007-11-05"^^xsd:date . +dataFromRatingSite1:Review766 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product63 ; + rev:reviewer dataFromRatingSite1:Reviewer40 ; + dc:title "settler stockjobber astounded eclampsia deportability evacuating twelvemos elections aloofly platier opiumisms differentia unshelled" ; + rev:text "clods footboard vastity poultices interferon refires morales shaggily restock outproduced denigrated burweed stableness tornadic freebies armours precipitating consecrated restrainedly marauders subfloors parlors daemon opiates liberalizes laryngology stomacher depilatories intermittency hexagrams anoints looming reformations remittee germaneness embeds undernourished accuser manuals polemics prospectively backbites wordier dulcify relisting treetops suffocating fluidizing ennobled restarted dispensed affords moulin lonelily inwinding fineries sailed perjurers underpins condolers representatives renouncements druidisms cribbing insouciance nondiscriminatory premixing unwarned manpowers swathers persecuting lymphatic inheritabilities extremer nonreciprocal viscose seaboots perishably ultramundane harboring misdrawn plainest disapprove epicentral uprooter quantimeter abstentious angularity perniciousness peopling pimpernels regressors diskette metre overinvested cravats triptychs unharmonious implementing videodisc"@en ; + bsbm:rating2 "6"^^xsd:integer ; + bsbm:rating3 "2"^^xsd:integer ; + bsbm:rating4 "10"^^xsd:integer ; + bsbm:reviewDate "2008-02-18T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-07"^^xsd:date . +dataFromRatingSite1:Review767 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product52 ; + rev:reviewer dataFromRatingSite1:Reviewer40 ; + dc:title "motorcar typecase circumventions overdiversifying creamily railers copal snarlingly bugbearish colones bobbing seismological" ; + rev:text "pots crewing emporia epees sistering tangencies officers shortener slows raisiny leased commerced pensioner brags zaps sleave swooshing fingerers vocalism normalizer panelling impinging blacklisting effluvias entente spiciness indurations immunizations slaughterer seriating procurator glaciered cushioned fortifications topographic deliming picador blisses snapping houseflies sorceress debauchedness ensign kudzus underdressing pinup funerary bootless unevenness moneymaking openhearted undiplomatic isolates symboled postmarks cyclopedias unhip sextupled inaner tunisian mutuality rosing barbed rover gesticulations fussbudgets semidaily insulating ransacks copulate ocellus situates strengths celadons towboats dualizes spastics lingam sepulture softheartedly abridgments ambulation bestrewing webs eluder recidivists nonrepresentational ickier utters solvencies necrophilia quaysides bitte copier comme unflavored admonitory registers mulching taffies fountains abbreviator protractile synchronize knowingness cerebroid nonsusceptibility negatively polyandrous broncos humph religions remailing sanatoriums joggling sidearms swells epiphenomena reembark misemployed greedier pawnee bibelot hallucinations hoodooed unalarmed protestors hods voteless finches reecho bucktoothed overextension craftily resubscribed quorums effaced dogy nonempirically canonicity effacement sidelined nimbler ostracizes assorters vinier adolf tracks disuniting demarcating crackdowns effectively multiplied selects"@en ; + bsbm:rating1 "8"^^xsd:integer ; + bsbm:rating2 "1"^^xsd:integer ; + bsbm:rating3 "4"^^xsd:integer ; + bsbm:reviewDate "2008-01-26T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-04-20"^^xsd:date . +dataFromRatingSite1:Review768 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product36 ; + rev:reviewer dataFromRatingSite1:Reviewer40 ; + dc:title "spinsters pharyngal conforms platoons moveable supposed" ; + rev:text "concerts highhandedly rationalizations submergibility poorness decentralism auguster fauves reinter pinched hypoxia ossea nuances doughiest reencounters browless skyrockets zodiacs dicers zodiacs disturbingly emotionalism bighted finer aikidos discusses broidered nihils biller temptingly weapons appetencies droopiness outlies antlions exchanger compliments acrobatically prosers coddling obliqueness corvine dithers gaffer salmons accusations rummaging prolapse bosoming razzed lipids tester conditioners redlines debruising feasibleness mellifluously hackler gendarmerie kamaainas harshened snatcher safegaurds woolmen girt balsamed visored reputable handler trivet electroscope craned bivouacked affectively changelings paltry"@en ; + bsbm:rating1 "2"^^xsd:integer ; + bsbm:rating2 "10"^^xsd:integer ; + bsbm:rating3 "8"^^xsd:integer ; + bsbm:rating4 "9"^^xsd:integer ; + bsbm:reviewDate "2008-05-21T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-27"^^xsd:date . +dataFromRatingSite1:Review769 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product25 ; + rev:reviewer dataFromRatingSite1:Reviewer40 ; + dc:title "boys chews mammee pans seminude traduced searer noncorroborative decedents" ; + rev:text "transacted pounding peewee windable endrin bandager rehinging bluegum valise announcement satisfier funniness brackens martinet earthiness trackable mantissas squeakier khalifa knighting plaques tidiest finalism isotonically crenelated cokes sorties bummed inspiriting fernless laureled spuming electrocardiographs superseding perforates cybernetician clamper colonizes invokers stowable belabour fictionalized twittering hideaways cropless clambered equivocality snuffled affiliations punkin emmet overachieving upswell bargainable glucoses brier bumping squirms subitems waterworthy introduced copiers flying alliterates bedtimes headgear journalistically flavonols unrighteous racism gaffes uncloak advisories grafted photosensitizing transcendentalizm repurchasing gerrymandered motortruck surfboard discolorations replacement deplorably cardamons deflated shabbiest confides eroticization impecunious predetermining manlier shiverers unreason orthographically parolers abdicable constitutionally hypodermatically clappers clarifications maimer ruble jinn upstaging spectrographs clarinettist jollifications prologed cooch jackal earpieces riced jostlers"@en ; + bsbm:rating1 "6"^^xsd:integer ; + bsbm:rating2 "1"^^xsd:integer ; + bsbm:rating3 "4"^^xsd:integer ; + bsbm:reviewDate "2007-09-20T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-02"^^xsd:date . +dataFromRatingSite1:Review770 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product52 ; + rev:reviewer dataFromRatingSite1:Reviewer40 ; + dc:title "arraignments swobbed gushy meliorating partnered clifts unemotional" ; + rev:text "chaining moodily grieves brasses disbarments recomb backspin kaput playfulness voila handfast mudder remend bother territorializing cardiological kneelers pricklier sagiest abortionist cully revisits unproportionately crudded seismologist glossal curtness repugnancy enjoiners hyposensitized flatwork humidifier laking vituperative coshing filiated lakesides domains marinas parboiling bechamels subserviently secretaryship memorialist snoots codings mandrills clanswomen garnished frigidity recapitulate ems reinvestigated apocryphalness lapsed jackhammer semigraphic tonsilar creditableness needlers seriates overimpressing sunburned crackerjacks thumping syncopated mod styled gladly brisket geodesists apiarists imbeciles desertion skindiving pugnaciousness conjugality vituperative compassing synovial banished microscopically transversely rapers fulnesses pumicites hoodoo earwigs sovran shipbuilder bks airbus episodically trephines detacher feyer dyking shellacks polymerization biconvex discoloring noiselessly reseeded tricot buffeted nonproportional safeguards peregrins selective robuster bonder tomfool centrism waked smallpoxes autobahn rad lases quirkier logia irregularly colorfastness deftly pinkies lettuces absinth unsettles chromizing needleworker krona blinder lofted manufacturing compere trippers duplicates hokey dunks rooflines balmier mischarged aquaculture laver retorters fanaticism noncommittally rotes meningism desertions zooms rambles istle peatiest logia adversaries outgasses stiffener uncharted sexed lochs monomanias portrayals confidence cuffed intromits hates oblates creation"@en ; + bsbm:rating1 "5"^^xsd:integer ; + bsbm:rating2 "4"^^xsd:integer ; + bsbm:rating4 "1"^^xsd:integer ; + bsbm:reviewDate "2007-07-15T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-02-10"^^xsd:date . +dataFromRatingSite1:Review771 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product28 ; + rev:reviewer dataFromRatingSite1:Reviewer40 ; + dc:title "pharmacological elds hearses irradiation caky kerning hibachis sagier pampered" ; + rev:text "traded endive trigonometrical atwain cincture petulance impregnations tularemic worrying convincing surpassed instructorships pinchbugs chloroforms dibbukim rumblers mucilaginously splenectomy incubational purply scintilla noncriminal pungencies ratios wigmaker vitals scapegoater cognise hemolyze oinking molding correspondence overstock eventfully impermanence editorials klutz canadianisms hartshorn autobahn concreting unsanitary slaved interfile bureaucracies mermen electromagnetism slitter curets summits volvoxes sparser scups remount soberizing fossate screwier primariness shanghaiing tankas tackled blurter humbugs tiers nonelectrically stoutens cantatas millibars overseership brassie inveteracy lovage vampish gunfighter weregild teaboxes courtesans nonrestrictive plopped scuttlebutt terminologists handbill enthrone maliciously"@en ; + bsbm:rating2 "7"^^xsd:integer ; + bsbm:rating4 "8"^^xsd:integer ; + bsbm:reviewDate "2008-03-02T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-12"^^xsd:date . +dataFromRatingSite1:Review772 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product70 ; + rev:reviewer dataFromRatingSite1:Reviewer40 ; + dc:title "whoredom battlegrounds bankers railers braiders mastered" ; + rev:text "summer capablest ferruling aviarist hiccoughed violably tuxedoes binges osculant indivisibility nonproductive nixies lief gunboat whooping hammerheaded pureeing bulged untangling odorizing dismounted burnet pastelist presser melodized pursily boob firebrands circulates interfertile chestiest daisies compositely oilcan cankering armlet straddlers blindest rewaxing slewing hyperactivities wrathing declinatory abbotcy visas exhorts rooters holdups asst truncates traceableness putoffs developments embolisms benzyl exportable simplemindedness depletable newish luau divisiveness deafened prearranges brachydactylia malemutes bleeps obstructionism blushed dispatching floweriest desuetudes drenchers treetops casuals supplely racehorse spectrometry acidifying wedder driveways squatty misconceiving flinched hummers airdropped letter apian turnhall unlimbered rials unionistic playfully shriver cocains concatenated tooter seacoasts abortogenic brontosaurs urologists predated frug tithing stewbum accessibility defensibly orphanhood cyclized sentimentality nonproportionally breakfronts rebuffing selectors turgescence evacuees psychodrama coitus sonships dispels layered thermometers statism poppets noncohesiveness fatalism percussional yowies slags servicewoman moseyed gargles redistributes impended jostled manatees pulmotors reenacting witched pastellist snazzier bushtits chafers hyperopic spic panicled nonnumeric codified disinfectant crick refraining saprophagous dreidls desiccated homiest dyable womanize snips spurts currents bikinied chanteuse tardily reboiling parasitization hangers crippler transferals oxheart ensure unsnarl"@en ; + bsbm:rating2 "6"^^xsd:integer ; + bsbm:rating3 "10"^^xsd:integer ; + bsbm:reviewDate "2007-12-04T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2007-12-10"^^xsd:date . +dataFromRatingSite1:Review773 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product19 ; + rev:reviewer dataFromRatingSite1:Reviewer40 ; + dc:title "moiled botchy appetizingly scrapers jingly pumps" ; + rev:text "expediential bootblacks arraigner unfixing bawds filibusterer citifying outswim canfuls roadless oidium slipcases sprouting joyless confined beddings manwise vasoinhibitory enteritis slummiest gambled dotages intimidates hawkweed screeners titrant dybbuk flite magnificoes meltingly flushes faithfully spherier feminize freelanced chiropody viscose cleared misidentifications overexert resubmitting enjoying dances paratypic flatworks titrating cackling horribleness overspreading milliohms gleaming foliates huggers fellah prawning minxes patter fussbudgets malevolence tuberculoid kinfolk fecundate broadswords daneweed approvingly crystals nettlier meows upheaves bravers suasions redry wooed tightens paterfamiliases sprites unbinds follies trier wrier fastest fillers illumination secures heretically palaces federalized nestles chomping divagates fraus shalier schlepps horsehide sandals enquires coruscative flipped interwrought chickadees signaled capeskin incorruptibility violinists revarnished hippocratism kneeholes quadruplet unsatiably roentgenologist niggard bravuras frailer lawfully interludes reestablished aphanite discountenances nosedive disrespectfully legislatorial returns modernization intrusted supinator stresses biocycles unsteeling evocative ukrainians beneficing inclinable steels reformatting normalcies siphoning anthracitic garoted tawnily eventually generation drums hafted levers lanolins flab emotionality fluffier cycads foreknown biotechnologies chemotherapeuticness tailed peavies pruner seances managements visitable neckerchief rearoused mastodons"@en ; + bsbm:rating1 "1"^^xsd:integer ; + bsbm:rating2 "3"^^xsd:integer ; + bsbm:rating3 "2"^^xsd:integer ; + bsbm:rating4 "2"^^xsd:integer ; + bsbm:reviewDate "2008-04-27T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-04"^^xsd:date . +dataFromRatingSite1:Review774 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product68 ; + rev:reviewer dataFromRatingSite1:Reviewer40 ; + dc:title "evoked inquisitors chalkiness frosts unambidextrousness teazled franking" ; + rev:text "boiled unworthiness infecund twiddlers chlorpromazine avast triumvir waltzer handlists receivables cameleer mandibles nae darkness scheduled uglified eligibility amnesic summoned comprised decoys qualmiest spoored cates delusional wholesomely latchstring uniformities chestfuls untrammeled laryngitis justiceship nicest trachoma redecorated ptarmigans tzardom calomel phrases counsels salivating reboiled minutest tictoc coffs beechier dissatisfactions torsoes breezed recommend bentonite despots chemists supplicant beavers phasers vrouw libidos cardamoms agar kyanising recompensation freezers bipods"@en ; + bsbm:rating1 "7"^^xsd:integer ; + bsbm:rating3 "7"^^xsd:integer ; + bsbm:rating4 "2"^^xsd:integer ; + bsbm:reviewDate "2008-05-02T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-11"^^xsd:date . +dataFromRatingSite1:Review775 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer3:Product94 ; + rev:reviewer dataFromRatingSite1:Reviewer40 ; + dc:title "hogger boatbills bioclimatology hemmers flakiness vilification breezeway squarely platinic gatherer" ; + rev:text "retreating dewatering ratch determinability bossism convents deplores promptness footways poisonously embosses sudors foamers clogged flashers ricocheting hunnishness darwinists slimiest closets traps knowingly rerecorded cerenkov assailer flogger spuing pinyons journalism tempting voyeurs climacteric ecosystems comp condyle emulsifier hawkweed anechoic redried sirocco peacher ineffectualness explorations soddies seized perquisites antisocial pervades growlingly syllabled cornflowers purifiers neurotoxicity arrowed unvoices irregardless fanatically shyster wineskins queenliness resections streams taurine swizzled jams caddies teddies clomps asides biostatistics pollywogs whippiest unsubmissive spillway reactivated tattlers disintegrative obtuse realigning beading pistachios gyros eveners reascended refresh heterosexually compensations recommissioning eeliest unfading formalistic limestones envenomization telekineses dirties widder transcendently unmaskers buoying bravos chamise batteries sagged forgiver lippers bruised telegraphers lancet vaginate scrimpier cacophonously gardened orientated gloating emancipator stoniness rescripts hagrode choreographers philters englishes pecking piebalds monolithic affrayed conjunctures monks anesthetist intercalary declined adverts seeds flawless realize pacemaker"@en ; + bsbm:rating1 "8"^^xsd:integer ; + bsbm:rating3 "9"^^xsd:integer ; + bsbm:rating4 "10"^^xsd:integer ; + bsbm:reviewDate "2007-12-09T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-03"^^xsd:date . +dataFromRatingSite1:Review776 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product59 ; + rev:reviewer dataFromRatingSite1:Reviewer40 ; + dc:title "mortarless teacarts assaulter refueled klutzier hairbrush sojournment recovers finalists" ; + rev:text "fallowing satisfactions hones smarty desalinizes pertly expungers repertorial bolts foreknew hic satrap spotter lieutenancy chinks circularizes bono endangered grandames tapholes destructive borage descended gladdening imploring muckles mercers stowable sprinklers torridity fibs curber cementers eyedroppers tremors outlaying schizomanic advisement graduation indictments paralyzant niggardliness offcast balkily demonizes hayfork disrespectable tictocs regranting craped biked equivocator pseudonymous frostiness asst simplification peelings palish roofer provably overachiever fearfuller ashlars bastinadoes forgoer commandment bioactivities oatcake describing pagandoms larky deregulations magnetism jailors insulating masonries especially zoogenous cruxes pugilists operators backdated danker prissiness underlie nuzzler adductors cryptographers peyotl popeye defiler toxicity manges shetlands shops remonstrates trickles couths teakwoods vanward eventuated eagerest distortions detachers clevis rightfully wormer augmenters patiences banting bisections idyl cats controllers resigns misfeasor cooers nighs traitors corking plena ribby oftest husking wampums hardheaded manfulness tippets wildwood floater debars equiangular shit pupfish downlinked bionic hardest forfeitures"@en ; + bsbm:rating1 "2"^^xsd:integer ; + bsbm:rating4 "4"^^xsd:integer ; + bsbm:reviewDate "2008-06-18T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-19"^^xsd:date . +dataFromRatingSite1:Review777 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product63 ; + rev:reviewer dataFromRatingSite1:Reviewer40 ; + dc:title "confederates solacer retrospectives flouters" ; + rev:text "polypoid miscontinuance lifters personation defacers marshalcy cartomancies asserts dossers cohorts duffs noninterchangeable uniformness restages cooers raconteurs fishnet uncombed divot redistrict mammey hardstands blotchy schmelze nukes unclenched auguring lapsers epidermization upboiling unperson jugglery prothalamion daystars lungers overdecorated susurrus mistrustful monkeys expirer surpassed desiccative prosecutive payment palpitates mudguards botches unobjectionably proselytizers forcers shipwrecks roars mated variabilities doodled"@en ; + bsbm:rating1 "2"^^xsd:integer ; + bsbm:rating2 "6"^^xsd:integer ; + bsbm:rating3 "9"^^xsd:integer ; + bsbm:reviewDate "2008-06-18T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-19"^^xsd:date . +dataFromRatingSite1:Review778 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product45 ; + rev:reviewer dataFromRatingSite1:Reviewer40 ; + dc:title "fantasizes czechoslovak footsore exaggerated retrained startlingly enumerator surviver" ; + rev:text "ferryage tinier dynamist rereading confraternity elfishly begum vacationists parturition untrussing popery unobscured unpredictabilness deranges reinvited ecrus confederating quoth sigmoidal idyllists luncheonettes chromosomally kanjis tinting indolence divans ploughed psychokinesia rummaging apologue fiefs deferrers yelling snobbily hooping kilometer rhetoricians herbicidal immensities prepuce clannishly touche rags clarioned predicting overfatigue subdefinitions missing analogues yielded prewarned slithering systematized pepsin reapplication verifiableness tannest fascias craters rodmen tutoress conjuring deprecatingly unpretentiousness papayan effluents uncrates antiinstitutionalist nonconnective radixes stonework jackhammers macrocosms looseners drawbar firepans lairing prickles wobblier hopefully ultimas condenser flexor whops repowering hyssops thrummed inmeshing spired proudest personalis callosities chaines proselytism developed smegma licked putters insheathe southwester gitanos stolidity frumps pseudoprofessional daffiest gallantly whilom omphali grovelled beggars tetanal jihad reheels desalinized colorer charlatanries dissembler incomprehensibleness gynecologist sealing phototropism exemptions hanking nontraditionally remedied penetrator whams drastically stratocumulus wisest dollishly seniles succulency pockmarked plexiglass grot biostatistics nonprotective spewing atman ineffectiveness whoopla manchurians apothecaries rustical aphoristic tentages hypochondriacal doffed austerity herons fanaticism berceuses specialization flinched varietally multiparty damozels mantises battens syllabification gelder nicaraguans sterner sinker unrightful slimily protozoology savannas yearning outscored midterms jaguars dieting biosciences"@en ; + bsbm:rating1 "5"^^xsd:integer ; + bsbm:rating2 "9"^^xsd:integer ; + bsbm:rating3 "5"^^xsd:integer ; + bsbm:rating4 "5"^^xsd:integer ; + bsbm:reviewDate "2008-01-28T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-04-12"^^xsd:date . +dataFromRatingSite1:Review779 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product16 ; + rev:reviewer dataFromRatingSite1:Reviewer40 ; + dc:title "cosmopolises chancemen erectilities precancels defoliants" ; + rev:text "inculpated triumphing gemutlich roulade bookers pantsuits flaggers limpets bulwarking attains shat fallibility badmouth tipster hostelers remix batters teabox tolerated voodoos contaminates subsidies roots mollycoddlers rematching brushers jobbers highting echidnae immobilized tuque travels fueled mussed dehumanizes rationalities jackknifed rosin puce examiner sexed flowed impounded misfeasances telemetry appreciativeness backwoods impurely cleanliest vamoosing crumbers oversubtle campy marts epigrammatizer pastilles intentional gainer bakeshop squirreling stepdaughter chops optics immunosuppressant prorated moldered fulmination furriner reallocates thinly stepup petiole schmalz anticlimax chanciest wireworm aerobes benzines driftway evinced frigidity exportations overdrinking kilning jazzes tessellated runabouts pita pottage nonreturnable dudgeon lunarian aerosolize sparers invented tanker selectees endocrinologic rebuked arborvitae denazifies chamfered clavicular reread subdeb trinary harbingers backhoe hybridizations journalizing bogie pointless candescence sacramentally bidders shrewdness electroshock billers uncontrovertible whelps officeholders planing enfranchises corrugated clairvoyantly slurped parathion hailing architecure skelter energize jackanapeses draggling matriarchy burlesks otoscopic airworthiest reporting contaminated distilling extremeness auditing separated insusceptibility tensest chalked ostmark checklists slipperier annuals boles bedlams cuppers furriners aphanite catechisms pedometers healthier caster compatriots proclerical brayed prototypes muggering rhomboids outliving orpines liveness hebraized jeerers hymnody pederast relates oxidizable scallions definitively dixit exhibitors sparser stalwarts resowed croaking imperceptive notification cartographies cosie vasculums edifying canteens blackmailing rowel trysting devourers familia mintiest"@en ; + bsbm:rating2 "7"^^xsd:integer ; + bsbm:rating3 "6"^^xsd:integer ; + bsbm:rating4 "9"^^xsd:integer ; + bsbm:reviewDate "2008-04-02T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-27"^^xsd:date . +dataFromRatingSite1:Review780 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product46 ; + rev:reviewer dataFromRatingSite1:Reviewer40 ; + dc:title "benumbed labelled chills ploying subaltern" ; + rev:text "untouchably boogymen potentiometric reforested wether suburbanites countersigned stepparent infrequence redemonstrate oversensitive alluring lamias aphis leakers cunnilinctus clapping intermeshes tussocks graspingly numbing tweaks hectoring delegacy muttons abundantly gradually frenum scattersite fells deedless reacquire destituteness monistical deerflys customizing scotchmen goffer recidivism exhumed disgracer appealable sexually erratics centering poisers massless wreckful dative pridefully praesidia priestliness valedictories remilitarize trayfuls pluralizing keyholes cabala periodontosis eviscerated zizzles semicivilized liker quondam pocks intumesce tactoid unconditional gumtree italics buffoonery erns fagoted statehood orthomolecular bustier decimalizes biotechnology fissions mountaineered reprice rethink ruths ripraps envoys scalably crying commandments auditives ported apolitically greased refly buds spiraling scandalization pedicures timberhead similarities sects defensively untrussing anarchists orthopedics yardbird unsatiably unsanctified unpleasantness wedgier zombies leapfrogging overween victoriousness wyverns shakier challengers modulating crenation fortifications comanches titties noddy swaybacks calculations antipacifists trinal tractors befoulier hooray renascence vandyke sassiest rutted zooid perilled oohs bedecks melodizing clarinettists condescending overinflates strays holsteins misprinted meatless prepped irritabilities kiters noncombining amah thatching pigmentations recognizes lessons weighman"@en ; + bsbm:rating3 "5"^^xsd:integer ; + bsbm:rating4 "10"^^xsd:integer ; + bsbm:reviewDate "2007-06-23T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-01-15"^^xsd:date . +dataFromRatingSite1:Review781 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product3 ; + rev:reviewer dataFromRatingSite1:Reviewer40 ; + dc:title "prink noncompeting concurrence quia unsighting insoles belched illogically dendrologist keynoter snowmen unloading ruffled" ; + rev:text "stratous postulated ozonous professes deviance barstool radiants volleyer nocuous teaks sodiums hawknoses chigoe leeringly furriners concentrations quilted outlands lingered resuscitator fisheyes communes imperceptibleness handballs mediational snubs nooses flatters mayvins sallying symboled handpick wowser paperboards perambulated instructors twilit feudatories reining helios arteriogram coos antonyms baulkiest gruntingly hectogram stages cannoneer apposes argles subsidization harmonics cultists romanist pronation antiquating fascination jobber wending pistolled sulfuring doxology pasters cockpits helicon chancroids dovecots conjunctivitis warbler divots propinquity blueballs sabotaged idiocratic hoodless unscrews episcopates dryads jaggedness tryst tugger enwrapping freaky nabbed broomed fairyism tallymen deveined evangelists absconds portioner hents foreside overnighters hippocampus exaltations sailorly lemurs imburse inadmissable advertizer gaming lambed harming canzone oligarch stooges honorifically judaical whodunit unbecoming necrophilic hardpans hallooed absorber candlers switcher reradiate housesitting thalamic endnotes embroidered unclerical warmups lucence voiceful dragonflies dissenting wheeziness hypercritical alimentary excruciatingly prosperousness jobless neutralizer siloed capitalization remigrates unbutton facileness reciprocality suburbans perambulation unregenerate unteaching devisers distractions deathtrap lungers gleaming grandest monasterial huller lariating earmarking rampageous chuckling repetitiveness dribbler regrowing roared detainer architraves"@en ; + bsbm:rating2 "4"^^xsd:integer ; + bsbm:rating4 "3"^^xsd:integer ; + bsbm:reviewDate "2007-11-17T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-01-18"^^xsd:date . +dataFromRatingSite1:Review782 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product22 ; + rev:reviewer dataFromRatingSite1:Reviewer40 ; + dc:title "surveils everglade glottologies altered reletter fabulists collectivists avowable finical" ; + rev:text "generalizing cougher keltics gangrene tabarded disentitling acetifies albums devastator emblems skidoo embittering erratas hawses categorizes inevitability wigeon orchestrator deuced videotapes neurotransmitter eyeletted discursiveness triads fabling armchairs leveling azoic handler parasiticidic barrens submersed anathematize aqueducts seismically pharmacies credibly lawyerly erupts finaglers cions herbarium godheads landed floatages interjectionally sleekening eon overdrafts laster pealing rezoned overflight quitrents scarey singhalese debunkers knotholes resists reenactments redistricted disrobed decentered assegais niacins fussing nix victims grappling feudists villus fashioning filtering nightman sociability flourished bally chields sparriest germicides incivility unappreciative unraised veracities capacitances denominator proudness zombies impressments ungrudging violoncellists sharpshooter asphyxiates subcommittee intransigents outguesses reappointing jemmy misrepresentations stays jetties"@en ; + bsbm:rating1 "9"^^xsd:integer ; + bsbm:rating2 "1"^^xsd:integer ; + bsbm:rating4 "3"^^xsd:integer ; + bsbm:reviewDate "2008-05-14T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-13"^^xsd:date . +dataFromRatingSite1:Review783 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product73 ; + rev:reviewer dataFromRatingSite1:Reviewer40 ; + dc:title "intromission rhombuses anonymously protestor masker provocations rehung" ; + rev:text "peppers mobilizing ziggurat reenactments demeaned lingeries freebie overshoe ever pouts lowercase metatheses mishandling underexposures relighted reinvestigate magisters gymkhanas unreplaced rationality retied billions paralytic botches padding fantailed nicked bozos psychosomatics hearths hafting sledding intermediation tautens velour promissory sicklier phasers ullages piccolos callosities disemploy construers whiter seedcases physicist barrets walkaway debutantes suspends subsegments dishevelled cowed satanical disdainfully hognuts reputations waling sestine gladded ungovernability rechristen zymase firedamp sanctioning unwary taskwork obliqueness outfitted heftily heteronomous girting ravenings perter heeling relay talked sediments stigmatize prologs deepener hypothecates fulmination inexpressibility smiler ourangs pariahs olympics diversities dreggiest inliers trainway knave flatfish papain weewee sobbers gobbled lards soddies enchiladas dreadfully ultrasonic outriding dirk japans irradiation cubages granddads legality juxta shiatsu ovenware fowls rehearsers couture cornel herpetologists faceting studiousness wakenings sympathetically invulnerably coffing poplars outdoing mortared treacherously christies refreshed bestirred eurodollar fingerprints immobilize outbargained alternatingly consulship gudgeons intendment beeped offences fowlings riflers emending jawbreaker coarsens vegetables tympany depraved tigereyes supererogatory jewry tubbable awkwardest hewable beauties hardheartedly horological orbs pouncing eugenical watercresses feathers spiffiest mesentery normalacy erases discombobulates ganders shellfire noggins siberian flagger acceding muckers loyalisms earfuls clearinghouses hibiscuses offhandedness"@en ; + bsbm:rating1 "3"^^xsd:integer ; + bsbm:rating2 "8"^^xsd:integer ; + bsbm:rating3 "5"^^xsd:integer ; + bsbm:rating4 "7"^^xsd:integer ; + bsbm:reviewDate "2008-02-16T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-04-05"^^xsd:date . +dataFromRatingSite1:Review784 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product27 ; + rev:reviewer dataFromRatingSite1:Reviewer40 ; + dc:title "narked misdoers avoirdupois acacias" ; + rev:text "plectra concretions theocratic skeeter firedamps ungenially coarsely awaking caddie deposed tambura slices villeinage lingered ires schoolmarms merchantmen plagiarize valors dehumanizes referents harnessing baronets interrelationships wainscoted driblets burgers wreaked entrenched luminaries pryers reaccustomed crosshatches growing oyez dosages indebtedness mammoths chasers carfares defection baronages natters yenta jigged sandpipers idealizations fruiting outfoxing variableness acceders crimping fittingness filenames afterlives snoopiest steppes slathering asperse derelictions pantsuits fans modishness carburetors barters coleuses pauperize fizzing barrelling barbarize acutes wooding westings dioxane adheres hebraized greenhorn mitts suppler aud gruesomely whammies symboling postponing accumulated ubiquitously peatiest cesspits displacements dingeys ejects cronies disqualifies ravels frontiers cracks atomizers egotistically impediments kohl retrogressions readjournment angiosperms nightcrawlers recusants scatological hereon dogcatchers channelizes specified loopholing bumboats resenting radiosurgeries malarkey fuzils unromantic inconsequentially unsheltered arsonist disapprovals"@en ; + bsbm:rating1 "1"^^xsd:integer ; + bsbm:rating2 "2"^^xsd:integer ; + bsbm:rating3 "5"^^xsd:integer ; + bsbm:reviewDate "2007-11-14T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-11"^^xsd:date . +dataFromRatingSite1:Review785 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product42 ; + rev:reviewer dataFromRatingSite1:Reviewer40 ; + dc:title "toothed augustest syphilizing impugner aloneness pleasantly" ; + rev:text "osiers moderators prerecord tuned ratters increaser surpluses incubating overgeneralize assignors whiteners wisecracker crinoids mongol uninterestedly loafs timberline intwined grapy coerciveness accoutring reticular megohms afeard gorals undulates teargasses cherries activators miner steersmen schizoidism preciosity sappiness engraves mendelize antispasmodics congratulating masts clearinghouse unloved waxings hippodromes hieroglyphics polygamous anecdotic shopmen woolliest roughs hexose sweepstakes calorimetric redskin reobtains democratically assertion defined queasily"@en ; + bsbm:rating2 "1"^^xsd:integer ; + bsbm:rating3 "7"^^xsd:integer ; + bsbm:rating4 "7"^^xsd:integer ; + bsbm:reviewDate "2007-07-20T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2007-07-26"^^xsd:date . +dataFromRatingSite1:Review786 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product86 ; + rev:reviewer dataFromRatingSite1:Reviewer40 ; + dc:title "barbecues enjoyment grooming mediumistic diarrhea halberd cutpurses sheafs balustrades reexport kanjis impellors sliding" ; + rev:text "expatiation favors egoisms slopping refreezing geminis quadrennium hullers minimizing overviews joined nails omissions unpaid spreading misogynous primitiveness opposabilities starlets caudices bandies pinkos septuples neckband garners sociopaths edicts syndical synthesized prepossess sheenies abasedly gabbed unattested amercing headspring fogs vitrification eagerest subraces disaffiliated cooker vesture scalawag stenographic melees merrily revocability disinterred reboarding fatuity urbanization"@en ; + bsbm:rating1 "10"^^xsd:integer ; + bsbm:rating4 "5"^^xsd:integer ; + bsbm:reviewDate "2008-01-08T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-01-11"^^xsd:date . +dataFromRatingSite1:Reviewer41 + rdf:type foaf:Person ; + foaf:name "Xylina" ; + foaf:mbox_sha1sum "dc7d9962dbf470cc3d939cf312fa32e261da9aa9" ; + bsbm:country ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-07-27"^^xsd:date . +dataFromRatingSite1:Review787 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product27 ; + rev:reviewer dataFromRatingSite1:Reviewer41 ; + dc:title "throats recalling seizures fronted generalissimos rhapsodies hairs pretor uncountable keying doughnuts creaked belittles" ; + rev:text "overgrazed sensitizes humours siccing olfactometry revetment fuzee reissues redeveloping sakis objecting wadis trine bargeman dojo cinematographer recaning monology crosshatching popularizes adagial opportunistic sufficers lobbied kreuzers closefisted sylvans wisped frivoling mismarks revolter nonobedience uprises swats permafrost shojis sophistical begrime goofed postilion infective sorrower chagrins synchros subaqueous traditionalists fumets drafted pumices directives cooking marjorams hr bergs shopping consonance deprogramming mellows antihistaminic gelding aggressors torridness unfestive equivalencies denominated topkick inveteracy hastes cacaos sulphates unsurveyed buncoed cordiality replaying misunderstandings contraceptives thrummiest defeatists juncoes nonvascular brimming saliences"@ja ; + bsbm:rating3 "3"^^xsd:integer ; + bsbm:rating4 "8"^^xsd:integer ; + bsbm:reviewDate "2007-07-28T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2007-09-11"^^xsd:date . +dataFromRatingSite1:Review788 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product47 ; + rev:reviewer dataFromRatingSite1:Reviewer41 ; + dc:title "usherette cherubic thatcher impalpability patterning lighterage outboxing reconfigurable manures" ; + rev:text "merchandized worktables campy overspends sabbats nutriments gambolled unvaccinated drys haunched honing blocking reclining uptime dearths eucharistic bankbooks bouffants gospelers intellectuals smocked suborn ultraconservatives leant enumerated watchtower yuletides houseworkers coagulative sandfly challis kiosks uncontrovertible clausal sparkers unmolded pardner monopolized epilogued manifestative bitchier chortler unextravagant partially kohls tinselly inlands dermabrasion poteens plenteousness wrangling countrified figurer spheral shewn compared reasoner wenching deciare deported crumbers"@ja ; + bsbm:rating1 "5"^^xsd:integer ; + bsbm:rating2 "3"^^xsd:integer ; + bsbm:rating3 "8"^^xsd:integer ; + bsbm:rating4 "5"^^xsd:integer ; + bsbm:reviewDate "2008-03-05T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-01"^^xsd:date . +dataFromRatingSite1:Review789 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product90 ; + rev:reviewer dataFromRatingSite1:Reviewer41 ; + dc:title "hairdresser chastises savouries deviational factitiously sploshes sportsmanlike organa impracticalities unhyphenated bellboys" ; + rev:text "restored disobeyed oceanaut interlaced rewin dampers carriages sinlessness tames elasticities unworthies amnion pixes relive grosgrains grutten ruleless ineluctably liftman hogbacks compulsions cherrystone paganists mudfish untangles doctored monaurally raspish outputting reciprocated fulsomely marrieds tularemic takeouts plonking intravenous satinpods tautened react deflectable mediative hurried slithering tramcars bartletts insolence cooperatively tenderizer limitedness mores wonkier tadpoles markswomen buffaloing effulgent pulpy lattices writs dispatches undertaking outmodes boff finality pseudopodia offertories outs inciter devotees decorously amorally reefer lineny ingroups mackinaws revindicated bludgeoning evillest dentally genies humanism parthenogenetic meadowsweets intertwines motordrome holer horticulturists purgations fanciness weightiness reprice clubhand freighted classer redistrict mazed megalith overprominent bitters fanzine stealers crestings fey tsunamic mismarks bellicosely swather appellor kelped crossbars ogee hobbledehoys amortizing chaperonage tuberous defrocking hazels bayonetted lallygagged forecasting spelt alluvia unimpressed ens distinctness days wrathfulness messily confusedly animalistic sprigs bestialized faunally blotted"@ja ; + bsbm:rating2 "10"^^xsd:integer ; + bsbm:rating3 "5"^^xsd:integer ; + bsbm:reviewDate "2008-01-15T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-27"^^xsd:date . +dataFromRatingSite1:Review790 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product92 ; + rev:reviewer dataFromRatingSite1:Reviewer41 ; + dc:title "visits laudanums shebeen cloying" ; + rev:text "vagueness shorthorns droller miseries neuropsychology vasomotor idler reflexives overdoses ferryage warpers sporrans appealingly inlander interposition unclogging tailgates thronged captains outguns gladlier torrential disobeys tons slugs lobbed receipting aids reabandons reprocessing placed liver strangulates tictocking blazonry rashly glamorizing bunkoed gathers bets aplombs prenticing porcupines illegitimated retrenchment misarranged tackers unshod psychical hobbled succorer orbitally gunship polyandry disinterring priedieux meshworks extragalactic ramshackle understructure tattling fetchingly reconfigure unstuck decoying sturgeons unpretentious steamboats replace warders fries quackiest bonhomies solutions reorganizers bankrolled madhouses peristaltically capitulates unperson securement tabularly anthracitic bowfins eugenist agelessly habitations freighted schoolyard prizers lengthening jogglers outlawing posteriority trespassory yetis djibouti punisher salutarily enneads preliminarily coasting disdained mainlanders mixed eventuated unclenched conformism ollas prehensile railways unfettered courages echolocation clamworm notarially journalize tritiums brawliest"@ja ; + bsbm:rating1 "4"^^xsd:integer ; + bsbm:rating2 "10"^^xsd:integer ; + bsbm:rating3 "7"^^xsd:integer ; + bsbm:reviewDate "2007-07-29T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-04-24"^^xsd:date . +dataFromRatingSite1:Review791 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product53 ; + rev:reviewer dataFromRatingSite1:Reviewer41 ; + dc:title "saddened clerics shiftability powerboats homebodies lunarians bawds bathhouses treasuryship pretendedly cesarean engraver relax boardman circuital" ; + rev:text "profitableness weakens pattypans endorsements flockings perspired havocked footnoting assenter emotionless matches weirdy stager trituration turfing possessions sinusoids savior unconquerably mudra damagers exchequers waggoning nondiscriminatory expeditor cryptically walled vitiates ofter reminder armoury telescopically autobahn anguished flatworms riping hardhacks eyeless hobos technicolor savagisms pleadings ghosting biforked pulpers furls cheateries suburbanite transferrer finmark compartmentally pulpier loitered keenness thresholds summerhouses devastatingly colostrum filching colorfastness sheathes storytelling vulgarization preappoint mummies ahimsas confessors debases mademoiselle spooking rewrought tyke unimpressible tortuously annexed acred victualing hyphenating agaves crocks derangements intrauterine explicating starvers cameras calculability expirer zees billowed malapropisms burry scroungier presoaking freezes wormholes plumaged shellacking transliterates natives realigned frequents noumenon pinocle crappiest sarcasms transcribers familiarization beers spouted unzipped figurines equalities larboards reclaimant personifies burlesk oolong unenthusiastically varnishy senhors servings quivered enamoring predictively enlarging gimcrack unconscionably disembarked blamers decalcifies intersexualism renascence lauds inevitableness liberality mesdames expiated blondest curlicues affects haunts bimester backlogging rebaters shallop teletypist uncloak instrumentality consortia wherefor gadgetries teethers humdingers hagglers unreconciled nondistribution biotechnological sharif separability pauses renewing suzerains unquenchable eugenicist garmented wellspring bigheartedly jurator lune penetrates vervain brutalization supes portable beveling slips graperies shiftier harnessing tinselled frogman"@ja ; + bsbm:rating1 "8"^^xsd:integer ; + bsbm:rating2 "6"^^xsd:integer ; + bsbm:rating3 "5"^^xsd:integer ; + bsbm:rating4 "3"^^xsd:integer ; + bsbm:reviewDate "2008-02-06T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-02-26"^^xsd:date . +dataFromRatingSite1:Review792 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product50 ; + rev:reviewer dataFromRatingSite1:Reviewer41 ; + dc:title "briner posturing causeways lidding rubberizes scrawlier hierarchical veers sapiences beagle scaliness mamas avianizes conductibility" ; + rev:text "untypically miladies dunked upchucking abalones internuncio jumpoff dugongs readmittance overpays curbstone fawns miscasts bluestockings dehumanize foolishness unsoundest retransmitting interfaces misdeal founds symbion philosophically squashers hitless escalade peelers unexpressive pickled hutting schists criticizing expatiation disqualified discipliners christens unmagnified cautery hedonically preset messes vitalists starlings combo untreated splitters beefed jerkies lowery baa hagging boggled unlinks reductional reinoculating breather checkoff internationalizations sowers nebulize conductivity afflictive rats chasings cornu straitlaced thalami individuated borrowers inevitably pluses roisterer personalities recension vintages calving ravels geomancy promised unquotable armory recapitulations prevaricate trials riptides vandalizes waterworthy hansoms winkling effecter hebraist uncircumstantial vestured thrusted hydrogenations prearmed flenser voidableness imaginably croquets makings congenially handsomeness helving appeasers"@ja ; + bsbm:rating1 "5"^^xsd:integer ; + bsbm:rating2 "5"^^xsd:integer ; + bsbm:rating4 "9"^^xsd:integer ; + bsbm:reviewDate "2007-09-12T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-19"^^xsd:date . +dataFromRatingSite1:Review793 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product59 ; + rev:reviewer dataFromRatingSite1:Reviewer41 ; + dc:title "overdress forejudger unconstrained swipes unsteadiest buckler skaters beans caravansaries connoisseurs valorize legalistically" ; + rev:text "nascence goulash cliquiest fluoroscopically reinstatements annoyers erenow belabored atmans singled grievingly phonons thrummiest emigre matter getting arborescent herbicides regauging shallowest anglicizing derailments weeviled soloist goiters tawing monomania goonies souped cartloads biogeography municipalities womanizing tictocked commemorators beggaries canaller modi bassinets refuser pleasures sassies crucifixions meritocracies headspring corroborative knelling cardiotherapies foreplay tarots rems vendors lapidating loveliness reincarnates ebullition healthfully anticoagulants unconcerned intermeshes milliammeter fulgent cubicly seasickness misbestowed erosely dolled impassioning secants hosing forswears claybanks semiautomatically accomplishment undershirt scalped bezique unrepentant towing chutnees intermarry leathered granaries bourne metalworker exhorts piercers natron apprising filer cymose meditating whiplashes erose psychokinesis saris pharyngectomies idled unlimber gip kansans hangings dredges cooee foveate wardens ramparts owllike accelerates subsisting cordobas cocos modernity shires inflecting flagpoles panegyrizes transgressors triplets crackdowns compellers snubbed nuder wreaked nonnavigable demob individualist lisper foaminess jalousies remakes films battered calcification teased superjets unbuttons trachoma unyoking flagellating weeping troweler venturesomely furs choruses libelists rangers operculated misdirecting decompensate hankerings subfunction washbasins aurally pressurized sampling gadgety zincing timework traceably fieriest overinflates storefront aquatones pouffs nattering telexing mailers brachial ciao including doss unpronounceable complexities filmland fathoming rifleries drifters obstructiveness dykes dipt animadverting speculators ecstasies taints unoffensively uninterestedly hullers"@ja ; + bsbm:rating1 "6"^^xsd:integer ; + bsbm:rating2 "2"^^xsd:integer ; + bsbm:rating3 "9"^^xsd:integer ; + bsbm:rating4 "3"^^xsd:integer ; + bsbm:reviewDate "2007-08-05T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-04-05"^^xsd:date . +dataFromRatingSite1:Review794 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product68 ; + rev:reviewer dataFromRatingSite1:Reviewer41 ; + dc:title "threatens attributions distributer emasculation repented antifungal hurdling" ; + rev:text "undercapitalize techies vedic concussed nucleolar saltless watchmaker vulcanizer puton quencher convicted uranous investiture cocainism perplexity pedigreed electrostatics mating balancer losings helves machinable ventilates bushman catabolized standoffs gravitating captivators grassing leeways staler grubstaked wavers gouts cracked truncating litigation sloppiest argues nonplussed authorizer comprising romanies hinter lotuses talcky vindicative stabbing unworkably ribaldly fears signification boyos establisher quoted spiegels priories corroborators unsoothed enrobes granddad motifs luckier valiancy apoplectic iodinating coruscated jugful educt waxier algins nard outspokenness musicianship shammed manicures girder underemployment dogmatist gullibility evaluated interfered blatantly humoral cadencies punchers organelle overkills"@ja ; + bsbm:rating1 "1"^^xsd:integer ; + bsbm:rating2 "4"^^xsd:integer ; + bsbm:rating4 "3"^^xsd:integer ; + bsbm:reviewDate "2007-10-10T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-31"^^xsd:date . +dataFromRatingSite1:Review795 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product15 ; + rev:reviewer dataFromRatingSite1:Reviewer41 ; + dc:title "chamberlains payments yellowest circularizing orangeade masquerading reinvitation cheetahs girded contributed" ; + rev:text "ignorers metaphysics pleasurably obligated realized disavows sultanas runts thymier implodes ebonites ladies minorities bigger natives validation nimbused decayable surmising cauterize thiosulfates foreshown supper mustached chromes unperceptive myna smatterings saith captained consultatory woefulness securable slandered bulging disfranchised matey scoffingly somnambulist sliverers splices hitcher ursine disadvantages irreverently scatological couthier holders laccolith milliseconds flenching amplifies thats bawled tangrams supersaturate woodlots"@ja ; + bsbm:rating1 "1"^^xsd:integer ; + bsbm:rating3 "9"^^xsd:integer ; + bsbm:rating4 "4"^^xsd:integer ; + bsbm:reviewDate "2007-11-25T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-15"^^xsd:date . +dataFromRatingSite1:Review796 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product18 ; + rev:reviewer dataFromRatingSite1:Reviewer41 ; + dc:title "tribeswoman propertied houseful straightedges bits secularism bewildering gypsyish condoling manifolded reticence snips crestfallenly thrustpush tieclasp" ; + rev:text "spoking deferentially tusker pschents positiveness noncohesively dresses unwanted waddies vamping overspending dripper ameba energized capitalizer vacationers volubly shillelaghs feebleness humpbacked reapportions totemist kleptomaniac synchros mushes vagabondage socialistic partizans medicant exsert magyars padlocking sorrily iteration mavens stingiest sexiest avidities rosined quires declassified forklike pastries honorarily wrathier unflappably enquiring septaugintal braying entombed anticyclones quiets haversack adequately awkwarder spiegels fifing radiometries nonimmunities foolhardier abrasives prorogation wheelers jacinths crestfallenly whirling serenest sojournment flacon circulation ridings highschool dregs extractions baulkier accumulates nappie unclarified pollist terminals henbits splashdown overreacts rethreading nonfatally blinds selfhoods gauziness pantomimed enfetters smartening semisoft aphelian reactively economics ninepins punker crammer aridness whomping ways cirrhotic surmounted rapprochements proposing jangling entrain unimpressive hoydens serialize sunsuits hyperacidity ideomotor meterological daubing counsellable shadier hogback purgatively snookers excisemen propped colorful budgeting gastrolavage shipmates models nonliving topicality eulogiums berliners bungs belittles photosyntheses firebomb rhumba bladdery depravities ferrying gunned thrones precut nonhistoric timidly demodulated coops dynamites reconsolidating petrochemicals remonstrant demagnetizes diapered sodomy internment doubtingly pinnately vanishers propels assailment struggled untasteful pastored chasing kibbles bronchodilator braizes furnished gaffer charade blued contemporaneously friendships xylography purists ethnologist klutziest shimmery"@ja ; + bsbm:rating2 "9"^^xsd:integer ; + bsbm:rating3 "3"^^xsd:integer ; + bsbm:reviewDate "2007-08-27T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-02-24"^^xsd:date . +dataFromRatingSite1:Review797 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product47 ; + rev:reviewer dataFromRatingSite1:Reviewer41 ; + dc:title "colures stockpiles pipetted globes majuscule gaggled crypto poisonously corrosively explanted unaccepted chippewas" ; + rev:text "filmsets clocks fluctuating vindicator emeerate impending duffle werwolves fishers manumissions luxuriance centavos lumping cancan begrimes cheerer bustards influxes frogfishes peevishly photospherically expropriating udder authored styleless idyl collards foreknow balkers chews damner hawknoses onerosities macs araks seines pawl physiques readers recoil monstrosities penes choiring hydrocephalies familiarity lumberers ricked offbeats weightlessness weakness synergist stained mouthpieces brakes gnarlier twitting draper misarranges misinterpretations japanner runout carbonates catalepsy enfeoffing engined pallor partitioning pseudoartistic resistances wideness teacakes payers profferers dolts conceited scrunches thickener relishable heehawed greys transparency durableness pandemics finable groomers heirships shirrs welchers oiliness interrelationships sarcasms bacchants precepts hoops substantively depopulating sherlocks unappropriated blathers hurrahed callowness ulnas factually nestled burlesqued whimsicality rejecters flavonol mornings periodontosis purposeless meatily alludes desegregated handiness sapphisms anticancer wha drover encephalographic overjoy contradistinctions infatuation underwrites rebelliously maddened jibers jimjams manilas residency postdating merriness standardize nightclubs externalization branchy repaving exegetic westernizing cooperated pelage noiseless hermits vexes tubulate distancing anonymously jaywalks restrengthen torridly nutlets composer unintelligent amalgamative pointlessness ailments gownsman casher isogon exserting suavities historiographers overcompensators seraphs deliriums confidently"@ja ; + bsbm:rating1 "4"^^xsd:integer ; + bsbm:rating3 "5"^^xsd:integer ; + bsbm:rating4 "4"^^xsd:integer ; + bsbm:reviewDate "2008-02-19T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-15"^^xsd:date . +dataFromRatingSite1:Review798 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product57 ; + rev:reviewer dataFromRatingSite1:Reviewer41 ; + dc:title "witless redevelopment clubfeet beckoner musingly paxes attachers fatigued misapprehended kilogram" ; + rev:text "crucialness preaccepting protraction scarcer knaveries panjandrums mochas unflattering boomeranged pimpliest spectrochemistry mystically wiggler forcibleness improvisor putters madders delectations milkwort provably anthraces leaking overrefined rainbows reverenced asterisks aphelian cognizes repercussiveness familiarness granulated joisting topping preascertaining confluence neuromotor chewiest mystically ignoramuses drabbest zagged rotisseries instrumentary upholsterers tokes tossers phoning unhindered metabolizes voltes equipages mimicry gimping shimmered approbated staggerer charlatanish listener canning statutes crosspatches seizers pipits incurve broachers vrouw kantians jaggers stockings spirted interleaf trunnels nativity doubleness terrified crumbliness submerges disencumbers xenolith recelebrated gestural reelected burlesqued tirades ungenerous fishhooks conceders slugger accommodator embalmers seminaries witless alphorns villainies famishes ferneries divulgence depreciatively glutted peppier overconfidently frosted unroof choosiest shininess skintight righted hauled surmounted lupin salver immoralities iguanians mistuning daintily consulates scanner boraxes prosecutrix refiners editress lyre amplifies laboratorial pappies forepleasure interminableness negation ammoniating fritting arctics groundlessly retaking tastes aortae fasces mohair enfever sibilants limberer gentleness playoffs delightfully lunched laserdisks forlorner sepalled vulgarest persecutor epaulets ticks radarscope acrylics dimmest smartening conky condors anesthesiology philomel ruminants futurology shriekers fallaciously oiliness constabulary misinterpretation uncool racquetball bitchier pixyish dives bacchanalian aunts loamiest readjourned hubrises"@ja ; + bsbm:rating1 "1"^^xsd:integer ; + bsbm:rating2 "5"^^xsd:integer ; + bsbm:rating4 "8"^^xsd:integer ; + bsbm:reviewDate "2008-01-23T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-03-31"^^xsd:date . +dataFromRatingSite1:Review799 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product88 ; + rev:reviewer dataFromRatingSite1:Reviewer41 ; + dc:title "respirational arousals elucidations prickier uncultivated shifted" ; + rev:text "clobbers durning untaught microprogramming distorter cleverer remends burghers yawping verseman graphites daisies wrongly sympathize alleys stereoscope grandsir cradles subtler yoghourts dehumidifying debarkation awakening riddances revealing matchlessly sneers decameter ortho unlawfully transfusing dialyze givin embowering franchisees blighting thistly ambergris kissers insalubrity halftimes colluders puckerier belittling toning deprogram constitutionality lengthier amidships vacillates fanciness califs abscise cesareans slaphappier qualities injectors zillionth yeshivas sadistic doughiest discomfiting coprology darks scoffingly drumsticks noontides rosiness metroliners cranching quarts defining dueled girder lavage modo likelihoods noninflected disestablishing seneschal commandoes coalescing scribal venturously encompassment refolds viny libris vesicants ponderosa equidistantly virtuousness goop wilds sellers restyling rinses sunbathes prejudicedly fisheyes limekiln"@ja ; + bsbm:rating2 "5"^^xsd:integer ; + bsbm:rating3 "8"^^xsd:integer ; + bsbm:rating4 "2"^^xsd:integer ; + bsbm:reviewDate "2007-09-17T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-11"^^xsd:date . +dataFromRatingSite1:Review800 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product61 ; + rev:reviewer dataFromRatingSite1:Reviewer41 ; + dc:title "frightfully lazuli marauded unifying graphed" ; + rev:text "chlorals gripple unpicked avionics censoring structuring garfish cannoneer daytimes exacta fester putridness expunged frittered warpers biochemistry upholsteries guiltless scrupulosities repriever undrest outlawing vulgarians kimonos astrologer embalmers bastinado hydrations tends experimenters whittlers supernormal shnaps unhatched bullyrag swordsman threading candidature dimming disillusionment distinguishable ostmark sadnesses drawling sleepwalking cushions girlfriend unaspiring tai dictatorialness scantlings fluxed halberds semiagricultural relinquishing reappointment speculated mitochondrion bijou runnel procrastination toxicologic wangling noonings sandboxes forecastles telephonically kidders godlily retranslation disjoints jingo ragas deregulations extradited gutted ergotized unsure steeply corning whirliest logwood emulsified surreptitiousness unfrock incompliancy itchy embosoms handbags insensitively myrrhic inaners predacious gauls insphering injectors evincive"@ja ; + bsbm:rating1 "3"^^xsd:integer ; + bsbm:rating2 "3"^^xsd:integer ; + bsbm:rating3 "3"^^xsd:integer ; + bsbm:rating4 "10"^^xsd:integer ; + bsbm:reviewDate "2008-05-07T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-09"^^xsd:date . +dataFromRatingSite1:Review801 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product48 ; + rev:reviewer dataFromRatingSite1:Reviewer41 ; + dc:title "saddens stomachers souchong vicariates exotism britisher mounts cads unbinds" ; + rev:text "ovolo destructiveness gartered impermeabilities spouted chaws cudbears repugnancy cannabic prestigiously rowings ancestors rampageous bewig bowlders microphone obligable eliminates readers bradawls executes molestations bogart ridings streamy starches matriarchs enveloped pouncing redissolve rassled pennons milfoils overattached lothario separates blurred potency gruffish gainsay biogeographic learnedness chamise bibliotherapies novices innholder regulable baddy drakes harpies shifted maxwells budging reenforced anitinstitutionalism tiepins flavonoid cusser garbler interludes vitamins preeminence enumerating disjointing sforzatos adorers criticizable oppressively flashier empaneling reaped leeks shrewing judaic dooming aborts rusticated perfunctorily scotching interjector paraquats ration sereneness devitalizes rebait quintain antipyresis stereoed satisfactorily karyotype budged intenders doggy chatelaines cicatrices pampering bunches minikins swampers calendal parer coquetting pommeling firebugs amplifiable goatfish pressmen uneasiness flappy crinkliest convoys parallelograms edictally ganger abscissions betatrons scamping halos overarm pairs codifier hydrotherapies myrmidons instructing unswerving underbid dictation unwisest overtured potencies tenderizes cockleshells hajjis bondwomen despondently yowled amazonian susurrus dinette nonconforming iterating carpetbaggery flowerier substitutive foremother asperities dx grayouts impalement woolie breezing revivalists unseaworthy mooed orgeat penologists entangled mosaicism racer burseeds unstably isotopy anesthesiologists teleological katharsis neurological audiometers sublimated cruising postprandial meatless cordwoods sleeker epicalyces valveless inflammative sailer goddamn scatological federalizes amblers agape prescient recommendatory vassalage dustmen lancets ejects factorable"@ja ; + bsbm:rating1 "8"^^xsd:integer ; + bsbm:rating3 "5"^^xsd:integer ; + bsbm:rating4 "8"^^xsd:integer ; + bsbm:reviewDate "2008-05-08T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-16"^^xsd:date . +dataFromRatingSite1:Review802 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product28 ; + rev:reviewer dataFromRatingSite1:Reviewer41 ; + dc:title "bemires intently suckled lambency molters fumigates ululations" ; + rev:text "untruly outyelling onomatopoiesis encipherment ebcdic anality zephyrs applauder substantiation drizzling meniscal incomings constrainers shoddiest ratability hoodoo decidable sippy skimpiest kindergartner chemises abjured cauldrons jackknives weirdo toothy oatmeals impanels extemporaneously unpredictabilness sueded statice marshs immoderately worsens biographies huckstering couplings swifts shrifts sunburst neglectfulness saunas cathect recomposed forensics provoker veep metabolizability sayst hogans smoothing hostel bequeaths refilling reconfirm dislike capitate pickled audits mislead serenest lube irritating photoplays kayakers emplacements funking stultifying satellites variorums beggaries errantly harnesser elaborateness produces mizzly shiftless recommencing maundy lanolines infirmity kilorad grungy compactest residing flatwares hairsbreadth minimalist staphylococcemia placket vocation segmenter prematurities kebobs tributaries omnipresence expellee enterable enticements ambled coempt transcendentalizm shintoist misplayed dilator unmanageable hermitages timbals townsite communicably sequestrated hereditarily deerflys immies orthographic mansions notifying pyric volplane tizzies undergarment plougher unseasoned mossbacks bespeaks cheekful outcaste umbered"@ja ; + bsbm:rating2 "2"^^xsd:integer ; + bsbm:rating3 "6"^^xsd:integer ; + bsbm:reviewDate "2008-01-05T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-01-07"^^xsd:date . +dataFromRatingSite1:Review803 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product63 ; + rev:reviewer dataFromRatingSite1:Reviewer41 ; + dc:title "henhouse takes tutoress exorcists williwaw deliverers gargles makeweight gingersnaps embassador groining ascended mains monochromes" ; + rev:text "mechanizes goneness godless hiding gamine frescoer inkers cartooning triplets fuzils turbans genitals optimally naiveness tracers fraudulently generalizer oxfords shibboleths plums peeks headpiece affirmers pullouts dewier digitizes franciums jaybirds investigative comparativeness utterer insinuates gatecrashers reenjoying twaddling practiced eerier raveler bastardize smiter diurnals smokepots thermostable valetudinarian nulliparous whelped determinative isolog ossia epistolary katabolism concrescent perused mortarboard chiropractic paupering progressional woozy electricity handshaking collied unkinder niftier gigolos exaggerated aperitif upholding humbling wordages inkblot stimulation inculpated nebulizers licit presbyope annoyed antimicrobial custards evolves dandled"@ja ; + bsbm:rating3 "7"^^xsd:integer ; + bsbm:rating4 "7"^^xsd:integer ; + bsbm:reviewDate "2008-01-24T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-02-27"^^xsd:date . +dataFromRatingSite1:Reviewer42 + rdf:type foaf:Person ; + foaf:name "Kura-Janette" ; + foaf:mbox_sha1sum "8fd7f2b39363523abfa5a7c848a2cf56dfd3542f" ; + bsbm:country ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-09-15"^^xsd:date . +dataFromRatingSite1:Review804 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product50 ; + rev:reviewer dataFromRatingSite1:Reviewer42 ; + dc:title "minifloppy restorations bursters barouche juiciness nuanced crozier illustrators evinced dethrone orangey refastens overdependence jailkeeper valetudinarian" ; + rev:text "arse offending resourcefully drones wordiest anatomizes fellahin mugger skepsis reinvestigate wolframs stenos peritoneally successorship demoniacal offsprings bumming unbuttoning outbluffing unchained whelmed eyeletting totalism bacteriology deicing vanillas rinded sicked pseudohistoric wheezed pensioned litigable pygmoid leased unlatches sharecroppers morphic finfishes focusses captress luffs espials jiggered triphase subparagraphs intervener amirates vituperating asap aloneness pipes rebuking extrapolating underachieve mockable longship motherly refracturing smirkingly grainier thwarting wellhole wanly shawls phenotypical tweedle attempts arborous cantatas ruralizes gobs rangier dodger nets damnably electroencephalographs overextended tanking prerecord daylighted arbitrament plutocracies expurgators tootlers downswing galactoscope depositing boffo basely demagnetized administered kilning escalated channelling liposoluble wading rethinks animas audiences suppliants cutoffs tuberosity triolet reoccupations chameleons humiliated beatifically"@zh ; + bsbm:rating1 "7"^^xsd:integer ; + bsbm:rating2 "1"^^xsd:integer ; + bsbm:rating3 "6"^^xsd:integer ; + bsbm:rating4 "7"^^xsd:integer ; + bsbm:reviewDate "2008-03-15T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-25"^^xsd:date . +dataFromRatingSite1:Review805 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product45 ; + rev:reviewer dataFromRatingSite1:Reviewer42 ; + dc:title "amerce gawking feeding sensitively bladdery enrichment preset germanized spirts bartizans neighbored reexports vacillation griddling incisively" ; + rev:text "galenic riffler parring broomsticks beating apes geologist bondwomen grapes scabies skirmisher restricting apprizer unhesitatingly chauvinistic pared sperms ethiopian scree scamps nippy distent weekly ileal inactivities codes topkicks severing kefirs residua noes wiglets longing penuches disconnecting encapsuled glossies discomforting nucleon amenity instates spired destructibility logia shanti deployments atomism sulphury picturesquely battlement lacework shimming inequitableness snowplows smarty hooray leaping pints chicaning untranslated manifoldness interaction blastier mammate longship airworthiest vegetation unsuspiciously irresuscitable civilize isopod irreligious departing grillages scrimped ramifies knacking loses twaddling appliances familiars thinking countermanded imposingly lymphatically quietened dynamisms remolades haler derivation fainting"@zh ; + bsbm:rating1 "9"^^xsd:integer ; + bsbm:rating2 "3"^^xsd:integer ; + bsbm:reviewDate "2008-03-19T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-27"^^xsd:date . +dataFromRatingSite1:Review806 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product78 ; + rev:reviewer dataFromRatingSite1:Reviewer42 ; + dc:title "snicked auditioning dropping refurnish effusively rigorously northeasterner snoopily ramifying reclamations jawboned skewness emulator" ; + rev:text "rags fizzier consecrating bemix ensphered unwitted behooving attainted beetles saturating psalmed slogans prewarmed barbarizes egotistic savager thermometrically hiphuggers jackscrew sloping impersonators infusive accidentals infrastructures extortioner ungratefully woodiest unmerged paneled sexpot wiredraw pleading reemphases foreordaining foreshows spotting campier ontogeneses mishmoshes behoves rangier trets surchargers tournaments tabooing massing plasticizing irks crocheters spooled reharden prevailer prorogues peskiness salinizes desisted birchism sprightliest dieters selenographers filmography lingula lieutenancy townlet gingerbread brusk harboured popcorns thermos insurmountably cultists spilth downgrading spirochetes tzimmes stepup archangelic displacement foxskin nonprotective fishiness sirenomelus pensiones shunner bigeye moonwalk meanies groining spooks yarded fermata knothole vilifying calderon battiks rebaters beefcakes frauleins toothiest aroynts loiteringly torpidity tubby headstones moussakas unbelievable rosinous sentimentally filarees olograph"@zh ; + bsbm:rating1 "8"^^xsd:integer ; + bsbm:rating2 "5"^^xsd:integer ; + bsbm:rating4 "3"^^xsd:integer ; + bsbm:reviewDate "2007-09-16T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2007-12-05"^^xsd:date . +dataFromRatingSite1:Review807 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product80 ; + rev:reviewer dataFromRatingSite1:Reviewer42 ; + dc:title "menstruum rules deeper heifers booed hornswoggled minicomputers cowled vedic rickettsias stilts flounciest" ; + rev:text "broaches complementariness alphas withes weevilly corespondent vagrance turmoils regalities deviling containerizing kiters zoopathology binges fortunateness convoker reexpress uniformed intertwinement lingas demanded originally melamines bitched cuticles foggily hake sensitometer rocketries communalist paleontology devils canters overinflate stalled handwrites pineal weskits cogitators spank fuggy revocability positively commissioners warworn exorcised tabletted croaked vegetative ratiocinating webbings gandering riling spleeniest rodded venin nonsalable taphouse dedicatory strangulates jesuitic disarrays harping elicits chronographs bicorn processionally discount blunged buggered chymics arboretums phlebotomy lonesomeness contemplating motives telegrapher overimaginative piggin piranas semidomestication rayon reemphasizing disadvantages semimonthly curably polemicists foreground cultists gaiting fuzils endocrinologic melancholiac fascistic onboard feminizing fragmenting clarinets scalded facts tactically underachiever bibelots misfitted grafts fantom villainess wieldy swerver welches hived maturely rested masers crushing vegetables rattier innovates disproving crosscurrents misterming woodpile contributories warner proffers marmoreal cassias rehinged boatbill pears fairways industrially aquatics biannually burbles pulpily wenchers canonry loping goodby haggish amiably ominously microbes gestates radiobroadcast imperialistic loving austerities peruses cuttable cartoons propagandize solders reconsecrates touted gaveler empurple scotching romanies bloops radiation algoid whitey procreativity dyers motlier insurgency lunches"@zh ; + bsbm:rating1 "10"^^xsd:integer ; + bsbm:rating3 "9"^^xsd:integer ; + bsbm:rating4 "4"^^xsd:integer ; + bsbm:reviewDate "2007-07-10T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2007-12-01"^^xsd:date . +dataFromRatingSite1:Review808 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product37 ; + rev:reviewer dataFromRatingSite1:Reviewer42 ; + dc:title "apparently demerits tenderfeet undistinguishing tensely staidest animated envisioned swabs" ; + rev:text "gives hairs musclemen fascinations gawkers warns adulterer sergeantships mangling unsecured artiest crated keelhauled moldiness winding outshouts renewer tissuey pattered friendliest heirdoms unexperienced bicolor stomachaches shrouds prelimited bristlier chromaticism liberated mammoths recognitory smudges specificity drily crocheted paraphrases calorific catagories rationalized terrors antennal beelike bareness solicits stockier metalware feller calling chlorination scragged westered toolbox donation stupidest vicarate seascape overblown pinkoes candors preceptresses resituated kook fixated canaries apprehensiveness honorees repine tortuousness madre slurped instinctively spinals guarder strongest heinousness eulogize scoriae roved statehood hardship tonsilar superceding opalesces obscured gunlock iambics rachitis collegiums nettly tanto forgathers vestural applauder irreparably faddist sultriest expansions seaplanes aggregated leukocyte gerontologies meticulousness recognize paginates noway reassignments consolers peerages bedraggling resinoids selects insusceptible lollygags farinas ureas solved posttraumatic earthlings redemptions gossipry toddler churlishness minimizing coronels shylocked unpainted legmen slobs miladis environing azole disembarks honorands buffy unsteadily pilsners pirouetting exonerated warheads maples scraggy mescals congeries miniaturists demodulates electromotive outlive archaistic intermittence attempting pintas diminishment yearned knotter devastative coulee cowardly irater underground usurper tiering havocking horologes comprehendible hardstand satinwood granges loops electromagnetism regretter signorine humanize commissions opacifying pinballs trochaics maleficently eventfully fierily creativity spectacularly expresses oilers briskly ripper mon spiritualists texases unfixes unaccented"@zh ; + bsbm:rating1 "10"^^xsd:integer ; + bsbm:rating2 "5"^^xsd:integer ; + bsbm:rating4 "6"^^xsd:integer ; + bsbm:reviewDate "2008-02-29T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-04"^^xsd:date . +dataFromRatingSite1:Review809 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product42 ; + rev:reviewer dataFromRatingSite1:Reviewer42 ; + dc:title "margined remotest unshifting stoppages maturities manicures abrogation miasmata bandying overstimulated hoofing pyromaniacs" ; + rev:text "matildas unending zincified plundering listings contestants dudes orderliness flatterers jukeboxes itches towels atonable crankily relocated micrograph divergence bespeaking towhees fagoter muter aphanites potentiator parkers lecturers prejudicially epicene polyethylene readdressing attributives tacksmen martyries laserjet milages softheads pylorouses sumos waterer wordings mantilla spitting storehouses growlers allopathies proudly squarer flunkies scopolamine sprayed kaisers harshly redecorate panniers cogs dynes eightieths recidivistic dynes deckle meliorating steerers viceregents discerns hadst"@zh ; + bsbm:rating1 "8"^^xsd:integer ; + bsbm:rating2 "5"^^xsd:integer ; + bsbm:rating3 "7"^^xsd:integer ; + bsbm:rating4 "4"^^xsd:integer ; + bsbm:reviewDate "2007-08-28T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-29"^^xsd:date . +dataFromRatingSite1:Review810 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product35 ; + rev:reviewer dataFromRatingSite1:Reviewer42 ; + dc:title "feists spills pharyngectomy heartstrings rotors stakeouts irritation chastely dotation barracudas" ; + rev:text "drunks extenders clammed reclassifying preclean chutzpa tuberoid ossifies playacts righters rums melodramatically prosperity superficialness faction beguilements chunked dumdums conversed combe saloons counterfeited tubercle propranolol prinking prosecuting abstentions potterers eugenical navigational skylarks assiduously indirectness googly striating enfilades lectors pupating outranking stuffily minidisks costar camelias calaboose judiciaries obliques alkalin derisible ghostliest membered dentins aerometer moneylenders oracularly deific understructure thyroidectomies auditioning swivelling torpedoed skyjackers machinability momentoes crabbing pepsines interchanging knowhows fluencies hardihood steamier mummifying repapered decongestion captivates savaged impulsions peculates ideologist tidally extortion cybernetical transcendentalism cunts xylophonists dowsed precentors wadder prickles shattered cinemas upstage fidgety pullovers entwisted spearers stemmy distributorship ripcord distasting paltrily bangtails crudities overleap highness modernly deplorableness nonformation facets somnolences evacuations stenciling seguing icelanders processionals overdue peels prerecorded chorussing brasher skepsis reverberates vases textuaries fatigability pupa cannonballing zinging conciliators totipotencies vasoinhibitor sequestratrix ignorance antipoles sesquicentennials circuses universality olympian sandburrs middy notability digits semiautomatics summa gonadectomies drains encephalography sinks exculpation aerator preliminarily fearfuller upgrades feared punkin craver cuban feminization unperturbable squarers oryx crossers makeable ophthalmologists chocked retinoscopy windily furrings dhoti frillier saluted culled badmouthed nervelessly halers disburdens mounded behemoths certifications idles"@zh ; + bsbm:rating2 "7"^^xsd:integer ; + bsbm:reviewDate "2007-07-18T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2007-11-01"^^xsd:date . +dataFromRatingSite1:Review811 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product75 ; + rev:reviewer dataFromRatingSite1:Reviewer42 ; + dc:title "recompilations relocated vegetive distension crackled wageless" ; + rev:text "pipier misgovern vestures namer depressed insanity outboast uncoils conquerable plunges retaliated rem titters bassists activeness mulcted rheumic reared playgoer cesarean mistaught interpolates moors epigraphic unchastised pulsars applauds martialist insurrections adsorbed landmasses smooching shielder vastly pavans guyed schuss stubbing customizing dysesthesia zoography blubbers deviational quacked cryostats dozier grovelers craftsmanship congenitally overwrought acidhead radiums rosier roosting pensionless bights bellhops outbluffing slammed stirringly overshoes abstractionism counterclassifications acrobatics migrations boused inclinable misspends buggiest wands dreamer cynical traveled kerchoo wingovers qualities abnegate paraders statisms aspics hipped institutionalization requisitions giddiness ferule stapling"@zh ; + bsbm:rating1 "6"^^xsd:integer ; + bsbm:rating2 "4"^^xsd:integer ; + bsbm:rating4 "9"^^xsd:integer ; + bsbm:reviewDate "2008-04-18T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-04"^^xsd:date . +dataFromRatingSite1:Review812 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer3:Product98 ; + rev:reviewer dataFromRatingSite1:Reviewer42 ; + dc:title "brasses poetries computerese nosier entrench dugongs counterclassifications executioner sluggards" ; + rev:text "dealing depolishes carelessly sextuplets windscreen thwacker miraculously widders radians sunbeams shirting galvanizes idahoans stowable whetted unfaithfully pleasurable timpanums pimento defense stupefactive minicars fatalities theoreticians unpardonable booklores farmings ambuscading inundations nonforfeitures older uncomfortably obliterated embolus azoth pomeranian blinders jotted floridly logistical blethers annuals sniveled gruesomeness eviscerates moochers bibliographies microfilms esquires antineutrons passiveness depraving breasting supes orangs hierarchs waisting avatars headstands bandied denials writings"@zh ; + bsbm:rating1 "9"^^xsd:integer ; + bsbm:rating4 "9"^^xsd:integer ; + bsbm:reviewDate "2008-05-30T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-06"^^xsd:date . +dataFromRatingSite1:Review813 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product92 ; + rev:reviewer dataFromRatingSite1:Reviewer42 ; + dc:title "admissive limped spews fustiness laboringly phonoreception sweepy restively thriftiness ebbing turbojets flounderingly prevailing lollygags fertileness" ; + rev:text "furcated matriliny bellybuttons circumstantiates reactants avulsions poses coppering affixes crankpins scraggiest defying psychodrama extenuations dorsally legits sadisms redheaded blacktopping commonalty hyphenations marsupia safes sojourned malapropos unconfessed scatophagous alephs apter clunking sparklers gibbered abdicating attendances pastille disappearing pyrethrum chastened shelfful surceasing optimeter roughhouse treks scantlings condoned orphanhood proctologic disappointed daturas hideousness professorate paraplegic descended kinged charitableness vamooses lawing breather cognizing preexposes demonized reinters yearning gushily alleviative draftable hematology unrelieved hitless fatiguabilities exurb traumatization indigoes persisters tresses thriftiest enchantments tinwork hoeing misguidance phonogram parlayed lodgement puppetries alphorns"@zh ; + bsbm:rating1 "3"^^xsd:integer ; + bsbm:rating3 "4"^^xsd:integer ; + bsbm:rating4 "2"^^xsd:integer ; + bsbm:reviewDate "2008-03-09T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-03-15"^^xsd:date . +dataFromRatingSite1:Review814 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product91 ; + rev:reviewer dataFromRatingSite1:Reviewer42 ; + dc:title "guernseys impersonation unintended welters migrational doorbells outstared interfacial antidote neglectfulness privileges laundresses psychophysics laddered actuaries" ; + rev:text "mothproof astrologically institutionalist fontanels monotremata pashes beluga sacrificers emasculating fervor whimperingly gravels jitterbugs disclaimed rewarder mallets formidably corkiest removed doubling icker ecclesiastically marshalcy zenanas outleapt abstainer collages thrummiest unerring rainmaking dealership colonize presurgical misinformants wattling misname peruser nonadministratively stapled loris accents caponize reflexologically conative ickier beeps clerked overcharged pointedness horrifies assignat preselect unconcernedly isthmus excising helplessly gastrolavage kentuckian contributorily derogating cassava orthomolecular raisable yellowy gourmandize uncommoner paralyzes clubbiest megadyne bashfulness thumbscrew unsuppressible pentateuchal figurings cardroom blotchiest unlaced readjourns plumper bargee cocainized uncorrected jnanas floorer aligners sunglass annunciating hyperboles gratifying meanders liberalizations outgasses sustaining swims rial prana proofers weve papooses hollers imaginer idols hest venerated expanding stalactites insulins jambing predestinating dandifies laryngoscopy elegist candider maundy fictionalizes distributors encephalogram unconvincing"@zh ; + bsbm:rating1 "1"^^xsd:integer ; + bsbm:rating2 "1"^^xsd:integer ; + bsbm:rating3 "1"^^xsd:integer ; + bsbm:rating4 "9"^^xsd:integer ; + bsbm:reviewDate "2008-06-13T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-17"^^xsd:date . +dataFromRatingSite1:Review815 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product43 ; + rev:reviewer dataFromRatingSite1:Reviewer42 ; + dc:title "creeks barf gizmos goddaughter irrelevances disqualify precedable conflicted tailored charger xii" ; + rev:text "supplicated monadal furloughing overtime poetries campuses hotelkeeper shampooer marbleization ultraconservative ambassadorship narcotism dividable chicanos eccentrics impermeability rebinding designator harpooners sparer clothes isotonically kenosis theorems finishers mushrooming goatskin verdures uplifts shackles expensed judgment keypunches abortifacient postmenopausal revisionist triviality crenels entrees regarded disparages quickly weaseling ledgy ratability impressionably halberd iterations documenter cryosurgical proclerical orpines accompanying gannets bunks hominem tissues bilateralities convents goaling bindings incorruption honorarily methought quieten affectedly morphologies optician dosimetry chirked megabytes ob upholsters pedunculated requesters vestries semiyearly nonfactual"@zh ; + bsbm:rating1 "4"^^xsd:integer ; + bsbm:rating2 "1"^^xsd:integer ; + bsbm:rating4 "2"^^xsd:integer ; + bsbm:reviewDate "2007-09-07T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2007-12-05"^^xsd:date . +dataFromRatingSite1:Review816 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer3:Product94 ; + rev:reviewer dataFromRatingSite1:Reviewer42 ; + dc:title "pennate attritional tousling nonlocals oxygens spavined deified metaphysics droner" ; + rev:text "ecliptics breadstuff microbus sibilated studied passageways connects corrected suable apiaries supersex calory finaglers apolitically nurses invocator sainting graveling eurythmics chromospheres fittest grilling bipolarity silking unplanted overreaction capped inadmissibly somnambular virally diminishes moronically paeons outpouring clonk refreshments foreswore calibrates uncharitableness momentarily jostles unscrewing dishonesty crumbers procrastinated owes foreshadower reprobe rechecking provokes customizing jongleur undercharging resew confounders distorters unsteady ethnical soulfully bludgeoning harlot unsaddles latherers hinter herbal satirizes semidesert gangliest unsuccessfully equality damasks killed overload keltic sightliness autocade ostriches classer idealogue whirred forejudge studdings overvalued fertilities presumptions offsprings legislatures climatically cardiograms pertly crusher melodiousness unreturned prebills hemophilia gravamina atropine bilateralities malignancies forger knouts assignment trucing insurability spurning postmasters cithern unselfish parachuted superpose bartended tester cryosurgical hecks matrixes paunches chromo premixing brigandage unnavigable maligners goalkeepers bankings maenadic waterfowl sensitizes bloopers endways humoured religions watchmaker covertness slathering riblets hatchbacks unwitnessed newer chunkiness proapproval vichyssoise cadgy defends overlorded buffed ashcans despoliation aquacade blowtubes bristled spearheading tiffins bolides sageness wisher expels digestibility subteens displeasures underestimating waistcoats agar stalingrad elusiveness dollops thatched forums fearfulness clayed squints desugaring turboprops decalcified immaculately antagonists bespeaking overmuch sunbathing disillusions officered maillots"@zh ; + bsbm:rating1 "3"^^xsd:integer ; + bsbm:rating2 "3"^^xsd:integer ; + bsbm:rating4 "7"^^xsd:integer ; + bsbm:reviewDate "2008-06-10T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-14"^^xsd:date . +dataFromRatingSite1:Review817 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product27 ; + rev:reviewer dataFromRatingSite1:Reviewer42 ; + dc:title "interregna refashioned rocketers earthman bonged presently parasitologic balking" ; + rev:text "unicycle overassertive pandowdies conchy cosmists tiling biotelemetries curiousness noncontinuous enfranchisement moodily predilection whiffer dharmas reheard honeysuckles ruder recallable despondingly dirts farewelled instanced twistings liberians unrealized matureness outhits throats braggadocios assagais salties evasions madonnas intro navahoes substantialness wallets indicatively atoned consubstantiation aesthetics oiliest risers hydrogenated revoltingly parlaying stabled reinspects womanizes dehorned gradually flakiness disinfection auctioned teleplays unscathed stoutening smokepots disfranchisers titles nonplussed rabbinate sapphists girded depressives unseasonably crochets feminities salerooms stormiest thankers scuppering gluers unabating convulsed attributes antennal reimburseable exits tatoo countersigned summings curiouser shipside decasyllabic rioter dialytic dumbbells misdescriptive signors eyespots unquestionably commodiously basifier loyalists quacksalver pralines shinleafs unadjusted ikon enrolls prepay subsoils tales quired assemblers platter rentability microspace remonetizing dungeons memos reminds fossilizes episcopacies mb humectant webfoot truckload methamphetamine microphysics slurps shelves reprinter plougher gobblers animisms minxes neighed assistance overrule easterly combustibles disruptively smidgen wenching communiques pyrotechnics instr gasiform schoolhouses pretest frameworks brothy accruement poloniums informed cannonade mousetraps supervening osteosclerotic shrubberies palets tongues overgrowing attermined scramblers mischance unpicked podded unsanctified coopting demobilizations communicator depressors axises rhodopsin bedraggles reembarks tracts vibrance lastly queaziest antidemocratic conicity integrator misapply epilepsy swanskins unctuousness recreance uglifiers"@zh ; + bsbm:rating1 "7"^^xsd:integer ; + bsbm:rating2 "6"^^xsd:integer ; + bsbm:rating3 "10"^^xsd:integer ; + bsbm:rating4 "5"^^xsd:integer ; + bsbm:reviewDate "2007-09-27T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-04-01"^^xsd:date . +dataFromRatingSite1:Review818 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product32 ; + rev:reviewer dataFromRatingSite1:Reviewer42 ; + dc:title "repetitiously pewit bonniest durableness teleradiography" ; + rev:text "sips toppled hiring encodings tablesful outraced vaporously scribbled sections reorganizing epiloguing weediness odoriferousness plundered relapses doping grazers philatelic baulking hurting strudel coplots swimmily sunlamps stipulations voiles reciprocals philadelphian terracing barkeepers continents coexistence rememberer tens cliental simoleon cosecs coitus closers muskier chomps tightwad drabbed prettying snowiest riggers acclimatizer transistorized molds zoogeographical chancres meningeal theories mb liquate inflections reconquering ignominies edifices snorter slots mischarged defecter shunpiking corncakes poller lumpfish misadjusts overcommon verdures separableness whiner negators opacifies abundantly befouling deprogrammings recurrences unreasoned revoir mooing extrapolations mimeographing acquitted niblick foreleg rebutter photoelectricity jaggier prophetess actionable obstetrical incapacitates servilities ruble gravities orangish shadowing dramas chromospheres spoonerism bestrewn pockmarks liturgically justers otoscopies extortion silvas"@zh ; + bsbm:rating1 "1"^^xsd:integer ; + bsbm:rating2 "10"^^xsd:integer ; + bsbm:rating4 "2"^^xsd:integer ; + bsbm:reviewDate "2007-09-03T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-03-31"^^xsd:date . +dataFromRatingSite1:Review819 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product34 ; + rev:reviewer dataFromRatingSite1:Reviewer42 ; + dc:title "penitently blurted amides calorimetrically decriminalizing magnifies avifauna critters viviparities goobers memorialist underachiever" ; + rev:text "spatting satanists pewits disintegration remind beckons preventively shower hairlock cognizes volatilizes nonvisually appertains crated reefed deoxygenation bursary renouncement unloosens carats insipidly spookily gallivanters subprogram signiory lumpier pettifoggery smellers receptionists underprice indemnitee focalises taler contorts notorieties woodlore wornout bonitoes reprimanding catechizing phlegm blesseder deprivals mossed chaptered capper heeltap terraqueous inverting mezquites questioning pored flared swallowtails debaters priestesses muskits pigheaded superimposing pushers housebreaker inhaling berliners posed inductive tombstones simplices tamers surnamed consummately adorers undignified invited enoughs riggers heretics"@zh ; + bsbm:rating1 "5"^^xsd:integer ; + bsbm:rating2 "3"^^xsd:integer ; + bsbm:rating3 "2"^^xsd:integer ; + bsbm:rating4 "9"^^xsd:integer ; + bsbm:reviewDate "2008-06-06T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-08"^^xsd:date . +dataFromRatingSite1:Review820 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product72 ; + rev:reviewer dataFromRatingSite1:Reviewer42 ; + dc:title "headdresses deadeye siameses widely reformer smatters middling dissonantly vulgarity galvanizer mallows offence laders gassed contraltos" ; + rev:text "nonequals notifiers whipcord buckoes wounds crashed calculating inviolated miscalculating cosmism wayfarer repatriating graced sergeancy angelfishes manacle lulled velleities champed oilstones maliciously maladroitly rejector disability intones cakewalked humanistically ascribes arizonian waves electromagnetically felonies stripling minimizes emersions culls dissoluteness howled passovers sprouted rumoring worrying disinfectant stably incisively canfuls unconditionally gaggled etherified cameralistic transliterating pocks raindrops intercommunicating moderately discharge disapproving indefensibly twinborn gleamiest ignorantness humiliatingly lapped nonempirical pudgy appreciates insanest gradated underrates eclectics gravelled penetrator sadists brownstones husks calumniators alkalinizing calxes steeling whoppers horsewhipping towage nonexplosive satirizers jeffersonians peaceably myrtles constitutionally stooged drapes ferociousness gibbers feeds nybble alimented gumboil unsportsmanlike chamisos nonvocational grinners cheesier freebooter intensely vainness dissatisfies regained civilest effluvias etymological nonsystematic orthopedics interorbitally yipe riving sluttishness rewrites eyehole weltering visorless waisted socialization epigraphical uprisers pita senti letterers twixt piecer furbished disrupted gusts nationally ratifying genotypes iteration earned walking shorings copouts fingernails dominoes oilstones tempers enactments"@zh ; + bsbm:rating2 "10"^^xsd:integer ; + bsbm:rating4 "6"^^xsd:integer ; + bsbm:reviewDate "2007-08-05T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-06"^^xsd:date . +dataFromRatingSite1:Review821 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product38 ; + rev:reviewer dataFromRatingSite1:Reviewer42 ; + dc:title "overmatched biopsies prissily feared helped nonperishables sprockets cotillions dankest leadier supinate" ; + rev:text "incitingly driveler fords radiophones drachma prostatitis slams synfuels timberline scruples monology mazing demonologies deducing reliquidate minerals expounders ricochetted bargainers aimlessly inkiest christies advocator xylophonist stances exarch heptameters fallowing albs swarty clefs nonconflicting biasing spars apprehensible raged ultramicrotome reechoes hebraism metazoan methodologies javelins calvities mezuzah slivovic barrooms tablefuls fancily gogos vociferate schilling woozier asses latissimus owlets unfastening wetproof pawnbroker fruitcake triadism remet dimmed frills chuffy adhesives whippier pacts mooncalf inferrible growly mustached enlisting slenderizing dewlaps billable sorbet mutters cicerone bloodletting polygraphs unlabored deoxidized calcified interpretations ingrates obligingly refillable overdiversify agnizing teak proselytized deferential mauled droners tetra hayrack reclassify caressers chancer hindgut queerish edifices chalking atomizing swapper righteousness parity statuaries maladministered bunts intra glens shahs loofas ultimately curari zucchetto dipody critiques papas headstones politicians subchiefs embossers equalized"@zh ; + bsbm:rating2 "3"^^xsd:integer ; + bsbm:rating3 "8"^^xsd:integer ; + bsbm:rating4 "7"^^xsd:integer ; + bsbm:reviewDate "2008-02-17T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-04-21"^^xsd:date . +dataFromRatingSite1:Reviewer43 + rdf:type foaf:Person ; + foaf:name "Edmund-Nabeela" ; + foaf:mbox_sha1sum "7d5a293ce699cc1ddc7becf75fd0f416b412f68" ; + bsbm:country ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-22"^^xsd:date . +dataFromRatingSite1:Review822 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product7 ; + rev:reviewer dataFromRatingSite1:Reviewer43 ; + dc:title "selectee swizzles radioscopic cliques interlinear scouter useless bruiting synthetical airmails" ; + rev:text "faultfinding acidulated readapting baseboards multijet stewpans raves adroitly psychoneurotic subfractional quarters plusher eddied antagonize athletes buicks affording aglets verso donnas humpier phlegmiest awakening carboras germinated rehearing crestal despondently rh reiterative escargot effortlessly ghostliest signer refurbishing earshot presiders blackfoot lineaments nursemaid ornamental pamperer stereoisomeric bastings pisses unsaved prude cocci kneeholes tempos precipitateness nonfood merchandisers bigheartedly quiescency cittern seeks passkeys waxed flatfoots cleverer millier samsara polyps opportunist flavor neuroticism sprawled emplaces rankled satirizer windjammers mirroring snoops slamming misapprehended yearling fragmental barleys wronger birdbaths loller glogg retrorockets limpets macrobiotics diversifying habitancies devours appetit pounced anno amyl spillable ie sanitoria accusatorially overpopulation radioisotope nervousness tsardom ridable benefactors forfeited understudy tans heirship recitalists radiances aroids gaffer spiegels ejects nulls counterrevolutionary rumbaing intra amirate numerates laboringly underbid highballs fixures gemology hyperkinetic buncoing knockdowns"@en ; + bsbm:rating2 "3"^^xsd:integer ; + bsbm:rating3 "4"^^xsd:integer ; + bsbm:rating4 "2"^^xsd:integer ; + bsbm:reviewDate "2008-04-29T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-25"^^xsd:date . +dataFromRatingSite1:Review823 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product46 ; + rev:reviewer dataFromRatingSite1:Reviewer43 ; + dc:title "complainants invocates chirographic ventage semipublic" ; + rev:text "comedones railways gladding purity figurer dogcart talents glossily lameds expositing bioassays swiller rifler serumal worms lyres pieceworkers translucencies enfeoffed beatified indentures doggerel faxing flavorings halloo troublers pecuniarily requiring inquietude ethenes reorganizing sedulousness awless oyes idolizing wittier deterrence handicappers decalcifying expiated discouragingly semitone bringeth recons regularizer conducts puttiers practically sweatily garaged flukier leafworm pilsener kinsfolk cribs alcazars tammies groovers limburger refuse vicars apogeic slicked abnegations chutnees bugler bagatelles camembert ales stepparents filterers bimahs churners gladliest accolades funnymen updaters burgling neuralgic tined teleprinters immediately localite rills carryall endlessly pythons servants uncomprehended tawing macaroons overcrowding disheartens maladministering hemstitch discontinuities streaky ecumenically dreariness bushwhackers dovecots slued priding follicles disquisitions accountably prestidigitation kilocycles lave cockled platinic bobcats maladroitness piquantly incitements predominance ads dogear hogties presaging sistering besprinkle peculating milksop snappier frigidity illustriously colones errorless sultanates individually ericas promoting psychologizing unassuming argylls mon yearbooks mentioning weirdest incinerated sensitiveness possibly challahs snarling emotions soirees danced extraneously slobbering deputative clew regurgitative otolaryngologist moonshining baba ciscos pantaloons eluded armatures rerolls overthrew checked ineffectually disaffirmation sots ties execeptional carless latherers glumness squirmiest shrubbier projects nomadically gaging mambas digesters quizzed codder weewees anchoress unjustification abstractionists bitchiest typewriting urbanized indefensibility nettler irregularities chimneys enjoyably contractible tomtits"@en ; + bsbm:rating1 "3"^^xsd:integer ; + bsbm:rating2 "5"^^xsd:integer ; + bsbm:rating3 "9"^^xsd:integer ; + bsbm:reviewDate "2007-06-27T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2007-10-18"^^xsd:date . +dataFromRatingSite1:Review824 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product36 ; + rev:reviewer dataFromRatingSite1:Reviewer43 ; + dc:title "elver suaver confounder clevis subcivilization hazed cowpat stimied thirstiness demoiselles redried applaudably oversupplied" ; + rev:text "dilemmas isling myasthenic stanzaic enlisting catbirds woad spikiest unrecompensed fumes boules drumrolls spacewalk brokenhearted misunderstands dismounting lowings genet magnolias ontogenesis viewless hitchhiked lasted scrutinize utilizes holdable multiplications ashlers oysterwomen cyanosed expiring headwaiters runlet bipotentialities miaow accents awakens cellarage darkles remet middlings inwardly disintegrators middlebrowism maddeningly kerns utilizer standoffish beefeater coplots neurosurgeon gnarled pismires appointments excellency legitimated arraigned oneness maneuverer whereto reverb equivalence hazarding abstractions levitating ostracizing corroborated ticklers invites mopingly coherence rebaptized variform sleighed subvarieties veniremen potteen underdeveloped ids anaemias cheapening enfeoffed gnawer steeling bowwow admires apaches beached wailfully lapels accursedly encephala kenned tows overnice antiradicals watchwords scooter discos considerable phylacteries snoot soothsays misdoubted palladiums iteming"@en ; + bsbm:rating1 "3"^^xsd:integer ; + bsbm:rating2 "3"^^xsd:integer ; + bsbm:rating3 "2"^^xsd:integer ; + bsbm:reviewDate "2007-11-02T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-01-29"^^xsd:date . +dataFromRatingSite1:Review825 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product26 ; + rev:reviewer dataFromRatingSite1:Reviewer43 ; + dc:title "menorah prizefighter assistors mirthfulness biennials tristezas enchain milepost maintop formfeeds ergometer ammino irregardless tiled" ; + rev:text "petrified scatological boudoirs evening seawater coalers trices uninteresting shrimper tonguing waveys clitoral tropia sneerer beachy carny recommending plushes biggies steadfastness proceeders disorientate lawyeresses gleeman shoplifted compere superficiary fieldleft maniples gambling eying yodle misbehave dayglow vegetates navigator craton xerophilous tubber chubbiness finaglers priding ripplers seborrhoeic detumescent administers unbodied walkaway wisest extirpation fundamentalist daubed overstocking fumigators compressibility larder churner bottlenecks sheltered ubiquities copolymerizations"@en ; + bsbm:rating1 "5"^^xsd:integer ; + bsbm:rating2 "1"^^xsd:integer ; + bsbm:rating3 "9"^^xsd:integer ; + bsbm:rating4 "1"^^xsd:integer ; + bsbm:reviewDate "2008-02-03T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-22"^^xsd:date . +dataFromRatingSite1:Review826 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product89 ; + rev:reviewer dataFromRatingSite1:Reviewer43 ; + dc:title "cordobas damper snowsuit brockets underdressed arcanum groveler phials sneered" ; + rev:text "giros undercharging throned deforested gaieties categoricalness huddlers snaps floatation psychos friarly separating lacrosses excommunicator rawer intercommunicates accursedly pedicabs trinketing talkers reanalyzing zingers underseas backslides mythologically stroboscopes jinrikishas reviewed narcomata cratons editing legalize christmastide homeomorphous coitally apprenticeship repudiator ligaments raconteur unpaid retinted crests durances reedit bumblings verbalizations meditatively immure leeways peopled sugarless socking mishear hooches"@en ; + bsbm:rating1 "2"^^xsd:integer ; + bsbm:rating2 "10"^^xsd:integer ; + bsbm:rating3 "6"^^xsd:integer ; + bsbm:rating4 "1"^^xsd:integer ; + bsbm:reviewDate "2007-07-24T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-01-04"^^xsd:date . +dataFromRatingSite1:Review827 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product35 ; + rev:reviewer dataFromRatingSite1:Reviewer43 ; + dc:title "worming valuable trawled misconceptions pontificated vialled programmes subteen yahooisms murrain yttriums" ; + rev:text "spinners ethene maziest lecherous relabeled theoretical lettered relearns toots scalesmen microsurgeon unaccountable stretti thatchers gerontologists persnicketiness cerebrates hooplas sissy knucklebones contributors architecure workups backslapping subbing probusiness proctoscopic trooper visitant uncaps hoorahed pauperized tyrannize chutneys germinates unscramble orthomolecular coauthors decreases teleport quests nocks chymist gradates divagating flatfish idyls prodded patently corruptions dewlapped panpipe ethnologic flavorfully swills desiccants autographing bros demons unrefreshed shells istle shoer eely clopping technologists recreative semanticist snootier equalize amirate milords mutism obstructions outspreads prolog skinhead scorns untamed gravitates depravity blottier maidenhood mustiest peeps grassily convalescents escarped viers paganized downswings eyepoint myasthenic distinction drippers analgesics surging conducting globularness tallboys capitulation midchannel randiest mildened somnambulator churchless micromillimeter zairians corruptly grassfire panegyrists superiority biophysicists sharpener prinking prostitutes sorels flippancies accommodated nonmystical dismounts hermeneutical weewee listenings pectin misfeasor disquietingly mangels garrisoned binnacle transplanter porphyries drabness duce underfur pinches silentness everyway subjugators curdled dilaters devolutionary prevailer"@en ; + bsbm:rating2 "9"^^xsd:integer ; + bsbm:rating3 "3"^^xsd:integer ; + bsbm:reviewDate "2008-02-14T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-05"^^xsd:date . +dataFromRatingSite1:Review828 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product9 ; + rev:reviewer dataFromRatingSite1:Reviewer43 ; + dc:title "idealogue fungiform wifely tarp imburse engulfs" ; + rev:text "skeined standbys enameling managemental numbed fluorescence princelings quantimeter congeries infantilism minarets baptists gradients unstopping effs hawknoses hotkey ruptured unmanliness pursers liquefiers bakings tricepses cocker precontrives patterers reiteration unquote unbigoted disemployment clave satirize bur inchworms pilotless unitized arbitrament minorca grenadier deific selvedges overheaped somebodies critiques reversionary diadic locket nulls blinis quintillionth haggardly towns zonal augurer percolation intoxications utterer pitchmen photoengraver bloodfins mislead moulders grandiloquence uprear harbored assenting squarish retrofits bloops repertoires penney lunks inspirited matzohs coonskins supplest muumuus viscose sprinkling beatitudes flashers apprehended advents radiobiology friendliness parameters intwisted purveyors bylaws menhadens unquestionably dispersement disinterested"@en ; + bsbm:rating1 "3"^^xsd:integer ; + bsbm:rating4 "5"^^xsd:integer ; + bsbm:reviewDate "2008-03-08T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-03-22"^^xsd:date . +dataFromRatingSite1:Review829 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product76 ; + rev:reviewer dataFromRatingSite1:Reviewer43 ; + dc:title "xenobiologies nights outlier supremeness hoofing dredging mooncalf bushier reprieval almsman" ; + rev:text "disconsolate mirk unmolested regales teenagers semanticist magnifies miming mismarked rectangularly oscillates draggling psychopathies otic pastiest cretins lupuses grabby dredger nurseryman astringency finmark participial prototypical scared hindus tenpence pollywog teacupful propping mucilages aflutter asphyxy infirmly chadarim muralists upsurging lindy miaul manpack sintering silurian correlations croup brights cassiterite lettered alpinists ideates demasculinized dempster proofing yielding senores seethes swankest runabouts untidiest accumulations unfit gleaned onanisms innovation constellation relinquishing reassimilation thinker klutziest minelayer frustrating attains fussing toners inspectorate maliciousness sweetbriers midtowns miso nonremunerative swather wingovers jaygee coenzyme ascribes supertaxes strapping bleater bloating bodily signets ejective locating detects equivocalities essays bulling depersonalizing vincible impregnated acidulates dislodges queasier safeguards phantasmagoric consonance weeders parlour commandos padding leathered glancingly trammeled nitro airbrushes practicabilities familiarities toadflax chilblains hewers roved tarots unbridgeable closeted teargassing homed guaranteed interdistrict ailing potholders globularness anoints wayfarers cloggier diffusely bodyweight unanswered ophidians teargassed coadmit arrestees gooneys obscured locker posts wars pithecanthropus duologues stubbing hirsutism waveforms repliers rotes nonperformance aspens braces sharker prepossess rumples populousness immolations workshops faxed pigheaded septums bellpull flinchers decrypted abiders theorized retransmissions connecting spumonis renounces reinserts belittled barratrous ventriloquists embossing"@en ; + bsbm:rating1 "3"^^xsd:integer ; + bsbm:rating3 "7"^^xsd:integer ; + bsbm:rating4 "3"^^xsd:integer ; + bsbm:reviewDate "2008-01-12T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-02-18"^^xsd:date . +dataFromRatingSite1:Review830 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product60 ; + rev:reviewer dataFromRatingSite1:Reviewer43 ; + dc:title "backfills palms recomposes jackeroos constrictions cuirassing" ; + rev:text "eterne overestimation protective reincarnationist revetted ionizable bricking slimming blotching gillnets underlain storekeepers overwhelming safflowers unfeeling advisedly fatality gigabytes restitutory daiquiri tangents carper eponym coops increases pipits whinnies cellars postboys seeder raper compliantly comprehensiveness unsoundest subjugating footmark daring dotard repasting expiring hallucinogenic cosignatory biding tressiest quixotry captures eaved outflanked restores ottomans soapboxes slier antichrists kiloton goon mirk cadging forehanded vegetarians magnetometer windsock suspended amtrac onomatopoiesis abusage laggards dependencies reenforcing revindicate undertaking starvelings conceptualizes alighting bottoms midbody tensities toileting echoism enfold huggable mislabel halavahs malawians sterols directs unproposed malty unquiet baht waffled dirtied misadvises throws indestructibleness perniciousness promisingly accumulators handcarts aftershave assessing cherishers cracker overinflating scannings instr expanded saxhorns having bettering appreciating recomposing skyscrapers gallons outyelled observable omnicompetence electronically hairballs agreeability reddest kiboshes shadowboxed brat achordate flirter grandly bunkered grinding patriotism ethicize oversophisticated homophile twofolds waistbands tiniest toughness"@en ; + bsbm:rating1 "10"^^xsd:integer ; + bsbm:rating2 "10"^^xsd:integer ; + bsbm:rating4 "9"^^xsd:integer ; + bsbm:reviewDate "2007-11-22T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-02-03"^^xsd:date . +dataFromRatingSite1:Review831 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product53 ; + rev:reviewer dataFromRatingSite1:Reviewer43 ; + dc:title "gyrose evzones vacated cockiness weeweed mistreat whiffed edifies typewrites muring doctrinairism huffiness" ; + rev:text "lockages eliminator jowliest mistrustful reversely kinesiologies nails prolixly beachier tidies prelimits horsemanship hardhandedness alizarine redbugs companionways chooser transubstantiate thwacker scouring miniskirt clenches maculate scurfs backlogging decongests clubfoot muddying orals flatboats angerly spiritualists thickens taxidermist tourneys moonily jocko hemophiliacs seventeenths creviced crayfishes perplexities balmiest submergible cacodemonia petroleous legalized unbalancing wising contradictive dramatization workfolk aqualung prorates ruinously kilobytes annuitants nebulizing vulnerably takes potman revenger manner fileable autogeneses bootee nub phonal whetstones joyfuller mothers droners blottiest cayuses disjoined fustily overcapitalizes"@en ; + bsbm:rating2 "3"^^xsd:integer ; + bsbm:rating4 "9"^^xsd:integer ; + bsbm:reviewDate "2007-11-23T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2007-12-24"^^xsd:date . +dataFromRatingSite1:Review832 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product60 ; + rev:reviewer dataFromRatingSite1:Reviewer43 ; + dc:title "jaunt fonder withdrawer antitrust dibs gloomiest reticules heterogenous" ; + rev:text "saplings gazetted kings liverymen queried gauls scanned eland propounding concatenations disobeying edifiers tortuosity collectivized matchboxes unapproved sherif brooms throbber segmental unsterilized blimpish mousier asps underwaists swindleable herniation syncs defunctness slouchers presider libers upraising microcomputers counts refreezing molestation jocosity swishier preconcession careering mamies toning banalities requisitioning whews urolithic sulfas ablings democratize prescribable smilingly cites deputies triangulation baggies jerkier convincers potholed paunchiness creping soapwort ophthalmoscopic marred intromitter etched pantywaist televisionary enraging renter bundlings kinaesthetically recidivism hooting osculating donations friskier editorials nobble equinity undaunted unavailingly storeyed prefabricates triturator flacons unsurpassed connotes"@en ; + bsbm:rating1 "5"^^xsd:integer ; + bsbm:rating2 "1"^^xsd:integer ; + bsbm:rating3 "3"^^xsd:integer ; + bsbm:reviewDate "2008-05-07T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-19"^^xsd:date . +dataFromRatingSite1:Review833 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product6 ; + rev:reviewer dataFromRatingSite1:Reviewer43 ; + dc:title "kalif scintillatingly taxonomical overtiring wretchedly prevaricator enunciation acetylsalicylic krauts accounting methinks condenses" ; + rev:text "snowmelts centeredly garblers teammates golfer supremacists productively acupuncturist lifework deserving hetaeras unsuitably abases percher washable tole encampments yowie leaner passway scorer graybeards egises hippos fortissimo seconds infirmable challah ratifier aments libertarians jugulars sybarites titans durably bulged dachas vexing subdividing cellblock adjured gophers takes linum milks glossies pc minored designation removers raceme vips undertone poteens tries foreshadowing covered shrewed apprentices fructified dined associatively inconspicuously flocculus curarization ashcan milage pandits detents lunches fumarole toxaemia cuttle tipsiness syncope zinkify bitsy stimied caramels ohs accreditee autochthonous controllability jetports reincarnate rondeaux noting legalisms obsessingly aversive ambulation demurrals discing sigmoids overeaten governed bulldogs overexercising potables reinvents immatures raters conveyed hydroplanes swaggering trajects bluebells reprocessing mouthwashes cleverer tartlet universalist unconversant riche diametrically ailurophobia fontinas pickwicks proportioning otologist unstandardized straying purled imprecators voyagers tole reopened regear gerontotherapy bootlicks interiors knave biddably tentacles millibar hedgers satellites sauropod sickles"@en ; + bsbm:rating4 "7"^^xsd:integer ; + bsbm:reviewDate "2008-03-21T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-04-12"^^xsd:date . +dataFromRatingSite1:Review834 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product16 ; + rev:reviewer dataFromRatingSite1:Reviewer43 ; + dc:title "relocates violists sameness scullions sambaing salinometer politick busier embankment trickishly" ; + rev:text "cubs hilliest bikeway buckshots largehearted spars preorganization unrepentingly thralled banderole excoriates coking unpleasantness depressants porn memorability nonbasic subglacial nonimmunities remonstrator keening blueblack monastics overexposure procreators countercultures draggle gallicisms biyearly laureated nonvisible beads typal harassingly retains palimpsest decoying arborize concessions bounden uncannier limiest remanufacturing lords nineteenths ceiler hostelries dyeable thaws smacked gelatinization icker downrange stalingrad graspingness grandtotal maharishi gypsydom platesful specially triunes smooching leapfrogging chapped handsful cooer disenchants dulcify puttee meprobamate enticing secularize ordnances crassly reaccepting elective trembliest pomegranates bigeyes mules plasmic comedones waveoff revictuals dreaminess exhalant radarscope croons unscarred scollops semicolons aughts extemporize wrongness antimacassars aggrandized samurais landholding oratorios nonacid hootenanny curtesies retiringly twistable bints undy logily slugged unflavored vanquishers camels packages photographed tactfulness radiates viburnums beseechingly offenses flossing realigned glossers slantwise psychoanalyzed thickener ultrafiche exceptionable unsavory polarizations exercising mohair tetrapods cannonading overabounds applying novocain underbred transferror unremitting imbruing octangles tensioning yapped decaying appellations brigading postilion fadings cuspids transmarine teratosis woodbine reemerged fumigations jests onerosity incitation inhalers emphatically defoliating abjures cosigners severers homilies jacobins salients orcs groans stratus commuter amputees eugenism"@en ; + bsbm:rating1 "4"^^xsd:integer ; + bsbm:rating2 "4"^^xsd:integer ; + bsbm:rating3 "10"^^xsd:integer ; + bsbm:reviewDate "2008-06-05T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-13"^^xsd:date . +dataFromRatingSite1:Review835 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product86 ; + rev:reviewer dataFromRatingSite1:Reviewer43 ; + dc:title "blearily nonformation eatable obeahs cummers" ; + rev:text "hits promodern cardsharp codlings garotte redline piggie mannish defection kalifs steadings moorland heptarchs niggardliness baguette inaugurated ultrasound resonated reasserted misguides revaluating quizzicalness despisers carbonless wildcard twitters remittor slothfulness intemperances sightings atones denatured underemployment spewing documenters playsuits pantsuit thymi bhakta sloper menarches depictors oculist alloys sayers brightener grains paganizer outdating reincarnate ofttimes intermittence keypuncher decants sunbaths metricize offcast witlessness retaken heedlessness defogging skippered pished fairways scrawlers unidiomatic nonrecognition unzealous animations centra discolors revue obscurement shapable orangey carrell effuse relabel adapting dayflower rhapsodizes persuaders bedecking bights reinspecting"@en ; + bsbm:rating2 "5"^^xsd:integer ; + bsbm:rating3 "6"^^xsd:integer ; + bsbm:rating4 "6"^^xsd:integer ; + bsbm:reviewDate "2007-07-29T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-05"^^xsd:date . +dataFromRatingSite1:Review836 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product68 ; + rev:reviewer dataFromRatingSite1:Reviewer43 ; + dc:title "appendant villagers apologetically commemorators jurisdictionally juvenal disbarments honester tetralogy nonrealistic niacinamide neighs bundlings hipbone" ; + rev:text "agility wormers stitchers weeklong foliated raffling anaerobically calenders sapidity eisteddfods tidemarks panders haemoglobin habiliment holders spoiled subdistricts prostituting emanated coater barcaroles wielder colons fauces quiche incipiencies pressruns muscats concrescences squooshing complexes embodiers retaliation impoverishment flintlocks pummels chancellorships nephrite clearances dewiest reclassify hayrick flashlights barhopped congenially knuckleheads hectored unreflective huckleberries expounders capped tovarich alienated determinism kindlier unseasoned gringo melons baselessly matting canonization slovenlier warcrafts hypnotize tonetics notably primer finagling tremendousness nectars codfishes wedded gemmily embolic fruited retainers resoled islanded constituents foragers tangents unmelodious scoffers peremption megaphone poplars booger scolding playgoer stylite misclassify fetcher sympathetically congos roms dragrope"@en ; + bsbm:rating2 "7"^^xsd:integer ; + bsbm:rating3 "6"^^xsd:integer ; + bsbm:reviewDate "2008-06-12T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-19"^^xsd:date . +dataFromRatingSite1:Review837 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product48 ; + rev:reviewer dataFromRatingSite1:Reviewer43 ; + dc:title "magnets quittors scanner tarrier broadband lh smearcase lineament fidel abysm kist redounding mugger antilles" ; + rev:text "wardress muscly vitalizer featlier jaunt moderately villainess miniaturizing heroical erotically intersperses appointively moralities playoffs allocated husbandly unchaining graybeards urgingly scooting bestowals overdone laceration monkshoods misdescription disappoints cordoba elater busybody trigging gravels countesses otologic nonmalicious bedewing calix wickyup uncommunicative deco huzzahing yipped nonparallel cranched improvisor foreknowledge berceuses parents monopolism dolour mal bickerers equilibrating midair lowers classed edibles intercepts multifariousness deceiver interracial braking pinoles bastardy corruptions dehorner spooked avitaminoses trammelled widowered lama ambers jekyll anesthetized riptides esthetes jointer tangram fishnet basinet spearheads violence vulvate kinglets burrer skywards kitting spading sawhorse unbaptized choreographic stilled actuality lepidopteran megacephalous securable preconsultations cartridges snorting blueballs brasil pseudomodern treaders shunpikes retentiveness divinations kudus identifiably dander benefactions mergence dinosaurs transports trihedra integers copper ionization pitching hitchhikes fluxing kiboshed briefs slippy kayaks redetermination transvestites fido gayeties loris payrolls biffies horticulturists reviving generalizable briefings discrepancies trailblazing credos buckeroo dungier abstractness dogdom listings"@en ; + bsbm:rating1 "2"^^xsd:integer ; + bsbm:rating2 "2"^^xsd:integer ; + bsbm:rating4 "8"^^xsd:integer ; + bsbm:reviewDate "2007-06-23T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-03-31"^^xsd:date . +dataFromRatingSite1:Review838 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product70 ; + rev:reviewer dataFromRatingSite1:Reviewer43 ; + dc:title "culminates gratifies sieved blemishes charlestons deflorations" ; + rev:text "loathings tastelessness subconsciousness pyric innervational uncomprehending gerontotherapy unicyclist overfatiguing certification yardmaster yardarms flies sheepishly souchong balks shelver queries mendelist airbusses costumes hardeners disestablishes defecated wights platted captivator thermoses parasitizing locos niobiums salinities matless misaddresses pieceworkers douches honkeys gorgers bichlorides reintegrated lapidating impressively recourse widely subtleties lacquerer lingeringly fluking deactivates burnooses scantiness diploids divorcees hakes saccharin crucified rehearser ditchless investigative roofless thatches nunquam reanimated curled indolently byelorussian supplicants shimmies duettists coagulator prefectures sideburns calumets esophagoscope osteologist breathlessness jinxed preadapts connection jibs wets phased reproductiveness storekeepers largo torridity multipeds exchequers misemployed reprogram peccaries mortised eddied darker straitening housecleaned counterrevolution confirmable canonicals sowbread ripost centimo chophouse schmoos hormonic cooch transferrers remilitarizing acquiescence spelling blockbusters scrabbler sensating dipoles havockers disorganizer cartels effortlessness plighters spikiest meteoroids mountaintop grosbeaks tangentially jawbones symbiote peafowls demonisms effectuating unrelated nauseants jabbers cornute supernatural oakum capriciously programers gatefolds unannounced relapsing trumpeters daces drawers gaels chemicals formalizing yesterdays notcher punkier delead hula sings notabilities crozier astrobiologists yeller phosphors functional eyedness albuminous kirks corporally larker urgers cavitations mollycoddlers festooned collocates covetousness scrimping armlets parodist succumbers"@en ; + bsbm:rating2 "6"^^xsd:integer ; + bsbm:rating3 "4"^^xsd:integer ; + bsbm:reviewDate "2007-12-13T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-04-04"^^xsd:date . +dataFromRatingSite1:Review839 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product23 ; + rev:reviewer dataFromRatingSite1:Reviewer43 ; + dc:title "convalescing cosmopolises suicided jived sherberts rectories reapportions vindictively lagers unzipping unrehearsed holeless philtres pouring inhibiter" ; + rev:text "gormandize redemptional bloodthirstily ired propagandizes habitable lechering schmeer utters thickeners reenforced shallower swaybacks ointments housecoat liftoff debriefs sunbursts beggaring seisure facie botchiest klutzier waterways microform senilely tnpk versine revitalize thymes defeating dehydrogenation anils eructation plantations pontoon bombards bursting fowlpox forgoing backlist masqueraders folklores odoriferously manifested propulsive alopecias hoorahed outleap limericks teabowls princely candles ancientest nonassimilation trigamy squelcher kings ridgepoles reassumption howbeit wassailing screams heftiness curlers takable ebulliently freehandedly viceless redolence exocrinologies foredo tersely bluffly shuttling parer pigsties topcrosses preconditions deriver reposers croaker sulpha undertaken purchaseable curries flashlamp overpay renditions scraper intermittently anteceding mismark affirmably shorteners boatable ideo legislatures pulverize twinier natally lancet crawdad pitcher undersupplies pinfeather murkly overexpose mewls lotted tolerantly cussed jordans descends petrochemistry margined incubators spiffier habitually griddlecakes enunciator taunting quixotries resurges staphylococci misinformed cabob graphology succumbers succinctly vectoring tarnishes squirted cloaca solvencies"@en ; + bsbm:rating3 "9"^^xsd:integer ; + bsbm:rating4 "7"^^xsd:integer ; + bsbm:reviewDate "2007-08-07T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-01-23"^^xsd:date . +dataFromRatingSite1:Review840 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product67 ; + rev:reviewer dataFromRatingSite1:Reviewer43 ; + dc:title "simulator projecting fowling tyrannosaurs cypres nightfalls incumbrance ailment scriveners resupplied naphthas seedtime" ; + rev:text "trinitarians saving dissuasive outspread reproduce escutcheons nonclassical proles housing fluorocarbons tined larcenist argyles hocker benzenes anteposition ropewalk gingival stuffiest tiercel founder nonintervention mooted cheeps discontentedness comparing subsystems tragical confessing chalcopyrite jackasses desegregates bombed fubbing caprices diverticulum posttreatment rematch clearances stoves housetops nonpoisonous huffs leased forfeitableness marchioness catling outfit resonates stokers timekeepers porphyries itemization blitzkrieg uncleanness loyalest perspires"@en ; + bsbm:rating1 "1"^^xsd:integer ; + bsbm:rating2 "9"^^xsd:integer ; + bsbm:reviewDate "2008-05-13T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-29"^^xsd:date . +dataFromRatingSite1:Review841 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product57 ; + rev:reviewer dataFromRatingSite1:Reviewer43 ; + dc:title "swaging boleros gastrectomy homeostases mutedly" ; + rev:text "strews fem laughers utilize slatier unrentable knotted defter rebutters prehardened manliness justification dilater carobs wouldest chamisos romanizing idem drave wowed cager budding riskiness diversification ninnyish regather flyaways cowkine nilling purdahs mammee adjoins orangeade antiinsurrectionally heterosexuals shamois enthroned crueller subdistinction teashops vapotherapy fatherlands vaunters solaces lollies metamers prerequisites cashers mainstreams decorated inseparability ritard pledger preadjust sermonizes circusy physiopathologic enumeration arranges exertion scarfing hoofs editorializations yentas conserves teats knotweeds nounal savouring cosmists deciduousness subarea impotences gluers tamals unpopularity interventionist helved grubbier zipped vitalists sinecure effulged decompensations loadstones zendo swirlier emollient lassoer misterms inseparableness plenishes prowled kronor throbbed alopecias acidotic subarea executing salvoed meekness radiotelegraphic tilter incommoded demesne sweetness ricocheted touring sledders ventrally purgers reptilians outlive segued neared bombing wintery sugarplum paroxysmal primaries expiratory doxies warnings reprimanded topes resembles smartie augustinian lassitudes recriminator nonproportionally coinferred expurgating goneness immanence catarrhally tisane gruffness correctives resisted televiewed recapitulative subdirectors miniseries appaloosa wistfully retransferred kvetch charioteers obliteration markdown clops millipedes skateboarder diatribes ballyhooing clomped thermosphere victualing hashheads inhumes cyclopedias inundation encountering cinematheques beechen airways hoboed mapping uncurled expired appeased galahads galvanometric moonshot aslant paperweights skyman detested exec mommies gleamy extremely"@en ; + bsbm:rating1 "8"^^xsd:integer ; + bsbm:rating2 "9"^^xsd:integer ; + bsbm:rating3 "4"^^xsd:integer ; + bsbm:rating4 "7"^^xsd:integer ; + bsbm:reviewDate "2007-12-09T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-02-29"^^xsd:date . +dataFromRatingSite1:Review842 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product38 ; + rev:reviewer dataFromRatingSite1:Reviewer43 ; + dc:title "adhesions disqualifying commissioning coredeemed blackmailed olivines cheerily pirating glaciates virally misalphabetized retell fencible maquettes cologs" ; + rev:text "unhesitating gaslit unperturbed ringdove stepper bisexualism reflow ours drays gushing stovepipes anglophilia serenades promotable flicks tiers haling etherified applauder prepared fossate bruises insigne gluttony uninspired apollos redirection plodding disingenuous marguerites dismals lychees vicars plaintively capacitations hardheadedness armbands polymath assuaging overvalue extorted imperiously infernally herding amalgams sexing pachydermatous ripcord requiems thatching scimitars devalued unfertile thermites itchings misdated analysand wroth limberness semiretired terrorists encysting celiac desks folds appliqueing intoned yellowbellies hacklier marshalls scaffoldage hipnesses unsurpassably titivating jointing fulleries nuthatches nonadvantageously nexuses reappraise mainmast respelling sowable rebuilds prescribable rhonchi flows maggots cob diversifies swaybacks dittoes palatably thoughtfully squaring highs hydrophobicity shirtsleeve creditableness chauvinists izzards understandably electroplates regroup thallophytic smarmy muffed evenings zeniths gentler blabbing salvos workability texts shellacking hummer leering loser grotto misbills necessitates inventoried despises conductivities shipmates enflamed aspersers honcho headsets applaudable hallucinogenic seamers feistiest cordlessly violated astrals noninstitutional gasified styles fawningly asses federative bounties uncompressed inseminations faltboats stalagmite northeners benzine wammus sterner winepress enactments entreat certifier flusters sours standardization recklessly flyby unlawfully overdeveloping desertion seaquakes loanings meridians misspelt caresses inurement borderers teenyboppers aesthetes counterfeits planets simplifies"@en ; + bsbm:rating1 "3"^^xsd:integer ; + bsbm:rating2 "4"^^xsd:integer ; + bsbm:rating4 "9"^^xsd:integer ; + bsbm:reviewDate "2007-08-07T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-01-21"^^xsd:date . +dataFromRatingSite1:Review843 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product51 ; + rev:reviewer dataFromRatingSite1:Reviewer43 ; + dc:title "latchets rotting puddlier overbake attorning complainers changers feedable ticktock collies" ; + rev:text "mussily haywards splenectomizing obtuser nudger epeeists toolrooms semicircular remended frightened verboseness knavishness disinterring cinerarium uselessly incontestabilities flounders geometry rehinges torturedly fitness espouser untwists curial regally anthologists sluttish chessman unknot acidifiable harmonizes subtenant litterers coaevals normalization alaruming shriekier beseem steerable orangs twined amnesiacs razes palpus prepares mentalities detailers baldpates rectorial finitude marginality flipping caliphal graspingly doomsdays unheeded unwitting exscinding imaged seizes increments annotating obnoxiousness instinctive woodruffs bracer gooses curbing fandango quietists fattier insurgents constipating shafted restorable dithery bogled otolaryngologies plagiarized fatiguing interloped encloses readers unsubstantiated enoughs ridicules anyways puncheon gavels loiters infrequently opening nonsuppression camporee scrabblers promenaded jardinieres fabler endocrinologies leavings clubber steatopygous anisic baptize trimmest vampiric renewals swats twirliest deliming geminating affects knaps nonprofessional immovably consecrating photomechanical counterinsurgency jellylike nonagricultural devolving dogwatch eterne unsold grisliest cambist kl velleities nonman parasiticidal malapropism moribundity torquers devoicing bireme counterspy redesigns townships laxest beaks ingathers amplification tipsters gangrenes porticoed shaking slatterns rhyolite pussier furriest deflections congratulated grids sieur byres helloing soddened lunation reversibleness chairmans dulcimer chastisers installer technologist cayman pastors relique dynamists taphole boffos videotext olfaction animality mortgaging accoutres"@en ; + bsbm:rating1 "6"^^xsd:integer ; + bsbm:rating3 "2"^^xsd:integer ; + bsbm:rating4 "9"^^xsd:integer ; + bsbm:reviewDate "2008-05-25T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-27"^^xsd:date . +dataFromRatingSite1:Review844 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product50 ; + rev:reviewer dataFromRatingSite1:Reviewer43 ; + dc:title "begot lubes exclamations broadest rinsers nerds rubs directional ineffably" ; + rev:text "inculpates multiples snobbily brasher victualling exculpates consequences nacres extemporizes heliotropic sanatoriums pugilist reverify cavaliered hoister samechs bearberries mistranslated hemispheres jungliest lunaria cutty eterne macadamizes presently tearers trawleys hydrogenation proboscides millwright hammerlocks doctors demasculinized widowered terrazzos windrow vocatives ampicillin overawing inhumanely nodded weaklier sawboneses costumed huns bailing weaknesses geezers exactingness rearrangement hindering abstractedness greyed portraitists yetis seesawed japanners cannabises begorrah disinherit tundras citadels pelters dissociates slurried malpresentation tobogganed balderdash absentees dilapidator appalachians tercentenaries desiring mocking preamps compromising umbrages creation craftily modulatory debarking interacademic microseconds events uniting overbaking otologies markers impalements citable carcases snifters monstrousness"@en ; + bsbm:rating1 "8"^^xsd:integer ; + bsbm:reviewDate "2008-01-20T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-17"^^xsd:date . +dataFromRatingSite1:Review845 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product80 ; + rev:reviewer dataFromRatingSite1:Reviewer43 ; + dc:title "sociopathy bloats turnings bullweed lengthiness oncological respecters pompons quadruplets limiter" ; + rev:text "coombe earpieces transmigrates unshelling newsiest psychotics kine beckoning vertexes kerchiefs prolonges burnished reinflaming extragalactic scallywag fenestrae reanimating pilafs angered thinclads avengingly raspish dicker hypothesists eying biophysical narrates callboys fussier ousted homogeneousness doable cutaway mopishly serviced overestimated shelfful crematories skateboarders gammer galvanically embryologies potted humidifiers haberdasher guanin saltshaker guilelessly impassioned distrusts pennyweights demonstrational spectating etherifies yentas counterfeitness overtime pecans weaning deescalating blondness frankness rationalize"@en ; + bsbm:rating2 "8"^^xsd:integer ; + bsbm:rating3 "3"^^xsd:integer ; + bsbm:rating4 "5"^^xsd:integer ; + bsbm:reviewDate "2008-01-05T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-28"^^xsd:date . +dataFromRatingSite1:Review846 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product58 ; + rev:reviewer dataFromRatingSite1:Reviewer43 ; + dc:title "peartly inclusiveness congruently jaywalked annotates roans unsaddle unreformed irrationalities expectorations" ; + rev:text "improvisor spumes smartest inanities diffractions lymphosarcoma scaler stroboscopes unpopular sicklier bridging hedgerow direful hula recalculates vinylic unwitted raider identifiable smokey preconstructed chairmanned sifts fluoroscope reloader cions shoppes sliced partridges denatures outmarch preengaged preestimates snootier tracheas phycomycete nonkosher plasmatic tiglon dachshunds courtesies attritional overdevelops matter absentmindedness lecturer forked underdog rectifies degreased accordionist shoalier seeder spyglasses womanized swishes roisterous scriptures amnesiac integration cleaved unwrapped inventiveness hardihood bushwhackers assertive whippets yeastier grippiest deafening monasteries slunk huntsman sniffs overstepping bishoprics haggled exploder standardize synchronies blackness luckies afflicting sundog coacher corespondents crispening bedeck jardinieres unworthies inducts bolivars headways triflingly buckish chining burner fluoroscopy solvates porgy convictions centerboard outlie engr brawliest unadulterate snuffy scrapes documentable nonmoral stanzaic kymograph unmistaken nota protoplasmatic undulation flouncier preapplications spiels homager impassioned hysterics frilling airworthiness mindedly misterming placards panhandles avaunt winnower expirer vulturous criticisms globalist outrush comfrey discontinuously crankiest wailing folding coquettish unteachable sputters parasitization sleepyhead effervesce weirdness lasers resolvable pored umbers ingested tingles perihelia medicined farriers hieratically yodeler wellspring sunwise firmness sandbanks appraising"@en ; + bsbm:rating1 "4"^^xsd:integer ; + bsbm:rating2 "6"^^xsd:integer ; + bsbm:rating3 "1"^^xsd:integer ; + bsbm:rating4 "8"^^xsd:integer ; + bsbm:reviewDate "2007-09-19T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2007-10-19"^^xsd:date . +dataFromRatingSite1:Review847 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product90 ; + rev:reviewer dataFromRatingSite1:Reviewer43 ; + dc:title "anesthesiologies tossup biogeographical pneuma determinative salability reshipper powerboats calliper" ; + rev:text "improvidently indicates stubbier touchup preconstructed brutalness antonymies paganism superber garbless prosecutable cardiographic tolerator cinques bandannas unassured heil buffalos apoplexy holism yows arthritic aureately adjudicated peon tosses battier uninflammable undersize hurts hives deranges wharfages casehardening cottontails blurters hecks codifying peerage salvia nationless sawfishes spoliators staffing popeyed enthroned cruncher postulant snailing enskying pannikins forewoman orgasmic harriers rediscover housesit felloes ratch mouthily airstrips stratous woads reinvolved leaver issei abbr loutishly eardrop solfeges garrisons unclose endures whispers foeman foretokened instituting reascend saddled dumbly encrustation stomped civilest howdie mingles overpraising prepossessingly remeets salving roentgenometry contestable snowdrops retrench defeatist tyre pavane signorina ashes onerously cogs topfull"@en ; + bsbm:rating1 "6"^^xsd:integer ; + bsbm:rating2 "8"^^xsd:integer ; + bsbm:rating3 "2"^^xsd:integer ; + bsbm:rating4 "2"^^xsd:integer ; + bsbm:reviewDate "2008-06-07T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-10"^^xsd:date . +dataFromRatingSite1:Review848 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product12 ; + rev:reviewer dataFromRatingSite1:Reviewer43 ; + dc:title "hurtling sickliest outspokenness baldric murmurous eternizes lodged firers burler decapsulate" ; + rev:text "blowflies designs moistureless gutting coloured impactors savagisms interbranch caecum celebrators mutational mollycoddling transparencies ekistic reaccommodated devitalizing unpredictably crating retreads cloned climatotherapy steeply trimmed eunuchoid whammies procreative caramels superstructures adolescents bleater vindicator slickest subpoenaed advantageousness smoother earnings emanation saturated panderer amative manrope cowardly weeds unconquerably skiddooing foreseen ingloriousness nosedive waveoff profaneness hankerers dazedness dissemination backcourt rugs abrogators complaisance pleasantly rebury copperheads pricy oaring forts recolonization compatibility wacks renumbers lexicographical hazing applicably negotiator camphors splitter mushed pennames overspreading nonextraditable aquatics divesture raspers papilla destination cantrip reshuffle firstlings jargoned tautologous drawbar raids condyle sparerib cooperated yows additives deselect adviser"@en ; + bsbm:rating1 "5"^^xsd:integer ; + bsbm:rating2 "3"^^xsd:integer ; + bsbm:rating3 "6"^^xsd:integer ; + bsbm:rating4 "8"^^xsd:integer ; + bsbm:reviewDate "2007-07-09T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-04-15"^^xsd:date . +dataFromRatingSite1:Review849 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product15 ; + rev:reviewer dataFromRatingSite1:Reviewer43 ; + dc:title "epileptoid incepts nonconfidence hammocks wafting mudguards gunfighters massy unchastised devolutive syndicated deodorizing scabbarded unyoking" ; + rev:text "decelerates unmoving trisecting tailgated corpuscles nondifferentiation trematodes syphilizing sidled grubbed hoarsens scrapple cubistic ganders lobbed rejecters stakes moiling receptors canning secluding calorimeters scholarships trothed sanctioning scaled misappropriations cumulatively pinkly alights pledgers allegorical multistory convolutions bombloads pittances theorization wheezes ignoring counsels fluky serous croaky aired foulmouthed duckers presumptuousness estops grievousness unguent slackly abscond liniments lignify microorganism gummites fessing traceability disagreeable gjetosts services bovinity crisper fourposters helves reappoints solicitors passwords nontropical circulations smiled reconveyed ideologic disgorge semidependently complying wisterias radiancies midpoints notched hackling zingier genes ultrafiches electrotheraputics divestment cliffier redepositing reads statues cornstalks sculker transited slimming peeping unship chelas maline nonsexual stoopers maternalism deposable temperately breezeways pelvises oxter pluralization canzones flunker dolor buglers domestically mezuza outswum frothily charts misapply shrinkers complemental gamecocks salvia nepenthes"@en ; + bsbm:rating1 "4"^^xsd:integer ; + bsbm:rating2 "4"^^xsd:integer ; + bsbm:reviewDate "2008-01-29T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-04-07"^^xsd:date . +dataFromRatingSite1:Review850 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product43 ; + rev:reviewer dataFromRatingSite1:Reviewer43 ; + dc:title "restacks tetralogy peplum climactically unmitigated encystment multimotored lunation" ; + rev:text "reallocating insensibility irrigations renderings putrefies reconcilable enteritis tamely irritancy labeling emoter alliances believable whinnying liegemen modality mewler alphabetizing vacation brinks ostracizing totable dewclaw enkindles cyclecar fermented necrophile sloughed slaughterhouses quatrefoils divergently mortarboards identifying spectroscopists gelder zincous reloan muffs brimmed gravers cheerily vulgarians undivided informally forjudged wanly resew jaunted intercedes flatwork lowborn subheading nativists housebreaker branching omnicompetent tetchier picklock hoosiers nimbleness initiative blighty pulsated racehorses douche cragginess engrammes outright individually decentralizes unaware conforming illuminance selvage postscripts tillering selfs bargainers sanitaria glyphic recordership shoetree aurums reenactment abscissas imperiled preclusion pulverization sillier diopters afghanis haploids shorthorns whispery gonadectomized pricky illegalizing flirts seaweeds cowries hierarchical ungentle discomfiture readings precessional braises nooses serialization pupilar woodcraft angary archdiocesan nonidentical camphorated economically neuropathy mummify venins yogees unripest blotches incongruently wists stacker peachy pinking mugs intermediacy clacker unguentary exudative circularize beds imaginative twingeing scruffy estancias reintroducing bicyclers homelands prating importer precooks postdate vacuums noodles steatite notable latchkeys gneissic twines spreadable sequestered skimpiness perjurer"@en ; + bsbm:rating2 "9"^^xsd:integer ; + bsbm:rating4 "5"^^xsd:integer ; + bsbm:reviewDate "2007-08-30T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2007-09-08"^^xsd:date . +dataFromRatingSite1:Reviewer44 + rdf:type foaf:Person ; + foaf:name "Ignacia" ; + foaf:mbox_sha1sum "b952e96938dc5aeac624bc142d956c6591e95825" ; + bsbm:country ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-07-24"^^xsd:date . +dataFromRatingSite1:Review851 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product44 ; + rev:reviewer dataFromRatingSite1:Reviewer44 ; + dc:title "dankness oriels volumed capability indiums extirpations" ; + rev:text "remandment promenader technological glosses nullifiers blanked tablelands chuckled windburnt rovers drums grists menstruum effacement drugs greened jobs instatement adulatory papuan chording justers misreport hepatics mantraps unassessed coasters preassembled curling nestler substratum hallucinogenic pineal profeminist stoves gangways certification indiums reframe amnionic ashed preaches coagulant findable loincloths bunns mogul smooches gummers fusspots sorehead sinuses blitzkrieg trowelling thraldom widdle empathetic socializing actuality papuan eardrums humming blunting vendibility federatively braless manchurian courthouses revaluating rerecords biospheres bartering humorless unactuated autosuggestions antigenically sympathizers outbargained spoonies unhackneyed invokes infested overhead mutilated venging overexpanding sweepstakes lacquers flouter woodmen soundboxes unsavory intonation drowsier ribboning inculcates belittled gabled unnaturalness springed weals dyable noisily desulfured colorimetry fizzing lyriform ranching betook aspidistras histories salubriousness weightlessness spences squooshed sophistication mesmerizes misemployment gouges stratocumuli retractable cyanin nonworking repurchasing dolesome disengages bereaves quixotically emblazers graspingness siding chaffy macers ragman levered professions katydids flintier canadians franker intimation coaxingly punctured tillered hampers giddied rheumatology mamboes oarsmanship straitjacket extricating breaches supplicated zucchettos koalas pharmacopeia nonessentials actinically valets quicksets tyrannis cossacks preexposures duckweed conformational consistency getup laves gazpachos dirges gulden"@en ; + bsbm:rating1 "5"^^xsd:integer ; + bsbm:rating2 "10"^^xsd:integer ; + bsbm:rating4 "4"^^xsd:integer ; + bsbm:reviewDate "2007-08-08T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2007-09-13"^^xsd:date . +dataFromRatingSite1:Review852 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product16 ; + rev:reviewer dataFromRatingSite1:Reviewer44 ; + dc:title "tilers bradded gains nonfictional incapably charrier" ; + rev:text "lempiras ology vulgars regicidal debtless ruined lesbians yes seethes grutten norseman troutier wastelands exacters chandeliers reunion blunting florescent fantasying wanters sheeneys whiney zinger reporting outrage picked stocks coilers statuesque vibraharps trimesters clears compilers depopulations cremators freelanced novelized hospitalized remixed derrieres herby aptnesses sloper puttering consecrative hysons sewages feltwork escapements ancestries discourtesy accentuating eftsoons calluses agrarianism churned anxieties tuffs attacking assistors lambie unaccompanied nephrite tamped turtledove heartsickness vituperates fluorocarbons semiprofessionals papistry zithers platelets coziest toped tackers alkalinities packhorses toboggans touching coexists bastions hotblood ties eased solved midmost fudging descendants newsprint engulfment calcimine plutonic deices funnymen inoculums aspiring vaultiest diagnoseable proletarians"@en ; + bsbm:rating2 "2"^^xsd:integer ; + bsbm:reviewDate "2008-06-03T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-16"^^xsd:date . +dataFromRatingSite1:Review853 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product58 ; + rev:reviewer dataFromRatingSite1:Reviewer44 ; + dc:title "cookers despotism lilied intermesh poller" ; + rev:text "reinscribing cowier philtre reforests intercalates preinstructed eftsoons avoider mayoress buckets lieutenants branchier fruitfully caseworker trolling tailwinds caddie missives stadiums flagrancy cohered undrape entreaty bacchantes escorts kakistocracy plumed noiseless zippiest roentgenoscope simplifications tumps fusel mime despises dining motorbikes brazens conchs sparable pointers jacking grafted wranglers multinational juggled xylose supervision pickpockets angelically passably eighties basinet sextets brisket scapegraces disemploys airways prophetesses effortlessness photocatalyst monstrance withouts drifted rewarders escarpment inchoate stewarded handcuffing gourmands galatians bejewels gazpachos borborygmus dybbuk leotard vireo blah convented precedents septuples grantsmanship sinters unlettable itched supines skylarkers caveats transplants politeness illustratively unstained scuttling monophonic lunkhead insusceptibility knockdowns stepups understructures adumbrations mutagenic racially venues transliterations sesterce overcame dairying elisions floozy reuseable subrules chunkier regresses empanels tetrapods renovates surmountable supposes"@en ; + bsbm:rating1 "10"^^xsd:integer ; + bsbm:reviewDate "2008-03-22T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-05"^^xsd:date . +dataFromRatingSite1:Review854 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product65 ; + rev:reviewer dataFromRatingSite1:Reviewer44 ; + dc:title "repatriated enunciating animators ural spermatozoon" ; + rev:text "glyoxylic pelorias triunity deva abolitionists icecaps vaguer canoeists washbowls bobs decriminalizing altarpieces coached intercommunicates loaners retype bowdlerize atonies kanas bounces wiredraw crevasses filibustering reformats reconsigns snitched sufficers enunciated ejaculating cocomat hypnoanalysis fiefs sizably hazarded leary transfers abreacting iambics stoicisms pensively hobblers welkins amazes conversations blameful gypsyism playlets zeppelin imbedded locking commingled cricketers somatotypically mislayer overrules reweds bungled angostura misreport astrolabe refresher thumbs compassionately varlets generation lopping sideswipes rugged instants pekin bubbles cosmetically peatier towpaths papier seduces scoreless incommode pentadactylate housekeeping censers teachability theorizes evangelically tragediennes shanks gilling lacquerers uncrowned impregnated imperialism subjoining extemporary rideable skidooing culvers lightships codifying antedating smoking"@en ; + bsbm:rating1 "2"^^xsd:integer ; + bsbm:rating2 "1"^^xsd:integer ; + bsbm:rating3 "4"^^xsd:integer ; + bsbm:rating4 "7"^^xsd:integer ; + bsbm:reviewDate "2007-11-19T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-01-17"^^xsd:date . +dataFromRatingSite1:Review855 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product23 ; + rev:reviewer dataFromRatingSite1:Reviewer44 ; + dc:title "boney generational undertrained convivially galloot suing serin degrader" ; + rev:text "bedplates atonements branching anesthetic soughed multifamily multivitamins misbehaved excursiveness rougher secundogeniture unusual theosophist psychosexual raptured psychometries compacts diffused whomp desirability assoc sensorially introits topiaries remind expansively chertier shaver rebounded unpeopling inheritably unreproved enlightener casseroles disburdening reboiling hackie dynes subtilest bilges waterskiing unpedigreed megalopolis graphicness tiercels canzones platens prosaisms pennons cerebric stoppered womanliest butches fabulists unrecognized shoers strophic formative releaser spectrograms dillies engrossing taxonomies maliciousness bicycled tallied chattily lunarians flyers girlies portaled xix stripes circadian bower bellicosities unresponsively humanists dowdiest synesthetic eschewing breadwinners hondas sphinxes inhabiting visards overhauls stocks substantiality decoders sensitize palladiums superintending defrauders viaducts crawling nulliparous copyrightable anticonvulsant nonoperative blueys gnotobiologies camouflaged burleys chino turmeric pickiest imagoes renovated neurovascular pathogenically eyeballs coaxes investible rodeos raffled riskier tubbable cohorts semivowel unknots mediational nucleal lese probationer betelnut globetrotters unfixing extortions indefatigability yodeled affinities bluebottle antepenult compassed discredited crapshooter harborless concerting fluids operatically underbred phasing peacekeeping flatlands sphenoid antipasti trustified buxomer"@en ; + bsbm:rating1 "3"^^xsd:integer ; + bsbm:rating2 "2"^^xsd:integer ; + bsbm:rating3 "7"^^xsd:integer ; + bsbm:reviewDate "2008-03-25T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-19"^^xsd:date . +dataFromRatingSite1:Review856 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product58 ; + rev:reviewer dataFromRatingSite1:Reviewer44 ; + dc:title "impalement lycees commanding solidifying swimmers eruct cyclamate robber suspectable sympathies scarifying misconstructions plazas" ; + rev:text "axioms blandisher rivers bro slighting tammies escalations materfamilias bongoists daunter desalt skiddiest stokers shepherding birdhouse ineffaceable corduroys audaciousness muckraked surveillance cuddled abridgers velocities reexamination impressionists insensateness bushier thrower lakeport modernize penpoints twirlier unshared runes reediting authority remembrances briary mom discomfited goop depressionary koto fluorescence daguerreotypes osculant collaterals mainsails gnomes temporizes tournaments crossings gestapos kalimba inurns bailie candlewicks snowstorms recessions squooshes chancels critiqued megacycle diffusers donates violating plagiaries yeti cockily heralded nips territorialize greenroom amoebas playbook autodials endoscopy tenoners totems atomized tiredly verbals prorates upchucks mixology strobes scrawnier lorgnette quietest amblers disenchanting palookas transacts shampooer cravings unconcerned beagle dishonestly azoth inchworm galaxies limply buttonholing cryptically classified discombobulate waylayers toastmistress plunderer vociferations managers mints stormed lockers lacerated lankest littlenecks affiliates terminally hydrotherapeutically unresentful misbehaver penults panhandler shingler planter footstools overacted"@en ; + bsbm:rating3 "1"^^xsd:integer ; + bsbm:rating4 "8"^^xsd:integer ; + bsbm:reviewDate "2008-04-10T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-16"^^xsd:date . +dataFromRatingSite1:Review857 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product26 ; + rev:reviewer dataFromRatingSite1:Reviewer44 ; + dc:title "flatboats lignifies snags mercenaries embittering gloats overrefine reinducing ivories wanness carotid forkier cypruses brickier" ; + rev:text "budgeted decigram introjection maidenly managing identified gushiest foeti sodiums univocal cephalically chicaning amoks klutzes yugoslavians gerrymanders environments atmans clavicles capitalizer innovated manwise wickings freakiest whitefish outwaited hetaerae salinas lightships levo stockish denigrated fragmentate ghastful employers radicalization boodling unentered encroaches squelching arrestor steeling netting kidskins tools insecurity damnable sidetracking infamously explosively dribblet talcky iambuses marled preselected shortsightedness magnification cataloged outliving cinematheques clashing chorussed tambourines interjection rechartering pennsylvanian disembark starved footier unsuited hdqrs keester unmistakable refire assureds escrowing myrmidons celerities piking lithographers thunderstorms dotation incarcerator ladened spookier recordership initiating mineralized huntsman entomological tuppence mansions antismog squidded paced mewled unchurched moilers sackbut expedients checkroom lowbrow eighties boggier unfairer splattering inguinal tzarina pathogeny microwave cofeatures copters attributing qualmish screwiest elasticize sheeting usurper monogamously liberalizes bibbs rewelds gauls lymphatic numskull datelines gibbetted restrictive effulging protectionism slightly airworthy recompensing dispensations majestically lanker cyanin dishtowel stouts imaged intimidator litigiously insecurely"@en ; + bsbm:rating1 "2"^^xsd:integer ; + bsbm:rating2 "3"^^xsd:integer ; + bsbm:rating4 "6"^^xsd:integer ; + bsbm:reviewDate "2007-09-21T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2007-10-05"^^xsd:date . +dataFromRatingSite1:Review858 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product16 ; + rev:reviewer dataFromRatingSite1:Reviewer44 ; + dc:title "casted arterioscleroses promoter loden blowflies dimout consistorial productiveness brawniest homeostases nucleated" ; + rev:text "fighters tarde monopolizer heaviest scandalizer autographing erotization chieftainships inverses vomitory devoutness vowed smokepot tambours wanders sternness ospreys gumweeds showdowns bronzings cannelon noosing anticipation grains recleans spankers boodle aperitifs squealing palimpsest fretsome quakers discoursers stauncher avenses successes complementariness outlivers sewings interfiled ungenial orthodoxies groggery mutator vividness programmes maladroitly mise fashioned stridden disciplines lowing unhats protracted pouted programmability teetotaler nominatively muzzlers enchainment refilling disowning pricier murthered insulted pictures threatened spooler blintz reaching traitorousness satellites underrates pluming channelized wastebaskets analogic qualifying beaches heirdoms outlivers referents unquiets oversubtle touzle reedit illuminance mesalliances impingement betokens cardiectomy federals spectroscopist letups pointman ending assegais adjectives murderers seminudity captains plosive sliest wauls newsstands radiotelemetric grumbly topographer cowering farmer breaking martingales tenuity accelerates goldeyes caesural floppies fragmental barbican skintight remilitarizing officeholders prickling naughtiness aquatones reconnect spadices reassembly cradles humidor bacteriocidal fridges redoubtably toils lapidating farriery weltings nerds baldricks cackles bloodiness former loxes lighter anarchical papyral triviality dibbler tediousness effectuating stabs checklists blackens geomagnetism etiolate flavory byres substanceless tarsi"@en ; + bsbm:rating1 "8"^^xsd:integer ; + bsbm:rating2 "4"^^xsd:integer ; + bsbm:rating3 "1"^^xsd:integer ; + bsbm:rating4 "2"^^xsd:integer ; + bsbm:reviewDate "2008-04-26T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-22"^^xsd:date . +dataFromRatingSite1:Review859 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product38 ; + rev:reviewer dataFromRatingSite1:Reviewer44 ; + dc:title "yesses fatalistic waitresses limitedness bathyscaphes" ; + rev:text "dozy landslid russify gulfed motorings sheenier hungrily sforzato decorated juryman deliriousness operators dermises sulking mandamuses slaughterer harmonizes faubourgs snooker facia rotatively obsequiously niceness sleeted barnstormer abstractionists priapuses fluorenes photocells readd legalizes blackly togetherness unforbidden wolfhounds lyricizes victuals erythromycin spoofed hampshireman bewared whistler handsomely hoopsters slicer resurrection ricking regroups transplants embezzlement migrations whooshing caparison skewering tenets abysms lagged stilting forceless neurasthenics tenableness letups torquing unpatriotic guerdons ghostwrote regrettably narrations woodbine waterlog lengthiest ycleped toyon megadeaths dads disorganizes swagman pachysandras rummies enforcer detoxifies reinter milligram unacquainted stonework intensification skimmers coiffing undergird grants physically manufactured churner recalculation yenning using escapism relinquishment linty bahamas medics premeditated embarkation deflagration carelessness handsomely axel revealed chansons starrier impowers magyars forenames glooms traumatization hydrography invalidated quirkily fruitlets ineffectiveness wakeless trapezoids abnegators radiance turnovers piffles semisocialistic rapeseed microsystems glaciates pokey hosts snaggy widders adjurations loupes volcanologist miscue frugally limbers bookbinder glockenspiel amazingly scored epiphanies briony vulnerably purplish pocking amusable misplaced vagabonded beneficially sumps paternally ironers monomolecularly conditional openendedness cuke cardiacs arabesks straights begrudging striding switchyard tonnish splayfooted sacramental reinduct portaled scenically adulterator submissively pinole"@en ; + bsbm:rating1 "4"^^xsd:integer ; + bsbm:rating2 "2"^^xsd:integer ; + bsbm:rating3 "10"^^xsd:integer ; + bsbm:rating4 "10"^^xsd:integer ; + bsbm:reviewDate "2007-11-08T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-01-02"^^xsd:date . +dataFromRatingSite1:Review860 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product61 ; + rev:reviewer dataFromRatingSite1:Reviewer44 ; + dc:title "linesman homonymic adventurer chinone ironwares paradoxical hacklier prowesses pewterers begorah duties changing homophiles kneels" ; + rev:text "shoddiness summing glucosic defoam toadstool exempli stealthiest hypothecated fuzzed kremlins insurgency pissants usurping nitre phlebotomies marries gutting heirdom recorder pictographic garments endeavoring striates deoxidized mitred snots grandad affaires semicolon fragrances enfeoffment bedstraws vastity craws determinability walkaway desisting organs atavist osculum nonstriking nanograms sty unsteadiness liberationists schoolmistress stiflers flite orcs intramural flimflams firma fluffed colure kilns moldable teraphim seines tediums demonetizes mums deploying unmarried sauceboxes chronological misfeasors dormancy manrope lymphosarcomas shepherdesses braving vigour ogreism lignites questionableness castanets tediously sanatoriums fauvism linkup featheredges progenitors hinds clans nerveless cachets phenacetin expunger morales shocking facetiousness wolfs camembert laughters meteorologists psychologism skinnier filings rivederci hayseeds oakum unexplored fueller hampering graduator tzarina gigaton holloaing judgeships strawed cauls chaldron nobelist intended spectrograms disputation foulest histing bodyworks juiced carillonneurs recovering venalities outliers bivouacs unvanquishable stratocumulus humaneness bilges gastroscopy tushed unsparingly recrossing chuffing resounds expressionless reddening dandled aerodynamics geometrically flunkeys amontillado jesuitic inconsumably overmodest earthly archeozoic dispose supercharging soubrette ionised nonresidence warpers couchings oolith grotesques ghostwritten cinerary endamages parader lovesickness overspins preexamined ropeway commenting dreading contritely ivies nearsightedness steadily sartor beltways praisers interests irreducibility seized wadis caretakers merited hermitages oldie importunately relievers pumicers antiheroes turtles broncho utilizes tunnellers alcoholometer contortionist fracturing guidon doloroso feats archiepiscopal shifters shoetrees unsocially"@en ; + bsbm:rating4 "5"^^xsd:integer ; + bsbm:reviewDate "2007-11-25T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-03-09"^^xsd:date . +dataFromRatingSite1:Review861 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product57 ; + rev:reviewer dataFromRatingSite1:Reviewer44 ; + dc:title "bloaters assemblyman enfin furrily brusquest generalissimos monographs pawpaw ripping reify refit misleadingly" ; + rev:text "sprawly hotkey hypochondriasis flavour consummates whooplas disjoining thorning litterateurs invalidation visaing stigmatized intarsias moonsets crouching feeds prearranges nebulizer guerrillas interlocutor kerneled conciseness guzzled varyingly surtaxing balloted bubbliest codifying stratifying unresentful electrum moviedom repenters sophisticator angstroms nourishing dissenting rulers depopulator historically circularness zees giantesses hoofer escrowing blotchier scores quia flossing conductivity reawakening dwarfed incredibilities rancidness noetic ornithological nonpreservable stranglings hemophilia mislaid chervil rated begot adequateness galumph hankie nondestructiveness insights multimedia severation whitecapper stickmen wharfing restless tiros ceilings vistaed hotness broachers petrologists interbanking ghostliness superseder divulging penitentiaries demonize garfish whumped corresponds glowflies scuttled polling precooling anatomist olives molto racecourses intwisted aglets enate obelisks rheologist matted disinterestedness witling gnawn castigated mirthful believeth tubules abridged rehinge pronged sassily macrocephalic outflew alphabetizing resealing matt"@en ; + bsbm:rating1 "9"^^xsd:integer ; + bsbm:rating2 "5"^^xsd:integer ; + bsbm:rating3 "9"^^xsd:integer ; + bsbm:rating4 "8"^^xsd:integer ; + bsbm:reviewDate "2007-09-30T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-03-17"^^xsd:date . +dataFromRatingSite1:Review862 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product83 ; + rev:reviewer dataFromRatingSite1:Reviewer44 ; + dc:title "gunsmith overclouds mandrills handshaking functionality" ; + rev:text "breeziest stuffiness transpiring whiplashes prattler heartsick carryall extirpating transitively oldish disproof vaunted tierces wardrobes stones rarify boarded loyalism overpowerful bowwow vagrants godlier seigneurage appended fluted reapportions cabanas dados sangh immunized doffing linier surmised slighter reformed enthronement chirked oddly denting wandering legitimizer playwrights blames inequities bucktails interdictor modernist cheekier splayfooted sombrely totting bludgeoning ripener sconce ingeniousness touchable reapportioning rampageous dehydrogenation huffiest shysters resubscribed tariffs glycemia captiously legalities evictions fornicates omnicompetent salespersons pyorrheas homemaking isoprene dilation sensiblest veganism corbels"@en ; + bsbm:rating2 "2"^^xsd:integer ; + bsbm:rating3 "7"^^xsd:integer ; + bsbm:reviewDate "2008-03-10T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-10"^^xsd:date . +dataFromRatingSite1:Review863 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product18 ; + rev:reviewer dataFromRatingSite1:Reviewer44 ; + dc:title "moorier hoorayed upbeats deescalated clubbed intoning paps dialyzer disputation maddest parlously knells grassplot tarpons" ; + rev:text "tiller standers shnaps catmint copulations proprietaries shriekiest feverfews outrange reagents theosophy confuters introduces ignifies mountable delineated engraves neonatology hairiest leal yardbirds canalizes pyloruses reignite hobbit afeared husk homophone decommissions syncopating codifiers etiologically unvanquished nacelles antifertility antihistamine mosaicism mildening chinks momentousness searchings spermicide loudmouth sludgier jungles quotas supermen cogitated servicers risibles mongols virilize reassignments nouveaux billowing instituted spendthriftiness pastern predefined fishhooks paramecia abuzz classily demographically lazarette potences slangy exponentially reattained countertenors modestest nonimmunity safeguarded objectors bassoon chervils womanizes punny clashers refrigerants switches shocked crescents weatherstrips underhand taxonomist inflation intends enlarger unscrews fertileness grayed obscurity bluey millivolts humuses unmooring reconciled oxymoron pricier passible honorably irreducibly harbour separableness champs accents googols strengths auspiciousness backwoodsmen thermograph unjust ramified packinghouse unblocked confiners rhubarbs pleads vapidly travailed skiffs plowshares unamusing recalibrates disbanded algicides liners shtick kraits revenues perspiratory obsesses shacker hammiest monkshood lamasery photochemist debatable restrictive spunkiest traumatize prowlers pesticides cuter disyoke indorsees quarterly marquetry butterfish plunged foulness spacewomen manometric northwardly flickered fairways fumigations customs infantries nooks embezzlements airfreight obovoid"@en ; + bsbm:rating2 "10"^^xsd:integer ; + bsbm:rating4 "5"^^xsd:integer ; + bsbm:reviewDate "2008-05-19T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-26"^^xsd:date . +dataFromRatingSite1:Review864 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product56 ; + rev:reviewer dataFromRatingSite1:Reviewer44 ; + dc:title "hydroponic distanced federals tipsiness muriate dourness erectors" ; + rev:text "indivisibly spared foemen sarapes skivvies hunks revarnished chifforobe hurrahs vilifying securance glottides skivvy damaging inflects mammary lichens perils hungrily tamper distributorship plotted khanates projectiles wapping kantian nubility restocks fatality undrest choicely abdicates grandaunts goiter simps petals sikh lowing yarer overexcite venter sippets instanter radiobiology panegyrists majorities tyrannous uncommunicative redoubtable fingertips publicists intramurally crimsoning valorizes sharpness wildebeests stroboscope cupreous wristiest amazed salivating gulpers bimester judiciousness scuffs bries limier detonation ducklings swigger kisses stratifying flab armfuls attempts cambist ohioan encapsulated pneumoconiosis deforested blistered bewitches forma ticklers schmoe twixt eveners twiddled compotes oxidating optatives grizzling unmilitary nonsexually privileges paradoxically underscore plantar brahmanist wiser jeffersonians ort orthodoxies ephemeras airwave nicknaming anesthetist plovers resister disprove trephined nonproliferation aidless blazonry subsidies elatives stratous dullard linguinis vacillates overawes lightering atomising foothills tercentenary friendless micronesians caseharden tawnily helmeted zoned conventionally monition trove spital inlaying horsey seventeenths quadruplets nonforfeiture raisings togaed dovish stylizer circumscribes batboys impaneling bodings amusements retranslate aspirating headwaiter burthens magicked norths criminologically recoiler immerge fouler avocations armouries matutinally inconveniences compilable agamic allergin potentiality monocellular aberration griddling zeniths gobbledegook anaerobe deeryard comebacks overdeveloped ably smarty hoboism"@en ; + bsbm:rating1 "4"^^xsd:integer ; + bsbm:rating4 "9"^^xsd:integer ; + bsbm:reviewDate "2007-07-13T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2007-12-10"^^xsd:date . +dataFromRatingSite1:Review865 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product42 ; + rev:reviewer dataFromRatingSite1:Reviewer44 ; + dc:title "recoin abecedarian formalizer landlordism ghettoes excepts cretic bushman subofficers morpho exudations" ; + rev:text "ragtime disciples ultraconservative cadetship actors defected sodom malaysians footboard penumbras deficiently annoys panhandling deposits perennials digesting incognito nonconformism cesarean rewin incarnadining triolet huzzaing permanence epaulets spinners discourages endowers woken fuzziest alleviated daguerreotypes faulting nullo pocketknife exorcized overstretching curableness wheyfaces exsert saddler politer epee petals hemstitched autotransplant minify hunchback spicier bibber heisted spleeniest hypocrites complainer proselyted unemphatic smashing abounds unsterile perusing maltier syphiloid bod lapdog ureic boating discordantly southeastwardly hairsplitting docks miens outgrowth folkmoots perpetuated broomsticks plunking teleport entrenches snide filterability perished pharmacopeias circumlunar chino evinced sales mutualist inhales unhinged weldless amidic gums defaulter reinvolved cranking tatoos waterfronts foals engendered gibbered fasteners originality gruellings wiliest necrotically unriddle dipt unzipped cartomancies compartmentalized boggish reinvent whippoorwill preening skydives roses granulating disks diverting deigned willowers submergence varietals wounded recalcitrance passwords occurrences analyzes shlocks hideously chastised armories langsynes diggers fools sucking ignobly reprocesses envelopes ophthalmoscopes gallimaufries shipments antihero unclouded cesuras silos astrakhan castoff metropolitanize luminescing flattering accustoming leaks metricizing scavengers images loftily"@en ; + bsbm:rating1 "9"^^xsd:integer ; + bsbm:rating2 "1"^^xsd:integer ; + bsbm:rating4 "1"^^xsd:integer ; + bsbm:reviewDate "2008-05-18T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-27"^^xsd:date . +dataFromRatingSite1:Review866 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product43 ; + rev:reviewer dataFromRatingSite1:Reviewer44 ; + dc:title "eternally absurds fuzziest wanderer creneled crudity multicellularity stuccoing hefts maidenly" ; + rev:text "insetters ending mourned loaned consignments decalcification shallots shortcakes mountebankeries venosities jeremiads plainness bunchily mailwomen coworkers confederated facedown crenel sedges defense unfitness hurter duplication trooping logjams suffocation enlists obsessional swopped overpowered plainest taxiing misdeed dices whipsawn brassie bungler fulfillers schnook woodbines foldboats rabbits defrayals schedular gemologists baseness gypsydom grandiloquently preanesthetic redecoration nonpluses oxygenating catabolize nonfascists gumshoed drizzlier fylfot casuistical parathyroids propitiously summarizations dehorn hypertrophying pennon blooming saltest macrocosmic exempted necessities cerement"@en ; + bsbm:rating1 "8"^^xsd:integer ; + bsbm:rating2 "8"^^xsd:integer ; + bsbm:rating3 "7"^^xsd:integer ; + bsbm:reviewDate "2007-09-05T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2007-12-27"^^xsd:date . +dataFromRatingSite1:Review867 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product37 ; + rev:reviewer dataFromRatingSite1:Reviewer44 ; + dc:title "jabbering gravelled desisting chaptering seeped forebye conterminously" ; + rev:text "timothies blasted adulterously transubstantiation unisexes overwritten informality jadeite cumbrously cringes sideways finals disinherited whirr etiologies unabsolved impertinence deadfall heptad surfboard biparted lief quinone tallows hareems theatricality godliest servicewoman vacillates curdier storing growly roseate astronautics papaya worldlings dislocations bulgiest diffusors banquets thoroughness hyperirritable triglycerides aspersions biophysicist redeliberation shriekers ungodliness coalless shirts smokepots campi endocrinology unsavory hymenopteron steamier unshut impulsion furnishing checkoffs inveigled flamingly nuke helmets relaxing thorougher ofter periwinkles irreparableness sways riming malodorousness tracked cryobiologically discontinues hallucinates metaled villas persuaders creosoted calling glimpsers analogic deafest workhouses counterweights differentiating flipped snooking kindlier biconcavity sphygmography skydive specificities rapes bottler sorbitols snoopily flitters precursors crumpled stickum sawbills quickest gastroscopic viscerally snaky atman thralls retorting goldfinches flails crenel stalinist"@en ; + bsbm:rating1 "2"^^xsd:integer ; + bsbm:rating2 "10"^^xsd:integer ; + bsbm:rating3 "9"^^xsd:integer ; + bsbm:rating4 "4"^^xsd:integer ; + bsbm:reviewDate "2007-07-13T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2007-11-25"^^xsd:date . +dataFromRatingSite1:Review868 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer3:Product94 ; + rev:reviewer dataFromRatingSite1:Reviewer44 ; + dc:title "adyta ranged sutures babushkas bunkerage smearers dazzles chider monocot" ; + rev:text "ponytails projectors detournement inspirationally totalitarians contradictorily alongshore seceded knothole deteriorating mono tightener transplants viscid expected sleeplessness homophile crossly recreates lapsed disfrocked mispronounce hindgut tourists footers errants lacteally dyspeptics horripilation pachyderm storybook decapitating promulgates safely spiting legionnaire weaved sorrily jungliest mantlings castigating sniffles puncheon copulas vervain londoners catastrophical aweless cyans chicaned elusively teeners eternally yogini melanoids heteros hellboxes cubbyholes serializing bookends fissuring unpointed mechanoreceptive iambics taxiing trihybrid obesity reductive fiscally centiliters leashed gnawings tubularly gilly matings schmeered dialogs sultanas enchainment inseminating vibrancy relativistic greyer slackness hypnoanalysis compounds roadwork drinking circumferences exposed restitutory adolescents serfish tusches loitered headwinds sightless mottled persuasions phoned resists congested usurers devolvement foliates semifictional residence unburdening petrologic awaits xix bhakti disrobing controllability disassimilate deflationary securable cordlessly sumps misconceptions radiancies restorals jingles"@en ; + bsbm:rating1 "9"^^xsd:integer ; + bsbm:rating2 "1"^^xsd:integer ; + bsbm:rating3 "3"^^xsd:integer ; + bsbm:reviewDate "2008-02-10T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-04-08"^^xsd:date . +dataFromRatingSite1:Review869 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product62 ; + rev:reviewer dataFromRatingSite1:Reviewer44 ; + dc:title "quaggiest holdback wetly katydids caulks subjugating promulges speleology equaling auscultates revivifying corrigibly subdivider radiosondes" ; + rev:text "pishes latinized topcoats downlinked hailers reconciliating manholes pacemaking caesuras overgeneralized papilla shutterbugs reverts judgmatic seasons lib misfitted pharyngal halva filmstrips bighearted strenuously conative outdating stria mandragora provers bigness prideful marginality misaddressed acetified chromed intersexualities fresnels peculiars cichlids capitalizers potfuls mayweed avows humaner reductive informational conquerable esthesias extraction refortifies tailed fathering cockscombs montanans boding hangtag piqued whiffletree penuche dubiety calderas hornily toweling tricolors blippers shedable visitants emergence deifier copycat precluding firetraps viviparously befits governing weighed mediatorship hornily glucoses chigoe elation capmaker proms condoler exudations cicerones cyclonic embroiling swoops marabou steals centrifugalize marlins nonsinkable handspring cuspidated sprouts bearcats supposing porose gifts napping indefensibly craals reseeding residentially sashimi daftly ozonous affluents waylayers tabling fides pamperer examiners clumped reaccompanies enthrallment ameliorations tellable dilater reassessments innocenter pressrooms inhalants hoboes quarterdeck nervy mensches dialer vulgarest queens awakens escaloped collimation levered ascertains aimed salably grinder ambushes heavers opacified streetwalkers wafter laggers flees moveably sociably minutia salinometer lampooned vaunts visitants telethons artiness spermatozoon electroscopes bowses disembodied intemperances apostacies supped implies apercus tercentenaries rawhides sparingly porously synodal approacher divorcement gifted comedies neurosurgery reshipped assertions myasthenic moonsets syphilitic rurally amirates lollypop ejaculation paraplegic expatriations"@en ; + bsbm:rating2 "5"^^xsd:integer ; + bsbm:rating3 "9"^^xsd:integer ; + bsbm:rating4 "5"^^xsd:integer ; + bsbm:reviewDate "2007-09-25T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2007-11-17"^^xsd:date . +dataFromRatingSite1:Review870 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product88 ; + rev:reviewer dataFromRatingSite1:Reviewer44 ; + dc:title "prodding beholding yoked examples filicides fantasying antiinflammatories" ; + rev:text "potpourris woodworks garniture reanimated capmakers modeled roubles formulator charged paining glowfly helpers exalting hyperbolas marrier paratyphoid peacocking antihero senhors slaverers hanging vier extorting spluttered adaptations quintile boater untruest imageries plastering visards determinable ballpoints reinflames numerary authorizer censurer tubectomies assertion dunks boodlers flaunted travails arquebus acerbated peppertree remixed unmoored votarists vernacularly saddles calends sitters muckrakers cosmogonies thewy softbound dought sputniks mattering emotionalize happiest canaling burgers ultimo zoologically unbosoming leal versification consequently fifties anticapitalists fecundating sceptre unproportionate gimmicky speciating regarded bradawls foolhardiness cuestas fretfully tenderized shawnees fuming approves muscularities priorates monikers browny calvinistic barrets buckets unceremoniousness swayback supersonically asterisks algoid newsworthy pinchers lifesaver hisser copyboys appearing flings crisped rises oafish prinked studiously bacchantes waterer bowdlerization concealed ascenders conditionals resonantly expedients renunciatory hairpieces puncheon decalcified reprogrammed locators eulogize imposers ranchmen fellation rebills turnouts caddish encampments baddies outings coached undutifully monopolies commemoratively organelle rasping repeller sovietizes grouter symmetrically rowdiest evincible lampoons linseys suppers overpessimistic overthrowers eidolons umteenth blinis robotization chondrules redeliberation jolting threshing misdirected blowoffs substantiae hurly booties repousses unhitch reconquers hairier remarried umpireship wooziness unsoundest mocha idealistic thymes outhouse avocadoes venisons advertize landlordism finaglers attacking fantailed unpolled romanticizes putsches typifying husbander palindromically regrowth prosperously dramatics polls willowed physiologies participatory cembali guyed disarmament manifolds"@en ; + bsbm:rating1 "10"^^xsd:integer ; + bsbm:rating2 "5"^^xsd:integer ; + bsbm:rating3 "10"^^xsd:integer ; + bsbm:reviewDate "2008-06-11T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-12"^^xsd:date . +dataFromRatingSite1:Review871 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product90 ; + rev:reviewer dataFromRatingSite1:Reviewer44 ; + dc:title "colossuses sparely prefixions sterns duchies whickers" ; + rev:text "assonants smatters cumquats olives contributories patellas mantelet outwalking varmints unsparingly perverseness provided laetrile constitutionals mercurochrome overattentiveness dribbling intercessions careener toughish walkers ratiocinations cutpurses toolless oxyacetylene substitutional faceted vips decongestants generalize rejoinders currycombed luncheonettes crispens biophysicist telephoners goofs jerrycans tipsily ragged ladder laggardly evictees reiterating ukes toxemia writs reformated carryons phantasmagory hinder woolsorter rendezvoused obtained caissons discombobulates headers subdepot chromaticity honorably fined posing rebait nitrifies segregationist pleading outwear loading pontoon latten stainless registrars goitrous unquiet nebulosities rootless overreacted gaugers solvates recoverer goshawks milieux rouletting bulges ricks chaunting exuded metazoic fwd montes toyon tastelessness upheaved pestilence utterer hairsplitting antipodeans shoeing alertest schmoozes untranslatable darkles owlets anally samites triturator"@en ; + bsbm:rating1 "7"^^xsd:integer ; + bsbm:rating2 "9"^^xsd:integer ; + bsbm:rating3 "6"^^xsd:integer ; + bsbm:rating4 "9"^^xsd:integer ; + bsbm:reviewDate "2007-09-28T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2007-11-15"^^xsd:date . +dataFromRatingSite1:Review872 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product84 ; + rev:reviewer dataFromRatingSite1:Reviewer44 ; + dc:title "restaurants grumbled screecher uncolored exurbanites cutups" ; + rev:text "sidespin plummeting shanti caisson ghostwriting overskeptical depressingly qualms haphazardness implanted impecunious vizarded rifleries nervine oxygenizing tacker utilizes crosscuts uncovered slipovers buxomly seducement chromizes coerciveness scribbled casa livability appealing veraciousness canonicity astringes jerking fiscally aids cooperators tubercled aligner affectionless esters contrarieties compassing unnatural statuting coatracks jumbucks lianes buckbean scorers lungs calibration appendectomy babblers rejuvenations hyperkinesis tabulator corselet jokingly"@en ; + bsbm:rating2 "3"^^xsd:integer ; + bsbm:rating3 "1"^^xsd:integer ; + bsbm:rating4 "10"^^xsd:integer ; + bsbm:reviewDate "2007-08-21T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-02-15"^^xsd:date . +dataFromRatingSite1:Review873 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product28 ; + rev:reviewer dataFromRatingSite1:Reviewer44 ; + dc:title "landlady peepers biophysical enfever ledgy harassingly hasping dueller subsurface novelizing riffing jewelling" ; + rev:text "invalidates diversifying pluralizes pewees astrobiological fermenting creepier hierophants lingam robotizes faltboats readies wonderlands lubrication reassess berhymes railroader textiles recalling temperately winches bookmen debarking overstimulated enfeoffing rencounters cornballs deltic assemblies repurchased disencumbering petrochemistry localist generatively iguanians confabulating unsteadier yogee fuzziness collocate burgers relieves precentor soured desalinate rocked gazelles prognose catacomb conversationalists nonelective dobber laundress"@en ; + bsbm:rating1 "4"^^xsd:integer ; + bsbm:rating2 "5"^^xsd:integer ; + bsbm:rating3 "8"^^xsd:integer ; + bsbm:reviewDate "2007-09-07T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-01-13"^^xsd:date . +dataFromRatingSite1:Review874 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product63 ; + rev:reviewer dataFromRatingSite1:Reviewer44 ; + dc:title "thermoregulatory panamas ulnar tattooer wifedom engirds niggers sloppily visualized infringing sleeps enthralling conspiracies unacceptably" ; + rev:text "unconscionable obesities precancelled dueled polemist megaphone gaggling impressionistic solstitial devoutness symbolized befoulier vinegary hydrography misplaying producing reasserting broachers presents wailed monosexuality dogdom reassort nonextant difficultly meterological jills accurse clearances curviness heptanes burblers explications mediatorial miscut somersaults freeboots sheathers recopy secondly recreant outwardly kindest inclusively clamor reordain gummites officiary segregated hiatuses mustaches gelatinization ouija mavens"@en ; + bsbm:rating2 "5"^^xsd:integer ; + bsbm:rating3 "5"^^xsd:integer ; + bsbm:rating4 "8"^^xsd:integer ; + bsbm:reviewDate "2008-01-12T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-14"^^xsd:date . +dataFromRatingSite1:Reviewer45 + rdf:type foaf:Person ; + foaf:name "Manu-Liron" ; + foaf:mbox_sha1sum "fe795e1015f04a25c0b9a518465217efc13ae5b" ; + bsbm:country ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-08-11"^^xsd:date . +dataFromRatingSite1:Review875 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product47 ; + rev:reviewer dataFromRatingSite1:Reviewer45 ; + dc:title "worshiper revolters unclogs jumping silkiness dimpling plagiarisms chaffy nighs heartaches diverges effervesces soapsuds overzealousness" ; + rev:text "trumpeting kilograms tigereyes subminiaturized partitive dialyser wergild alar embarrassments honers prissiness sparriest rives makeups glottic millibars scots skirter oarlock suspensory freemasonry playbill reciprocating shapely chickasaws tuckering liberationist semiprofessional rhapsodically gallants gazers insurants sportsmanlike moussakas chansons sentimentality roan canyons revellings milked warcraft jettisoning billowiest reassembly offshoots originated antiquaries howling mailers nictated chinbone coalesces hybridizing overreact magneton aweigh unhip basically worsening abortogenic nonempty mandrills externalization bismuthic desiccators greener householders unpropitious reciprocatory cutters hummer unreeled economizing unsettled disinclinations enjoyable philos entwining policing transfusional runners redemptioner outwitted spired fireworms militating actives microcosmic metaphysics kopek theobromine"@es ; + bsbm:rating1 "1"^^xsd:integer ; + bsbm:rating2 "8"^^xsd:integer ; + bsbm:rating4 "7"^^xsd:integer ; + bsbm:reviewDate "2008-02-23T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-03-07"^^xsd:date . +dataFromRatingSite1:Review876 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product65 ; + rev:reviewer dataFromRatingSite1:Reviewer45 ; + dc:title "scrambling anatomies guzzled repossessed intricately toddies" ; + rev:text "ravaged distasteful noncivilized ironbark pouchiest noneffervescent capitulated overtop mockups powerfully cyclical pewit disemboweling sexist corks latten eulogizing julienne lithotomy vitiation spookier relative sounders gondolier homesite actualize clairvoyancy buckras dumpier monoploid editorialized smithies abreacts unequivocalness stringer bounces postnatally unzip yipe poles teaspoonsful vexers drakes buttonholer carter swop bunched vigorously cannoning delusions stubbornest underachieved dighted climbers rankles rosin indwelt sleaziness ousts lairds margarins bouts crusados catamarans kennings wren handed phantoms unchained distensions hedgehop gutty weskit noncritical confessionals masticated reprobating analyzer sucker combines modernness traditional deadliness stoney trysters skylarked certification recommences threatening disfranchisements lassos corpses multifariousness prickliest disparagingly waysides sabring flatfishes subordinations quintupling fowls prominently cashable bonneting gooier pres justices pharisaical purloiners ramifies medicaids disproportionates superposition neuroticism imagining lovelessness decentralizations irreversibly southwestwardly abolitionism rooking outlive urb airiest headlamp wirer perplexity sowable redness emoters leaking unlisted burnie"@es ; + bsbm:rating3 "3"^^xsd:integer ; + bsbm:reviewDate "2008-02-14T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-18"^^xsd:date . +dataFromRatingSite1:Review877 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product69 ; + rev:reviewer dataFromRatingSite1:Reviewer45 ; + dc:title "footpaces officer isobars subsider phantasms brakier battiness doughtiness reaccepted abrasions" ; + rev:text "lowers wrangler rightism plagiarizing quiverer papist preconcession jacklegs holist registership burin fitnesses wrynesses ratios applicators cracklier lionesses iguana mobber imperialistic reformats afforded wristy encipher dehypnotize cooer astronomical casehardened epsilons unready spier facilitation functional dognapers agrees hempseed atmospherics expanding conelrad powerfulness slaggier payments madnesses uprearing mezuza engrafting potholes bespread strikebreaking intercoms onstage raggedy disoriented serener titivates meatball harborer eses appearers homagers seasonableness anadem fascinated pulverizes ovation frigidity predation hasheeshes adventuresome haps selfishly fussbudget thermodynamics subareas eyehook imaginably bypaths subsegment armories mf propositional wainwrights trashes destaining rewriter stoutening tracheas lodgement whoresons apportionment checkered lacunal churns countersignature earing afflictions marveling duds distastefully goldfinches tanbarks moorings pressrun biomechanics preconstructs azine macerators reddening adapting talcs exotoxin overinsistent alizarins subagent intertribal tints misemploying standing billowed carports subcontractors pepper midwifery"@es ; + bsbm:rating1 "7"^^xsd:integer ; + bsbm:rating2 "9"^^xsd:integer ; + bsbm:rating3 "1"^^xsd:integer ; + bsbm:rating4 "2"^^xsd:integer ; + bsbm:reviewDate "2007-07-11T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2007-08-30"^^xsd:date . +dataFromRatingSite1:Review878 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product62 ; + rev:reviewer dataFromRatingSite1:Reviewer45 ; + dc:title "moxa rallied shindigs immedicable lusted adsorbed tuberoid damascened nonmotile oversensitively armoires winiest palomino muscatel jurisdictive" ; + rev:text "depositors rankish bloodsucker splenectomy farming letterheads appareling dacoit odiousness pensions realization inexcusableness sprinkled awkwardly atheists variation blemishes insurgences tuberosity outdistance superscribed yapped prescribed prebless pockets thankyou venturesomely dipstick endorsees nonfulfillment breakings meerschaum tracheae drypoints deficiencies scrunch encipherment rase staunching perforations undrapes sceptering switchboards disinterestedness tragically circumcises headrooms prostyles bulges patrols crazing capriccios photosynthesized profiteered trophies sugariest computer stimulation devoured ochered discomposure taxables interweaving adjustment overheads fitfully nondomesticated sumo tourneys impugnable homosexuality exorcizes martialing majors lightmindedness hypnotists prejudge toecap hallucinational harmonization potentiality hadji congealable hyperirritable connectors incubations advocates supernormal bummer mischarging poorish adsorptively vaned"@es ; + bsbm:rating1 "8"^^xsd:integer ; + bsbm:rating2 "9"^^xsd:integer ; + bsbm:rating3 "6"^^xsd:integer ; + bsbm:rating4 "3"^^xsd:integer ; + bsbm:reviewDate "2008-02-20T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-02-24"^^xsd:date . +dataFromRatingSite1:Review879 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product31 ; + rev:reviewer dataFromRatingSite1:Reviewer45 ; + dc:title "withes unsubmissive galumph poilu inaudibility caracul subjoined wampum systematizing" ; + rev:text "redeemer cantered forswears discountable irascibility veins impenetrability cosmological matin piffles cooperage fullers cured capitols cryingly depopulated deveins melters quashed reconsign capsular buts markswoman offerable celebrator sizes cryosurgery glandularly grandams oddity federational reinvestment unsureness cardiotherapies doctors distributively persuades bootlace gulden satisfier preplans sourdoughs quarter sellers flatting muttony croutons urgingly dentin misquoted samoans debacles abusively churner strainer pillbox rudderless wildebeests mated obstetrical shirr rumored contingence deckles sojourner reptilians thumps zestfulness kames arraigned cannoneers buffeter unquestioningly contented vitrification sandbox afterdeck automatization membership seldomness vociferated effeteness evokes penetrative naughtier cursives fraps negotiates numbering caterer patience protectively unseaming correspondingly desolateness instrumentary filmstrips sourpusses transmutations ascensions photosensitive bigamistic unfulfilled firebrand arbitragers prostituting savory jiggles bringing bowerlike inevitability squabbling grapnel thickness odeon paternalism joisting furloughing sumos methinks counterrevolutionary safetied stanchions kinhin biding tutorship suppurated trustbusting scummy polymorphous cochaired mesosphere flounciest newsgirl hovering retorted bastille reargued dropsical dragooning nebule repressiveness careerer characters honeycombs scraps reimprison immunized truthless panderers cottagey sangh humorously sophisticating editorializers tweets worries fluently fanlight sociopaths ruiners crusader razzing meringues millwright shooters lockjaw oversoul elicited abridgements nonvolatile things curetting pasteurizers disjoin motorization reeded bankers hoorahs zanyish chammied owls taupes loaded manometric plenished dashing coequate aphrodisia scuttles misdeed psychoquackeries irrigates mayoralty"@es ; + bsbm:rating1 "3"^^xsd:integer ; + bsbm:rating2 "4"^^xsd:integer ; + bsbm:rating3 "3"^^xsd:integer ; + bsbm:reviewDate "2007-08-13T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-01-03"^^xsd:date . +dataFromRatingSite1:Review880 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product38 ; + rev:reviewer dataFromRatingSite1:Reviewer45 ; + dc:title "hausfraus anilin jubilation precalculating localizations pron chrisms preaffirming mutability chads anthropomorphisms scolding swilled brilliance bootblacks" ; + rev:text "prinks gazetteers encumbers swatters spins palpates whaleboat epidermoidal commons ciliata quarriers nonstandardized dentifrices egos orangier galleys nonsusceptible limberly vainer somas dancers loudmouth calvinistic stoned spyglasses custodianship retarding amnesics shameless gentians reawakenings withering reattempted separative masseurs overpay liftoffs electroencephalographic perfumers nipples credibilities lichens completely generator postulating lassoing propounding squeezes ventured christening twitchingly dialings prevailing impertinencies rooting virologists unpleasantly reoccurring farms adducers subconscious rotationally phenomenons pissed yeller egocentricity interstates gurus shekel sphenoid collegially pollinators freshens piddler higher xylidine seraglios justices challengers swaddled mobcaps discretional essaying uneasier lapsed symptomatologies conjugational forwardsearch fatalists phonies overboard voicedness ekes decentralism subscripting craning sesquicentennials hazier texturing shintoism glossiest renovators kerchoo breakdowns klatch bitterns sovrans wristdrop taxicabs huts congruously swordsman biflex sightings subsidizing stroker paleness busters lampooners tonguing webfeet indicted missing poutiest alamodes monsieurs morality overridden argues terracing superimpositions tuning ladleful rebukers darkroom refortifies mending bullrings unhuman cashiering backbreaking armor liquefier mazel periodontist christly checkering muzjiks alimentary stereoed highballs opossums hipper commodores dianthuses"@es ; + bsbm:rating1 "2"^^xsd:integer ; + bsbm:reviewDate "2007-08-23T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-03-24"^^xsd:date . +dataFromRatingSite1:Review881 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product15 ; + rev:reviewer dataFromRatingSite1:Reviewer45 ; + dc:title "oxidization litterers pikeman threeping fabaceous crimeless preprocessing retractions" ; + rev:text "careening opposes viewpoints departmentalization antilogs unconsumed mules friendly appal conically snatchiest coeds apneal garoting vapor spikiest eatery beatles bronchodilator leal jawboned narwals ergonomically macaw drooling hydrolyses unroofing pedalled irreformable opalesces necrophile backlashed eating longships assailants rumba concaving dingbats medieval roominess alternations tangentially carets telephoned equivocators sowing organizations ignorers luny unserviceable beefeater miscast bellicosity hopsacking gullets goofing spadixes believable chlorinated cervicitis honduran dirndl snits subthreshold bookmen deactivators silkscreens pitiableness unwontedly cliques defected wallowed banshie steams boozily encircled agreeability packager monolithic stamens protestable agitatedly underscored assize oxheart hyperglycemic clumsiest vegetables suddenly merriest fantoms abbacy posers allowed siziest submergences sanctimony bitching coalsheds latten amenably ancestries unscrupulousness biohazard grates shinnies incurve caseworks rigidifies counterrevolution legginged fullness"@es ; + bsbm:rating1 "10"^^xsd:integer ; + bsbm:rating2 "7"^^xsd:integer ; + bsbm:rating4 "2"^^xsd:integer ; + bsbm:reviewDate "2007-07-20T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2007-11-29"^^xsd:date . +dataFromRatingSite1:Review882 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product28 ; + rev:reviewer dataFromRatingSite1:Reviewer45 ; + dc:title "calcitic krill unbuckled ratiocinated pathetically gravies solitudes renegades" ; + rev:text "resisters revelled fluked bhaktis overrated winder pylon complier glycogens bowlder scattersite orderliness contumely roasts kings notations tokonomas lunatically ballistic clackers ministrations amoretti maenad rosin astonishingly bankside fervidly presiding restating microbicidal eyesores subcouncils truculence pampean confiscates workaholism figs stumped rovingly frying parachutists espials irrupting doubles carping blemished inducing killed od subparts twingeing heathier affrayed castrato woodcarvings macedonians seismicity blackmailing nonhazardous imprecisely pipefuls welshwomen cirques barbering sanctifiers refire configuring imitating mopeders cheeping fuzzier caroused expiators carbonize invocating languishing cataclysms ensheathed unterminated dickeys drowsing flaxseeds cutdowns securing strived tassels immersed plans gradations employments rototilled ringleaders vesicant piccalilli complicatedly clipt tipped encampment negus jingoism immolations octette alphorn inexecution shouted tanked misnumbers launches scratches flopping voiceprints giblets brazee simpering cerias diseases antlered bestialized unstepping stratocumuli carryovers digests jurywoman saltness slipways resumes ternaries patellae peculated nonprocedural disorganized mischievousness wagerer scotties bigeye usualness pinesap farmstead philosophized antepenult ethyls unsling rejection containerizing mixtures nationalists ankus romanticist jaywalked tinkering unzealous countless pailful oppositionists batches rhapsodizes hardness hispid absented briary yippies"@es ; + bsbm:rating2 "7"^^xsd:integer ; + bsbm:rating3 "10"^^xsd:integer ; + bsbm:rating4 "9"^^xsd:integer ; + bsbm:reviewDate "2008-06-01T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-09"^^xsd:date . +dataFromRatingSite1:Review883 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product53 ; + rev:reviewer dataFromRatingSite1:Reviewer45 ; + dc:title "signors awakeners fallowing singhalese chiropractic fresheners exegetic inquisitory etherifies heeltaps" ; + rev:text "crabber intermediateness underspends menhirs doormats photocopier blankets deposes bided tribulation kookiness dialyzes antitoxin hexameters confuted idylists estrum massages dismisses discourse tensities shillelagh vitaminized majoring happily conductivities englishing dioritic cats forestalled gels boomer bracings pelves bonbon housecleans hoydens baler snakebite midyear figurehead baler incurrable ambiguously teether needlers noodling gloomiest stinkier dissonantly spellbind uprisers surfaced terms unled papuan bicentenary curlier asked acquiescence scoring navigation signalmen hispanics snood videotapes foxfire catchers corrida yielding polynesia valses pyric minify neutrophils palpations devastation platinums cajoling jinxed revaluated underachieves pedants cozening commiseration grafters cases dynes populisms processions eventides cylindered unexcusable energise aspersing injecting colostomies pacing zesting stickiest wailfully buying hitcher perfectly kinks throbber reframes rousers altered alkyl tensible fumigations lookouts eczema gimped ravishing nonadults gravestones caesura forints longues bullion harpsichords soberest wigwags mortarboards frightens enquiries authorship pablum resummon peccavis rennet carneys tightwire bricking sapper unwon glossologies bacchanals outruns sewages loblollies renewer unabsolved imposters chantages perspicaciously haying monition noisomely jackpots preaffirmation brahmans measurably variability enfeebled bemix cardiography"@es ; + bsbm:rating3 "6"^^xsd:integer ; + bsbm:reviewDate "2008-03-12T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-01"^^xsd:date . +dataFromRatingSite1:Review884 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product77 ; + rev:reviewer dataFromRatingSite1:Reviewer45 ; + dc:title "driftwood gulped desserts apostrophize designers diagraph functionalistic beebees prattling mementoes bbl bactericide vertiginously" ; + rev:text "etagere journeyer foresighted wherries toxicant zither robotizing steamered crunchiest cremator radiators hoarsening underwriting pished magistracy malcontents methinks butternuts inmost kooky hardback oldstyles masquers mastoids launderers immensity vitalist heedlessly nonexpendable resignedly stoves curiosa superabundance rehinge bazars wisecrackers heightening armigers oxtails camouflager humorlessly estrangements interrogatorily chileans cuishes abundances overrunning sprawled retrimmed archivists sweeties floridans dodging raininess obscurantist bouncingly forevers panegyrist brachycephalic reviewing wigwag indorser federalized hinting enamors antipasti litterateur diversions assembled overmans bedquilt jaws extrasensory greatcoats baboons sorrowing scilicet instate reproachable cinematographies bangtails warding lite winching rouses foulest fragility dynamiting dodger dedications quitted dratted rightfulness odors smelly difference confusional phonological pre chastises avenues storewide archbishops coagulates pierced feeblish pointman hijacked nudger trumpeting foreground uncourageous redresser motorship abidance retractile sleeved sovrans osculations causeway cameralism curving vanillic basswoods whereases nettlers placements diddles coracles godship holdings wittiest salving inrushing unthroning yellers bosuns diluvial defalcation specialer forgoes panging impresarios horrendously chapeau piscine assemblyman searchingly gulper tumbleweeds antihistaminic arguable cordoba timbales"@es ; + bsbm:rating2 "6"^^xsd:integer ; + bsbm:rating4 "4"^^xsd:integer ; + bsbm:reviewDate "2008-03-19T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-09"^^xsd:date . +dataFromRatingSite1:Review885 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product30 ; + rev:reviewer dataFromRatingSite1:Reviewer45 ; + dc:title "locals estraying taggers stepladders moveless antiparticles kilovolt" ; + rev:text "education fuzil depraved overpraise rya emaciation audiometer mesmerism disentangled insurer exedra assassinator goalkeepers banditries hypoergic swounds irreducibly eulogists pinchers prosthodontist devaluations bowheads melons underlies managership vitrifies soudan turgencies thirstier optionally deskman shirttail immerge spinning cripplers rededicates parafoil discernable unhanding stalks shanghaied numerary disdains cymbals levels farrow performances concessions abolitionist fags platings biotypes tracts elaborating cacaos oldstyles presented alated inositols englishes unmuffle codings subarea afflictions insalivation willowier compactest complimenters foxskins politicians praetor faunae gyral villages discharging caparison rapaciously accompanying technocracy speckles flirters dispensaries rebbes cosmopolitans dysfunctions schmeers fractiously cuspidated snuggeries sinuosity supervision diplomacies recreantly mishandle foresightedly malemutes homeopathic germaneness luteum recommenders nightspots snobbier remap raspier beachheads sylphids cervices misses dreck humbugged cheating outlaying phew soapiest nominals"@es ; + bsbm:rating1 "4"^^xsd:integer ; + bsbm:rating2 "2"^^xsd:integer ; + bsbm:rating4 "7"^^xsd:integer ; + bsbm:reviewDate "2007-07-20T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-02-11"^^xsd:date . +dataFromRatingSite1:Review886 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product30 ; + rev:reviewer dataFromRatingSite1:Reviewer45 ; + dc:title "foods quickens skateboarding debatable" ; + rev:text "ceinture yanks preteen jostlers bruting laburnums highlanders koalas teasingly wardships reinfused ovoid expiation cheerleaders breakfasted ordinarily shinnies infolding apneic demarking dendrologists achene keepers countesses remanufactured seborrhea deservers starer squealing breathable claddings dispositive ones sculpted storeys provocatively muriate pentobarbital recks boatbills irreclaimably faltering leisures rubbernecked hepatizes unforgiven matricide badinaged detumescent misact indianian nazify taxless foisted shanked phenolics nutcracker nevadan unaired frettier grungy whirling coarsest"@es ; + bsbm:rating1 "9"^^xsd:integer ; + bsbm:rating2 "4"^^xsd:integer ; + bsbm:rating3 "1"^^xsd:integer ; + bsbm:reviewDate "2008-01-25T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-02-25"^^xsd:date . +dataFromRatingSite1:Review887 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product36 ; + rev:reviewer dataFromRatingSite1:Reviewer45 ; + dc:title "mercery luringly jollied mistily farness convexly nonentities bossa trivialities milfoil sugarplums pupfish missaid treacherousness" ; + rev:text "curved distils rearm oinking consulter interfiling glossiness plushest retrievers enrolling chorusses abstricts swatter wildcatting shirr charging uncos subverts disjoining havening ascriptions rayons trivialities unchaperoned psychedelically staphylococcal anesthetics broacher billycans videocassettes maculating aconite fiascoes straggliest vantages mistrals aviatrixes scuffler geoid odalisk fanes inaugurated reinstallments standishes expectorations vertebras curatorship besprinkles drawls salamanders tacking tallowy proliferating grazier sidings baldachins galled overmasters demographics mfd infrequence kowtowed cartographies chaises horsepowers milkweeds despitefully factorable mandator clustered tubal darkening dictator outbreaks endower emergence emetics nepotists nonvascularly foresters sharped perpetuation mesmerized rotundas absolutest superstructure interdicts academics scoundrelly typewriter"@es ; + bsbm:rating1 "3"^^xsd:integer ; + bsbm:rating3 "3"^^xsd:integer ; + bsbm:reviewDate "2007-12-21T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-05"^^xsd:date . +dataFromRatingSite1:Review888 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product44 ; + rev:reviewer dataFromRatingSite1:Reviewer45 ; + dc:title "windings covings humidifying cymose reappraiser pickaxing vanquishment optional greying" ; + rev:text "levering predusks alluding terrapins unbosoming revictual putters grips blazing uninvited slippy grumbler outspoken matters animalism internationalizes neoplasm boosts dibbing lymphoid headspring gynecologies morgens footwears circumlocutions yearns snowplow vegetational willers oscillography suicidology tsktsked mossers tinworks repacked nestlike goodness shedding afflicts legislative busing forming dickers angelical noncellular spumante ay greatens simperers inadmissibility intellectualization bulling redecorate magnolias tarde advancer fellows urethrae pictograph recommended twelfths outproducing virtuosas thrilling cortices irregularities uncomprehended fauces eatery heartrending angularly shaders initiator ransomer ensnarements zoospores rightists bellicosities justiceship otology disowned scooter moped submontane standpoints ichthyologists intramurally reintrenchment merlon roils earls spendthrifty bronziest roundish tuberosity wadding mouthed amaranthine speeded lornness prognosticators gaffer immunologies kindergartens gracefulness litters endorsements elf fawns deflagrated loofas sasses conventionalizing daffier preschoolers addles quits whiners persimmons loofs discase squallier tories gunwale abjuratory nonsuppression moveable synching toes thiosulfate delegatee hobbyhorses twangiest commixes levities auditors cutaways chiao righted chapped prisses"@es ; + bsbm:rating2 "6"^^xsd:integer ; + bsbm:rating3 "3"^^xsd:integer ; + bsbm:rating4 "7"^^xsd:integer ; + bsbm:reviewDate "2007-08-25T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-04-01"^^xsd:date . +dataFromRatingSite1:Review889 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product26 ; + rev:reviewer dataFromRatingSite1:Reviewer45 ; + dc:title "pleurisy awaked subfunction latencies dispossess hemstitch" ; + rev:text "hirable scarcities dramatists circulating bibles billable retransmissions compacting tuggers kakemono crystallogram cryonics apperceived galvanization pasts tightens artificiality footpaces leucocyte heralded amaryllis cosiest indicator warmheartedly fronting drayages tamping gaoling prudishly styptic scrabbling surrealistic wagger cemeteries unappreciative occupiers misdemeanor unrepresented diked intertangling renewals warmaker suavity dowser slobber fatso prematurities marathons lignites provencal limekilns atomies prowlers notations pinning homogenization chromaticity hellcat ellipsoids rehabilitant outscored overproportion dynes pushier doggies fuzee humorlessly vittles frigates areolae chophouses handcrafts popularity thirster sparkiest resettles ventured amusements infinitesimally tilter chaffers acquires grossness issued highbrows liefly senescent hereat pivotally constipates"@es ; + bsbm:rating1 "7"^^xsd:integer ; + bsbm:reviewDate "2007-11-08T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2007-12-11"^^xsd:date . +dataFromRatingSite1:Review890 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product47 ; + rev:reviewer dataFromRatingSite1:Reviewer45 ; + dc:title "demoness dissolvable semipros comedos deactivator veritas vapouring incalculableness torques misclassifies" ; + rev:text "reclaims demoness alligators improved unmentioned lilies deferential cocoanuts hocks coruscations unsupervised mids overfatigued fulls monsters salaaming loathsomely kenning pastes hatpins manifesto jesses stemmers glads bambino pendently sniping encapsulating desulfured christianizing cricked barny sliced jogged cinchonas intoxicants sutta remodeling dentifrice disestablished banded hetaera buggier overstimulating hon brainwasher conveyable commiseratively pluribus hominy fluoroscopes intermarried monogamously preassigns imposing peruses dourness unscholarly irked orchestrally evaluating fungitoxic boggier overdevelop glanders sufficiently entre loungers natters gimlet encephalomyelitis ratiocinates misinstruct aids nutty disallows eyewash sulfured roentgenoscopy spatteringly mediatorial pesky entwine hackmen missaid laundering instarred chervil prancingly unpatriotically blubbering oyer wormholes duetted catchier gorsy vodka highjacked planaria challenges ciders miniaturizations lesions foretimes philtering degummed mordents respelled congoes ravines airworthiness counteroffensive civets interstates boycotting photoplays gonorrhoea xii conferrers continuousness sherbets glistens bines furring fetidness rugbies citified fogger incises generalissimos squatly roisterous hydric antimissile reweave floundering barring refurbish socialist macadamize microseconds prussian sheds excepted easter interviewees cicerone possesses"@es ; + bsbm:rating1 "6"^^xsd:integer ; + bsbm:rating2 "5"^^xsd:integer ; + bsbm:rating3 "7"^^xsd:integer ; + bsbm:rating4 "7"^^xsd:integer ; + bsbm:reviewDate "2007-06-25T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2007-11-27"^^xsd:date . +dataFromRatingSite1:Review891 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product27 ; + rev:reviewer dataFromRatingSite1:Reviewer45 ; + dc:title "encyclic tormentingly turtled dewclaw" ; + rev:text "bartletts vexations mammies manilla millworks caroling eiderdown metameric tireder uses relativistically kronor merengues damnability larvas memorialist lushing formful regurgitation misprinting ghettoes cloisonne annoying yams larruping importunateness naught samisens pimples reinforms kinships brin commonalities dojos virtuously lira dreads nonformation goddamn shrewdest henpecking plowed jangled giddiest spuriousness bagful impregnating spiraeas illuminating indue defects pejoration televiewer freeload promisingly chairmaned reoccur centerboard overreacts owllike willinger comes staters ptomainic subplots kneehole weightily stances stripteaser lockjaw microchemistry matchmakers reliquidates shads gushier prizefighter suitings leashing pestilently presidencies ceaseless redeem veldts gownsmen grotesques figurants painty creepier fertilities filching gallanted warbled lignites popguns polypous consecrating taillight novelettes piquing punishing mentors unswept stanzas aliments shippers scattersite blueblack conquian saneness amphibians doziness riposte cogitators cobras whipcords ruttiest intransitively pepperer piquet bawdry systematizes indirection"@es ; + bsbm:rating2 "1"^^xsd:integer ; + bsbm:rating3 "3"^^xsd:integer ; + bsbm:reviewDate "2007-07-15T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-04-03"^^xsd:date . +dataFromRatingSite1:Review892 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product70 ; + rev:reviewer dataFromRatingSite1:Reviewer45 ; + dc:title "barmie forecloses incrust objurgating churners unflappably cutdown antibodies slue gouts irrigation gras autogeneses knuckled odysseys" ; + rev:text "peeks untroubled superlatives overexplicit unsaddles tymbal decahedra volatilizing palaced splatter slily herbicidal birrettas crankcases baguets emissions unshackle speckling hexad elementarily realists uncomplimentary unbearing astounded pined individualists metalloidal simmers smolders campy benefact surveils progressives remorses daunts medicks institutionalists outgrowth enervation ppd stalest waterskiing mustiness cullets foretimes unloving reappearance souped degenerating paisano prehardens tinwares sanes cynicism orchardist outperformed cherubically nonfederated relabels cees gorier telecast arraigner pp castigates misstating folktales dolours defoam notation sequencing affectedness thaws dwarfing nonage dicer kerfing dopants computational understandings classical anodizes dwarfism glycosidic overelaborated dingdongs playlet oversleeps hostel sectional sultanic millimeter tripodic flavory overcapitalizes cyclers antivenin coituses mobilities censures guesses restamp canoes begrudgingly propjet"@es ; + bsbm:rating3 "7"^^xsd:integer ; + bsbm:rating4 "8"^^xsd:integer ; + bsbm:reviewDate "2008-05-30T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-04"^^xsd:date . +dataFromRatingSite1:Review893 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product11 ; + rev:reviewer dataFromRatingSite1:Reviewer45 ; + dc:title "murkiest enthroning whiteheads rasters presages hollers hollering lacerable administrating marines overturned complect" ; + rev:text "impersonalized centralest hierophants pimpled pouched systemized pistache roper enplanes hoes timeless airframes pretested abaft floozy unstacked divagation dishonorable outdoors algin laserdisk seducing mandatorily restarting provoked frontages reacquaints drifted staffer boutonniere tannic arguers misarranges randomness manumitting workaholics sallying impersonally fiercely dissuader pears depictions lacings melons preconsultations unwarier scarifier epinephrine preconstructing hagfish hairbands hypothesist mountaineers constitutions hoggishly basified launders bisexuals slippers entombments disabuses atoning bund fireworks unworldly daydreamt reproves fragrantly unpent choiceness weskits powwowing orthoepist grimaces tankships abrogator traipsed convergency flans sulfurize cornfed backslider warmness stoup shirts tripodic hardier smashingly reapportionment spartans ringbolt tightly tesla skeining spoony unpaved spikily phlegms flubbed prams nonplusses erns rodman inopportunely heated biome stripping neophytes cuddliest chortles prelate overcompensation sedater strokes ruthlessly adeptest minnesotans unfailingness fumigation excretal dialogued nonappearances sicced creepers jujus exculpates abstruser effluvias retrogresses portions hatful delicatessens reflexiveness knockouts leniencies rakers larruping prismoids tetotum simonizes persuaded overfills hypotenuses apres doter retriever evening canonizes lumpiness levellers adorable unpremeditated plougher blondish effulgently gingersnaps piecers dickie tollgates countrywoman prying editions dippable teens expiating orthopaedist arborized debilitations foregoes empowered statable splotchier"@es ; + bsbm:reviewDate "2007-08-29T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2007-09-10"^^xsd:date . +dataFromRatingSite1:Review894 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product56 ; + rev:reviewer dataFromRatingSite1:Reviewer45 ; + dc:title "cerebrovascular genocides believed espanol" ; + rev:text "vealier perfectly stodged claddings hothouses gnawing warblers inkpots ritards valorem defrayals overlooking unready disguises spars spelunking degrees collegia brewed denicotinizes radically tinman kaons denouncers tsaritzas calkers noncorroborative thro agonizes dollars gumlike multifunction diastoles tyrannous liverish soothsaying ungathered noisiness realists rearmament feater nonenforcement facetiousness reassessments winded brainwashing federalizations impersonators unreeler incumbering jewry airmanship gweducks discourteous brazened stalkily lunars throughway parkas soothsaying splotchier"@es ; + bsbm:rating1 "9"^^xsd:integer ; + bsbm:rating2 "10"^^xsd:integer ; + bsbm:rating4 "3"^^xsd:integer ; + bsbm:reviewDate "2007-08-25T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2007-10-23"^^xsd:date . +dataFromRatingSite1:Review895 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product43 ; + rev:reviewer dataFromRatingSite1:Reviewer45 ; + dc:title "arabesks rebelliously unbefitting vatting azores woolskin exiguous spates rancheros swayback civets mangles pakistanis inhibitors biting" ; + rev:text "fluoroscopist accommodativeness nonplussing reunification equalises graupel pugilist narcotism overriding gallivants praises plaiters semiagricultural mesomorph scourger checkering sourball obsidians staggeringly cades restaff sireless dissatisfactions dildo impregnably cratons reg glycogens bookends galop flyweights education uprear choosey trining vivisectional realness testatrix polluters violates meditates subagents hup maharanee raison footsteps endocrinologic auxiliaries leashed zoneless reconcentrated inweaving predominated botanical rockers xenolith considerately receiverships querier raininess apprizes engrammes descants amoebous undauntedly threes frizzers achieves calif rebated furthered bamboozles pellets hosiers wiling painter limiest distractions incapacitator nephritises bluings quotations fusspots ashlar clanking lushing shielder mutative gongs laicizes whipworm haunched infirming novelize samaritans distension reconsidered reacclimate selectus refrains troikas rockets metricized rutabagas weeds swingier tastily girthed micrometer unsegmented berms isthmuses reforestation emerita cheesecakes generalissimo wabbly crappies centenaries katydid unchanged betweens deeds insolvencies serfdoms"@es ; + bsbm:rating1 "10"^^xsd:integer ; + bsbm:rating2 "9"^^xsd:integer ; + bsbm:rating3 "3"^^xsd:integer ; + bsbm:rating4 "1"^^xsd:integer ; + bsbm:reviewDate "2008-02-18T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-19"^^xsd:date . +dataFromRatingSite1:Review896 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product53 ; + rev:reviewer dataFromRatingSite1:Reviewer45 ; + dc:title "confusions depressibility idealism deflectable verbosely pirana retails toughy" ; + rev:text "actuator reflectively antibiotic elopers protectionist vandalizes jerkins showcased spheres niggard dimout mopped consummations briskly noumenon embryoid encephalic acred cliffhanger nonporous impurely armlessness solaced lunging clammier windlassed gip beguilements solos resonations unexperienced tisanes teacher apneic pruner ruinously incarnates roundelays spongins airer bleakly currencies overlie chicos monodist teetered heterodox ordains groundlessness knifes retranslations abandonments petioles saccharin toyish slithery happiness redistills dresses britisher equitably tweet spotter pining flusters caudated cures frumpish stubbing calked foliates cheeseparing channelize poachers boons tubbers snouting twills firebombs aslope spatular unloosening employs prolapsed harrowed trampolinist doomsdays milkmaid drunkenness cajon sandbar cleansing reminded wildlings hackee modellers appealers razes desponds rivalling redigests apically tolerance purgatively unearthly emulsifies encyclicals sidetracked columbines"@es ; + bsbm:rating1 "7"^^xsd:integer ; + bsbm:rating2 "6"^^xsd:integer ; + bsbm:rating3 "1"^^xsd:integer ; + bsbm:reviewDate "2007-07-22T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2007-10-05"^^xsd:date . +dataFromRatingSite1:Review897 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product54 ; + rev:reviewer dataFromRatingSite1:Reviewer45 ; + dc:title "dareful ambiguities breaking liberationists infrequence tautonym revisit bellowed boffos corked reannexing sureties reenlisting mesmerist" ; + rev:text "heiling palookas unpeopling flanker methodologically callboys joiner sweeteners conformers hoopster forenamed wigeon flavoury irrepatriable scrams semiopaque entertainments stretched skippered verticality pleated theoretically heptameters pretention irascibility spurned ledges incised lunging alliable chippewa considerable insomnias ordaining branchy revictualed smashable vertigines factually belted snuggling aweather reappointments untraced nutritively thickset counterattacked misogynistic drownding separableness sonnies glowering trainload rewed solved chirped nefariously curved transcendant willies lothsome midtowns luminesces sundowns avowers neophytes misbestows canvasser wryness perforating anointer basking colleagues playwears dioptometer antispasmodics yarns assentor sigils morosely exudates pipestem quarterbacks externalized steepled thoughtfulness spatular comporting fiercer caparisons soldierly parsec abbacies invented mousetraps pneumonitis genially allegations meatless consenter mutationally arbitraments abyssal signaller hexagons misstates guardianship squiggled transferability unenforced steeply cliqued stiffening grindings caucasians nineties hottest astringed digresses lissom geoscientists frosh brusquely typewrites tetchier manacled rational populating nasals reforestation donnas dustiest legionnaires solemnizing odoriferousness early unmarred transmigration overarches endoscopy spaceport darkie graving unsnaps dexes graveness blowflies underruns reflowing laughters brawniest fraternized gorgons endorsee upbraiding narcissists overstocks hocussing issueless dorsal legalities superintendency eisteddfod stuffiest"@es ; + bsbm:rating1 "1"^^xsd:integer ; + bsbm:rating2 "1"^^xsd:integer ; + bsbm:rating3 "6"^^xsd:integer ; + bsbm:reviewDate "2008-01-27T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-16"^^xsd:date . +dataFromRatingSite1:Review898 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product75 ; + rev:reviewer dataFromRatingSite1:Reviewer45 ; + dc:title "suers bios pseudohistorical resonation" ; + rev:text "cardinality mineralogist pismire aroused conjoined ciao submergible hustings fromage bevels insinuates procedures downplays caws metatarsi inflating metrologies estivate kingwood compere orchestrators frustratingly enthroning argyles cavils greco metre biopsychology excrescence spurner dwarflike reshuffled gloaming snouts adders putout fixative unreliable bowedness scanners headmasters ensheathes neurone swathers speckling tappers restitutive unbecoming confrontations presumptuousness literately underdoes bisulfide haematin superjets refreezing overrefine logier crepuscular wheeled traitress sidlers tonally assaying nests gabbros delineations sangria busings aligned weathermen disinheritance feasibility glebe mysticisms referencing trifurcated delimited disbowel positives nitrocellulose suburban introspections fantasticalness llanos admissions defeating jellyfishes reshipping abidingness bettas intombing morales incurious underdone obeahisms bespake gramercy vests antilogarithms cruelness thoued aboding embezzlers kestrels sequestrating babas associativity burgling planish rerunning sunspots deployed curbed housemother epigrammatist airbrushing abbesses oscillators enfetters medicating senilities inseparably stippler bookrack wampum bullweeds practicabilities rematch taxpayers interposer outrider ophthalmologist intoxicated bigots diligence accusations tarantulas prise paraded geomorphology harbours deviated"@es ; + bsbm:rating2 "9"^^xsd:integer ; + bsbm:rating3 "10"^^xsd:integer ; + bsbm:reviewDate "2008-06-05T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-13"^^xsd:date . +dataFromRatingSite1:Reviewer46 + rdf:type foaf:Person ; + foaf:name "Ezgi" ; + foaf:mbox_sha1sum "80fafc7186c30949963512c2a70c844b9cc7d19" ; + bsbm:country ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-08-31"^^xsd:date . +dataFromRatingSite1:Review899 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product47 ; + rev:reviewer dataFromRatingSite1:Reviewer46 ; + dc:title "assortments abridgers footwears reerected battling surveiled hobbler sovietize buoyancies interchanging" ; + rev:text "regulars refires hides sicked reinforcements appliques retractile lionizers kitchenware khalifa armers cassavas pillorying correl guatemalans racism arables discusses hyphenations mechanotherapy startler whirlies oboists cods jams collagens retransmitted shillings dining disobliging sadists aberrance gigs waxings cheeses atwain cresting liquefied moistly postally aggregated huts spaceless defeating colitises disconcerting candidacies impureness ambassadorship chedar unbudgeted hominized twitters knobbiness jingoist emancipating nonprofitable chloroformed preposterousness produces vibrates flagellating creepier ratline perpetrates dehypnotizing frauen intensification enquired refortifies weavers gasher counseled decahedrons sunburned haviour pushpins freres smiling surmounts accidentals filmstrips headwaters quintal deprecation decimation interdictions reinsures revisionists bassinets ungenial cordovan friskers drifting convalescing exhausts concludes cerates clubhand shawling sublimates cupsful menisci bewildered finalists applies minister lpm moribundly powerless recuperating"@en ; + bsbm:rating2 "9"^^xsd:integer ; + bsbm:reviewDate "2007-10-14T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-03-19"^^xsd:date . +dataFromRatingSite1:Review900 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product67 ; + rev:reviewer dataFromRatingSite1:Reviewer46 ; + dc:title "reenact scowls jadishly corelating bossily" ; + rev:text "phonological emigrants unaccustomed remittal unseasoned fixation jeweling usability unsurmountable decamps simony repurchased harnessing nobbler horseflies haploids talesman lightweights hackers immeshing inverses songwriters intangibilities splenification crookery teletypists rovings reproofs shiftier seppuku daisied lotions riffraff ejectum harmers splenetically signiors insatiability overdrives sortably decalcify occasioning defectors wittingly deliquesces inkiness linty stopple countering unbars ultimation warier surrealism exempting counterintelligence indenturing spathal etherify macintoshes arborescent radiants authorized intersexuality initializing carabaos dadoes untarnished hardeners skeptics aerobe bartended proctoscopies pourboire premeditatedness softeners bemoans spectrographer flaxier spits sacrificially ecdysial peke correl hora alterability scalper dyspeptical inconsiderateness primped ventriloquist backslapping peasants vaccines blanches rechristening immortals hayrides xanthates jetliners categorizations disorientation medicably augural iterated renouncement venter infrequence motorist capitulates materializing downlinks customize ousts surfings polders outstretched cribworks furthered weakening slalom rawish aerosolization pets nontemporal pediatricians staggers wrongs financially intrudes disassociation jinns vamoose bogies ratchet sleeking executioners windjammer naps cashbooks keyway obituaries furloughed centerboard beanstalk splenectomizing pretending crimpers usherette amortizement reconfirming excels acted nonentity forwarded burgled dimmock vilifier arbour refurnishes"@en ; + bsbm:rating3 "5"^^xsd:integer ; + bsbm:rating4 "6"^^xsd:integer ; + bsbm:reviewDate "2008-01-23T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-03-07"^^xsd:date . +dataFromRatingSite1:Review901 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer3:Product100 ; + rev:reviewer dataFromRatingSite1:Reviewer46 ; + dc:title "indwelt powders shattered doodad economize effecting" ; + rev:text "seconding obfuscates archives stipplers trimeter jewelweed etiological polluted outboast pointiest coif unappreciative customize duddy unmindful unmaintainable sloping syndication graduand reheats feudalistic catnaper peevishly reincarnate forgetfully cricketing bayoneted spectators facets powerhouses protea reapplied flaccidities settles shaving checkpoints argumentive arrogated uplink congaed echoey joram adoptabilities overlaying underruns rehashes disjoints scalds annuls antipopes catcher vesuvius indifferently signalling confection hitlerism forefingers treacherousness contorts entrants transferals antiinstitutionalist supremeness fungoids latvian tetragons unzipped canalize firebox enunciating cincture sacramental unfalteringly unbaptized overthrow roundworms rounded inversions glycosides headrooms messiness interagency clucked tenets fids hollering dissuasive cornstalk boarish xanthous denuder vapour hangdogs adumbrate driftpin inmeshing mediational assails narcos abdication invalidating traipsing condoners drums subfractional chariest afrit unnerving dancing supervisor smellers georgian fuses reconcilers telemetrically spurts reopens ameliorations hydrocephalic dehumidifiers scruffs eclipsed securance manoeuvred overrefine sunned numerably hydrocephaloid seldomly bragger inhumanely steeplejacks senecas subtract hypothecated unauthorized outmarches skips tulles redeliberation striating fuddling interposition unicameral taxidermists nappy nonmalignant twilit minimalist mg missilry franchisers quahaugs boomtowns soared hypotonic pinching litigable pensioned manipulated frenchwomen callosities judicializing bemata useability pushers benumbedness highth beseeched pock hairsprays poiser consisting gonofs chippewas insulators ritually indirection demilitarized dismiss sermonizing cuppy continuations condescending discontentments"@en ; + bsbm:rating1 "7"^^xsd:integer ; + bsbm:rating2 "3"^^xsd:integer ; + bsbm:rating4 "9"^^xsd:integer ; + bsbm:reviewDate "2008-06-15T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-17"^^xsd:date . +dataFromRatingSite1:Review902 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product50 ; + rev:reviewer dataFromRatingSite1:Reviewer46 ; + dc:title "homicides facer thermometric ulsters bottomless topes zeroing impaired quadriplegic wrier restorals corporative strider" ; + rev:text "entropies graphologist ringer pointedness sated jeopardied eutrophies enzymatically appealers ciphonies imperfects headachier towies overseers radiocaster mousses mainlander drawer bisulfate fridges weeping deepness aligner bioenvironmental brahmin turgors layerings undemonstrativeness bloodmobiles plodded cordoning coifing discases troublous foetal mazing moratoria spearers radioscopic filtered groovier centeredness emirs embays wholesalers hypnoanalysis clastic railroader governorships eyeshot completers giggliest bombardments wreathing pranced copilots participatory bloodedness grayed chords honkers phonies cannonry mouthfuls toughens allotropies debaucher conversed seminated tonsure illuminates devilishly unpersuasive farthingales recompensatory jewelling acuteness audios oilskin maypoles shuns colonials bactericidally shimming somatotypically reconsider adjunctive"@en ; + bsbm:rating4 "10"^^xsd:integer ; + bsbm:reviewDate "2007-10-12T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-02-21"^^xsd:date . +dataFromRatingSite1:Review903 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product59 ; + rev:reviewer dataFromRatingSite1:Reviewer46 ; + dc:title "mentions correction woodnotes clicks overthrowing headcheese barbarians clop rectangles jetsams alliterates bijous abnormality" ; + rev:text "caponized refuser bunters storing choroids coacting cabins kelvins liars stalemates villadom psychics ovarial anneals denazified overextend kinematically restiveness frighteningly overtop bolsters generalists widened swiftian stealthiness designated ikebanas greasier greatcoats megavolts mensing hayloft racing unsubtly citations asters valued visitorial gummers forfeited subtract femora plotless percussional rocs roomer cuticles scarfpin variableness oarless panics snoutish pockier dadoed moxies dears foehns felling enclosed dechlorinate refire plutocracies esc forearms droopiest chanticleer histaminic averts utilization curded pensionary exempla connivery subhumans stiffs subacute demonize feeblish congregant teratoma guarantors knifed clodhopping bijoux pecans vocalizes touchiness electrophorese catchier promulging herpetological"@en ; + bsbm:rating1 "3"^^xsd:integer ; + bsbm:rating2 "1"^^xsd:integer ; + bsbm:rating3 "1"^^xsd:integer ; + bsbm:reviewDate "2007-07-18T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-10"^^xsd:date . +dataFromRatingSite1:Review904 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product34 ; + rev:reviewer dataFromRatingSite1:Reviewer46 ; + dc:title "lector amies undetachable nativity didacts deciliter reverser" ; + rev:text "illiteracies talkies bankbooks reelects gratingly meagerly crummies micrometers lamaism squinty threshes stinkards solver pumps twigs abundances untutored televisionally inartistically urbanism conjunctive cleanlier limacons lodgment raffias nonstop amnestied postconvalescents unsuspectingly milked disintoxication pressmark physicians flatulently androgynous embers conventicles whittling teratisms typically sultana bedew abridger wryness sliceable footpace perjurer thumpers revs colorer washstand yens plausibly pelts recriminations grumping outwalk olfactometer doggish ceriums cricketer semantical indicators spondees nonindustrial housewifely unmagnified redbug utilizes bogs implementing rickshaws coking brights capmaker"@en ; + bsbm:rating1 "5"^^xsd:integer ; + bsbm:rating2 "5"^^xsd:integer ; + bsbm:rating4 "9"^^xsd:integer ; + bsbm:reviewDate "2007-09-02T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-27"^^xsd:date . +dataFromRatingSite1:Review905 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product51 ; + rev:reviewer dataFromRatingSite1:Reviewer46 ; + dc:title "nosiest nonreactive crystallizer loopers detectors captivates oaks unconvertible" ; + rev:text "jives elites bolstering volitions alizarins freshet mousings gemsbok boiler unconstitutionally roarer polyandries controls gogglier humanized leniency anchoritic bloated cervine broiled temperers beltlines performer alining compressors iraqis explicitness stover mediumistic camped veep interregnums exhibiters meters motiles nubbiest rakishness bulgur reframe miserably ballistics flowerless tutees cauterization condiments cheered sutra bigamize acetylcholine tunelessly aspects promising biocides martinet nostalgically inched reconfirm nimbleness renewers brutifies perspicaciousness undoings reletting lyses installers trinal detriments ringleader bluebirds texases skein impetigos skulking oakums arrangements shipments mitigation argons vulgarer freaky outplayed deuterons flakiness diffusers gastronomes meres eliminating vagrance cooncan persuadable frazzled ushered nookies overall expropriating centrifugally nighthawks relations deodars spewer reconcilements semilunar dependably scrappers consequently reneged immortalized obviated bilged pegless carless frothed fortieths weaklier dopester relishing stagflation uncertainties legalist marinates merchantmen barons brotherliness empennage deviltry blurred goring ejecting teddies activistic ordained digests"@en ; + bsbm:rating1 "7"^^xsd:integer ; + bsbm:rating2 "2"^^xsd:integer ; + bsbm:rating3 "3"^^xsd:integer ; + bsbm:rating4 "2"^^xsd:integer ; + bsbm:reviewDate "2007-06-22T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-04-23"^^xsd:date . +dataFromRatingSite1:Review906 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product48 ; + rev:reviewer dataFromRatingSite1:Reviewer46 ; + dc:title "reinforcer barbells deliverables bruiter preprinted vugg reinoculations prologued homesickness dreadfully overbaked" ; + rev:text "barriers zipping trespasser acclaimer libelants bentonitic undercharging actuality evolvers baggies miasmas unadvisable blotto denouncers chunter membered carinae epeeist putrescence uplinking licensors collectivizing metrist conceptions pureed miniaturizing outran verbid idolised representing collusively martials gating parboiling catheterized amylase arbitrational cecum penang torching sconce showgirls phlegmatical mildens vamoosing crackled preenlistment wizardry monumentally percussed weatherworn melchizedek explorations uncomfortable hematinic stowing dimorphism tetraethyl chapters unbear procathedrals sharpie xenocryst loury experimentally jackrabbit irritation fungicidal yelled unsticks quartos disciplinarians premeditatedness castigating effusiveness funfair alarums incriminatory froufrou pardoner seaweeds moronisms truced pulsed extraditing scrapes mended flockings woofed nils bikeways vanman scantiest artiste timings supermen pirated chemotropism lifesaver renigs visoring hindquarter rustication milder interludes sipping molested jests sheikh sleekness nettier equalling friendliness tambourines reglaze victoriousness anomalies roughens auburns discards convergency instils visuals nonabrasively lungers ablating congos endorser cubiform heavies inbreeds syringing despotism unprofessionally telegraphically biddies alkalinize unoffered shakes digitalized inkstand fletches"@en ; + bsbm:rating1 "5"^^xsd:integer ; + bsbm:rating3 "8"^^xsd:integer ; + bsbm:rating4 "9"^^xsd:integer ; + bsbm:reviewDate "2008-02-14T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-02-25"^^xsd:date . +dataFromRatingSite1:Review907 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product59 ; + rev:reviewer dataFromRatingSite1:Reviewer46 ; + dc:title "pygmies preadjustments limes resumer casa" ; + rev:text "titbits alinement sandblasted favorableness retrospectives embraces glider robes marines holistic snailed chicaneries misadministration lowlands modulators fridays fidgeter fromage exalter stags nonprocedural fax musher vivant laryngotracheal extincts dreamless nonviolation preparatorily bucko clocks curative labials multiplicands symphonies badging cornify pietist falling footlockers papayan sadisms drawer unquenched serumal whats ethologies carbonize dalles overdecorates deflection grantsmen marcelled friarly pentathlons excisemen toller graveled opposites immortalizing jurisdictionally wooding antiquer memorizer rapes wordily salsa gingerly propagandistic dojos"@en ; + bsbm:rating1 "7"^^xsd:integer ; + bsbm:rating2 "1"^^xsd:integer ; + bsbm:rating3 "10"^^xsd:integer ; + bsbm:rating4 "6"^^xsd:integer ; + bsbm:reviewDate "2008-06-05T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-09"^^xsd:date . +dataFromRatingSite1:Review908 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product27 ; + rev:reviewer dataFromRatingSite1:Reviewer46 ; + dc:title "contortionists grossest pierces commiseratively" ; + rev:text "hafts unaffectedly normalizer gyrator pyrenes stamped narcissistically petalled sedateness purposeless leafs keelhauled underpinnings keypunches helpfully lymphs incitants axletree spottier caltrap jackboots lived physicians eschalot moodily chirped hallucinative toyon peasants pentateuchal newspapers dirtiness britons weaned peekaboo prestidigitation adorability scupper burins peeved chintzes fulfiller sowable headlocks peepers habitably resoluteness downgrades polymath bobtailing blandness ridded contemporarily undyingly scribes dads totterer fripperies acned doughs lucite whickering slimming sembling intromits laborsaving gibbeted widdles hemoglobinic aspirating demonology dogmatical unworthies rehabilitator wakeners herdmen inconsiderateness reprobates resells virulences placard intimidated overstretching kakemonos weepiest incrust yarest doc containerships prevailing robustness cupped garlanded panegyric overbear tunnelled redefinitions adjudicates agents apogees slanderers heydays accents mussily schussboomers babblers narrowness retailor serializing reinserting eerier entailers regulators ducky schistose awfuller expediences nonplussed bonsai bladed nudist creatures toothpastes skirmished highbred gravamen aneroids teslas realizing octets cosecants ideals fallaciously incivilities honeymooning unconcerned tackifies vroom troubling centums therapeutically beekeeping muskier pettedly carbolated damned paganized falsifications sunstrokes ureters sorriest impends theorize combative unrespectfully cerement"@en ; + bsbm:rating2 "10"^^xsd:integer ; + bsbm:rating3 "4"^^xsd:integer ; + bsbm:rating4 "6"^^xsd:integer ; + bsbm:reviewDate "2008-02-12T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-04-20"^^xsd:date . +dataFromRatingSite1:Review909 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product49 ; + rev:reviewer dataFromRatingSite1:Reviewer46 ; + dc:title "eccentrically neuralgic ergs cleats handler monstrances postmistresses" ; + rev:text "epigrapher surplice mauling depreciations corollas lilliput lowboys overshoots spired insomniacs whiffle bivouacs scoopful mamboing unbeatable genuflect manifestly substantival sulpha attractively piously headiness ocularly tetanal aligners overspreading calligraphers unliveries drear spites garnishments trimmer deprecated domains twier ladles intertwines ponds knitting unpopular freewill vinas foregrounds cleaving vagabondage ideograph relievers nonenforcement statement tilled lagged inappropriateness nomograms rarefied hazing evinces disenfranchisements raveler denaturing duality undergrounder graperies gerrymanders depolarizer egoistic ordinarier renominations overlaid vetches hardheaded reintegrating decisions unconquerable succoured sadists churches etatist flays ventricular overflying pennilessness beneficence organizes deflections doughtiest premolar unstapled likes legs sphygmomanometers dicks personable creative shits origination equerry tenderizes belabour sentiments firstlings loots shynesses treasurership applying gamesmanship widowerhood betweenbrain drawly splotching abstainers impediments consideration remembered articulationes wagoning microbars harrier payability crucifies wasted gambolling spicery saws fostered muggiest propended ultimately culpability vowing sassing beechen mismatches seedcakes joshed verdancy gatefold calves saddest unknowingly juridical objections baal cabbala splicer abruptest manchu exhibitions hassles comprize upswung outdrew adenoidal curtseyed vanisher inchworms overprotect engravings corrosiveness queasier unsophisticatedly cavitates pieced beloveds mungoose annealing blastier"@en ; + bsbm:rating1 "9"^^xsd:integer ; + bsbm:rating2 "8"^^xsd:integer ; + bsbm:rating3 "7"^^xsd:integer ; + bsbm:rating4 "4"^^xsd:integer ; + bsbm:reviewDate "2008-05-02T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-19"^^xsd:date . +dataFromRatingSite1:Review910 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product61 ; + rev:reviewer dataFromRatingSite1:Reviewer46 ; + dc:title "fecundity karts unalarmed misedits sputniks psychopathies portability cataleptics bushwhacked strugglers purlieu" ; + rev:text "dinettes reality ambuscading legists toluyl mustily reanimating prims prepossession vervet unused fulfils plainness pollinated prosecutorial sifters soldiered emmet wedder gonocytes incapacities whammed volkswagens bungs raga breads unclear oilstones dissection dishevels prepossessingly uncommendable enamels unrepressed farmyard hysons roses nannie nepotic dazzlingly associating bareback coexisting outputting peppermints sieurs rededication scrubs topkicks emollient tumbleweed misadjusts supermarket visoring influencing snipes idles lodgers jesuitical merged viperous cupbearer rider corsages arrogated exposited fadable eliminant accruals durn preordaining cambist subsiding earthworks reissuers squished billiards roached warlocks sublicenses petrols califate sylvius leaded erewhile riddles empresses milliners restrictionism inexpressibility spiciness unasked admissibly mosts soled propagandists sheepmen herds hutted misinstructed impinged uneasy pretention mutants secretaryships gelatinize ripsaws"@en ; + bsbm:rating2 "1"^^xsd:integer ; + bsbm:rating3 "4"^^xsd:integer ; + bsbm:rating4 "1"^^xsd:integer ; + bsbm:reviewDate "2008-06-17T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-19"^^xsd:date . +dataFromRatingSite1:Reviewer47 + rdf:type foaf:Person ; + foaf:name "Gebharde-Yumako" ; + foaf:mbox_sha1sum "5a2df4fecaf1869c7c9a7f30dc718a46f3e6a25e" ; + bsbm:country ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-08-29"^^xsd:date . +dataFromRatingSite1:Review911 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product26 ; + rev:reviewer dataFromRatingSite1:Reviewer47 ; + dc:title "execrably thanatos jackknifed fellaheen testiness deeded positiver lith clouds uglify paganize enshrined whooping fortnights genteeler" ; + rev:text "rejuvenated picking functioning chatter mastics neophobia overmuches kickup routemen readying cockpits fortifications seducing reams interlopers backdrops quotas unforgivably overate bailouts paltrier nickering editing mutterers natureopathy ridded foreclosed gibbered friendships sustaining conflicted discontinuation encountering shivering reinfect burry isobaric disused nonadvantageous raggedest laude chelators zowie pantheistic yahooisms outsets fines somnambulistic tyred trestles intermittence comprehends contagiousness contraindicative peddled nucleoplasm loather departmentalism ensuring orts amnestied unregistered pretenses galloped unwarmed vainest thumbtacks typecase subdivision oculus furores soliloquized swatches imprecates underwriter confounds repatriations tannins perfumeries bagnio faked slynesses cavitied tigereye copse unrepentingly coonskins cannibals jaggs lentils nuttily educed punchy signiory doyens fifthly annealer temporarily warheads preestablishes pinnings handwrites mattocks campfires antlions tourings ingroups vers preemptively unravelled centeredly cataclysms kip sensing noncomplying tramlines affiliating rosewood ensue suppler absented outdating autobahnen abounds nonconcurrent costarring reinfects trips determinacy pipelined artlessly overthrowers tireder skywrote fullness gaiter astronauts spoliation flamethrowers yokemate defiances coded panaches premeds mentioner deportees vitalising huffing propellent mercerizing witticism adventured dewaxed lumpier writers subtraction grandiloquence contradicts bdrm xmas frisker kart petitional marmots underdone feeler rangers reintegrated tangoing misjudged unquestionable convulsant tessellating vibraharp outlandishness cotes doggerel weakness degauss pentadactyl dilation arsenious thermocouple cataclysms describes displeasing ascribing agnosticism vulgars bolos"@zh ; + bsbm:rating1 "3"^^xsd:integer ; + bsbm:rating2 "3"^^xsd:integer ; + bsbm:rating3 "1"^^xsd:integer ; + bsbm:rating4 "4"^^xsd:integer ; + bsbm:reviewDate "2008-06-08T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-19"^^xsd:date . +dataFromRatingSite1:Review912 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product36 ; + rev:reviewer dataFromRatingSite1:Reviewer47 ; + dc:title "eminences hydrates nincompoops breeding insulations knowledgeless successional cenobitic clamor rapping puritanism indianian mohair duties" ; + rev:text "uproars noticed appends tiglon months national linkable braces discards quintillionth hydrolytic swaybacks lingier obfuscators guardianship neuropathy rustles advancements demonetizes batched misogynous nomism dales plunderer monogrammed clotured chumships steppingstone nonmoral towels wormwood skiddooed chalices hebraist bowdlerizations uprisers lukewarmness oversubscription taupes hilariousness antisepsis subverts nonconcurrently hunched unpersuaded lacily mirthfulness klatsches groggier sidecars restrictionism stars dashingly soccers nebs nightly continuer swaggerer swagged percenter matzohs adaptations revolts illusionist grader fantoms foghorn deplores featureless zincoid disorientate bumpily cragged spittoons chemistries chlorides flatfish feminize enfilading niggard portended predecessors staking unfamiliar vociferously nazifies tortured enserfing fubbed nearer tackifying lesser procurators jinxes insinuating genuflecting celebration ulnas persuasiveness klatches twas sextiles unshaken deterrers cines oceanology choroids bodysurfs pseudohistorical improvisations burin caching operational dived pinatas idem nerved prinks readmitting abjured heritrix misdoubted virginity topsoiling intellectuals fells coarser unseasonable buntings biopsychology oxtail prearrangement disorganizing beechnuts landocracies latterly unregulated truing anaesthesia outweighing transcribers damocles lemuroids biles armourer switchmen coamings heartlessly midwesterner junglier imitative leafing musingly doctorates misquotations monocle melodizing bractlets meanings markka links aggrandizer preponderantly fauve gnattier changes kilos permanents intensities porosities shags recallers plutocrats footfalls resuscitative hairweaver virucide disputer outgrowth tramps tangibly whammed holstered mannerless spiting defecated"@zh ; + bsbm:rating2 "6"^^xsd:integer ; + bsbm:rating3 "3"^^xsd:integer ; + bsbm:rating4 "10"^^xsd:integer ; + bsbm:reviewDate "2007-11-07T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2007-11-17"^^xsd:date . +dataFromRatingSite1:Review913 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product41 ; + rev:reviewer dataFromRatingSite1:Reviewer47 ; + dc:title "incomings flighting eductive dangerously" ; + rev:text "temporizers autocrats confinement conned musettes bedwarf nutritionists dopey urogenital pillions overdramatizing overween flirter antiparticles curiousest resettings recontested improvements catamites splicing nontraditionally centralization overrefine federacy unsticking cains temporalties suspects scrounged portliest outlets refusals archaeology pleads driveled obsoletely rarest detonator floodgates emetics toggled secreted snapdragons ughs unfledged tramped collocating inaudibly motorize decapitation preinstruct washier scarletina redeposited enhaloes kludge polyglots knowingest immoderateness eyewashes feedbox octette caffeines inverter pillorying grading intuited subvocal desiccators misalignments haughtily piddled unenriched moistener sparklers crabwise fattens strangler relaundered sounder afeard delict products spectated footing liners datelined foreswore overflying contentions rassled ceiling flingers horsepowers kitschy squiggles hdqrs disgusts gerrymandering omnivorous faultfinder polkas pollutants buffoonery stouts invitational touting glorias expiation maintains citable traditions vomiter expressiveness soilless incorporatedness loiterer attending cuckold sterner plinths deliquesced beckoner cobber mumms bishoping bathed nonunion reappropriating relabel prophesiers serigraphy"@zh ; + bsbm:rating1 "8"^^xsd:integer ; + bsbm:rating2 "1"^^xsd:integer ; + bsbm:rating3 "5"^^xsd:integer ; + bsbm:rating4 "10"^^xsd:integer ; + bsbm:reviewDate "2007-10-05T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-02-29"^^xsd:date . +dataFromRatingSite1:Review914 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product66 ; + rev:reviewer dataFromRatingSite1:Reviewer47 ; + dc:title "borated maharajas knowings riffed cassavas" ; + rev:text "nonalcoholic minster gnomical layered larynxes scrams earless madded appositely azores telepathies bichloride erotism depicter metricized photochemist knotweed saffrons discouragement filmcards needfuls czardom sere unmended antioxidants receptively sardinia titillations uncancelled typewrites incarnadined rerecords decimals aunts impacter cetacean frowsty uncompressed unfreeze gloomier simplicities scraggier intl snatchy bogeying batholith inheritably gingersnap sifted semirespectable manipulatively tartuffes fluorination primos marabous contentiousness paretics reducing depressed damned rinser impassively feaster quadrigamist slider pedagogs petrifying desalts bimesters endowments demagogy legroom desegregated purloiners revilement substructure misunderstandingly lifesaving serfish patrilineal crested shunter fracas funnelling lurching foreshowed baksheeshes creosoted pepper savour ramming geothermic phallist sofar mitiest"@zh ; + bsbm:rating1 "2"^^xsd:integer ; + bsbm:rating2 "5"^^xsd:integer ; + bsbm:rating4 "5"^^xsd:integer ; + bsbm:reviewDate "2007-07-30T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2007-10-13"^^xsd:date . +dataFromRatingSite1:Review915 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product72 ; + rev:reviewer dataFromRatingSite1:Reviewer47 ; + dc:title "unpretending wormish dislocations lozenges rassles urushiol unbearable apes" ; + rev:text "shammer shouts undermost welshwoman transforms tossers weaned pawner aeronautically looping industrializes noneffervescent skeining redressed sloughier dioramas britishers ramekins voiders comminatory decries bowery chlorinator caucasoids impersonation subfamilies eliminators handclasps campo adiabatically misdescription guiled shedding carapace ligatures provoked cay confraternities extradites interlope chanteys cuddy tromping whalers druidic decapitations obesely shins impalas bestrides diopters inked musher porose geochemists incrusting boudoirs unsterile fillable witchings scuttles starved sceptering reclean mortiser parker cubism heuristics ninon frauen adjurer aluminas housecleans exilic draughty drearier cliques kegler retorts remonstrance minnesingers millworks capelan erected twangles troys graduations catnap banalities gunlocks pawnbroker shutterbugs tarnishing spouseless bevels touzle plasher unhung kidder highborn unadvised laconism marshalling aquanauts sooey tonetics measurers besprinkle fubsier"@zh ; + bsbm:rating3 "6"^^xsd:integer ; + bsbm:rating4 "9"^^xsd:integer ; + bsbm:reviewDate "2007-07-18T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2007-11-05"^^xsd:date . +dataFromRatingSite1:Review916 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product17 ; + rev:reviewer dataFromRatingSite1:Reviewer47 ; + dc:title "crocket pooping chamoix hostessed lapper nasalizing inhibited prettifier subvarieties tranquilizes tantalizing skycaps purim households" ; + rev:text "beamed kinesthetic widest vitiated trices soldierly barterer prosthodontics dewing spiked oidium forewords upheavals prosthodontics artfully boons leanly nonkosher disks pendulous sanga correlatable constrainers transcendentalizm canoed fileable primates skulked indictments townfolk aloes ransackers relics sheepish legateships dadoes immies compressed primuses tryster flagmen vitalized evertors hazing mesmerize toils lapped tutorials speculums vidkid moulds dies voteable gainsaid passivity bypassed cogently externalism jeux hoyles biologic pursuers subtenancies instability methylparaben cavorter ambushed nobbier hulling epaxial collegiality overdrew brachycephaly reinvolves realness heeling spindlier landfills credenzas unmerchantable hulking muscles exaggerated ibises auditorial"@zh ; + bsbm:rating3 "7"^^xsd:integer ; + bsbm:rating4 "1"^^xsd:integer ; + bsbm:reviewDate "2007-12-01T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2007-12-29"^^xsd:date . +dataFromRatingSite1:Review917 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product68 ; + rev:reviewer dataFromRatingSite1:Reviewer47 ; + dc:title "ireless specialer whoosis overdevelops finis perceptibly" ; + rev:text "semidesert drachmae vanes heehawing ribless publishes tercentenary carousels clinked sapiently weeps sifter homelier unmitigatedly crinkled redigestion postorbital freelancing guardhouses soundings transfigures consults viceregal pulsing sneakingly propjets inarticulately grueller upload dilatoriness greasers rectifications swamis yeastier rests demonstrated exploiters unfulfilled powwow tintypes yentas actuary scroungy foundlings datary legionary triplicates decompensating pouncers baksheesh futurology progressed oarlock cheats shaving cripples caverns transferror prefacer auks tramples unsnapped integrationist stingo clunk oyers bankbook huts whizbang sportier anglians miscue steamier confirmor scrapped"@zh ; + bsbm:rating1 "1"^^xsd:integer ; + bsbm:rating2 "5"^^xsd:integer ; + bsbm:rating3 "5"^^xsd:integer ; + bsbm:rating4 "10"^^xsd:integer ; + bsbm:reviewDate "2008-03-28T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-19"^^xsd:date . +dataFromRatingSite1:Review918 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product19 ; + rev:reviewer dataFromRatingSite1:Reviewer47 ; + dc:title "restively sniveled avg delicatessens crimpiest hotkey recirculating camouflager treks furbelow helices" ; + rev:text "festered dockhand romanizes marinading reclaimable poinciana grandiosely paradoxical handspring steadiness pigeonholes ramping padlocks nonuniform superannuation admissions prestidigitation coonskins reenters forbidals zoogeographic plunks mayday projectiles creditably outfielder nasality elapses wadable siphonal scandic toolers retarder coalbins mendicant preshape nurturers firsts alleyways dizzily indemnificator enhaloes introverts graecizes chases underemphasize fraudulently xmas discover opalescence enmeshes sudsiest plasmoids misbehaves isolator owlets counterbalancing transmigrate coverings tantalizingly simonies feyest impassibly tramcars plethoras elated dismissing ducting roofer misquoting misbills brawls triaxial snipped beautifully"@zh ; + bsbm:rating1 "2"^^xsd:integer ; + bsbm:rating2 "7"^^xsd:integer ; + bsbm:rating3 "1"^^xsd:integer ; + bsbm:rating4 "7"^^xsd:integer ; + bsbm:reviewDate "2007-07-29T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-01-16"^^xsd:date . +dataFromRatingSite1:Review919 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer3:Product97 ; + rev:reviewer dataFromRatingSite1:Reviewer47 ; + dc:title "craggily mazy reflects aerators choosing outfielders retrenched" ; + rev:text "agonize fauves reentrances rya wanness hypersensitiveness obtainers mayest shote overbalancing pedestrians choreographed denounced trolled slicer stepbrothers curbings redo renege reconstructed stimulations narcotherapy initialization dispatched broomstick dimorphism ethnics blindness mux imbeciles nationalistic oversubscribes thankers toxicologist equalizing thirtieths lumper reinflaming slating ritziness garblers converges reharmonization botchiest guessing harder secretness autopilot concertized postfixed bozos verticillate instillment jowliest meditated catfishes heaving ennobler buoying tetanal tournaments basely antlered disfigure centralizers administration everest inequable uncloaks terrifically debauches surrealism bartizan devalues mangels impalers quizzing inarticulateness unpersuasive bund yammer tubifexes jetsoms lignifying pressman decimalize unamortized etiolates scintillator gearcases micronesian flits bot masochistically graces installed weasands lobos kitsch recolored irresponsibility restfulness institutionalization wheeled bandmaster colonelships generations engorge cognise clitoridean exceeds bitchy prosiest quellers bums bops jeweler zebu xanthippe unassumingly proprietorial nontenure intercommunicate ionizable cosset rearwards umpires forums restraints dilatator nonmalicious sublets archdiocesan wager armrest mobber heralded xiii scares ellipses reunifications recitatives prechills braiders trapper hrs starched solos retreated wirepuller noninfectious vestals indoctrinating objectives milords irrespectively reconcentration toolshed polys theorizer encyclopedias legator parturitions unsatiable authors energise slushily apteryxes spadeful friendlessness hardheadedness undisposed faeries vestees"@zh ; + bsbm:rating2 "9"^^xsd:integer ; + bsbm:rating3 "4"^^xsd:integer ; + bsbm:reviewDate "2008-06-08T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-10"^^xsd:date . +dataFromRatingSite1:Review920 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product80 ; + rev:reviewer dataFromRatingSite1:Reviewer47 ; + dc:title "elongating retried crosswords sluggishly" ; + rev:text "illimitably obligingly pickier discase polemize soaper cuddled aerosolization eternizes roved barricaders wishbones enchainment hedonists freestanding abjures ropeways tsetses fluoroscopist devilries taupes genotypic poleaxed pixies janitresses cabbala hajj tutorship empaneling crappies victimization siphons pluvially learnedness reinvigorates codas abundantly ruefulness calmed jacketing dusting ropily scissoring deprehension sideslip gluttonies coffeecakes revellers flammably consenter anviling behaviorism cuttle chaplains senegalese involuting recontamination chancellorship inhumer mousse holdups dermas fretsaws notifications mediates revelries jazzmen rowel implied consolingly crystallizes sublimest polishers hyperbarically lawing interdiction tweezers samariums grimness clicker unclad electrotheraputics factorized upswept drills empties consecrator incarnating actuaries effulgent sequestratrix meprobamate narcomania tabstop baptized unearthed tahitians dekameters vivisects variableness slicing belaboring wharve ribber cognomina"@zh ; + bsbm:rating2 "4"^^xsd:integer ; + bsbm:rating3 "4"^^xsd:integer ; + bsbm:rating4 "3"^^xsd:integer ; + bsbm:reviewDate "2008-03-19T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-19"^^xsd:date . +dataFromRatingSite1:Review921 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product67 ; + rev:reviewer dataFromRatingSite1:Reviewer47 ; + dc:title "unsoundly lotharios abbreviated lacrimation rebroadcast stuccos argle inflecting" ; + rev:text "ejaculations gawkiest sardinians estoppage betakes vocatively valuably retrospectives mantua parti aspirations reworked entrust bloodthirstier bendee sating peridot eyeholes pedophilic commingled wings aurated proprioceptor pivoting annotativeness spaceman zarfs cropped refocuses sizy multipurpose apiarist sounded emplaces unidiomatic deceives footsteps pinnal nooser surmounting sapper millwrights hardihood bailiffs kayoes opts gewgaws jesting insalubrities resistance plumber stinkier stonework vamping idiogram unfurl pachyderms explains snide fertilize postdated databases windiest scrimped sashing mama kadish interpolators sciroccos acetaminophen swearer subcommittee belaying factiousness decking moi contrivedly"@zh ; + bsbm:rating2 "4"^^xsd:integer ; + bsbm:rating3 "7"^^xsd:integer ; + bsbm:reviewDate "2008-04-09T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-04-26"^^xsd:date . +dataFromRatingSite1:Review922 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product82 ; + rev:reviewer dataFromRatingSite1:Reviewer47 ; + dc:title "unbuckles artificers indorsement definitions dieters jetty" ; + rev:text "twitches raggedest underdrawers spaceport acidities whirred scouters corders clotured corroborates serrate masquers cardinalate corvine hungered gassiest nonferrous houseboats cohesiveness interstates quadrants prepay nebulizes geosynclinal subprincipal curtsies cozes crossbreeding stillier maternalism strikeouts allovers tykes suicided weaning enfilades hirers aphis macer gauzily luxes vitiates calmingly dyspeptical crumped typefaces sawflies commination phosphors howdahs gratefully bereavers californian imitator studying profiles homoeroticism ethnicity inseparability leeriness defrayed henpecked hermetically tranquilized inattentiveness tempura turtler fifing anthill collectivist sacrifices chiefer whoresons peccadillos seemer radicalize recondenses nonenforcement coastward likelihood huskiest assoc oppugn marimbas boggiest detergents suspender tup everglade corrupted unevenest spots bastilles flingers iatrogenic pawners moonbow interactively gussets unmistakable senselessly speeder expatiates bungholes radiosurgeries fungic parallaxes sylphids malingerers disadvantageously anticlimax vicariously rejudged torpedoing bossisms favoring opposed owed darkey uncordial taxingly schoolhouses foolishest egged surrenders expectance jiggled gutlike attracted grandmaternal extracted fameless tarnishing bilgier alternately bustlers demolished traded flagon darndest suddenly whirler dabbing celebrationis mildening toenailing deceases gaggers flawed deftest inverts checkoffs disruptions sprained reinvestigation rupturing snots reprieves keyless recounts jackpots cobwebbing ritualized windiest robotisms describers nuncle imperilment entrapments depicters driller mammee lysing kicker lungers rustlers laboratorially thiosulfates attacking demobs dumpish intellectualized seriously cheeped counteroffensives pollywogs flyblown slangy brambling respelled karts slyer restorers measurers analyzed pigweed outflanked depopulations overdrunk contingents"@zh ; + bsbm:rating1 "9"^^xsd:integer ; + bsbm:rating4 "10"^^xsd:integer ; + bsbm:reviewDate "2008-05-29T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-17"^^xsd:date . +dataFromRatingSite1:Review923 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product54 ; + rev:reviewer dataFromRatingSite1:Reviewer47 ; + dc:title "wrasses reexamining smiting dognaper sunroof" ; + rev:text "obscurantism shreds ambulators forjudged guttered inflated reformating hafts debunking caitiffs invitations sarcasms imprecations bibliographers litterateurs combaters intermediacy wobbliest revellings punishing murker undertone jimmying presidents latinizing devastator burnishes parietal visitatorial sallied rejudge fleabitten misgive unfixed bigly blameworthiness screwiest civilise splenectomize jackal follicles adamantine solaria shellacked underfinances dulcify fixe dishevelments corking epilogs stroked lollies senna verniers hamperers stingingly frequenter nonperformance walleyed princeling enlightening brontosaurs xx browned sumos discoursing kins feminacies gipsied innholder lidar cumulonimbus inadmissibility reconverts lengthens apelike recombines revivals herefords replated oversights caldron cheapskate confines dominos homagers starrier determined immortality ingenuously unfit visions ebullition untidied sudoral wriest sketching shortcuts airways gruelled oversteps unstrap carbo inductances acidoses ceders incommutably corner clumsiest screeched cyclonal inhabited taxers lances carats scarlets labourers amnestied punishers hurtless adjurers consistencies wieldy gravimetric hubrises strayers coloradans ulcerations saddlers nock carinas engross similarly cavalries remarking burry horrifies gusting meekest kedging threated cardinality prussians animato rehanging overseership hieing sandsoaps studying outsmarting stipulations snuggled haylofts awaits deportment bruting mercenariness versicles tonality chumminess hernias levying bylining replanning nonnavigable slouchingly nom evanescence preinserted kwhr cabbaged wryly goatfish rooftops multilineal telephoning congregants sahib skulker prefabs bitters bating ergo hotcake"@zh ; + bsbm:rating2 "10"^^xsd:integer ; + bsbm:rating3 "1"^^xsd:integer ; + bsbm:rating4 "8"^^xsd:integer ; + bsbm:reviewDate "2008-05-15T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-04"^^xsd:date . +dataFromRatingSite1:Review924 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product85 ; + rev:reviewer dataFromRatingSite1:Reviewer47 ; + dc:title "overembellishing emoted slacked oversystematic muckrakes gauges soreness chartists" ; + rev:text "mandatorily blackings sophomorically heliums mesmerizing fagots chirrup totipotencies stilted nitrogens echidnas thighs exudes astonishing rills protectionists underachieve clenched rockiest scattersite trackages fringelike tediums frocking exclaims glimmers thyrse timbers frapped bantamweights dependableness preconceal coatis godding unposed savingly demographers petiole begrimes middlers deodorizers expulsed compared effloresced underbid enfolded corseted obnoxiously rethreads shimmies regulating reseeding barhopped misdiagnoses assuagable aramaic brollies pipit bobsledded airfreight licitly twofer batistes disenfranchised isolates radiotelemetry entraps centrifuges tickler disclaimer gauchely sanseis jeweled hippocratism codefendant trimarans composedness sextuply resew lusting glop weazands sects overdrew foretells dooming iambs destines rigged flambeed subminiaturize prated adroiter deerweed addled pedometer renounceable coughed misdeal anglicans emotionally snobbier straightforwardness unhook recalculating preludes fisheye lf gunnel balladeer unwatched choreman corker ensiles fanner darkeners crestless globularly ofter vocalized camphors upswell annuitants beatification loch voiceprints tenderness glibbest converged headlining teaboards literals wellborn farriers bewitched hosannas saddens loofs deworm diminuendos silvering clangorously fighting nuttiest wrists igniter skinflint zenana teamakers burlesks corkwoods involuting dedicational warmheartedness thralled negotiator transiency nativisms conjurers nightspots submissively unstopped discourage pimps variorum"@zh ; + bsbm:rating1 "3"^^xsd:integer ; + bsbm:rating4 "1"^^xsd:integer ; + bsbm:reviewDate "2007-08-19T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-31"^^xsd:date . +dataFromRatingSite1:Review925 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product32 ; + rev:reviewer dataFromRatingSite1:Reviewer47 ; + dc:title "acrylics lymphatic lumina scissored barbicans muzzling jetted nauseam safflowers decaffeinating huguenot" ; + rev:text "cubbyholes politeness chroma cooled pegboxes saxons unfitness turbulence plundered punctured overanalyzing overwise aliquant sceptral protectionism misconceiving constrains unaccessible aborts langues tatting excusableness americanist batons aimful porters iterative reclassified treaters mopingly heavyhearted inking bowyer peekaboo vulgarizers whitey blowsier underrating squinches routines supramental haplessly materialists describes huggermugger twitchers noggin quivers belligerents members waggons wiseness subsumes returnees synapsed cleansers former rhombs guars recolors nonporous picnics verification herring battening lucubrations shootout forested browny pitches shooks wreathes peruke cations laryngoscope kilowatt displeasing salines filius refutations masters pointedly filer metaphorical smouldered subjugating dunghill boyos unclench spewed meliorating omnium misunderstandingly crispers penalize forbad arboretums lucidity macrocephalous nominately reglues liq climaxed noisome unmanageable hypoergic outrunning printouts dieter quadrics rewax mistrustfully cuddies nonmalignant sativa uprooters election registrations brawls fumbled poolroom girded imps retranslations scuttler tripped protruded telling amerindians gawkish eterne perpetrators protestor cursively glamorizes federalized nonstrikers meditatively supersonically dimer plenipotentiaries intervened lithos"@zh ; + bsbm:rating2 "9"^^xsd:integer ; + bsbm:rating4 "9"^^xsd:integer ; + bsbm:reviewDate "2008-06-02T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-06"^^xsd:date . +dataFromRatingSite1:Review926 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product44 ; + rev:reviewer dataFromRatingSite1:Reviewer47 ; + dc:title "fertilely zoologic hitter sugarplum tallymen upheaving hangared immoderately artificer supermarkets nonconcurrent whiter honkers reformated" ; + rev:text "skidders marblings dundee shirring ratchets stanchers boroughs bacchant whorled bunkerage packsack noncancellable mopper kinsman snobbism unhonored shakeups collectivist airships medevac aguishly clamper tornadoes lockbox predomination reasserting incredibleness lobefin percentaged chiselled misconception splenectomize crisscrosses catchers vrows overvalued rakes ladyfinger tsuris kinds fanaticize uncordial merrymaking sledged warped unspectacular snapdragons unzipping preferences mucklucks ignorer chinaware blathers revocations pontius lushing disbursing druthers kneeholes bowsed caparisoned compartmented embarking bunds reincurs transfusions octads swifters civilians pencilling goofing eclectics attendantly perking dagoes admirers desperation werwolves denominator abrogators supe supportive asphyxiator interdiction sicklier commendably glissaded sarees alteratively gesso overjoy derogating dockage butternuts enc reinducting wording coracles legendarily prisons commoner shavings indenturing spaciousness overreacted tradeoffs recompilations phenothiazine potsherd temperateness restrictions aweigh ultima subclassified subtracting copulating stoats mayhems nicotines sorptive unfed grumbled incorrectness regulations candor systolic gastroenterologically resistances dryer approached vapor piranas enswathed wettest invoiced touzles objurgating defender baulked malapert commercialism discerns expecter sedums eyrie overweigh slurping unalienated rimless knuckly musicotherapy exhales ergometer stockkeeper kilters coffeepots sundae skiddooing moviedom lilliputians epithets prays trues blimps drooped subtlest needlessly tsuba caraculs semiofficial cuppers footer repined viands tweet disemboweling waling nozzles exocrinologies wobbler vacancy consummately militancy lightest speediest cradling adjurors disguised staffers mothers starship lunged obviators"@zh ; + bsbm:rating1 "5"^^xsd:integer ; + bsbm:rating2 "2"^^xsd:integer ; + bsbm:rating4 "5"^^xsd:integer ; + bsbm:reviewDate "2008-06-11T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-19"^^xsd:date . +dataFromRatingSite1:Review927 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product7 ; + rev:reviewer dataFromRatingSite1:Reviewer47 ; + dc:title "agonist fusses acidulating exhibited juntas pouters voles reenlarged redemonstrates choler violoncello summations wesleyans" ; + rev:text "persuading pigeonholes backpacking unfixing hogtying tarts quackishly mutinies perniciousness citizens unknowable poppet leashed demesnes trisects dimity japanning estivated cozily standardbearer megalopolises scourings homecomings ditching sects molecules shoddiest uncleanness crueller colics tumor dowser weighter fagots chirps honourer disembowels garages corkscrewing transmutable cirrus speleology proletarianize exacters lipase loudliest soloists plottier boccie syrups inarticulately suctions unchallengeable cmdg comparing burlesk sylphy gloving unidentifiable intangibly tensible headhunt fizgigs demimondaines legalness headhunts exhorted poisonously tinners equidistance duratives antiinsurrectionists twilit ingoing unceasing upswollen unwieldiness postulants overs conches subtending crimsoning dibbling celt chirpiest depreciating involuting download crawls verboten misnumbers temporalties unshaved readjusted proportioned cogently yeggmen daphnia hucks quarantined discourtesies microfilming supplants effusively overgeneralizing nonabsolutely lilies bevellers intrigues aseptically estimates resourcefully yellows caterwauled flywheels deflecting harmonizes wherefores hatched derbies lubrications pomes deathlessness summeriest mitzvahs mopiest bawlers contumaciously glop summarization"@zh ; + bsbm:rating1 "5"^^xsd:integer ; + bsbm:rating3 "5"^^xsd:integer ; + bsbm:rating4 "3"^^xsd:integer ; + bsbm:reviewDate "2008-06-09T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-12"^^xsd:date . +dataFromRatingSite1:Review928 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product22 ; + rev:reviewer dataFromRatingSite1:Reviewer47 ; + dc:title "readjournments groping postconvalescent paranoids wornout fallers" ; + rev:text "subchapters unmasks bandages bungled gooders louping embracer gondoliers walleye synchronizes irritative obeisance tumidity disfigured unwrapped arenas choreographer overkill stilts senoras osmotically westernizing reopening snorer heathered kajeput lilts defoliators sublease ambidexter encamp doxy initialize racketed forworn erenow floaters files graupel gushers torchbearers livings deserters harder avenues medievally beltings amoks tankfuls dullness experimentalist ungoverned serological seizable syndromes avocational topped scummers aliveness commented transistorized pachysandras lasters pharmacologist communicability twat dirtiness wicker sateens seasides refilters capitalization pepsins symboling noncontradictory eclipsing intentioned thrusts abbotship pythagoreans downheartedly malignly points medicably infests merlon dawning graduating motionlessly impasses foodservices easer anviltops unapt contemptuousness coruscations depictions bewitchments sniffily dapperly nondairy connecter scamping nonnitrogenous scurvier generalizes toolroom vips expressiveness yogurts artfully aerating caponizing wayfarers decorators panocha bluffest semicircular lapsus erecter evokes mirv artworks rhizomes midtowns cypriotes quarrier remigrations greatens figments acclimatized divans scabies lubricants achiness aloofly monkeyed wealthiness winoes supplementer filibusters demonstrators hokypoky panchromatic resting wagger continuances cabinetwork abjectness stabilities displacement indifference praxeological overvalues ores shielders enflamed physiognomical catmint vocalizes ladders constructionist beekeeper naturalist paraffined censoriously valvular dowagers tabaret camps unburied lased apologues underran exhibits sissier arrowing vestured monopoles allurements metre banishments canniness limned heftiest spherometer slenderizing cheesily lichening grandness tillage handless marshaling hooter"@zh ; + bsbm:rating1 "8"^^xsd:integer ; + bsbm:rating2 "6"^^xsd:integer ; + bsbm:rating3 "6"^^xsd:integer ; + bsbm:rating4 "9"^^xsd:integer ; + bsbm:reviewDate "2007-08-15T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2007-10-13"^^xsd:date . +dataFromRatingSite1:Review929 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product46 ; + rev:reviewer dataFromRatingSite1:Reviewer47 ; + dc:title "canonical ironworkers ceremoniousness fordless dimities bunkoed heirdom rued" ; + rev:text "anaesthetist multimedia marinading reglaze intersocietal rattraps vacuumed shorties dysenteric preintimation florets ungulates electricians gussies elongated autoregulatory constructions superficiary malefactions enterer colorless enwheeling deliriant mohairs graduals parsers dippiest huffy platitudinously jaegars toothy awfuller rebater carouses towheads rheniums heartens airports nosology blastoffs stipulation cannily speedboats cubicle thundering distributes lambencies uke acquires peanuts responsibilities coaler reproofs helotry woodcarvers guessers coitional sayers remarriages diagnosing booster tanned hastier cataleptic twinier madwoman loner baggier amoebic nonmystical octuply stools buoyantly translates inexplicably inhume keratomas greeter mineralogical treacherously fallacies localities endorsing objurgates biffins rectification relievers feints unicycles overindulgent facileness footnoting toreador scrabbly neoteny seriating consortia deduced ocotillos coronation historically snouts alumin supineness pursues circumlocutory burbliest slivering wirily syntalities serries beneficiated marchers trustiest aquaplanes invents impends branches penetrator necropolises bayonets stripteasing returns titillated asymmetrically homogenize drawled benefactrix weighter europeans redded slaughters cylindrical housekeeper supplantation unharmonious predacious dendrites spectres footholds pennants atomizes supplied fluidities decontaminators intensification glassies mariner desalinizing tests representee atremble puree frag pustulating callets grandsir meterage mammiform landscaper hallways psychologically leveraged impowers loafers frugally emanative irrupts balancer"@zh ; + bsbm:rating2 "6"^^xsd:integer ; + bsbm:rating3 "8"^^xsd:integer ; + bsbm:reviewDate "2008-02-24T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-03-25"^^xsd:date . +dataFromRatingSite1:Review930 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product57 ; + rev:reviewer dataFromRatingSite1:Reviewer47 ; + dc:title "landocracies embezzlers cuprums disjoins unbuttons bronchoscopy palinode" ; + rev:text "laziest bactericidally reciprocation understated anticline untreated hencoop customhouses attainability artily chewiest townspeople rearouse integrations plasticized flagstones freeholds prominently drumroll hoodwinking adverseness inkiest blackmailed hie scored speculum scrimping bows tawdrier stopper blowjob multilevel comely kitties outfights boded blenders unalterable sargasso snuggeries dabbling ebulliently unextinguished nonexistence choiceness junkyards gaels liverworts intimating damagers mendicancy nainsook donorship reran unitedly boney undescribable dextrorotary racking nymphos unattainable butterscotch apathies amortizement aviating calory integers halvahs caravans whaps diapason broccolis oscillometer unprogressively shipmates flavour thugs stainer pennames unforgotten unsettles coalers mantises devourer daw opening slyer disestablished polliwog axones enjoinders existences pinschers causeway entireness meritoriousness cherubic pacifists retaliates contradicting congealment armory retyping taconite logorrhea snipers uprightness debilitations"@zh ; + bsbm:rating2 "3"^^xsd:integer ; + bsbm:rating3 "2"^^xsd:integer ; + bsbm:reviewDate "2008-01-12T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-02-07"^^xsd:date . +dataFromRatingSite1:Review931 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product47 ; + rev:reviewer dataFromRatingSite1:Reviewer47 ; + dc:title "unconsenting fratricide heading overrated khalifs" ; + rev:text "reflow grandames disentanglements knapped hollowed groomed explicating maddest resider levelheadedness bartizan wether briery immuring freeways braises helper chemotherapists crumblings slumlords harpooned lectors sachems smoothest agaves scrambling opiner kart alkyl aggressing topsides intermolecular hoodoo scrubs cavorted civilize bypaths unqualifiedly stoner forbearingly smutting appositively santonins tenantry deposes noncompetitive drumsticks feebleminded forequarters furrows rebate birthstone decigrams drosses ceder brainpans duperies amtracks heftiest mirages awards dyed enounced cloying sleeker sculker bylines technologies victimless cynicisms guffs microminiaturization unchastities zymolysis misarranges matts boneheads operands sitting slicker pardonable minuses cardings inkhorn corrections buffeted helled claver sententiously blabbed arranger prefacing explosively bunting riskiness skeets extrudes crickets remelt collapsibility kibble extroversive abrogation thorniest lackeying neurophysiological annealer quaffs lunkheads decapitating clergywoman apperceptive militates wiglet fagoted caravels allergenic photomurals tympani quartermasters surefooted unchilled"@zh ; + bsbm:rating3 "10"^^xsd:integer ; + bsbm:rating4 "5"^^xsd:integer ; + bsbm:reviewDate "2008-02-26T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-11"^^xsd:date . +dataFromRatingSite1:Review932 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product53 ; + rev:reviewer dataFromRatingSite1:Reviewer47 ; + dc:title "eversion streakier lowers cozener sidetracking hexyl cham repack sunbonnets ataxy" ; + rev:text "colonizations embraced cuppings reembarked avower brings sunflowers alkalis conductors waxiness quarantinable spurting reimbursement burster appropriated spelunkers biconcavity forfeited reformer cathartic tutelar intuitions journalism civvies toyers pintas selenide paraplegic czardom finnickier autobiographically skinheads exemplified negotiants chondrules pretentiousness latinos amtrack pictures topsoiling files dandyisms uremic editing embossers sandlot preachment impersonation shockwave scruffier weariest criticize cryingly officiating checkmated unrealistically bastardly ameerate primed accordionists multivitamin unprejudiced oscillographies turgescence genal convexo ecliptics tref melanges pealed enticements dually disrespectfully"@zh ; + bsbm:rating2 "2"^^xsd:integer ; + bsbm:rating4 "9"^^xsd:integer ; + bsbm:reviewDate "2007-08-15T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-22"^^xsd:date . +dataFromRatingSite1:Review933 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product66 ; + rev:reviewer dataFromRatingSite1:Reviewer47 ; + dc:title "fluencies hijacked albino chancer hierarchical sunbeams sequestrating lased presupposes spareribs safariing" ; + rev:text "equivocality adoptions mousiest spunkily haymow yourn palliating distressing apostrophized rive orchardist goaded sealeries silkscreens patronizers hangared unperjured corvet monotonies cecum clodhopper totalizing ureal bitterest paladins supports jargoning henpecks mumbler lumped histamins collectivism marchionesses tasked anesthetists quadriplegia obviated unclothed cussedly complicates infancies edentates decalcifies licenser authenticated squinched harboring needlessly nervousness palpations guardsmen withies overroast results wharfinger naiveties subdebutantes mistype loathsomely pronouncements iodizer reappraisal glowing"@zh ; + bsbm:rating1 "7"^^xsd:integer ; + bsbm:rating2 "7"^^xsd:integer ; + bsbm:rating3 "5"^^xsd:integer ; + bsbm:reviewDate "2007-08-29T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2007-12-19"^^xsd:date . +dataFromRatingSite1:Review934 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product66 ; + rev:reviewer dataFromRatingSite1:Reviewer47 ; + dc:title "severity directorships sloppiest unrated seedpod trams outraced mulier elementariness" ; + rev:text "guerre undergo pseudoscientific extinguised cains flagellates jazzmen organelle yawner avouching overvaluing itemizes varicosity blowups eventuations operative aglow adoptabilities strath autocade brevi mustachioed ceca wisher specifiers enfever extorting persecutee hoods ulceration bearskin pegboards ticker alerted shadower overextended nummular repulsively rematching herbs callas alexia columned refreeze glueing rumoured generalizing exposed sleds crafting grandiloquently houseworkers westernize apartments blarneying charwomen aspects longbows opulencies diphtherial hasteful goldest satirizing tangliest spelunk libelers beastliness cataloging unapproving frescoists realising deflating infirming conceited deductibles grumpy rouges swearer fruitless unsaved chanties submergible knottier gibes interlibrary dehumidified propinquity slobbery romanticism achievable reporting pretensions"@zh ; + bsbm:rating2 "1"^^xsd:integer ; + bsbm:rating3 "4"^^xsd:integer ; + bsbm:reviewDate "2008-02-25T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-21"^^xsd:date . +dataFromRatingSite1:Review935 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product28 ; + rev:reviewer dataFromRatingSite1:Reviewer47 ; + dc:title "dyads nonsubscriber ecus virally scavengers diurnally deselect invalidated erenow remuneration sutures" ; + rev:text "broadcloth mastoids emerging somalia brininess dividers languidness drynesses flummoxing espadrille stager audacities threats bathetically knowers keypunchers moralizer remands barcarole overattentive trainful probed endbrain elicited tetchily preglacial manicurists airbursts reconditions uncircumstantialy recurve colorably straightened glibly riggers alliums tactlessly sequents timecards brushers joshes progressiveness caracole dewclaw hackled reexhibited eightieths tariffing bedstraws mewlers compassionately genitives secularize imitativeness inabilities careerer reissuer footgears reexporting darlings overglaze dobber encouraging postorbital pictographic virilizing blimpish incubuses fluidly bigamizing yonker sketchiest bangtails mussing gesturers globalist passaged argentic genitourinary ideally impedimenta misemploy ideologies gymkhana bounden raking racetracks entangles tetrapods lightered youngs birdcages cittern ephemera virtuosas nonvoluntary tossups parleyer lunkheads betaken prissiness chips shudderingly challenging yeasts mallei clasper incomprehensibleness bleeped footmarks inquisitory loftiness expediences expectative sabred precipitancy ribonucleotide disclaimed gonophs sensitize abnegated trystes transonic activators tunney vicariates skids libs misters gaily disdains deerflys headpins aunties"@zh ; + bsbm:rating1 "4"^^xsd:integer ; + bsbm:rating4 "3"^^xsd:integer ; + bsbm:reviewDate "2008-05-03T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-04"^^xsd:date . +dataFromRatingSite1:Review936 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product84 ; + rev:reviewer dataFromRatingSite1:Reviewer47 ; + dc:title "waffled astronauts denouncers congaed breasting" ; + rev:text "azole vasoconstriction paired barbiturates mechanists moviedom chanted eschalot demurrage chameleons compaction rerecording ingenues overachieving bleaching snaked diked slowish benefact movableness egoisms surpassable deposers misaimed outlier im elusiveness intertropical odorants carryall soothsayers minaciousness reusability englobement zips nonintellectually steaks whippoorwills uncertain anticlinal sleepily freckling champers debilities evaluations occasions koppies catching weakened surfeited tzetze misunderstand chromatographic poinciana repainting"@zh ; + bsbm:rating1 "4"^^xsd:integer ; + bsbm:rating2 "5"^^xsd:integer ; + bsbm:rating3 "8"^^xsd:integer ; + bsbm:rating4 "7"^^xsd:integer ; + bsbm:reviewDate "2008-05-08T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-13"^^xsd:date . +dataFromRatingSite1:Review937 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product84 ; + rev:reviewer dataFromRatingSite1:Reviewer47 ; + dc:title "shunned sunrises influenced maintained" ; + rev:text "lechers nations mateless abdicable tribade brunts recondition shoplifting dishpan simplifying memorizers prowlers nills jettisoning constitutional coleslaw fringes junketing versifying daysides vasomotor emplacing yids bicuspid wistfulness puffier forgathered stepparents marshaled indivisibly riveting foresail rubbishy unfortified encouragement fuhrers unappeasable reborn miniskirted scarfpins gemutlich respirability prostituting icicles incommutably diemakers augers glutinously pimps downtimes inhaler idolatries deciare emendating untimely rowan devoice randomize sentimentalists ructious breaker hies arquebuses colanders remigrates haggis suspends betted unwatched combusted litmuses tzaritza petnapping shined myelitis charcoaled hypothesi downy stalagmites tincting ilks farrowing adyta albino unpunctual adulterousness plottier protrusions freeloading educed obeisances preempts repositioning unrectified unaddressed cliqued fibbing shambled tazza bioscopes applaudable coopts popinjay respirators sanctioner teacakes palimpsest pebbling parlous crappiness polios sits insalubrious veinier astrologer renewals winner cussword sadness enrolment sentencing rationalizations micturate loosely pongees quatres egoistic inkpot unimproved undefinably victimizations ponchos pickling bluffer unexpired abrasively modula diker trafficable photomechanical cello ungallant preemptively mummification casehardens dimout windrowing deworm ribands devitalized oversparing epigrammatical cunner consists syrens countries prinked towed welkins marshy banns mixology zoopathology roped tummies inker narcohypnoses incensing steatopygia encloses medals streptococci"@zh ; + bsbm:rating1 "3"^^xsd:integer ; + bsbm:rating2 "5"^^xsd:integer ; + bsbm:reviewDate "2008-01-29T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-03-24"^^xsd:date . +dataFromRatingSite1:Review938 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product49 ; + rev:reviewer dataFromRatingSite1:Reviewer47 ; + dc:title "digests paraquats purveyors hellenist escarping tentered nondistribution loomed recollection inched ricketier boomkin" ; + rev:text "nonvoting chinning unsociable ensconced prejudicing scarless lividness upheaver printing dopy buddies discontentments peahens seafarers misemploy paraders telemetry microgramme birdseyes likeable remodelers dunked irritability percussionist overhurried heirloom filminess forestalls inviolability remeasures coring incongruities parvenue escapements rhonchi bowshot milers uvula harridans rubs unpretending tuberculously schnooks motives coonhound colleens resetters lashing checkoff trilobate confined dissevers teutons beflags darning unreconstructed"@zh ; + bsbm:rating1 "9"^^xsd:integer ; + bsbm:rating3 "5"^^xsd:integer ; + bsbm:rating4 "4"^^xsd:integer ; + bsbm:reviewDate "2007-08-03T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2007-09-02"^^xsd:date . +dataFromRatingSite1:Review939 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product40 ; + rev:reviewer dataFromRatingSite1:Reviewer47 ; + dc:title "ferociousness romanize precentor decrepitude retrospection flatterer hokum" ; + rev:text "utilise utilizers marzipan patsies tinstones fruitless persuadably syphilizing snazzier microphotographing voluminously balusters abbotships homeyness affordable homogenizes ruddiest magnificence hosp debating undergarments calks generalissimo justification sancta snacking gated strongarmer cleavers granularity seducible virtues reconnoitered fait quieti superabundance shovels ripely oozed confiscators wishfulness penologists fowlings proapproval blowouts tastefully dissipators snugging reconditeness oscillogram swaths stockinets gelatinization geographic internuncio sizes skiddooed reinvigoration consulting outsiders intermuscular mutually cumins statutorily garnetlike leos medians freethinkers tearstain undetected cabinetmaking epoxying vanman transitions gimel pacs sparerib parer aged frostbit felted vulcanism umped refuser quietudes crunching girly lawmaker nonappearances offloading electrocardiography upstages ardors yoni stretchier kilobits fiefs oversimplifications primarily aquacade resellers resumer kickstands unswervingly whooping collaboration proportioned zeppelins wrier expediency reenactments newscasters memories crappies masher germinating exhorter twerps cello justs crawls rationalizes dishearteningly dissatisfied expressing intricacies burgundies bursts frankly unprofitably gangliest phoning lenities zanies seeded dehumidifier humps czars mellitus succubuses reclad ruralites realizability biggie purificatory concelebrating rapprochements welcomer quenches expatiator overexerts faker mesmerizes pipkin snuffier successively thymey legists anginas winched misanthropists elevates insider doughtier nonreader scholarships guatemalan sublime setal wisely"@zh ; + bsbm:rating1 "1"^^xsd:integer ; + bsbm:rating2 "5"^^xsd:integer ; + bsbm:rating4 "4"^^xsd:integer ; + bsbm:reviewDate "2007-12-05T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-02-04"^^xsd:date . +dataFromRatingSite1:Reviewer48 + rdf:type foaf:Person ; + foaf:name "Labeeb-Tonasha" ; + foaf:mbox_sha1sum "10d7054344f8c4ccf737985175845b7b2c14fe" ; + bsbm:country ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-09-21"^^xsd:date . +dataFromRatingSite1:Review940 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product49 ; + rev:reviewer dataFromRatingSite1:Reviewer48 ; + dc:title "remonstrant gestation usuries frescoists patronal transmigrators validations mosses" ; + rev:text "analgesia revivals absurdest rehearses overman molasseses flaggers welcomes schmo pshawed scouted incognitos disclaimant toroids unmitigatedly prosthetist drillers exosphere polenta creepages victors godlessness cardsharps supervisorial bulldozes matzoth borderer sawhorse embryological patroon clutching breeziest impureness lasses formalistic galvanize salvoing conceptions untruest wordbooks thuribles posts utilizations paeons plaguing charlatanries sleepwalkers leafworms cretinizing shakedowns hasps apeak circumventable quackier ranked welder highhandedness bewitchments eschewal spatted salinized memoirs spottiest cornucopiate bombasts grueled sonatine unspecific blandishment aptly underlining sloughs forelegs navigation heighths psychologized arenas uncovering broider wrappers coagulates packsacks localist glimmerings dribbing arhats stubbed baboons rudely photoengravers rummies slopes lankier thonged undressing spherometer insecticides ghettoize cozeners digestor incorrectly wirehairs washstand boatsman ayatollah blurters anchored foreordainment dissonances initiating schlepp affectingly cleavers workshops conoids apocalyptically applesauce reedier splitter preaccustomed inconsiderately placentas dastardly bellicoseness peeler ionizes creameries floweret acidifiers braggarts fessing spirted saltier incontestabilities intermittencies hypocenter camisole anno quitter snivelers gibbousness psalmody boche bloodings filleted uncharitableness publican polestar divans reconverts televises comanches unexcelled sadomasochist graecizing shabbier recondition crosse vacates creeps siltier bootstraps clunk signeted"@en ; + bsbm:rating1 "7"^^xsd:integer ; + bsbm:rating2 "7"^^xsd:integer ; + bsbm:reviewDate "2008-05-29T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-30"^^xsd:date . +dataFromRatingSite1:Review941 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product48 ; + rev:reviewer dataFromRatingSite1:Reviewer48 ; + dc:title "fisheye secularists legends requisitioners acerbating bantamweights jungliest asst marxist punctured estoppage impecuniously brislings according" ; + rev:text "wakenings globes fishtail gyrfalcons emboldened foreordains staggy deterges drownds enshrined lands nuttiness foyers heighth guilts coequality dressier popping confessable acidulated alternative mistyping masquerades semiopaque scoffing petioles uniques wordlessly swoosh haler coupled deworm radiotelephones oxygenic trajected phoenician knowingly semipublic coppering pipings stereoscopes smoothy threading jointer seismologists kakistocracy indifference ourself peopling cussedly dotter localites hindgut disproves wangled telecast calumets upped canthi scams presser fingerlings straddles readaptation astrolabes outing allegiantly vitiates claver equalities slaker backhoe snits trendiest faunal shooting browsers milkily humanly lodging bandicoot guardsmen stoles galilei lilliput vealy enclosable jughead clingier faultfinders rotational tuber ungratifying lenience undescribably infiltrations bramblier postmistresses helots badman woolie acrostic iller poignantly heirship zebecs steersman nonabsolute imbeds mahjongg linchpin clawers houseboats alienates heartiness packsacks suitability luckier preconceives ostomy rinds grasslands undescribable"@en ; + bsbm:rating1 "4"^^xsd:integer ; + bsbm:rating2 "1"^^xsd:integer ; + bsbm:rating3 "2"^^xsd:integer ; + bsbm:reviewDate "2007-09-28T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2007-12-22"^^xsd:date . +dataFromRatingSite1:Review942 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product17 ; + rev:reviewer dataFromRatingSite1:Reviewer48 ; + dc:title "tallyhoed biorythmic waxier strobic foodless rummager" ; + rev:text "slitters oilskins tartufe cavorts occludes gypsyism sapphics anils apportionments solipsist candidest hoorayed azoic cuttling sawed huzzas whoredom recapitulation iambs bristled antepenultimate wheyface subalpine augmenter benzenes lairds drivelling bisexuals underplaying timeworker eluders imploded figurant semicircle subnormality cadaveric patricides princelings faultfinder battalions stiletted consignment shoals viticulturists overtake transcribed gasping pageboy blondness bumbling goo hidings unciforms californian fisheries tonsorial misnaming superannuating holistically copydesks sumachs cuish subliminally tennesseeans masturbator earthly incas typecase fatuously myrtles explosions encroaches ribbony estrangements donatio imperials dotation aliquant teslas digressions disharmonies indigestibilty tricorn drest nutters invaluably stomachers apish zagged rowdyism"@en ; + bsbm:rating1 "10"^^xsd:integer ; + bsbm:rating2 "3"^^xsd:integer ; + bsbm:rating4 "3"^^xsd:integer ; + bsbm:reviewDate "2007-09-16T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2007-10-27"^^xsd:date . +dataFromRatingSite1:Review943 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product77 ; + rev:reviewer dataFromRatingSite1:Reviewer48 ; + dc:title "crooner consonantly secondly mastoidal returns skywrite" ; + rev:text "plosive externalism psychoanalyzes weatherman scrapples dreck inverter reprography dietitians intuito fruiterers onrushes subtend cheerily unverified redried landmarks rethink harmlessness bottles riels underemphasize swiftian dingeys blunting laziness graters messiahs squalor winless shillings narthexes squashier splotching filmiest subdirectors slimed seedily debases hears scimitars crassest sager oxidic legendarily holytide furriest tibial pachisi renumbering futures aldermanry manufacturing cesses defiance mooches yodelling classicalism wakeless pampers spiralled urologist cuirasses photocopy bellyaching phaseal unfurling sufflated coppice swooners rapper koruna flagrance accreting peakish caucasoid mameys reddened enlivens hillsides winner converted insincerities sorcerer freebie fudged evangelicalism garnets dendrologists plausibility charterers murkier dissolve fobbing giggler superconductor tollman unproclaimed greasepaint dragonet groundhog alerting safaris ecological mutates styes autostradas scurvier searchlights parachutists unconsenting readapt ineluctably regermination matchmaking unconcealed daring battiks pastrami polarizing kymograms lags surprized inearthed symboling boleros falsest encomiums rikshas overjoying gerunds lector perique elasticum lissome devalue bottled floridans conspiratorially conscientiously benefitted bluebooks miscalculations anymore replacing consanguinity largely boxed monosexualities vies bolsterers surgeries beleaguering shipwrights cosponsorships illustration sunups succeeds meteorism nonrationally"@en ; + bsbm:rating3 "8"^^xsd:integer ; + bsbm:rating4 "4"^^xsd:integer ; + bsbm:reviewDate "2008-05-22T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-15"^^xsd:date . +dataFromRatingSite1:Review944 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer3:Product97 ; + rev:reviewer dataFromRatingSite1:Reviewer48 ; + dc:title "mutagenically sturdiness dissatisfied kneepan comprehensiveness eidola maitres amylases reamers" ; + rev:text "refineries pupilar velleities fatuously bedazzles outcries grimacers beams sicklier ooh currish riprap clenched vibrancies revetment footrests suits gatherings kinesiologies redetermined practicabilities forestays colonialists conversational penstock medics gnawn quaintness sanctifies leagued raja wivern protrudes chuffs ballpoints relents muenster dictatorship aigrettes attermined irretrievably arts calcites slapdash valetudinarianism raced shipping seismometers phases demobbing overjoying eviscerates chemisms vibraharps soldiers grogshops metronomic stereotypers hypochondriasis disembody guttier tressed courses recrudesces vassals defalcating vats"@en ; + bsbm:rating4 "8"^^xsd:integer ; + bsbm:reviewDate "2007-10-21T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2007-10-21"^^xsd:date . +dataFromRatingSite1:Review945 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product82 ; + rev:reviewer dataFromRatingSite1:Reviewer48 ; + dc:title "roofer hypocenter washbasins enchilada snoozier" ; + rev:text "presences briberies blurriest thermoelectron vim procurement bravoing starry visually embankment transferal apportioning prefixes levelheaded hadst wakiki cerites reaccustoming twitter disunites herniate unshut selective loamier externally recordable profitableness impersonation uncommonness dandified reaccuse gesticulating tyrannosauruses redlined stealings allocators midriffs mondays carcasses kryptons cellarer dinky intonating reminded grunion substituter humidfied propped glorifying junker noncombat exurbias birthplaces superscript detoxicator folia rustler mandolinists darkey peakish modifier caseins prussians lollipops stalkers epigrapher hipping ironworkers oriels intertwining delawarean sabered chayotes poteen directors sallowly artfulness polysyllables crowfoots cradlesongs braver erotogenesis nonmechanically indicating provoker begirt bewrays televisionary sharecropping gameness desertions touchups endoscopes slobbers hallmarks trustability bribeable aggregating sociologist origination pillowcase enterers pilotages gloomier fluorophosphate wracks abducted frabjous timeliest troppo clothings libelee dropping growliest immunizations absurder floweret topographic afghans refilling artlessness teetotaled vizarded stinger bloodcurdlingly yodelled scraping twangy grouted geniture ignited antimacassars anisette hops winnowing honchos preascertain miauled unsolvable browning entails nonexplosives oratorian gladsome embryogenic parser macerating grot surcoats disrepair fluctuation saclike discounts dazzler anilins hairsprays maintops glamourous incisions"@en ; + bsbm:rating2 "1"^^xsd:integer ; + bsbm:rating3 "5"^^xsd:integer ; + bsbm:rating4 "1"^^xsd:integer ; + bsbm:reviewDate "2007-06-23T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2007-12-19"^^xsd:date . +dataFromRatingSite1:Review946 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product54 ; + rev:reviewer dataFromRatingSite1:Reviewer48 ; + dc:title "mobilizes photographers travailed macromania scurrying unfences surprising theistic monotonously privier highlanders apocalyptical cripples" ; + rev:text "charism antithetically bicolors prevuing muskiness fruitcake toileting phrasings lh uncomfortableness reasonableness circum disestablishes corkscrews aconites gimleting zoophytes asymptotically connotations fissions hyssops voile heeling phototropic parallelled selenographer magicked salespersons unbridledly parred cine minidisks inadvisability niches perambulated giveaways sharesmen digressive diademed stacking banzai embosomed broiler carders falterer wreaked chameleons incompleteness climatologic thirstiness federated disagreements mathematical somnolently tattled pissants refrigerators rumbly toolboxes entertainments nebs revictual elixirs earmarks dickered sidesplitting flags inevitabilities bottoming sidekick hidings castoffs wrastle armors troublemakers interruptive plunders prearranges draftable lathier ruminator sunders calypsoes cariocas externalized wisting counterculture cittern tips scalded narrowing cuppas teardown stogy screaming forelands farfels brede obstructor jumbucks bullfight taxational barroom accorders skywrites bolthead precontriving backdate intimidator recency pulsator powerhouses singularly confraternity privily exonerating"@en ; + bsbm:rating1 "3"^^xsd:integer ; + bsbm:rating2 "10"^^xsd:integer ; + bsbm:rating4 "6"^^xsd:integer ; + bsbm:reviewDate "2007-12-27T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-04-17"^^xsd:date . +dataFromRatingSite1:Review947 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product39 ; + rev:reviewer dataFromRatingSite1:Reviewer48 ; + dc:title "dotes neurologists civvies garde cranially metricized glaciologists dramatically outranking vetoers annotatively" ; + rev:text "hopping cutie chores stepsons unbid housekeepers defenseless stalkiest floods glutted conative dependableness sulfuryls kingpins monkeyed technocracy dissepimental fundament unallied whispering judges latencies crooning kopeck confined cumulating articles intrusts abashment generis reprimands wholesaling ameliorated shaded venations bided annotative artillerist salvia addictiveness counterfeitly rainout tiresomely troubler millisecond pigeonholing treaties kickups concupiscence rivulets incoincidence barless crotched grandsons maximizing jobber hosanna monogramming roughnecks clubhouses seamed reapplier improvability disobeyed politeness vulgarize spalled fluor smearing turbocars conquers transfixed ambergrease flaker pertussis whenas harnessed windmills megabar randiest bourgeon exerts urinaries"@en ; + bsbm:rating3 "10"^^xsd:integer ; + bsbm:rating4 "6"^^xsd:integer ; + bsbm:reviewDate "2008-03-31T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-04-20"^^xsd:date . +dataFromRatingSite1:Review948 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product62 ; + rev:reviewer dataFromRatingSite1:Reviewer48 ; + dc:title "asphaltic motorman threaped remunerators curer wrongfully prosecutable feminacy bulbed designing innocence" ; + rev:text "splintering photic calumets swayback stultification berbers stagnancy scans defogs abominated seeings budlike skiffs splurged teentsy creditors reclaiming primming resistantly raptor axletrees nonmilitant thanks indoctrinations pictographs grandads shriver gigglingly mandibles vowed stats bisulfate tomorrows contributed dopers paints typewriter etape trisection veep brushoff chargee sleeving nickelled statistics characteristics chapmen dilations coalescence restiveness godlessness heeltap urinals contaminative buggered riblets maoris reposition tolerator chymists unseaworthiness microstructure ungathered annihilators radioed premixing inserting untempting oops conservational nourishment ardently importunes coigns cuing passwords contradicting wontons chancels sedimented insalivation earthiest lankiest strands laceration wheelie palaced surmised eucalypti curlicued faying grandaunts venerably ringing bobsledding wagtail stultified enchiladas quoined bluegums dimwittedness recouping blustering dockers gitanos periodontoses satrapies sirenomelus inseams muddlers intertangles equatable unresentfully escrowed dates unlimbers undiluted palsied coulees steerable magnifications millionaires eternizing helloed symbolized lurking mordant rubblier upwardness summering disbarred seafarers nullified essayed assumably deutschland roamers traditionalize exiguity shackling ampleness woodpile progresses holdups upraising atmospherically occulting cogged wiling nimbuses unless reendowed roached octets internships hoecakes lamaseries lours"@en ; + bsbm:rating1 "4"^^xsd:integer ; + bsbm:rating2 "7"^^xsd:integer ; + bsbm:rating3 "5"^^xsd:integer ; + bsbm:rating4 "10"^^xsd:integer ; + bsbm:reviewDate "2008-01-16T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-03-07"^^xsd:date . +dataFromRatingSite1:Review949 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product16 ; + rev:reviewer dataFromRatingSite1:Reviewer48 ; + dc:title "madwort skis amniote hatchelled ramming hurtles rediscounts catatonias antidisestablishmentarian" ; + rev:text "hyperion mediational acclimatizing weeps resumer regnal overstuffed creasing goaded proliferates reinoculations patented reasoning responses alarmclock tremblers campaniles beriberis proprietorial murmured nautch sailing seals herculeses detectives unpuckered exactingness nitro liberians thymuses nephrons ojibwa alohas hullo defectiveness orbits flatcar vocalist pennies turbidities endowment erotism garotted unreeling freemason tressy implacentalia citrates germen uniformest cussedly begets alertly looney outswam sultrily sympathizer septicemia freeform braizes explanting gigs borings superintending besmeared peeped radiobiology oenomel noninstinctual nonesuches bleater disparages detaching sloppily jackpots boohooed nailed contrarily idylls tridents accommodating oviposits retirees oxygenating delusionary bedizened unhindered reopening phonetics signets modishness multifamily reconciliation clacks bellybuttons disenfranchise osteoarthritic sergeantships polemize noncontributory bloodiest mannish rapine sylvans anaesthetized interregional nictitate trashily epicenter pedes recasting agglutinates consummation heelposts exacerbating spiels piastre guffawed acculturative equational galatians axone dinners godspeed schoolbag osiers fairest ventless sylphy unadvantageous bleakness crinolines reexpress mothering gammas psychoanalysts remaking historiographers coffers fittest incontinency undischarged danseurs showcases nonprofessional horsefeathers debauched unenforceable nonpermanent standout cookshops caseins adzes hackling upkeeps turd voyeur adjures sandbank hums subcompacts bins hogshead echoey classes throned regresses unreplaceable atheists rockless incorruptibly switchboards resolvers overleaf overslipt hights rediscoveries"@en ; + bsbm:rating1 "1"^^xsd:integer ; + bsbm:rating2 "4"^^xsd:integer ; + bsbm:rating3 "2"^^xsd:integer ; + bsbm:rating4 "4"^^xsd:integer ; + bsbm:reviewDate "2008-03-02T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-01"^^xsd:date . +dataFromRatingSite1:Review950 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product44 ; + rev:reviewer dataFromRatingSite1:Reviewer48 ; + dc:title "wider soffits catechist epiphenomenalism seesaws reprehensibly reprove sentimentally shortenings collocated excreter reactivates surfeited" ; + rev:text "stonishing fabrications whittles ulnar indescribably limburger appanages rejectors triage ontogenically mpg elmy greeneries pulldown prosecutors fumeless lacked sunburned smells alienable headlights localists conceals acidifies plaitings flintiest unblushingly eurasians bricklayers natl dilantin scuffles vatic quizzing incendiarism concomitantly coldly devolutive easterly dungs hedgehopper lettered bawdric collarbones samphires photosynthesis northeasterly monody chino pedestrianism subdermal violently modification gorses talesman nudisms theorising unexceptionably innervate ovine humorists damasked bonita dialogues tugboat egalites vizards tiering ecumenicism wifelier odour adroitly excepted mony remanufactured priors comradely revalidate conforms fraughted chordates decorativeness micropipette diciest tweedles prehuman dandyism rifer trippings misled huskers vaguely philoprogenitive embodiments nonappearance deerfly"@en ; + bsbm:rating1 "2"^^xsd:integer ; + bsbm:rating2 "6"^^xsd:integer ; + bsbm:rating3 "1"^^xsd:integer ; + bsbm:rating4 "1"^^xsd:integer ; + bsbm:reviewDate "2007-07-14T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2007-10-27"^^xsd:date . +dataFromRatingSite1:Review951 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product17 ; + rev:reviewer dataFromRatingSite1:Reviewer48 ; + dc:title "diathermic slims dawned soundlessly beheading modernist oftenness infamies isopod" ; + rev:text "dorsi mayors unintelligently tricksiest restraightening outposts musicologist glommed leasings lucrativeness homemaker unhealed adjure enrober carats metes pennants jealousies microtome fuller plies volatiles apostatized interchangeably chefdoms egotisms overdrinking conventual participial schedules monochromaticity ineffectualness tenses rococos qiana stickily frizzily woefully covenantee unkosher cowering struts precalculate privatized extraditing baluster heedfulness relived inputted concocting vestural thrashing disentailment mollycoddles vandals sync basque trainload herrings puzzlingly unsightliness unsecured totipotencies scarcer gulling dehydrogenates regrouped shirked clift deafer weensiest overinsistently overwhelming ay storewide chiffonnier youse wildest roble atoningly remilitarizing bigging jointly unshaven inviolately agglutinatively chiding reincorporates newts cliquier doorpost drips forseen pretaste manured plaguy underfinancing straightest necessitous redressment abasement freedoms masterfulness indexed interdictory collectivizing longshoreman natures sovereignties conterminously boycotting kabbalas jambs fumigations baboo envisages appropriation chartist rara insistently psst supervisors derogation dogcatchers forehead"@en ; + bsbm:rating2 "8"^^xsd:integer ; + bsbm:rating3 "5"^^xsd:integer ; + bsbm:rating4 "5"^^xsd:integer ; + bsbm:reviewDate "2008-04-19T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-05"^^xsd:date . +dataFromRatingSite1:Review952 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product33 ; + rev:reviewer dataFromRatingSite1:Reviewer48 ; + dc:title "lingoes rachitic otoliths retrimmed crofts" ; + rev:text "mellower studying whisker mushed unworthily slamming remarks participator nonstriker prosing recook zoomed offloading tanka uglifies wordages nonacademic mouldier phenylketonuria whites tumbledown intertwined hungrier cofeatures ethnological ejectum breakfront lated waves cardiological unconscionable advisatory charisms influxes vegetational dogies chesterfields interviewed jeu rearrangements ducal spirited demonism aureolae astrodynamic animater attesting unveiling sassies allegros attendance ordinaries liege romances sherifs dillydallies menswear hermaphrodite unexpressed climber englobing whiniest skivvy undervaluing greeting precelebration aimers oversimple patrilinies transplanters preinstructing sailorly lastingly slackest rely boogyman mesmerizes underwear hammered functional threader sayonara flounciest syrinxes uniforming distractive unbeliever stalling theirs voltages eaux canvases handfasted cellarers demanded vessels postfixes killings preconditioned engravers"@en ; + bsbm:rating1 "8"^^xsd:integer ; + bsbm:rating3 "6"^^xsd:integer ; + bsbm:rating4 "7"^^xsd:integer ; + bsbm:reviewDate "2008-01-26T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-02"^^xsd:date . +dataFromRatingSite1:Review953 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product21 ; + rev:reviewer dataFromRatingSite1:Reviewer48 ; + dc:title "narwhales sanest liberalness metaphase" ; + rev:text "lentils rosin irreconcilability welterweight cichlidae promptly toter submembers rocker sordidness freewheeling trollings slithered pounding aggrieving reaccompany basketwork frightens veinings beautification charactery bolding unassessed solved thermometry camphorating repertorial endamages wordier americans manacles monastical bitter litterateur materializes interline forenamed sprattle crotchetiness colts deco realising deters spinsterhood eventuations demagogs oenophiles scummier imply beneficing articulated crosspiece safetying unvarying habited scissors crispy deceitfully transcriber faultiest flattered urethrae immunopathology youthfully arsenious goodliest cloverleaf excitability twiddler concisely gourmand hatchable exhilarates universes jutted hygeist depicting spraddle laurels expediter unmeasured stenciling nonnatural batiste rafter fait raceways packaging depolarize redetermines howbeit daunters limberly destructive numbering capacitation reconsider stretto deans behavior heroize flirtiest functionless warmer takers deprival lynchings scullery trespassers fostering combes brickwork eyehook confection ties devils distributution broker prinked kaliphs hawkweeds foolhardier purlieus undiscernible corsets quantities articulator sprayer quacky cajoleries androgyny midwifes candlesticks collocate funniness vivisectionist insolvency inhering quadrillionth prorated superannuity stingo framing creepier pelf milliners interlibrary pinholes quipus easer scrubby dossing coracle reconnoiter effuse rafts snorters soever heathens glistened outgrowths dyads chalcedonies pitmen intersocietal townfolk leitmotifs reeled heralding decibels brachiation narrows nonluminous chrisms arf intitling"@en ; + bsbm:rating3 "7"^^xsd:integer ; + bsbm:rating4 "4"^^xsd:integer ; + bsbm:reviewDate "2008-04-16T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-17"^^xsd:date . +dataFromRatingSite1:Review954 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product73 ; + rev:reviewer dataFromRatingSite1:Reviewer48 ; + dc:title "rooked engorgement valvar deerstalkers crucifies nutritionally suers dressage sported disciplines overstretch chambray flapjacks installations" ; + rev:text "mockeries scrapping disapprovingly chows hadrons totterers assistants singled resuscitation aught unmans preshrunk thyroidectomies undisciplined microscopically weakens demonian beery obtainable interrogatorily seige viticulturist ruffly overattentively tetraethyl triviality imper stations intwists citer dont doyennes victresses toniest arkansans tantara monosexualities inversions omits constricting abjurations haulyards deoxygenate limberest granddaughters solidified openmouthed cocooned coquetry domineers beetles impressiveness gawker costumer tabuing dazzlingly idlesses adroitly balalaikas unreturned unenrolled neophytes monists feeder plasmapheresis preoccupied harpooner constraining fertileness playbacks bereaving cursors gladier gloriam farmyard fuzil bumblers undercarriages barrenness trope nom bidets yielding uncurious amortizement misappropriate foretelling middlebrow adzes ploughing substituting doubter devotional listeners ultraconservatives polypod coordinating localize fellowmen rezoning birettas plena psychologized tideless shallower warwork hotrods blinkered colorcasting wrongheadedness foreskin carpeted clubable empanel windstorms adytum counselled aphanite decentralization"@en ; + bsbm:rating1 "2"^^xsd:integer ; + bsbm:reviewDate "2007-06-26T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2007-12-14"^^xsd:date . +dataFromRatingSite1:Review955 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product57 ; + rev:reviewer dataFromRatingSite1:Reviewer48 ; + dc:title "haruspex reassimilate atomise treasures redesignated quirted forests unalienable concealing friends witchings" ; + rev:text "scandaled antioxidants mentioning enclasp unacceptable dangs astrolabes transcended pimpernel attacher flamethrower carloads eudemons detaching floating chartering blowguns tipoffs inhabitancy stintingly pachysandra wardenship skimps rumbly stencilled reinjuring leafstalks assiduously boardinghouses hypothecating overwrote riptide reimported mangos nonpayment dacoits rediscovers schussboomers ataxia hoister upended burses monition resubmission hadrons implosions caners mortice polemizes sugarier redraws postbags groundnut legs skimmings soigne hypnotized shtetl geeks tariffs molestations disenfranchises dampening stanzaed nitrocellulose maliciousness ragouts recut reintroduces marshiness ambushed pelts fades halest"@en ; + bsbm:rating3 "3"^^xsd:integer ; + bsbm:rating4 "7"^^xsd:integer ; + bsbm:reviewDate "2007-12-20T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-03-20"^^xsd:date . +dataFromRatingSite1:Reviewer49 + rdf:type foaf:Person ; + foaf:name "Patrice-Aristea" ; + foaf:mbox_sha1sum "c455ec1c3645539f58ecea2c0d24fa225c2309" ; + bsbm:country ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-09-17"^^xsd:date . +dataFromRatingSite1:Review956 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product87 ; + rev:reviewer dataFromRatingSite1:Reviewer49 ; + dc:title "elver subcompact inseam disarmers squealer" ; + rev:text "bellicosities licensees scooting vapidness outdistancing keynoters juicily boyishly staplers magnateship chesses hayloft domiciling belonging dreamers quenched epithalamia commandoes plunker awfuller renew meekly banshees cheepers unforgotten soilborne numerary hernias horsewhipping systemless consummates appendectomies heighth jingled sharpening betters thereinafter vidkids tanged bestowed archdeacons collateralizing reallocation tantaras flustering treasonable packmen pussyfooted watchtowers transformed outwaits deselect sneeringly discernment snot chippie instances settles interlaces flummery impactors bungs irreparably decays randomization bordures abided imprinting juked ducker breveting panelists premeditation reroute bushmasters stagnating nonabrasive shrubs lovely flashing dilatator knavishness basking unloosed intensives charioteers blowy glaciates hemisection sentenced monocles cadged throatiness emir inutile apogeic whoredom floppies migrator carmines polypoid burgee crimsoned disfranchiser beekeeping disarmament bonos enjoyed prorestoration gavelled overkills arming bedevils actuated vouchered jawboning jettying foremother basketballs oboes burdens retiringly rapacity dismortgage nitrates airscrews minimizers editorializing allium jaspers tenours flagships retrained alarumed yukked unclerical beavering pictograph sulphurizing gammons neatness endogeny milked recharted aerophobia clemently fidgeting averments beloveds cozie yodler kraal believed truest unprovable nonrealistic substantival deescalate diffused turnarounds creators dimness leisured"@de ; + bsbm:rating2 "2"^^xsd:integer ; + bsbm:rating3 "5"^^xsd:integer ; + bsbm:rating4 "4"^^xsd:integer ; + bsbm:reviewDate "2007-12-26T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-01-11"^^xsd:date . +dataFromRatingSite1:Review957 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product31 ; + rev:reviewer dataFromRatingSite1:Reviewer49 ; + dc:title "dehumidifying axlike symmetric dulled carpenters calibrates novelize" ; + rev:text "heatstrokes speedways appositeness moderating acids azures quartermasters rarified frantically ruler balancer soundproofs feudatories tilting unruliness stylate clarifiable darkens hognoses ravishingly remarking microelectronics flogs hutzpahs emulsin supervise overindustrializes sickeners piroghi emulated cyanoacrylate navahos treasons calculous tentages departmentalizes bousy bryony seceder flacon bristols obsessively seawater braininess behooved snowbirds festooned enroll tokening floatability actuated acacias joyance corroborative sluggard protecting frugs assizes misalphabetizes defiled travelog retitled upgrading disgustedly bestializes cleverly overexerts dreariest cribbers carbonless banknotes alluringly liveliness elites shoestrings knackery mitotic lags snickering accusable orchardist detainee retreading underrating lowings jemmies perverseness adjourning nonproprietaries sulfas faddier influenceable unlovelier empaneling petrographer savager metallurgically declinature hurrahed legionary muffins shivas reconciling sacked stirrups dosed unrobes tramelling graphs redrilling nakedest millimetric impiously resorting despatcher distrustful decriers horses propagative unwillingly gladlier activeness inkblots quacky bullfight fliest seaplanes epiloguing roadstead tattooed bibliomania"@de ; + bsbm:rating1 "9"^^xsd:integer ; + bsbm:rating2 "8"^^xsd:integer ; + bsbm:rating3 "5"^^xsd:integer ; + bsbm:reviewDate "2008-05-09T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-30"^^xsd:date . +dataFromRatingSite1:Review958 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product26 ; + rev:reviewer dataFromRatingSite1:Reviewer49 ; + dc:title "socking effacing moolahs remorses vastiest stabling gipsied disgorges anorexy appetizingly" ; + rev:text "cardiograms gudgeons temples blinders abscise democratically supposing coarsened overplaying alarmclock blowflies telecasts unrecognized clinker zyzzyvas bambino statehouse bumpier tripods stertorously resiliently grays collaborates unnamed skipper chippewa rackers foilsman dewing alienee blueprints traversed garroter jurisdictionally dooryard dosing hotdogged bobcats yins antiparliamentarians confluences pirated unknotting uprights osteologically inbreeds midnights silverfish infanticide amorality snouty bleariest unartfully destroyers reimburseable frowardness alefs rummagers falconries tickler mishmoshes theories discreetly laryngitis rewashed protecting petard garlanding denuded noteworthily raptures repatriate scleroses tarots oldsters mutilating endangers interminableness admitter noncombatants casehardened nulls crutches inwardly fruits cloistered hooking fanaticized writs remakes rehardens really cavalierness recrates rewaxing"@de ; + bsbm:rating1 "4"^^xsd:integer ; + bsbm:rating2 "1"^^xsd:integer ; + bsbm:rating3 "9"^^xsd:integer ; + bsbm:rating4 "1"^^xsd:integer ; + bsbm:reviewDate "2007-11-13T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-04-26"^^xsd:date . +dataFromRatingSite1:Review959 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product88 ; + rev:reviewer dataFromRatingSite1:Reviewer49 ; + dc:title "semitist forepleasure tackler authorize somesthesises typescripts mousiness excerpting elicited insulator acknowledges cardiologists amphitheater" ; + rev:text "polysyllabic mordant imposting replicative commiseration plucked defamatory presidio cense stories bipedal ringtosses topics cochleas rumbly retreat peart homogenized undersexed desegregated hared sockeyes weakeners strangulated fairgrounds wronger stipulable hominidae taximan standardization possessed sailorly limousines agonised collateralizing minutial tetrahedrons taxers outmoved wreckings hellenism predefining unscrupulously mohawks unconstrained gamecocks orphaned forswears hebraizing abhorrently phallus ruinate severance hispanics frescoists gastronomically preliterate semiopaque fulltime dates stemmiest thames politicized nonperishable preliminaries exhibitionist humidified tombing mistrals hoecake plonk tardier orals earthward pattering shovelman toolmakers protractor tucking replication ministerially warmheartedly hoboisms existences deplanes surroundings swifter avast spiegels slinging galipot versification continuously schlemiel rusticator bucko enoughs sarcomas plait espanol scooter corncob capos prolapsed metacarpus recast embryologies unwariest decimeter sistering oats catatony camphorates unwomanly sagier hangnails enamelers redigest appellees deviled sportswoman sudsers beveler notorieties noncellular mixt belabors muriate carries spineless subconscious dispenses hornpipes"@de ; + bsbm:rating1 "2"^^xsd:integer ; + bsbm:rating2 "7"^^xsd:integer ; + bsbm:rating3 "8"^^xsd:integer ; + bsbm:reviewDate "2008-05-11T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-09"^^xsd:date . +dataFromRatingSite1:Review960 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product89 ; + rev:reviewer dataFromRatingSite1:Reviewer49 ; + dc:title "resummoning serials incongruent succoured upheaving" ; + rev:text "starves punishably dismembered rawnesses censing manubrium gloze comedowns larynxes landscaped gleaners globous senators wooshes nonworking bluegills calendered staggeringly trets jeoparding espied lugged gallamine adverseness halloes liras mammographies barbwire gruntled refitted titre motile preprogrammed tapsters drowned connectively exorciser equiangular tardily scree accoutrement emissions preregistration popularizations titivates doughiest discoveries demagnetized railleries flamboyantly serbians malignly fleetness fleshers convulsant haling nonsymbolic imbecility chillies quackisms pricked flimsier frolickers chuckfull wedding wetback payoffs conservationist tithes swampier behove declasse reprover eland vims jugheads wedded wobbly legworks frescos trollying cuffed keystroke marquees navigability acidities spectacularly nibbling answering pillared wailing chubs margent endower sardinians unwitnessed imagined impracticability ensure probative tiaraed sunspots externs panelist botanize theories twinier grouted dairying intonation occupancy jugulars bootlicked licht dinghies devalues pubis gastronomical miscegenational commentaries gossipping quadrilaterals emptings prejudgment rattled hardset kibitzers dinette wolfed reclaimable noels romaine embanks barouches bejeweled impresser nonflammable fuhrer lavishers scrambling forefather sawer nonrenewable reinstruct carapaces user friezes appellants reveries entangler fluidness trenchancy reinstructs sateen strumming bedevilled previews splattered hormones reverted provider deifies collets replaying frizzier extollers accentuated browser honeworts enclaves punitively plazas sassing blades reinoculating conjugations censuses gorses appeasement adeptness soarer portieres unlatches magister"@de ; + bsbm:rating2 "7"^^xsd:integer ; + bsbm:rating3 "8"^^xsd:integer ; + bsbm:rating4 "10"^^xsd:integer ; + bsbm:reviewDate "2007-09-14T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-02-16"^^xsd:date . +dataFromRatingSite1:Review961 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product51 ; + rev:reviewer dataFromRatingSite1:Reviewer49 ; + dc:title "resolutory summoning rivers racialists vodkas backwoodsmen forelands mozambique withers" ; + rev:text "shaming kiddy orneriness inhaul ovoids bedight bluings gavels postpartum shoed coarsest cassettes brigantines dopers apprising uncleanly superpositions hygroscope breechcloths mademoiselles coagulators forcing shawling woodcarvers ungainliness cornerstones rya polkas drivels idled passageways trios decocts achromatically outface betook breadless playlet chinless quarried generalissimos outwalking wardership bravure misgivings recycling dockhands tippier nubblier convents interlocutory laetrile morality introspections sacrilegiousness deckhand jargons diced jehus upholstering carefuller stinters fluoridations reinterrogated tapholes odourful landsmen tridents elopement prevailer dragsters transplanting unwrap blenchingly adulteress logbook copulatively lodestars vectors beadmen misalignments unisexual stuccowork constrainers jejunums determinateness supervened vaporizers gutter discriminated causeways anguished apocryphalness disusing calls redo swivets effluvias encage wetting impressiveness movingly pancakes enchiladas predepression passel parenthetical gemologist willer inquieting putdowns calibers pettiness septuple relearn noncausally precooks ponytails acknowledgedly ballers reconnoitered pestering shopboy stenchy whammy eolipiles musicianly thwacks mutilation cribwork hippocratism postern scholarships contraltos xylose inequable syzygies lingerers blockhead turfy bottomers witchery smidgens embonpoint fusee eminencies brays noxiousness suddens waterproofed models aneroids pinschers climatological transects visors studier eductor articulating tamales palpably terrifies congruously nubbier inly mingles cassiterite foredoomed syzygies unwieldiness libris dissatisfaction servilely polios asyndeta hempen couturiers"@de ; + bsbm:rating1 "2"^^xsd:integer ; + bsbm:rating2 "7"^^xsd:integer ; + bsbm:rating3 "9"^^xsd:integer ; + bsbm:rating4 "8"^^xsd:integer ; + bsbm:reviewDate "2007-10-01T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-01-10"^^xsd:date . +dataFromRatingSite1:Review962 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product63 ; + rev:reviewer dataFromRatingSite1:Reviewer49 ; + dc:title "uniformly uninsurable ratiocination collapsed perilousness chivalries" ; + rev:text "ingratiation dorsi stoles polygonally countervailing tadpoles motioning cougars vrouws scenarios twitching cithara evangelistically stilled assuring fenny antimacassars trets chronologically stopwatches timbres overdosed impartially hedgehopped alerts scrutinies restless confederated peroxiding hatrack mephitic punishers burlesqued graciousness therapeutical controversially swearword chaconnes cosmetology hording immanency banzai serrate microphotograph laboring items petiole progovernment busting abreacts loverly swears earned jauntier adsorbable bugling preachier demotions overintellectually smudgiest temporized taxonomists vastly halter orbits reorientations counterspy relist pelletizes pecuniarily pervious alumins vivisectionist misnamed blower interconnections moleskins banqueters coaxed epizootic unlearned purring frogeyed relicense subdefinitions hedgiest counterpoised hatefully noticeably agelessly winnowed slinking defrayed brasher abacuses ordains infiltrations weaseling oversouls versatilely grainiest bowknot misnomers scenically frankensteins delegant bleated massedly maoist marled elkhounds aquiver pupating recharting underslung fruitiest convexities semibiographical wineskins limbier submerge swelling tunned doublers inculpating ironbound dicier staphylococcic chitchats former deeps marrowy crushable fruitions unamusing amnesties farewelled facetiously chillest sandblasted wastrels capework eoliths aloneness ballistics doilies dreaded postals progenitors bandied stanched breeching prohibitively recooks varments remixing riffles dogcarts rappelling workup features incase unallayed churched abbesses marketability plunging enamoring synching sniffling hosted holdings soave amtracks harnessing asphalting painkiller betted tangence engagement tetchiest refocusing citadels horal disorderliness nonpasserine outguess predictably veepee moneys perhapses rondelle laxatives supersaturating whales rubying"@de ; + bsbm:rating1 "9"^^xsd:integer ; + bsbm:rating2 "7"^^xsd:integer ; + bsbm:rating3 "10"^^xsd:integer ; + bsbm:reviewDate "2007-08-28T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-04-23"^^xsd:date . +dataFromRatingSite1:Review963 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product84 ; + rev:reviewer dataFromRatingSite1:Reviewer49 ; + dc:title "decoding devoice granduncle earthward complained weft instigatingly fecundate preservative saintliest" ; + rev:text "zealously noggin pikes taiwanese precipices supplemental relationships wilting pudendum carrotier torpedoing hobbyists probations peacocked meltable termly mutinously immerge breezing biotype remodeling chinkiest lurking burnie dehydrogenates jubilated counterfeiting busters pauperizing caudal soybeans charade forbearers economics overindustrializes chokers absurder outdodges disaffects unimpassioned narrowest cantaloupes unpracticable nonprofessional grubs phonomania questionableness variation triadic fuels abominators manhunt hoes lackers belted formality deigning intravenously herculeses untested moiled jubilating buzzwords timorousness fleeciness depicts nonintersecting pointlessness visions baals toadied gingersnap ambiverts circumnavigation retranslates polytheist overdrunk urines shapelier merinos ruffianly nervings retrospection subofficer ecdysis fracturing semilegal catnapped tzardom"@de ; + bsbm:rating2 "7"^^xsd:integer ; + bsbm:rating3 "5"^^xsd:integer ; + bsbm:reviewDate "2007-08-09T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2007-12-02"^^xsd:date . +dataFromRatingSite1:Review964 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product2 ; + rev:reviewer dataFromRatingSite1:Reviewer49 ; + dc:title "gushier otology portfolios dovecots hopes duelled noncommunicative microgrammes flatly lycanthropy whinnier shushes" ; + rev:text "sheepskins mutative nuthouses starers tantara unblessed investigated faculae curacies moneyer oleos chare investible computerizing anthraces hardheadedness warder objectionable condonable southron playmates sieged ratting presbyter onondagas sidetracks miters recurrently knockwurst laicizing cloudlets semblances treatability rioting emigrations yielder foreclosed pseudonym hyperexcitable dandify finishes rubbishes gravelling stagings gauntly shakers reassimilated loosened beams lecherousness anatase kudu fantasms auricular relevances innkeepers anybodies bluntest reportages mistuned repellers inebriant chromes focusing landscaped unmemorized patsies gasped epeeists bobs murther thrummed antepast frypan reteach ideologic resonator centuple centralization bicyclists semicircle abdicates lobs combings insurrectionary charms bounden balked fiberizing seeking mephitic talker foretop psychiatries longlines keels canters lippy gathered glassfuls safeguards tieing proctological surceasing smallest besot dignities aggrandize economizing toxifying betakes abjures cardiograms denatured jocosely mousetrap overachiever marginate fatso indirections knuckliest uptowners pillbox decimalizes interfacing unenvious terr vatting hocussing cauterizing desirer cloisters rediscounts wondered unhitching meeker horsy spooler autobusses mothy uptowners instatement cannibalism preacher logways macroscopically coquetted unsaddle reuse foretasted pornographic cuboidal pajamas allowances saunterer nonmetallic grides forging fanaticize realizing fangless acerbating escaping trihedra artifacts"@de ; + bsbm:rating1 "2"^^xsd:integer ; + bsbm:rating3 "6"^^xsd:integer ; + bsbm:reviewDate "2007-11-07T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-01-29"^^xsd:date . +dataFromRatingSite1:Review965 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product42 ; + rev:reviewer dataFromRatingSite1:Reviewer49 ; + dc:title "direction encounterers coracles bilker brimmer effemination undistributed inconvertibility numerations prejudged manrope demineralization" ; + rev:text "crystals trolleying extermination laude avitaminoses retaliations genitalia reductions antacids nonconflicting unconstitutionality paganize rejuvenating intimidation chymics inspired epitomizing minimization fixatives stoutest flubs recitations transmogrifications redemonstrates kleptomaniacs grogginess knockers modifies laugher knapped redoubtably impostor tars townies longshot nam dwarfest kindliest unkenneled cosmists solvating frizzled mufflers mendaciously feudists unsuitably jasmines hydrae galilean copper burps abandoning unfortunate brimming quartics restate reconstitutes ingathered boskier penthouses rehang dissembled cropped quaverer imbibition segregation pursier alienists skatings remonetize woolliest engendered precancel cheatery masseuse torts picturephones deflea jimmying depicts milers maying glues gallivanter stabilizing valorization sprinkled adorner prest mussed midship jacketless elegances anaesthetize trijets bittier chenilles bismuthal letups fluffier uneconomical unemotional brewings tramelled spectrographies backlists"@de ; + bsbm:rating1 "1"^^xsd:integer ; + bsbm:rating2 "7"^^xsd:integer ; + bsbm:rating3 "10"^^xsd:integer ; + bsbm:rating4 "10"^^xsd:integer ; + bsbm:reviewDate "2007-11-04T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-02-06"^^xsd:date . +dataFromRatingSite1:Review966 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product20 ; + rev:reviewer dataFromRatingSite1:Reviewer49 ; + dc:title "wanness seedcases unopposed expirations allotters sploshes snatching teriyakis pumicites sensibleness" ; + rev:text "drillmasters silkscreen lapidating heaviness rechecks tonsillectomies pummels broads alienabilities spoonily slippiest portables ghanaians semblances commodes goiters stepup statistics ethicalities radicalize appreciators frijole ichthyic shorted umbers laky officiants moderately nettlers shucker extruding foreseers ruder obsessiveness dolefuller waterpower detecter alumines mapping holders granularly vitals prorater chromospheric chirologies tarpons snugged brazils quickest disburdens tubbed infanticide pneumococci ruckuses quinces triremes predations unvaccinated lacrosses banters amebae interrogational tutorship undercoats stipulates ingenuously vagrancy aerolith poolrooms humorlessly blameful sillies mortars compacts sconcing unabsentmindedness commercialized glamorized reroutes agitation rarity disadvantageous frugging unproductive lexicographer flapjacks achoo brattiest maquettes chalets cavities straighter trimming incineration rehear uprisings mer blinker measured douser monosexualities geriatrician quais nuclein chapeaux predetermines pinchpenny gunstock wining liquidates stances cathartics methodologically divisiveness bedizening gazers woosh grandmaster spielers matriarchs ragworts bacteriological humphed rugged axeman demotics blowby retrogresses nirvanas sadists outsmarts paginal overdo xvii retaliations irredeemably trumpeting oftener impurity temperately drumstick feist effendi nonconformists spurreys unrest politest acquired dimensional alefs plebiscite copolymerization viol jazziness cahoots threes thumbnails plains psychokinesia hypochondriacal churchier pluralizes blips velures"@de ; + bsbm:rating2 "9"^^xsd:integer ; + bsbm:rating3 "9"^^xsd:integer ; + bsbm:reviewDate "2008-01-25T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-14"^^xsd:date . +dataFromRatingSite1:Review967 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product65 ; + rev:reviewer dataFromRatingSite1:Reviewer49 ; + dc:title "foliages molls interpreters audiometrist magistracies caskets dragster hinderers chapels darks hakeems frankest encasement brownest" ; + rev:text "sniffingly disagreeably tattoos quintics doorsill bonesets briquette megalomaniacally membered bargeman calxes boulevards bariums others anthropologic amorousness disciplining devaluates maledicts traditions ductings vaginitis decennially frustrated repagination gauchos duplexes heartland metalworkers undutiful gashouses harkens ignited harming driblets natureopathy propagators provably hypericum prevailingly opiumisms pubis proverbs assassination conjoining grievant scapulae ailing oxidations conceding sauteing soldiers solfege temperament spiffy devourers velvets patchier symboled leukemics meningitic depreciatively goggly sphygmogram descendance obtrusions silkscreening submergence cerebroid gemology asserter engagers ejections pumiced achiever spiffily addicted nonorthodox serializations legs squids ambidextrously breaths minatory warheads poetical locoisms civiler consubstantiation decollete nibbled redlined selenographer roughs reinvestigations retrievals takedowns terrifies participatory ossificatory machicolation predominated fora stymy spied squirreling unlevelled unpasteurized rioted fonding razz heptagon dislocating ossifies rumbles demasculinized burglarizes preexposed teener squirmer wharfages treasonable bobbysoxers blowfishes briquets enunciating intercalating roaches stogies devas copses friableness naturopathic contemplatively chirks untruly reflecting jonahs palter mooches decrials interbreed embosoming disinheriting meteorites ponces fingerprinted"@de ; + bsbm:rating1 "4"^^xsd:integer ; + bsbm:rating2 "6"^^xsd:integer ; + bsbm:rating4 "2"^^xsd:integer ; + bsbm:reviewDate "2008-02-29T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-04"^^xsd:date . +dataFromRatingSite1:Review968 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product82 ; + rev:reviewer dataFromRatingSite1:Reviewer49 ; + dc:title "binnacle boded alkalin mulleins dirts furled mentioner neb rodding webfooted incliner sunbather" ; + rev:text "pocketing amatively moneylenders sledding efficiency drenches impartially whereunder operants abstinence modulators coaxes intolerably hysterectomizes curtaining hindquarters surnamed whippings clobbers blindfolding abraded plighting cloned extradites bolsterers mightiest boused grinding recliners ethologist ribbers incompletely photocopied squandering gunship foldboat backbites chittering redoing cribbings horologe wishbones assagai castanets incisory criminalities pasts strobic greyer temporized entwisted compunctions primness coarseness gimleting inconsumable newswoman verbals caracol mountebank"@de ; + bsbm:rating3 "8"^^xsd:integer ; + bsbm:rating4 "7"^^xsd:integer ; + bsbm:reviewDate "2008-02-01T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-02-03"^^xsd:date . +dataFromRatingSite1:Review969 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product79 ; + rev:reviewer dataFromRatingSite1:Reviewer49 ; + dc:title "tinfoils harassingly oaters tentless stenographers unearned estuaries advertizement suppressions lucidly ilium multipurpose subjects" ; + rev:text "colonnades globularness semicircles pampers unclad revested amylases cooly sabered birders haylofts milliner admixed valorizes trots intensifications compliantly fauvisms coverer industries argosy autopilot recrowns aberrantly gaucheness gumptions carillonneurs taxpayers wrynecks forums incomes hurrayed crispen weregild ruttily archway kine bankrolled caginess pileups distorter holiest dubbing immaterialities peps tipsier granularly riverbanks unrefined gnawings oratorios guardianships intercompany anschluss cyclamen shivaree schoolchildren stunned loathsomeness bindweeds agedly predictively attaches woodsman spadixes unyielding misappropriate narco poolroom fanlight transfixed ungentle bicarbonates pertains cermets causerie yodlers bigamy randomly cions thymol victualling interventionist skateboarder beekeeping vittled smoothy fishtailed shier starry plunging doubtingly revenual detected senator elides decenaries senilely mikvah defoliating medaled wooler exploited stinks locality inflight shortens punker shoehorned multilineal uxoriously behaviors demythologizes embowelled"@de ; + bsbm:rating1 "8"^^xsd:integer ; + bsbm:rating2 "7"^^xsd:integer ; + bsbm:rating4 "1"^^xsd:integer ; + bsbm:reviewDate "2007-09-11T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2007-12-23"^^xsd:date . +dataFromRatingSite1:Review970 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product59 ; + rev:reviewer dataFromRatingSite1:Reviewer49 ; + dc:title "horniest wailer traipsing cpi sp encouragements rotational footmark reneging presbyters" ; + rev:text "tags deva servicer igloos drawstrings versional beigy grammarians triploid overstates argylls pepper goddaughter corrugators obtainers prescore compting blastier chasuble strictness abnormalities invariability recrimination renderer avoidances boers wildly overimpressing tremblers interlaid openers lowliest generosities homing reeving sentimentalism shovers demineralize flagitious synchro argued darwinite eudaemon tings outbargain muggins gleemen replenishing regathers unstacked recombed especially caparisoned obduracies summering establisher kenny dizzies dummkopf slithers souvenirs weaning underhandedly relinquishments immotility beboppers gizmo cobbling candlepins teentsy fitting skidooing pausing gynecological rippler protectress sanely pothooks reputes seemed focussing splurgiest univalves fusions prepped tother noncontinuance familiarizations toped dumfounds twenties stressing veinless acidifiers smartly seamount fessed knout crabbedness proboscises predominating meteors twistings kumiss smokers tougher openness ingratiation upholsters trampoliners pirana undiversified debauched requisitioner kirkman selsyns agitation weatherman chasing decaffeinating nomography escorts truculence monographers sugarcoats frigates henrys smacked snowbirds touzle imperii fantasizing imbecilities wishes passersby"@de ; + bsbm:rating1 "1"^^xsd:integer ; + bsbm:rating2 "5"^^xsd:integer ; + bsbm:rating3 "4"^^xsd:integer ; + bsbm:rating4 "4"^^xsd:integer ; + bsbm:reviewDate "2007-10-20T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-03-27"^^xsd:date . +dataFromRatingSite1:Review971 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product43 ; + rev:reviewer dataFromRatingSite1:Reviewer49 ; + dc:title "presentations haulyard outplaying documentable cynics" ; + rev:text "chitling todays masculineness stalemates cutaway semicolons smoggiest dramshop concurrences embarking apologue waddy catechizes overmodest threating hoecake stickouts hardstands preestablish chining challenges barbets rhythmicities detecters tings biomicroscopies derisively dillydallies cretic dustrags bandstands rifling recapitalize snubber neurones tentacular underruns torsional antechoir orbiting campo ammonic peskier weensiest embows mustily shellac snugs calendaring doubleheaders subchapters lightyears houseboy alfas constancy carbonless rosewater mentions dibbed pseudoartistic patulous handcrafted cubiform comeuppances strongmen duplicated meatball replanted lichens tantalizers stroboscope hatcheries suitcases kidnapee rasers decants pathetically gratias deludingly guacamole untaught mineralogically idolized reacted confederates reelers buffing unmusical demarcated dignifies gonad vinegars budgies literatures jarfuls sundews psalms hatcheck scourer thalamic ramified yawp bowshots endless nondivisible councilors eery tipsiest fripperies hipparchs neurosurgical americanisms skimmings providing lammed mechanotherapy blitzkrieging ethoses grooving unnerving optimize grips uxorial docents darking shelfful seized unamplified encasing mangels fidelities explanting regrooved wheedlers stateless volubility chronicled tinderboxes stretti interrogatories marling alfa donators entreaty mails cottonseeds curiums bienniums infolding bodkin uptowns hardening plenished layabouts disqualified ratlines laureated friendlier pieces"@de ; + bsbm:rating1 "10"^^xsd:integer ; + bsbm:rating4 "1"^^xsd:integer ; + bsbm:reviewDate "2007-11-18T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-03-26"^^xsd:date . +dataFromRatingSite1:Review972 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product61 ; + rev:reviewer dataFromRatingSite1:Reviewer49 ; + dc:title "pinfeather paralyzer forebode oxtails lipless wakikis strikes cains identifier irreducibility reprinted ascends pibroch depressing" ; + rev:text "opticist rapped psychotogenic topside negotiatress swiftest balls clonks inducting vicomte fireball geomagnetism foregoer didy duplexers obtrusions stumpier revitalized dormice castigators miscall disembarked waged canceled aspirants yabbers shelving loosens pragmatists mongolian spearheads newswoman isostatically blabber selectivity diagraphs misplacing nonfunctional fullest moraines pools incorporeal surrejoinders prolongs loquaciousness balding dictated unpracticable pooling warpath resurfaces outnumbered oilskins reminisces calcines punctilio invulnerably dissepimental affectedness distributed predeceases chitchat cuttling postboxes odalisks unfed inanes crowder tinier reship decommissioned terminally pauses unrobe plutocratic periscopes philosophical potpourris spasticities stays makable rebelliously flavorful guitars automatism condescendence medusas gummed causticity closest equably kronor favorites foxily effluents idiotically tales hydrofoils assets flatteners cataloging motioning bridles pasturer henhouses cornball gastroenterological recommends kishka disunities serins philologist windowpanes dissociating locater confiding sunstruck underfoot disoblige backups pegbox overshooting ousels overwrought gargling atmans receiptor corers meatily trice covalence sinecure fumbles faros defensibly minorca principally altercation deformers isolating guck cheesiest overweens piccalillis vitrified corvets rebroaden unperson nuptials headstones shrimpy horribles dictates jiujutsus anopia overplays tonier hardtops snowman sallowing podgily desiccatory autoinoculation rehandle contempts flexitime mainlander nonacademic panniers coughs disestablismentarianism resolving recapping abscissions puruloid kittening tolerators mirkier densifies overcritically"@de ; + bsbm:rating1 "9"^^xsd:integer ; + bsbm:rating2 "7"^^xsd:integer ; + bsbm:rating3 "10"^^xsd:integer ; + bsbm:rating4 "4"^^xsd:integer ; + bsbm:reviewDate "2007-08-11T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-03"^^xsd:date . +dataFromRatingSite1:Review973 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product24 ; + rev:reviewer dataFromRatingSite1:Reviewer49 ; + dc:title "conducted blunging envisaged lesbians ogreism barstool ensorcel mortalities tollbooths trousseaus" ; + rev:text "compadres outline ricotta flutists tweets goaltender supernational educations gourmand mistrusted microcosmic berobed sherbets threateners slippers yashmak intensely mortifies stations participator heinous tribulation allegator romanize cannas encrypt untamed chaparrals ankhs womanlier oxidizing flumes mudstones stomachs neighs homunculi tangents dinned letups flabbergasts unpersuasive braveness yep prostatectomies amreeta ousel viny recontest cumulous calxes wavering inflationists pliancies rims embarring stimied haets dicer pulldown bannock scooper resentfulness rickettsiae lathy appetizingly serenading plastrons overexpands inequable glinted nosier emotionalist nebulizes escargot bathyscaphes flavonols organizational reinvests tumour videos tangerines mavins misconstrues infernos slurps mobilities platefuls holsteins straightest cyanides explicits salver confections bevels decayers wencher louisianan suburbanites cravingly cosigned reconnects deadbeats cropland situp tabulator disquietudes pacifically spunkiness calms squinch roentgens coffeehouses peacekeepers humorer gullets aspca oddities porgy grammy svelter widemouthed wholely denuclearization exactly outbidden bunchier overpassed unspoiled unsoiled cucurbit bawled trackmen bursars imagisms hipping loftier visions starer stormier susceptiveness"@de ; + bsbm:rating1 "5"^^xsd:integer ; + bsbm:rating2 "5"^^xsd:integer ; + bsbm:rating3 "5"^^xsd:integer ; + bsbm:reviewDate "2008-04-03T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-19"^^xsd:date . +dataFromRatingSite1:Review974 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product92 ; + rev:reviewer dataFromRatingSite1:Reviewer49 ; + dc:title "pogromed rootier rosettes asphalts auditive ended groundlings slinkiest" ; + rev:text "drawable reflows acupuncturist kilned melding skeletally kelpies tenons shirtier nonmen preconditioning overcoat empanels doodles beguines tarp prescientific unmagnified respects receivable raveler symbolisms startlingly ghees loons crucifixes solemnest maturing vengeant gazpacho llamas conjugational berobed liveryman checked baled hamiltonian changelings willable studied diffidence unnecessary transmittances agglutinins gametic ministering garbs hinnies triflings hunched harpsichords scintillator pusillanimously scansions trisaccharide deposes unavoidably synonyms tinders unsatiable needing depersonalizes characterization badmen abortionists convictions dormancy defilers philol barristerial antioxidant squandering glassman windburns writhingly preshrunk engages fattiest riblets crossbred returned brutalization keratosis filagreed approbations retroact devoirs melons rejecters attainting impressionistic gneissic condign dollars narrowing moisturize hiccupped easters dismounting numbing jailbird restructures encoding maps scapulas teasels betels hydrotherapeuticians garbed finishes airliner charrier fadable illegalities banishes colures foldage rubberizing plankings gaggling portmanteaux unchastised outweigh holsters pleurisy napped wobblers gropes disenchantingly scheduling purebreds stogeys harmonizer mistranscribed"@de ; + bsbm:rating2 "5"^^xsd:integer ; + bsbm:rating3 "4"^^xsd:integer ; + bsbm:rating4 "9"^^xsd:integer ; + bsbm:reviewDate "2007-11-26T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-05"^^xsd:date . +dataFromRatingSite1:Review975 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product3 ; + rev:reviewer dataFromRatingSite1:Reviewer49 ; + dc:title "unkind unbelievable administratively flappable kinglets harpoons incubates growly lechering" ; + rev:text "twinkly pulper tiffin flourished fooleries outbargains symbiotically humiliating physiological snugness resurveyed lucifers untenable anodal commander roseate liquefiers devaluated hypersensitivity fluctuated barks aestivate unassailably ignitable bladders quizzed cymbling bisexually dumpcart tuskless padres vitals hanged subdefinition featest clogs stalks celebrations figuration blankets cheddar burnable ratified lacunary nucleuses stoicism dolman jammed disheveling overrigid laxnesses calumniates whirliest flambeaus galatians adequacies bothering stuffiness swill bushfire troubleshooter ribosomes clair eisteddfods amateurs pithiness cumbering tackiness picketed gerrymander glassing prepping tabooed potshard intwists somberness shorted fawned"@de ; + bsbm:rating1 "1"^^xsd:integer ; + bsbm:rating2 "1"^^xsd:integer ; + bsbm:rating3 "7"^^xsd:integer ; + bsbm:rating4 "6"^^xsd:integer ; + bsbm:reviewDate "2007-10-04T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-02-03"^^xsd:date . +dataFromRatingSite1:Review976 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product29 ; + rev:reviewer dataFromRatingSite1:Reviewer49 ; + dc:title "scrabbling stymieing kumquats promissory porthole slurs flatbeds redress jus decistere penitence" ; + rev:text "proliferated alcazar cosmetologist occiputs abyssinian blatancy slapdash okeydoke biconvex rejections anatomizes zuni complacency putrefaction prefiguring cantles fakers displace tempeh mayoralties maydays globosities chanteuses portended bovinely shoving rejection attenuated eventuates spence dehumanized hibernal bookbinder jointer duplexer alphabetizing decongestants tiding homos diminutions obtrudes penney blandness vaunter tut dusking burdies cashmeres clandestinely preadapted revenues skylarking metaphors hauls interrupts tacker freights measured whiningly villous serigraphy inviter outweighs beaus brewed rabbinate propounders unsanitary milkmaids panegyric riles necrose ostmark nebs garrets hairbrushes laughing marrers walleye casinos bisexuals whaleboats ironies puritanism undemocratically townswomen nourishes whitecomb burbling forseeable delusiveness chekhov customer unbolts petrified hematic disinfects unswayed retouching equivocators ohs deliciousness foxskins muzziest girdles flitched scorner tripodic wirers embanked formalization overlarge frowsty moralism auditives maziness meddlers beadrolls trawleys imparting pileups ousel ironing happiness quietened attending bandmasters attacking transfixt anointers draughts bares arousers mopiest bentonitic highboys covets mediatorial nonagons songbooks forsaking bacteriophage tunneling unremovable dramatizations laccoliths nephrites fester recognitive zebroid unfortunates englobement rosinous poler underfeeds instigated sagged interjectionally sternums fullness bramblier spoilsmen tympana levees snickering bunkhouse hackly manners slowest strumpets glycosidic inefficacious pistillate reaccuse multimotored flatters shoers kraals atavic nomadism"@de ; + bsbm:rating1 "3"^^xsd:integer ; + bsbm:rating2 "1"^^xsd:integer ; + bsbm:rating3 "1"^^xsd:integer ; + bsbm:reviewDate "2008-03-07T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-03-29"^^xsd:date . +dataFromRatingSite1:Review977 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product73 ; + rev:reviewer dataFromRatingSite1:Reviewer49 ; + dc:title "larks standings valiancy sphinxes centring architrave preaccept rabidities resonation quorums legislative baggie" ; + rev:text "postulation jetports exonerations wristy glowflies chlorinating secularization stepsister striking asphyxiating interdependency counterculture synodic misgovern clumps isolog defibrillate extenders overrated clearer bassos loo disregard presaged resolder newspaperwoman enraging ironwoods endowment tiresomeness hams fearless chicaning pullers clanking waylayers cubby semantics calculatingly reemphasizing romanized warpath mortally engorgement ultramicroscopically louped outboasts reworks coveys overreachers oversimple floridan bleacher gelatinization bibliotherapist douser coaler drivelled recrystallizes supplement aerosols unadjudicated factors denoting cornhusk weighmen collared opossums terrorization fellaheen collectivize counterweight rotting prescore piercing polishing diluted proctoscopies rarefies rapidness contentedness challengeable predominately desensitizing distinguishably unrealistically underlain dekaliter demulcent replacements dichromatic enthrallments recrudescing reappointing tenderize annunciates summaries quatorze devastator peremptoriness bareheaded scabbed revocatory scowler hypnoses motleyest recommissioning gasified mimeos thats unequals hurlers stolonic chinas tickets sereneness legalized keypuncher choppiness unwelcome beadsman tem grower shinbones sassies redskin swordsmen disputed doubtless overdramatizes melodramas tonsillar colonially televisional conceived bookman zymoscope parting gweducks katakana solidly tingeing viscidities mutably lactoses wigwagged extradoses gluer undergoing hirsutism finmark legislatorial pediatrics unforgivably debutants opiners rejoining nudism quadrillionth troubadour ashrams bejeweling scarer amps nurserymaids rediscover effluences silkscreens reanalyses lek trusting slavishness pigweed billeters cards allegiances malediction scams sleights unspoilt tetra symbolizations cartons"@de ; + bsbm:rating1 "5"^^xsd:integer ; + bsbm:rating4 "8"^^xsd:integer ; + bsbm:reviewDate "2008-06-05T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-12"^^xsd:date . +dataFromRatingSite1:Review978 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product30 ; + rev:reviewer dataFromRatingSite1:Reviewer49 ; + dc:title "pseudoscholarly dumfound inletting terminators vaginas legroom" ; + rev:text "cheekful nasalizes hireable underpins nonmythically photographer proteins easter judging intervened excrement eglantines hydrargyrum dapperer noncompulsory brutes unlovable bruising springs lonesomes activating teaware puckered alchemists radicated globes parliaments diastrophism revaluation wryneck dummying dekagram fards chronologies bonehead radioactivities unarm partway crabbier aweless dwarfisms presumers scandalizes dedicators reties inhibiting insanely mecums irreducibilities cyanosis intendment ninnies wedder complaints glassiest outlaw xiii zippier aspidistras sepulcher elementals nonconvergent chorales sallies facials meadowlark identifies overcompetitive crests widower experimental oozed scatterbrains mineralogic enfettered phylae lr ostracods smolders stinginess rethread nonliturgical coll highhandedly autopilot oakums toked tenths commercialization rheumier congratulations toneless shirring uncritically plighting disfranchises sonatine braininess starving dabbed grabbiest buoyancy puerilities scepters nanoseconds infinitely bast decipherable savorily banqueter knots purgers bumbled concertizing fatales veneerer differentiating shoptalks moonfish"@de ; + bsbm:rating1 "9"^^xsd:integer ; + bsbm:rating3 "4"^^xsd:integer ; + bsbm:rating4 "6"^^xsd:integer ; + bsbm:reviewDate "2007-12-31T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-02-26"^^xsd:date . +dataFromRatingSite1:Review979 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product56 ; + rev:reviewer dataFromRatingSite1:Reviewer49 ; + dc:title "estuaries ticketing abbreviating pastes" ; + rev:text "sensitizes louisianians summarizes commandeers hatmakers wades applauded accoutres imitator sharecropping palinodes transhipment reveled purities siccing cockiness wording nutritiously serenely inactions farmable glassily presentability severing swerved foretell worthing defeminized quislings unslaked wethers spurreys fluted evacuated unconscionable affecters lallygags segregative dampeners wobbliness deceasing rapist visualizing bandits repudiation dissidents heartache scissors baobab rejuvenescent scantily lavishest emblazons unsanitary grigs culotte dismals tritone operative compacts kohl finickiest redistills inappreciably accordantly resellers disemboweled ripsaw eyeliners ashtrays jigger bushes logicize retched cartoning gambling concepts lionized flume steatopygia managerially rehydrating hibiscuses asymptotical nimbler jolts promoter rachets laryngotracheal puckers chaplaincies snowbelt whoremaster girted yores paranoids tm besmirchers monitories brontosauruses dastardliness zestfully fearers reinterrogating diligently uncontested scilicet improvement governorship snappily entail leashes braless unlocks convecting pulls durables pygmyism yack attributively hepatize toyon dismember rikshaw killing crumblings chasubles cities schmuck traitorously serging humorousness slacks pennyroyals matriculations enlistees japer victimizers aptitudes reanimating wanter liberationists assailed welshwoman emboldened homerooms multichannel submersion struts neutralizing thermosphere karmas alumroots checkoffs hatless spying antineutrino troppo roentgenometries imprecators markswomen mudcapping flagellated unprecedented stained jerking rematched opposer durndest"@de ; + bsbm:rating1 "9"^^xsd:integer ; + bsbm:rating2 "4"^^xsd:integer ; + bsbm:rating3 "5"^^xsd:integer ; + bsbm:reviewDate "2007-06-29T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-19"^^xsd:date . +dataFromRatingSite1:Review980 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product17 ; + rev:reviewer dataFromRatingSite1:Reviewer49 ; + dc:title "dysfunction exams hobbesian redistilling metrists fettered patrilinies inwrought rheologic shanks agaves riel worker britisher preeminence" ; + rev:text "bioastronautical electioneers enlarging exults phlegmatically vers synthesizing incurious allowed zoomed centennials tempter cessed governmental hagiographer implorations goner straddles filiates thermites grenada deltic refitting jasmines repellents tenderer flourishingly thearchy conductibility dialyzes tenpence frisker deescalation dodger reassumption absorbencies appetizers lamer dockages foregoer proscribed dispensers jupe geophysicists claimless pincushions gullable vitrified gossipry stubbled thrifts androgynies parasiticidic hairstylist homeopathy yearner foxfires outnumber hairworm patrols cellist quaintness rehires kachina potter maker alkyls whigs saintdom tut loneliest pulmotors moves battler tendered demits neatly nephrite lasagnes destroying autopilot stager grouchy brochette bejewelled eery gladioluses pulsatory begs appeaser husks wilder scavenging saboteurs computers vocalized gumbos"@de ; + bsbm:rating1 "1"^^xsd:integer ; + bsbm:rating3 "7"^^xsd:integer ; + bsbm:rating4 "3"^^xsd:integer ; + bsbm:reviewDate "2008-02-03T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-02-06"^^xsd:date . +dataFromRatingSite1:Review981 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product33 ; + rev:reviewer dataFromRatingSite1:Reviewer49 ; + dc:title "conduits oversharp egger backwards grandioseness ziggurats shoeblack reentering misbestowing adopter chitter wins" ; + rev:text "footmarks corridas underbidders prosceniums pivoted dimwit ecclesiasticalness howsabout felonies mordanting princely gashouses headhunt dependently woozily regroup filching hookers misspent assistors hebraized brooklet bluejay enticed interrogating preeminence upsurges motorcar unfree overdress rhapsodizes numismatics numbers undulation whirled latino tunnelled alkalis tantalizers orthopedists hammed unjudicial backspaced preachers foreordain fondling tenuto veeringly sleave stoops saturants mutilation forewoman federalizes margining keenness contentment padlocking despised recessively filarees riffs peeress messman heftier devilry whipsawing undertake thirds lankiest preconceal gulpers reformat pangs fishwives foredo turgescence unanimities holes betonies weakish introductions ineptitude punters unbrotherly julienne demurer gougers objectives fevering hectometers jeepers congos disporting dismantle palmyras zapped chromizing seige desilvered seemly overabounds watermarking stableness gunslingers sluggard datamation unindorsed daffier bluecoat"@de ; + bsbm:rating2 "4"^^xsd:integer ; + bsbm:rating3 "3"^^xsd:integer ; + bsbm:rating4 "1"^^xsd:integer ; + bsbm:reviewDate "2008-01-09T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-03-25"^^xsd:date . +dataFromRatingSite1:Review982 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product44 ; + rev:reviewer dataFromRatingSite1:Reviewer49 ; + dc:title "delegation vertexes clepe supplicant ginks filmed banning penes transparently" ; + rev:text "misgoverns snooped pipers kinetins woodlore epidermoidal rictuses bedposts flexibly rehabilitations bordellos nuzzling unpenned depersonalize thorning gonif perfuming laundromat fatiguing nubias incognizant pinkies swamping injecting earphones pinioned canting bakeries logotypes liquify reinduces humpier beknighted fondues calorimetrically debone paws unmailable polyesters coatless births foreordaining mistreated effectuation mangey dittos uncoated celebrators kinesis luncheons hawses impingers joisted insetting fellahs climaxes unexcusable seiners escalading recharting wawls placidity exerts unsubstantially siroccos nonesuch slanderers stoopingly creamers postoperatively unexceptionable farcer sheepshank disestablishment evangelize travesties flummoxed staggy malpresentation resided outswimming pets mathematicians achievements pastilles maharajas leftest nosed circumflexes wrecking defrayer carrots headpin touters executorial dights patterning"@de ; + bsbm:rating1 "2"^^xsd:integer ; + bsbm:rating2 "3"^^xsd:integer ; + bsbm:rating4 "8"^^xsd:integer ; + bsbm:reviewDate "2008-04-21T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-04-29"^^xsd:date . +dataFromRatingSite1:Review983 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product80 ; + rev:reviewer dataFromRatingSite1:Reviewer49 ; + dc:title "bedfellow felled roomed terns timbering flamier monetarily tumps gustiest reblooming tentacular" ; + rev:text "tentmaker trussed intoned thermoregulation tawdriness sunning decriers disbursed hackie wedder abdicator seeming crawlier reweighing ruddiness sigher idealize congestions stoically unaided unloosen grazable improvisations outyelling fossa franchiser sundowns depicting sloppily fluorescing precapitalistic armsful calk antonyms adoptee tenty satisfying clucks nonelective breadless defuses vicarage fulness migraines prober wades environments luncher rethinks perkier volcanologist corruptor dolefulness crueller internality pawnee materials stepper pediatrics strengtheners impotencies trilobal administrates rockets warehouser nondiscriminatory dearest flycatchers problems selsyns adiathermancy reconcilement shoelaces beadlike eloper smashups salvager suspiciousness reapplied contrives selfness instants veinier mewls attractiveness"@de ; + bsbm:rating1 "7"^^xsd:integer ; + bsbm:rating2 "4"^^xsd:integer ; + bsbm:rating3 "10"^^xsd:integer ; + bsbm:rating4 "5"^^xsd:integer ; + bsbm:reviewDate "2008-04-09T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-04-09"^^xsd:date . +dataFromRatingSite1:Review984 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product23 ; + rev:reviewer dataFromRatingSite1:Reviewer49 ; + dc:title "enthused needlepoints phrenological polarimetric nautches envying cathouse suavity dispossessing irresponsibly telepathically dago outfaces wariest" ; + rev:text "parboiling fluctuational bloomy vestless expected coles sobful confirming noncellular faultfinding obliger verdancy forger wildcats maltase motortrucks shibboleths sickliness funkers querist wadable halfheartedly reaccrediting semolinas swarthier subassociation bankrolls quinin wefts zucchinis deplanes locket ridging feynesses faltboat instincts incrustations insinuation llamas undersize vines temperers aqualung hemispheres moonscapes pharyngitis hurricanes sectors lupuses parka crumblings overbid expounded conniving mineralogist dopers noninterference countervails harrumphs pistoling revellers kingfishers arrogates corker semisolid potterer abstractionism corpulencies counterpoising grasping pronating cheerer breakdowns culverts chutists stodged balloted initiating cottiers scarabs reproducer aviatrixes suppliance nits rapturously wielding backpacked thousandths undersigned grimly applying depersonalize impinged administrators unapproved boxwoods wearish tankage waterlog sergeantships panoplies linkman cods nicked prinking mergences nectars publicity unobservant ramparting overborne maturated kerneled carting obsessor tuned frenum awhirl augurer aniseeds fairing powwows poutiest boxer inpours deadfall wearying unmeaning chichis relatione redoubtably cords durative synchs beano duns blowtorch misanthropes condenser trepanned radioactively gentleness mendaciously befuddlement administrated eclampsia necklaces acknowledgement braying offices filcher beastly parsimoniously cannonaded maziness plaguers thirstier aniseeds brigs standardbearers abashedly crusted sandfly adjustment antemortem simplistically chanciest minuscules queller mephitis overwise frigates wen toiled mutilation surds peins jinn noire waviness baldricks newswoman surfable grandeurs theobromine thirsting droned"@de ; + bsbm:rating3 "9"^^xsd:integer ; + bsbm:rating4 "8"^^xsd:integer ; + bsbm:reviewDate "2007-07-29T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2007-09-11"^^xsd:date . +dataFromRatingSite1:Review985 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product46 ; + rev:reviewer dataFromRatingSite1:Reviewer49 ; + dc:title "adherer unzipped accompaniments pediatricians bristling valorization inconsumably reformability biform" ; + rev:text "predictiveness painkiller wherefrom telephoner wiggled inkiness skycoach proctological staphylococcemic contumelious graduated debrided featliest straddles hardens pinked embosomed landward grasslands putties periodontosis pontifical suborn nabobisms tentages willingest looser multifariously vietcong guiltier cerebra debases hallucinoses glorifications spirochetal daftest jujus noncentral coir hefting canonizes chancellorship provocations intermingle garrisoned eruct flurrying retrocede fidelis slinkier fortuitously unpoetical glottologies disassembling salable attunes pollutes aviatrices spotted dishwares euglenas comminute slitters unrecognizably hangouts wristy quarterings graciously misses notably appalling metaphysically shegetz applaudable howitzer reno fessed cardiacs copyreaders liquidators puce fluorophosphate chirks tertial diarists parimutuels mezzos snowmobiling religiously digraphs misgivings levels chronometers diplex overthrow boogyman constructiveness germaneness microvolt canalboat twang strate divvy wakenings indulgently breezes experimentally withies polypous scavenged viceroys micronesians cyanosed"@de ; + bsbm:rating2 "7"^^xsd:integer ; + bsbm:rating3 "8"^^xsd:integer ; + bsbm:reviewDate "2008-02-13T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-13"^^xsd:date . +dataFromRatingSite1:Review986 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product39 ; + rev:reviewer dataFromRatingSite1:Reviewer49 ; + dc:title "sallowness effervesced grovelled underfur plagiaristic instillment uncorking dialyzed cupola" ; + rev:text "preadult cacheting teenaged axonic baboos investigation reversibleness furrower observational energetically stalling slatier effulgent membranously ancientest enlisted imperially cardiectomy strawhat copepod maizes adamances flourishes mizzenmasts shaver hallucinated connects pluralism inextinguishables spectre rebroaden reenlightened ambients traduces eddies inkwell bushes rebury tripper anglophobe ridiculously oysterwoman roughhouses mugged cassocks splicer absurdities dashboards precleaned demobilizations diathermies trouts woodcocks mutually ionise roundness nome usurpatory inviolacy reembodied strangulation hoise retractors minted handspring dynode radiograph cootie gunshots nonexistence subagent predetermines defecating byroads balletomanes juxtapositions apprehensiveness sombrely hymnody foolhardiest eases blistered pertaining opulence velures swishier impersonalize sleeker loiteringly civicisms futurity obeys peasants qualification diebacks desperados exordia plummier dorm adulatory undistinguishing gemmological asps dominated rouletting flatways doings tampers achromatism reunifies heighth champed twelvemonth hadji centavo gastritis lunacies composting nonreaders onagers archaizes aggrandizements gonoph nonsuccessively imaginer reliques appetizer hypnoid resistibility prefixions oxygenic rte spermic lunk torpidity foraging remnants chanceries opiated muggiest fluffiest racialists"@de ; + bsbm:rating1 "6"^^xsd:integer ; + bsbm:rating3 "9"^^xsd:integer ; + bsbm:rating4 "9"^^xsd:integer ; + bsbm:reviewDate "2008-06-07T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-14"^^xsd:date . +dataFromRatingSite1:Review987 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product19 ; + rev:reviewer dataFromRatingSite1:Reviewer49 ; + dc:title "worries squinting repaired referrals pylori undelivered" ; + rev:text "cached definably firstling gunsels deathblow ripcord surrenders calibrator priestess disclaimant predatoriness mediational nonreligious slurped aligns savoury handedly quaffer moorier coping deviously pseudoscientific redox reaccredit quatorze peevish styes defensiveness jerkiness exothermal deviances extraction funding realizes bedquilt investigatable reprogrammed battener millponds screecher roguishness sere daftness figured oppositionist prussic brezhnev afterglows undesigning sinkage remade standardizing mobilizers pinned misgoverns reseats darters hollowed noumenal mastoids mudded darkled schoolbooks discontentments blanketing jacketing unsparingly improperness dependableness curtesy apery coruscations unwillingness saddlecloth dogbanes beekeeping ditchless emasculated personifier unemployability nuptials unfulfilled pillaging boiled corpulency detracting disparaging fireless zoospores downrange artistes meditated medicined fillips lingas rumours entraining burger vilely tinctures flatulency oxidizers allocator weatherglasses knucklier sunbathe cakiest seediest"@de ; + bsbm:rating1 "10"^^xsd:integer ; + bsbm:rating2 "6"^^xsd:integer ; + bsbm:rating4 "8"^^xsd:integer ; + bsbm:reviewDate "2008-03-10T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-19"^^xsd:date . +dataFromRatingSite1:Review988 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product68 ; + rev:reviewer dataFromRatingSite1:Reviewer49 ; + dc:title "unkindlier strangest bloused progressiveness merest parker unmoved accumulator anointer depleted" ; + rev:text "consents heathy handlooms spartans unreformed archaizing rewakened preyed denominational sidepiece roentgenologies tearer goatee voyeuristic gynecologies microgrammes gigues disgorging urologists ideologizing unheeding uninspiringly fastback skyjacker grudger familiars brevier distorting tarried rankles noncontraband persecutors sociocentrism slouches sashed areology marbler twats bogeys coalboxes cadences guides hairdressing lurers skeeter equivocators discotheques mycotoxin relational saloons bonita soundless bulbous yipped djinni siennas despondence instituter rehire luminescence toasters medicated academies ripsaws scratched holy embarked trellised rhizomatous coryzas delicates bobbies reinviting lotting harborers assessorship ridable jarsful translation semiprofessional unaided anticipating unbendable complying depersonalized seizable psalmist topkicks putons parleyed encina subclassified grotesqueness bearded inflammations semiagricultural volumetrically concubines wombier honan flossie oarlocks scents tokyoites inquietude unbosomed scouting bathing pettiest disfigured diviner fares cheerlessness docents simonized dragooning titled cuttles nonzebra sepulcher resettles eulogized hallah luaus florists dryness massing clamworm armrests sparely ledgeless burglarize highnesses ickier countertenor repents avg watermark leukemics liberally desex adorners burthen cheapness indemnificator tapestries colorably"@de ; + bsbm:rating1 "7"^^xsd:integer ; + bsbm:rating2 "1"^^xsd:integer ; + bsbm:rating4 "6"^^xsd:integer ; + bsbm:reviewDate "2007-11-28T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2007-12-07"^^xsd:date . +dataFromRatingSite1:Reviewer50 + rdf:type foaf:Person ; + foaf:name "Gonkuro-Usagi" ; + foaf:mbox_sha1sum "d9947134c39570b89b44504435244b86e73473e" ; + bsbm:country ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-08-09"^^xsd:date . +dataFromRatingSite1:Review989 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product91 ; + rev:reviewer dataFromRatingSite1:Reviewer50 ; + dc:title "quai certificates coyer enacting snowdrops humeral unionized miltiest turnings folding" ; + rev:text "unco taoism aeronauts giddied mechanization aberrants incliners falsifier noncancellable aphorizing dehumanized sickbay haziest deferrers bluebottle struggles lawless printouts ostracizing backbend tallboys ricksha skirters fulled enfiladed pedagogically spics bolstered nonethicalness platers tanneries metring shepherdess remarried toenailed miscopies endorsed liquefier quiddity delusionary interprets reinvigoration midmonth eliminates concerning beltway televisionary bumped congresses trameled inedited facings quatrefoils begetters dramatis jailbreaks bugaboos quadroons crustacean systemically cooperating untouchably proctoscopes deciares camelia unalloyed mammography prickling flasks moldboards numerousness xeric luxuriation uteruses jestings parchment slapjack crueler evanesced sorrows suboxides evacuated myrtles momently bolsters toques slackened costumer behavers fortifying raffler polymorphous featliest verbenas augustest mikado predominated questors sacroiliacs hikers informed stared italicized birthrate evidencing prole dismantlement spiffing subclassification wrathfulness canaanite consulter maharajah sizeably abjures blowpipes desex reduplication cookeys flames etheric themes ambulated skipped fettlings emergences shores unattractive ambuscades noncombustibles farmer"@en ; + bsbm:rating1 "7"^^xsd:integer ; + bsbm:rating4 "5"^^xsd:integer ; + bsbm:reviewDate "2008-02-05T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-04-18"^^xsd:date . +dataFromRatingSite1:Review990 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product73 ; + rev:reviewer dataFromRatingSite1:Reviewer50 ; + dc:title "mopeder creamily ruers tensive gaol undrape lumberjacks hilliest" ; + rev:text "emmet motleyest undersupply paragons scalloping scapegrace oviduct cosmonaut channels patness negligibly questionability wolfer metatheses tufty keyman disorganizers deskman offs barged necrophilic basses expropriations skiddooing yester outrunning geometers causality scornfully shamois beetled subbreeds franchisees predestination lynchers marmosets extirpator virginity kinesis depersonalized frillier singletons subthreshold pixie untouchably hairstyle driftpins desirability barbarousness mobilize motionless pepped submarginal incompetently garrulity unlawful materfamilias authorizers hoopless charmer filibustering tarantulas beeper beepers subcommittees sicced remilitarize hooraying wifedom insulars winterizing miniaturists lunation samisens koruna dongs yardarms orientates hypnotizes huzzahs purposelessly outcries bluecoats hutting badgering idealogue condiments eugenically rebuttably vestries completing tapers devotional perspicacity rebutters calked redelivered drays resentfully miniaturizing annunciation demerited deflagrated aesthesia greenstick prowled overinsure solubilized bosses freres dinting disaffiliated larders celling iguanas shelly offerer labors vestings foregone sickbay emulsifiable spoofing tonnes anguished effective crampon disconcerts disinfects shovels"@en ; + bsbm:rating1 "4"^^xsd:integer ; + bsbm:rating3 "4"^^xsd:integer ; + bsbm:reviewDate "2008-03-06T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-23"^^xsd:date . +dataFromRatingSite1:Review991 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product50 ; + rev:reviewer dataFromRatingSite1:Reviewer50 ; + dc:title "kamaaina purplish overpowers preregister poignancy jato ridding torsi pincher repriever relearns amending eloper gluer" ; + rev:text "bisexuality gleaming initialed buckeyes bowfins bushers voters molls oversouls whiteness dudishly individualities bowled flockiest jujuist deucedly lightheartedness gestates keepable abacuses tenpins marlinespikes diversification staminal luckily tutors reerect skulking fishline perfumers unavailing decelerator forbidals holing meteorism record derisively seizers subareas fringier appointive interpolating navigated vacationer pleasanter processions listens brokenhearted sulfurize buttoned mistrusted damndest disgustedly chromospheres brassicas unfavorable antisepsis bedlams parasitize pupils causes juggling maturations cunnings rediscount auroras arioso premised muddles tora renascences mountaineered propagator defers baldachin xanthic oscular refastening chanty ironsides blarneyed somatotypology flightiest tressed suboxides demeanors fizzled nuisances lexicographical clarkia requisitioned novelly colonize toddling handlings tailer porkier ceremoniousness brocket enjoying holdalls galaxies astatines brimmers boxed hags biased matchbooks pish belted imbrications tallies quitclaim clockings extortionist adversities uninhabited squirmed ambles gustless downer potentials coper carburize imputer recipients sleigher calcifies tearable truing urethras lakers potbellied latinizes vervains broader pud falconet secluded granges innerspring graphicness unmemorized approves"@en ; + bsbm:rating3 "5"^^xsd:integer ; + bsbm:reviewDate "2008-05-10T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-16"^^xsd:date . +dataFromRatingSite1:Review992 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product50 ; + rev:reviewer dataFromRatingSite1:Reviewer50 ; + dc:title "overheads overreaching universities reverberant prostituted battening clobbers nontypically bio beldams saprophytes dispositions buttocks ballyhooed" ; + rev:text "fruitfulness summarization geophytes autopilots jurywomen subalterns pyorrhea circuities mildly monopolistically assagai afrits truantry sunniest respites haywires kidnaps underscored cryotherapies dialectal hards histing sired vicars rewriters engaged buggered plasticity eschalots repackages shareowner startler barhopping halfpence ugsome frivolously integrally reforges limiteds ratings quarterings kerning postmarks pins wilted noncausally arduously needlers theodicy escarped pestilence biorhythmicities signifies vaguely dehydrogenating miasmic pentathlons stardust vanisher scaped snootiness frilled reconciling impulsion communistic darkener misreported hammed cully zoophyte dehumidifier cambered virility autoinfection"@en ; + bsbm:rating2 "10"^^xsd:integer ; + bsbm:rating3 "9"^^xsd:integer ; + bsbm:rating4 "4"^^xsd:integer ; + bsbm:reviewDate "2008-01-30T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-03-10"^^xsd:date . +dataFromRatingSite1:Review993 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product41 ; + rev:reviewer dataFromRatingSite1:Reviewer50 ; + dc:title "buddhists riping confessable antagonizes preadjustment coruscates transformer witchery economizer saltboxes dribbling moonshine notarize trameled apical" ; + rev:text "fibrils reprint wrathily documental prodigality restudy penang crossbeam theists loquaciously prefabricated instinctive hulas nonmaliciously magnetos vulgarism wanning recliner pistons movable smelters strapped unhinges reconnoiters stranger redevelopment robotizing brusquer scatter emends graver dints petulantly shoeing drachm unbelievers depravities menacers toughen gastropods millponds caviling tropins frittering irises barny nebraskans experimenters recirculations nonaddictive immixes anathemata elliptical elmiest retainer alizarine demoniacs spawners trave jeopardize maintop flabbiest canniness brindles rimmed charbroiling adverts djins lockjaws escalades embassadress webfeet widowed ecclesiasticalness parlors cithers laborites landscaper southed tunics fishwife arnica besieging"@en ; + bsbm:rating1 "5"^^xsd:integer ; + bsbm:rating2 "10"^^xsd:integer ; + bsbm:rating3 "2"^^xsd:integer ; + bsbm:rating4 "6"^^xsd:integer ; + bsbm:reviewDate "2008-03-16T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-24"^^xsd:date . +dataFromRatingSite1:Review994 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product23 ; + rev:reviewer dataFromRatingSite1:Reviewer50 ; + dc:title "noway segregationist pimped broadest ripest exonerating seismicity zizzling visards demythologizing retarded diatribes noncontiguously" ; + rev:text "gossips renegotiator abolisher asterism fanged khedives consenter profascists disparities manifolding semipro scrabbled preterit grudgingly delinquents abstractness tetanization towed bunchier fluffing pericardium cypriote cheesecloths chromaticity systematically oncogenic flitched interpolator conspirators ingrowing deletes components knuckles lenitive defatted amnesiac taciturnity objecting corncakes riffing propranolol sensationalist ichthyisms freakishly dishonest relating entanglers exhilarates heating majuscules piggier bogeyman preterminal licensees labs nunnish massively forecaster noninflammatory blucher mammalians chanters accounter inrushing fussier facades condensation elementals misproportions indolently paroler elasticizes unsighting erose tabasco fistulae lings tunney garbles conjugator neutralities lumping bronchopulmonary leveled capons tightropes sketchily endogenously congruity nonzero hights tracheae rescued homebred skateboard shipbuilders homogenizer cuspid inefficiencies pennilessness antielectrons perorations outwaits mudcapping rationalize nontoxic flighty bursas polypous foxier nativities tourneyed feminity enforcers myrmidons peerage valvelets protectiveness takeable septuagenarians wags disgusted celibate wicked gruelled confabulation byliner heptagon razzes multilingual banzai rezone nubility joshing sered nickels iodoform tracing cravings electromagnet prefaced hedgerow kedging purses creaked kithing fauns reweighed carts appetency reexport simplemindedly earthly estates regionally naiveties developments tawdriness grubbed folder sprites proletariate imprecisely dreamland dearer gnattier everlastingly boarish fibula retracts wandering compromisers accelerator servomotors tighteners flamethrower reechoed afterimpression pyorrhea chidden broomy ikebana walling anesthesiologists guyed czardases"@en ; + bsbm:rating1 "4"^^xsd:integer ; + bsbm:rating3 "7"^^xsd:integer ; + bsbm:rating4 "5"^^xsd:integer ; + bsbm:reviewDate "2007-09-18T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-03-16"^^xsd:date . +dataFromRatingSite1:Review995 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product60 ; + rev:reviewer dataFromRatingSite1:Reviewer50 ; + dc:title "getaways scrumptiously macrobiotics retailing pikestaff diag yearlies seige zoster slows" ; + rev:text "ponies migrants paled legitimizer bewigs bats unfits candescence leal shush tightrope gentlemanly twopenny telephoners gigaton exits peacing teetotums phonetics queerish stakeout transvestites galumphed expatiated reenlarge elaborations outputted antihypertensive mowed adepter regalement reglossing colourer anticapitalists valvelet positively ogive pudenda diethylamide sockets exportable nonliturgical preposterously hornswoggled hulked misogynists staphs wharfed deedbox abusively poppet reverses pesetas sentimentalizes scroungers bedwarf homey defat maced reevaluations hopelessness isometry"@en ; + bsbm:rating1 "2"^^xsd:integer ; + bsbm:rating2 "3"^^xsd:integer ; + bsbm:rating3 "9"^^xsd:integer ; + bsbm:reviewDate "2007-09-08T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-06-04"^^xsd:date . +dataFromRatingSite1:Review996 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product58 ; + rev:reviewer dataFromRatingSite1:Reviewer50 ; + dc:title "pipelining gemologist aliens silkscreening" ; + rev:text "administrates budders tapirs hematites dirtily phosphatic faugh mumbles proselyte witchier fracas refilm intones leeks retching suavely decidedly tinners yardbirds hedonics infuriatingly exertion inevitability hetaera cockup surefire strutted refractors calyxes attributively dissociative reemphasizing undersupply vulcanizer antidote provencal crayoned legislation relaxations waverer chelated dummkopfs teenager nearing creeds clogs kowtower nematodes echoic prickly incompensation cellarets permissively frankfurters objicient englobing ferrules denuded abscessing advertize pismires plottage sensibleness scrivenery"@en ; + bsbm:rating1 "10"^^xsd:integer ; + bsbm:rating2 "6"^^xsd:integer ; + bsbm:rating3 "5"^^xsd:integer ; + bsbm:rating4 "2"^^xsd:integer ; + bsbm:reviewDate "2008-02-06T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-03-05"^^xsd:date . +dataFromRatingSite1:Review997 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product62 ; + rev:reviewer dataFromRatingSite1:Reviewer50 ; + dc:title "clunks aborted damascene bypassed unmended battiness" ; + rev:text "globetrotters propagation mesmerize dieting kakemono shoreless eluviating tzuris tights gunnysacks bifurcations shews breviate biotics outsmarts towaways suavity risibles hemmer malamutes monopolism rousters thermocauteries figurings pigheadedness excitements chirked solidary pericarps menstruates sultans bespreads avoucher campaigned notchers parsec relocates nosh maize duplicator terminating defaming ceder erective lumberer snowslide galactoscope fusile threats inscrolls devastations plashiest awesomely antipacifists idyllist enlargements dispossessory geochemists twiddles matters ryes masonries bencher honeworts interlace pentothal straitly sophistication ovines ceased validatory heinies credentialed scandalizes brainily enthusing dimorph soundings marketing perpetuating glimmering intersecting esquiring lathworks saloons publicity carolinas frostiness perceived budgeting blowbys disbowel fraggings chansons feministic guava rumouring regears encouraged congruencies congruencies destrier dieting acromegaly fastness cannoning yowed exotism featherbedded sidesteps lacunary weaved elasticize bacchanalia preregisters shivering silicoses reared antivenins summarized overalls coitally assures parasitical koruny declasse lamasery melodeon leveling wirily prevalence whipper harries seignories"@en ; + bsbm:rating2 "7"^^xsd:integer ; + bsbm:rating3 "4"^^xsd:integer ; + bsbm:rating4 "7"^^xsd:integer ; + bsbm:reviewDate "2008-03-16T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-24"^^xsd:date . +dataFromRatingSite1:Review998 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer1:Product26 ; + rev:reviewer dataFromRatingSite1:Reviewer50 ; + dc:title "rollover unfurling ouches fellowly unsubstantially potentiometric mainframe plebeians annatto visaed" ; + rev:text "escargot massiness sculling convokes fumes recover alpenhorns vizarded ached stinting paternities coatings focusses broaching saloons tovariches avows mensing reboot clover twaddlers unacclimatized precontrive harmonizations mucous smuts turtledoves coyest singing mustiest squooshes chandleries shaftings nutritionally bitts elasticizing peen subagent preconstructing litterer fluorines nominative hider positivest snoopers camelia denigrating disasters nonintoxicant fluctuates nitrators hoggers kowtows egyptians belgians pinfeathers thuddingly vivification bagginess thwarters intellectualize odds bellyaching sacramental lexicographical confounded visuals befriends ceremonialism endowments tentacular quadruplicated cookeys whetting alerted clamminess vervains sleepily benignly amenable rummier marinades decisively armenians lingoes biocycles ochred glaciered ceding tomcats envenoming greaved writings imposter animadversions undisturbed festivals cadger frescoists creamiest saprophagous institutionalism miltiest untrained chastening panfuls ferrying elevates bondwoman micronesians stifling commuted whooplas amasses towpaths bordures tussocky briner paddled poxed nonhero barrio snuggeries chickened charging impellors grandioseness affiancing patronized pentathlons misaim undaunted dishrag lumberyard rheniums imperiously dupable probes grizzled figuring idolizing outcries mantras overexcited timesaver flyweight cathects onomatopoieses sacramentally bodybuilders concentrations sulkiness gravidness wyes outstrips rive murderers burgs overcools snippier burin botanizing bund firedamp biomicroscopies overcompensation snicking beadles nontropical agouties videocassette gonif stiffened excitability watercresses stages lepton demagnetize unheated collaterals mechanotheraputic flyweight registerable"@en ; + bsbm:reviewDate "2008-04-04T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-13"^^xsd:date . +dataFromRatingSite1:Review999 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product64 ; + rev:reviewer dataFromRatingSite1:Reviewer50 ; + dc:title "slenderize bushwack abased mirroring rufflike medieval" ; + rev:text "cockscombs kowtowing railing skiddooed nondiplomatic skeets certainly pajamaed ruddiest interment seasides wolfed prepossess soapiness diffracted unionized kicked minded frenzies malawians shedding decimalization knishes convicts brisket distributed ginned sucroses diversifying badinaged mensches expansions teamsters syncope daringly tm opacities maestosos flappier sermonizes smiling extracts piggin bioactivity pillowed sugarplums prefigured nonspecialized slavey resolved dealing jackknifed saucing lamentable acrobatically fistulas tardiest tauts frizzlier whomped sympathies thumbnails metaphysical router forewings larkier vituperative inconstantly whispery adventurously handgrip subdirector wistfulness draftier indoctrinated footmark headed shanteys discounter diagnostically pinked latterly infantries loosely foofaraw estragons pols aggravates fusions frivoling commencement goon idled whiteouts illuminators inditing kinks discriminations twitcher argils stopples foggiest portmanteaux huns overstuff unfought injures bisulfide sings unaccentuated bothering preachiest mucuses polluters pyloric plummiest"@en ; + bsbm:rating2 "5"^^xsd:integer ; + bsbm:rating3 "2"^^xsd:integer ; + bsbm:rating4 "2"^^xsd:integer ; + bsbm:reviewDate "2007-12-24T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-02-21"^^xsd:date . +dataFromRatingSite1:Review1000 + rdf:type bsbm:Review ; + bsbm:reviewFor dataFromProducer2:Product92 ; + rev:reviewer dataFromRatingSite1:Reviewer50 ; + dc:title "weirdest variousness defenses decompensated miniskirts scopes discriminating setting renamed budgie" ; + rev:text "impugners floater slanders tenaciously tikes metatarsally waxings heeders abnegations vapors holiest gustatory reforestation butterfishes hydrologic polymath microbiotic revises pollinating noncombustibles heliotropically incept fishhook hungrily beacons reproduced pinyons coordinating ringlets nudnick logicized linking cosponsorships draggier organdie amplifiers unbudgeted catafalques physiognomically publicist rem cutlasses encircling accessors tatar krises towaway deflagrates bluesman pilotless bacteriological decryptions groovier legalizations fidelis hoorays snickeringly repressively civilly arizonians spews flammed burdocks counterclaiming sweller outposts debtless musculation unfaded limning unspecified walkaway crushing outsize inflections relapser honours troglodytes toasts elfish narcissistically fastidiously gimpiest ramped desynchronizing stalactites equestriennes indorsement louses crows malawians adulterously chauffeurs contriteness subjugated"@en ; + bsbm:rating1 "8"^^xsd:integer ; + bsbm:rating3 "8"^^xsd:integer ; + bsbm:rating4 "7"^^xsd:integer ; + bsbm:reviewDate "2008-05-12T00:00:00"^^xsd:dateTime ; + dc:publisher dataFromRatingSite1:RatingSite1 ; + dc:date "2008-05-30"^^xsd:date . diff --git a/core/sail/federation/pom.xml b/core/sail/federation/pom.xml index 173f799e2af..24951ab1f02 100644 --- a/core/sail/federation/pom.xml +++ b/core/sail/federation/pom.xml @@ -4,7 +4,7 @@ org.eclipse.rdf4j rdf4j-sail - 3.1.5-SNAPSHOT + 3.2.2-SNAPSHOT rdf4j-sail-federation RDF4J: Federation SAIL diff --git a/core/sail/federation/src/main/java/org/eclipse/rdf4j/runtime/RepositoryManagerFederator.java b/core/sail/federation/src/main/java/org/eclipse/rdf4j/runtime/RepositoryManagerFederator.java index f3f1e3ca9cb..c045c3158f3 100644 --- a/core/sail/federation/src/main/java/org/eclipse/rdf4j/runtime/RepositoryManagerFederator.java +++ b/core/sail/federation/src/main/java/org/eclipse/rdf4j/runtime/RepositoryManagerFederator.java @@ -43,7 +43,7 @@ /** * Utility class for handling the details of federating "user repositories" managed by a * {@link org.eclipse.rdf4j.repository.manager.RepositoryManager}. - * + * * @author Dale Visser * @deprecated since 3.1.0. This module will be replaced by the new FedX federation module. */ @@ -59,7 +59,7 @@ public class RepositoryManagerFederator { /** * Create an instance capable of federating "user repositories" within the given * {@link org.eclipse.rdf4j.repository.manager.RepositoryManager}. - * + * * @param manager must manage the repositories to be added to new federations, and becomes the manager of any * created federations */ @@ -72,7 +72,7 @@ public RepositoryManagerFederator(RepositoryManager manager) { * Adds a new repository to the {@link org.eclipse.rdf4j.repository.manager.RepositoryManager}, which is a * federation of the given repository id's, which must also refer to repositories already managed by the * {@link org.eclipse.rdf4j.repository.manager.RepositoryManager}. - * + * * @param fedID the desired identifier for the new federation repository * @param description the desired description for the new federation repository * @param members the identifiers of the repositories to federate, which must already exist and be managed by diff --git a/core/sail/federation/src/main/java/org/eclipse/rdf4j/sail/federation/AbstractEchoWriteConnection.java b/core/sail/federation/src/main/java/org/eclipse/rdf4j/sail/federation/AbstractEchoWriteConnection.java index d80944a52ee..3cb18b80b0d 100644 --- a/core/sail/federation/src/main/java/org/eclipse/rdf4j/sail/federation/AbstractEchoWriteConnection.java +++ b/core/sail/federation/src/main/java/org/eclipse/rdf4j/sail/federation/AbstractEchoWriteConnection.java @@ -13,12 +13,11 @@ import org.eclipse.rdf4j.model.Resource; import org.eclipse.rdf4j.model.Value; import org.eclipse.rdf4j.repository.RepositoryConnection; -import org.eclipse.rdf4j.repository.RepositoryException; import org.eclipse.rdf4j.sail.SailException; /** * Echos all write operations to all members. - * + * * @author James Leigh */ abstract class AbstractEchoWriteConnection extends AbstractFederationConnection { diff --git a/core/sail/federation/src/main/java/org/eclipse/rdf4j/sail/federation/AbstractFederationConnection.java b/core/sail/federation/src/main/java/org/eclipse/rdf4j/sail/federation/AbstractFederationConnection.java index 40dc3594b3a..983392e6545 100644 --- a/core/sail/federation/src/main/java/org/eclipse/rdf4j/sail/federation/AbstractFederationConnection.java +++ b/core/sail/federation/src/main/java/org/eclipse/rdf4j/sail/federation/AbstractFederationConnection.java @@ -48,6 +48,7 @@ import org.eclipse.rdf4j.query.algebra.evaluation.impl.ConstantOptimizer; import org.eclipse.rdf4j.query.algebra.evaluation.impl.DisjunctiveConstraintOptimizer; import org.eclipse.rdf4j.query.algebra.evaluation.impl.SameTermFilterOptimizer; +import org.eclipse.rdf4j.query.explanation.Explanation; import org.eclipse.rdf4j.query.impl.EmptyBindingSet; import org.eclipse.rdf4j.repository.Repository; import org.eclipse.rdf4j.repository.RepositoryConnection; @@ -72,7 +73,7 @@ /** * Unions the results from multiple {@link RepositoryConnection} into one {@link SailConnection}. - * + * * @author James Leigh * @author Arjohn Kampman */ @@ -134,10 +135,7 @@ public IsolationLevel getDefaultIsolationLevel() { valueFactory = SimpleValueFactory.getInstance(); - this.members = new ArrayList<>(members.size()); - for (RepositoryConnection member : members) { - this.members.add(member); - } + this.members = new ArrayList<>(members); } public ValueFactory getValueFactory() { @@ -159,8 +157,9 @@ public CloseableIteration getContextIDsIntern } public FederatedServiceResolver getFederatedServiceResolver() { - if (federatedServiceResolver == null) + if (federatedServiceResolver == null) { return federation.getFederatedServiceResolver(); + } return federatedServiceResolver; } @@ -486,4 +485,10 @@ private void closeAll(Iterable args) { /** * Gets the arguments of this n-ary operator. - * + * * @return A copy of the current argument list. */ public List getArgs() { @@ -70,7 +70,7 @@ public List getArgs() { /** * Gets the number of arguments of this n-ary operator. - * + * * @return The number of arguments. */ public int getNumberOfArguments() { @@ -79,7 +79,7 @@ public int getNumberOfArguments() { /** * Gets the idx-th argument of this n-ary operator. - * + * * @return The operator's arguments. */ public Expr getArg(final int idx) { diff --git a/core/sail/federation/src/main/java/org/eclipse/rdf4j/sail/federation/algebra/OwnedTupleExpr.java b/core/sail/federation/src/main/java/org/eclipse/rdf4j/sail/federation/algebra/OwnedTupleExpr.java index a12b34c78a6..3f49cf8fe16 100644 --- a/core/sail/federation/src/main/java/org/eclipse/rdf4j/sail/federation/algebra/OwnedTupleExpr.java +++ b/core/sail/federation/src/main/java/org/eclipse/rdf4j/sail/federation/algebra/OwnedTupleExpr.java @@ -27,7 +27,7 @@ /** * Indicates that the argument should be evaluated in a particular member. - * + * * @author James Leigh */ public class OwnedTupleExpr extends UnaryTupleOperator { diff --git a/core/sail/federation/src/main/java/org/eclipse/rdf4j/sail/federation/algebra/package-info.java b/core/sail/federation/src/main/java/org/eclipse/rdf4j/sail/federation/algebra/package-info.java index 8c203778eaa..7d296897f30 100644 --- a/core/sail/federation/src/main/java/org/eclipse/rdf4j/sail/federation/algebra/package-info.java +++ b/core/sail/federation/src/main/java/org/eclipse/rdf4j/sail/federation/algebra/package-info.java @@ -1,8 +1,8 @@ @Deprecated /** * Algebra operators for the federation sail - * + * * @deprecated since 3.1.0. This module will be replaced by the new FedX federation module. - * + * */ -package org.eclipse.rdf4j.sail.federation.algebra; \ No newline at end of file +package org.eclipse.rdf4j.sail.federation.algebra; diff --git a/core/sail/federation/src/main/java/org/eclipse/rdf4j/sail/federation/config/FederationConfig.java b/core/sail/federation/src/main/java/org/eclipse/rdf4j/sail/federation/config/FederationConfig.java index 78efb3d89b0..0fcaa59cc6b 100644 --- a/core/sail/federation/src/main/java/org/eclipse/rdf4j/sail/federation/config/FederationConfig.java +++ b/core/sail/federation/src/main/java/org/eclipse/rdf4j/sail/federation/config/FederationConfig.java @@ -32,7 +32,7 @@ /** * Lists the members of a federation and which properties describe a resource subject in a unique member. - * + * * @author James Leigh * @deprecated since 3.1.0. This module will be replaced by the new FedX federation module. */ @@ -138,11 +138,11 @@ public void parse(Model graph, Resource implNode) throws SailConfigException { addLocalPropertySpace(space.stringValue()); } try { - Optional bool = Models.objectLiteral(model.filter(implNode, DISTINCT, null)); + Optional bool = Models.objectLiteral(model.getStatements(implNode, DISTINCT, null)); if (bool.isPresent() && bool.get().booleanValue()) { distinct = true; } - bool = Models.objectLiteral(model.filter(implNode, READ_ONLY, null)); + bool = Models.objectLiteral(model.getStatements(implNode, READ_ONLY, null)); if (bool.isPresent() && bool.get().booleanValue()) { readOnly = true; } diff --git a/core/sail/federation/src/main/java/org/eclipse/rdf4j/sail/federation/config/FederationFactory.java b/core/sail/federation/src/main/java/org/eclipse/rdf4j/sail/federation/config/FederationFactory.java index cf6a2573e67..16f669dc6c2 100644 --- a/core/sail/federation/src/main/java/org/eclipse/rdf4j/sail/federation/config/FederationFactory.java +++ b/core/sail/federation/src/main/java/org/eclipse/rdf4j/sail/federation/config/FederationFactory.java @@ -19,7 +19,7 @@ /** * Creates a federation based on its configuration. - * + * * @see FederationConfig * @author James Leigh * @deprecated since 3.1.0. This module will be replaced by the new FedX federation module. @@ -29,7 +29,7 @@ public class FederationFactory implements SailFactory { /** * The type of repositories that are created by this factory. - * + * * @see SailFactory#getSailType() */ public static final String SAIL_TYPE = "openrdf:Federation"; diff --git a/core/sail/federation/src/main/java/org/eclipse/rdf4j/sail/federation/config/package-info.java b/core/sail/federation/src/main/java/org/eclipse/rdf4j/sail/federation/config/package-info.java index 0aeb5f1cd09..07ba7c8a22c 100644 --- a/core/sail/federation/src/main/java/org/eclipse/rdf4j/sail/federation/config/package-info.java +++ b/core/sail/federation/src/main/java/org/eclipse/rdf4j/sail/federation/config/package-info.java @@ -1,8 +1,8 @@ @Deprecated /** * Config for the federation sail - * + * * @deprecated since 3.1.0. This module will be replaced by the new FedX federation module. - * + * */ -package org.eclipse.rdf4j.sail.federation.config; \ No newline at end of file +package org.eclipse.rdf4j.sail.federation.config; diff --git a/core/sail/federation/src/main/java/org/eclipse/rdf4j/sail/federation/evaluation/AlternativeCursor.java b/core/sail/federation/src/main/java/org/eclipse/rdf4j/sail/federation/evaluation/AlternativeCursor.java index 73f5a8fb604..96214c73c38 100644 --- a/core/sail/federation/src/main/java/org/eclipse/rdf4j/sail/federation/evaluation/AlternativeCursor.java +++ b/core/sail/federation/src/main/java/org/eclipse/rdf4j/sail/federation/evaluation/AlternativeCursor.java @@ -13,7 +13,7 @@ /** * If the primary cursor is empty, use the alternative cursor. - * + * * @author James Leigh */ public class AlternativeCursor extends LookAheadIteration { diff --git a/core/sail/federation/src/main/java/org/eclipse/rdf4j/sail/federation/evaluation/FederationStrategy.java b/core/sail/federation/src/main/java/org/eclipse/rdf4j/sail/federation/evaluation/FederationStrategy.java index 13809d56711..ff4be5b5e8b 100644 --- a/core/sail/federation/src/main/java/org/eclipse/rdf4j/sail/federation/evaluation/FederationStrategy.java +++ b/core/sail/federation/src/main/java/org/eclipse/rdf4j/sail/federation/evaluation/FederationStrategy.java @@ -32,7 +32,7 @@ /** * Evaluates Join, LeftJoin and Union in parallel and only evaluate if {@link OwnedTupleExpr} is the given member. - * + * * @see ParallelJoinCursor * @see ParallelLeftJoinCursor * @author James Leigh diff --git a/core/sail/federation/src/main/java/org/eclipse/rdf4j/sail/federation/evaluation/FilterCursor.java b/core/sail/federation/src/main/java/org/eclipse/rdf4j/sail/federation/evaluation/FilterCursor.java index a5467850ab1..b99c78d8016 100644 --- a/core/sail/federation/src/main/java/org/eclipse/rdf4j/sail/federation/evaluation/FilterCursor.java +++ b/core/sail/federation/src/main/java/org/eclipse/rdf4j/sail/federation/evaluation/FilterCursor.java @@ -20,7 +20,7 @@ /** * Provides a convenient constructor for {@link FilterIterator} using the condition. - * + * * @author James Leigh */ public class FilterCursor extends FilterIterator { diff --git a/core/sail/federation/src/main/java/org/eclipse/rdf4j/sail/federation/evaluation/InsertBindingSetCursor.java b/core/sail/federation/src/main/java/org/eclipse/rdf4j/sail/federation/evaluation/InsertBindingSetCursor.java index dad6f9c87f7..548564c9da7 100644 --- a/core/sail/federation/src/main/java/org/eclipse/rdf4j/sail/federation/evaluation/InsertBindingSetCursor.java +++ b/core/sail/federation/src/main/java/org/eclipse/rdf4j/sail/federation/evaluation/InsertBindingSetCursor.java @@ -16,7 +16,7 @@ /** * Adds more bindings to each of the results. - * + * * @author James Leigh */ public class InsertBindingSetCursor extends IterationWrapper { diff --git a/core/sail/federation/src/main/java/org/eclipse/rdf4j/sail/federation/evaluation/QueueCursor.java b/core/sail/federation/src/main/java/org/eclipse/rdf4j/sail/federation/evaluation/QueueCursor.java index afd8130a2e6..c2e35b4c4a4 100644 --- a/core/sail/federation/src/main/java/org/eclipse/rdf4j/sail/federation/evaluation/QueueCursor.java +++ b/core/sail/federation/src/main/java/org/eclipse/rdf4j/sail/federation/evaluation/QueueCursor.java @@ -10,7 +10,7 @@ /** * Makes working with a queue easier by adding the methods {@link #done()} and {@link #toss(Exception)} and * automatically converting the exception into a QueryEvaluationException with an appropriate stack trace. - * + * * @author James Leigh * @deprecated Use {@link org.eclipse.rdf4j.query.impl.QueueCursor} instead */ @@ -19,7 +19,7 @@ public class QueueCursor extends org.eclipse.rdf4j.http.client.QueueCursor /** * Creates an QueueCursor with the given (fixed) capacity and default access policy. - * + * * @param capacity the capacity of this queue */ public QueueCursor(int capacity) { @@ -28,7 +28,7 @@ public QueueCursor(int capacity) { /** * Creates an QueueCursor with the given (fixed) capacity and the specified access policy. - * + * * @param capacity the capacity of this queue * @param fair if true then queue accesses for threads blocked on insertion or removal, are processed * in FIFO order; if false the access order is unspecified. diff --git a/core/sail/federation/src/main/java/org/eclipse/rdf4j/sail/federation/evaluation/RepositoryTripleSource.java b/core/sail/federation/src/main/java/org/eclipse/rdf4j/sail/federation/evaluation/RepositoryTripleSource.java index 75dc51fa572..40e825d22bb 100644 --- a/core/sail/federation/src/main/java/org/eclipse/rdf4j/sail/federation/evaluation/RepositoryTripleSource.java +++ b/core/sail/federation/src/main/java/org/eclipse/rdf4j/sail/federation/evaluation/RepositoryTripleSource.java @@ -11,7 +11,7 @@ /** * Allow a single repository member to control a EvaulationStrategy. - * + * * @author James Leigh */ @Deprecated diff --git a/core/sail/federation/src/main/java/org/eclipse/rdf4j/sail/federation/evaluation/package-info.java b/core/sail/federation/src/main/java/org/eclipse/rdf4j/sail/federation/evaluation/package-info.java index c5a7ef18bb5..ba48478ea76 100644 --- a/core/sail/federation/src/main/java/org/eclipse/rdf4j/sail/federation/evaluation/package-info.java +++ b/core/sail/federation/src/main/java/org/eclipse/rdf4j/sail/federation/evaluation/package-info.java @@ -1,8 +1,8 @@ @Deprecated /** * Query evaluation functionality for the Federation Sail. - * + * * @deprecated since 3.1.0. This module will be replaced by the new FedX federation module. - * + * */ -package org.eclipse.rdf4j.sail.federation.evaluation; \ No newline at end of file +package org.eclipse.rdf4j.sail.federation.evaluation; diff --git a/core/sail/federation/src/main/java/org/eclipse/rdf4j/sail/federation/optimizers/EmptyPatternOptimizer.java b/core/sail/federation/src/main/java/org/eclipse/rdf4j/sail/federation/optimizers/EmptyPatternOptimizer.java index d480fa6f3c6..e14e2f42fc9 100644 --- a/core/sail/federation/src/main/java/org/eclipse/rdf4j/sail/federation/optimizers/EmptyPatternOptimizer.java +++ b/core/sail/federation/src/main/java/org/eclipse/rdf4j/sail/federation/optimizers/EmptyPatternOptimizer.java @@ -32,7 +32,7 @@ /** * Remove StatementPatterns that have no statements. - * + * * @author James Leigh */ public class EmptyPatternOptimizer extends AbstractQueryModelVisitor implements QueryOptimizer { diff --git a/core/sail/federation/src/main/java/org/eclipse/rdf4j/sail/federation/optimizers/EvaluationStatistics.java b/core/sail/federation/src/main/java/org/eclipse/rdf4j/sail/federation/optimizers/EvaluationStatistics.java index 36ee9592b73..83a01525e65 100644 --- a/core/sail/federation/src/main/java/org/eclipse/rdf4j/sail/federation/optimizers/EvaluationStatistics.java +++ b/core/sail/federation/src/main/java/org/eclipse/rdf4j/sail/federation/optimizers/EvaluationStatistics.java @@ -7,9 +7,7 @@ *******************************************************************************/ package org.eclipse.rdf4j.sail.federation.optimizers; -import java.util.ArrayList; import java.util.HashSet; -import java.util.List; import java.util.Set; import org.eclipse.rdf4j.query.algebra.BinaryTupleOperator; @@ -27,7 +25,7 @@ /** * Supplies various query model statistics to the query engine/optimizer. - * + * * @author Arjohn Kampman * @author James Leigh */ diff --git a/core/sail/federation/src/main/java/org/eclipse/rdf4j/sail/federation/optimizers/FederationJoinOptimizer.java b/core/sail/federation/src/main/java/org/eclipse/rdf4j/sail/federation/optimizers/FederationJoinOptimizer.java index 3a171bbbc9c..e0fb36d5e0e 100644 --- a/core/sail/federation/src/main/java/org/eclipse/rdf4j/sail/federation/optimizers/FederationJoinOptimizer.java +++ b/core/sail/federation/src/main/java/org/eclipse/rdf4j/sail/federation/optimizers/FederationJoinOptimizer.java @@ -49,9 +49,9 @@ /** * Search for Join, LeftJoin, and Union arguments that can be evaluated in a single member. - * + * * @author James Leigh - * + * * @deprecated since 3.1.0. This module will be replaced by the new FedX federation module. */ @Deprecated diff --git a/core/sail/federation/src/main/java/org/eclipse/rdf4j/sail/federation/optimizers/OwnedTupleExprPruner.java b/core/sail/federation/src/main/java/org/eclipse/rdf4j/sail/federation/optimizers/OwnedTupleExprPruner.java index 04ef50421f2..243030af11e 100644 --- a/core/sail/federation/src/main/java/org/eclipse/rdf4j/sail/federation/optimizers/OwnedTupleExprPruner.java +++ b/core/sail/federation/src/main/java/org/eclipse/rdf4j/sail/federation/optimizers/OwnedTupleExprPruner.java @@ -17,7 +17,7 @@ /** * Remove redundant {@link OwnedTupleExpr}. - * + * * @author James Leigh */ public class OwnedTupleExprPruner extends AbstractQueryModelVisitor implements QueryOptimizer { diff --git a/core/sail/federation/src/main/java/org/eclipse/rdf4j/sail/federation/optimizers/PrepareOwnedTupleExpr.java b/core/sail/federation/src/main/java/org/eclipse/rdf4j/sail/federation/optimizers/PrepareOwnedTupleExpr.java index 67e6ed7c02d..2ca6ea57647 100644 --- a/core/sail/federation/src/main/java/org/eclipse/rdf4j/sail/federation/optimizers/PrepareOwnedTupleExpr.java +++ b/core/sail/federation/src/main/java/org/eclipse/rdf4j/sail/federation/optimizers/PrepareOwnedTupleExpr.java @@ -43,7 +43,7 @@ /** * Remove redundant {@link OwnedTupleExpr}. - * + * * @author James Leigh */ public class PrepareOwnedTupleExpr extends AbstractQueryModelVisitor implements QueryOptimizer { @@ -260,11 +260,11 @@ public void meetMultiJoin(NaryJoin node) throws RepositoryException { // no owner builder = null; // NOPMD } else if (builder != null) { - if (TupleExprs.isGraphPatternGroup(arg)) { + if (TupleExprs.isVariableScopeChange(arg)) { builder.append("{"); } builder.append(pattern); - if (TupleExprs.isGraphPatternGroup(arg)) { + if (TupleExprs.isVariableScopeChange(arg)) { builder.append("}"); } builder.append("\n"); @@ -288,11 +288,11 @@ public void meet(Join node) throws RepositoryException { leftArg.visit(this); if (patternNode != null) { - if (TupleExprs.isGraphPatternGroup(leftArg)) { + if (TupleExprs.isVariableScopeChange(leftArg)) { builder.append("{"); } builder.append(pattern); - if (TupleExprs.isGraphPatternGroup(leftArg)) { + if (TupleExprs.isVariableScopeChange(leftArg)) { builder.append("}"); } builder.append("\n"); @@ -300,11 +300,11 @@ public void meet(Join node) throws RepositoryException { vars.putAll(variables); rightArg.visit(this); if (patternNode != null) { - if (TupleExprs.isGraphPatternGroup(rightArg)) { + if (TupleExprs.isVariableScopeChange(rightArg)) { builder.append("{"); } builder.append(pattern); - if (TupleExprs.isGraphPatternGroup(rightArg)) { + if (TupleExprs.isVariableScopeChange(rightArg)) { builder.append("}"); } builder.append("\n"); diff --git a/core/sail/federation/src/main/java/org/eclipse/rdf4j/sail/federation/optimizers/QueryModelPruner.java b/core/sail/federation/src/main/java/org/eclipse/rdf4j/sail/federation/optimizers/QueryModelPruner.java index 0d8ca0d0d22..83102d44d98 100644 --- a/core/sail/federation/src/main/java/org/eclipse/rdf4j/sail/federation/optimizers/QueryModelPruner.java +++ b/core/sail/federation/src/main/java/org/eclipse/rdf4j/sail/federation/optimizers/QueryModelPruner.java @@ -29,7 +29,7 @@ /** * A query optimizer that prunes query model trees by removing superfluous parts and/or by reducing complex parts with * simpler parts. - * + * * @author Arjohn Kampman */ public class QueryModelPruner implements QueryOptimizer { @@ -151,4 +151,4 @@ public void meet(Intersection intersection) { } } } -} \ No newline at end of file +} diff --git a/core/sail/federation/src/main/java/org/eclipse/rdf4j/sail/federation/optimizers/QueryMultiJoinOptimizer.java b/core/sail/federation/src/main/java/org/eclipse/rdf4j/sail/federation/optimizers/QueryMultiJoinOptimizer.java index b9b87c80f25..1a6b2d38e11 100644 --- a/core/sail/federation/src/main/java/org/eclipse/rdf4j/sail/federation/optimizers/QueryMultiJoinOptimizer.java +++ b/core/sail/federation/src/main/java/org/eclipse/rdf4j/sail/federation/optimizers/QueryMultiJoinOptimizer.java @@ -29,7 +29,7 @@ /** * A query optimizer that re-orders nested Joins. - * + * * @author Arjohn Kampman * @author James Leigh */ @@ -47,7 +47,7 @@ public QueryMultiJoinOptimizer(EvaluationStatistics statistics) { /** * Applies generally applicable optimizations: path expressions are sorted from more to less specific. - * + * * @throws StoreException */ @Override @@ -177,16 +177,16 @@ protected > M getVarFreqMap(List varList, M var */ protected TupleExpr selectNextTupleExpr(List expressions, Map cardinalityMap, Map> varsMap, Map varFreqMap, Set boundVars) { - double lowestCardinality = Double.MAX_VALUE; + double lowestCost = Double.MAX_VALUE; TupleExpr result = null; for (TupleExpr tupleExpr : expressions) { // Calculate a score for this tuple expression - double cardinality = getTupleExprCardinality(tupleExpr, cardinalityMap, varsMap, varFreqMap, boundVars); + double cost = getTupleExprCost(tupleExpr, cardinalityMap, varsMap, varFreqMap, boundVars); - if (cardinality < lowestCardinality) { + if (cost < lowestCost) { // More specific path expression found - lowestCardinality = cardinality; + lowestCost = cost; result = tupleExpr; } } @@ -194,9 +194,9 @@ protected TupleExpr selectNextTupleExpr(List expressions, Map cardinalityMap, + protected double getTupleExprCost(TupleExpr tupleExpr, Map cardinalityMap, Map> varsMap, Map varFreqMap, Set boundVars) { - double cardinality = cardinalityMap.get(tupleExpr); + double cost = cardinalityMap.get(tupleExpr); List vars = varsMap.get(tupleExpr); @@ -206,19 +206,19 @@ protected double getTupleExprCardinality(TupleExpr tupleExpr, Map 0) { double exp = (double) unboundVars.size() / nonConstantCount; - cardinality = Math.pow(cardinality, exp); + cost = Math.pow(cost, exp); } if (unboundVars.isEmpty()) { // Prefer patterns with more bound vars if (nonConstantCount > 0) { - cardinality /= nonConstantCount; + cost /= nonConstantCount; } } else { // Prefer patterns that bind variables from other tuple expressions int foreignVarFreq = getForeignVarFreq(unboundVars, varFreqMap); if (foreignVarFreq > 0) { - cardinality /= foreignVarFreq; + cost /= foreignVarFreq; } } @@ -229,7 +229,7 @@ protected double getTupleExprCardinality(TupleExpr tupleExpr, Map getConstantVars(Iterable vars) { diff --git a/core/sail/federation/src/main/java/org/eclipse/rdf4j/sail/federation/optimizers/package-info.java b/core/sail/federation/src/main/java/org/eclipse/rdf4j/sail/federation/optimizers/package-info.java index 7ed22e7f7d9..bdde012b7ad 100644 --- a/core/sail/federation/src/main/java/org/eclipse/rdf4j/sail/federation/optimizers/package-info.java +++ b/core/sail/federation/src/main/java/org/eclipse/rdf4j/sail/federation/optimizers/package-info.java @@ -1,8 +1,8 @@ @Deprecated /** * Optimizers for the federation sail - * + * * @deprecated since 3.1.0. This module will be replaced by the new FedX federation module. - * + * */ -package org.eclipse.rdf4j.sail.federation.optimizers; \ No newline at end of file +package org.eclipse.rdf4j.sail.federation.optimizers; diff --git a/core/sail/federation/src/main/java/org/eclipse/rdf4j/sail/federation/package-info.java b/core/sail/federation/src/main/java/org/eclipse/rdf4j/sail/federation/package-info.java index edb2c2cd9c9..e4045d869b9 100644 --- a/core/sail/federation/src/main/java/org/eclipse/rdf4j/sail/federation/package-info.java +++ b/core/sail/federation/src/main/java/org/eclipse/rdf4j/sail/federation/package-info.java @@ -1,8 +1,8 @@ @Deprecated /** * A Sail implementation for federated access to multiple databases. - * + * * @deprecated since 3.1.0. This module will be replaced by the new FedX federation module. - * + * */ -package org.eclipse.rdf4j.sail.federation; \ No newline at end of file +package org.eclipse.rdf4j.sail.federation; diff --git a/core/sail/inferencer/pom.xml b/core/sail/inferencer/pom.xml index c422c720110..17066a6f266 100644 --- a/core/sail/inferencer/pom.xml +++ b/core/sail/inferencer/pom.xml @@ -4,7 +4,7 @@ org.eclipse.rdf4j rdf4j-sail - 3.1.5-SNAPSHOT + 3.2.2-SNAPSHOT rdf4j-sail-inferencer RDF4J: Inferencer Sails diff --git a/core/sail/inferencer/src/main/java/org/eclipse/rdf4j/sail/inferencer/fc/AbstractForwardChainingInferencerConnection.java b/core/sail/inferencer/src/main/java/org/eclipse/rdf4j/sail/inferencer/fc/AbstractForwardChainingInferencerConnection.java index 9ac31b9929a..3b7e336e182 100644 --- a/core/sail/inferencer/src/main/java/org/eclipse/rdf4j/sail/inferencer/fc/AbstractForwardChainingInferencerConnection.java +++ b/core/sail/inferencer/src/main/java/org/eclipse/rdf4j/sail/inferencer/fc/AbstractForwardChainingInferencerConnection.java @@ -25,14 +25,14 @@ public abstract class AbstractForwardChainingInferencerConnection extends Infere implements SailConnectionListener { /*-----------* - * Constants * - *-----------*/ + * Constants * + *-----------*/ static private final Logger logger = LoggerFactory.getLogger(AbstractForwardChainingInferencerConnection.class); /*-----------* - * Variables * - *-----------*/ + * Variables * + *-----------*/ private Sail sail; @@ -49,8 +49,8 @@ public abstract class AbstractForwardChainingInferencerConnection extends Infere protected int totalInferred; /*--------------* - * Constructors * - *--------------*/ + * Constructors * + *--------------*/ public AbstractForwardChainingInferencerConnection(Sail sail, InferencerConnection con) { super(con); @@ -59,8 +59,8 @@ public AbstractForwardChainingInferencerConnection(Sail sail, InferencerConnecti } /*---------* - * Methods * - *---------*/ + * Methods * + *---------*/ // Called by base sail @Override @@ -186,4 +186,4 @@ protected boolean hasNewStatements() { protected boolean needsFullRecomputation() { return statementsRemoved; } -} \ No newline at end of file +} diff --git a/core/sail/inferencer/src/main/java/org/eclipse/rdf4j/sail/inferencer/fc/CustomGraphQueryInferencer.java b/core/sail/inferencer/src/main/java/org/eclipse/rdf4j/sail/inferencer/fc/CustomGraphQueryInferencer.java index 1872218fe69..ee1e9566d12 100644 --- a/core/sail/inferencer/src/main/java/org/eclipse/rdf4j/sail/inferencer/fc/CustomGraphQueryInferencer.java +++ b/core/sail/inferencer/src/main/java/org/eclipse/rdf4j/sail/inferencer/fc/CustomGraphQueryInferencer.java @@ -41,7 +41,7 @@ /** * A forward-chaining inferencer that infers new statements using a SPARQL or SeRQL graph query. - * + * * @author Dale Visser */ public class CustomGraphQueryInferencer extends NotifyingSailWrapper { @@ -66,7 +66,7 @@ public CustomGraphQueryInferencer() { /** * Create a new custom inferencer. - * + * * @param language language that queryText and matcherText are expressed in * @param queryText a query that returns an RDF graph of inferred statements to be added to the underlying Sail * @param matcherText a query that returns an RDF graph of existing inferred statements already added previously @@ -82,7 +82,7 @@ public CustomGraphQueryInferencer(QueryLanguage language, String queryText, Stri /** * Create a new custom inferencer. - * + * * @param baseSail an underlying Sail, such as another inferencer or a SailRepository * @param language language that queryText and matcherText are expressed in * @param queryText a query that returns an RDF graph of inferred statements to be added to the underlying Sail @@ -99,7 +99,7 @@ public CustomGraphQueryInferencer(NotifyingSail baseSail, QueryLanguage language /** * Called in order to set all the fields needed for the inferencer to function. - * + * * @param language language that queryText and matcherText are expressed in * @param queryText a query that returns an RDF graph of inferred statements to be added to the underlying Sail * @param matcherText a query that returns an RDF graph of existing inferred statements already added previously @@ -157,7 +157,7 @@ public void initialize() throws SailException { /** * Exposed for test purposes. - * + * * @return a computed collection of the statement subjects that, when added or removed, trigger an update of * inferred statements */ @@ -167,7 +167,7 @@ public Collection getWatchSubjects() { /** * Exposed for test purposes. - * + * * @return a computed collection of the statement predicates that, when added or removed, trigger an update of * inferred statements */ @@ -177,7 +177,7 @@ public Collection getWatchPredicates() { /** * Exposed for test purposes. - * + * * @return a computed collection of the statement objects that, when added or removed, trigger an update of inferred * statements */ diff --git a/core/sail/inferencer/src/main/java/org/eclipse/rdf4j/sail/inferencer/fc/DirectTypeHierarchyInferencer.java b/core/sail/inferencer/src/main/java/org/eclipse/rdf4j/sail/inferencer/fc/DirectTypeHierarchyInferencer.java index 76ecbdb4eb3..90824eda271 100644 --- a/core/sail/inferencer/src/main/java/org/eclipse/rdf4j/sail/inferencer/fc/DirectTypeHierarchyInferencer.java +++ b/core/sail/inferencer/src/main/java/org/eclipse/rdf4j/sail/inferencer/fc/DirectTypeHierarchyInferencer.java @@ -42,20 +42,20 @@ * sesame:directType}. *

    * The semantics of this inferencer are defined as follows: - * + * *

    * @@ -400,6 +401,11 @@ List getNodeShapes() { private void runInferencingSparqlQueries(SailRepositoryConnection shaclSailConnection) { + // performance optimisation, running the queries below is time-consuming, even if the repo is empty + if (shaclSailConnection.isEmpty()) { + return; + } + long prevSize; long currentSize = shaclSailConnection.size(); do { diff --git a/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/ShaclSailConnection.java b/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/ShaclSailConnection.java index f22ab7febce..20affa544d4 100644 --- a/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/ShaclSailConnection.java +++ b/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/ShaclSailConnection.java @@ -24,7 +24,6 @@ import org.eclipse.rdf4j.IsolationLevels; import org.eclipse.rdf4j.common.concurrent.locks.Lock; import org.eclipse.rdf4j.common.iteration.CloseableIteration; -import org.eclipse.rdf4j.common.iteration.Iterations; import org.eclipse.rdf4j.model.IRI; import org.eclipse.rdf4j.model.Resource; import org.eclipse.rdf4j.model.Statement; @@ -37,7 +36,6 @@ import org.eclipse.rdf4j.sail.SailConnectionListener; import org.eclipse.rdf4j.sail.SailException; import org.eclipse.rdf4j.sail.UpdateContext; -import org.eclipse.rdf4j.sail.base.SailStore; import org.eclipse.rdf4j.sail.helpers.NotifyingSailConnectionWrapper; import org.eclipse.rdf4j.sail.memory.MemoryStore; import org.eclipse.rdf4j.sail.shacl.AST.NodeShape; @@ -582,9 +580,10 @@ public void prepare() throws SailException { List nodeShapesAfterRefresh = this.nodeShapes; + stats.setEmpty(isEmpty()); + if (addedStatementsSet.isEmpty() && removedStatementsSet.isEmpty() && !shapesModifiedInCurrentTransaction) { - boolean currentBaseSailEmpty = isEmpty(); - if (!(stats.isBaseSailEmpty() && !currentBaseSailEmpty)) { + if (!(stats.isBaseSailEmpty() && !stats.isEmpty())) { logger.debug("Nothing has changed, nothing to validate."); return; } diff --git a/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/ShaclSailValidationException.java b/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/ShaclSailValidationException.java index e6a02d027c5..bf6bc6d3d73 100644 --- a/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/ShaclSailValidationException.java +++ b/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/ShaclSailValidationException.java @@ -11,6 +11,7 @@ import java.util.ArrayDeque; import java.util.List; +import org.eclipse.rdf4j.exceptions.ValidationException; import org.eclipse.rdf4j.model.Model; import org.eclipse.rdf4j.model.vocabulary.SHACL; import org.eclipse.rdf4j.sail.SailException; @@ -19,7 +20,7 @@ import org.eclipse.rdf4j.sail.shacl.results.ValidationReport; import org.eclipse.rdf4j.sail.shacl.results.ValidationResult; -public class ShaclSailValidationException extends SailException { +public class ShaclSailValidationException extends SailException implements ValidationException { private List invalidTuples; @@ -31,7 +32,7 @@ public class ShaclSailValidationException extends SailException { /** * @return A Model containing the validation report as specified by the SHACL Recommendation */ - @SuppressWarnings("WeakerAccess") + @Override public Model validationReportAsModel() { ValidationReport validationReport = getValidationReport(); @@ -43,10 +44,13 @@ public Model validationReportAsModel() { } /** + * @deprecated The returned ValidationReport is planned to be moved to a different package and this method is + * planned to return that class. + * * @return A ValidationReport Java object that describes what failed and can optionally be converted to a Model as * specified by the SHACL Recommendation */ - @SuppressWarnings("WeakerAccess") + @Deprecated public ValidationReport getValidationReport() { ValidationReport validationReport = new ValidationReport(invalidTuples.isEmpty()); diff --git a/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/Stats.java b/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/Stats.java index 37e9b69ae07..eaa45eb7fbc 100644 --- a/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/Stats.java +++ b/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/Stats.java @@ -21,6 +21,7 @@ public class Stats { private boolean baseSailEmpty; private boolean hasAdded; private boolean hasRemoved; + private boolean empty; public void added(Statement statement) { hasAdded = true; @@ -28,17 +29,28 @@ public void added(Statement statement) { public void removed(Statement statement) { hasRemoved = true; - } + /** + * + * @return true if statements were effectively added in this transaction + */ public boolean hasAdded() { return hasAdded; } + /** + * + * @return true if statements were effectively removed in this transaction + */ public boolean hasRemoved() { return hasRemoved; } + /** + * + * @return true if the sail was empty before this transaction started + */ public boolean isBaseSailEmpty() { return baseSailEmpty; } @@ -46,4 +58,16 @@ public boolean isBaseSailEmpty() { void setBaseSailEmpty(boolean baseSailEmpty) { this.baseSailEmpty = baseSailEmpty; } -} \ No newline at end of file + + /** + * + * @return true if the entire sail is empty + */ + public boolean isEmpty() { + return empty; + } + + void setEmpty(boolean empty) { + this.empty = empty; + } +} diff --git a/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/config/ShaclSailConfig.java b/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/config/ShaclSailConfig.java index 4d850f6d908..da37a5aa441 100644 --- a/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/config/ShaclSailConfig.java +++ b/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/config/ShaclSailConfig.java @@ -64,6 +64,10 @@ public ShaclSailConfig() { super(ShaclSailFactory.SAIL_TYPE); } + public ShaclSailConfig(SailImplConfig delegate) { + super(ShaclSailFactory.SAIL_TYPE, delegate); + } + public boolean isUndefinedTargetValidatesAllSubjects() { return undefinedTargetValidatesAllSubjects; } @@ -177,27 +181,27 @@ public void parse(Model m, Resource implNode) throws SailConfigException { super.parse(m, implNode); try { - Models.objectLiteral(m.filter(implNode, PARALLEL_VALIDATION, null)) + Models.objectLiteral(m.getStatements(implNode, PARALLEL_VALIDATION, null)) .ifPresent(l -> setParallelValidation(l.booleanValue())); - Models.objectLiteral(m.filter(implNode, UNDEFINED_TARGET_VALIDATES_ALL_SUBJECTS, null)) + Models.objectLiteral(m.getStatements(implNode, UNDEFINED_TARGET_VALIDATES_ALL_SUBJECTS, null)) .ifPresent(l -> setUndefinedTargetValidatesAllSubjects(l.booleanValue())); - Models.objectLiteral(m.filter(implNode, LOG_VALIDATION_PLANS, null)) + Models.objectLiteral(m.getStatements(implNode, LOG_VALIDATION_PLANS, null)) .ifPresent(l -> setLogValidationPlans(l.booleanValue())); - Models.objectLiteral(m.filter(implNode, LOG_VALIDATION_VIOLATIONS, null)) + Models.objectLiteral(m.getStatements(implNode, LOG_VALIDATION_VIOLATIONS, null)) .ifPresent(l -> setLogValidationViolations(l.booleanValue())); - Models.objectLiteral(m.filter(implNode, IGNORE_NO_SHAPES_LOADED_EXCEPTION, null)) + Models.objectLiteral(m.getStatements(implNode, IGNORE_NO_SHAPES_LOADED_EXCEPTION, null)) .ifPresent(l -> setIgnoreNoShapesLoadedException(l.booleanValue())); - Models.objectLiteral(m.filter(implNode, VALIDATION_ENABLED, null)) + Models.objectLiteral(m.getStatements(implNode, VALIDATION_ENABLED, null)) .ifPresent(l -> setValidationEnabled(l.booleanValue())); - Models.objectLiteral(m.filter(implNode, CACHE_SELECT_NODES, null)) + Models.objectLiteral(m.getStatements(implNode, CACHE_SELECT_NODES, null)) .ifPresent(l -> setCacheSelectNodes(l.booleanValue())); - Models.objectLiteral(m.filter(implNode, GLOBAL_LOG_VALIDATION_EXECUTION, null)) + Models.objectLiteral(m.getStatements(implNode, GLOBAL_LOG_VALIDATION_EXECUTION, null)) .ifPresent(l -> setGlobalLogValidationExecution(l.booleanValue())); - Models.objectLiteral(m.filter(implNode, RDFS_SUB_CLASS_REASONING, null)) + Models.objectLiteral(m.getStatements(implNode, RDFS_SUB_CLASS_REASONING, null)) .ifPresent(l -> setRdfsSubClassReasoning(l.booleanValue())); - Models.objectLiteral(m.filter(implNode, PERFORMANCE_LOGGING, null)) + Models.objectLiteral(m.getStatements(implNode, PERFORMANCE_LOGGING, null)) .ifPresent(l -> setPerformanceLogging(l.booleanValue())); - Models.objectLiteral(m.filter(implNode, SERIALIZABLE_VALIDATION, null)) + Models.objectLiteral(m.getStatements(implNode, SERIALIZABLE_VALIDATION, null)) .ifPresent(l -> setSerializableValidation(l.booleanValue())); } catch (IllegalArgumentException e) { throw new SailConfigException("error parsing Sail configuration", e); diff --git a/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/config/ShaclSailFactory.java b/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/config/ShaclSailFactory.java index b14100a4b32..748b3243815 100644 --- a/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/config/ShaclSailFactory.java +++ b/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/config/ShaclSailFactory.java @@ -15,14 +15,14 @@ /** * Factory class for creation of {@link ShaclSail}s as part of a Sail stack. - * + * * @author Jeen Broekstra */ public class ShaclSailFactory implements SailFactory { /** * The type of Sails that are created by this factory. - * + * * @see SailFactory#getSailType() */ public static final String SAIL_TYPE = "rdf4j:ShaclSail"; diff --git a/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/config/ShaclSailSchema.java b/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/config/ShaclSailSchema.java index e365f89b406..f2047fae6aa 100644 --- a/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/config/ShaclSailSchema.java +++ b/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/config/ShaclSailSchema.java @@ -14,7 +14,7 @@ /** * Defines constants for the ShaclSail schema which is used by {@link ShaclSailFactory}s to initialize * {@link ShaclSail}s. - * + * * @author Jeen Broekstra */ public class ShaclSailSchema { diff --git a/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/planNodes/AbstractBulkJoinPlanNode.java b/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/planNodes/AbstractBulkJoinPlanNode.java index f8416e25928..82d24d514a4 100644 --- a/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/planNodes/AbstractBulkJoinPlanNode.java +++ b/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/planNodes/AbstractBulkJoinPlanNode.java @@ -13,7 +13,6 @@ import java.util.stream.Collectors; import java.util.stream.Stream; -import org.eclipse.rdf4j.common.iteration.Iterations; import org.eclipse.rdf4j.model.Resource; import org.eclipse.rdf4j.query.BindingSet; import org.eclipse.rdf4j.query.algebra.BindingSetAssignment; diff --git a/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/planNodes/DatatypeFilter.java b/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/planNodes/DatatypeFilter.java index 8423ea97628..2b7df795eb7 100644 --- a/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/planNodes/DatatypeFilter.java +++ b/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/planNodes/DatatypeFilter.java @@ -25,8 +25,9 @@ public DatatypeFilter(PlanNode parent, Resource datatype) { @Override boolean checkTuple(Tuple t) { - if (!(t.line.get(1) instanceof Literal)) + if (!(t.line.get(1) instanceof Literal)) { return false; + } Literal literal = (Literal) t.line.get(1); return literal.getDatatype() == datatype || literal.getDatatype().equals(datatype); diff --git a/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/planNodes/EnrichWithShape.java b/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/planNodes/EnrichWithShape.java index 1abc91ed473..2a827d143d9 100644 --- a/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/planNodes/EnrichWithShape.java +++ b/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/planNodes/EnrichWithShape.java @@ -73,8 +73,9 @@ public int depth() { @Override public void getPlanAsGraphvizDot(StringBuilder stringBuilder) { - if (printed) + if (printed) { return; + } printed = true; stringBuilder.append(getId()) .append(" [label=\"") diff --git a/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/planNodes/EqualsJoin.java b/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/planNodes/EqualsJoin.java index 21ffa6b9a6e..f240e76ff50 100644 --- a/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/planNodes/EqualsJoin.java +++ b/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/planNodes/EqualsJoin.java @@ -127,8 +127,9 @@ public int depth() { @Override public void getPlanAsGraphvizDot(StringBuilder stringBuilder) { - if (printed) + if (printed) { return; + } printed = true; left.getPlanAsGraphvizDot(stringBuilder); @@ -146,8 +147,9 @@ public String getId() { @Override public IteratorData getIteratorDataType() { - if (left.getIteratorDataType() == right.getIteratorDataType()) + if (left.getIteratorDataType() == right.getIteratorDataType()) { return left.getIteratorDataType(); + } throw new IllegalStateException("Not implemented support for when left and right have different types of data"); diff --git a/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/planNodes/GroupByCount.java b/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/planNodes/GroupByCount.java index d81bc99d200..c9269e78356 100644 --- a/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/planNodes/GroupByCount.java +++ b/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/planNodes/GroupByCount.java @@ -120,8 +120,9 @@ public int depth() { @Override public void getPlanAsGraphvizDot(StringBuilder stringBuilder) { - if (printed) + if (printed) { return; + } printed = true; stringBuilder.append(getId() + " [label=\"" + StringEscapeUtils.escapeJava(this.toString()) + "\"];") .append("\n"); diff --git a/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/planNodes/InnerJoin.java b/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/planNodes/InnerJoin.java index a3f107a942e..382d852ba14 100644 --- a/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/planNodes/InnerJoin.java +++ b/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/planNodes/InnerJoin.java @@ -311,8 +311,9 @@ public void receiveLogger(ValidationExecutionLogger validationExecutionLogger) { PlanNode[] planNodes = { joined, discardedLeft, discardedRight, left, right }; for (PlanNode planNode : planNodes) { - if (planNode != null) + if (planNode != null) { planNode.receiveLogger(validationExecutionLogger); + } } } diff --git a/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/planNodes/LeftOuterJoin.java b/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/planNodes/LeftOuterJoin.java index 89ff56020f6..e2fcc39191b 100644 --- a/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/planNodes/LeftOuterJoin.java +++ b/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/planNodes/LeftOuterJoin.java @@ -140,8 +140,9 @@ public int depth() { @Override public void getPlanAsGraphvizDot(StringBuilder stringBuilder) { - if (printed) + if (printed) { return; + } printed = true; left.getPlanAsGraphvizDot(stringBuilder); @@ -160,8 +161,9 @@ public String getId() { @Override public IteratorData getIteratorDataType() { - if (left.getIteratorDataType() == right.getIteratorDataType()) + if (left.getIteratorDataType() == right.getIteratorDataType()) { return left.getIteratorDataType(); + } throw new IllegalStateException("Not implemented support for when left and right have different types of data"); diff --git a/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/planNodes/ModifyTuple.java b/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/planNodes/ModifyTuple.java index a7cedbd3104..bab7c5c11a8 100644 --- a/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/planNodes/ModifyTuple.java +++ b/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/planNodes/ModifyTuple.java @@ -59,8 +59,9 @@ public int depth() { @Override public void getPlanAsGraphvizDot(StringBuilder stringBuilder) { - if (printed) + if (printed) { return; + } printed = true; stringBuilder.append(getId() + " [label=\"" + StringEscapeUtils.escapeJava(this.toString()) + "\"];") .append("\n"); diff --git a/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/planNodes/TrimTuple.java b/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/planNodes/TrimTuple.java index fda75b024e7..aaef8ae7c6d 100644 --- a/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/planNodes/TrimTuple.java +++ b/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/planNodes/TrimTuple.java @@ -78,8 +78,9 @@ public int depth() { @Override public void getPlanAsGraphvizDot(StringBuilder stringBuilder) { - if (printed) + if (printed) { return; + } printed = true; stringBuilder.append(getId() + " [label=\"" + StringEscapeUtils.escapeJava(this.toString()) + "\"];") .append("\n"); @@ -99,8 +100,9 @@ public String getId() { @Override public IteratorData getIteratorDataType() { - if (newLength == 1) + if (newLength == 1) { return IteratorData.tripleBased; + } return parent.getIteratorDataType(); } diff --git a/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/planNodes/Tuple.java b/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/planNodes/Tuple.java index 3c5d6c4637d..e901d0dd84f 100644 --- a/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/planNodes/Tuple.java +++ b/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/planNodes/Tuple.java @@ -54,7 +54,12 @@ public Tuple() { public Tuple(BindingSet bindingset, String[] bindingnames) { for (String bindingname : bindingnames) { - Value value = bindingset.getValue(bindingname.replace("?", "")); + Value value; + if (bindingname.startsWith("?")) { + value = bindingset.getValue(bindingname.substring(1)); + } else { + value = bindingset.getValue(bindingname); + } if (value != null) { line.add(value); } diff --git a/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/planNodes/UnBufferedPlanNode.java b/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/planNodes/UnBufferedPlanNode.java index 68b14954840..2e7cdcdf74a 100644 --- a/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/planNodes/UnBufferedPlanNode.java +++ b/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/planNodes/UnBufferedPlanNode.java @@ -115,7 +115,6 @@ public IteratorData getIteratorDataType() { @Override public void push(Tuple next) { - assert (this.next == null); this.next = next; } diff --git a/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/planNodes/UnionNode.java b/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/planNodes/UnionNode.java index 929116cf965..4cde2c551ad 100644 --- a/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/planNodes/UnionNode.java +++ b/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/planNodes/UnionNode.java @@ -118,8 +118,9 @@ public int depth() { @Override public void getPlanAsGraphvizDot(StringBuilder stringBuilder) { - if (printed) + if (printed) { return; + } printed = true; stringBuilder.append(getId() + " [label=\"" + StringEscapeUtils.escapeJava(this.toString()) + "\"];") .append("\n"); @@ -146,8 +147,9 @@ public IteratorData getIteratorDataType() { .map(PlanNode::getIteratorDataType) .distinct() .collect(Collectors.toList()); - if (collect.size() == 1) + if (collect.size() == 1) { return collect.get(0); + } throw new IllegalStateException( "Not implemented support for when union node operates on nodes with different iterator data types"); diff --git a/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/planNodes/ValuesBackedNode.java b/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/planNodes/ValuesBackedNode.java index c7c8b4473ab..54553e7c329 100644 --- a/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/planNodes/ValuesBackedNode.java +++ b/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/planNodes/ValuesBackedNode.java @@ -15,7 +15,6 @@ import org.eclipse.rdf4j.common.iteration.CloseableIteration; import org.eclipse.rdf4j.model.Value; import org.eclipse.rdf4j.sail.SailException; -import org.eclipse.rdf4j.sail.memory.MemoryStoreConnection; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/results/ModelInterface.java b/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/results/ModelInterface.java index d9ca9efde52..41c356aea33 100644 --- a/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/results/ModelInterface.java +++ b/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/results/ModelInterface.java @@ -10,12 +10,16 @@ import org.eclipse.rdf4j.model.Model; import org.eclipse.rdf4j.model.Resource; -import org.eclipse.rdf4j.model.impl.LinkedHashModelFactory; +import org.eclipse.rdf4j.model.impl.DynamicModelFactory; +/** + * Deprecated since 3.2.0. + */ +@Deprecated() public interface ModelInterface { default Model asModel() { - return asModel(new LinkedHashModelFactory().createEmptyModel()); + return asModel(new DynamicModelFactory().createEmptyModel()); } Model asModel(Model model); diff --git a/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/results/ValidationReport.java b/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/results/ValidationReport.java index 1b285cd9c68..07f424051cd 100644 --- a/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/results/ValidationReport.java +++ b/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/results/ValidationReport.java @@ -14,11 +14,19 @@ import org.eclipse.rdf4j.model.Model; import org.eclipse.rdf4j.model.Resource; +import org.eclipse.rdf4j.model.impl.DynamicModelFactory; import org.eclipse.rdf4j.model.impl.SimpleValueFactory; import org.eclipse.rdf4j.model.vocabulary.RDF; import org.eclipse.rdf4j.model.vocabulary.SHACL; -public class ValidationReport implements ModelInterface { +/** + * The ValidationReport represents the report from a SHACL validation in an easy-to-use Java API. + * + * @deprecated The ValidationReport is deprecated because it is planned moved to a new package to allow it to be used + * with remote validation reports. + */ +@Deprecated +public class ValidationReport { private Resource id = SimpleValueFactory.getInstance().createBNode(); @@ -34,7 +42,6 @@ public void addValidationResult(ValidationResult validationResult) { this.validationResult.add(validationResult); } - @Override public Model asModel(Model model) { SimpleValueFactory vf = SimpleValueFactory.getInstance(); @@ -50,7 +57,10 @@ public Model asModel(Model model) { return model; } - @Override + public Model asModel() { + return asModel(new DynamicModelFactory().createEmptyModel()); + } + public Resource getId() { return id; } @@ -69,7 +79,6 @@ public List getValidationResult() { return validationResult; } - @Override public String toString() { return "ValidationReport{" + "conforms=" + conforms + diff --git a/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/results/ValidationResult.java b/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/results/ValidationResult.java index 35c8ba9cbb5..e040c71f555 100644 --- a/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/results/ValidationResult.java +++ b/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/results/ValidationResult.java @@ -23,7 +23,14 @@ import org.eclipse.rdf4j.sail.shacl.AST.SimplePath; import org.eclipse.rdf4j.sail.shacl.SourceConstraintComponent; -public class ValidationResult implements ModelInterface { +/** + * The ValidationResult represents the results from a SHACL validation in an easy-to-use Java API. + * + * @deprecated The ValidationResult is deprecated because it is planned moved to a new package to allow it to be used + * with remote validation results. + */ +@Deprecated +public class ValidationResult { private Resource id = SimpleValueFactory.getInstance().createBNode(); @@ -71,7 +78,6 @@ public List getDetails() { } - @Override public Model asModel(Model model) { model.add(getId(), RDF.TYPE, SHACL.VALIDATION_RESULT); @@ -113,7 +119,6 @@ private Value getFocusNode() { return focusNode; } - @Override public Resource getId() { return id; } diff --git a/core/sail/shacl/src/test/java/org/eclipse/rdf4j/sail/shacl/AbstractShaclTest.java b/core/sail/shacl/src/test/java/org/eclipse/rdf4j/sail/shacl/AbstractShaclTest.java index a66636d0719..a1d6eb9d1a7 100644 --- a/core/sail/shacl/src/test/java/org/eclipse/rdf4j/sail/shacl/AbstractShaclTest.java +++ b/core/sail/shacl/src/test/java/org/eclipse/rdf4j/sail/shacl/AbstractShaclTest.java @@ -11,11 +11,13 @@ import static junit.framework.TestCase.assertTrue; import static org.junit.Assert.assertFalse; +import java.io.File; import java.io.IOException; import java.io.InputStream; import java.net.URI; import java.net.URISyntaxException; import java.net.URL; +import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Paths; import java.util.ArrayList; @@ -26,10 +28,10 @@ import java.util.stream.Collectors; import java.util.stream.Stream; +import org.apache.commons.io.FileUtils; import org.apache.commons.io.IOUtils; import org.eclipse.rdf4j.IsolationLevel; import org.eclipse.rdf4j.IsolationLevels; -import org.eclipse.rdf4j.common.io.IOUtil; import org.eclipse.rdf4j.model.Model; import org.eclipse.rdf4j.model.Statement; import org.eclipse.rdf4j.model.ValueFactory; @@ -61,6 +63,8 @@ abstract public class AbstractShaclTest { private static final Logger logger = LoggerFactory.getLogger(AbstractShaclTest.class); + private static final String[] FILENAME_EXTENSION = { "rq" }; + // @formatter:off // formatter doesn't understand that the trailing ) needs to be on a new line. @@ -184,8 +188,19 @@ private static List findTestCases(String testCase, String baseCase) { List ret = new ArrayList<>(); - for (int i = 0; i < 100; i++) { - String path = testCase + "/" + baseCase + "/case" + i; + URL resource = AbstractShaclTest.class.getClassLoader().getResource(testCase + "/" + baseCase + "/"); + if (resource == null) { + return ret; + } + + String[] list = new File(resource.getFile()).list(); + Arrays.sort(list); + + for (String caseName : list) { + if (caseName.startsWith(".")) { + continue; + } + String path = testCase + "/" + baseCase + "/" + caseName; InputStream resourceAsStream = AbstractShaclTest.class.getClassLoader().getResourceAsStream(path); if (resourceAsStream != null) { ret.add(path); @@ -195,6 +210,7 @@ private static List findTestCases(String testCase, String baseCase) { throw new RuntimeException(e); } } + } return ret; @@ -274,21 +290,23 @@ static void runTestCase(String shaclPath, String dataPath, ExpectedResult expect } - for (int j = 0; j < 100; j++) { + URL resource = AbstractShaclTest.class.getClassLoader().getResource(dataPath); + List queries = FileUtils.listFiles(new File(resource.getFile()), FILENAME_EXTENSION, false) + .stream() + .sorted() + .collect(Collectors.toList()); + + for (File queryFile : queries) { + try { + String query = FileUtils.readFileToString(queryFile, StandardCharsets.UTF_8); - String name = dataPath + "query" + j + ".rq"; - try (InputStream resourceAsStream = AbstractShaclTest.class.getClassLoader().getResourceAsStream(name)) { - if (resourceAsStream == null) { - continue; - } printCurrentState(shaclRepository); ran = true; - printFile(name); + printFile(queryFile.getName()); try (SailRepositoryConnection connection = shaclRepository.getConnection()) { connection.begin(isolationLevel); - String query = IOUtil.readString(resourceAsStream); connection.prepareUpdate(query).execute(); connection.commit(); } catch (RepositoryException sailException) { @@ -400,19 +418,19 @@ static void runTestCaseSingleTransaction(String shaclPath, String dataPath, Expe try (SailRepositoryConnection shaclSailConnection = shaclRepository.getConnection()) { shaclSailConnection.begin(isolationLevel); - for (int j = 0; j < 100; j++) { + URL resource = AbstractShaclTest.class.getClassLoader().getResource(dataPath); + List queries = FileUtils.listFiles(new File(resource.getFile()), FILENAME_EXTENSION, false) + .stream() + .sorted() + .collect(Collectors.toList()); - String name = dataPath + "query" + j + ".rq"; - InputStream resourceAsStream = AbstractShaclTest.class.getClassLoader().getResourceAsStream(name); - if (resourceAsStream == null) { - continue; - } + for (File queryFile : queries) { + try { + String query = FileUtils.readFileToString(queryFile, StandardCharsets.UTF_8); - ran = true; - logger.debug(name); + ran = true; + logger.debug(queryFile.getName()); - try { - String query = IOUtil.readString(resourceAsStream); shaclSailConnection.prepareUpdate(query).execute(); } catch (IOException e) { @@ -471,22 +489,22 @@ static void runTestCaseRevalidate(String shaclPath, String dataPath, ExpectedRes ((ShaclSail) shaclRepository.getSail()).disableValidation(); shaclSailConnection.begin(isolationLevel); - for (int j = 0; j < 100; j++) { - - String name = dataPath + "query" + j + ".rq"; - InputStream resourceAsStream = AbstractShaclTest.class.getClassLoader().getResourceAsStream(name); - if (resourceAsStream == null) { - continue; - } + URL resource = AbstractShaclTest.class.getClassLoader().getResource(dataPath); + List queries = FileUtils.listFiles(new File(resource.getFile()), FILENAME_EXTENSION, false) + .stream() + .sorted() + .collect(Collectors.toList()); + for (File queryFile : queries) { try { - String query = IOUtil.readString(resourceAsStream); + String query = FileUtils.readFileToString(queryFile, StandardCharsets.UTF_8); shaclSailConnection.prepareUpdate(query).execute(); } catch (IOException e) { e.printStackTrace(); } } + shaclSailConnection.commit(); ((ShaclSail) shaclRepository.getSail()).enableValidation(); diff --git a/core/sail/shacl/src/test/java/org/eclipse/rdf4j/sail/shacl/MultithreadedNativeStoreTest.java b/core/sail/shacl/src/test/java/org/eclipse/rdf4j/sail/shacl/MultithreadedNativeStoreTest.java index d4097ab460b..d5251e8a51f 100644 --- a/core/sail/shacl/src/test/java/org/eclipse/rdf4j/sail/shacl/MultithreadedNativeStoreTest.java +++ b/core/sail/shacl/src/test/java/org/eclipse/rdf4j/sail/shacl/MultithreadedNativeStoreTest.java @@ -40,4 +40,5 @@ NotifyingSail getBaseSail() { } return nativeStore; } + } diff --git a/core/sail/shacl/src/test/java/org/eclipse/rdf4j/sail/shacl/MultithreadedTest.java b/core/sail/shacl/src/test/java/org/eclipse/rdf4j/sail/shacl/MultithreadedTest.java index b3818e48610..5a92c4ef620 100644 --- a/core/sail/shacl/src/test/java/org/eclipse/rdf4j/sail/shacl/MultithreadedTest.java +++ b/core/sail/shacl/src/test/java/org/eclipse/rdf4j/sail/shacl/MultithreadedTest.java @@ -15,7 +15,6 @@ import java.util.Comparator; import java.util.List; import java.util.Random; -import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; @@ -27,7 +26,6 @@ import org.eclipse.rdf4j.model.IRI; import org.eclipse.rdf4j.model.Model; import org.eclipse.rdf4j.model.Statement; -import org.eclipse.rdf4j.model.ValueFactory; import org.eclipse.rdf4j.model.impl.SimpleValueFactory; import org.eclipse.rdf4j.model.vocabulary.RDF4J; import org.eclipse.rdf4j.repository.RepositoryException; @@ -37,6 +35,7 @@ import org.eclipse.rdf4j.rio.Rio; import org.eclipse.rdf4j.sail.NotifyingSail; import org.eclipse.rdf4j.sail.Sail; +import org.eclipse.rdf4j.sail.SailConflictException; import org.junit.AfterClass; import org.junit.Test; @@ -229,7 +228,8 @@ private void parallelTest(List> list, IsolationLevels isolatio try { connection.commit(); } catch (RepositoryException e) { - if (!(e.getCause() instanceof ShaclSailValidationException)) { + if (!((e.getCause() instanceof ShaclSailValidationException) + || e.getCause() instanceof SailConflictException)) { throw e; } connection.rollback(); @@ -239,7 +239,7 @@ private void parallelTest(List> list, IsolationLevels isolatio }) .map(executorService::submit) .collect(Collectors.toList()) // this terminates lazy evalutation, so that we can submit all our - // runnables before we start collecting them + // runnables before we start collecting them .forEach(f -> { try { f.get(); @@ -420,7 +420,6 @@ private void runValidationFailuresTest(Sail sail, IsolationLevels isolationLevel parse3 = new ArrayList<>(Rio.parse(resource, "", RDFFormat.TURTLE)); } - Random r = new Random(); ExecutorService executorService = null; try { @@ -433,14 +432,17 @@ private void runValidationFailuresTest(Sail sail, IsolationLevels isolationLevel .mapToObj(transaction -> (Runnable) () -> { try (SailRepositoryConnection connection = repository.getConnection()) { - ValueFactory vf = connection.getValueFactory(); connection.begin(isolationLevels); connection.add(parse); try { connection.commit(); - } catch (RepositoryException ignored) { + } catch (RepositoryException e) { + if (!((e.getCause() instanceof ShaclSailValidationException) + || e.getCause() instanceof SailConflictException)) { + throw e; + } connection.rollback(); } @@ -449,7 +451,11 @@ private void runValidationFailuresTest(Sail sail, IsolationLevels isolationLevel try { connection.commit(); - } catch (RepositoryException ignored) { + } catch (RepositoryException e) { + if (!((e.getCause() instanceof ShaclSailValidationException) + || e.getCause() instanceof SailConflictException)) { + throw e; + } connection.rollback(); } @@ -458,7 +464,11 @@ private void runValidationFailuresTest(Sail sail, IsolationLevels isolationLevel try { connection.commit(); - } catch (RepositoryException ignored) { + } catch (RepositoryException e) { + if (!((e.getCause() instanceof ShaclSailValidationException) + || e.getCause() instanceof SailConflictException)) { + throw e; + } connection.rollback(); } @@ -467,7 +477,11 @@ private void runValidationFailuresTest(Sail sail, IsolationLevels isolationLevel try { connection.commit(); - } catch (RepositoryException ignored) { + } catch (RepositoryException e) { + if (!((e.getCause() instanceof ShaclSailValidationException) + || e.getCause() instanceof SailConflictException)) { + throw e; + } connection.rollback(); } } @@ -477,7 +491,21 @@ private void runValidationFailuresTest(Sail sail, IsolationLevels isolationLevel .forEach(f -> { try { f.get(); - } catch (InterruptedException | ExecutionException e) { + } catch (Throwable e) { + + Throwable temp = e; + while (temp != null) { + System.err.println( + "\n----------------------------------------------------------------------\nClass: " + + temp.getClass().getCanonicalName() + "\nMessage: " + + temp.getMessage()); + temp.printStackTrace(); + temp = temp.getCause(); + } + + System.err.println( + "\n######################################################################"); + throw new RuntimeException(e); } }); diff --git a/core/sail/shacl/src/test/java/org/eclipse/rdf4j/sail/shacl/OrderingTest.java b/core/sail/shacl/src/test/java/org/eclipse/rdf4j/sail/shacl/OrderingTest.java index 7f820169a72..e6379b5c2f8 100644 --- a/core/sail/shacl/src/test/java/org/eclipse/rdf4j/sail/shacl/OrderingTest.java +++ b/core/sail/shacl/src/test/java/org/eclipse/rdf4j/sail/shacl/OrderingTest.java @@ -9,14 +9,11 @@ package org.eclipse.rdf4j.sail.shacl; import static junit.framework.TestCase.assertEquals; -import static junit.framework.TestCase.assertTrue; import java.util.Arrays; import java.util.Collections; -import java.util.HashSet; import java.util.List; import java.util.Set; -import java.util.TreeSet; import java.util.stream.Collectors; import org.eclipse.rdf4j.IsolationLevels; @@ -27,9 +24,6 @@ import org.eclipse.rdf4j.model.vocabulary.FOAF; import org.eclipse.rdf4j.model.vocabulary.RDF; import org.eclipse.rdf4j.model.vocabulary.RDFS; -import org.eclipse.rdf4j.model.vocabulary.SHACL; -import org.eclipse.rdf4j.repository.sail.SailRepository; -import org.eclipse.rdf4j.repository.sail.SailRepositoryConnection; import org.eclipse.rdf4j.sail.SailConnection; import org.eclipse.rdf4j.sail.memory.MemoryStore; import org.eclipse.rdf4j.sail.shacl.AST.ShaclProperties; @@ -38,7 +32,6 @@ import org.eclipse.rdf4j.sail.shacl.planNodes.PlanNode; import org.eclipse.rdf4j.sail.shacl.planNodes.Select; import org.eclipse.rdf4j.sail.shacl.planNodes.Sort; -import org.eclipse.rdf4j.sail.shacl.planNodes.TrimTuple; import org.eclipse.rdf4j.sail.shacl.planNodes.Tuple; import org.eclipse.rdf4j.sail.shacl.planNodes.UnBufferedPlanNode; import org.eclipse.rdf4j.sail.shacl.planNodes.ValuesBackedNode; diff --git a/core/sail/shacl/src/test/java/org/eclipse/rdf4j/sail/shacl/TrackAddedStatementsTest.java b/core/sail/shacl/src/test/java/org/eclipse/rdf4j/sail/shacl/TrackAddedStatementsTest.java index 0f4f4fc744c..0e8b1198151 100644 --- a/core/sail/shacl/src/test/java/org/eclipse/rdf4j/sail/shacl/TrackAddedStatementsTest.java +++ b/core/sail/shacl/src/test/java/org/eclipse/rdf4j/sail/shacl/TrackAddedStatementsTest.java @@ -13,7 +13,6 @@ import static junit.framework.TestCase.assertNull; import static org.junit.Assert.fail; -import org.eclipse.rdf4j.common.iteration.Iterations; import org.eclipse.rdf4j.model.vocabulary.RDF; import org.eclipse.rdf4j.model.vocabulary.RDFS; import org.eclipse.rdf4j.repository.Repository; diff --git a/core/sail/shacl/src/test/java/org/eclipse/rdf4j/sail/shacl/UniqueTest.java b/core/sail/shacl/src/test/java/org/eclipse/rdf4j/sail/shacl/UniqueTest.java index 46d3be1ab09..02fb03e53ed 100644 --- a/core/sail/shacl/src/test/java/org/eclipse/rdf4j/sail/shacl/UniqueTest.java +++ b/core/sail/shacl/src/test/java/org/eclipse/rdf4j/sail/shacl/UniqueTest.java @@ -7,21 +7,20 @@ import java.util.HashSet; import java.util.List; -/** - * **************************************************************************** - * Copyright (c) 2019 Eclipse RDF4J contributors. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Distribution License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/org/documents/edl-v10.php. - * ***************************************************************************** - */ import org.eclipse.rdf4j.sail.shacl.mock.MockConsumePlanNode; import org.eclipse.rdf4j.sail.shacl.mock.MockInputPlanNode; import org.eclipse.rdf4j.sail.shacl.planNodes.Tuple; import org.eclipse.rdf4j.sail.shacl.planNodes.Unique; import org.junit.Test; +/** + * **************************************************************************** Copyright (c) 2019 Eclipse RDF4J + * contributors. All rights reserved. This program and the accompanying materials are made available under the terms of + * the Eclipse Distribution License v1.0 which accompanies this distribution, and is available at + * http://www.eclipse.org/org/documents/edl-v10.php. + * ***************************************************************************** + */ + public class UniqueTest { @Test diff --git a/core/sail/shacl/src/test/java/org/eclipse/rdf4j/sail/shacl/Utils.java b/core/sail/shacl/src/test/java/org/eclipse/rdf4j/sail/shacl/Utils.java index b39dfa110a3..d9e0d50eda7 100644 --- a/core/sail/shacl/src/test/java/org/eclipse/rdf4j/sail/shacl/Utils.java +++ b/core/sail/shacl/src/test/java/org/eclipse/rdf4j/sail/shacl/Utils.java @@ -56,19 +56,15 @@ public static void loadShapeData(ShaclSail sail, String resourceName) throws IOE public static void loadShapeData(SailRepository repo, String resourceName) throws IOException { ((ShaclSail) repo.getSail()).disableValidation(); - Model shapes; try (InputStream shapesData = Utils.class.getClassLoader().getResourceAsStream(resourceName)) { - shapes = Rio.parse(shapesData, "", RDFFormat.TURTLE, RDF4J.SHACL_SHAPE_GRAPH); - } - try (RepositoryConnection conn = repo.getConnection()) { - conn.begin(IsolationLevels.NONE); - for (Statement st : shapes) { - conn.add(st.getSubject(), st.getPredicate(), st.getObject(), RDF4J.SHACL_SHAPE_GRAPH); + + try (RepositoryConnection conn = repo.getConnection()) { + conn.begin(IsolationLevels.NONE); + conn.add(shapesData, "", RDFFormat.TURTLE, RDF4J.SHACL_SHAPE_GRAPH); + conn.commit(); } - conn.commit(); } ((ShaclSail) repo.getSail()).enableValidation(); - } public static void loadShapeData(SailRepository repo, URL resourceName) diff --git a/core/sail/shacl/src/test/java/org/eclipse/rdf4j/sail/shacl/ValidationReportTest.java b/core/sail/shacl/src/test/java/org/eclipse/rdf4j/sail/shacl/ValidationReportTest.java index 4d50cd79baf..cec6adeebce 100644 --- a/core/sail/shacl/src/test/java/org/eclipse/rdf4j/sail/shacl/ValidationReportTest.java +++ b/core/sail/shacl/src/test/java/org/eclipse/rdf4j/sail/shacl/ValidationReportTest.java @@ -7,6 +7,7 @@ *******************************************************************************/ package org.eclipse.rdf4j.sail.shacl; +import static junit.framework.Assert.fail; import static junit.framework.TestCase.assertTrue; import java.io.IOException; @@ -15,6 +16,8 @@ import org.apache.commons.io.IOUtils; import org.eclipse.rdf4j.model.Model; +import org.eclipse.rdf4j.model.ValueFactory; +import org.eclipse.rdf4j.model.impl.SimpleValueFactory; import org.eclipse.rdf4j.model.util.Models; import org.eclipse.rdf4j.model.vocabulary.RDF; import org.eclipse.rdf4j.model.vocabulary.RDFS; @@ -29,6 +32,8 @@ public class ValidationReportTest { + ValueFactory vf = SimpleValueFactory.getInstance(); + @Test public void simpleFirstTest() throws IOException { SailRepository shaclSail = Utils.getInitializedShaclRepository("shacl.ttl", false); @@ -42,6 +47,7 @@ public void simpleFirstTest() throws IOException { connection.add(RDF.SUBJECT, RDF.TYPE, RDFS.RESOURCE); connection.commit(); + fail(); } catch (RepositoryException e) { ShaclSailValidationException cause = (ShaclSailValidationException) e.getCause(); @@ -73,6 +79,49 @@ public void simpleFirstTest() throws IOException { } } + @Test + public void withoutPathTest() throws IOException { + SailRepository shaclSail = Utils.getInitializedShaclRepository("shaclValidateTarget.ttl", false); + + try (SailRepositoryConnection connection = shaclSail.getConnection()) { + + connection.begin(); + connection.add(vf.createIRI("http://example.com/ns#", "node1"), RDF.TYPE, + vf.createIRI("http://example.com/ns#", "SecondTarget")); + connection.commit(); + + fail(); + + } catch (RepositoryException e) { + ShaclSailValidationException cause = (ShaclSailValidationException) e.getCause(); + Model actual = cause.validationReportAsModel(); + + actual.setNamespace(RDF.PREFIX, RDF.NAMESPACE); + actual.setNamespace(RDFS.PREFIX, RDFS.NAMESPACE); + actual.setNamespace("ex", "http://example.com/ns#"); + + Rio.write(actual, System.out, RDFFormat.TURTLE); + + Model expected = Rio.parse(new StringReader("" + + "@prefix ex: .\n" + + "@prefix rdf: .\n" + + "@prefix sh: .\n" + + "\n" + + "_:node1e4dsta0ax19 a sh:ValidationReport;\n" + + " sh:conforms false;\n" + + " sh:result _:node1e4dsta0ax20 .\n" + + "\n" + + "_:node1e4dsta0ax20 a sh:ValidationResult;\n" + + " sh:focusNode ex:node1;\n" + + " sh:sourceConstraintComponent sh:ClassConstraintComponent;\n" + + " sh:sourceShape ex:PersonShape ." + + ""), "", RDFFormat.TURTLE); + + assertTrue(Models.isomorphic(expected, actual)); + + } + } + @Test public void nestedLogicalOrSupport() throws IOException { @@ -85,6 +134,7 @@ public void nestedLogicalOrSupport() throws IOException { .getResourceAsStream("test-cases/or/datatype/invalid/case1/query1.rq"), StandardCharsets.UTF_8)) .execute(); connection.commit(); + fail(); } catch (RepositoryException e) { ShaclSailValidationException cause = (ShaclSailValidationException) e.getCause(); diff --git a/core/sail/shacl/src/test/java/org/eclipse/rdf4j/sail/shacl/benchmark/AddRemoveBenchmarkEmpty.java b/core/sail/shacl/src/test/java/org/eclipse/rdf4j/sail/shacl/benchmark/AddRemoveBenchmarkEmpty.java index 371e127b97f..a489196b1c5 100644 --- a/core/sail/shacl/src/test/java/org/eclipse/rdf4j/sail/shacl/benchmark/AddRemoveBenchmarkEmpty.java +++ b/core/sail/shacl/src/test/java/org/eclipse/rdf4j/sail/shacl/benchmark/AddRemoveBenchmarkEmpty.java @@ -52,6 +52,7 @@ public class AddRemoveBenchmarkEmpty { private List> allStatements; + { GlobalValidationExecutionLogging.loggingEnabled = false; } diff --git a/core/sail/shacl/src/test/java/org/eclipse/rdf4j/sail/shacl/benchmark/BenchmarkConfigs.java b/core/sail/shacl/src/test/java/org/eclipse/rdf4j/sail/shacl/benchmark/BenchmarkConfigs.java index 995ba151335..0781592da55 100644 --- a/core/sail/shacl/src/test/java/org/eclipse/rdf4j/sail/shacl/benchmark/BenchmarkConfigs.java +++ b/core/sail/shacl/src/test/java/org/eclipse/rdf4j/sail/shacl/benchmark/BenchmarkConfigs.java @@ -17,6 +17,7 @@ public class BenchmarkConfigs { { GlobalValidationExecutionLogging.loggingEnabled = false; } + public static final int NUMBER_OF_TRANSACTIONS = 30; public static final int NUMBER_OF_EMPTY_TRANSACTIONS = 10; diff --git a/core/sail/shacl/src/test/java/org/eclipse/rdf4j/sail/shacl/benchmark/ClassBenchmarkEmpty.java b/core/sail/shacl/src/test/java/org/eclipse/rdf4j/sail/shacl/benchmark/ClassBenchmarkEmpty.java index 8712c02e017..71736351c15 100644 --- a/core/sail/shacl/src/test/java/org/eclipse/rdf4j/sail/shacl/benchmark/ClassBenchmarkEmpty.java +++ b/core/sail/shacl/src/test/java/org/eclipse/rdf4j/sail/shacl/benchmark/ClassBenchmarkEmpty.java @@ -12,7 +12,6 @@ import java.util.concurrent.TimeUnit; import java.util.stream.Stream; -import org.eclipse.rdf4j.common.iteration.Iterations; import org.eclipse.rdf4j.model.IRI; import org.eclipse.rdf4j.model.Statement; import org.eclipse.rdf4j.model.impl.SimpleValueFactory; diff --git a/core/sail/shacl/src/test/java/org/eclipse/rdf4j/sail/shacl/benchmark/ComplexBenchmark.java b/core/sail/shacl/src/test/java/org/eclipse/rdf4j/sail/shacl/benchmark/ComplexBenchmark.java index 6af16d2cbfc..a789d803869 100644 --- a/core/sail/shacl/src/test/java/org/eclipse/rdf4j/sail/shacl/benchmark/ComplexBenchmark.java +++ b/core/sail/shacl/src/test/java/org/eclipse/rdf4j/sail/shacl/benchmark/ComplexBenchmark.java @@ -15,7 +15,6 @@ import org.apache.commons.io.IOUtils; import org.eclipse.rdf4j.IsolationLevels; -import org.eclipse.rdf4j.common.iteration.Iterations; import org.eclipse.rdf4j.model.Resource; import org.eclipse.rdf4j.model.Statement; import org.eclipse.rdf4j.model.vocabulary.RDFS; diff --git a/core/sail/shacl/src/test/java/org/eclipse/rdf4j/sail/shacl/benchmark/DatatypeBenchmarkEmpty.java b/core/sail/shacl/src/test/java/org/eclipse/rdf4j/sail/shacl/benchmark/DatatypeBenchmarkEmpty.java index a4d6c0c8c37..c4f8cd07ff6 100644 --- a/core/sail/shacl/src/test/java/org/eclipse/rdf4j/sail/shacl/benchmark/DatatypeBenchmarkEmpty.java +++ b/core/sail/shacl/src/test/java/org/eclipse/rdf4j/sail/shacl/benchmark/DatatypeBenchmarkEmpty.java @@ -13,7 +13,6 @@ import java.util.stream.Stream; import org.eclipse.rdf4j.IsolationLevels; -import org.eclipse.rdf4j.common.iteration.Iterations; import org.eclipse.rdf4j.model.IRI; import org.eclipse.rdf4j.model.Statement; import org.eclipse.rdf4j.model.impl.SimpleValueFactory; diff --git a/core/sail/shacl/src/test/java/org/eclipse/rdf4j/sail/shacl/benchmark/DatatypeBenchmarkPrefilled.java b/core/sail/shacl/src/test/java/org/eclipse/rdf4j/sail/shacl/benchmark/DatatypeBenchmarkPrefilled.java index 82b9bcb1a83..507c3718e40 100644 --- a/core/sail/shacl/src/test/java/org/eclipse/rdf4j/sail/shacl/benchmark/DatatypeBenchmarkPrefilled.java +++ b/core/sail/shacl/src/test/java/org/eclipse/rdf4j/sail/shacl/benchmark/DatatypeBenchmarkPrefilled.java @@ -13,7 +13,6 @@ import java.util.concurrent.TimeUnit; import java.util.stream.Stream; -import org.eclipse.rdf4j.common.iteration.Iterations; import org.eclipse.rdf4j.model.IRI; import org.eclipse.rdf4j.model.Statement; import org.eclipse.rdf4j.model.impl.SimpleValueFactory; diff --git a/core/sail/shacl/src/test/java/org/eclipse/rdf4j/sail/shacl/benchmark/DatatypeBenchmarkSerializableEmpty.java b/core/sail/shacl/src/test/java/org/eclipse/rdf4j/sail/shacl/benchmark/DatatypeBenchmarkSerializableEmpty.java index ba7c2125ebb..a93a62abb9c 100644 --- a/core/sail/shacl/src/test/java/org/eclipse/rdf4j/sail/shacl/benchmark/DatatypeBenchmarkSerializableEmpty.java +++ b/core/sail/shacl/src/test/java/org/eclipse/rdf4j/sail/shacl/benchmark/DatatypeBenchmarkSerializableEmpty.java @@ -13,7 +13,6 @@ import java.util.stream.Stream; import org.eclipse.rdf4j.IsolationLevels; -import org.eclipse.rdf4j.common.iteration.Iterations; import org.eclipse.rdf4j.model.IRI; import org.eclipse.rdf4j.model.Statement; import org.eclipse.rdf4j.model.impl.SimpleValueFactory; diff --git a/core/sail/shacl/src/test/java/org/eclipse/rdf4j/sail/shacl/benchmark/MaxCountBenchmarkEmpty.java b/core/sail/shacl/src/test/java/org/eclipse/rdf4j/sail/shacl/benchmark/MaxCountBenchmarkEmpty.java index 953b65a0a54..e0e9f47a5e6 100644 --- a/core/sail/shacl/src/test/java/org/eclipse/rdf4j/sail/shacl/benchmark/MaxCountBenchmarkEmpty.java +++ b/core/sail/shacl/src/test/java/org/eclipse/rdf4j/sail/shacl/benchmark/MaxCountBenchmarkEmpty.java @@ -12,7 +12,6 @@ import java.util.concurrent.TimeUnit; import java.util.stream.Stream; -import org.eclipse.rdf4j.common.iteration.Iterations; import org.eclipse.rdf4j.model.IRI; import org.eclipse.rdf4j.model.Statement; import org.eclipse.rdf4j.model.impl.SimpleValueFactory; diff --git a/core/sail/shacl/src/test/java/org/eclipse/rdf4j/sail/shacl/benchmark/MinCountBenchmarkEmpty.java b/core/sail/shacl/src/test/java/org/eclipse/rdf4j/sail/shacl/benchmark/MinCountBenchmarkEmpty.java index fb0e734affa..989744adbb1 100644 --- a/core/sail/shacl/src/test/java/org/eclipse/rdf4j/sail/shacl/benchmark/MinCountBenchmarkEmpty.java +++ b/core/sail/shacl/src/test/java/org/eclipse/rdf4j/sail/shacl/benchmark/MinCountBenchmarkEmpty.java @@ -12,7 +12,6 @@ import java.util.concurrent.TimeUnit; import java.util.stream.Stream; -import org.eclipse.rdf4j.common.iteration.Iterations; import org.eclipse.rdf4j.model.IRI; import org.eclipse.rdf4j.model.Statement; import org.eclipse.rdf4j.model.impl.SimpleValueFactory; @@ -23,6 +22,7 @@ import org.eclipse.rdf4j.repository.sail.SailRepositoryConnection; import org.eclipse.rdf4j.sail.memory.MemoryStore; import org.eclipse.rdf4j.sail.shacl.GlobalValidationExecutionLogging; +import org.eclipse.rdf4j.sail.shacl.ShaclSail; import org.eclipse.rdf4j.sail.shacl.ShaclSailConnection; import org.eclipse.rdf4j.sail.shacl.Utils; import org.openjdk.jmh.annotations.Benchmark; @@ -94,6 +94,33 @@ public void shacl() throws Exception { } + @Benchmark + public void shaclClear() throws Exception { + + SailRepository repository = new SailRepository(Utils.getInitializedShaclSail("shacl.ttl")); + + try (SailRepositoryConnection connection = repository.getConnection()) { + connection.begin(); + connection.commit(); + } + + try (SailRepositoryConnection connection = repository.getConnection()) { + for (List statements : allStatements) { + connection.begin(); + connection.add(statements); + connection.commit(); + } + + ((ShaclSail) repository.getSail()).setPerformanceLogging(true); + connection.clear(); + System.out.println(); + ((ShaclSail) repository.getSail()).setPerformanceLogging(false); + + } + repository.shutDown(); + + } + @Benchmark public void noShacl() { @@ -145,4 +172,25 @@ public void sparqlInsteadOfShacl() { } + @Benchmark + public void shaclMinCountZero() throws Exception { + + SailRepository repository = new SailRepository(Utils.getInitializedShaclSail("shaclMinCountZero.ttl")); + + try (SailRepositoryConnection connection = repository.getConnection()) { + connection.begin(); + connection.commit(); + } + + try (SailRepositoryConnection connection = repository.getConnection()) { + for (List statements : allStatements) { + connection.begin(); + connection.add(statements); + connection.commit(); + } + } + repository.shutDown(); + + } + } diff --git a/core/sail/shacl/src/test/java/org/eclipse/rdf4j/sail/shacl/benchmark/MinCountBenchmarkPrefilled.java b/core/sail/shacl/src/test/java/org/eclipse/rdf4j/sail/shacl/benchmark/MinCountBenchmarkPrefilled.java index f58d788ca2a..18d85f4e72e 100644 --- a/core/sail/shacl/src/test/java/org/eclipse/rdf4j/sail/shacl/benchmark/MinCountBenchmarkPrefilled.java +++ b/core/sail/shacl/src/test/java/org/eclipse/rdf4j/sail/shacl/benchmark/MinCountBenchmarkPrefilled.java @@ -13,7 +13,6 @@ import java.util.concurrent.TimeUnit; import java.util.stream.Stream; -import org.eclipse.rdf4j.common.iteration.Iterations; import org.eclipse.rdf4j.model.IRI; import org.eclipse.rdf4j.model.Statement; import org.eclipse.rdf4j.model.impl.SimpleValueFactory; diff --git a/core/sail/shacl/src/test/java/org/eclipse/rdf4j/sail/shacl/benchmark/NotClassBenchmarkEmpty.java b/core/sail/shacl/src/test/java/org/eclipse/rdf4j/sail/shacl/benchmark/NotClassBenchmarkEmpty.java index 5cfed93d7f3..816fdaf76b9 100644 --- a/core/sail/shacl/src/test/java/org/eclipse/rdf4j/sail/shacl/benchmark/NotClassBenchmarkEmpty.java +++ b/core/sail/shacl/src/test/java/org/eclipse/rdf4j/sail/shacl/benchmark/NotClassBenchmarkEmpty.java @@ -12,7 +12,6 @@ import java.util.concurrent.TimeUnit; import java.util.stream.Stream; -import org.eclipse.rdf4j.common.iteration.Iterations; import org.eclipse.rdf4j.model.IRI; import org.eclipse.rdf4j.model.Statement; import org.eclipse.rdf4j.model.impl.SimpleValueFactory; diff --git a/core/sail/shacl/src/test/java/org/eclipse/rdf4j/sail/shacl/benchmark/ParallelBenchmark.java b/core/sail/shacl/src/test/java/org/eclipse/rdf4j/sail/shacl/benchmark/ParallelBenchmark.java index df52be5a5ad..30ced7250f7 100644 --- a/core/sail/shacl/src/test/java/org/eclipse/rdf4j/sail/shacl/benchmark/ParallelBenchmark.java +++ b/core/sail/shacl/src/test/java/org/eclipse/rdf4j/sail/shacl/benchmark/ParallelBenchmark.java @@ -18,7 +18,6 @@ import org.apache.commons.io.FileUtils; import org.assertj.core.util.Files; import org.eclipse.rdf4j.IsolationLevels; -import org.eclipse.rdf4j.common.iteration.Iterations; import org.eclipse.rdf4j.model.IRI; import org.eclipse.rdf4j.model.Statement; import org.eclipse.rdf4j.model.impl.SimpleValueFactory; diff --git a/core/sail/shacl/src/test/java/org/eclipse/rdf4j/sail/shacl/config/ShaclSailFactoryTest.java b/core/sail/shacl/src/test/java/org/eclipse/rdf4j/sail/shacl/config/ShaclSailFactoryTest.java index 8e8229f2f6c..b8252a88a8d 100644 --- a/core/sail/shacl/src/test/java/org/eclipse/rdf4j/sail/shacl/config/ShaclSailFactoryTest.java +++ b/core/sail/shacl/src/test/java/org/eclipse/rdf4j/sail/shacl/config/ShaclSailFactoryTest.java @@ -15,7 +15,7 @@ /** * Unit tests for {@link ShaclSailFactory} - * + * * @author Jeen Broekstra */ public class ShaclSailFactoryTest { diff --git a/core/sail/shacl/src/test/java/org/eclipse/rdf4j/sail/shacl/mock/MockInputPlanNode.java b/core/sail/shacl/src/test/java/org/eclipse/rdf4j/sail/shacl/mock/MockInputPlanNode.java index 033aaa59e7f..b904805af50 100644 --- a/core/sail/shacl/src/test/java/org/eclipse/rdf4j/sail/shacl/mock/MockInputPlanNode.java +++ b/core/sail/shacl/src/test/java/org/eclipse/rdf4j/sail/shacl/mock/MockInputPlanNode.java @@ -11,7 +11,6 @@ import java.util.Arrays; import java.util.Collection; import java.util.Iterator; -import java.util.List; import java.util.stream.Collectors; import org.eclipse.rdf4j.common.iteration.CloseableIteration; diff --git a/core/sail/shacl/src/test/resources/shaclMinCountZero.ttl b/core/sail/shacl/src/test/resources/shaclMinCountZero.ttl new file mode 100644 index 00000000000..02a7c835ad4 --- /dev/null +++ b/core/sail/shacl/src/test/resources/shaclMinCountZero.ttl @@ -0,0 +1,17 @@ +@base . +@prefix ex: . +@prefix owl: . +@prefix rdf: . +@prefix rdfs: . +@prefix sh: . +@prefix xsd: . + +ex:PersonShape + a sh:NodeShape ; + sh:targetClass rdfs:Resource ; + sh:property ex:PersonShapeProperty . + + +ex:PersonShapeProperty + sh:path rdfs:label ; + sh:minCount 0 . diff --git a/core/sail/shacl/src/test/resources/shaclValidateTarget.ttl b/core/sail/shacl/src/test/resources/shaclValidateTarget.ttl new file mode 100644 index 00000000000..4bc094f0d3c --- /dev/null +++ b/core/sail/shacl/src/test/resources/shaclValidateTarget.ttl @@ -0,0 +1,13 @@ +@base . +@prefix ex: . +@prefix owl: . +@prefix rdf: . +@prefix rdfs: . +@prefix sh: . +@prefix xsd: . + +ex:PersonShape + a sh:NodeShape ; + sh:targetClass ex:Person, ex:SecondTarget ; + sh:class ex:Person . + diff --git a/core/sail/solr/pom.xml b/core/sail/solr/pom.xml index 60b86e14410..63891cde54a 100644 --- a/core/sail/solr/pom.xml +++ b/core/sail/solr/pom.xml @@ -4,7 +4,7 @@ org.eclipse.rdf4j rdf4j-sail - 3.1.5-SNAPSHOT + 3.2.2-SNAPSHOT rdf4j-sail-solr RDF4J Solr Sail Index diff --git a/core/sail/solr/src/main/java/org/eclipse/rdf4j/sail/solr/SolrIndex.java b/core/sail/solr/src/main/java/org/eclipse/rdf4j/sail/solr/SolrIndex.java index 357d964831f..347c59abd14 100644 --- a/core/sail/solr/src/main/java/org/eclipse/rdf4j/sail/solr/SolrIndex.java +++ b/core/sail/solr/src/main/java/org/eclipse/rdf4j/sail/solr/SolrIndex.java @@ -120,7 +120,7 @@ public void shutDown() throws IOException { /** * Returns a Document representing the specified document ID (combination of resource and context), or null when no * such Document exists yet. - * + * * @param id * @return search document * @throws IOException @@ -209,7 +209,7 @@ private SolrDocumentList getDocuments(SolrQuery query) throws SolrServerExceptio /** * Returns a Document representing the specified Resource and Context combination, or null when no such Document * exists yet. - * + * * @param subject * @param context * @return search document @@ -226,7 +226,7 @@ public SearchDocument getDocument(Resource subject, Resource context) throws IOE * Returns a list of Documents representing the specified Resource (empty when no such Document exists yet).Each * document represent a set of statements with the specified Resource as a subject, which are stored in a specific * context - * + * * @param subject * @return list of documents * @throws IOException @@ -238,15 +238,16 @@ public Iterable getDocuments(Resource subject) throws /** * Filters the given list of fields, retaining all property fields. - * + * * @param fields * @return set of fields */ public static Set getPropertyFields(Set fields) { Set result = new HashSet<>(fields.size()); for (String field : fields) { - if (SearchFields.isPropertyField(field)) + if (SearchFields.isPropertyField(field)) { result.add(field); + } } return result; } @@ -285,7 +286,7 @@ public void endReading() throws IOException { /** * Parse the passed query.To be removed, no longer used. - * + * * @param query string * @param propertyURI * @return the parsed query @@ -300,7 +301,7 @@ protected SearchQuery parseQuery(String query, IRI propertyURI) throws Malformed /** * Parse the passed query. - * + * * @param subject * @param query string * @param propertyURI @@ -366,7 +367,7 @@ protected Iterable query(Resource subject, String query /** * Evaluates the given query only for the given resource. - * + * * @param resource * @param query * @return response @@ -575,7 +576,7 @@ public double getY() { /** * Evaluates the given query and returns the results as a TopDocs instance. - * + * * @param query * @return query response * @throws SolrServerException @@ -595,13 +596,16 @@ public QueryResponse search(SolrQuery query) throws SolrServerException, IOExcep private SolrQuery prepareQuery(IRI propertyURI, SolrQuery query) { // check out which query parser to use, based on the given property URI if (propertyURI == null) - // if we have no property given, we create a default query parser which - // has the TEXT_FIELD_NAME as the default field + // if we have no property given, we create a default query parser which + // has the TEXT_FIELD_NAME as the default field + { query.set(CommonParams.DF, SearchFields.TEXT_FIELD_NAME); - else - // otherwise we create a query parser that has the given property as - // the default field + } else + // otherwise we create a query parser that has the given property as + // the default field + { query.set(CommonParams.DF, SearchFields.getPropertyField(propertyURI)); + } return query; } @@ -633,7 +637,7 @@ public synchronized void clearContexts(Resource... contexts) throws IOException } /** - * + * */ @Override public synchronized void clear() throws IOException { diff --git a/core/sail/solr/src/main/java/org/eclipse/rdf4j/sail/solr/SolrSearchQuery.java b/core/sail/solr/src/main/java/org/eclipse/rdf4j/sail/solr/SolrSearchQuery.java index 07bd856de8c..cadea6a48a6 100644 --- a/core/sail/solr/src/main/java/org/eclipse/rdf4j/sail/solr/SolrSearchQuery.java +++ b/core/sail/solr/src/main/java/org/eclipse/rdf4j/sail/solr/SolrSearchQuery.java @@ -22,7 +22,6 @@ import org.eclipse.rdf4j.sail.lucene.SearchFields; import org.eclipse.rdf4j.sail.lucene.SearchQuery; -import com.google.common.base.Function; import com.google.common.collect.Iterables; /** diff --git a/core/sail/solr/src/main/java/org/eclipse/rdf4j/sail/solr/SolrUtil.java b/core/sail/solr/src/main/java/org/eclipse/rdf4j/sail/solr/SolrUtil.java index 4c63e005bf5..f2a83fb3425 100644 --- a/core/sail/solr/src/main/java/org/eclipse/rdf4j/sail/solr/SolrUtil.java +++ b/core/sail/solr/src/main/java/org/eclipse/rdf4j/sail/solr/SolrUtil.java @@ -17,7 +17,7 @@ public class SolrUtil { /** * Converts a {@link SolrDocument} to a {@link SolrInputDocument} - * + * * @param solrDocument * @return input document */ diff --git a/core/sail/solr/src/main/java/org/eclipse/rdf4j/sail/solr/config/SolrSailFactory.java b/core/sail/solr/src/main/java/org/eclipse/rdf4j/sail/solr/config/SolrSailFactory.java index f92c5d56ec0..d89f90f84e2 100644 --- a/core/sail/solr/src/main/java/org/eclipse/rdf4j/sail/solr/config/SolrSailFactory.java +++ b/core/sail/solr/src/main/java/org/eclipse/rdf4j/sail/solr/config/SolrSailFactory.java @@ -22,7 +22,7 @@ public class SolrSailFactory implements SailFactory { /** * The type of repositories that are created by this factory. - * + * * @see SailFactory#getSailType() */ public static final String SAIL_TYPE = "openrdf:LuceneSail/Solr"; diff --git a/core/sparqlbuilder/pom.xml b/core/sparqlbuilder/pom.xml index d906de208f8..c2cb9825cf9 100644 --- a/core/sparqlbuilder/pom.xml +++ b/core/sparqlbuilder/pom.xml @@ -4,7 +4,7 @@ org.eclipse.rdf4j rdf4j-core - 3.1.5-SNAPSHOT + 3.2.2-SNAPSHOT rdf4j-sparqlbuilder RDF4J: SparqlBuilder diff --git a/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/constraint/Aggregate.java b/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/constraint/Aggregate.java index c2406fc5fed..58cee63de9f 100644 --- a/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/constraint/Aggregate.java +++ b/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/constraint/Aggregate.java @@ -1,10 +1,10 @@ /******************************************************************************* -Copyright (c) 2018 Eclipse RDF4J contributors. -All rights reserved. This program and the accompanying materials -are made available under the terms of the Eclipse Distribution License v1.0 -which accompanies this distribution, and is available at -http://www.eclipse.org/org/documents/edl-v10.php. -*******************************************************************************/ + Copyright (c) 2018 Eclipse RDF4J contributors. + All rights reserved. This program and the accompanying materials + are made available under the terms of the Eclipse Distribution License v1.0 + which accompanies this distribution, and is available at + http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ package org.eclipse.rdf4j.sparqlbuilder.constraint; @@ -12,7 +12,7 @@ /** * A SPARQL aggregate expression. - * + * * @see SPARQL Aggregates */ public class Aggregate extends Expression { @@ -29,7 +29,7 @@ public class Aggregate extends Expression { /** * Specify this aggregate expression to be distinct - * + * * @return this aggregate instance */ public Aggregate distinct() { @@ -38,9 +38,9 @@ public Aggregate distinct() { /** * Specify if this aggregate expression should be distinct or not - * + * * @param isDistinct if this aggregate should be distinct - * + * * @return this aggregate instance */ public Aggregate distinct(boolean isDistinct) { @@ -51,7 +51,7 @@ public Aggregate distinct(boolean isDistinct) { /** * If this is a {@code count} aggregate expressions, specify that it should count all - * + * * @return this aggregate instance */ public Aggregate countAll() { @@ -62,7 +62,7 @@ public Aggregate countAll() { * If this is a {@code count} aggregate expressions, specify if it should count all * * @param countAll if this should count all arguments or not - * + * * @return this aggregate instance */ public Aggregate countAll(boolean countAll) { @@ -73,11 +73,11 @@ public Aggregate countAll(boolean countAll) { /** * If this is a {@code group_concat} aggregate expression, specify the separator to use - * + * * @param separator the separator to use - * + * * @return this aggregate instance - * + * * @see group_concat() */ public Aggregate separator(String separator) { @@ -118,4 +118,4 @@ public String getQueryString() { return aggregate.append(SparqlBuilderUtils.getParenthesizedString(params.toString())).toString(); } -} \ No newline at end of file +} diff --git a/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/constraint/BinaryOperation.java b/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/constraint/BinaryOperation.java index b804ec5fdba..882e8e6a5a6 100644 --- a/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/constraint/BinaryOperation.java +++ b/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/constraint/BinaryOperation.java @@ -1,19 +1,19 @@ /******************************************************************************* -Copyright (c) 2018 Eclipse RDF4J contributors. -All rights reserved. This program and the accompanying materials -are made available under the terms of the Eclipse Distribution License v1.0 -which accompanies this distribution, and is available at -http://www.eclipse.org/org/documents/edl-v10.php. -*******************************************************************************/ + Copyright (c) 2018 Eclipse RDF4J contributors. + All rights reserved. This program and the accompanying materials + are made available under the terms of the Eclipse Distribution License v1.0 + which accompanies this distribution, and is available at + http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ package org.eclipse.rdf4j.sparqlbuilder.constraint; /** * Represents a SPARQL operation that takes exactly 2 arguments - * + * */ class BinaryOperation extends Operation { BinaryOperation(BinaryOperator operator) { super(operator, 2); } -} \ No newline at end of file +} diff --git a/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/constraint/BinaryOperator.java b/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/constraint/BinaryOperator.java index fe10dfe3a90..5879441e352 100644 --- a/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/constraint/BinaryOperator.java +++ b/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/constraint/BinaryOperator.java @@ -1,10 +1,10 @@ /******************************************************************************* -Copyright (c) 2018 Eclipse RDF4J contributors. -All rights reserved. This program and the accompanying materials -are made available under the terms of the Eclipse Distribution License v1.0 -which accompanies this distribution, and is available at -http://www.eclipse.org/org/documents/edl-v10.php. -*******************************************************************************/ + Copyright (c) 2018 Eclipse RDF4J contributors. + All rights reserved. This program and the accompanying materials + are made available under the terms of the Eclipse Distribution License v1.0 + which accompanies this distribution, and is available at + http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ package org.eclipse.rdf4j.sparqlbuilder.constraint; @@ -29,4 +29,4 @@ private BinaryOperator(String operator) { public String getQueryString() { return operator; } -} \ No newline at end of file +} diff --git a/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/constraint/ConnectiveOperation.java b/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/constraint/ConnectiveOperation.java index 0cad4991f1f..4824fe10b4d 100644 --- a/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/constraint/ConnectiveOperation.java +++ b/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/constraint/ConnectiveOperation.java @@ -1,10 +1,10 @@ /******************************************************************************* -Copyright (c) 2018 Eclipse RDF4J contributors. -All rights reserved. This program and the accompanying materials -are made available under the terms of the Eclipse Distribution License v1.0 -which accompanies this distribution, and is available at -http://www.eclipse.org/org/documents/edl-v10.php. -*******************************************************************************/ + Copyright (c) 2018 Eclipse RDF4J contributors. + All rights reserved. This program and the accompanying materials + are made available under the terms of the Eclipse Distribution License v1.0 + which accompanies this distribution, and is available at + http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ package org.eclipse.rdf4j.sparqlbuilder.constraint; @@ -15,4 +15,4 @@ class ConnectiveOperation extends Operation { ConnectiveOperation(ConnectiveOperator operator) { super(operator); } -} \ No newline at end of file +} diff --git a/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/constraint/ConnectiveOperator.java b/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/constraint/ConnectiveOperator.java index 0c5b9922443..a712bef0fd1 100644 --- a/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/constraint/ConnectiveOperator.java +++ b/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/constraint/ConnectiveOperator.java @@ -1,10 +1,10 @@ /******************************************************************************* -Copyright (c) 2018 Eclipse RDF4J contributors. -All rights reserved. This program and the accompanying materials -are made available under the terms of the Eclipse Distribution License v1.0 -which accompanies this distribution, and is available at -http://www.eclipse.org/org/documents/edl-v10.php. -*******************************************************************************/ + Copyright (c) 2018 Eclipse RDF4J contributors. + All rights reserved. This program and the accompanying materials + are made available under the terms of the Eclipse Distribution License v1.0 + which accompanies this distribution, and is available at + http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ package org.eclipse.rdf4j.sparqlbuilder.constraint; @@ -32,4 +32,4 @@ private ConnectiveOperator(String operator) { public String getQueryString() { return operator; } -} \ No newline at end of file +} diff --git a/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/constraint/CustomFunction.java b/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/constraint/CustomFunction.java index 7990fa12baf..5f5d9a13a0e 100644 --- a/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/constraint/CustomFunction.java +++ b/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/constraint/CustomFunction.java @@ -1,10 +1,10 @@ /******************************************************************************* -Copyright (c) 2018 Eclipse RDF4J contributors. -All rights reserved. This program and the accompanying materials -are made available under the terms of the Eclipse Distribution License v1.0 -which accompanies this distribution, and is available at -http://www.eclipse.org/org/documents/edl-v10.php. -*******************************************************************************/ + Copyright (c) 2018 Eclipse RDF4J contributors. + All rights reserved. This program and the accompanying materials + are made available under the terms of the Eclipse Distribution License v1.0 + which accompanies this distribution, and is available at + http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ package org.eclipse.rdf4j.sparqlbuilder.constraint; diff --git a/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/constraint/Expression.java b/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/constraint/Expression.java index 65ff4816011..5ff301a83be 100644 --- a/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/constraint/Expression.java +++ b/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/constraint/Expression.java @@ -1,10 +1,10 @@ /******************************************************************************* -Copyright (c) 2018 Eclipse RDF4J contributors. -All rights reserved. This program and the accompanying materials -are made available under the terms of the Eclipse Distribution License v1.0 -which accompanies this distribution, and is available at -http://www.eclipse.org/org/documents/edl-v10.php. -*******************************************************************************/ + Copyright (c) 2018 Eclipse RDF4J contributors. + All rights reserved. This program and the accompanying materials + are made available under the terms of the Eclipse Distribution License v1.0 + which accompanies this distribution, and is available at + http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ package org.eclipse.rdf4j.sparqlbuilder.constraint; @@ -22,7 +22,7 @@ * other expressions. * * @param the type of Expression (ie, Function or Operation). Used to support fluency - * + * * @see SPARQL Filters
    * SPARQL HAVING
    * SPARQL ORDER BY
    @@ -54,7 +54,7 @@ T addOperand(Operand... operands) { /** * Indicate that this expression should be wrapped in parentheses when converted to a query string - * + * * @return this */ public T parenthesize() { @@ -63,7 +63,7 @@ public T parenthesize() { /** * Indicate if this expression should be wrapped in parentheses when converted to a query string - * + * * @param parenthesize * @return this */ @@ -81,4 +81,4 @@ public T parenthesize(boolean parenthesize) { Operand getOperand(int index) { return ((ArrayList) elements).get(index); } -} \ No newline at end of file +} diff --git a/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/constraint/Expressions.java b/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/constraint/Expressions.java index 6b628911cd4..72af5bd4157 100644 --- a/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/constraint/Expressions.java +++ b/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/constraint/Expressions.java @@ -1,14 +1,20 @@ /******************************************************************************* -Copyright (c) 2018 Eclipse RDF4J contributors. -All rights reserved. This program and the accompanying materials -are made available under the terms of the Eclipse Distribution License v1.0 -which accompanies this distribution, and is available at -http://www.eclipse.org/org/documents/edl-v10.php. -*******************************************************************************/ + Copyright (c) 2018 Eclipse RDF4J contributors. + All rights reserved. This program and the accompanying materials + are made available under the terms of the Eclipse Distribution License v1.0 + which accompanies this distribution, and is available at + http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ package org.eclipse.rdf4j.sparqlbuilder.constraint; -import static org.eclipse.rdf4j.sparqlbuilder.constraint.SparqlFunction.*; +import static org.eclipse.rdf4j.sparqlbuilder.constraint.SparqlFunction.ABS; +import static org.eclipse.rdf4j.sparqlbuilder.constraint.SparqlFunction.BNODE; +import static org.eclipse.rdf4j.sparqlbuilder.constraint.SparqlFunction.BOUND; +import static org.eclipse.rdf4j.sparqlbuilder.constraint.SparqlFunction.CEIL; +import static org.eclipse.rdf4j.sparqlbuilder.constraint.SparqlFunction.COALESCE; +import static org.eclipse.rdf4j.sparqlbuilder.constraint.SparqlFunction.CONCAT; +import static org.eclipse.rdf4j.sparqlbuilder.constraint.SparqlFunction.REGEX; import org.eclipse.rdf4j.sparqlbuilder.core.Variable; import org.eclipse.rdf4j.sparqlbuilder.rdf.Iri; @@ -17,7 +23,7 @@ /** * A class with static methods to create SPARQL expressions. Obviously there's some more flushing out TODO still - * + * * @see SPARQL Function Definitions */ public class Expressions { @@ -26,10 +32,10 @@ private Expressions() { /** * ABS(operand) - * + * * @param operand the argument to the absolute value function * @return an ABS() function - * + * * @see SPARQL ABS Function */ public static Expression abs(Number operand) { @@ -38,10 +44,10 @@ public static Expression abs(Number operand) { /** * ABS(operand) - * + * * @param operand the argument to the absolute value function * @return an ABS() function - * + * * @see SPARQL ABS Function */ public static Expression abs(Operand operand) { @@ -50,9 +56,9 @@ public static Expression abs(Operand operand) { /** * BNODE() - * + * * @return a no-arg BNODE() function - * + * * @see SPARQL BNODE Function */ public static Expression bnode() { @@ -61,10 +67,10 @@ public static Expression bnode() { /** * BNODE(operand) - * + * * @param literal the RDF literal argument to the function * @return a BNODE() function - * + * * @see SPARQL BNODE Function */ public static Expression bnode(RdfLiteral literal) { @@ -73,10 +79,10 @@ public static Expression bnode(RdfLiteral literal) { /** * BNODE(operand) - * + * * @param literal the String literal argument to the function * @return a BNODE() function - * + * * @see SPARQL BNODE Function */ public static Expression bnode(String literal) { @@ -85,10 +91,10 @@ public static Expression bnode(String literal) { /** * BOUND(operand) - * + * * @param var the SPARQL variable argument to the function * @return a BOUND() function - * + * * @see SPARQL BOUND Function */ public static Expression bound(Variable var) { @@ -97,10 +103,10 @@ public static Expression bound(Variable var) { /** * CEIL(operand) - * + * * @param operand the argument to the function * @return a CEIL() function - * + * * @see SPARQL CEIL Function */ public static Expression ceil(Operand operand) { @@ -109,10 +115,10 @@ public static Expression ceil(Operand operand) { /** * COALESCE(operand1, operand2, ... , operandN) - * + * * @param operands the arguments to the function * @return a COALESCE() function - * + * * @see SPARQL COALESCE Function */ public static Expression coalesce(Operand... operands) { @@ -121,10 +127,10 @@ public static Expression coalesce(Operand... operands) { /** * CONCAT(operand1, operand2, ... , operandN) - * + * * @param operands the arguments to the function * @return a CONCAT() function - * + * * @see SPARQL CONCAT Function */ public static Expression concat(Operand... operands) { @@ -133,11 +139,11 @@ public static Expression concat(Operand... operands) { /** * REGEX(testString, pattern) - * + * * @param testString the text to match against * @param pattern the regex pattern to match * @return a REGEX() function - * + * * @see SPARQL REGEX Function */ public static Expression regex(Operand testString, String pattern) { @@ -146,12 +152,12 @@ public static Expression regex(Operand testString, String pattern) { /** * REGEX(testString, pattern, flags) - * + * * @param testString the text to match against * @param pattern the regular expression pattern to match * @param flags flags to specify matching options * @return a REGEX() function - * + * * @see SPARQL REGEX Function */ public static Expression regex(Operand testString, String pattern, String flags) { @@ -160,11 +166,11 @@ public static Expression regex(Operand testString, String pattern, String fla /** * REGEX(testString, pattern) - * + * * @param testString the text to match against * @param pattern the regex pattern to match * @return a REGEX() function - * + * * @see SPARQL REGEX Function */ public static Expression regex(Operand testString, Operand pattern) { @@ -173,12 +179,12 @@ public static Expression regex(Operand testString, Operand pattern) { /** * REGEX(testString, pattern, flags) - * + * * @param testString the text to match against * @param pattern the regular expression pattern to match * @param flags flags to specify matching options * @return a REGEX() function - * + * * @see SPARQL REGEX Function */ public static Expression regex(Operand testString, Operand pattern, Operand flags) { @@ -187,11 +193,11 @@ public static Expression regex(Operand testString, Operand pattern, Operand f /** * {@code STR(literal)} or {@code STR(iri)} - * + * * @param operand the arg to convert to a string - * + * * @return a {@code STR()} function - * + * * @see SPARQL STR Function */ public static Expression str(Operand operand) { @@ -206,7 +212,7 @@ public static Expression custom(Iri functionIri, Operand... operands) { /** * Too lazy at the moment. Make the rest of the functions this way for now. - * + * * @param function a SPARQL Function * @param operands arguments to the function * @return a function object of the given function type and operands @@ -217,10 +223,10 @@ public static Expression function(SparqlFunction function, Operand... operand /** * !operand - * + * * @param operand argument to the function * @return logical not operation - * + * * @see SPARQL Operators */ public static Expression not(Operand operand) { @@ -229,10 +235,10 @@ public static Expression not(Operand operand) { /** * +operand - * + * * @param operand argument to the function * @return unary plus operation - * + * * @see SPARQL Operators */ public static Expression plus(Operand operand) { @@ -241,10 +247,10 @@ public static Expression plus(Operand operand) { /** * -operand - * + * * @param operand argument to the function * @return unary minus operation - * + * * @see SPARQL Operators */ public static Expression minus(Operand operand) { @@ -257,7 +263,7 @@ private static UnaryOperation unaryExpression(UnaryOperator operator, Operand op /** * left = right - * + * * @param left the left operand * @param right the right operand * @return logical equals operation @@ -269,7 +275,7 @@ public static Expression equals(Operand left, Operand right) { /** * left != right - * + * * @param left the left operand * @param right the right operand * @return logical not equals operation @@ -281,7 +287,7 @@ public static Expression notEquals(Operand left, Operand right) { /** * left > right - * + * * @param left the left operand * @param right the right operand * @return logical greater than operation @@ -293,7 +299,7 @@ public static Expression gt(Number left, Number right) { /** * left > right - * + * * @param left the left operand * @param right the right operand * @return logical greater than operation @@ -305,7 +311,7 @@ public static Expression gt(Number left, Operand right) { /** * left > right - * + * * @param left the left operand * @param right the right operand * @return logical greater than operation @@ -317,7 +323,7 @@ public static Expression gt(Operand left, Number right) { /** * left > right - * + * * @param left the left operand * @param right the right operand * @return logical greater than operation @@ -329,7 +335,7 @@ public static Expression gt(Operand left, Operand right) { /** * left >= right - * + * * @param left the left operand * @param right the right operand * @return logical greater than or equals operation @@ -341,7 +347,7 @@ public static Expression gte(Operand left, Operand right) { /** * left < right - * + * * @param left the left operand * @param right the right operand * @return logical less than operation @@ -353,7 +359,7 @@ public static Expression lt(Number left, Number right) { /** * left < right - * + * * @param left the left operand * @param right the right operand * @return logical less than operation @@ -365,7 +371,7 @@ public static Expression lt(Number left, Operand right) { /** * left < right - * + * * @param left the left operand * @param right the right operand * @return logical less than operation @@ -377,7 +383,7 @@ public static Expression lt(Operand left, Number right) { /** * left < right - * + * * @param left the left operand * @param right the right operand * @return logical less than operation @@ -389,11 +395,11 @@ public static Expression lt(Operand left, Operand right) { /** * left <= right - * + * * @param left the left operand * @param right the right operand * @return logical less than or equals operation - * + * * @see SPARQL Operators */ public static Expression lte(Operand left, Operand right) { @@ -410,10 +416,10 @@ private static BinaryOperation binaryExpression(BinaryOperator operator, Operand /** * operand1 && operand2 && ... operandN - * + * * @param operands the arguments * @return logical and operation - * + * * @see SPARQL Operators */ public static Expression and(Operand... operands) { @@ -422,10 +428,10 @@ public static Expression and(Operand... operands) { /** * operand1 || operand2 || ... || operandN - * + * * @param operands the arguments * @return logical or operation - * + * * @see SPARQL Operators */ public static Expression or(Operand... operands) { @@ -434,10 +440,10 @@ public static Expression or(Operand... operands) { /** * operand1 + operand2 + ... + operandN - * + * * @param operands the arguments * @return arithmetic addition operation - * + * * @see SPARQL Operators */ public static Expression add(Operand... operands) { @@ -446,10 +452,10 @@ public static Expression add(Operand... operands) { /** * operand1 - operand2 - ... - operandN - * + * * @param operands the arguments * @return arithmetic subtraction operation - * + * * @see SPARQL Operators */ public static Expression subtract(Operand... operands) { @@ -458,10 +464,10 @@ public static Expression subtract(Operand... operands) { /** * operand1 * operand2 * ... * operandN - * + * * @param operands the arguments * @return arithmetic multiplication operation - * + * * @see SPARQL Operators */ public static Expression multiply(Operand... operands) { @@ -470,10 +476,10 @@ public static Expression multiply(Operand... operands) { /** * operand1 / operand2 / ... / operandN - * + * * @param operands the arguments * @return arithmetic division operation - * + * * @see SPARQL Operators */ public static Expression divide(Operand... operands) { @@ -496,10 +502,10 @@ private static ConnectiveOperation connectiveExpression(ConnectiveOperator opera /** * {@code avg(...)} - * + * * @param operand the expression to average * @return an avg aggregate function - * + * * @see SPARQL aggregates */ public static Aggregate avg(Operand operand) { @@ -508,7 +514,7 @@ public static Aggregate avg(Operand operand) { /** * {@code count()} - * + * * @param operand the expression to count * @return a count aggregate * @@ -545,4 +551,4 @@ public static Aggregate sample(Operand operand) { public static Aggregate sum(Operand operand) { return new Aggregate(SparqlAggregate.SUM).addOperand(operand); } -} \ No newline at end of file +} diff --git a/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/constraint/Function.java b/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/constraint/Function.java index 8e323c2f467..e109abd129e 100644 --- a/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/constraint/Function.java +++ b/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/constraint/Function.java @@ -1,16 +1,16 @@ /******************************************************************************* -Copyright (c) 2018 Eclipse RDF4J contributors. -All rights reserved. This program and the accompanying materials -are made available under the terms of the Eclipse Distribution License v1.0 -which accompanies this distribution, and is available at -http://www.eclipse.org/org/documents/edl-v10.php. -*******************************************************************************/ + Copyright (c) 2018 Eclipse RDF4J contributors. + All rights reserved. This program and the accompanying materials + are made available under the terms of the Eclipse Distribution License v1.0 + which accompanies this distribution, and is available at + http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ package org.eclipse.rdf4j.sparqlbuilder.constraint; /** * A SPARQL Function. Consists of a function name and a parenthesized, comma-separated list of arguments. - * + * * @see SPARQL Filters
    * SPARQL Function Definitions */ @@ -21,4 +21,4 @@ class Function extends Expression { printBodyIfEmpty(true); setOperatorName(operator.getQueryString(), false); } -} \ No newline at end of file +} diff --git a/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/constraint/Operand.java b/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/constraint/Operand.java index 6f4c0b2da20..9ecb68a3695 100644 --- a/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/constraint/Operand.java +++ b/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/constraint/Operand.java @@ -1,10 +1,10 @@ /******************************************************************************* -Copyright (c) 2018 Eclipse RDF4J contributors. -All rights reserved. This program and the accompanying materials -are made available under the terms of the Eclipse Distribution License v1.0 -which accompanies this distribution, and is available at -http://www.eclipse.org/org/documents/edl-v10.php. -*******************************************************************************/ + Copyright (c) 2018 Eclipse RDF4J contributors. + All rights reserved. This program and the accompanying materials + are made available under the terms of the Eclipse Distribution License v1.0 + which accompanies this distribution, and is available at + http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ package org.eclipse.rdf4j.sparqlbuilder.constraint; @@ -14,4 +14,4 @@ * Denotes an element that can be used as an operand to an {@link Expression} */ public interface Operand extends QueryElement { -} \ No newline at end of file +} diff --git a/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/constraint/Operation.java b/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/constraint/Operation.java index ceae554d54b..78b16d9752c 100644 --- a/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/constraint/Operation.java +++ b/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/constraint/Operation.java @@ -1,16 +1,16 @@ /******************************************************************************* -Copyright (c) 2018 Eclipse RDF4J contributors. -All rights reserved. This program and the accompanying materials -are made available under the terms of the Eclipse Distribution License v1.0 -which accompanies this distribution, and is available at -http://www.eclipse.org/org/documents/edl-v10.php. -*******************************************************************************/ + Copyright (c) 2018 Eclipse RDF4J contributors. + All rights reserved. This program and the accompanying materials + are made available under the terms of the Eclipse Distribution License v1.0 + which accompanies this distribution, and is available at + http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ package org.eclipse.rdf4j.sparqlbuilder.constraint; /** * A SPARQL Operation. Differs from a {@link Function} in the way operators and arguments are printed. - * + * * @param The type of operation. Used to support fluency. */ abstract class Operation> extends Expression { @@ -48,4 +48,4 @@ protected boolean isBelowOperatorLimit() { protected boolean isAtOperatorLimit() { return operandLimit < 0 || elements.size() == operandLimit; } -} \ No newline at end of file +} diff --git a/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/constraint/SparqlAggregate.java b/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/constraint/SparqlAggregate.java index 3f1db591624..f8bd7a930e7 100644 --- a/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/constraint/SparqlAggregate.java +++ b/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/constraint/SparqlAggregate.java @@ -1,16 +1,16 @@ /******************************************************************************* -Copyright (c) 2018 Eclipse RDF4J contributors. -All rights reserved. This program and the accompanying materials -are made available under the terms of the Eclipse Distribution License v1.0 -which accompanies this distribution, and is available at -http://www.eclipse.org/org/documents/edl-v10.php. -*******************************************************************************/ + Copyright (c) 2018 Eclipse RDF4J contributors. + All rights reserved. This program and the accompanying materials + are made available under the terms of the Eclipse Distribution License v1.0 + which accompanies this distribution, and is available at + http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ package org.eclipse.rdf4j.sparqlbuilder.constraint; /** * The built-in SPARQL aggregates. Keeping this public until {@link Expressions} is completed. - * + * * @see SPARQL Function Definitions */ @SuppressWarnings("javadoc") // acceptable, as this won't be public for long @@ -33,4 +33,4 @@ private SparqlAggregate(String function) { public String getQueryString() { return function; } -} \ No newline at end of file +} diff --git a/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/constraint/SparqlFunction.java b/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/constraint/SparqlFunction.java index 5b3237ebff7..3d81ec53841 100644 --- a/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/constraint/SparqlFunction.java +++ b/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/constraint/SparqlFunction.java @@ -1,16 +1,16 @@ /******************************************************************************* -Copyright (c) 2018 Eclipse RDF4J contributors. -All rights reserved. This program and the accompanying materials -are made available under the terms of the Eclipse Distribution License v1.0 -which accompanies this distribution, and is available at -http://www.eclipse.org/org/documents/edl-v10.php. -*******************************************************************************/ + Copyright (c) 2018 Eclipse RDF4J contributors. + All rights reserved. This program and the accompanying materials + are made available under the terms of the Eclipse Distribution License v1.0 + which accompanies this distribution, and is available at + http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ package org.eclipse.rdf4j.sparqlbuilder.constraint; /** * The built-in SPARQL Functions. Keeping this public until {@link Expressions} is completed. - * + * * @see SPARQL Function Definitions */ @SuppressWarnings("javadoc") // acceptable, as this won't be public for long @@ -79,4 +79,4 @@ private SparqlFunction(String function) { public String getQueryString() { return function; } -} \ No newline at end of file +} diff --git a/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/constraint/SparqlOperator.java b/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/constraint/SparqlOperator.java index 7f1f2a4ca66..f4dade8efc3 100644 --- a/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/constraint/SparqlOperator.java +++ b/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/constraint/SparqlOperator.java @@ -1,10 +1,10 @@ /******************************************************************************* -Copyright (c) 2018 Eclipse RDF4J contributors. -All rights reserved. This program and the accompanying materials -are made available under the terms of the Eclipse Distribution License v1.0 -which accompanies this distribution, and is available at -http://www.eclipse.org/org/documents/edl-v10.php. -*******************************************************************************/ + Copyright (c) 2018 Eclipse RDF4J contributors. + All rights reserved. This program and the accompanying materials + are made available under the terms of the Eclipse Distribution License v1.0 + which accompanies this distribution, and is available at + http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ package org.eclipse.rdf4j.sparqlbuilder.constraint; @@ -14,4 +14,4 @@ * Interface to denote an Expression operator */ public interface SparqlOperator extends QueryElement { -} \ No newline at end of file +} diff --git a/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/constraint/UnaryOperation.java b/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/constraint/UnaryOperation.java index 97a2add015e..fe5d321f258 100644 --- a/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/constraint/UnaryOperation.java +++ b/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/constraint/UnaryOperation.java @@ -1,10 +1,10 @@ /******************************************************************************* -Copyright (c) 2018 Eclipse RDF4J contributors. -All rights reserved. This program and the accompanying materials -are made available under the terms of the Eclipse Distribution License v1.0 -which accompanies this distribution, and is available at -http://www.eclipse.org/org/documents/edl-v10.php. -*******************************************************************************/ + Copyright (c) 2018 Eclipse RDF4J contributors. + All rights reserved. This program and the accompanying materials + are made available under the terms of the Eclipse Distribution License v1.0 + which accompanies this distribution, and is available at + http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ package org.eclipse.rdf4j.sparqlbuilder.constraint; @@ -19,4 +19,4 @@ class UnaryOperation extends Operation { setOperatorName(operator.getQueryString(), false); setWrapperMethod(SparqlBuilderUtils::getParenthesizedString); } -} \ No newline at end of file +} diff --git a/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/constraint/UnaryOperator.java b/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/constraint/UnaryOperator.java index 445c674c8ca..049f14315a3 100644 --- a/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/constraint/UnaryOperator.java +++ b/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/constraint/UnaryOperator.java @@ -1,10 +1,10 @@ /******************************************************************************* -Copyright (c) 2018 Eclipse RDF4J contributors. -All rights reserved. This program and the accompanying materials -are made available under the terms of the Eclipse Distribution License v1.0 -which accompanies this distribution, and is available at -http://www.eclipse.org/org/documents/edl-v10.php. -*******************************************************************************/ + Copyright (c) 2018 Eclipse RDF4J contributors. + All rights reserved. This program and the accompanying materials + are made available under the terms of the Eclipse Distribution License v1.0 + which accompanies this distribution, and is available at + http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ package org.eclipse.rdf4j.sparqlbuilder.constraint; @@ -26,4 +26,4 @@ private UnaryOperator(String operator) { public String getQueryString() { return operator; } -} \ No newline at end of file +} diff --git a/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/core/Assignable.java b/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/core/Assignable.java index f26aee34a1c..a79b3a4d1d2 100644 --- a/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/core/Assignable.java +++ b/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/core/Assignable.java @@ -1,27 +1,27 @@ /******************************************************************************* -Copyright (c) 2018 Eclipse RDF4J contributors. -All rights reserved. This program and the accompanying materials -are made available under the terms of the Eclipse Distribution License v1.0 -which accompanies this distribution, and is available at -http://www.eclipse.org/org/documents/edl-v10.php. -*******************************************************************************/ + Copyright (c) 2018 Eclipse RDF4J contributors. + All rights reserved. This program and the accompanying materials + are made available under the terms of the Eclipse Distribution License v1.0 + which accompanies this distribution, and is available at + http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ package org.eclipse.rdf4j.sparqlbuilder.core; /** * A marker interface to denote objects which are bind-able in a SPARQL assignment expression. - * + * * @see SPARQL Assignments * */ public interface Assignable extends QueryElement { /** * Create a SPARQL assignment from this object - * + * * @param var the variable to bind the expression value to * @return an Assignment object */ default public Assignment as(Variable var) { return SparqlBuilder.as(this, var); } -} \ No newline at end of file +} diff --git a/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/core/Assignment.java b/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/core/Assignment.java index 21cb31fdc80..6457990def3 100644 --- a/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/core/Assignment.java +++ b/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/core/Assignment.java @@ -1,10 +1,10 @@ /******************************************************************************* -Copyright (c) 2018 Eclipse RDF4J contributors. -All rights reserved. This program and the accompanying materials -are made available under the terms of the Eclipse Distribution License v1.0 -which accompanies this distribution, and is available at -http://www.eclipse.org/org/documents/edl-v10.php. -*******************************************************************************/ + Copyright (c) 2018 Eclipse RDF4J contributors. + All rights reserved. This program and the accompanying materials + are made available under the terms of the Eclipse Distribution License v1.0 + which accompanies this distribution, and is available at + http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ package org.eclipse.rdf4j.sparqlbuilder.core; @@ -12,7 +12,7 @@ /** * A SPARQL expression-to-variable assignment - * + * * @see SPARQL Assignments */ public class Assignment implements Projectable, Groupable { @@ -29,4 +29,4 @@ public class Assignment implements Projectable, Groupable { public String getQueryString() { return SparqlBuilderUtils.getParenthesizedString(expression.getQueryString() + AS + var.getQueryString()); } -} \ No newline at end of file +} diff --git a/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/core/Base.java b/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/core/Base.java index d2dbb7d01c8..1d63016d58a 100644 --- a/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/core/Base.java +++ b/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/core/Base.java @@ -1,10 +1,10 @@ /******************************************************************************* -Copyright (c) 2018 Eclipse RDF4J contributors. -All rights reserved. This program and the accompanying materials -are made available under the terms of the Eclipse Distribution License v1.0 -which accompanies this distribution, and is available at -http://www.eclipse.org/org/documents/edl-v10.php. -*******************************************************************************/ + Copyright (c) 2018 Eclipse RDF4J contributors. + All rights reserved. This program and the accompanying materials + are made available under the terms of the Eclipse Distribution License v1.0 + which accompanies this distribution, and is available at + http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ package org.eclipse.rdf4j.sparqlbuilder.core; @@ -12,7 +12,7 @@ /** * A SPARQL Base declaration - * + * * @see SPARQL Relative IRIs */ public class Base implements QueryElement { @@ -28,4 +28,4 @@ public class Base implements QueryElement { public String getQueryString() { return BASE + iri.getQueryString(); } -} \ No newline at end of file +} diff --git a/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/core/Dataset.java b/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/core/Dataset.java index ad955c14305..fd854096794 100644 --- a/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/core/Dataset.java +++ b/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/core/Dataset.java @@ -1,10 +1,10 @@ /******************************************************************************* -Copyright (c) 2018 Eclipse RDF4J contributors. -All rights reserved. This program and the accompanying materials -are made available under the terms of the Eclipse Distribution License v1.0 -which accompanies this distribution, and is available at -http://www.eclipse.org/org/documents/edl-v10.php. -*******************************************************************************/ + Copyright (c) 2018 Eclipse RDF4J contributors. + All rights reserved. This program and the accompanying materials + are made available under the terms of the Eclipse Distribution License v1.0 + which accompanies this distribution, and is available at + http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ package org.eclipse.rdf4j.sparqlbuilder.core; @@ -12,13 +12,13 @@ /** * A SPARQL dataset specification - * + * * @see RDF Datasets */ public class Dataset extends StandardQueryElementCollection { /** * Add graph references to this dataset - * + * * @param graphs the datasets to add * @return this object */ @@ -30,7 +30,7 @@ public Dataset from(From... graphs) { /** * Add unnamed graph references to this dataset - * + * * @param iris the IRI's of the graphs to add * @return this */ @@ -39,4 +39,4 @@ public Dataset from(Iri... iris) { return this; } -} \ No newline at end of file +} diff --git a/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/core/From.java b/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/core/From.java index c2bbcbe4e73..4bea6502d38 100644 --- a/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/core/From.java +++ b/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/core/From.java @@ -1,10 +1,10 @@ /******************************************************************************* -Copyright (c) 2018 Eclipse RDF4J contributors. -All rights reserved. This program and the accompanying materials -are made available under the terms of the Eclipse Distribution License v1.0 -which accompanies this distribution, and is available at -http://www.eclipse.org/org/documents/edl-v10.php. -*******************************************************************************/ + Copyright (c) 2018 Eclipse RDF4J contributors. + All rights reserved. This program and the accompanying materials + are made available under the terms of the Eclipse Distribution License v1.0 + which accompanies this distribution, and is available at + http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ package org.eclipse.rdf4j.sparqlbuilder.core; @@ -12,7 +12,7 @@ /** * A SPARQL Dataset specifier. - * + * * @see Specifying RDF Datasets */ public class From implements QueryElement { @@ -42,4 +42,4 @@ public String getQueryString() { return fromClause.toString(); } -} \ No newline at end of file +} diff --git a/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/core/GraphTemplate.java b/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/core/GraphTemplate.java index ff8ada7fe5c..103250c5b38 100644 --- a/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/core/GraphTemplate.java +++ b/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/core/GraphTemplate.java @@ -1,10 +1,10 @@ /******************************************************************************* -Copyright (c) 2018 Eclipse RDF4J contributors. -All rights reserved. This program and the accompanying materials -are made available under the terms of the Eclipse Distribution License v1.0 -which accompanies this distribution, and is available at -http://www.eclipse.org/org/documents/edl-v10.php. -*******************************************************************************/ + Copyright (c) 2018 Eclipse RDF4J contributors. + All rights reserved. This program and the accompanying materials + are made available under the terms of the Eclipse Distribution License v1.0 + which accompanies this distribution, and is available at + http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ package org.eclipse.rdf4j.sparqlbuilder.core; @@ -12,7 +12,7 @@ /** * A SPARQL Graph Template, used in Construct queries - * + * * @see SPARQL CONSTRUCT Query */ public class GraphTemplate implements QueryElement { @@ -24,7 +24,7 @@ public class GraphTemplate implements QueryElement { /** * Add triple patterns to this graph template - * + * * @param triples the patterns to add * @return this */ @@ -36,7 +36,7 @@ public GraphTemplate construct(TriplePattern... triples) { /** * Set, rather than augment, this graph template's triples template - * + * * @param triplesTemplate the {@link TriplesTemplate} instance to set * @return this graph template */ @@ -54,4 +54,4 @@ public String getQueryString() { return graphTemplate.toString(); } -} \ No newline at end of file +} diff --git a/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/core/GroupBy.java b/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/core/GroupBy.java index 3ff95cde6b4..28cef73c94a 100644 --- a/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/core/GroupBy.java +++ b/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/core/GroupBy.java @@ -1,10 +1,10 @@ /******************************************************************************* -Copyright (c) 2018 Eclipse RDF4J contributors. -All rights reserved. This program and the accompanying materials -are made available under the terms of the Eclipse Distribution License v1.0 -which accompanies this distribution, and is available at -http://www.eclipse.org/org/documents/edl-v10.php. -*******************************************************************************/ + Copyright (c) 2018 Eclipse RDF4J contributors. + All rights reserved. This program and the accompanying materials + are made available under the terms of the Eclipse Distribution License v1.0 + which accompanies this distribution, and is available at + http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ package org.eclipse.rdf4j.sparqlbuilder.core; @@ -12,7 +12,7 @@ /** * A SPARQL Group By clause - * + * * @see SPARQL Group By Clause */ public class GroupBy extends StandardQueryElementCollection { @@ -20,13 +20,13 @@ public class GroupBy extends StandardQueryElementCollection { private static final String DELIMETER = " "; GroupBy() { - super(GROUP_BY, DELIMETER, new ArrayList()); + super(GROUP_BY, DELIMETER, new ArrayList<>()); printNameIfEmpty(false); } /** * Add group conditions - * + * * @param groupables the group conditions * @return this */ @@ -35,4 +35,4 @@ public GroupBy by(Groupable... groupables) { return this; } -} \ No newline at end of file +} diff --git a/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/core/Groupable.java b/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/core/Groupable.java index 12ee82fa4d0..1840104a97c 100644 --- a/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/core/Groupable.java +++ b/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/core/Groupable.java @@ -1,17 +1,17 @@ /******************************************************************************* -Copyright (c) 2018 Eclipse RDF4J contributors. -All rights reserved. This program and the accompanying materials -are made available under the terms of the Eclipse Distribution License v1.0 -which accompanies this distribution, and is available at -http://www.eclipse.org/org/documents/edl-v10.php. -*******************************************************************************/ + Copyright (c) 2018 Eclipse RDF4J contributors. + All rights reserved. This program and the accompanying materials + are made available under the terms of the Eclipse Distribution License v1.0 + which accompanies this distribution, and is available at + http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ package org.eclipse.rdf4j.sparqlbuilder.core; /** * Denotes a groupable SPARQL query element (can be used in a GROUP BY clause) - * + * * @see SPARQL Group By Clause */ public interface Groupable extends QueryElement { -} \ No newline at end of file +} diff --git a/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/core/Having.java b/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/core/Having.java index a4c8ee23928..28877451fcc 100644 --- a/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/core/Having.java +++ b/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/core/Having.java @@ -1,10 +1,10 @@ /******************************************************************************* -Copyright (c) 2018 Eclipse RDF4J contributors. -All rights reserved. This program and the accompanying materials -are made available under the terms of the Eclipse Distribution License v1.0 -which accompanies this distribution, and is available at -http://www.eclipse.org/org/documents/edl-v10.php. -*******************************************************************************/ + Copyright (c) 2018 Eclipse RDF4J contributors. + All rights reserved. This program and the accompanying materials + are made available under the terms of the Eclipse Distribution License v1.0 + which accompanies this distribution, and is available at + http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ package org.eclipse.rdf4j.sparqlbuilder.core; @@ -15,7 +15,7 @@ /** * A SPARQL Having clause - * + * * @see SPARQL Having Clause */ public class Having extends StandardQueryElementCollection> { @@ -29,7 +29,7 @@ public class Having extends StandardQueryElementCollection> { /** * Add having conditions - * + * * @param expressions the conditions to add * @return this */ @@ -38,4 +38,4 @@ public Having having(Expression... expressions) { return this; } -} \ No newline at end of file +} diff --git a/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/core/OrderBy.java b/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/core/OrderBy.java index c53849ef5a4..0970cb2cf55 100644 --- a/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/core/OrderBy.java +++ b/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/core/OrderBy.java @@ -1,10 +1,10 @@ /******************************************************************************* -Copyright (c) 2018 Eclipse RDF4J contributors. -All rights reserved. This program and the accompanying materials -are made available under the terms of the Eclipse Distribution License v1.0 -which accompanies this distribution, and is available at -http://www.eclipse.org/org/documents/edl-v10.php. -*******************************************************************************/ + Copyright (c) 2018 Eclipse RDF4J contributors. + All rights reserved. This program and the accompanying materials + are made available under the terms of the Eclipse Distribution License v1.0 + which accompanies this distribution, and is available at + http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ package org.eclipse.rdf4j.sparqlbuilder.core; @@ -12,7 +12,7 @@ /** * A SPARQL Order By clause - * + * * @see SPARQL Order By Clause */ public class OrderBy extends StandardQueryElementCollection { @@ -20,13 +20,13 @@ public class OrderBy extends StandardQueryElementCollection { private static final String DELIMETER = " "; OrderBy() { - super(ORDER_BY, DELIMETER, new ArrayList()); + super(ORDER_BY, DELIMETER, new ArrayList<>()); printNameIfEmpty(false); } /** * Add order conditions - * + * * @param conditions the conditions to add * @return this */ @@ -35,4 +35,4 @@ public OrderBy by(Orderable... conditions) { return this; } -} \ No newline at end of file +} diff --git a/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/core/OrderCondition.java b/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/core/OrderCondition.java index 8cffcc97ad6..b32420ef2f0 100644 --- a/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/core/OrderCondition.java +++ b/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/core/OrderCondition.java @@ -1,10 +1,10 @@ /******************************************************************************* -Copyright (c) 2018 Eclipse RDF4J contributors. -All rights reserved. This program and the accompanying materials -are made available under the terms of the Eclipse Distribution License v1.0 -which accompanies this distribution, and is available at -http://www.eclipse.org/org/documents/edl-v10.php. -*******************************************************************************/ + Copyright (c) 2018 Eclipse RDF4J contributors. + All rights reserved. This program and the accompanying materials + are made available under the terms of the Eclipse Distribution License v1.0 + which accompanies this distribution, and is available at + http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ package org.eclipse.rdf4j.sparqlbuilder.core; @@ -12,7 +12,7 @@ /** * An ascending or descending order condition - * + * * @see SPARQL Order By Clause */ public class OrderCondition implements Orderable { @@ -36,7 +36,7 @@ public class OrderCondition implements Orderable { /** * Set this order condition to be ascending - * + * * @return this */ @Override @@ -48,7 +48,7 @@ public OrderCondition asc() { /** * Set this order condition to be descending - * + * * @return this */ @Override @@ -74,4 +74,4 @@ public String getQueryString() { return condition.toString(); } -} \ No newline at end of file +} diff --git a/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/core/Orderable.java b/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/core/Orderable.java index 53b0ac3734b..38220eeb02e 100644 --- a/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/core/Orderable.java +++ b/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/core/Orderable.java @@ -1,16 +1,16 @@ /******************************************************************************* -Copyright (c) 2018 Eclipse RDF4J contributors. -All rights reserved. This program and the accompanying materials -are made available under the terms of the Eclipse Distribution License v1.0 -which accompanies this distribution, and is available at -http://www.eclipse.org/org/documents/edl-v10.php. -*******************************************************************************/ + Copyright (c) 2018 Eclipse RDF4J contributors. + All rights reserved. This program and the accompanying materials + are made available under the terms of the Eclipse Distribution License v1.0 + which accompanies this distribution, and is available at + http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ package org.eclipse.rdf4j.sparqlbuilder.core; /** * Denotes an orederable SPARQL query element (can be used in a ORDER BY clause) - * + * * @see SPARQL Order By Clause */ public interface Orderable extends QueryElement { @@ -27,4 +27,4 @@ default public OrderCondition asc() { default public OrderCondition desc() { return SparqlBuilder.desc(this); } -} \ No newline at end of file +} diff --git a/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/core/Prefix.java b/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/core/Prefix.java index 92cf3abd61e..f7eef230086 100644 --- a/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/core/Prefix.java +++ b/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/core/Prefix.java @@ -1,10 +1,10 @@ /******************************************************************************* -Copyright (c) 2018 Eclipse RDF4J contributors. -All rights reserved. This program and the accompanying materials -are made available under the terms of the Eclipse Distribution License v1.0 -which accompanies this distribution, and is available at -http://www.eclipse.org/org/documents/edl-v10.php. -*******************************************************************************/ + Copyright (c) 2018 Eclipse RDF4J contributors. + All rights reserved. This program and the accompanying materials + are made available under the terms of the Eclipse Distribution License v1.0 + which accompanies this distribution, and is available at + http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ package org.eclipse.rdf4j.sparqlbuilder.core; @@ -12,7 +12,7 @@ /** * A SPARQL Prefix declaration - * + * * @see SPARQL Prefix */ public class Prefix implements QueryElement { @@ -27,7 +27,7 @@ public class Prefix implements QueryElement { /** * Create a prefixed IRI reference from this prefix - * + * * @param localName the local part of the prefixed IRI * @return a prefixed IRI reference, with this prefix's label as the base, and the given string for the local part */ @@ -81,4 +81,4 @@ public int hashCode() { result = prime * result + ((iri == null) ? 0 : iri.hashCode()); return result; } -} \ No newline at end of file +} diff --git a/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/core/PrefixDeclarations.java b/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/core/PrefixDeclarations.java index 7b8fc821990..6ac0c9d923d 100644 --- a/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/core/PrefixDeclarations.java +++ b/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/core/PrefixDeclarations.java @@ -1,22 +1,22 @@ /******************************************************************************* -Copyright (c) 2018 Eclipse RDF4J contributors. -All rights reserved. This program and the accompanying materials -are made available under the terms of the Eclipse Distribution License v1.0 -which accompanies this distribution, and is available at -http://www.eclipse.org/org/documents/edl-v10.php. -*******************************************************************************/ + Copyright (c) 2018 Eclipse RDF4J contributors. + All rights reserved. This program and the accompanying materials + are made available under the terms of the Eclipse Distribution License v1.0 + which accompanies this distribution, and is available at + http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ package org.eclipse.rdf4j.sparqlbuilder.core; /** * A collection of SPARQL Prefix declarations - * + * * @see SPARQL Prefix */ public class PrefixDeclarations extends StandardQueryElementCollection { /** * Add prefix declarations to this collection - * + * * @param prefixes * @return this */ @@ -25,4 +25,4 @@ public PrefixDeclarations addPrefix(Prefix... prefixes) { return this; } -} \ No newline at end of file +} diff --git a/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/core/Projectable.java b/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/core/Projectable.java index 721299ba0bc..903fe7e8605 100644 --- a/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/core/Projectable.java +++ b/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/core/Projectable.java @@ -1,17 +1,17 @@ /******************************************************************************* -Copyright (c) 2018 Eclipse RDF4J contributors. -All rights reserved. This program and the accompanying materials -are made available under the terms of the Eclipse Distribution License v1.0 -which accompanies this distribution, and is available at -http://www.eclipse.org/org/documents/edl-v10.php. -*******************************************************************************/ + Copyright (c) 2018 Eclipse RDF4J contributors. + All rights reserved. This program and the accompanying materials + are made available under the terms of the Eclipse Distribution License v1.0 + which accompanies this distribution, and is available at + http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ package org.eclipse.rdf4j.sparqlbuilder.core; /** * Denotes a projectable query element (can be SELECT'ed) - * + * * @see SPARQL Projections */ public interface Projectable extends QueryElement { -} \ No newline at end of file +} diff --git a/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/core/Projection.java b/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/core/Projection.java index 01091982f4d..abaa8bbca62 100644 --- a/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/core/Projection.java +++ b/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/core/Projection.java @@ -1,10 +1,10 @@ /******************************************************************************* -Copyright (c) 2018 Eclipse RDF4J contributors. -All rights reserved. This program and the accompanying materials -are made available under the terms of the Eclipse Distribution License v1.0 -which accompanies this distribution, and is available at -http://www.eclipse.org/org/documents/edl-v10.php. -*******************************************************************************/ + Copyright (c) 2018 Eclipse RDF4J contributors. + All rights reserved. This program and the accompanying materials + are made available under the terms of the Eclipse Distribution License v1.0 + which accompanies this distribution, and is available at + http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ package org.eclipse.rdf4j.sparqlbuilder.core; @@ -12,7 +12,7 @@ /** * A SPARQL Projection - * + * * @see SPARQL Projections */ public class Projection extends QueryElementCollection { @@ -23,16 +23,16 @@ public class Projection extends QueryElementCollection { private boolean isDistinct, selectAll; Projection() { - super(DELIMETER, new ArrayList()); + super(DELIMETER, new ArrayList<>()); all(false); distinct(false); } /** * Specify this projection to be distinct - * + * * @return this - * + * * @see SPARQL Distinct modifier */ public Projection distinct() { @@ -41,10 +41,10 @@ public Projection distinct() { /** * Specify if this projection should be distinct or not - * + * * @param isDistinct if this projection should be distinct * @return this - * + * * @see SPARQL Distinct modifier */ public Projection distinct(boolean isDistinct) { @@ -55,9 +55,9 @@ public Projection distinct(boolean isDistinct) { /** * Specify that this projection should select all in-scope expressions - * + * * @return this - * + * * @see SPARQL Select */ public Projection all() { @@ -66,10 +66,10 @@ public Projection all() { /** * Specify if this projection should select all in-scope expressions or not - * + * * @param selectAll if this projection should select all expressions * @return this - * + * * @see SPARQL Select */ public Projection all(boolean selectAll) { @@ -80,7 +80,7 @@ public Projection all(boolean selectAll) { /** * Add expressions for this projection to select - * + * * @param projectables the projectable expressions to add * @return this */ @@ -107,4 +107,4 @@ public String getQueryString() { return selectStatement.toString(); } -} \ No newline at end of file +} diff --git a/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/core/PropertyPaths.java b/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/core/PropertyPaths.java index 5d251651dbf..9a6f3c3e2a7 100644 --- a/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/core/PropertyPaths.java +++ b/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/core/PropertyPaths.java @@ -13,11 +13,11 @@ public class PropertyPaths { /** * Construct property paths for use with the {@link SparqlBuilder} - * + * *

    * Example: {@code subject.has(path(zeroOrMore(property)), object)}. *

    - * + * * @param aElements the path elements * @return a property path */ diff --git a/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/core/QueryElement.java b/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/core/QueryElement.java index ecbe4926233..2f63358829b 100644 --- a/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/core/QueryElement.java +++ b/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/core/QueryElement.java @@ -1,10 +1,10 @@ /******************************************************************************* -Copyright (c) 2018 Eclipse RDF4J contributors. -All rights reserved. This program and the accompanying materials -are made available under the terms of the Eclipse Distribution License v1.0 -which accompanies this distribution, and is available at -http://www.eclipse.org/org/documents/edl-v10.php. -*******************************************************************************/ + Copyright (c) 2018 Eclipse RDF4J contributors. + All rights reserved. This program and the accompanying materials + are made available under the terms of the Eclipse Distribution License v1.0 + which accompanies this distribution, and is available at + http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ package org.eclipse.rdf4j.sparqlbuilder.core; @@ -16,4 +16,4 @@ public interface QueryElement { * @return the String representing the SPARQL syntax of this element */ String getQueryString(); -} \ No newline at end of file +} diff --git a/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/core/QueryElementCollection.java b/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/core/QueryElementCollection.java index b16a8f93725..f1de6143856 100644 --- a/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/core/QueryElementCollection.java +++ b/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/core/QueryElementCollection.java @@ -1,14 +1,17 @@ /******************************************************************************* -Copyright (c) 2018 Eclipse RDF4J contributors. -All rights reserved. This program and the accompanying materials -are made available under the terms of the Eclipse Distribution License v1.0 -which accompanies this distribution, and is available at -http://www.eclipse.org/org/documents/edl-v10.php. -*******************************************************************************/ + Copyright (c) 2018 Eclipse RDF4J contributors. + All rights reserved. This program and the accompanying materials + are made available under the terms of the Eclipse Distribution License v1.0 + which accompanies this distribution, and is available at + http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ package org.eclipse.rdf4j.sparqlbuilder.core; -import java.util.*; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.LinkedHashSet; import java.util.function.Function; import java.util.stream.Collectors; @@ -55,4 +58,4 @@ protected void addElements(Function mapper, O... os) public String getQueryString() { return elements.stream().map(QueryElement::getQueryString).collect(Collectors.joining(delimiter)); } -} \ No newline at end of file +} diff --git a/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/core/QueryPattern.java b/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/core/QueryPattern.java index d044e32ace6..7e57b41f0ef 100644 --- a/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/core/QueryPattern.java +++ b/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/core/QueryPattern.java @@ -1,10 +1,10 @@ /******************************************************************************* -Copyright (c) 2018 Eclipse RDF4J contributors. -All rights reserved. This program and the accompanying materials -are made available under the terms of the Eclipse Distribution License v1.0 -which accompanies this distribution, and is available at -http://www.eclipse.org/org/documents/edl-v10.php. -*******************************************************************************/ + Copyright (c) 2018 Eclipse RDF4J contributors. + All rights reserved. This program and the accompanying materials + are made available under the terms of the Eclipse Distribution License v1.0 + which accompanies this distribution, and is available at + http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ package org.eclipse.rdf4j.sparqlbuilder.core; @@ -40,7 +40,7 @@ public QueryPattern where(GraphPattern... patterns) { /** * Set this query pattern's where clause - * + * * @param where the {@link GraphPatternNotTriples} instance to set the where clause to * @return this QueryPattern instance */ diff --git a/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/core/SparqlBuilder.java b/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/core/SparqlBuilder.java index 51cd81b6f61..ff535b03dd5 100644 --- a/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/core/SparqlBuilder.java +++ b/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/core/SparqlBuilder.java @@ -1,10 +1,10 @@ /******************************************************************************* -Copyright (c) 2018 Eclipse RDF4J contributors. -All rights reserved. This program and the accompanying materials -are made available under the terms of the Eclipse Distribution License v1.0 -which accompanies this distribution, and is available at -http://www.eclipse.org/org/documents/edl-v10.php. -*******************************************************************************/ + Copyright (c) 2018 Eclipse RDF4J contributors. + All rights reserved. This program and the accompanying materials + are made available under the terms of the Eclipse Distribution License v1.0 + which accompanies this distribution, and is available at + http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ package org.eclipse.rdf4j.sparqlbuilder.core; @@ -27,7 +27,7 @@ private SparqlBuilder() { /** * Create a SPARQL variable with a specific alias. - * + * * @param varName the alias of the variable * @return a new SPARQL variable */ @@ -37,7 +37,7 @@ public static Variable var(String varName) { /** * Create a SPARQL assignment - * + * * @param exp the expression to evaluate * @param var the variable to bind the expression value to * @return an Assignment object @@ -48,7 +48,7 @@ public static Assignment as(Assignable exp, Variable var) { /** * Create a SPARQL Base declaration - * + * * @param iri the base iri * @return a Base object */ @@ -58,7 +58,7 @@ public static Base base(Iri iri) { /** * Create a SPARQL Prefix declaration - * + * * @param alias the alias of the prefix * @param iri the iri the alias refers to * @return a Prefix object @@ -69,7 +69,7 @@ public static Prefix prefix(String alias, Iri iri) { /** * Create a SPARQL default Prefix declaration - * + * * @param iri the default iri prefix * @return a Prefix object */ @@ -79,7 +79,7 @@ public static Prefix prefix(Iri iri) { /** * Create SPARQL Prefix declaration from the given {@link Namespace}. - * + * * @param namespace the {@link Namespace} to convert to a prefix declaration. * @return a Prefix object. */ @@ -89,7 +89,7 @@ public static Prefix prefix(Namespace namespace) { /** * Create a SPARQL default Prefix declaration - * + * * @param iri the default iri prefix as an {@link IRI}. * @return a Prefix object */ @@ -99,7 +99,7 @@ public static Prefix prefix(IRI iri) { /** * Create a SPARQL Prefix clause - * + * * @param prefixes prefix declarations to add to this Prefix clause * @return a new */ @@ -109,7 +109,7 @@ public static PrefixDeclarations prefixes(Prefix... prefixes) { /** * Create a default graph reference - * + * * @param iri the source of the graph * @return a From clause * @see RDF Datasets @@ -131,7 +131,7 @@ public static From fromNamed(Iri iri) { /** * Create a dataset declaration - * + * * @param graphs * @return a new dataset clause * @see RDF Datasets @@ -142,7 +142,7 @@ public static Dataset dataset(From... graphs) { /** * Create a SPARQL projection - * + * * @param projectables projectable elements to add to the projection * @return a Projection */ @@ -152,7 +152,7 @@ public static Projection select(Projectable... projectables) { /** * Create a SPARQL graph template - * + * * @param triples triples to add to the template * @return a new SPARQL graph template */ @@ -162,7 +162,7 @@ public static GraphTemplate construct(TriplePattern... triples) { /** * Create a SPARQL query pattern - * + * * @param patterns graph patterns to add to the query pattern * @return a new Query Pattern */ @@ -172,7 +172,7 @@ public static QueryPattern where(GraphPattern... patterns) { /** * Create a SPARQL Group By clause - * + * * @param groupables the group conditions * @return a Group By clause */ @@ -182,7 +182,7 @@ public static GroupBy groupBy(Groupable... groupables) { /** * Create a SPARQL Order clause - * + * * @param conditions the order conditions * @return an Order By clause */ @@ -192,7 +192,7 @@ public static OrderBy orderBy(Orderable... conditions) { /** * Create a SPARQL Having clause - * + * * @param expressions the having conditions * @return a Having clause */ @@ -202,7 +202,7 @@ public static Having having(Expression... expressions) { /** * Create an ascending SPARQL order condition - * + * * @param orderOn the order comparator * @return an ASC() order condition */ @@ -212,7 +212,7 @@ public static OrderCondition asc(Orderable orderOn) { /** * Create a descending SPARQL order condition - * + * * @param orderOn the order comparator * @return a DESC() order condition */ @@ -222,11 +222,11 @@ public static OrderCondition desc(Orderable orderOn) { /** * Create a TriplesTemplate instance, for use with Construct and Update queries - * + * * @param triples the triples to include in the triples template * @return a TriplesTemplate of the given triples */ public static TriplesTemplate triplesTemplate(TriplePattern... triples) { return new TriplesTemplate(triples); } -} \ No newline at end of file +} diff --git a/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/core/StandardQueryElementCollection.java b/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/core/StandardQueryElementCollection.java index 16ac69a1b41..5a64bd37047 100644 --- a/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/core/StandardQueryElementCollection.java +++ b/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/core/StandardQueryElementCollection.java @@ -1,10 +1,10 @@ /******************************************************************************* -Copyright (c) 2018 Eclipse RDF4J contributors. -All rights reserved. This program and the accompanying materials -are made available under the terms of the Eclipse Distribution License v1.0 -which accompanies this distribution, and is available at -http://www.eclipse.org/org/documents/edl-v10.php. -*******************************************************************************/ + Copyright (c) 2018 Eclipse RDF4J contributors. + All rights reserved. This program and the accompanying materials + are made available under the terms of the Eclipse Distribution License v1.0 + which accompanies this distribution, and is available at + http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ package org.eclipse.rdf4j.sparqlbuilder.core; diff --git a/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/core/TriplesTemplate.java b/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/core/TriplesTemplate.java index aaa90d39ef8..1ebd895a73a 100644 --- a/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/core/TriplesTemplate.java +++ b/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/core/TriplesTemplate.java @@ -1,10 +1,10 @@ /******************************************************************************* -Copyright (c) 2018 Eclipse RDF4J contributors. -All rights reserved. This program and the accompanying materials -are made available under the terms of the Eclipse Distribution License v1.0 -which accompanies this distribution, and is available at -http://www.eclipse.org/org/documents/edl-v10.php. -*******************************************************************************/ + Copyright (c) 2018 Eclipse RDF4J contributors. + All rights reserved. This program and the accompanying materials + are made available under the terms of the Eclipse Distribution License v1.0 + which accompanies this distribution, and is available at + http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ package org.eclipse.rdf4j.sparqlbuilder.core; @@ -28,9 +28,9 @@ public class TriplesTemplate extends StandardQueryElementCollection SPARQL Variable Syntax */ public class Variable implements Projectable, RdfSubject, RdfPredicate, RdfObject, Operand, Orderable, Groupable, @@ -63,4 +63,4 @@ public int hashCode() { result = prime * result + ((alias == null) ? 0 : alias.hashCode()); return result; } -} \ No newline at end of file +} diff --git a/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/core/query/AddQuery.java b/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/core/query/AddQuery.java index d1d091f7e99..07fc048a7e1 100644 --- a/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/core/query/AddQuery.java +++ b/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/core/query/AddQuery.java @@ -1,16 +1,16 @@ /******************************************************************************* -Copyright (c) 2018 Eclipse RDF4J contributors. -All rights reserved. This program and the accompanying materials -are made available under the terms of the Eclipse Distribution License v1.0 -which accompanies this distribution, and is available at -http://www.eclipse.org/org/documents/edl-v10.php. -*******************************************************************************/ + Copyright (c) 2018 Eclipse RDF4J contributors. + All rights reserved. This program and the accompanying materials + are made available under the terms of the Eclipse Distribution License v1.0 + which accompanies this distribution, and is available at + http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ package org.eclipse.rdf4j.sparqlbuilder.core.query; /** * A SPARQL ADD Query - * + * * @see SPARQL ADD Query */ public class AddQuery extends DestinationSourceManagementQuery { diff --git a/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/core/query/ClearQuery.java b/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/core/query/ClearQuery.java index ba65746ba1a..1cd298f1117 100644 --- a/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/core/query/ClearQuery.java +++ b/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/core/query/ClearQuery.java @@ -1,18 +1,18 @@ /******************************************************************************* -Copyright (c) 2018 Eclipse RDF4J contributors. -All rights reserved. This program and the accompanying materials -are made available under the terms of the Eclipse Distribution License v1.0 -which accompanies this distribution, and is available at -http://www.eclipse.org/org/documents/edl-v10.php. -*******************************************************************************/ + Copyright (c) 2018 Eclipse RDF4J contributors. + All rights reserved. This program and the accompanying materials + are made available under the terms of the Eclipse Distribution License v1.0 + which accompanies this distribution, and is available at + http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ package org.eclipse.rdf4j.sparqlbuilder.core.query; /** * A SPARQL CLEAR Query - * + * * @see SPARQL CLEAR Query - * + * */ public class ClearQuery extends TargetedGraphManagementQuery { private static final String CLEAR = "CLEAR"; diff --git a/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/core/query/ConstructQuery.java b/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/core/query/ConstructQuery.java index 4411e52fd34..2ae90fa80d2 100644 --- a/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/core/query/ConstructQuery.java +++ b/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/core/query/ConstructQuery.java @@ -1,10 +1,10 @@ /******************************************************************************* -Copyright (c) 2018 Eclipse RDF4J contributors. -All rights reserved. This program and the accompanying materials -are made available under the terms of the Eclipse Distribution License v1.0 -which accompanies this distribution, and is available at -http://www.eclipse.org/org/documents/edl-v10.php. -*******************************************************************************/ + Copyright (c) 2018 Eclipse RDF4J contributors. + All rights reserved. This program and the accompanying materials + are made available under the terms of the Eclipse Distribution License v1.0 + which accompanies this distribution, and is available at + http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ package org.eclipse.rdf4j.sparqlbuilder.core.query; @@ -14,7 +14,7 @@ /** * The SPARQL CONSTRUCT query - * + * * @see SPARQL CONSTRUCT Query */ public class ConstructQuery extends OuterQuery { @@ -26,7 +26,7 @@ public class ConstructQuery extends OuterQuery { /** * Add triples to this query's graph template - * + * * @param patterns the triples to include in the graph template * @return this */ @@ -38,7 +38,7 @@ public ConstructQuery construct(TriplePattern... patterns) { /** * Set this query's graph template - * + * * @param construct the {@link GraphTemplate} to set * @return this */ @@ -52,4 +52,4 @@ public ConstructQuery construct(GraphTemplate construct) { protected String getQueryActionString() { return construct.getQueryString(); } -} \ No newline at end of file +} diff --git a/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/core/query/CopyQuery.java b/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/core/query/CopyQuery.java index af36f55da22..ef84481f0bd 100644 --- a/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/core/query/CopyQuery.java +++ b/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/core/query/CopyQuery.java @@ -1,16 +1,16 @@ /******************************************************************************* -Copyright (c) 2018 Eclipse RDF4J contributors. -All rights reserved. This program and the accompanying materials -are made available under the terms of the Eclipse Distribution License v1.0 -which accompanies this distribution, and is available at -http://www.eclipse.org/org/documents/edl-v10.php. -*******************************************************************************/ + Copyright (c) 2018 Eclipse RDF4J contributors. + All rights reserved. This program and the accompanying materials + are made available under the terms of the Eclipse Distribution License v1.0 + which accompanies this distribution, and is available at + http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ package org.eclipse.rdf4j.sparqlbuilder.core.query; /** * A SPARQL COPY Query - * + * * @see SPARQL COPY query */ public class CopyQuery extends DestinationSourceManagementQuery { diff --git a/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/core/query/CreateQuery.java b/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/core/query/CreateQuery.java index 589974a8419..530121cab9e 100644 --- a/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/core/query/CreateQuery.java +++ b/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/core/query/CreateQuery.java @@ -1,10 +1,10 @@ /******************************************************************************* -Copyright (c) 2018 Eclipse RDF4J contributors. -All rights reserved. This program and the accompanying materials -are made available under the terms of the Eclipse Distribution License v1.0 -which accompanies this distribution, and is available at -http://www.eclipse.org/org/documents/edl-v10.php. -*******************************************************************************/ + Copyright (c) 2018 Eclipse RDF4J contributors. + All rights reserved. This program and the accompanying materials + are made available under the terms of the Eclipse Distribution License v1.0 + which accompanies this distribution, and is available at + http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ package org.eclipse.rdf4j.sparqlbuilder.core.query; @@ -12,7 +12,7 @@ /** * A SPARQL CREATE Query - * + * * @see SPARQL CREATE Query */ public class CreateQuery extends GraphManagementQuery { @@ -26,9 +26,9 @@ public class CreateQuery extends GraphManagementQuery { /** * Specify the graph to create - * + * * @param graph the IRI identifier for the new graph - * + * * @return this CreateQuery instance */ public CreateQuery graph(Iri graph) { diff --git a/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/core/query/DeleteDataQuery.java b/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/core/query/DeleteDataQuery.java index 3bf1950ca24..09f1295c4dc 100644 --- a/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/core/query/DeleteDataQuery.java +++ b/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/core/query/DeleteDataQuery.java @@ -1,10 +1,10 @@ /******************************************************************************* -Copyright (c) 2018 Eclipse RDF4J contributors. -All rights reserved. This program and the accompanying materials -are made available under the terms of the Eclipse Distribution License v1.0 -which accompanies this distribution, and is available at -http://www.eclipse.org/org/documents/edl-v10.php. -*******************************************************************************/ + Copyright (c) 2018 Eclipse RDF4J contributors. + All rights reserved. This program and the accompanying materials + are made available under the terms of the Eclipse Distribution License v1.0 + which accompanies this distribution, and is available at + http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ package org.eclipse.rdf4j.sparqlbuilder.core.query; @@ -14,18 +14,18 @@ /** * The SPARQL Delete Data Query - * + * * @see SPARQL DELETE DATA Query - * + * */ public class DeleteDataQuery extends UpdateDataQuery { private static final String DELETE_DATA = "DELETE DATA"; /** * Add triples to be deleted - * + * * @param triples the triples to add to this delete data query - * + * * @return this Delete Data query instance */ public DeleteDataQuery deleteData(TriplePattern... triples) { @@ -34,9 +34,9 @@ public DeleteDataQuery deleteData(TriplePattern... triples) { /** * Set this query's triples template - * + * * @param triplesTemplate the {@link TriplesTemplate} instance to set - * + * * @return this instance */ public DeleteDataQuery deleteData(TriplesTemplate triplesTemplate) { @@ -45,9 +45,9 @@ public DeleteDataQuery deleteData(TriplesTemplate triplesTemplate) { /** * Specify a graph to delete the data from - * + * * @param graph the identifier of the graph - * + * * @return this Delete Data query instance */ public DeleteDataQuery from(GraphName graph) { diff --git a/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/core/query/DestinationSourceManagementQuery.java b/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/core/query/DestinationSourceManagementQuery.java index a965b7f5292..58ce30aa284 100644 --- a/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/core/query/DestinationSourceManagementQuery.java +++ b/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/core/query/DestinationSourceManagementQuery.java @@ -1,10 +1,10 @@ /******************************************************************************* -Copyright (c) 2018 Eclipse RDF4J contributors. -All rights reserved. This program and the accompanying materials -are made available under the terms of the Eclipse Distribution License v1.0 -which accompanies this distribution, and is available at -http://www.eclipse.org/org/documents/edl-v10.php. -*******************************************************************************/ + Copyright (c) 2018 Eclipse RDF4J contributors. + All rights reserved. This program and the accompanying materials + are made available under the terms of the Eclipse Distribution License v1.0 + which accompanies this distribution, and is available at + http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ package org.eclipse.rdf4j.sparqlbuilder.core.query; @@ -28,9 +28,9 @@ public abstract class DestinationSourceManagementQuery SPARQL DROP Query */ public class DropQuery extends TargetedGraphManagementQuery { diff --git a/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/core/query/GraphManagementQuery.java b/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/core/query/GraphManagementQuery.java index c26d1ee5880..e7cbd6656ed 100644 --- a/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/core/query/GraphManagementQuery.java +++ b/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/core/query/GraphManagementQuery.java @@ -1,10 +1,10 @@ /******************************************************************************* -Copyright (c) 2018 Eclipse RDF4J contributors. -All rights reserved. This program and the accompanying materials -are made available under the terms of the Eclipse Distribution License v1.0 -which accompanies this distribution, and is available at -http://www.eclipse.org/org/documents/edl-v10.php. -*******************************************************************************/ + Copyright (c) 2018 Eclipse RDF4J contributors. + All rights reserved. This program and the accompanying materials + are made available under the terms of the Eclipse Distribution License v1.0 + which accompanies this distribution, and is available at + http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ package org.eclipse.rdf4j.sparqlbuilder.core.query; @@ -20,7 +20,7 @@ abstract class GraphManagementQuery> implement /** * Set the SILENT option to true on this query - * + * * @return this query instance */ public T silent() { @@ -29,9 +29,9 @@ public T silent() { /** * Specify if the SILENT option should be on for this query - * + * * @param isSilent if this should be a SILENT operation or not - * + * * @return this query instance */ @SuppressWarnings("unchecked") diff --git a/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/core/query/InsertDataQuery.java b/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/core/query/InsertDataQuery.java index 7cd5134dc92..a273a6ab377 100644 --- a/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/core/query/InsertDataQuery.java +++ b/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/core/query/InsertDataQuery.java @@ -1,10 +1,10 @@ /******************************************************************************* -Copyright (c) 2018 Eclipse RDF4J contributors. -All rights reserved. This program and the accompanying materials -are made available under the terms of the Eclipse Distribution License v1.0 -which accompanies this distribution, and is available at -http://www.eclipse.org/org/documents/edl-v10.php. -*******************************************************************************/ + Copyright (c) 2018 Eclipse RDF4J contributors. + All rights reserved. This program and the accompanying materials + are made available under the terms of the Eclipse Distribution License v1.0 + which accompanies this distribution, and is available at + http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ package org.eclipse.rdf4j.sparqlbuilder.core.query; @@ -14,18 +14,18 @@ /** * The SPARQL Insert Data Query - * + * * @see SPARQL INSERT DATA Query - * + * */ public class InsertDataQuery extends UpdateDataQuery { private static final String INSERT_DATA = "INSERT DATA"; /** * Add triples to be inserted - * + * * @param triples the triples to add to this insert data query - * + * * @return this Insert Data query instance */ public InsertDataQuery insertData(TriplePattern... triples) { @@ -34,9 +34,9 @@ public InsertDataQuery insertData(TriplePattern... triples) { /** * Set this query's triples template - * + * * @param triplesTemplate the {@link TriplesTemplate} instance to set - * + * * @return this instance */ public InsertDataQuery insertData(TriplesTemplate triplesTemplate) { @@ -45,9 +45,9 @@ public InsertDataQuery insertData(TriplesTemplate triplesTemplate) { /** * Specify a graph to insert the data into - * + * * @param graph the identifier of the graph - * + * * @return this Insert Data query instance */ public InsertDataQuery into(GraphName graph) { diff --git a/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/core/query/LoadQuery.java b/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/core/query/LoadQuery.java index 341521ba771..292c1b9f966 100644 --- a/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/core/query/LoadQuery.java +++ b/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/core/query/LoadQuery.java @@ -1,10 +1,10 @@ /******************************************************************************* -Copyright (c) 2018 Eclipse RDF4J contributors. -All rights reserved. This program and the accompanying materials -are made available under the terms of the Eclipse Distribution License v1.0 -which accompanies this distribution, and is available at -http://www.eclipse.org/org/documents/edl-v10.php. -*******************************************************************************/ + Copyright (c) 2018 Eclipse RDF4J contributors. + All rights reserved. This program and the accompanying materials + are made available under the terms of the Eclipse Distribution License v1.0 + which accompanies this distribution, and is available at + http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ package org.eclipse.rdf4j.sparqlbuilder.core.query; @@ -15,7 +15,7 @@ /** * A SPARQL LOAD Query - * + * * @see SPARQL LOAD Query */ public class LoadQuery extends GraphManagementQuery { @@ -30,9 +30,9 @@ public class LoadQuery extends GraphManagementQuery { /** * Specify which graph to load form - * + * * @param from the IRI identifying the graph to load triples from - * + * * @return this LoadQuery instance */ public LoadQuery from(Iri from) { @@ -43,9 +43,9 @@ public LoadQuery from(Iri from) { /** * Specify which graph to load into, if not the default graph - * + * * @param to the IRI identifying the graph to load into - * + * * @return this LoadQuery instance */ public LoadQuery to(Iri to) { diff --git a/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/core/query/ModifyQuery.java b/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/core/query/ModifyQuery.java index 9e3c9483ec2..1b6d8630586 100644 --- a/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/core/query/ModifyQuery.java +++ b/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/core/query/ModifyQuery.java @@ -1,10 +1,10 @@ /******************************************************************************* -Copyright (c) 2018 Eclipse RDF4J contributors. -All rights reserved. This program and the accompanying materials -are made available under the terms of the Eclipse Distribution License v1.0 -which accompanies this distribution, and is available at -http://www.eclipse.org/org/documents/edl-v10.php. -*******************************************************************************/ + Copyright (c) 2018 Eclipse RDF4J contributors. + All rights reserved. This program and the accompanying materials + are made available under the terms of the Eclipse Distribution License v1.0 + which accompanies this distribution, and is available at + http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ package org.eclipse.rdf4j.sparqlbuilder.core.query; @@ -21,7 +21,7 @@ /** * The SPARQL Modify Queries - * + * * @see SPARQL DELETE/INSERT Query */ public class ModifyQuery extends UpdateQuery { @@ -47,9 +47,9 @@ public class ModifyQuery extends UpdateQuery { /** * Define the graph that will be modified or matched against in the absence of more explicit graph definitions - * + * * @param iri the IRI identifying the desired graph - * + * * @return this modify query instance */ public ModifyQuery with(Iri iri) { @@ -60,11 +60,11 @@ public ModifyQuery with(Iri iri) { /** * Specify triples to delete (or leave empty for DELETE WHERE shortcut) - * + * * @param triples the triples to delete - * + * * @return this modify query instance - * + * * @see SPARQL DELETE WHERE shortcut */ public ModifyQuery delete(TriplePattern... triples) { @@ -76,9 +76,9 @@ public ModifyQuery delete(TriplePattern... triples) { /** * Specify the graph to delete triples from - * + * * @param graphName the identifier of the graph - * + * * @return this modify query instance */ public ModifyQuery from(GraphName graphName) { @@ -89,9 +89,9 @@ public ModifyQuery from(GraphName graphName) { /** * Specify triples to insert - * + * * @param triples the triples to insert - * + * * @return this modify query instance */ public ModifyQuery insert(TriplePattern... triples) { @@ -103,9 +103,9 @@ public ModifyQuery insert(TriplePattern... triples) { /** * Specify the graph to insert triples into - * + * * @param graphName the identifier of the graph - * + * * @return this modify query instance */ public ModifyQuery into(GraphName graphName) { @@ -116,9 +116,9 @@ public ModifyQuery into(GraphName graphName) { /** * Specify the graph used when evaluating the WHERE clause - * + * * @param iri the IRI identifying the desired graph - * + * * @return this modify query instance */ public ModifyQuery using(Iri iri) { @@ -129,9 +129,9 @@ public ModifyQuery using(Iri iri) { /** * Specify a named graph to use to when evaluating the WHERE clause - * + * * @param iri the IRI identifying the desired graph - * + * * @return this modify query instance */ public ModifyQuery usingNamed(Iri iri) { @@ -142,9 +142,9 @@ public ModifyQuery usingNamed(Iri iri) { /** * Add graph patterns to this query's query pattern - * + * * @param patterns the patterns to add - * + * * @return this modify query instance */ public ModifyQuery where(GraphPattern... patterns) { @@ -191,4 +191,4 @@ protected String getQueryActionString() { return modifyQuery.toString(); } -} \ No newline at end of file +} diff --git a/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/core/query/MoveQuery.java b/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/core/query/MoveQuery.java index ec0b171990e..77a890de5bb 100644 --- a/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/core/query/MoveQuery.java +++ b/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/core/query/MoveQuery.java @@ -1,16 +1,16 @@ /******************************************************************************* -Copyright (c) 2018 Eclipse RDF4J contributors. -All rights reserved. This program and the accompanying materials -are made available under the terms of the Eclipse Distribution License v1.0 -which accompanies this distribution, and is available at -http://www.eclipse.org/org/documents/edl-v10.php. -*******************************************************************************/ + Copyright (c) 2018 Eclipse RDF4J contributors. + All rights reserved. This program and the accompanying materials + are made available under the terms of the Eclipse Distribution License v1.0 + which accompanies this distribution, and is available at + http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ package org.eclipse.rdf4j.sparqlbuilder.core.query; /** * A SPARQL MOVE Query - * + * * @see SPARQL MOVE Query */ public class MoveQuery extends DestinationSourceManagementQuery { diff --git a/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/core/query/OuterQuery.java b/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/core/query/OuterQuery.java index 977f22a7235..2f4dc7ee829 100644 --- a/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/core/query/OuterQuery.java +++ b/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/core/query/OuterQuery.java @@ -1,10 +1,10 @@ /******************************************************************************* -Copyright (c) 2018 Eclipse RDF4J contributors. -All rights reserved. This program and the accompanying materials -are made available under the terms of the Eclipse Distribution License v1.0 -which accompanies this distribution, and is available at -http://www.eclipse.org/org/documents/edl-v10.php. -*******************************************************************************/ + Copyright (c) 2018 Eclipse RDF4J contributors. + All rights reserved. This program and the accompanying materials + are made available under the terms of the Eclipse Distribution License v1.0 + which accompanies this distribution, and is available at + http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ package org.eclipse.rdf4j.sparqlbuilder.core.query; @@ -19,7 +19,7 @@ /** * A non-subquery query. - * + * * @param The query type. Used to support fluency. */ @SuppressWarnings("unchecked") @@ -29,7 +29,7 @@ public abstract class OuterQuery> extends Query { /** * Set the base IRI of this query - * + * * @param iri the base IRI * @return this */ @@ -41,7 +41,7 @@ public T base(Iri iri) { /** * Set the Base clause of this query - * + * * @param base the {@link Base} clause to set * @return this */ @@ -53,7 +53,7 @@ public T base(Base base) { /** * Add prefix declarations to this query - * + * * @param prefixes the prefixes to add * @return this */ @@ -66,7 +66,7 @@ public T prefix(Prefix... prefixes) { /** * Set the Prefix declarations of this query - * + * * @param prefixes the {@link PrefixDeclarations} to set * @return this */ @@ -87,4 +87,4 @@ public String getQueryString() { return query.toString(); } -} \ No newline at end of file +} diff --git a/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/core/query/Queries.java b/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/core/query/Queries.java index cd2ceb12f03..76dc644436b 100644 --- a/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/core/query/Queries.java +++ b/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/core/query/Queries.java @@ -1,10 +1,10 @@ /******************************************************************************* -Copyright (c) 2018 Eclipse RDF4J contributors. -All rights reserved. This program and the accompanying materials -are made available under the terms of the Eclipse Distribution License v1.0 -which accompanies this distribution, and is available at -http://www.eclipse.org/org/documents/edl-v10.php. -*******************************************************************************/ + Copyright (c) 2018 Eclipse RDF4J contributors. + All rights reserved. This program and the accompanying materials + are made available under the terms of the Eclipse Distribution License v1.0 + which accompanies this distribution, and is available at + http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ package org.eclipse.rdf4j.sparqlbuilder.core.query; @@ -16,7 +16,7 @@ /** * A class with static methods to create SPARQL queries - * + * * @see SPARQL Query Language */ public class Queries { @@ -26,11 +26,11 @@ private Queries() { /** * Create a SPARQL Select query - * + * * @param projectables the initial set of {@link Projectable}(s), if any, to select - * + * * @return a new {@link SelectQuery} - * + * * @see SPARQL Select Query */ public static SelectQuery SELECT(Projectable... projectables) { @@ -39,10 +39,10 @@ public static SelectQuery SELECT(Projectable... projectables) { /** * Create a SPARQL Select query - * + * * @param select the {@link Projection} to set initially * @return a new {@link SelectQuery} - * + * * @see SPARQL Select Query */ public static SelectQuery SELECT(Projection select) { @@ -51,10 +51,10 @@ public static SelectQuery SELECT(Projection select) { /** * Create a SPARQL Construct query - * + * * @param patterns the initial set of {@link TriplePattern}(s), if any, to construct * @return a new {@link ConstructQuery} - * + * * @see SPARQL Construct Query */ public static ConstructQuery CONSTRUCT(TriplePattern... patterns) { @@ -63,10 +63,10 @@ public static ConstructQuery CONSTRUCT(TriplePattern... patterns) { /** * Create a SPARQL Construct query - * + * * @param construct the {@link GraphTemplate} to set initially * @return a new {@link ConstructQuery} - * + * * @see SPARQL Construct Query */ public static ConstructQuery CONSTRUCT(GraphTemplate construct) { @@ -75,11 +75,11 @@ public static ConstructQuery CONSTRUCT(GraphTemplate construct) { /** * Create a SPARQL INSERT DATA query - * + * * @param triples the initial set of {@link TriplePattern}(s), if any, to use - * + * * @return a new {@link InsertDataQuery} - * + * * @see SPARQL INSERT DATA Query */ public static InsertDataQuery INSERT_DATA(TriplePattern... triples) { @@ -88,11 +88,11 @@ public static InsertDataQuery INSERT_DATA(TriplePattern... triples) { /** * Create a SPARQL INSERT DATA query - * + * * @param triplesTemplate the {@link TriplesTemplate} to set initially - * + * * @return a new {@link InsertDataQuery} - * + * * @see SPARQL INSERT DATA Query */ public static InsertDataQuery INSERT_DATA(TriplesTemplate triplesTemplate) { @@ -101,11 +101,11 @@ public static InsertDataQuery INSERT_DATA(TriplesTemplate triplesTemplate) { /** * Create a SPARQL DELETE DATA query - * + * * @param triples the initial set of {@link TriplePattern}(s), if any, to use - * + * * @return a new {@link DeleteDataQuery} - * + * * @see SPARQL DELETE DATA Query */ public static DeleteDataQuery DELETE_DATA(TriplePattern... triples) { @@ -114,11 +114,11 @@ public static DeleteDataQuery DELETE_DATA(TriplePattern... triples) { /** * Create a SPARQL DELETE DATA query - * + * * @param triplesTemplate the {@link TriplesTemplate} to set initially - * + * * @return a new {@link DeleteDataQuery} - * + * * @see SPARQL DELETE DATA Query */ public static DeleteDataQuery DELETE_DATA(TriplesTemplate triplesTemplate) { @@ -127,9 +127,9 @@ public static DeleteDataQuery DELETE_DATA(TriplesTemplate triplesTemplate) { /** * Creates a SPARQL Modify query - * + * * @return a new {@link ModifyQuery} - * + * * @see SPARQL Modify Query */ public static ModifyQuery MODIFY() { @@ -138,10 +138,10 @@ public static ModifyQuery MODIFY() { /** * Convenience method, creates a SPARQL DELETE query using ModifyQuery. - * + * * @param triples the initial set of {@link TriplePattern}(s), if any, to use * @return a new {@link ModifyQuery} - * + * * @see SPARQL DELETE Query */ public static ModifyQuery DELETE(TriplePattern... triples) { @@ -153,7 +153,7 @@ public static ModifyQuery DELETE(TriplePattern... triples) { * * @param triples the initial set of {@link TriplePattern}(s), if any, to use * @return a new {@link ModifyQuery} - * + * * @see SPARQL INSERT Query */ public static ModifyQuery INSERT(TriplePattern... triples) { @@ -162,9 +162,9 @@ public static ModifyQuery INSERT(TriplePattern... triples) { /** * Creates a SPARQL LOAD query - * + * * @return a new {@link LoadQuery} - * + * * @see SPARQL LOAD Query */ public static LoadQuery LOAD() { @@ -173,9 +173,9 @@ public static LoadQuery LOAD() { /** * Creates a SPARQL CLEAR Query - * + * * @return a new {@link ClearQuery} - * + * * @see SPARQL CLEAR Query */ public static ClearQuery CLEAR() { @@ -184,9 +184,9 @@ public static ClearQuery CLEAR() { /** * Creates a SPARQL CREATE Query - * + * * @return a new {@link CreateQuery} - * + * * @see SPARQL CREATE Query */ public static CreateQuery CREATE() { @@ -195,9 +195,9 @@ public static CreateQuery CREATE() { /** * Creates a SPARQL DROP Query - * + * * @return a new {@link DropQuery} - * + * * @see SPARQL DROP Query */ public static DropQuery DROP() { @@ -206,9 +206,9 @@ public static DropQuery DROP() { /** * Creates a SPARQL COPY Query - * + * * @return a new {@link CopyQuery} - * + * * @see SPARQL COPY Query */ public static CopyQuery COPY() { @@ -217,9 +217,9 @@ public static CopyQuery COPY() { /** * Creates a SPARQL MOVE Query - * + * * @return a new {@link MoveQuery} - * + * * @see SPARQL MOVE Query */ public static MoveQuery MOVE() { @@ -228,12 +228,12 @@ public static MoveQuery MOVE() { /** * Creates a new SPARQL ADD Query - * + * * @return a new {@link AddQuery} - * + * * @see SPARQL ADD Query */ public static AddQuery ADD() { return new AddQuery(); } -} \ No newline at end of file +} diff --git a/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/core/query/Query.java b/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/core/query/Query.java index e284cbe44d7..aa706b77bce 100644 --- a/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/core/query/Query.java +++ b/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/core/query/Query.java @@ -1,10 +1,10 @@ /******************************************************************************* -Copyright (c) 2018 Eclipse RDF4J contributors. -All rights reserved. This program and the accompanying materials -are made available under the terms of the Eclipse Distribution License v1.0 -which accompanies this distribution, and is available at -http://www.eclipse.org/org/documents/edl-v10.php. -*******************************************************************************/ + Copyright (c) 2018 Eclipse RDF4J contributors. + All rights reserved. This program and the accompanying materials + are made available under the terms of the Eclipse Distribution License v1.0 + which accompanies this distribution, and is available at + http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ package org.eclipse.rdf4j.sparqlbuilder.core.query; @@ -29,7 +29,7 @@ /** * The base class for all SPARQL Queries. Contains elements and methods common to all queries. - * + * * @param They type of query. Used to support fluency. */ @SuppressWarnings("unchecked") @@ -70,10 +70,10 @@ public T from(Dataset from) { /** * Add graph patterns to this query's query pattern - * + * * @param queryPatterns the patterns to add * @return this - * + * * @see QueryPattern */ public T where(GraphPattern... queryPatterns) { @@ -84,7 +84,7 @@ public T where(GraphPattern... queryPatterns) { /** * Set the query pattern of this query - * + * * @param where the query pattern to set * @return this */ @@ -96,10 +96,10 @@ public T where(QueryPattern where) { /** * Add grouping specifiers for the query results. - * + * * @param groupables the objects to group on, in order (appended to the end of any existing grouping specifiers) * @return this - * + * * @see GroupBy */ public T groupBy(Groupable... groupables) { @@ -111,7 +111,7 @@ public T groupBy(Groupable... groupables) { /** * Set this query's Group By clause - * + * * @param groupBy the {@link GroupBy} clause to set * @return this */ @@ -123,10 +123,10 @@ public T groupBy(GroupBy groupBy) { /** * Specify orderings for the query results - * + * * @param conditions the objects to order on, in order * @return this - * + * * @see OrderBy */ public T orderBy(Orderable... conditions) { @@ -138,7 +138,7 @@ public T orderBy(Orderable... conditions) { /** * Set this query's Order By clause - * + * * @param orderBy the {@link OrderBy} clause to set * @return this */ @@ -150,10 +150,10 @@ public T orderBy(OrderBy orderBy) { /** * Specify constraints for this query's Having clause. - * + * * @param constraints the constraints to add to the clause * @return this - * + * * @see Having */ public T having(Expression... constraints) { @@ -165,7 +165,7 @@ public T having(Expression... constraints) { /** * Set this query's Having clause - * + * * @param having the Having clause to set * @return this */ @@ -177,10 +177,10 @@ public T having(Having having) { /** * Set a limit on the number of results returned by this query. - * + * * @param limit * @return this - * + * * @see Limits in SPARQL * Queries */ @@ -192,10 +192,10 @@ public T limit(int limit) { /** * Specify an offset in query results. - * + * * @param offset * @return this - * + * * @see Offsets in SPARQL Queries */ public T offset(int offset) { @@ -207,7 +207,7 @@ public T offset(int offset) { /** * A shortcut. Each call to this method returns a new {@link Variable} that is unique (i.e., has a unique alias) to * this query instance. - * + * * @return a {@link Variable} object that is unique to this query instance */ public Variable var() { @@ -252,4 +252,4 @@ public String getQueryString() { return query.toString(); } -} \ No newline at end of file +} diff --git a/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/core/query/SelectQuery.java b/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/core/query/SelectQuery.java index 3c07fc55944..7b9fabdbf0d 100644 --- a/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/core/query/SelectQuery.java +++ b/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/core/query/SelectQuery.java @@ -1,10 +1,10 @@ /******************************************************************************* -Copyright (c) 2018 Eclipse RDF4J contributors. -All rights reserved. This program and the accompanying materials -are made available under the terms of the Eclipse Distribution License v1.0 -which accompanies this distribution, and is available at -http://www.eclipse.org/org/documents/edl-v10.php. -*******************************************************************************/ + Copyright (c) 2018 Eclipse RDF4J contributors. + All rights reserved. This program and the accompanying materials + are made available under the terms of the Eclipse Distribution License v1.0 + which accompanies this distribution, and is available at + http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ package org.eclipse.rdf4j.sparqlbuilder.core.query; @@ -14,7 +14,7 @@ /** * A SPARQL Select query - * + * * @see SPARQL Select Query */ public class SelectQuery extends OuterQuery { @@ -26,9 +26,9 @@ public class SelectQuery extends OuterQuery { /** * Specify the query's projection to be distinct - * + * * @return this - * + * * @see Projection#distinct() */ public SelectQuery distinct() { @@ -37,10 +37,10 @@ public SelectQuery distinct() { /** * Specify if the query's projection should be distinct or not - * + * * @param isDistinct if this query's projection should be distinct * @return this - * + * * @see Projection#distinct(boolean) */ public SelectQuery distinct(boolean isDistinct) { @@ -54,9 +54,9 @@ public SelectQuery distinct(boolean isDistinct) { *

    * NOTE: setting this takes precedence over any expressions added to the projection via * {@link #select(Projectable...)} or {@link #select(Projection)} when printing - * + * * @return this - * + * * @see Projection#all() */ public SelectQuery all() { @@ -69,10 +69,10 @@ public SelectQuery all() { * NOTE: if called with true, this setting will take precedence over any expressions added to the * projection via {@link #select(Projectable...)} or {@link #select(Projection)} when converting to string via * {@link #getQueryString()} - * + * * @param selectAll if all in-scope expressions should be selected * @return this - * + * * @see Projection#all(boolean) */ public SelectQuery all(boolean selectAll) { @@ -86,10 +86,10 @@ public SelectQuery all(boolean selectAll) { *

    * NOTE: if SELECT * has been specified (by {@link #all()} or calling {@link #all(boolean)} with true), * that will take precedence over specified expressions when converting to string via {@link #getQueryString()} - * + * * @param projectables expressions to add * @return this - * + * * @see Projection#select(Projectable...) */ public SelectQuery select(Projectable... projectables) { @@ -103,7 +103,7 @@ public SelectQuery select(Projectable... projectables) { *

    * NOTE: if SELECT * has been specified (by {@link #all()} or calling {@link #all(boolean)} with true), * that will take precedence over specified expressions when converting to string via {@link #getQueryString()} - * + * * @param select the {@link Projection} to set * @return this */ @@ -117,4 +117,4 @@ public SelectQuery select(Projection select) { protected String getQueryActionString() { return select.getQueryString(); } -} \ No newline at end of file +} diff --git a/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/core/query/TargetedGraphManagementQuery.java b/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/core/query/TargetedGraphManagementQuery.java index 9f7ddc8351a..2b343241fe6 100644 --- a/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/core/query/TargetedGraphManagementQuery.java +++ b/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/core/query/TargetedGraphManagementQuery.java @@ -1,10 +1,10 @@ /******************************************************************************* -Copyright (c) 2018 Eclipse RDF4J contributors. -All rights reserved. This program and the accompanying materials -are made available under the terms of the Eclipse Distribution License v1.0 -which accompanies this distribution, and is available at -http://www.eclipse.org/org/documents/edl-v10.php. -*******************************************************************************/ + Copyright (c) 2018 Eclipse RDF4J contributors. + All rights reserved. This program and the accompanying materials + are made available under the terms of the Eclipse Distribution License v1.0 + which accompanies this distribution, and is available at + http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ package org.eclipse.rdf4j.sparqlbuilder.core.query; @@ -25,9 +25,9 @@ public abstract class TargetedGraphManagementQuery The type of update query. Used to support fluency. * * @see SPARQL Update Query @@ -37,7 +37,7 @@ abstract class UpdateQuery> implements QueryElement { /** * Set the base IRI of this query - * + * * @param iri the base IRI * @return this */ @@ -49,7 +49,7 @@ public T base(Iri iri) { /** * Set the Base clause of this query - * + * * @param base the {@link Base} clause to set * @return this */ @@ -61,7 +61,7 @@ public T base(Base base) { /** * Add prefix declarations to this query - * + * * @param prefixes the prefixes to add * @return this */ @@ -74,7 +74,7 @@ public T prefix(Prefix... prefixes) { /** * Set the Prefix declarations of this query - * + * * @param prefixes the {@link PrefixDeclarations} to set * @return this */ diff --git a/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/graphpattern/AlternativeGraphPattern.java b/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/graphpattern/AlternativeGraphPattern.java index db6e6edd0e1..97d7118c90d 100644 --- a/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/graphpattern/AlternativeGraphPattern.java +++ b/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/graphpattern/AlternativeGraphPattern.java @@ -1,10 +1,10 @@ /******************************************************************************* -Copyright (c) 2018 Eclipse RDF4J contributors. -All rights reserved. This program and the accompanying materials -are made available under the terms of the Eclipse Distribution License v1.0 -which accompanies this distribution, and is available at -http://www.eclipse.org/org/documents/edl-v10.php. -*******************************************************************************/ + Copyright (c) 2018 Eclipse RDF4J contributors. + All rights reserved. This program and the accompanying materials + are made available under the terms of the Eclipse Distribution License v1.0 + which accompanies this distribution, and is available at + http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ package org.eclipse.rdf4j.sparqlbuilder.graphpattern; @@ -12,7 +12,7 @@ /** * A SPARQL Alternative Graph Pattern. - * + * * @see SPARQL Alternative Graph * Patterns */ @@ -44,4 +44,4 @@ public AlternativeGraphPattern union(GraphPattern... patterns) { return this; } -} \ No newline at end of file +} diff --git a/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/graphpattern/BNodeTriplePattern.java b/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/graphpattern/BNodeTriplePattern.java index 4e6dd9a9c30..22c446dd2b4 100644 --- a/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/graphpattern/BNodeTriplePattern.java +++ b/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/graphpattern/BNodeTriplePattern.java @@ -1,10 +1,10 @@ /******************************************************************************* -Copyright (c) 2018 Eclipse RDF4J contributors. -All rights reserved. This program and the accompanying materials -are made available under the terms of the Eclipse Distribution License v1.0 -which accompanies this distribution, and is available at -http://www.eclipse.org/org/documents/edl-v10.php. -*******************************************************************************/ + Copyright (c) 2018 Eclipse RDF4J contributors. + All rights reserved. This program and the accompanying materials + are made available under the terms of the Eclipse Distribution License v1.0 + which accompanies this distribution, and is available at + http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ package org.eclipse.rdf4j.sparqlbuilder.graphpattern; @@ -13,7 +13,7 @@ /** * A triple pattern formed by a property-list blank node - * + * * @see blank node syntax */ class BNodeTriplePattern implements TriplePattern { diff --git a/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/graphpattern/Filter.java b/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/graphpattern/Filter.java index b3bed0b5ea1..04ed6d44885 100644 --- a/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/graphpattern/Filter.java +++ b/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/graphpattern/Filter.java @@ -1,10 +1,10 @@ /******************************************************************************* -Copyright (c) 2018 Eclipse RDF4J contributors. -All rights reserved. This program and the accompanying materials -are made available under the terms of the Eclipse Distribution License v1.0 -which accompanies this distribution, and is available at -http://www.eclipse.org/org/documents/edl-v10.php. -*******************************************************************************/ + Copyright (c) 2018 Eclipse RDF4J contributors. + All rights reserved. This program and the accompanying materials + are made available under the terms of the Eclipse Distribution License v1.0 + which accompanies this distribution, and is available at + http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ package org.eclipse.rdf4j.sparqlbuilder.graphpattern; @@ -16,7 +16,7 @@ /** * A SPARQL Filter Clause - * + * * @see SPARQL Filter */ class Filter implements QueryElement { @@ -33,7 +33,7 @@ class Filter implements QueryElement { /** * Set the constraint for this Filter clause - * + * * @param expression the constraint to set * @return this */ @@ -53,4 +53,4 @@ public String getQueryString() { return filter.toString(); } -} \ No newline at end of file +} diff --git a/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/graphpattern/FilterExistsGraphPattern.java b/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/graphpattern/FilterExistsGraphPattern.java index 80a898a8d1c..da0baf5b28f 100644 --- a/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/graphpattern/FilterExistsGraphPattern.java +++ b/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/graphpattern/FilterExistsGraphPattern.java @@ -1,16 +1,16 @@ /******************************************************************************* -Copyright (c) 2018 Eclipse RDF4J contributors. -All rights reserved. This program and the accompanying materials -are made available under the terms of the Eclipse Distribution License v1.0 -which accompanies this distribution, and is available at -http://www.eclipse.org/org/documents/edl-v10.php. -*******************************************************************************/ + Copyright (c) 2018 Eclipse RDF4J contributors. + All rights reserved. This program and the accompanying materials + are made available under the terms of the Eclipse Distribution License v1.0 + which accompanies this distribution, and is available at + http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ package org.eclipse.rdf4j.sparqlbuilder.graphpattern; /** * A SPARQL Graph Pattern Filter - * + * * @see Filtering using Graph Pattern */ class FilterExistsGraphPattern extends GroupGraphPattern { @@ -42,4 +42,4 @@ public String getQueryString() { return filterExists.append(super.getQueryString()).toString(); } -} \ No newline at end of file +} diff --git a/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/graphpattern/GraphName.java b/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/graphpattern/GraphName.java index 06fd2198e27..3efd3e19a3e 100644 --- a/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/graphpattern/GraphName.java +++ b/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/graphpattern/GraphName.java @@ -1,10 +1,10 @@ /******************************************************************************* -Copyright (c) 2018 Eclipse RDF4J contributors. -All rights reserved. This program and the accompanying materials -are made available under the terms of the Eclipse Distribution License v1.0 -which accompanies this distribution, and is available at -http://www.eclipse.org/org/documents/edl-v10.php. -*******************************************************************************/ + Copyright (c) 2018 Eclipse RDF4J contributors. + All rights reserved. This program and the accompanying materials + are made available under the terms of the Eclipse Distribution License v1.0 + which accompanies this distribution, and is available at + http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ package org.eclipse.rdf4j.sparqlbuilder.graphpattern; @@ -12,8 +12,8 @@ /** * Denotes a query element that can be used as a Graph Name - * + * * @see Specifying Datasets */ public interface GraphName extends QueryElement { -} \ No newline at end of file +} diff --git a/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/graphpattern/GraphPattern.java b/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/graphpattern/GraphPattern.java index db2845d78be..c53d5525265 100644 --- a/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/graphpattern/GraphPattern.java +++ b/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/graphpattern/GraphPattern.java @@ -1,10 +1,10 @@ /******************************************************************************* -Copyright (c) 2018 Eclipse RDF4J contributors. -All rights reserved. This program and the accompanying materials -are made available under the terms of the Eclipse Distribution License v1.0 -which accompanies this distribution, and is available at -http://www.eclipse.org/org/documents/edl-v10.php. -*******************************************************************************/ + Copyright (c) 2018 Eclipse RDF4J contributors. + All rights reserved. This program and the accompanying materials + are made available under the terms of the Eclipse Distribution License v1.0 + which accompanies this distribution, and is available at + http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ package org.eclipse.rdf4j.sparqlbuilder.graphpattern; @@ -13,7 +13,7 @@ /** * Denotes a SPARQL Graph Pattern - * + * * @see SPARQL Graph Patterns */ public interface GraphPattern extends QueryElement { @@ -216,4 +216,4 @@ default GraphPattern from(GraphName name) { default boolean isEmpty() { return true; } -} \ No newline at end of file +} diff --git a/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/graphpattern/GraphPatternNotTriples.java b/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/graphpattern/GraphPatternNotTriples.java index c85c08ea82b..bae94349d23 100644 --- a/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/graphpattern/GraphPatternNotTriples.java +++ b/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/graphpattern/GraphPatternNotTriples.java @@ -15,7 +15,7 @@ public class GraphPatternNotTriples implements GraphPattern { /** * Like {@link GraphPattern#and(GraphPattern...)}, but mutates and returns this instance - * + * * @param patterns the patterns to add * @return this */ @@ -28,7 +28,7 @@ public GraphPatternNotTriples and(GraphPattern... patterns) { /** * Like {@link GraphPattern#union(GraphPattern...)}, but mutates and returns this instance - * + * * @param patterns the patterns to add * @return this */ @@ -41,7 +41,7 @@ public GraphPatternNotTriples union(GraphPattern... patterns) { /** * Like {@link GraphPattern#optional()}, but mutates and returns this instance - * + * * @return this */ @Override @@ -53,7 +53,7 @@ public GraphPatternNotTriples optional() { /** * Like {@link GraphPattern#optional(boolean)}, but mutates and returns this instance - * + * * @param isOptional if this graph pattern should be optional or not * @return this */ @@ -66,7 +66,7 @@ public GraphPatternNotTriples optional(boolean isOptional) { /** * Like {@link GraphPattern#filter(Expression)}, but mutates and returns this instance - * + * * @param constraint the filter constraint * @return this */ @@ -79,7 +79,7 @@ public GraphPatternNotTriples filter(Expression constraint) { /** * Like {@link GraphPattern#minus(GraphPattern...)}, but mutates and returns this instance - * + * * @param patterns the patterns to construct the MINUS graph pattern with * @return this */ @@ -92,7 +92,7 @@ public GraphPatternNotTriples minus(GraphPattern... patterns) { /** * Like {@link GraphPattern#from(GraphName)}, but mutates and returns this instance - * + * * @param name the name to specify * @return this */ diff --git a/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/graphpattern/GraphPatterns.java b/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/graphpattern/GraphPatterns.java index 428bd3c0fd8..46904a433c0 100644 --- a/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/graphpattern/GraphPatterns.java +++ b/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/graphpattern/GraphPatterns.java @@ -1,10 +1,10 @@ /******************************************************************************* -Copyright (c) 2018 Eclipse RDF4J contributors. -All rights reserved. This program and the accompanying materials -are made available under the terms of the Eclipse Distribution License v1.0 -which accompanies this distribution, and is available at -http://www.eclipse.org/org/documents/edl-v10.php. -*******************************************************************************/ + Copyright (c) 2018 Eclipse RDF4J contributors. + All rights reserved. This program and the accompanying materials + are made available under the terms of the Eclipse Distribution License v1.0 + which accompanies this distribution, and is available at + http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ package org.eclipse.rdf4j.sparqlbuilder.graphpattern; @@ -22,7 +22,7 @@ /** * A class with static methods to create graph patterns. - * + * * @see SPARQL Graph Pattern */ public class GraphPatterns { @@ -32,13 +32,13 @@ private GraphPatterns() { /** * Create a triple pattern with the given subject, predicate, and object(s) - * + * * @param subject * @param predicate * @param objects - * + * * @return a new {@link TriplePattern} - * + * * @see Triple pattern syntax */ public static TriplePattern tp(RdfSubject subject, RdfPredicate predicate, RdfObject... objects) { @@ -51,13 +51,13 @@ public static TriplePattern tp(RdfSubject subject, RdfPredicate predicate, Value /** * Create a triple pattern with the given subject, predicate, and object(s) - * + * * @param subject the triple pattern subject * @param predicate the triple pattern predicate as a {@link IRI} * @param objects the triples pattern object(s) - * + * * @return a new {@link TriplePattern} - * + * * @see Triple pattern syntax */ public static TriplePattern tp(RdfSubject subject, IRI predicate, RdfObject... objects) { @@ -70,13 +70,13 @@ public static TriplePattern tp(RdfSubject subject, IRI predicate, Value... objec /** * Create a triple pattern with the given subject, predicate, and object(s) - * + * * @param subject the triple pattern subject * @param predicate the triple pattern predicate as a {@link IRI} * @param objects the triples pattern object(s) - * + * * @return a new {@link TriplePattern} - * + * * @see Triple pattern syntax */ public static TriplePattern tp(Resource subject, RdfPredicate predicate, RdfObject... objects) { @@ -92,13 +92,13 @@ public static TriplePattern tp(Resource subject, RdfPredicate predicate, Value.. /** * Create a triple pattern with the given subject, predicate, and object(s) - * + * * @param subject the triple pattern subject as a {@link Resource} * @param predicate the triple pattern predicate as a {@link IRI} * @param objects the triples pattern object(s) - * + * * @return a new {@link TriplePattern} - * + * * @see Triple pattern syntax */ public static TriplePattern tp(Resource subject, IRI predicate, RdfObject... objects) { @@ -111,12 +111,12 @@ public static TriplePattern tp(Resource subject, IRI predicate, Value... objects /** * Create a triple pattern with the given subject and predicate-object list(s) - * + * * @param subject * @param lists - * + * * @return a new {@link TriplePattern} - * + * * @see Triple pattern syntax */ public static TriplePattern tp(RdfSubject subject, RdfPredicateObjectList... lists) { @@ -125,11 +125,11 @@ public static TriplePattern tp(RdfSubject subject, RdfPredicateObjectList... lis /** * Create a triple pattern from a property-list blank node - * + * * @param bnode the PropertiesBlankNode instance to convert to a triple pattern - * + * * @return the triple pattern represented by the expansion of this blank node - * + * * @see blank node syntax */ public static TriplePattern tp(PropertiesBlankNode bnode) { @@ -138,10 +138,10 @@ public static TriplePattern tp(PropertiesBlankNode bnode) { /** * Create a group graph pattern containing the given graph patterns - * + * * @param patterns the patterns to include in the group graph a pattern * @return a new group graph pattern - * + * * @see SPARQL Group Graph * Pattern */ @@ -153,14 +153,14 @@ public static GraphPatternNotTriples and(GraphPattern... patterns) { /** * Create an alternative graph pattern containing the union of the given graph patterns:
    - * + * *

     	 * { { pattern1 } UNION { pattern2 } UNION ... UNION { patternN } }
     	 * 
    - * + * * @param patterns the patterns to include in the union * @return a new alternative graph pattern - * + * * @see SPARQL Alternative Graph * Patterns */ @@ -172,7 +172,7 @@ public static GraphPatternNotTriples union(GraphPattern... patterns) { /** * Create an optional group graph pattern containing the given graph patterns:
    - * + * *
     	 * {
     	 *   OPTIONAL {
    @@ -183,10 +183,10 @@ public static GraphPatternNotTriples union(GraphPattern... patterns) {
     	 *   }
     	 * }
     	 * 
    - * + * * @param patterns the patterns to include in the optional graph pattern * @return a new optional graph pattern - * + * * @see SPARQL Optional Graph * Patterns */ @@ -218,10 +218,10 @@ public static GraphPatternNotTriples filterExists(boolean exists, GraphPattern.. /** * Create a SPARQL subquery, including the given elements in its projection. - * + * * @param projectables the elements to include in the projection of the subquery * @return a new subquery - * + * * @see SPARQL Subquery */ public static SubSelect select(Projectable... projectables) { @@ -242,4 +242,4 @@ static GroupGraphPattern extractOrConvertToGGP(GraphPattern pattern) { return new GroupGraphPattern(pattern); } -} \ No newline at end of file +} diff --git a/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/graphpattern/GroupGraphPattern.java b/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/graphpattern/GroupGraphPattern.java index 51368a26056..2664f2fa76c 100644 --- a/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/graphpattern/GroupGraphPattern.java +++ b/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/graphpattern/GroupGraphPattern.java @@ -1,10 +1,10 @@ /******************************************************************************* -Copyright (c) 2018 Eclipse RDF4J contributors. -All rights reserved. This program and the accompanying materials -are made available under the terms of the Eclipse Distribution License v1.0 -which accompanies this distribution, and is available at -http://www.eclipse.org/org/documents/edl-v10.php. -*******************************************************************************/ + Copyright (c) 2018 Eclipse RDF4J contributors. + All rights reserved. This program and the accompanying materials + are made available under the terms of the Eclipse Distribution License v1.0 + which accompanies this distribution, and is available at + http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ package org.eclipse.rdf4j.sparqlbuilder.graphpattern; @@ -16,7 +16,7 @@ /** * A SPARQL Group Graph Pattern - * + * * @see SPARQL Group Graph Patterns */ class GroupGraphPattern extends QueryElementCollection implements GraphPattern { diff --git a/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/graphpattern/MinusGraphPattern.java b/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/graphpattern/MinusGraphPattern.java index 2cca3965290..9f8973423b5 100644 --- a/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/graphpattern/MinusGraphPattern.java +++ b/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/graphpattern/MinusGraphPattern.java @@ -1,10 +1,10 @@ /******************************************************************************* -Copyright (c) 2018 Eclipse RDF4J contributors. -All rights reserved. This program and the accompanying materials -are made available under the terms of the Eclipse Distribution License v1.0 -which accompanies this distribution, and is available at -http://www.eclipse.org/org/documents/edl-v10.php. -*******************************************************************************/ + Copyright (c) 2018 Eclipse RDF4J contributors. + All rights reserved. This program and the accompanying materials + are made available under the terms of the Eclipse Distribution License v1.0 + which accompanies this distribution, and is available at + http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ package org.eclipse.rdf4j.sparqlbuilder.graphpattern; @@ -15,4 +15,4 @@ class MinusGraphPattern extends GroupGraphPattern { public String getQueryString() { return MINUS + " " + super.getQueryString(); } -} \ No newline at end of file +} diff --git a/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/graphpattern/SubSelect.java b/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/graphpattern/SubSelect.java index 015a0a76286..2693a79d8a1 100644 --- a/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/graphpattern/SubSelect.java +++ b/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/graphpattern/SubSelect.java @@ -1,10 +1,10 @@ /******************************************************************************* -Copyright (c) 2018 Eclipse RDF4J contributors. -All rights reserved. This program and the accompanying materials -are made available under the terms of the Eclipse Distribution License v1.0 -which accompanies this distribution, and is available at -http://www.eclipse.org/org/documents/edl-v10.php. -*******************************************************************************/ + Copyright (c) 2018 Eclipse RDF4J contributors. + All rights reserved. This program and the accompanying materials + are made available under the terms of the Eclipse Distribution License v1.0 + which accompanies this distribution, and is available at + http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ package org.eclipse.rdf4j.sparqlbuilder.graphpattern; @@ -16,7 +16,7 @@ /** * A SPARQL subquery - * + * * @see SPARQL Subquery */ public class SubSelect extends Query implements GraphPattern { @@ -29,9 +29,9 @@ public class SubSelect extends Query implements GraphPattern { /** * Specify the query's projection to be distinct - * + * * @return this - * + * * @see Projection#distinct() */ public SubSelect distinct() { @@ -40,10 +40,10 @@ public SubSelect distinct() { /** * Specify if the query's projection should be distinct or not - * + * * @param isDistinct if this query's projection should be distinct * @return this - * + * * @see Projection#distinct(boolean) */ public SubSelect distinct(boolean isDistinct) { @@ -57,9 +57,9 @@ public SubSelect distinct(boolean isDistinct) { *

    * NOTE: setting this takes precedence over any expressions added to the projection via * {@link #select(Projectable...)} when printing - * + * * @return this - * + * * @see Projection#all() */ public SubSelect all() { @@ -71,10 +71,10 @@ public SubSelect all() { *

    * NOTE: if called with true, this setting will take precedence over any expressions added to the * projection via {@link #select(Projectable...)} when printing - * + * * @param selectAll if all in-scope expressions should be selected * @return this - * + * * @see Projection#all(boolean) */ public SubSelect all(boolean selectAll) { @@ -88,10 +88,10 @@ public SubSelect all(boolean selectAll) { *

    * NOTE: if SELECT * has been specified (by {@link #all()} or calling {@link #all(boolean)} with true), * that will take precedence over specified expressions when converting to string via {@link #getQueryString()} - * + * * @param projectables expressions to add * @return this - * + * * @see Projection#select(Projectable...) */ public SubSelect select(Projectable... projectables) { @@ -102,7 +102,7 @@ public SubSelect select(Projectable... projectables) { /** * Set this query's projection - * + * * @param select the {@link Projection} to set * @return this */ @@ -135,4 +135,4 @@ public String getQueryString() { return SparqlBuilderUtils.getBracedString(subSelect.toString()); } -} \ No newline at end of file +} diff --git a/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/graphpattern/TriplePattern.java b/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/graphpattern/TriplePattern.java index 6d840543c6d..b27337b5c01 100644 --- a/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/graphpattern/TriplePattern.java +++ b/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/graphpattern/TriplePattern.java @@ -1,10 +1,10 @@ /******************************************************************************* -Copyright (c) 2018 Eclipse RDF4J contributors. -All rights reserved. This program and the accompanying materials -are made available under the terms of the Eclipse Distribution License v1.0 -which accompanies this distribution, and is available at -http://www.eclipse.org/org/documents/edl-v10.php. -*******************************************************************************/ + Copyright (c) 2018 Eclipse RDF4J contributors. + All rights reserved. This program and the accompanying materials + are made available under the terms of the Eclipse Distribution License v1.0 + which accompanies this distribution, and is available at + http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ package org.eclipse.rdf4j.sparqlbuilder.graphpattern; @@ -17,7 +17,7 @@ /** * Denotes a SPARQL Triple Pattern - * + * * @see Triple pattern syntax * @see blank node syntax */ @@ -27,10 +27,10 @@ public interface TriplePattern extends GraphPattern { /** * Add predicate-object lists describing this triple pattern's subject - * + * * @param predicate the predicate to use to describe this triple pattern's subject * @param objects the corresponding object(s) - * + * * @return this triple pattern */ default TriplePattern andHas(RdfPredicate predicate, RdfObject... objects) { @@ -39,9 +39,9 @@ default TriplePattern andHas(RdfPredicate predicate, RdfObject... objects) { /** * Add predicate-object lists describing this triple pattern's subject - * + * * @param lists the {@link RdfPredicateObjectList}(s) to add - * + * * @return this triple pattern */ TriplePattern andHas(RdfPredicateObjectList... lists); @@ -49,49 +49,55 @@ default TriplePattern andHas(RdfPredicate predicate, RdfObject... objects) { /** * Convenience version of {@link #andHas(RdfPredicate, RdfObject...)} that takes Strings and converts them to * StringLiterals - * + * * @param predicate the predicate to use to describe this triple pattern's subject * @param objects the corresponding object(s) - * + * * @return this triple pattern */ default TriplePattern andHas(RdfPredicate predicate, String... objects) { return andHas(predicate, toRdfLiteralArray(objects)); - }; + } + + ; /** * Convenience version of {@link #andHas(RdfPredicate, RdfObject...)} that takes Boolean and converts them to * BooleanLiterals - * + * * @param predicate the predicate to use to describe this triple pattern's subject * @param objects the corresponding object(s) - * + * * @return this triple pattern */ default TriplePattern andHas(RdfPredicate predicate, Boolean... objects) { return andHas(predicate, toRdfLiteralArray(objects)); - }; + } + + ; /** * Convenience version of {@link #andHas(RdfPredicate, RdfObject...)} that takes Numbers and converts them to * NumberLiterals - * + * * @param predicate the predicate to use to describe this triple pattern's subject * @param objects the corresponding object(s) - * + * * @return this triple pattern */ default TriplePattern andHas(RdfPredicate predicate, Number... objects) { return andHas(predicate, toRdfLiteralArray(objects)); - }; + } + + ; /** * Use the built-in RDF shortcut {@code a} for {@code rdf:type} to specify the subject's type - * + * * @param object the object describing this triple pattern's subject's {@code rdf:type} - * + * * @return this triple pattern - * + * * @see RDF Type abbreviation */ default TriplePattern andIsA(RdfObject object) { diff --git a/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/graphpattern/TriplesSameSubject.java b/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/graphpattern/TriplesSameSubject.java index e3d942f2620..0d80aef7b7c 100644 --- a/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/graphpattern/TriplesSameSubject.java +++ b/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/graphpattern/TriplesSameSubject.java @@ -1,10 +1,10 @@ /******************************************************************************* -Copyright (c) 2018 Eclipse RDF4J contributors. -All rights reserved. This program and the accompanying materials -are made available under the terms of the Eclipse Distribution License v1.0 -which accompanies this distribution, and is available at -http://www.eclipse.org/org/documents/edl-v10.php. -*******************************************************************************/ + Copyright (c) 2018 Eclipse RDF4J contributors. + All rights reserved. This program and the accompanying materials + are made available under the terms of the Eclipse Distribution License v1.0 + which accompanies this distribution, and is available at + http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ package org.eclipse.rdf4j.sparqlbuilder.graphpattern; @@ -17,7 +17,7 @@ /** * A SPARQL Triple Pattern. - * + * * @see Triple pattern syntax */ class TriplesSameSubject implements TriplePattern { @@ -45,4 +45,4 @@ public TriplesSameSubject andHas(RdfPredicateObjectList... lists) { public String getQueryString() { return subject.getQueryString() + " " + predicateObjectLists.getQueryString() + SUFFIX; } -} \ No newline at end of file +} diff --git a/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/rdf/Iri.java b/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/rdf/Iri.java index 6686989ff14..7d256864f86 100644 --- a/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/rdf/Iri.java +++ b/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/rdf/Iri.java @@ -1,10 +1,10 @@ /******************************************************************************* -Copyright (c) 2018 Eclipse RDF4J contributors. -All rights reserved. This program and the accompanying materials -are made available under the terms of the Eclipse Distribution License v1.0 -which accompanies this distribution, and is available at -http://www.eclipse.org/org/documents/edl-v10.php. -*******************************************************************************/ + Copyright (c) 2018 Eclipse RDF4J contributors. + All rights reserved. This program and the accompanying materials + are made available under the terms of the Eclipse Distribution License v1.0 + which accompanies this distribution, and is available at + http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ package org.eclipse.rdf4j.sparqlbuilder.rdf; @@ -13,8 +13,8 @@ /** * Denotes an RDF IRI - * + * * @see RDF IRIs */ public interface Iri extends RdfResource, RdfPredicate, GraphName, SparqlOperator { -} \ No newline at end of file +} diff --git a/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/rdf/Rdf.java b/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/rdf/Rdf.java index 7a1431d5cc4..f88e31fffca 100644 --- a/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/rdf/Rdf.java +++ b/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/rdf/Rdf.java @@ -1,10 +1,10 @@ /******************************************************************************* -Copyright (c) 2018 Eclipse RDF4J contributors. -All rights reserved. This program and the accompanying materials -are made available under the terms of the Eclipse Distribution License v1.0 -which accompanies this distribution, and is available at -http://www.eclipse.org/org/documents/edl-v10.php. -*******************************************************************************/ + Copyright (c) 2018 Eclipse RDF4J contributors. + All rights reserved. This program and the accompanying materials + are made available under the terms of the Eclipse Distribution License v1.0 + which accompanies this distribution, and is available at + http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ package org.eclipse.rdf4j.sparqlbuilder.rdf; @@ -33,7 +33,7 @@ private Rdf() { /** * Create a SparqlBuilder Iri instance from a String iri - * + * * @param iriString the String representing the iri * @return the {@link Iri} instance */ @@ -53,7 +53,7 @@ public static Iri iri(String iriString) { /** * Create a SparqlBuilder Iri instance from an {@link IRI} - * + * * @param iri the IRI * @return the SparqlBuilder {@link Iri} instance */ @@ -63,7 +63,7 @@ public static Iri iri(IRI iri) { /** * Create a SparqlBuilder Iri instance from a namespace and local name - * + * * @param namespace the namespace of the Iri * @param localName the local name of the Iri * @return a {@link Iri} instance @@ -74,7 +74,7 @@ public static Iri iri(String namespace, String localName) { /** * creates a labeled blank node - * + * * @param label the label of the blank node * @return a new {@link LabeledBlankNode} instance */ @@ -84,7 +84,7 @@ public static LabeledBlankNode bNode(String label) { /** * creates a label-less blank node, identified by the supplied predicate-object lists - * + * * @param predicate the predicate of the initial predicate-object list to populate this blank node with * @param objects the objects of the initial predicate-object list to populate this blank node with * @return a new {@link PropertiesBlankNode} instance @@ -96,7 +96,7 @@ public static PropertiesBlankNode bNode(RdfPredicate predicate, RdfObject... obj /** * create an empty anonymous blank node - * + * * @return an empty {@link AnonymousBlankNode} instance */ public static AnonymousBlankNode bNode() { @@ -105,7 +105,7 @@ public static AnonymousBlankNode bNode() { /** * create an RDF string literal - * + * * @param stringValue the String instance to create a literal from * @return a {@link StringLiteral} instance representing the given String */ @@ -115,7 +115,7 @@ public static StringLiteral literalOf(String stringValue) { /** * create a literal with a datatype - * + * * @param stringValue the literal string * @param dataType the datatype tag * @return a {@link StringLiteral} instance representing the given String and datatype @@ -126,7 +126,7 @@ public static StringLiteral literalOfType(String stringValue, Iri dataType) { /** * create a literal with a datatype - * + * * @param stringValue the literal string * @param dataType the datatype as a {@link IRI} * @return a {@link StringLiteral} instance representing the given String and datatype @@ -137,7 +137,7 @@ public static StringLiteral literalOfType(String stringValue, IRI dataType) { /** * create a literal with a language tag - * + * * @param stringValue the literal string * @param language the language tag * @return a {@link StringLiteral} instance representing the given String and language @@ -148,7 +148,7 @@ public static StringLiteral literalOfLanguage(String stringValue, String languag /** * create an RDF numeric literal - * + * * @param numberValue the Number instance to create a literal from * @return a {@link NumericLiteral} instance representing the given Number */ @@ -158,7 +158,7 @@ public static NumericLiteral literalOf(Number numberValue) { /** * create an RDF boolean literal - * + * * @param boolValue the boolean to create a literal from * @return a {@link BooleanLiteral} instance representing the given boolean */ @@ -168,7 +168,7 @@ public static BooleanLiteral literalOf(Boolean boolValue) { /** * Create a {@link RdfPredicateObjectList} - * + * * @param predicate the {@link RdfPredicate} of the predicate-object list * @param objects the {@link RdfObject}(s) of the list * @return a new {@link RdfPredicateObjectList} @@ -179,7 +179,7 @@ public static RdfPredicateObjectList predicateObjectList(RdfPredicate predicate, /** * Create a {@link RdfPredicateObjectListCollection} with an initial {@link RdfPredicateObjectList} - * + * * @param predicate the {@link RdfPredicate} of the initial {@link RdfPredicateObjectList} * @param objects the {@link RdfObject}(s) of the initial {@link RdfPredicateObjectList} * @return a new {@link RdfPredicateObjectListCollection} @@ -191,7 +191,7 @@ public static RdfPredicateObjectListCollection predicateObjectListCollection(Rdf /** * Create a {@link RdfPredicateObjectListCollection} with the given {@link RdfPredicateObjectList}(s) - * + * * @param predicateObjectLists the {@link RdfPredicateObjectList}(s) to add to the collection * @return a new {@link RdfPredicateObjectListCollection} */ @@ -202,7 +202,7 @@ public static RdfPredicateObjectListCollection predicateObjectListCollection( /** * Converts an array of object {@link Value}s to an array of {@link RdfObject}s. - * + * * @param values an array of {@link Value}. * @return an array of {@link RdfObject} */ @@ -212,7 +212,7 @@ public static RdfObject[] objects(Value... values) { /** * Converts an object {@link Value}s to an {@link RdfObject}s. - * + * * @param value an RDF {@link Value}. * @return an {@link RdfObject} */ @@ -235,7 +235,7 @@ public static RdfObject object(Value value) { /** * Convert an array of {@link String}s to an array of {@link StringLiteral}s - * + * * @param literals the {@link String}s to convert * @return an array of the corresponding {@link StringLiteral}s */ @@ -245,7 +245,7 @@ public static StringLiteral[] toRdfLiteralArray(String... literals) { /** * Convert an array of {@link Boolean}s to an array of {@link BooleanLiteral}s - * + * * @param literals the {@link Boolean}s to convert * @return an array of the corresponding {@link BooleanLiteral}s */ @@ -255,7 +255,7 @@ public static BooleanLiteral[] toRdfLiteralArray(Boolean... literals) { /** * Convert an array of {@link Number}s to an array of {@link NumericLiteral}s - * + * * @param literals the {@link Number}s to convert * @return an array of the corresponding {@link NumericLiteral}s */ diff --git a/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/rdf/RdfBlankNode.java b/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/rdf/RdfBlankNode.java index d6870e5b241..f8f9fec3dc9 100644 --- a/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/rdf/RdfBlankNode.java +++ b/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/rdf/RdfBlankNode.java @@ -1,10 +1,10 @@ /******************************************************************************* -Copyright (c) 2018 Eclipse RDF4J contributors. -All rights reserved. This program and the accompanying materials -are made available under the terms of the Eclipse Distribution License v1.0 -which accompanies this distribution, and is available at -http://www.eclipse.org/org/documents/edl-v10.php. -*******************************************************************************/ + Copyright (c) 2018 Eclipse RDF4J contributors. + All rights reserved. This program and the accompanying materials + are made available under the terms of the Eclipse Distribution License v1.0 + which accompanies this distribution, and is available at + http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ package org.eclipse.rdf4j.sparqlbuilder.rdf; @@ -34,7 +34,7 @@ public String getQueryString() { /** * an anonymous blank node - * + * * @see Blank node syntax */ class AnonymousBlankNode implements RdfBlankNode { @@ -46,7 +46,7 @@ public String getQueryString() { /** * A blank node representing a resource that matches the contained set of predicate-object lists - * + * * @see Blank node syntax */ class PropertiesBlankNode implements RdfBlankNode { @@ -59,12 +59,12 @@ class PropertiesBlankNode implements RdfBlankNode { /** * Using the predicate-object and object list mechanisms, expand this blank node's pattern to include triples * consisting of this blank node as the subject, and the given predicate and object(s) - * + * * @param predicate the predicate of the triple to add * @param objects the object or objects of the triple to add - * + * * @return this blank node - * + * * @see Predicate-Object * Lists * @see Object Lists @@ -77,10 +77,10 @@ public PropertiesBlankNode andHas(RdfPredicate predicate, RdfObject... objects) /** * Add predicate-object lists to this blank node's pattern - * + * * @param lists the {@link RdfPredicateObjectList}(s) to add * @return this blank node - * + * * @see Predicate-Object * Lists * @see Object Lists @@ -93,9 +93,9 @@ public PropertiesBlankNode andHas(RdfPredicateObjectList... lists) { /** * convert this blank node to a triple pattern - * + * * @return the triple pattern identified by this blank node - * + * * @see blank node syntax */ public TriplePattern toTp() { diff --git a/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/rdf/RdfLiteral.java b/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/rdf/RdfLiteral.java index 730335ed698..0186e657560 100644 --- a/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/rdf/RdfLiteral.java +++ b/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/rdf/RdfLiteral.java @@ -1,10 +1,10 @@ /******************************************************************************* -Copyright (c) 2018 Eclipse RDF4J contributors. -All rights reserved. This program and the accompanying materials -are made available under the terms of the Eclipse Distribution License v1.0 -which accompanies this distribution, and is available at -http://www.eclipse.org/org/documents/edl-v10.php. -*******************************************************************************/ + Copyright (c) 2018 Eclipse RDF4J contributors. + All rights reserved. This program and the accompanying materials + are made available under the terms of the Eclipse Distribution License v1.0 + which accompanies this distribution, and is available at + http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ package org.eclipse.rdf4j.sparqlbuilder.rdf; @@ -14,9 +14,9 @@ /** * Denotes an RDF literal - * + * * @param the datatype of the literal - * + * * @see RDF Literals * @see RDF Literal Syntax */ @@ -129,4 +129,4 @@ public static class BooleanLiteral extends RdfLiteral { super(boolValue); } } -} \ No newline at end of file +} diff --git a/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/rdf/RdfObject.java b/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/rdf/RdfObject.java index 79819ce933a..928fe6bd3f1 100644 --- a/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/rdf/RdfObject.java +++ b/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/rdf/RdfObject.java @@ -1,10 +1,10 @@ /******************************************************************************* -Copyright (c) 2018 Eclipse RDF4J contributors. -All rights reserved. This program and the accompanying materials -are made available under the terms of the Eclipse Distribution License v1.0 -which accompanies this distribution, and is available at -http://www.eclipse.org/org/documents/edl-v10.php. -*******************************************************************************/ + Copyright (c) 2018 Eclipse RDF4J contributors. + All rights reserved. This program and the accompanying materials + are made available under the terms of the Eclipse Distribution License v1.0 + which accompanies this distribution, and is available at + http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ package org.eclipse.rdf4j.sparqlbuilder.rdf; @@ -15,4 +15,4 @@ * Denotes an element that can represent an object in a {@link TriplePattern} */ public interface RdfObject extends QueryElement { -} \ No newline at end of file +} diff --git a/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/rdf/RdfPredicate.java b/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/rdf/RdfPredicate.java index a3485abcbd1..72350284f8e 100644 --- a/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/rdf/RdfPredicate.java +++ b/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/rdf/RdfPredicate.java @@ -1,10 +1,10 @@ /******************************************************************************* -Copyright (c) 2018 Eclipse RDF4J contributors. -All rights reserved. This program and the accompanying materials -are made available under the terms of the Eclipse Distribution License v1.0 -which accompanies this distribution, and is available at -http://www.eclipse.org/org/documents/edl-v10.php. -*******************************************************************************/ + Copyright (c) 2018 Eclipse RDF4J contributors. + All rights reserved. This program and the accompanying materials + are made available under the terms of the Eclipse Distribution License v1.0 + which accompanies this distribution, and is available at + http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ package org.eclipse.rdf4j.sparqlbuilder.rdf; @@ -17,8 +17,8 @@ public interface RdfPredicate extends QueryElement { /** * The built-in predicate shortcut for rdf:type - * + * * @see RDF Type abbreviation */ public static RdfPredicate a = () -> "a"; -} \ No newline at end of file +} diff --git a/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/rdf/RdfPredicateObjectList.java b/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/rdf/RdfPredicateObjectList.java index 607d6fea914..86974343e99 100644 --- a/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/rdf/RdfPredicateObjectList.java +++ b/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/rdf/RdfPredicateObjectList.java @@ -1,10 +1,10 @@ /******************************************************************************* -Copyright (c) 2018 Eclipse RDF4J contributors. -All rights reserved. This program and the accompanying materials -are made available under the terms of the Eclipse Distribution License v1.0 -which accompanies this distribution, and is available at -http://www.eclipse.org/org/documents/edl-v10.php. -*******************************************************************************/ + Copyright (c) 2018 Eclipse RDF4J contributors. + All rights reserved. This program and the accompanying materials + are made available under the terms of the Eclipse Distribution License v1.0 + which accompanies this distribution, and is available at + http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ package org.eclipse.rdf4j.sparqlbuilder.rdf; @@ -12,7 +12,7 @@ /** * A Predicate-Object List - * + * * @see SPARQL Predicate-Object List */ public class RdfPredicateObjectList extends StandardQueryElementCollection { @@ -24,9 +24,9 @@ public class RdfPredicateObjectList extends StandardQueryElementCollection Predicate-Object Lists * @see Object Lists */ @@ -21,14 +21,16 @@ public class RdfPredicateObjectListCollection extends QueryElementCollection RDF Resources */ public interface RdfResource extends RdfValue, RdfSubject { -} \ No newline at end of file +} diff --git a/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/rdf/RdfSubject.java b/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/rdf/RdfSubject.java index e6aad243e1c..6c05836ad10 100644 --- a/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/rdf/RdfSubject.java +++ b/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/rdf/RdfSubject.java @@ -1,10 +1,10 @@ /******************************************************************************* -Copyright (c) 2018 Eclipse RDF4J contributors. -All rights reserved. This program and the accompanying materials -are made available under the terms of the Eclipse Distribution License v1.0 -which accompanies this distribution, and is available at -http://www.eclipse.org/org/documents/edl-v10.php. -*******************************************************************************/ + Copyright (c) 2018 Eclipse RDF4J contributors. + All rights reserved. This program and the accompanying materials + are made available under the terms of the Eclipse Distribution License v1.0 + which accompanies this distribution, and is available at + http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ package org.eclipse.rdf4j.sparqlbuilder.rdf; @@ -23,7 +23,7 @@ public interface RdfSubject extends QueryElement { /** * Create a triple pattern from this subject and the given predicate and object - * + * * @param predicate the predicate of the triple pattern * @param objects the object(s) of the triple pattern * @return a new {@link TriplePattern} with this subject, and the given predicate and object(s) @@ -35,7 +35,7 @@ default TriplePattern has(RdfPredicate predicate, RdfObject... objects) { /** * Create a triple pattern from this subject and the given predicate and object - * + * * @param predicate the predicate of the triple pattern * @param values the object value(s) of the triple pattern. * @return a new {@link TriplePattern} with this subject, and the given predicate and object(s) @@ -47,7 +47,7 @@ default TriplePattern has(RdfPredicate predicate, Value... values) { /** * Create a triple pattern from this subject and the given predicate and object - * + * * @param predicate the predicate {@link IRI} of the triple pattern * @param objects the object(s) of the triple pattern * @return a new {@link TriplePattern} with this subject, and the given predicate and object(s) @@ -59,7 +59,7 @@ default TriplePattern has(IRI predicate, RdfObject... objects) { /** * Create a triple pattern from this subject and the given predicate and object - * + * * @param predicate the predicate {@link IRI} of the triple pattern * @param values the object value(s) of the triple pattern. * @return a new {@link TriplePattern} with this subject, and the given predicate and object(s) @@ -71,7 +71,7 @@ default TriplePattern has(IRI predicate, Value... values) { /** * Create a triple pattern from this subject and the given predicate-object list(s) - * + * * @param lists the {@link RdfPredicateObjectList}(s) to describing this subject * @return a new {@link TriplePattern} with this subject, and the given predicate-object list(s) */ @@ -81,7 +81,7 @@ default TriplePattern has(RdfPredicateObjectList... lists) { /** * Wrapper for {@link #has(RdfPredicate, RdfObject...)} that converts String objects into RdfLiteral instances - * + * * @param predicate the predicate of the triple pattern * @param objects the String object(s) of the triple pattern * @return a new {@link TriplePattern} with this subject, and the given predicate and object(s) @@ -92,7 +92,7 @@ default TriplePattern has(RdfPredicate predicate, String... objects) { /** * Wrapper for {@link #has(RdfPredicate, RdfObject...)} that converts Number objects into RdfLiteral instances - * + * * @param predicate the predicate of the triple pattern * @param objects the Number object(s) of the triple pattern * @return a new {@link TriplePattern} with this subject, and the given predicate and object(s) @@ -103,7 +103,7 @@ default TriplePattern has(RdfPredicate predicate, Number... objects) { /** * Wrapper for {@link #has(RdfPredicate, RdfObject...)} that converts Boolean objects into RdfLiteral instances - * + * * @param predicate the predicate of the triple pattern * @param objects the Boolean object(s) of the triple pattern * @return a new {@link TriplePattern} with this subject, and the given predicate and object(s) @@ -114,7 +114,7 @@ default TriplePattern has(RdfPredicate predicate, Boolean... objects) { /** * Use the built-in shortcut "a" for rdf:type to build a triple with this subject and the given objects - * + * * @param objects the objects to use to describe the rdf:type of this subject * @return a {@link TriplePattern} object with this subject, the "a" shortcut predicate, and the given objects * @see RDF Type abbreviation @@ -122,4 +122,4 @@ default TriplePattern has(RdfPredicate predicate, Boolean... objects) { default TriplePattern isA(RdfObject... objects) { return has(RdfPredicate.a, objects); } -} \ No newline at end of file +} diff --git a/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/rdf/RdfValue.java b/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/rdf/RdfValue.java index d1a214da39f..a0db2d1ead0 100644 --- a/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/rdf/RdfValue.java +++ b/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/rdf/RdfValue.java @@ -1,10 +1,10 @@ /******************************************************************************* -Copyright (c) 2018 Eclipse RDF4J contributors. -All rights reserved. This program and the accompanying materials -are made available under the terms of the Eclipse Distribution License v1.0 -which accompanies this distribution, and is available at -http://www.eclipse.org/org/documents/edl-v10.php. -*******************************************************************************/ + Copyright (c) 2018 Eclipse RDF4J contributors. + All rights reserved. This program and the accompanying materials + are made available under the terms of the Eclipse Distribution License v1.0 + which accompanies this distribution, and is available at + http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ package org.eclipse.rdf4j.sparqlbuilder.rdf; @@ -14,4 +14,4 @@ * Denotes an RDF Value. */ public interface RdfValue extends RdfObject, Operand { -} \ No newline at end of file +} diff --git a/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/util/SparqlBuilderUtils.java b/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/util/SparqlBuilderUtils.java index f5856a91582..c4fffdfbaa3 100644 --- a/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/util/SparqlBuilderUtils.java +++ b/core/sparqlbuilder/src/main/java/org/eclipse/rdf4j/sparqlbuilder/util/SparqlBuilderUtils.java @@ -1,10 +1,10 @@ /******************************************************************************* -Copyright (c) 2018 Eclipse RDF4J contributors. -All rights reserved. This program and the accompanying materials -are made available under the terms of the Eclipse Distribution License v1.0 -which accompanies this distribution, and is available at -http://www.eclipse.org/org/documents/edl-v10.php. -*******************************************************************************/ + Copyright (c) 2018 Eclipse RDF4J contributors. + All rights reserved. This program and the accompanying materials + are made available under the terms of the Eclipse Distribution License v1.0 + which accompanies this distribution, and is available at + http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ package org.eclipse.rdf4j.sparqlbuilder.util; @@ -66,7 +66,7 @@ public static String getQuotedString(String contents) { /** * For string literals that contain single- or double-quotes - * + * * @see RDF Literal Syntax * @param contents * @return a "long quoted" string @@ -93,4 +93,4 @@ private static String getEnclosedString(String open, String close, String conten return es.toString(); } -} \ No newline at end of file +} diff --git a/core/sparqlbuilder/src/test/java/org/eclipse/rdf4j/sparqlbuilder/constraint/ExpressionsTest.java b/core/sparqlbuilder/src/test/java/org/eclipse/rdf4j/sparqlbuilder/constraint/ExpressionsTest.java index f164ccdd296..77501bbd627 100644 --- a/core/sparqlbuilder/src/test/java/org/eclipse/rdf4j/sparqlbuilder/constraint/ExpressionsTest.java +++ b/core/sparqlbuilder/src/test/java/org/eclipse/rdf4j/sparqlbuilder/constraint/ExpressionsTest.java @@ -8,7 +8,7 @@ package org.eclipse.rdf4j.sparqlbuilder.constraint; -import static org.junit.Assert.*; +import static org.junit.Assert.assertEquals; import org.junit.Test; diff --git a/core/sparqlbuilder/src/test/java/org/eclipse/rdf4j/sparqlbuilder/examples/BaseExamples.java b/core/sparqlbuilder/src/test/java/org/eclipse/rdf4j/sparqlbuilder/examples/BaseExamples.java index b1f8109c3dd..3b09980b24d 100644 --- a/core/sparqlbuilder/src/test/java/org/eclipse/rdf4j/sparqlbuilder/examples/BaseExamples.java +++ b/core/sparqlbuilder/src/test/java/org/eclipse/rdf4j/sparqlbuilder/examples/BaseExamples.java @@ -1,10 +1,10 @@ /******************************************************************************* -Copyright (c) 2018 Eclipse RDF4J contributors. -All rights reserved. This program and the accompanying materials -are made available under the terms of the Eclipse Distribution License v1.0 -which accompanies this distribution, and is available at -http://www.eclipse.org/org/documents/edl-v10.php. -*******************************************************************************/ + Copyright (c) 2018 Eclipse RDF4J contributors. + All rights reserved. This program and the accompanying materials + are made available under the terms of the Eclipse Distribution License v1.0 + which accompanies this distribution, and is available at + http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ package org.eclipse.rdf4j.sparqlbuilder.examples; @@ -27,7 +27,7 @@ * The classes inheriting from this pose as examples on how to use SparqlBuilder. They follow the SPARQL 1.1 Spec and * the SPARQL 1.1 Update Spec linked below. Each class covers a section of the spec, documenting how to create the * example SPARQL queries in each section using SparqlBuilder. - * + * * @see The referenced SPARQL 1.1 Spec * @see The referenced SPARQL 1.1 Update Spec */ @@ -82,4 +82,4 @@ private void printTestHeader() { p(Stream.of(Arrays.copyOfRange(tokens, 1, tokens.length)) .collect(Collectors.joining(".", tokens[0].toUpperCase() + " ", ":"))); } -} \ No newline at end of file +} diff --git a/core/sparqlbuilder/src/test/java/org/eclipse/rdf4j/sparqlbuilder/examples/sparql11spec/Section11Test.java b/core/sparqlbuilder/src/test/java/org/eclipse/rdf4j/sparqlbuilder/examples/sparql11spec/Section11Test.java index cdfd2f0d8f8..472264b8c93 100644 --- a/core/sparqlbuilder/src/test/java/org/eclipse/rdf4j/sparqlbuilder/examples/sparql11spec/Section11Test.java +++ b/core/sparqlbuilder/src/test/java/org/eclipse/rdf4j/sparqlbuilder/examples/sparql11spec/Section11Test.java @@ -1,10 +1,10 @@ /******************************************************************************* -Copyright (c) 2018 Eclipse RDF4J contributors. -All rights reserved. This program and the accompanying materials -are made available under the terms of the Eclipse Distribution License v1.0 -which accompanies this distribution, and is available at -http://www.eclipse.org/org/documents/edl-v10.php. -*******************************************************************************/ + Copyright (c) 2018 Eclipse RDF4J contributors. + All rights reserved. This program and the accompanying materials + are made available under the terms of the Eclipse Distribution License v1.0 + which accompanies this distribution, and is available at + http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ package org.eclipse.rdf4j.sparqlbuilder.examples.sparql11spec; diff --git a/core/sparqlbuilder/src/test/java/org/eclipse/rdf4j/sparqlbuilder/examples/sparql11spec/Section12Test.java b/core/sparqlbuilder/src/test/java/org/eclipse/rdf4j/sparqlbuilder/examples/sparql11spec/Section12Test.java index 353abbbc48c..2aeb2d9043c 100644 --- a/core/sparqlbuilder/src/test/java/org/eclipse/rdf4j/sparqlbuilder/examples/sparql11spec/Section12Test.java +++ b/core/sparqlbuilder/src/test/java/org/eclipse/rdf4j/sparqlbuilder/examples/sparql11spec/Section12Test.java @@ -1,10 +1,10 @@ /******************************************************************************* -Copyright (c) 2018 Eclipse RDF4J contributors. -All rights reserved. This program and the accompanying materials -are made available under the terms of the Eclipse Distribution License v1.0 -which accompanies this distribution, and is available at -http://www.eclipse.org/org/documents/edl-v10.php. -*******************************************************************************/ + Copyright (c) 2018 Eclipse RDF4J contributors. + All rights reserved. This program and the accompanying materials + are made available under the terms of the Eclipse Distribution License v1.0 + which accompanies this distribution, and is available at + http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ package org.eclipse.rdf4j.sparqlbuilder.examples.sparql11spec; diff --git a/core/sparqlbuilder/src/test/java/org/eclipse/rdf4j/sparqlbuilder/examples/sparql11spec/Section13Test.java b/core/sparqlbuilder/src/test/java/org/eclipse/rdf4j/sparqlbuilder/examples/sparql11spec/Section13Test.java index d20379d8a8c..4d494d2768d 100644 --- a/core/sparqlbuilder/src/test/java/org/eclipse/rdf4j/sparqlbuilder/examples/sparql11spec/Section13Test.java +++ b/core/sparqlbuilder/src/test/java/org/eclipse/rdf4j/sparqlbuilder/examples/sparql11spec/Section13Test.java @@ -1,10 +1,10 @@ /******************************************************************************* -Copyright (c) 2018 Eclipse RDF4J contributors. -All rights reserved. This program and the accompanying materials -are made available under the terms of the Eclipse Distribution License v1.0 -which accompanies this distribution, and is available at -http://www.eclipse.org/org/documents/edl-v10.php. -*******************************************************************************/ + Copyright (c) 2018 Eclipse RDF4J contributors. + All rights reserved. This program and the accompanying materials + are made available under the terms of the Eclipse Distribution License v1.0 + which accompanies this distribution, and is available at + http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ package org.eclipse.rdf4j.sparqlbuilder.examples.sparql11spec; diff --git a/core/sparqlbuilder/src/test/java/org/eclipse/rdf4j/sparqlbuilder/examples/sparql11spec/Section15Test.java b/core/sparqlbuilder/src/test/java/org/eclipse/rdf4j/sparqlbuilder/examples/sparql11spec/Section15Test.java index 48cd40867ec..665bf0131b6 100644 --- a/core/sparqlbuilder/src/test/java/org/eclipse/rdf4j/sparqlbuilder/examples/sparql11spec/Section15Test.java +++ b/core/sparqlbuilder/src/test/java/org/eclipse/rdf4j/sparqlbuilder/examples/sparql11spec/Section15Test.java @@ -1,10 +1,10 @@ /******************************************************************************* -Copyright (c) 2018 Eclipse RDF4J contributors. -All rights reserved. This program and the accompanying materials -are made available under the terms of the Eclipse Distribution License v1.0 -which accompanies this distribution, and is available at -http://www.eclipse.org/org/documents/edl-v10.php. -*******************************************************************************/ + Copyright (c) 2018 Eclipse RDF4J contributors. + All rights reserved. This program and the accompanying materials + are made available under the terms of the Eclipse Distribution License v1.0 + which accompanies this distribution, and is available at + http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ package org.eclipse.rdf4j.sparqlbuilder.examples.sparql11spec; diff --git a/core/sparqlbuilder/src/test/java/org/eclipse/rdf4j/sparqlbuilder/examples/sparql11spec/Section16Test.java b/core/sparqlbuilder/src/test/java/org/eclipse/rdf4j/sparqlbuilder/examples/sparql11spec/Section16Test.java index 5a1d115def1..fc985844bde 100644 --- a/core/sparqlbuilder/src/test/java/org/eclipse/rdf4j/sparqlbuilder/examples/sparql11spec/Section16Test.java +++ b/core/sparqlbuilder/src/test/java/org/eclipse/rdf4j/sparqlbuilder/examples/sparql11spec/Section16Test.java @@ -1,10 +1,10 @@ /******************************************************************************* -Copyright (c) 2018 Eclipse RDF4J contributors. -All rights reserved. This program and the accompanying materials -are made available under the terms of the Eclipse Distribution License v1.0 -which accompanies this distribution, and is available at -http://www.eclipse.org/org/documents/edl-v10.php. -*******************************************************************************/ + Copyright (c) 2018 Eclipse RDF4J contributors. + All rights reserved. This program and the accompanying materials + are made available under the terms of the Eclipse Distribution License v1.0 + which accompanies this distribution, and is available at + http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ package org.eclipse.rdf4j.sparqlbuilder.examples.sparql11spec; @@ -18,7 +18,13 @@ import org.eclipse.rdf4j.sparqlbuilder.constraint.Expression; import org.eclipse.rdf4j.sparqlbuilder.constraint.Expressions; import org.eclipse.rdf4j.sparqlbuilder.constraint.Operand; -import org.eclipse.rdf4j.sparqlbuilder.core.*; +import org.eclipse.rdf4j.sparqlbuilder.core.Assignment; +import org.eclipse.rdf4j.sparqlbuilder.core.GraphTemplate; +import org.eclipse.rdf4j.sparqlbuilder.core.Prefix; +import org.eclipse.rdf4j.sparqlbuilder.core.Projection; +import org.eclipse.rdf4j.sparqlbuilder.core.QueryPattern; +import org.eclipse.rdf4j.sparqlbuilder.core.SparqlBuilder; +import org.eclipse.rdf4j.sparqlbuilder.core.Variable; import org.eclipse.rdf4j.sparqlbuilder.core.query.ConstructQuery; import org.eclipse.rdf4j.sparqlbuilder.core.query.Queries; import org.eclipse.rdf4j.sparqlbuilder.examples.BaseExamples; diff --git a/core/sparqlbuilder/src/test/java/org/eclipse/rdf4j/sparqlbuilder/examples/sparql11spec/Section2Test.java b/core/sparqlbuilder/src/test/java/org/eclipse/rdf4j/sparqlbuilder/examples/sparql11spec/Section2Test.java index 969973cdd06..2d9a82e2efe 100644 --- a/core/sparqlbuilder/src/test/java/org/eclipse/rdf4j/sparqlbuilder/examples/sparql11spec/Section2Test.java +++ b/core/sparqlbuilder/src/test/java/org/eclipse/rdf4j/sparqlbuilder/examples/sparql11spec/Section2Test.java @@ -1,10 +1,10 @@ /******************************************************************************* -Copyright (c) 2018 Eclipse RDF4J contributors. -All rights reserved. This program and the accompanying materials -are made available under the terms of the Eclipse Distribution License v1.0 -which accompanies this distribution, and is available at -http://www.eclipse.org/org/documents/edl-v10.php. -*******************************************************************************/ + Copyright (c) 2018 Eclipse RDF4J contributors. + All rights reserved. This program and the accompanying materials + are made available under the terms of the Eclipse Distribution License v1.0 + which accompanies this distribution, and is available at + http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ package org.eclipse.rdf4j.sparqlbuilder.examples.sparql11spec; diff --git a/core/sparqlbuilder/src/test/java/org/eclipse/rdf4j/sparqlbuilder/examples/sparql11spec/Section3Test.java b/core/sparqlbuilder/src/test/java/org/eclipse/rdf4j/sparqlbuilder/examples/sparql11spec/Section3Test.java index f0fd1f7e2ea..32a9cc59e9f 100644 --- a/core/sparqlbuilder/src/test/java/org/eclipse/rdf4j/sparqlbuilder/examples/sparql11spec/Section3Test.java +++ b/core/sparqlbuilder/src/test/java/org/eclipse/rdf4j/sparqlbuilder/examples/sparql11spec/Section3Test.java @@ -1,10 +1,10 @@ /******************************************************************************* -Copyright (c) 2018 Eclipse RDF4J contributors. -All rights reserved. This program and the accompanying materials -are made available under the terms of the Eclipse Distribution License v1.0 -which accompanies this distribution, and is available at -http://www.eclipse.org/org/documents/edl-v10.php. -*******************************************************************************/ + Copyright (c) 2018 Eclipse RDF4J contributors. + All rights reserved. This program and the accompanying materials + are made available under the terms of the Eclipse Distribution License v1.0 + which accompanies this distribution, and is available at + http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ package org.eclipse.rdf4j.sparqlbuilder.examples.sparql11spec; @@ -16,7 +16,9 @@ import org.eclipse.rdf4j.sparqlbuilder.core.SparqlBuilder; import org.eclipse.rdf4j.sparqlbuilder.core.Variable; import org.eclipse.rdf4j.sparqlbuilder.examples.BaseExamples; -import org.eclipse.rdf4j.sparqlbuilder.graphpattern.*; +import org.eclipse.rdf4j.sparqlbuilder.graphpattern.GraphPattern; +import org.eclipse.rdf4j.sparqlbuilder.graphpattern.GraphPatterns; +import org.eclipse.rdf4j.sparqlbuilder.graphpattern.TriplePattern; import org.eclipse.rdf4j.sparqlbuilder.rdf.Rdf; import org.junit.Test; diff --git a/core/sparqlbuilder/src/test/java/org/eclipse/rdf4j/sparqlbuilder/examples/sparql11spec/Section4Test.java b/core/sparqlbuilder/src/test/java/org/eclipse/rdf4j/sparqlbuilder/examples/sparql11spec/Section4Test.java index af0f9f2eca4..3e12006b5cb 100644 --- a/core/sparqlbuilder/src/test/java/org/eclipse/rdf4j/sparqlbuilder/examples/sparql11spec/Section4Test.java +++ b/core/sparqlbuilder/src/test/java/org/eclipse/rdf4j/sparqlbuilder/examples/sparql11spec/Section4Test.java @@ -1,10 +1,10 @@ /******************************************************************************* -Copyright (c) 2018 Eclipse RDF4J contributors. -All rights reserved. This program and the accompanying materials -are made available under the terms of the Eclipse Distribution License v1.0 -which accompanies this distribution, and is available at -http://www.eclipse.org/org/documents/edl-v10.php. -*******************************************************************************/ + Copyright (c) 2018 Eclipse RDF4J contributors. + All rights reserved. This program and the accompanying materials + are made available under the terms of the Eclipse Distribution License v1.0 + which accompanies this distribution, and is available at + http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ package org.eclipse.rdf4j.sparqlbuilder.examples.sparql11spec; diff --git a/core/sparqlbuilder/src/test/java/org/eclipse/rdf4j/sparqlbuilder/examples/sparql11spec/Section5Test.java b/core/sparqlbuilder/src/test/java/org/eclipse/rdf4j/sparqlbuilder/examples/sparql11spec/Section5Test.java index 2250d0c1bea..c663b244dae 100644 --- a/core/sparqlbuilder/src/test/java/org/eclipse/rdf4j/sparqlbuilder/examples/sparql11spec/Section5Test.java +++ b/core/sparqlbuilder/src/test/java/org/eclipse/rdf4j/sparqlbuilder/examples/sparql11spec/Section5Test.java @@ -1,10 +1,10 @@ /******************************************************************************* -Copyright (c) 2018 Eclipse RDF4J contributors. -All rights reserved. This program and the accompanying materials -are made available under the terms of the Eclipse Distribution License v1.0 -which accompanies this distribution, and is available at -http://www.eclipse.org/org/documents/edl-v10.php. -*******************************************************************************/ + Copyright (c) 2018 Eclipse RDF4J contributors. + All rights reserved. This program and the accompanying materials + are made available under the terms of the Eclipse Distribution License v1.0 + which accompanies this distribution, and is available at + http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ package org.eclipse.rdf4j.sparqlbuilder.examples.sparql11spec; diff --git a/core/sparqlbuilder/src/test/java/org/eclipse/rdf4j/sparqlbuilder/examples/sparql11spec/Section6Test.java b/core/sparqlbuilder/src/test/java/org/eclipse/rdf4j/sparqlbuilder/examples/sparql11spec/Section6Test.java index 98c530b6ea9..64579c6426e 100644 --- a/core/sparqlbuilder/src/test/java/org/eclipse/rdf4j/sparqlbuilder/examples/sparql11spec/Section6Test.java +++ b/core/sparqlbuilder/src/test/java/org/eclipse/rdf4j/sparqlbuilder/examples/sparql11spec/Section6Test.java @@ -1,10 +1,10 @@ /******************************************************************************* -Copyright (c) 2018 Eclipse RDF4J contributors. -All rights reserved. This program and the accompanying materials -are made available under the terms of the Eclipse Distribution License v1.0 -which accompanies this distribution, and is available at -http://www.eclipse.org/org/documents/edl-v10.php. -*******************************************************************************/ + Copyright (c) 2018 Eclipse RDF4J contributors. + All rights reserved. This program and the accompanying materials + are made available under the terms of the Eclipse Distribution License v1.0 + which accompanies this distribution, and is available at + http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ package org.eclipse.rdf4j.sparqlbuilder.examples.sparql11spec; diff --git a/core/sparqlbuilder/src/test/java/org/eclipse/rdf4j/sparqlbuilder/examples/sparql11spec/Section7Test.java b/core/sparqlbuilder/src/test/java/org/eclipse/rdf4j/sparqlbuilder/examples/sparql11spec/Section7Test.java index 730b8c04712..37bc188a584 100644 --- a/core/sparqlbuilder/src/test/java/org/eclipse/rdf4j/sparqlbuilder/examples/sparql11spec/Section7Test.java +++ b/core/sparqlbuilder/src/test/java/org/eclipse/rdf4j/sparqlbuilder/examples/sparql11spec/Section7Test.java @@ -1,10 +1,10 @@ /******************************************************************************* -Copyright (c) 2018 Eclipse RDF4J contributors. -All rights reserved. This program and the accompanying materials -are made available under the terms of the Eclipse Distribution License v1.0 -which accompanies this distribution, and is available at -http://www.eclipse.org/org/documents/edl-v10.php. -*******************************************************************************/ + Copyright (c) 2018 Eclipse RDF4J contributors. + All rights reserved. This program and the accompanying materials + are made available under the terms of the Eclipse Distribution License v1.0 + which accompanies this distribution, and is available at + http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ package org.eclipse.rdf4j.sparqlbuilder.examples.sparql11spec; diff --git a/core/sparqlbuilder/src/test/java/org/eclipse/rdf4j/sparqlbuilder/examples/sparql11spec/Section8Test.java b/core/sparqlbuilder/src/test/java/org/eclipse/rdf4j/sparqlbuilder/examples/sparql11spec/Section8Test.java index b8cf292fa71..a632940502c 100644 --- a/core/sparqlbuilder/src/test/java/org/eclipse/rdf4j/sparqlbuilder/examples/sparql11spec/Section8Test.java +++ b/core/sparqlbuilder/src/test/java/org/eclipse/rdf4j/sparqlbuilder/examples/sparql11spec/Section8Test.java @@ -1,10 +1,10 @@ /******************************************************************************* -Copyright (c) 2018 Eclipse RDF4J contributors. -All rights reserved. This program and the accompanying materials -are made available under the terms of the Eclipse Distribution License v1.0 -which accompanies this distribution, and is available at -http://www.eclipse.org/org/documents/edl-v10.php. -*******************************************************************************/ + Copyright (c) 2018 Eclipse RDF4J contributors. + All rights reserved. This program and the accompanying materials + are made available under the terms of the Eclipse Distribution License v1.0 + which accompanies this distribution, and is available at + http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ package org.eclipse.rdf4j.sparqlbuilder.examples.sparql11spec; diff --git a/core/sparqlbuilder/src/test/java/org/eclipse/rdf4j/sparqlbuilder/examples/updatespec/Section3Test.java b/core/sparqlbuilder/src/test/java/org/eclipse/rdf4j/sparqlbuilder/examples/updatespec/Section3Test.java index 942def07184..5e00b1dd059 100644 --- a/core/sparqlbuilder/src/test/java/org/eclipse/rdf4j/sparqlbuilder/examples/updatespec/Section3Test.java +++ b/core/sparqlbuilder/src/test/java/org/eclipse/rdf4j/sparqlbuilder/examples/updatespec/Section3Test.java @@ -1,10 +1,10 @@ /******************************************************************************* -Copyright (c) 2018 Eclipse RDF4J contributors. -All rights reserved. This program and the accompanying materials -are made available under the terms of the Eclipse Distribution License v1.0 -which accompanies this distribution, and is available at -http://www.eclipse.org/org/documents/edl-v10.php. -*******************************************************************************/ + Copyright (c) 2018 Eclipse RDF4J contributors. + All rights reserved. This program and the accompanying materials + are made available under the terms of the Eclipse Distribution License v1.0 + which accompanies this distribution, and is available at + http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ package org.eclipse.rdf4j.sparqlbuilder.examples.updatespec; diff --git a/core/spin/pom.xml b/core/spin/pom.xml index d8f24d36405..60d862dccac 100644 --- a/core/spin/pom.xml +++ b/core/spin/pom.xml @@ -4,7 +4,7 @@ org.eclipse.rdf4j rdf4j-core - 3.1.5-SNAPSHOT + 3.2.2-SNAPSHOT rdf4j-spin RDF4J: SPIN diff --git a/core/spin/src/main/java/org/eclipse/rdf4j/spin/SpinParser.java b/core/spin/src/main/java/org/eclipse/rdf4j/spin/SpinParser.java index 39546fceeb9..f7a68e58a03 100644 --- a/core/spin/src/main/java/org/eclipse/rdf4j/spin/SpinParser.java +++ b/core/spin/src/main/java/org/eclipse/rdf4j/spin/SpinParser.java @@ -11,7 +11,6 @@ import java.util.Arrays; import java.util.Collection; import java.util.Collections; -import java.util.Comparator; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; @@ -22,7 +21,6 @@ import java.util.Set; import java.util.SortedSet; import java.util.TreeSet; -import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -681,7 +679,7 @@ public void reset(IRI... uris) { } public static List orderArguments(Set args) { - SortedSet sortedArgs = new TreeSet( + SortedSet sortedArgs = new TreeSet<>( (IRI uri1, IRI uri2) -> uri1.getLocalName().compareTo(uri2.getLocalName())); sortedArgs.addAll(args); diff --git a/core/spin/src/main/java/org/eclipse/rdf4j/spin/SpinRenderer.java b/core/spin/src/main/java/org/eclipse/rdf4j/spin/SpinRenderer.java index b76c2cc9cfe..f745aa36e27 100644 --- a/core/spin/src/main/java/org/eclipse/rdf4j/spin/SpinRenderer.java +++ b/core/spin/src/main/java/org/eclipse/rdf4j/spin/SpinRenderer.java @@ -588,7 +588,7 @@ private void visitWhere(TupleExpr where) throws RDFHandlerException { handler.handleStatement(valueFactory.createStatement(subject, SP.WHERE_PROPERTY, whereBNode)); isSubQuery = true; // further projection elements are for - // sub-queries + // sub-queries ListContext ctx = newList(whereBNode); where.visit(this); diff --git a/core/spin/src/main/java/org/eclipse/rdf4j/spin/SpinWellKnownFunctions.java b/core/spin/src/main/java/org/eclipse/rdf4j/spin/SpinWellKnownFunctions.java index 086f6ed5715..670760e3c93 100644 --- a/core/spin/src/main/java/org/eclipse/rdf4j/spin/SpinWellKnownFunctions.java +++ b/core/spin/src/main/java/org/eclipse/rdf4j/spin/SpinWellKnownFunctions.java @@ -82,4 +82,4 @@ public String getName(IRI IRI) { } return name; } -} \ No newline at end of file +} diff --git a/core/spin/src/main/java/org/eclipse/rdf4j/spin/function/spif/For.java b/core/spin/src/main/java/org/eclipse/rdf4j/spin/function/spif/For.java index 884cadaefd5..a8d13fa285a 100644 --- a/core/spin/src/main/java/org/eclipse/rdf4j/spin/function/spif/For.java +++ b/core/spin/src/main/java/org/eclipse/rdf4j/spin/function/spif/For.java @@ -42,7 +42,7 @@ public CloseableIteration, QueryEvaluationExcept } final int from = ((Literal) args[0]).intValue(); final int to = ((Literal) args[1]).intValue(); - return new CloseableIteratorIteration, QueryEvaluationException>( + return new CloseableIteratorIteration<>( SingleValueToListTransformer.transform(new Iterator() { int value = from; diff --git a/core/spin/src/main/java/org/eclipse/rdf4j/spin/function/spif/HasAllObjects.java b/core/spin/src/main/java/org/eclipse/rdf4j/spin/function/spif/HasAllObjects.java index c2e75e670e2..2629cc095af 100644 --- a/core/spin/src/main/java/org/eclipse/rdf4j/spin/function/spif/HasAllObjects.java +++ b/core/spin/src/main/java/org/eclipse/rdf4j/spin/function/spif/HasAllObjects.java @@ -13,7 +13,6 @@ import org.eclipse.rdf4j.model.Value; import org.eclipse.rdf4j.model.ValueFactory; import org.eclipse.rdf4j.model.impl.BooleanLiteral; -import org.eclipse.rdf4j.model.impl.BooleanLiteralImpl; import org.eclipse.rdf4j.model.vocabulary.SPIF; import org.eclipse.rdf4j.query.QueryEvaluationException; import org.eclipse.rdf4j.query.algebra.evaluation.QueryPreparer; diff --git a/core/spin/src/main/java/org/eclipse/rdf4j/spin/function/spif/Name.java b/core/spin/src/main/java/org/eclipse/rdf4j/spin/function/spif/Name.java index 736c7c1320b..abad7e7f967 100644 --- a/core/spin/src/main/java/org/eclipse/rdf4j/spin/function/spif/Name.java +++ b/core/spin/src/main/java/org/eclipse/rdf4j/spin/function/spif/Name.java @@ -7,12 +7,8 @@ *******************************************************************************/ package org.eclipse.rdf4j.spin.function.spif; -import java.util.List; -import java.util.stream.Collectors; import java.util.stream.Stream; -import org.eclipse.rdf4j.common.iteration.CloseableIteration; -import org.eclipse.rdf4j.common.iteration.Iterations; import org.eclipse.rdf4j.model.Literal; import org.eclipse.rdf4j.model.Resource; import org.eclipse.rdf4j.model.Value; diff --git a/core/spin/src/main/java/org/eclipse/rdf4j/spin/function/spif/SingleValueToListTransformer.java b/core/spin/src/main/java/org/eclipse/rdf4j/spin/function/spif/SingleValueToListTransformer.java index 8dae23daa69..b604fc37ec4 100644 --- a/core/spin/src/main/java/org/eclipse/rdf4j/spin/function/spif/SingleValueToListTransformer.java +++ b/core/spin/src/main/java/org/eclipse/rdf4j/spin/function/spif/SingleValueToListTransformer.java @@ -16,7 +16,7 @@ class SingleValueToListTransformer implements Function> { - private static final SingleValueToListTransformer INSTANCE = new SingleValueToListTransformer(); + private static final SingleValueToListTransformer INSTANCE = new SingleValueToListTransformer<>(); @SuppressWarnings("unchecked") static Iterator> transform(Iterator iter) { @@ -27,4 +27,4 @@ static Iterator> transform(Iterator iter) { public List apply(E v) { return Collections.singletonList(v); } -} \ No newline at end of file +} diff --git a/core/spin/src/main/java/org/eclipse/rdf4j/spin/function/spif/Split.java b/core/spin/src/main/java/org/eclipse/rdf4j/spin/function/spif/Split.java index 807519e168a..bf45d3fc47a 100644 --- a/core/spin/src/main/java/org/eclipse/rdf4j/spin/function/spif/Split.java +++ b/core/spin/src/main/java/org/eclipse/rdf4j/spin/function/spif/Split.java @@ -43,7 +43,7 @@ public CloseableIteration, QueryEvaluationExcept final String s = ((Literal) args[0]).stringValue(); final String regex = ((Literal) args[1]).stringValue(); final String[] parts = s.split(regex); - return new CloseableIteratorIteration, QueryEvaluationException>( + return new CloseableIteratorIteration<>( SingleValueToListTransformer.transform(new Iterator() { int pos = 0; diff --git a/core/spin/src/test/java/org/eclipse/rdf4j/model/evaluation/ModelTripleSource.java b/core/spin/src/test/java/org/eclipse/rdf4j/model/evaluation/ModelTripleSource.java index 866b68f3ab6..0742240f6f6 100644 --- a/core/spin/src/test/java/org/eclipse/rdf4j/model/evaluation/ModelTripleSource.java +++ b/core/spin/src/test/java/org/eclipse/rdf4j/model/evaluation/ModelTripleSource.java @@ -30,7 +30,7 @@ public ModelTripleSource(Model m) { @Override public CloseableIteration getStatements(Resource subj, IRI pred, Value obj, Resource... contexts) throws QueryEvaluationException { - return new CloseableIteratorIteration<>(model.filter(subj, pred, obj, contexts).iterator()); + return new CloseableIteratorIteration<>(model.getStatements(subj, pred, obj, contexts).iterator()); } @Override diff --git a/core/storage/pom.xml b/core/storage/pom.xml index e0416226329..8b9d691703a 100644 --- a/core/storage/pom.xml +++ b/core/storage/pom.xml @@ -4,7 +4,7 @@ org.eclipse.rdf4j rdf4j-core - 3.1.5-SNAPSHOT + 3.2.2-SNAPSHOT rdf4j-storage RDF4J: Storage Libraries diff --git a/core/util/pom.xml b/core/util/pom.xml index 2b5ede6a80c..51639c75292 100644 --- a/core/util/pom.xml +++ b/core/util/pom.xml @@ -4,7 +4,7 @@ org.eclipse.rdf4j rdf4j-core - 3.1.5-SNAPSHOT + 3.2.2-SNAPSHOT rdf4j-util RDF4J: util diff --git a/core/util/src/main/java/org/eclipse/rdf4j/common/annotation/Experimental.java b/core/util/src/main/java/org/eclipse/rdf4j/common/annotation/Experimental.java index 038604952d3..148741e117d 100644 --- a/core/util/src/main/java/org/eclipse/rdf4j/common/annotation/Experimental.java +++ b/core/util/src/main/java/org/eclipse/rdf4j/common/annotation/Experimental.java @@ -16,7 +16,7 @@ /** * This feature is in an experimental state: its existence, signature or behavior may change without warning from one * release to the next. - * + * * @author Jeen Broekstra */ @Documented diff --git a/core/util/src/main/java/org/eclipse/rdf4j/common/annotation/InternalUseOnly.java b/core/util/src/main/java/org/eclipse/rdf4j/common/annotation/InternalUseOnly.java index c03ede40766..0e8cac64af2 100644 --- a/core/util/src/main/java/org/eclipse/rdf4j/common/annotation/InternalUseOnly.java +++ b/core/util/src/main/java/org/eclipse/rdf4j/common/annotation/InternalUseOnly.java @@ -16,7 +16,7 @@ /** * This feature is intended for internal use only and is not considered part of the public API: its existence, signature * or behavior may change without warning from one release to the next. - * + * * @author Jeen Broekstra */ @Documented diff --git a/core/util/src/main/java/org/eclipse/rdf4j/common/io/ByteArrayUtil.java b/core/util/src/main/java/org/eclipse/rdf4j/common/io/ByteArrayUtil.java index 644a61ffee5..0899e0d8986 100644 --- a/core/util/src/main/java/org/eclipse/rdf4j/common/io/ByteArrayUtil.java +++ b/core/util/src/main/java/org/eclipse/rdf4j/common/io/ByteArrayUtil.java @@ -17,7 +17,7 @@ public class ByteArrayUtil { /** * Puts the entire source array in the target array at offset offset. - * + * * @param source source array * @param target target array * @param offset non-negative offset @@ -28,7 +28,7 @@ public static void put(byte[] source, byte[] target, int offset) { /** * Gets the subarray from array that starts at offset. - * + * * @param array source array * @param offset non-negative offset * @return byte array @@ -39,7 +39,7 @@ public static byte[] get(byte[] array, int offset) { /** * Gets the subarray of length length from array that starts at offset. - * + * * @param array byte array * @param offset non-negative offset * @param length length @@ -53,7 +53,7 @@ public static byte[] get(byte[] array, int offset, int length) { /** * Put an integer value (padded) in a byte array at a specific offset. - * + * * @param value integer value * @param array byte array * @param offset non-negative offset @@ -67,7 +67,7 @@ public static void putInt(int value, byte[] array, int offset) { /** * Get an integer value from a byte array at a specific offset. - * + * * @param array byte array * @param offset non-negative offset * @return integer value @@ -79,7 +79,7 @@ public static int getInt(byte[] array, int offset) { /** * Put a long value (padded) in a byte array at a specific offset. - * + * * @param value long value * @param array byte array * @param offset non-negative offset @@ -97,7 +97,7 @@ public static void putLong(long value, byte[] array, int offset) { /** * Get a long value from a byte array at a specific offset. - * + * * @param array byte array * @param offset offset * @return long value @@ -111,7 +111,7 @@ public static long getLong(byte[] array, int offset) { /** * Retrieve a byte from a byte array. - * + * * @param a the byte array to look in * @param fromIndex the position from which to start looking * @param toIndex the position up to which to look @@ -137,7 +137,7 @@ public static int find(byte[] a, int fromIndex, int toIndex, byte key) { /** * Look for a sequence of bytes in a byte array. - * + * * @param a the byte array to look in * @param fromIndex the position from which to start looking * @param toIndex the position up to which to look @@ -178,7 +178,7 @@ public static int find(byte[] a, int fromIndex, int toIndex, byte[] key) { /** * Checks whether value matches pattern with respect to the bits specified by mask. In * other words: this method returns true if (value[i] ^ pattern[i]) & mask[i] == 0 for all i. - * + * * @param value byte array * @param mask * @param pattern pattern @@ -196,7 +196,7 @@ public static boolean matchesPattern(byte[] value, byte[] mask, byte[] pattern) /** * Checks whether subValue matches the region in superValue starting at offset offset. - * + * * @param subValue value to search for * @param superValue byte array * @param offset non-negative offset @@ -214,7 +214,7 @@ public static boolean regionMatches(byte[] subValue, byte[] superValue, int offs /** * Compares two regions of bytes, indicating whether one is larger than the other. - * + * * @param array1 The first byte array. * @param startIdx1 The start of the region in the first array. * @param array2 The second byte array. @@ -233,7 +233,7 @@ public static int compareRegion(byte[] array1, int startIdx1, byte[] array2, int /** * Convert a byte array to a vector of bits. - * + * * @param array byte array * @return bitset */ @@ -255,7 +255,7 @@ public static BitSet toBitSet(byte[] array) { /** * Convert a bitset to a byte array. - * + * * @param bitSet bitset (should not be null) * @return byte array */ @@ -271,7 +271,7 @@ public static byte[] toByteArray(BitSet bitSet) { /** * Create a byte mask, setting bit bitNo to 1 and other bits to 0. - * + * * @param bitNo bit * @return byte mask */ @@ -283,7 +283,7 @@ private static byte byteMask(int bitNo) { * Returns the hexadecimal value of the supplied byte array. The resulting string always uses two hexadecimals per * byte. As a result, the length of the resulting string is guaranteed to be twice the length of the supplied byte * array. - * + * * @param array byte array * @return hexadecimal string */ diff --git a/core/util/src/main/java/org/eclipse/rdf4j/common/io/FileUtil.java b/core/util/src/main/java/org/eclipse/rdf4j/common/io/FileUtil.java index 4efae110914..70a9d381c5d 100644 --- a/core/util/src/main/java/org/eclipse/rdf4j/common/io/FileUtil.java +++ b/core/util/src/main/java/org/eclipse/rdf4j/common/io/FileUtil.java @@ -24,7 +24,7 @@ public class FileUtil { /** * Gets the relative representations of a file compared to another. - * + * * @param subj The File to find the relative form for. * @param relativeTo The File 'subj' should be made relative to. * @return The relative representation of subj. @@ -96,7 +96,7 @@ public static String getRelativePath(File subj, File relativeTo) { /** * Gets the relative representations of a file compared to another. - * + * * @param subj The File to find the relative form for. * @param relativeTo The File 'subj' should be made relative to. * @return The relative representation of subj. @@ -107,7 +107,7 @@ public static File getRelativeFile(File subj, File relativeTo) { /** * Gets the extension of the specified file name. - * + * * @param fileName A file name. * @return The file name extension (e.g. "exe" or "txt"), or null if the file name does not have a (valid) * extension. @@ -128,7 +128,7 @@ public static String getFileExtension(String fileName) { /** * Checks whether the specified file name is a legal (DOS/Windows-) file name. - * + * * @param fileName name of the file * @return true if all characters of the name are legal to use */ @@ -145,7 +145,7 @@ public static boolean isLegalFileName(String fileName) { /** * Checks whether the specified character is a legal (DOS/Windows-) file name character. - * + * * @param c character to check * @return true if character is legal to use */ @@ -155,7 +155,7 @@ public static boolean isLegalFileNameChar(char c) { /** * Copies the contents of file source to file destination. - * + * * @param source source file * @param destination destination file * @throws IOException @@ -168,7 +168,7 @@ public static void copyFile(File source, File destination) throws IOException { /** * Creates a directory if it doesn't exist yet. - * + * * @param dir The directory to create. * @throws IOException If the creation of the directory failed. */ @@ -180,7 +180,7 @@ public static void createDirIfNotExists(File dir) throws IOException { /** * Deletes a directory, recursively deleting all the files and subdirectories in it, or just a file. - * + * * @param directory file or directory to delete * @return true if all files were deleted successfully. */ @@ -208,7 +208,7 @@ public static boolean deltree(File directory) { /** * Deletes all files in the specified directory. Nothing happens when the specified File is not a directory. - * + * * @param directory * @return true when all files in the specified directory were successfully deleted, when there where no files or * when the specified file was not a directory. @@ -232,7 +232,7 @@ public static boolean deleteFiles(File directory) { /** * Deletes all files and subdirectories in the specified directory. Nothing happens when the specified File is not a * directory. - * + * * @param directory * @return true when all children were successfully deleted, when there were no children or when the file was not a * directory. @@ -253,7 +253,7 @@ public static boolean deleteChildren(File directory) { /** * Moves the given file and all files under it (if it's a directory) to the given location, excluding the given * collection of File objects! - * + * * @param from File or directory to be moved * @param to The file or directory to rename to * @param excludes The File objects to be excluded; if a directory is excluded, all files under it are excluded as @@ -298,7 +298,7 @@ public static boolean moveRecursive(File from, File to, Collection exclude /** * Creates a new and empty directory in the default temp directory using the given prefix. - * + * * @param prefix The prefix string to be used in generating the directory's name; must be at least three characters * long. * @return A newly-created empty directory. @@ -312,7 +312,7 @@ public static synchronized File createTempDir(String prefix) throws IOException /** * Deletes the specified directory and any files and directories in it recursively. - * + * * @param dir The directory to remove. * @throws IOException If the directory could not be removed. */ diff --git a/core/util/src/main/java/org/eclipse/rdf4j/common/io/GZipUtil.java b/core/util/src/main/java/org/eclipse/rdf4j/common/io/GZipUtil.java index 59f27f51183..1cb7d6bbc04 100644 --- a/core/util/src/main/java/org/eclipse/rdf4j/common/io/GZipUtil.java +++ b/core/util/src/main/java/org/eclipse/rdf4j/common/io/GZipUtil.java @@ -25,7 +25,7 @@ public class GZipUtil { /** * Check if a stream is a GZIP stream, by checking the first bytes of the stream. - * + * * @param in input stream * @return true if a stream is a GZIP stream * @throws IOException diff --git a/core/util/src/main/java/org/eclipse/rdf4j/common/io/IOUtil.java b/core/util/src/main/java/org/eclipse/rdf4j/common/io/IOUtil.java index 649cb3885ef..09b1953dfa0 100644 --- a/core/util/src/main/java/org/eclipse/rdf4j/common/io/IOUtil.java +++ b/core/util/src/main/java/org/eclipse/rdf4j/common/io/IOUtil.java @@ -33,7 +33,7 @@ public class IOUtil { /** * Read the contents as a string from the given (unbuffered) file. - * + * * @param file file to read * @return content as one single string * @throws IOException @@ -46,7 +46,7 @@ public static String readString(File file) throws IOException { /** * Read the contents of a (unbuffered) resource into one single string. - * + * * @param url url to get the data from * @return string * @throws IOException @@ -59,7 +59,7 @@ public static String readString(URL url) throws IOException { /** * Read the contents of an (unbuffered) input stream into a single string. - * + * * @param in input stream * @return string * @throws IOException @@ -70,7 +70,7 @@ public static String readString(InputStream in) throws IOException { /** * Reads all characters from the supplied reader and returns them as a string. - * + * * @param r The Reader supplying the characters * @return A String containing all characters from the supplied reader. * @throws IOException @@ -81,7 +81,7 @@ public static String readString(Reader r) throws IOException { /** * Reads a string of at most length maxChars from the supplied Reader. - * + * * @param r The Reader to read the string from. * @param maxChars The maximum number of characters to read. * @return A String of length maxChars, or less if the supplied Reader did not contain that much @@ -96,7 +96,7 @@ public static String readString(Reader r, int maxChars) throws IOException { /** * Read the contents of a (unbuffered) resource into a character array. - * + * * @param url url to get the data from * @return character array * @throws IOException @@ -109,7 +109,7 @@ public static char[] readChars(URL url) throws IOException { /** * Reads all characters from the supplied reader and returns them. - * + * * @param r The Reader supplying the characters * @return A character array containing all characters from the supplied reader. * @throws IOException @@ -121,7 +121,7 @@ public static char[] readChars(Reader r) throws IOException { /** * Fills the supplied character array with characters read from the specified Reader. This method will only stop * reading when the character array has been filled completely, or the end of the stream has been reached. - * + * * @param r The Reader to read the characters from. * @param charArray The character array to fill with characters. * @return The number of characters written to the character array. @@ -147,7 +147,7 @@ public static int readChars(Reader r, char[] charArray) throws IOException { /** * Reads all bytes from the specified file and returns them as a byte array. - * + * * @param file The file to read. * @return A byte array containing all bytes from the specified file. * @throws IOException If an I/O error occurred while reading from the file. @@ -168,7 +168,7 @@ public static byte[] readBytes(File file) throws IOException { /** * Reads all bytes from the supplied input stream and returns them as a byte array. - * + * * @param in The InputStream supplying the bytes. * @return A byte array containing all bytes from the supplied input stream. * @throws IOException @@ -181,7 +181,7 @@ public static byte[] readBytes(InputStream in) throws IOException { /** * Reads at most maxBytes bytes from the supplied input stream and returns them as a byte array. - * + * * @param in The InputStream supplying the bytes. * @param maxBytes The maximum number of bytes to read from the input stream. * @return A byte array of size maxBytes if the input stream can produce that amount of bytes, or a smaller @@ -206,7 +206,7 @@ public static byte[] readBytes(InputStream in, int maxBytes) throws IOException /** * Fills the supplied byte array with bytes read from the specified InputStream. This method will only stop reading * when the byte array has been filled completely, or the end of the stream has been reached. - * + * * @param in The InputStream to read the bytes from. * @param byteArray The byte array to fill with bytes. * @return The number of bytes written to the byte array. @@ -232,7 +232,7 @@ public static int readBytes(InputStream in, byte[] byteArray) throws IOException /** * Read properties from the specified file. - * + * * @param propsFile the file to read from * @return Properties loaded from the specified file * @throws IOException when the file could not be read properly @@ -243,7 +243,7 @@ public static Properties readProperties(File propsFile) throws IOException { /** * Read properties from the specified file. - * + * * @param propsFile the file to read from * @param defaults the default properties to use * @return Properties loaded from the specified file @@ -255,7 +255,7 @@ public static Properties readProperties(File propsFile, Properties defaults) thr /** * Read properties from the specified InputStream. - * + * * @param in the stream to read from. The stream will be closed by this method. * @return Properties loaded from the specified stream. The stream will be closed by this method. * @throws IOException when the stream could not be read properly @@ -266,7 +266,7 @@ public static Properties readProperties(InputStream in) throws IOException { /** * Read properties from the specified InputStream. - * + * * @param in the stream to read from. The stream will be closed by this method. * @param defaults the default properties * @return Properties loaded from the specified stream. The stream will be closed by this method. @@ -284,7 +284,7 @@ public static Properties readProperties(InputStream in, Properties defaults) thr /** * Write the specified properties to the specified file. - * + * * @param props the properties to write * @param file the file to write to * @param includeDefaults true when default values need to be included @@ -296,7 +296,7 @@ public static void writeProperties(Properties props, File file, boolean includeD /** * Write the specified properties to the specified output stream. - * + * * @param props the properties to write * @param out the output stream to write to * @param includeDefaults true if default values need to be included @@ -323,7 +323,7 @@ public static void writeProperties(Properties props, OutputStream out, boolean i /** * Writes all data that can be read from the supplied InputStream to the specified file. - * + * * @param in An InputStream. * @param file The file to write the data to. * @throws IOException If an I/O error occurred. @@ -344,7 +344,7 @@ public static void writeStream(InputStream in, File file) throws IOException { /** * Write the contents of a string (unbuffered) to a file - * + * * @param contents string contents to write * @param file file to write to * @throws IOException @@ -357,7 +357,7 @@ public static void writeString(String contents, File file) throws IOException { /** * Write the contents of a byte array (unbuffered) to a file. - * + * * @param data data to write * @param file file * @throws IOException @@ -370,7 +370,7 @@ public static void writeBytes(byte[] data, File file) throws IOException { /** * Write he contents of a byte array (unbuffered) to an output stream. - * + * * @param data data to write * @param out file * @throws IOException @@ -381,7 +381,7 @@ public static void writeBytes(byte[] data, OutputStream out) throws IOException /** * Read the contents of a resource into a reader. Currently ignores HTTP Content-Encoding response header. - * + * * @param url url * @return reader * @throws IOException @@ -395,7 +395,7 @@ public static Reader urlToReader(URL url) throws IOException { /** * Read into a character array writer. - * + * * @param r input reader * @return character array writer * @throws IOException @@ -414,7 +414,7 @@ private static CharArrayWriter readFully(Reader r) throws IOException { /** * Transfers all bytes that can be read from in to out. - * + * * @param in The InputStream to read data from. * @param out The OutputStream to write data to. * @return The total number of bytes transfered. @@ -435,7 +435,7 @@ public static final long transfer(InputStream in, OutputStream out) throws IOExc /** * Writes all bytes from an InputStream to a file. - * + * * @param in The InputStream containing the data to write to the file. * @param file The file to write the data to. * @return The total number of bytes written. @@ -449,7 +449,7 @@ public static final long transfer(InputStream in, File file) throws IOException /** * Transfers all characters that can be read from in to out . - * + * * @param in The Reader to read characters from. * @param out The Writer to write characters to. * @return The total number of characters transfered. @@ -470,7 +470,7 @@ public static final long transfer(Reader in, Writer out) throws IOException { /** * Writes all characters from a Reader to a file using the default character encoding. - * + * * @param reader The Reader containing the data to write to the file. * @param file The file to write the data to. * @return The total number of characters written. diff --git a/core/util/src/main/java/org/eclipse/rdf4j/common/io/IndentingWriter.java b/core/util/src/main/java/org/eclipse/rdf4j/common/io/IndentingWriter.java index 0fe223a3e1b..0065b90671d 100644 --- a/core/util/src/main/java/org/eclipse/rdf4j/common/io/IndentingWriter.java +++ b/core/util/src/main/java/org/eclipse/rdf4j/common/io/IndentingWriter.java @@ -12,7 +12,7 @@ /** * A writer that adds indentation to written text. - * + * * @author Arjohn Kampman */ public class IndentingWriter extends Writer { @@ -69,7 +69,7 @@ public IndentingWriter(Writer out) { /** * Sets the string that should be used for indentation. The default indentation string is a tab character. - * + * * @param indentString The indentation string, e.g. a tab or a number of spaces. */ public void setIndentationString(String indentString) { @@ -78,7 +78,7 @@ public void setIndentationString(String indentString) { /** * Gets the string used for indentation. - * + * * @return the indentation string. */ public String getIndentationString() { @@ -87,7 +87,7 @@ public String getIndentationString() { /** * Get the indentation level (number of tabs or indentation string). - * + * * @return level as an integer */ public int getIndentationLevel() { @@ -96,7 +96,7 @@ public int getIndentationLevel() { /** * Set indentation level (number of tabs or indentation string). - * + * * @param indentationLevel level as an integer */ public void setIndentationLevel(int indentationLevel) { @@ -105,7 +105,7 @@ public void setIndentationLevel(int indentationLevel) { /** * Get the number of characters read since end-of-line. - * + * * @return number of characters */ public int getCharactersSinceEOL() { @@ -128,7 +128,7 @@ public void decreaseIndentation() { /** * Writes an end-of-line character sequence and triggers the indentation for the text written on the next line. - * + * * @throws IOException */ public void writeEOL() throws IOException { diff --git a/core/util/src/main/java/org/eclipse/rdf4j/common/io/MavenUtil.java b/core/util/src/main/java/org/eclipse/rdf4j/common/io/MavenUtil.java index 8dee25340d4..0731ff0970a 100644 --- a/core/util/src/main/java/org/eclipse/rdf4j/common/io/MavenUtil.java +++ b/core/util/src/main/java/org/eclipse/rdf4j/common/io/MavenUtil.java @@ -14,14 +14,14 @@ /** * Maven-related utility methods. - * + * * @author Arjohn Kampman */ public class MavenUtil { /** * Loads the Maven pom.properties for the specified artifact. - * + * * @param groupId The artifact's group ID. * @param artifactId The artifact's ID. * @return The parsed pom properties, or null if the resource could not be found. @@ -34,7 +34,7 @@ public static Properties loadPomProperties(String groupId, String artifactId) th /** * Loads the version number from the pom.properties file for the specified artifact. - * + * * @param groupId The artifact's group ID. * @param artifactId The artifact's ID. * @param defaultVersion The version number to return in case no version number was found. diff --git a/core/util/src/main/java/org/eclipse/rdf4j/common/io/NioFile.java b/core/util/src/main/java/org/eclipse/rdf4j/common/io/NioFile.java index baaef653725..d34f94f62e4 100644 --- a/core/util/src/main/java/org/eclipse/rdf4j/common/io/NioFile.java +++ b/core/util/src/main/java/org/eclipse/rdf4j/common/io/NioFile.java @@ -22,7 +22,7 @@ * interrupts}. In case the file channel that is used by this class is closed due to such an event, it will try to * reopen the channel. The thread that causes the {@link ClosedByInterruptException} is not protected, assuming the * interrupt is intended to end the thread's operation. - * + * * @author Arjohn Kampman */ public final class NioFile implements Closeable { @@ -39,7 +39,7 @@ public final class NioFile implements Closeable { /** * Constructor Opens a file in read/write mode, creating a new one if the file doesn't exist. - * + * * @param file * @throws IOException */ @@ -49,7 +49,7 @@ public NioFile(File file) throws IOException { /** * Constructor Opens a file in a specific mode, creating a new one if the file doesn't exist. - * + * * @param file file * @param mode file mode * @throws IOException @@ -71,7 +71,7 @@ public NioFile(File file, String mode) throws IOException { /** * Open a file channel for random access. - * + * * @throws IOException */ private void open() throws IOException { @@ -81,7 +81,7 @@ private void open() throws IOException { /** * Reopen a channel closed by an exception, unless it was closed explicitly. - * + * * @param e exception that closed the channel * @throws IOException */ @@ -104,7 +104,7 @@ public synchronized void close() throws IOException { /** * Check if a file was closed explicitly. - * + * * @return true if it was closed explicitly */ public boolean isClosed() { @@ -117,7 +117,7 @@ public File getFile() { /** * Close any open channels and then deletes the file. - * + * * @return true if the file has been deleted successfully, false otherwise. * @throws IOException If there was a problem closing the open file channel. */ @@ -129,7 +129,7 @@ public boolean delete() throws IOException { /** * Performs a protected {@link FileChannel#force(boolean)} call. - * + * * @param metaData * @throws IOException */ @@ -148,7 +148,7 @@ public void force(boolean metaData) throws IOException { /** * Performs a protected {@link FileChannel#truncate(long)} call. - * + * * @param size * @throws IOException */ @@ -167,7 +167,7 @@ public void truncate(long size) throws IOException { /** * Performs a protected {@link FileChannel#size()} call. - * + * * @return size of the file * @throws IOException */ @@ -185,7 +185,7 @@ public long size() throws IOException { /** * Performs a protected {@link FileChannel#transferTo(long, long, WritableByteChannel)} call. - * + * * @param position position within the file * @param count number of bytes to transfer * @param target target channel @@ -206,7 +206,7 @@ public long transferTo(long position, long count, WritableByteChannel target) th /** * Performs a protected {@link FileChannel#write(ByteBuffer, long)} call. - * + * * @param buf buffer * @param offset non-negative offset * @return number of bytes written @@ -226,7 +226,7 @@ public int write(ByteBuffer buf, long offset) throws IOException { /** * Performs a protected {@link FileChannel#read(ByteBuffer, long)} call. - * + * * @param buf buffer to read * @param offset non-negative offset * @return number of bytes read @@ -246,7 +246,7 @@ public int read(ByteBuffer buf, long offset) throws IOException { /** * Write byte array to channel starting at offset. - * + * * @param value byte array to write * @param offset non-negative offset * @throws IOException @@ -257,7 +257,7 @@ public void writeBytes(byte[] value, long offset) throws IOException { /** * Read a byte array of a specific length from channel starting at offset. - * + * * @param offset * @param length * @return byte array @@ -271,7 +271,7 @@ public byte[] readBytes(long offset, int length) throws IOException { /** * Write single byte to channel starting at offset. - * + * * @param value value to write * @param offset non-negative offset * @throws IOException @@ -282,7 +282,7 @@ public void writeByte(byte value, long offset) throws IOException { /** * Read single byte from channel starting at offset. - * + * * @param offset non-negative offset * @return byte * @throws IOException @@ -293,7 +293,7 @@ public byte readByte(long offset) throws IOException { /** * Write long value to channel starting at offset. - * + * * @param value value to write * @param offset non-negative offset * @throws IOException @@ -306,7 +306,7 @@ public void writeLong(long value, long offset) throws IOException { /** * Read long value from channel starting at offset. - * + * * @param offset non-negative offset * @return long * @throws IOException @@ -319,7 +319,7 @@ public long readLong(long offset) throws IOException { /** * Write integer value to channel starting at offset. - * + * * @param value value to write * @param offset non-negative offset * @throws IOException @@ -332,7 +332,7 @@ public void writeInt(int value, long offset) throws IOException { /** * Read integer value from channel starting at offset. - * + * * @param offset non-negative offset * @return integer * @throws IOException diff --git a/core/util/src/main/java/org/eclipse/rdf4j/common/io/ResourceUtil.java b/core/util/src/main/java/org/eclipse/rdf4j/common/io/ResourceUtil.java index b68a880e589..84b0896598b 100644 --- a/core/util/src/main/java/org/eclipse/rdf4j/common/io/ResourceUtil.java +++ b/core/util/src/main/java/org/eclipse/rdf4j/common/io/ResourceUtil.java @@ -21,7 +21,7 @@ import java.util.Set; import javax.imageio.ImageIO; -import javax.swing.ImageIcon; +import javax.swing.*; /** * ResourceUtil is a utility class for retrieving resources (images, property-files, etc) from the classpath. @@ -30,7 +30,7 @@ public class ResourceUtil { /** * The URL to the specified resource - * + * * @param resourceName the name of the resource * @return the URL to the specified resource, or null if the resource could not be found */ @@ -58,7 +58,7 @@ public static URL getURL(String resourceName) { /** * Get the URLs for a resource name using the class loaders of the current thread and of the caller. - * + * * @param resourceName * @return set of URLs * @throws IOException @@ -80,7 +80,7 @@ public static Set getURLs(String resourceName) throws IOException { /** * Add an enumeration of URLs to a set of URLs - * + * * @param result result set * @param urls urls to add */ @@ -94,7 +94,7 @@ private static void addAll(Set result, Enumeration urls) { /** * Get an inputstream on the specified resource. - * + * * @param resourceName the name of the resource * @return an inputstream on the specified resource, or null if the resource could not be found */ @@ -122,7 +122,7 @@ public static InputStream getInputStream(String resourceName) { * Retrieve the String contents of the specified resource, obtained by opening in inputstream on the resource and * then interpreting the bytes contained in the inputstream as if they represented characters. This may not make * sense on all resources. There is no "magic" in this method to read anything other than plain text. - * + * * @param resourceName the name of the resource * @return the String contents of the specified resource, or null if the specified resource could not be found * @throws IOException when something goes wrong trying to read the resource @@ -145,7 +145,7 @@ public static String getString(String resourceName) throws IOException { /** * Retrieve an image icon resource. - * + * * @param resourceName the name of the resource * @return an image icon, or null if the specified resource could not be found */ @@ -162,7 +162,7 @@ public static ImageIcon getImageIcon(String resourceName) { /** * Retrieve an image resource - * + * * @param resourceName the name of the resource * @return an image, or null if the specified resource could not be found */ @@ -181,7 +181,7 @@ public static BufferedImage getImage(String resourceName) { /** * Retrieve a properties resource. - * + * * @param resourceName the name of the resource * @return a Properties object representing the contents of the resource, or null if the specified resource could * not be found @@ -203,7 +203,7 @@ public static Properties getProperties(String resourceName) throws IOException { /** * Store a resource to a file on the file system. - * + * * @param resourceName the name of the resource * @param output the file to write to * @throws IOException if there was a problem reading the resource or writing to the file @@ -217,7 +217,7 @@ public static void resourceToFile(String resourceName, File output) throws IOExc /** * Retrieve the calling class of a method in this class. - * + * * @return the calling class of a method in this class, or this class if no other class could be determined. */ private static Class getCaller() { @@ -246,6 +246,7 @@ private static Class getCaller() { private static final class CallerResolver extends SecurityManager { private static final CallerResolver INSTANCE; + static { try { INSTANCE = new CallerResolver(); diff --git a/core/util/src/main/java/org/eclipse/rdf4j/common/io/UncloseableInputStream.java b/core/util/src/main/java/org/eclipse/rdf4j/common/io/UncloseableInputStream.java index fc3b758746f..87fd1aa8e20 100644 --- a/core/util/src/main/java/org/eclipse/rdf4j/common/io/UncloseableInputStream.java +++ b/core/util/src/main/java/org/eclipse/rdf4j/common/io/UncloseableInputStream.java @@ -14,14 +14,14 @@ /** * A wrapper for an input stream to avoid allowing libraries to close input streams unexpectedly using the * {@link #close()} method. Instead, they must be closed by the creator using {@link #doClose()}. - * + * * @author Peter Ansell */ public class UncloseableInputStream extends FilterInputStream { /** * Constructor - * + * * @param parent input stream */ public UncloseableInputStream(InputStream parent) { @@ -35,7 +35,7 @@ public void close() throws IOException { /** * Invoke close on FilterInputStream parent class. - * + * * @throws IOException */ public void doClose() throws IOException { diff --git a/core/util/src/main/java/org/eclipse/rdf4j/common/io/UncloseableOutputStream.java b/core/util/src/main/java/org/eclipse/rdf4j/common/io/UncloseableOutputStream.java index ba9dde599a6..f8f10fc7b9e 100644 --- a/core/util/src/main/java/org/eclipse/rdf4j/common/io/UncloseableOutputStream.java +++ b/core/util/src/main/java/org/eclipse/rdf4j/common/io/UncloseableOutputStream.java @@ -14,14 +14,14 @@ /** * A wrapper for an output stream to avoid allowing libraries to close output streams unexpectedly using the * {@link #close()} method. Instead, they must be closed by the creator using {@link #doClose()}. - * + * * @author Bart Hanssens */ public class UncloseableOutputStream extends FilterOutputStream { /** * Constructor - * + * * @param parent output stream */ public UncloseableOutputStream(OutputStream parent) { @@ -35,7 +35,7 @@ public void close() throws IOException { /** * Invoke close on FilterOutputStream parent class. - * + * * @throws IOException */ public void doClose() throws IOException { diff --git a/core/util/src/main/java/org/eclipse/rdf4j/common/io/ZipUtil.java b/core/util/src/main/java/org/eclipse/rdf4j/common/io/ZipUtil.java index 51cda03468b..f88d1bc9f5c 100644 --- a/core/util/src/main/java/org/eclipse/rdf4j/common/io/ZipUtil.java +++ b/core/util/src/main/java/org/eclipse/rdf4j/common/io/ZipUtil.java @@ -28,7 +28,7 @@ public class ZipUtil { /** * Test if an input stream is a zip input stream by checking the "magic number" - * + * * @param in input stream * @return true if start of input stream matches magic number * @throws IOException @@ -42,7 +42,7 @@ public static boolean isZipStream(InputStream in) throws IOException { /** * Extract the contents of a zipfile to a directory. - * + * * @param zipFile the zip file to extract * @param destDir the destination directory * @throws IOException when something untoward happens during the extraction process @@ -55,7 +55,7 @@ public static void extract(File zipFile, File destDir) throws IOException { /** * Extract the contents of a zipfile to a directory. - * + * * @param zipFile the zip file to extract * @param destDir the destination directory * @throws IOException when something untoward happens during the extraction process @@ -72,7 +72,7 @@ public static void extract(ZipFile zipFile, File destDir) throws IOException { /** * Write an entry to a zip file. - * + * * @param zipFile the zip file to read from * @param entry the entry to process * @param destDir the file to write to diff --git a/core/util/src/main/java/org/eclipse/rdf4j/common/iteration/AbstractCloseableIteration.java b/core/util/src/main/java/org/eclipse/rdf4j/common/iteration/AbstractCloseableIteration.java index a66ab217c4e..030921a6b99 100644 --- a/core/util/src/main/java/org/eclipse/rdf4j/common/iteration/AbstractCloseableIteration.java +++ b/core/util/src/main/java/org/eclipse/rdf4j/common/iteration/AbstractCloseableIteration.java @@ -31,7 +31,7 @@ public abstract class AbstractCloseableIteration impleme /** * Checks whether this CloseableIteration has been closed. - * + * * @return true if the CloseableIteration has been closed, false otherwise. */ public final boolean isClosed() { @@ -51,7 +51,7 @@ public final void close() throws X { /** * Called by {@link #close} when it is called for the first time. This method is only called once on each iteration. * By default, this method does nothing. - * + * * @throws X */ protected void handleClose() throws X { diff --git a/core/util/src/main/java/org/eclipse/rdf4j/common/iteration/CloseableIteration.java b/core/util/src/main/java/org/eclipse/rdf4j/common/iteration/CloseableIteration.java index d9c2aaff2e9..28833f8cdaa 100644 --- a/core/util/src/main/java/org/eclipse/rdf4j/common/iteration/CloseableIteration.java +++ b/core/util/src/main/java/org/eclipse/rdf4j/common/iteration/CloseableIteration.java @@ -8,8 +8,6 @@ package org.eclipse.rdf4j.common.iteration; -import java.util.stream.Stream; - /** * An {@link Iteration} that can be closed to free resources that it is holding. CloseableIterations automatically free * their resources when exhausted. If not read until exhaustion or if you want to make sure the iteration is properly diff --git a/core/util/src/main/java/org/eclipse/rdf4j/common/iteration/ConvertingIteration.java b/core/util/src/main/java/org/eclipse/rdf4j/common/iteration/ConvertingIteration.java index d935b94a887..4845f1137a0 100644 --- a/core/util/src/main/java/org/eclipse/rdf4j/common/iteration/ConvertingIteration.java +++ b/core/util/src/main/java/org/eclipse/rdf4j/common/iteration/ConvertingIteration.java @@ -32,7 +32,7 @@ public abstract class ConvertingIteration extends Abs /** * Creates a new ConvertingIteration that operates on the supplied source type iteration. - * + * * @param iter The source type iteration for this ConvertingIteration, must not be null. */ protected ConvertingIteration(Iteration iter) { @@ -50,7 +50,7 @@ protected ConvertingIteration(Iteration iter) { /** * Checks whether the source type iteration contains more elements. - * + * * @return true if the source type iteration contains more elements, false otherwise. * @throws X */ @@ -68,7 +68,7 @@ public boolean hasNext() throws X { /** * Returns the next element from the source type iteration. - * + * * @throws X * @throws java.util.NoSuchElementException If all elements have been returned. * @throws IllegalStateException If the iteration has been closed. @@ -83,7 +83,7 @@ public T next() throws X { /** * Calls remove() on the underlying Iteration. - * + * * @throws UnsupportedOperationException If the wrapped Iteration does not support the remove operation. * @throws IllegalStateException If the Iteration has been closed, or if {@link #next} has not yet been * called, or {@link #remove} has already been called after the last call to diff --git a/core/util/src/main/java/org/eclipse/rdf4j/common/iteration/DistinctIteration.java b/core/util/src/main/java/org/eclipse/rdf4j/common/iteration/DistinctIteration.java index 12b68894ef6..fba8b8b4883 100644 --- a/core/util/src/main/java/org/eclipse/rdf4j/common/iteration/DistinctIteration.java +++ b/core/util/src/main/java/org/eclipse/rdf4j/common/iteration/DistinctIteration.java @@ -31,7 +31,7 @@ public class DistinctIteration extends FilterIteration iter) { diff --git a/core/util/src/main/java/org/eclipse/rdf4j/common/iteration/ExceptionConvertingIteration.java b/core/util/src/main/java/org/eclipse/rdf4j/common/iteration/ExceptionConvertingIteration.java index 16912e26593..2fdc7a2be18 100644 --- a/core/util/src/main/java/org/eclipse/rdf4j/common/iteration/ExceptionConvertingIteration.java +++ b/core/util/src/main/java/org/eclipse/rdf4j/common/iteration/ExceptionConvertingIteration.java @@ -32,7 +32,7 @@ public abstract class ExceptionConvertingIteration exten /** * Creates a new ExceptionConvertingIteration that operates on the supplied iteration. - * + * * @param iter The Iteration that this ExceptionConvertingIteration operates on, must not be null. */ protected ExceptionConvertingIteration(Iteration iter) { @@ -50,7 +50,7 @@ protected ExceptionConvertingIteration(Iterationtrue if the underlying Iteration contains more elements, false otherwise. * @throws X */ @@ -72,7 +72,7 @@ public boolean hasNext() throws X { /** * Returns the next element from the wrapped Iteration. - * + * * @throws X * @throws java.util.NoSuchElementException If all elements have been returned. * @throws IllegalStateException If the Iteration has been closed. @@ -96,7 +96,7 @@ public E next() throws X { /** * Calls remove() on the underlying Iteration. - * + * * @throws UnsupportedOperationException If the wrapped Iteration does not support the remove operation. * @throws IllegalStateException If the Iteration has been closed, or if {@link #next} has not yet been * called, or {@link #remove} has already been called after the last call to diff --git a/core/util/src/main/java/org/eclipse/rdf4j/common/iteration/FilterIteration.java b/core/util/src/main/java/org/eclipse/rdf4j/common/iteration/FilterIteration.java index 4c9aacf012c..99efa39bdc3 100644 --- a/core/util/src/main/java/org/eclipse/rdf4j/common/iteration/FilterIteration.java +++ b/core/util/src/main/java/org/eclipse/rdf4j/common/iteration/FilterIteration.java @@ -88,7 +88,7 @@ private void findNextElement() throws X { /** * Tests whether or not the specified object should be returned by this Iteration. All objects from the wrapped * Iteration pass through this method in the same order as they are coming from the wrapped Iteration. - * + * * @param object The object to be tested. * @return true if the object should be returned, false otherwise. * @throws X diff --git a/core/util/src/main/java/org/eclipse/rdf4j/common/iteration/InterruptTask.java b/core/util/src/main/java/org/eclipse/rdf4j/common/iteration/InterruptTask.java index 83f4d228b4a..900d934688f 100644 --- a/core/util/src/main/java/org/eclipse/rdf4j/common/iteration/InterruptTask.java +++ b/core/util/src/main/java/org/eclipse/rdf4j/common/iteration/InterruptTask.java @@ -12,7 +12,7 @@ /** * TimerTask that keeps a weak reference to the supplied iteration and when activated, interrupts it. - * + * * @author Jeen Broekstra */ class InterruptTask extends TimerTask { diff --git a/core/util/src/main/java/org/eclipse/rdf4j/common/iteration/IterationSpliterator.java b/core/util/src/main/java/org/eclipse/rdf4j/common/iteration/IterationSpliterator.java index 941413caaf5..9a49b8fe353 100644 --- a/core/util/src/main/java/org/eclipse/rdf4j/common/iteration/IterationSpliterator.java +++ b/core/util/src/main/java/org/eclipse/rdf4j/common/iteration/IterationSpliterator.java @@ -7,12 +7,10 @@ *******************************************************************************/ package org.eclipse.rdf4j.common.iteration; -import java.util.Iterator; import java.util.Objects; import java.util.Spliterator; import java.util.Spliterators; import java.util.function.Consumer; -import java.util.stream.StreamSupport; /** * A {@link Spliterator} implementation that wraps an {@link Iteration}. It handles occurrence of checked exceptions by diff --git a/core/util/src/main/java/org/eclipse/rdf4j/common/iteration/IterationWrapper.java b/core/util/src/main/java/org/eclipse/rdf4j/common/iteration/IterationWrapper.java index 314433263fe..8dbb30f7a5c 100644 --- a/core/util/src/main/java/org/eclipse/rdf4j/common/iteration/IterationWrapper.java +++ b/core/util/src/main/java/org/eclipse/rdf4j/common/iteration/IterationWrapper.java @@ -23,7 +23,7 @@ public class IterationWrapper extends AbstractCloseableI /** * The wrapped Iteration. - * + * * @deprecated This will be changed to private, possibly with an accessor in future. Do not rely on it. */ @Deprecated @@ -35,7 +35,7 @@ public class IterationWrapper extends AbstractCloseableI /** * Creates a new IterationWrapper that operates on the supplied Iteration. - * + * * @param iter The wrapped Iteration for this IterationWrapper, must not be null. */ protected IterationWrapper(Iteration iter) { @@ -49,7 +49,7 @@ protected IterationWrapper(Iteration iter) { /** * Checks whether the wrapped Iteration contains more elements, closing this Iteration when this is not the case. - * + * * @return true if the wrapped Iteration contains more elements, false otherwise. */ @Override @@ -69,7 +69,7 @@ public boolean hasNext() throws X { /** * Returns the next element from the wrapped Iteration. - * + * * @throws java.util.NoSuchElementException If all elements have been returned or it has been closed. */ @Override @@ -90,7 +90,7 @@ public E next() throws X { /** * Removes the last element that has been returned from the wrapped Iteration. - * + * * @throws UnsupportedOperationException If the wrapped Iteration does not support the remove operation. * @throws IllegalStateException if the Iteration has been closed, or if {@link #next} has not yet been * called, or {@link #remove} has already been called after the last call to diff --git a/core/util/src/main/java/org/eclipse/rdf4j/common/iteration/Iterations.java b/core/util/src/main/java/org/eclipse/rdf4j/common/iteration/Iterations.java index ccc6fd45b3c..8dd501280fd 100644 --- a/core/util/src/main/java/org/eclipse/rdf4j/common/iteration/Iterations.java +++ b/core/util/src/main/java/org/eclipse/rdf4j/common/iteration/Iterations.java @@ -10,7 +10,6 @@ import java.util.ArrayList; import java.util.Collection; -import java.util.HashSet; import java.util.List; import java.util.Set; import java.util.Spliterator; diff --git a/core/util/src/main/java/org/eclipse/rdf4j/common/iteration/LimitIteration.java b/core/util/src/main/java/org/eclipse/rdf4j/common/iteration/LimitIteration.java index a1369726dda..b434c66fe9f 100644 --- a/core/util/src/main/java/org/eclipse/rdf4j/common/iteration/LimitIteration.java +++ b/core/util/src/main/java/org/eclipse/rdf4j/common/iteration/LimitIteration.java @@ -36,7 +36,7 @@ public class LimitIteration extends IterationWrappernull. * @param limit The number of query answers to return, must be >= 0. */ diff --git a/core/util/src/main/java/org/eclipse/rdf4j/common/iteration/LookAheadIteration.java b/core/util/src/main/java/org/eclipse/rdf4j/common/iteration/LookAheadIteration.java index ffdedb8a316..9acb7870cf3 100644 --- a/core/util/src/main/java/org/eclipse/rdf4j/common/iteration/LookAheadIteration.java +++ b/core/util/src/main/java/org/eclipse/rdf4j/common/iteration/LookAheadIteration.java @@ -36,7 +36,7 @@ protected LookAheadIteration() { /** * Gets the next element. Subclasses should implement this method so that it returns the next element. - * + * * @return The next element, or null if no more elements are available. */ protected abstract E getNextElement() throws X; @@ -71,7 +71,7 @@ public final E next() throws X { /** * Fetches the next element if it hasn't been fetched yet and stores it in {@link #nextElement}. - * + * * @return The next element, or null if there are no more results. * @throws X If there is an issue getting the next element or closing the iteration. */ diff --git a/core/util/src/main/java/org/eclipse/rdf4j/common/iteration/MinusIteration.java b/core/util/src/main/java/org/eclipse/rdf4j/common/iteration/MinusIteration.java index 6e4fb9b090d..65eee4e8964 100644 --- a/core/util/src/main/java/org/eclipse/rdf4j/common/iteration/MinusIteration.java +++ b/core/util/src/main/java/org/eclipse/rdf4j/common/iteration/MinusIteration.java @@ -8,7 +8,6 @@ package org.eclipse.rdf4j.common.iteration; -import java.util.HashSet; import java.util.Set; /** diff --git a/core/util/src/main/java/org/eclipse/rdf4j/common/iteration/OffsetIteration.java b/core/util/src/main/java/org/eclipse/rdf4j/common/iteration/OffsetIteration.java index 81b9d5c35b4..f0bca5ac313 100644 --- a/core/util/src/main/java/org/eclipse/rdf4j/common/iteration/OffsetIteration.java +++ b/core/util/src/main/java/org/eclipse/rdf4j/common/iteration/OffsetIteration.java @@ -33,7 +33,7 @@ public class OffsetIteration extends FilterIterationnull. * @param offset The number of elements to skip, must be larger than or equal to 0. */ diff --git a/core/util/src/main/java/org/eclipse/rdf4j/common/iteration/QueueIteration.java b/core/util/src/main/java/org/eclipse/rdf4j/common/iteration/QueueIteration.java index d1e583bf9ed..f098f1ee26d 100644 --- a/core/util/src/main/java/org/eclipse/rdf4j/common/iteration/QueueIteration.java +++ b/core/util/src/main/java/org/eclipse/rdf4j/common/iteration/QueueIteration.java @@ -17,7 +17,7 @@ /** * Makes working with a queue easier by adding the methods {@link #done()} and {@link #toss(Exception)} and after * converting the Exception to the required type using {@link #convert(Exception)}. - * + * * @author James Leigh */ public abstract class QueueIteration extends LookAheadIteration { @@ -32,7 +32,7 @@ public abstract class QueueIteration extends LookAheadIt /** * Creates an QueueIteration with the given (fixed) capacity and default access policy. - * + * * @param capacity the capacity of this queue */ protected QueueIteration(int capacity) { @@ -41,7 +41,7 @@ protected QueueIteration(int capacity) { /** * Creates an QueueIteration with the given (fixed) capacity and the specified access policy. - * + * * @param capacity the capacity of this queue * @param fair if true then queue accesses for threads blocked on insertion or removal, are processed * in FIFO order; if false the access order is unspecified. @@ -55,7 +55,7 @@ protected QueueIteration(int capacity, boolean fair) { * Creates an QueueIteration with the given {@link BlockingQueue} as its backing queue.
    * It may not be threadsafe to modify or access the given {@link BlockingQueue} from other locations. This method * only enables the default {@link ArrayBlockingQueue} to be overridden. - * + * * @param queue A BlockingQueue that is not used in other locations, but will be used as the backing Queue * implementation for this cursor. */ diff --git a/core/util/src/main/java/org/eclipse/rdf4j/common/iteration/ReducedIteration.java b/core/util/src/main/java/org/eclipse/rdf4j/common/iteration/ReducedIteration.java index 54aeccd2500..3bd1de49e42 100644 --- a/core/util/src/main/java/org/eclipse/rdf4j/common/iteration/ReducedIteration.java +++ b/core/util/src/main/java/org/eclipse/rdf4j/common/iteration/ReducedIteration.java @@ -9,7 +9,7 @@ /** * Removes consecutive duplicates from the object stream. - * + * * @author Arjohn Kampman */ public class ReducedIteration extends FilterIteration { diff --git a/core/util/src/main/java/org/eclipse/rdf4j/common/iteration/SilentIteration.java b/core/util/src/main/java/org/eclipse/rdf4j/common/iteration/SilentIteration.java index ae4b3551fb7..507f7ed39a5 100644 --- a/core/util/src/main/java/org/eclipse/rdf4j/common/iteration/SilentIteration.java +++ b/core/util/src/main/java/org/eclipse/rdf4j/common/iteration/SilentIteration.java @@ -14,7 +14,7 @@ /** * An {@link IterationWrapper} that silently ignores any errors that occur during processing. - * + * * @author Jeen Broekstra */ public class SilentIteration extends IterationWrapper { diff --git a/core/util/src/main/java/org/eclipse/rdf4j/common/iteration/TimeLimitIteration.java b/core/util/src/main/java/org/eclipse/rdf4j/common/iteration/TimeLimitIteration.java index 42122f00d71..8dbea3ec616 100644 --- a/core/util/src/main/java/org/eclipse/rdf4j/common/iteration/TimeLimitIteration.java +++ b/core/util/src/main/java/org/eclipse/rdf4j/common/iteration/TimeLimitIteration.java @@ -113,7 +113,7 @@ private final void checkInterrupted() throws X { /** * If the iteration is interrupted by its time limit, this method is called to generate and throw the appropriate * exception. - * + * * @throws X The generic class of exceptions thrown by this method. */ protected abstract void throwInterruptedException() throws X; diff --git a/core/util/src/main/java/org/eclipse/rdf4j/common/iteration/UnionIteration.java b/core/util/src/main/java/org/eclipse/rdf4j/common/iteration/UnionIteration.java index bed2ec778fd..bb51015ce19 100644 --- a/core/util/src/main/java/org/eclipse/rdf4j/common/iteration/UnionIteration.java +++ b/core/util/src/main/java/org/eclipse/rdf4j/common/iteration/UnionIteration.java @@ -34,7 +34,7 @@ public class UnionIteration extends LookAheadIteration... args) { @@ -43,7 +43,7 @@ public UnionIteration(Iteration... args) { /** * Creates a new UnionIteration that returns the bag union of the results of a number of Iterations. - * + * * @param args The Iterations containing the elements to iterate over. */ public UnionIteration(Iterable> args) { diff --git a/core/util/src/main/java/org/eclipse/rdf4j/common/iterator/AbstractCloseableIterator.java b/core/util/src/main/java/org/eclipse/rdf4j/common/iterator/AbstractCloseableIterator.java index eb0a2126eb7..afa94d30248 100644 --- a/core/util/src/main/java/org/eclipse/rdf4j/common/iterator/AbstractCloseableIterator.java +++ b/core/util/src/main/java/org/eclipse/rdf4j/common/iterator/AbstractCloseableIterator.java @@ -33,7 +33,7 @@ public abstract class AbstractCloseableIterator implements Iterator, Close /** * Checks whether this Iterator has been closed. - * + * * @return true if the Iterator has been closed, false otherwise. */ public final boolean isClosed() { @@ -55,7 +55,7 @@ public final void close() throws IOException { /** * Called by {@link #close} when it is called for the first time. This method is only called once on each iteration. * By default, this method does nothing. - * + * * @throws X */ protected void handleClose() throws IOException { diff --git a/core/util/src/main/java/org/eclipse/rdf4j/common/iterator/CloseableIterationIterator.java b/core/util/src/main/java/org/eclipse/rdf4j/common/iterator/CloseableIterationIterator.java index 1a280233553..cc9fe68f0b4 100644 --- a/core/util/src/main/java/org/eclipse/rdf4j/common/iterator/CloseableIterationIterator.java +++ b/core/util/src/main/java/org/eclipse/rdf4j/common/iterator/CloseableIterationIterator.java @@ -18,7 +18,7 @@ /** * Wraps an Iteration as an Iterator. If the Iteration is a CloseableIteration then this.close() will close it and it * will also be automatically closed when this Iterator is exhausted. - * + * * @author Mark */ public class CloseableIterationIterator implements Iterator, Closeable { diff --git a/core/util/src/main/java/org/eclipse/rdf4j/common/iterator/LookAheadIterator.java b/core/util/src/main/java/org/eclipse/rdf4j/common/iterator/LookAheadIterator.java index 7073eaa8f68..c365833f9bf 100644 --- a/core/util/src/main/java/org/eclipse/rdf4j/common/iterator/LookAheadIterator.java +++ b/core/util/src/main/java/org/eclipse/rdf4j/common/iterator/LookAheadIterator.java @@ -37,7 +37,7 @@ protected LookAheadIterator() { /** * Gets the next element. Subclasses should implement this method so that it returns the next element. - * + * * @return The next element, or null if no more elements are available. */ protected abstract E getNextElement(); @@ -71,7 +71,7 @@ public final E next() { /** * Fetches the next element if it hasn't been fetched yet and stores it in {@link #nextElement}. - * + * * @throws X */ private void lookAhead() { diff --git a/core/util/src/main/java/org/eclipse/rdf4j/common/iterator/UnionIterator.java b/core/util/src/main/java/org/eclipse/rdf4j/common/iterator/UnionIterator.java index fb978b5338f..80a3da9554c 100644 --- a/core/util/src/main/java/org/eclipse/rdf4j/common/iterator/UnionIterator.java +++ b/core/util/src/main/java/org/eclipse/rdf4j/common/iterator/UnionIterator.java @@ -34,7 +34,7 @@ public class UnionIterator extends LookAheadIterator { /** * Creates a new UnionIterator that returns the bag union of the results of a number of Iterators. - * + * * @param args The Iterators containing the elements to iterate over. */ public UnionIterator(Iterable... args) { diff --git a/core/util/src/main/java/org/eclipse/rdf4j/common/lang/FileFormat.java b/core/util/src/main/java/org/eclipse/rdf4j/common/lang/FileFormat.java index 9337528a64d..b277431b63c 100644 --- a/core/util/src/main/java/org/eclipse/rdf4j/common/lang/FileFormat.java +++ b/core/util/src/main/java/org/eclipse/rdf4j/common/lang/FileFormat.java @@ -20,7 +20,7 @@ * Abstract representation of a file format. File formats are identified by a {@link #getName() name} and can have one * or more associated MIME types, zero or more associated file extensions and can specify a (default) character * encoding. - * + * * @author Arjohn Kampman */ public class FileFormat { @@ -56,7 +56,7 @@ public class FileFormat { /** * Creates a new FileFormat object. - * + * * @param name The name of the file format, e.g. "PLAIN TEXT". * @param mimeType The (default) MIME type of the file format, e.g. text/plain for plain text files. * @param charset The default character encoding of the file format. Specify null if not applicable. @@ -68,7 +68,7 @@ public FileFormat(String name, String mimeType, Charset charset, String fileExte /** * Creates a new FileFormat object. - * + * * @param name The name of the file format, e.g. "PLAIN TEXT". * @param mimeType The (default) MIME type of the file format, e.g. text/plain for plain text files. * @param charset The default character encoding of the file format. Specify null if not applicable. @@ -81,7 +81,7 @@ public FileFormat(String name, String mimeType, Charset charset, Collectiontext/plain for theplain text files. The * first item in the list is interpreted as the default MIME type for the format. The supplied @@ -108,7 +108,7 @@ public FileFormat(String name, Collection mimeTypes, Charset charset, Co /** * Gets the name of this file format. - * + * * @return A human-readable format name, e.g. "PLAIN TEXT". */ public String getName() { @@ -117,7 +117,7 @@ public String getName() { /** * Gets the default MIME type for this file format. - * + * * @return A MIME type string, e.g. "text/plain". */ public String getDefaultMIMEType() { @@ -127,7 +127,7 @@ public String getDefaultMIMEType() { /** * Checks if the specified MIME type matches the FileFormat's default MIME type. The MIME types are compared * ignoring upper/lower-case differences. - * + * * @param mimeType The MIME type to compare to the FileFormat's default MIME type. * @return true if the specified MIME type matches the FileFormat's default MIME type. */ @@ -137,7 +137,7 @@ public boolean hasDefaultMIMEType(String mimeType) { /** * Gets the file format's MIME types. - * + * * @return An unmodifiable list of MIME type strings, e.g. "text/plain". */ public List getMIMETypes() { @@ -147,13 +147,14 @@ public List getMIMETypes() { /** * Checks if specified MIME type matches one of the FileFormat's MIME types. The MIME types are compared ignoring * upper/lower-case differences. - * + * * @param mimeType The MIME type to compare to the FileFormat's MIME types. * @return true if the specified MIME type matches one of the FileFormat's MIME types. */ public boolean hasMIMEType(String mimeType) { - if (mimeType == null) + if (mimeType == null) { return false; + } String type = mimeType; if (mimeType.indexOf(';') > 0) { type = mimeType.substring(0, mimeType.indexOf(';')); @@ -172,7 +173,7 @@ public boolean hasMIMEType(String mimeType) { /** * Gets the default file name extension for this file format. - * + * * @return A file name extension (excluding the dot), e.g. "txt", or null if there is no common file * extension for the format. */ @@ -187,7 +188,7 @@ public String getDefaultFileExtension() { /** * Checks if the specified file name extension matches the FileFormat's default file name extension. The file name * extension MIME types are compared ignoring upper/lower-case differences. - * + * * @param extension The file extension to compare to the FileFormat's file extension. * @return true if the file format has a default file name extension and if it matches the specified * extension, false otherwise. @@ -199,7 +200,7 @@ public boolean hasDefaultFileExtension(String extension) { /** * Gets the file format's file extensions. - * + * * @return An unmodifiable list of file extension strings, e.g. "txt". */ public List getFileExtensions() { @@ -209,7 +210,7 @@ public List getFileExtensions() { /** * Checks if the FileFormat's file extension is equal to the specified file extension. The file extensions are * compared ignoring upper/lower-case differences. - * + * * @param extension The file extension to compare to the FileFormat's file extension. * @return true if the specified file extension is equal to the FileFormat's file extension. */ @@ -225,7 +226,7 @@ public boolean hasFileExtension(String extension) { /** * Get the (default) charset for this file format. - * + * * @return the (default) charset for this file format, or null if this format does not have a default charset. */ public Charset getCharset() { @@ -234,7 +235,7 @@ public Charset getCharset() { /** * Checks if the FileFormat has a (default) charset. - * + * * @return true if the FileFormat has a (default) charset. */ public boolean hasCharset() { @@ -295,7 +296,7 @@ public String toString() { /** * Tries to match the specified MIME type with the MIME types of the supplied file formats. - * + * * @param mimeType A MIME type, e.g. "text/plain". * @param fileFormats The file formats to match the MIME type against. * @return A FileFormat object if the MIME type was recognized, or {@link Optional#empty()} otherwise. @@ -320,7 +321,7 @@ public static Optional matchMIMEType(String mimeType /** * Tries to match the specified file name with the file extensions of the supplied file formats. - * + * * @param fileName A file name. * @param fileFormats The file formats to match the file name extension against. * @return A FileFormat that matches the file name extension, or {@link Optional#empty()} otherwise. diff --git a/core/util/src/main/java/org/eclipse/rdf4j/common/lang/ObjectUtil.java b/core/util/src/main/java/org/eclipse/rdf4j/common/lang/ObjectUtil.java index 2e3110e155a..90a95725131 100644 --- a/core/util/src/main/java/org/eclipse/rdf4j/common/lang/ObjectUtil.java +++ b/core/util/src/main/java/org/eclipse/rdf4j/common/lang/ObjectUtil.java @@ -10,14 +10,14 @@ /** * Generic utility methods related to objects. - * + * * @author Arjohn Kampman */ public class ObjectUtil { /** * Compares two objects or null references. - * + * * @param o1 The first object. * @param o2 The second object * @return true if both objects are null, if the object references are identical, or if the @@ -30,7 +30,7 @@ public static boolean nullEquals(Object o1, Object o2) { /** * Returns the hash code of the supplied object, or 0 if a null reference is supplied. - * + * * @param o An object or null reference. * @return The object's hash code, or 0 if the parameter is null. */ diff --git a/core/util/src/main/java/org/eclipse/rdf4j/common/lang/service/FileFormatServiceRegistry.java b/core/util/src/main/java/org/eclipse/rdf4j/common/lang/service/FileFormatServiceRegistry.java index 8790bea2f51..50069866ab7 100644 --- a/core/util/src/main/java/org/eclipse/rdf4j/common/lang/service/FileFormatServiceRegistry.java +++ b/core/util/src/main/java/org/eclipse/rdf4j/common/lang/service/FileFormatServiceRegistry.java @@ -14,7 +14,7 @@ /** * A special {@link ServiceRegistry} for {@link FileFormat} related services. This FileFormat-specific subclass offers * some utility methods for matching MIME types and file extensions to the file formats of registered services. - * + * * @author Arjohn Kampman */ public abstract class FileFormatServiceRegistry extends ServiceRegistry { @@ -25,7 +25,7 @@ protected FileFormatServiceRegistry(Class serviceClass) { /** * Tries to match a MIME type against the list of registered file formats. - * + * * @param mimeType A MIME type, e.g. "text/plain". * @return The matching {@link FileFormat}, or {@link Optional#empty()} if no match was found. */ @@ -35,7 +35,7 @@ public Optional getFileFormatForMIMEType(String mimeType) { /** * Tries to match the extension of a file name against the list of registred file formats. - * + * * @param fileName A file name. * @return The matching {@link FileFormat}, or {@link Optional#empty()} if no match was found. */ diff --git a/core/util/src/main/java/org/eclipse/rdf4j/common/lang/service/ServiceRegistry.java b/core/util/src/main/java/org/eclipse/rdf4j/common/lang/service/ServiceRegistry.java index 4686e5b80d7..752b954d2f2 100644 --- a/core/util/src/main/java/org/eclipse/rdf4j/common/lang/service/ServiceRegistry.java +++ b/core/util/src/main/java/org/eclipse/rdf4j/common/lang/service/ServiceRegistry.java @@ -22,7 +22,7 @@ /** * A registry that stores services by some key. Upon initialization, the registry searches for service description files * at META-INF/services/<service class name> and initializes itself accordingly. - * + * * @see javax.imageio.spi.ServiceRegistry * @author Arjohn Kampman */ @@ -61,7 +61,7 @@ protected ServiceRegistry(Class serviceClass) { /** * Adds a service to the registry. Any service that is currently registered for the same key (as specified by * {@link #getKey(Object)}) will be replaced with the new service. - * + * * @param service The service that should be added to the registry. * @return The previous service that was registered for the same key, or {@link Optional#empty()} if there was no * such service. @@ -72,7 +72,7 @@ public Optional add(S service) { /** * Removes a service from the registry. - * + * * @param service The service be removed from the registry. */ public void remove(S service) { @@ -81,7 +81,7 @@ public void remove(S service) { /** * Gets the service for the specified key, if any. - * + * * @param key The key identifying which service to get. * @return The service for the specified key, or {@link Optional#empty()} if no such service is avaiable. */ @@ -91,7 +91,7 @@ public Optional get(K key) { /** * Checks whether a service for the specified key is available. - * + * * @param key The key identifying which service to search for. * @return true if a service for the specific key is available, false otherwise. */ @@ -101,7 +101,7 @@ public boolean has(K key) { /** * Gets all registered services. - * + * * @return An unmodifiable collection containing all registered servivces. */ public Collection getAll() { @@ -110,7 +110,7 @@ public Collection getAll() { /** * Gets the set of registered keys. - * + * * @return An unmodifiable set containing all registered keys. */ public Set getKeys() { @@ -119,7 +119,7 @@ public Set getKeys() { /** * Gets the key for the specified service. - * + * * @param service The service to get the key for. * @return The key for the specified service. */ diff --git a/core/util/src/main/java/org/eclipse/rdf4j/common/net/ParsedIRI.java b/core/util/src/main/java/org/eclipse/rdf4j/common/net/ParsedIRI.java index 44d6337ec81..886dfc7bcce 100644 --- a/core/util/src/main/java/org/eclipse/rdf4j/common/net/ParsedIRI.java +++ b/core/util/src/main/java/org/eclipse/rdf4j/common/net/ParsedIRI.java @@ -702,8 +702,9 @@ public String relativize(String iri) { public ParsedIRI relativize(ParsedIRI absolute) { // identity URI reference String _frag = absolute.getFragment(); - if (iri.equals(absolute.iri) && _frag == null) + if (iri.equals(absolute.iri) && _frag == null) { return new ParsedIRI(null, null, null, -1, "", null, null); + } // different scheme or authority if (absolute.getScheme() != null && !absolute.getScheme().equalsIgnoreCase(this.getScheme())) { return absolute; @@ -732,8 +733,9 @@ public ParsedIRI relativize(ParsedIRI absolute) { } } // opaque IRI - if (this.isOpaque() || absolute.isOpaque()) + if (this.isOpaque() || absolute.isOpaque()) { return absolute; + } // query string URI reference String _query = absolute.getQuery(); if (_query != null) { @@ -913,11 +915,13 @@ private String parseHost() throws URISyntaxException { pos = startPos; String host = parsePctEncoded(hchar, ':', '/'); - if (isTLDValid(start) || scheme.equalsIgnoreCase("bundle")) { - return host; - } else { - throw parsingException; + // http(s) scheme requires a valid top-level domain + if (isScheme("http") || isScheme("https")) { + if (!isTLDValid(start)) { + throw parsingException; + } } + return host; } } else { return parsePctEncoded(hchar, ':', '/'); @@ -1292,8 +1296,9 @@ private String relativizePath(String absolute) { while (same < paths.length && same < seg.length - 1 && paths[same].equals(seg[same])) { same++; } - if (same < 2) // no path segments in common + if (same < 2) { return absolute; + } StringBuilder sb = new StringBuilder(); // last segment is empty or file name for (int i = same; i < paths.length - 1; i++) { diff --git a/core/util/src/main/java/org/eclipse/rdf4j/common/net/ParsedURI.java b/core/util/src/main/java/org/eclipse/rdf4j/common/net/ParsedURI.java index d551d8c5403..9696935fb10 100644 --- a/core/util/src/main/java/org/eclipse/rdf4j/common/net/ParsedURI.java +++ b/core/util/src/main/java/org/eclipse/rdf4j/common/net/ParsedURI.java @@ -18,7 +18,7 @@ * relative URIs correctly. *

    * Note: this implementation is not guaranteed to handle ipv6 addresses correctly (yet). - * + * * @deprecated use {@link ParsedIRI} instead */ @Deprecated diff --git a/core/util/src/main/java/org/eclipse/rdf4j/common/text/ASCIIUtil.java b/core/util/src/main/java/org/eclipse/rdf4j/common/text/ASCIIUtil.java index 6171313fe76..6860ba0c679 100644 --- a/core/util/src/main/java/org/eclipse/rdf4j/common/text/ASCIIUtil.java +++ b/core/util/src/main/java/org/eclipse/rdf4j/common/text/ASCIIUtil.java @@ -8,15 +8,13 @@ package org.eclipse.rdf4j.common.text; -import java.util.Arrays; - /** * Utility methods for ASCII character checking. */ public class ASCIIUtil { /** * Checks whether the supplied character is a letter or number. - * + * * @param c character * @return true if the character is a letter or a number * @see #isLetter @@ -28,7 +26,7 @@ public static boolean isLetterOrNumber(int c) { /** * Checks whether the supplied character is a letter. - * + * * @param c character * @return true if the character is in the range [a-z] or [A-Z] */ @@ -38,7 +36,7 @@ public static boolean isLetter(int c) { /** * Checks whether the supplied character is an upper-case letter. - * + * * @param c character * @return true if the character is in the range [A-Z] */ @@ -48,7 +46,7 @@ public static boolean isUpperCaseLetter(int c) { /** * Checks whether the supplied character is an lower-case letter. - * + * * @param c character * @return true if the character is in the range [a-z] */ @@ -58,7 +56,7 @@ public static boolean isLowerCaseLetter(int c) { /** * Checks whether the supplied character is a number. - * + * * @param c character * @return true if the character is in the range [0-9] */ @@ -68,7 +66,7 @@ public static boolean isNumber(int c) { /** * Check whether the supplied character is a Hexadecimal character. - * + * * @param c character * @return true if c is a hexadecimal character, false otherwise. */ diff --git a/core/util/src/main/java/org/eclipse/rdf4j/common/text/StringUtil.java b/core/util/src/main/java/org/eclipse/rdf4j/common/text/StringUtil.java index 13c2a7f2bde..92b76039b52 100644 --- a/core/util/src/main/java/org/eclipse/rdf4j/common/text/StringUtil.java +++ b/core/util/src/main/java/org/eclipse/rdf4j/common/text/StringUtil.java @@ -35,7 +35,7 @@ public class StringUtil { /** * Substitute String "old" by String "new" in String "text" everywhere. This is a static util function that I could * not place anywhere more appropriate. The name of this function is from the good-old awk time. - * + * * @param olds The String to be substituted. * @param news The String is the new content. * @param text The String in which the substitution is done. @@ -88,13 +88,13 @@ private static String hex(int c) { /** * Escapes a string to a (mostly) conforming IRI value and append it to the appendable. - * + * * Non-ASCII (valid) values can optionally be numerically encoded by setting escapeUnicode to true. Most characters * that are invalid in an IRI - like a white space or control character - are percent-encoded. - * + * * This is slightly faster than {@link org.eclipse.rdf4j.common.net.ParsedIRI#create(String)} for valid IRI (without * percents) and much faster for IRI with invalid (percent-encoded) characters, though it is less accurate. - * + * * @param str * @param appendable * @param escapeUnicode escape non-ASCII values numerically @@ -140,7 +140,7 @@ public static void simpleEscapeIRI(String str, Appendable appendable, boolean es /** * Returns all text occurring after the specified separator character, or the entire string when the separator char * does not occur. - * + * * @param string The string of which the substring needs to be determined. * @param separatorChar The character to look for. * @return All text occurring after the separator character, or the entire string when the character does not occur. @@ -157,7 +157,7 @@ public static String getAllAfter(String string, char separatorChar) { /** * Returns all text occurring before the specified separator character, or the entire string when the separator char * does not occur. - * + * * @param string The string of which the substring needs to be determined. * @param separatorChar The character to look for. * @return All text occurring before the separator character, or the entire string when the character does not @@ -171,7 +171,7 @@ public static String getAllBefore(String string, char separatorChar) { /** * Encodes an array of Strings into a single String than can be decoded to the original array using the * corresponding decode method.Useful for e.g.storing an array of Strings as a single entry in a Preferences node. - * + * * @param array array of strings * @return single string */ @@ -194,7 +194,7 @@ public static String encodeArray(String[] array) { /** * Decodes a String generated by encodeArray. - * + * * @param encodedArray * @return array of strings */ @@ -216,7 +216,7 @@ public static String[] decodeArray(String encodedArray) { /** * Derives the initial text from the supplied text.The returned text excludes whitespace and other special * characters and is useful for display purposes (e.g.previews). - * + * * @param text * @return */ @@ -258,7 +258,7 @@ && isInitialTextChar(text.charAt(endIdx))) { /** * Titles shorter than MIN_TITLE_LENGTH and long titles that don't contain a single space character are considered * to be garbage. - * + * * @param text * @return true if considered garbage */ @@ -283,7 +283,7 @@ public static boolean isGarbageText(String text) { /** * Appends the specified character n times to the supplied StringBuilder. - * + * * @param c The character to append. * @param n The number of times the character should be appended. * @param sb The StringBuilder to append the character(s) to. @@ -298,7 +298,7 @@ public static void appendN(char c, int n, StringBuilder sb) { * Removes the double quote from the start and end of the supplied string if it starts and ends with this character. * This method does not create a new string if text doesn't start and end with double quotes, the * text object itself is returned in that case. - * + * * @param text The string to remove the double quotes from. * @return The trimmed string, or a reference to text if it did not start and end with double quotes. */ @@ -338,7 +338,7 @@ private static boolean isInitialTextChar(char c) { /** * Concatenate a number of Strings. This implementation uses a StringBuilder. - * + * * @param strings the String to concatenate * @return a String that is the results of concatenating the input strings. */ diff --git a/core/util/src/main/java/org/eclipse/rdf4j/common/xml/DocumentUtil.java b/core/util/src/main/java/org/eclipse/rdf4j/common/xml/DocumentUtil.java index e11fb707791..0ec165bca17 100644 --- a/core/util/src/main/java/org/eclipse/rdf4j/common/xml/DocumentUtil.java +++ b/core/util/src/main/java/org/eclipse/rdf4j/common/xml/DocumentUtil.java @@ -23,14 +23,14 @@ /** * Utilities to make working with DOM documents easier. - * + * * @author Herko ter Horst */ public class DocumentUtil { /** * Create a Document representing the XML file at the specified location. - * + * * @param location the location of an XML document * @return a Document representing the XML file * @throws IOException when there was a problem retrieving or parsing the document. @@ -41,7 +41,7 @@ public static Document getDocument(URL location) throws IOException { /** * Create a Document representing the XML file at the specified location. - * + * * @param location the location of an XML document * @param validating whether the XML parser used in the construction of the document should validate the XML * @param namespaceAware whether the XML parser used in the construction of the document should be aware of @@ -55,7 +55,7 @@ public static Document getDocument(URL location, boolean validating, boolean nam /** * Create a Document representing the XML file at the specified location. - * + * * @param location the location of an XML document * @param schema a Schama instance to validate against * @return a Document representing the XML file diff --git a/core/util/src/main/java/org/eclipse/rdf4j/common/xml/SimpleSAXParser.java b/core/util/src/main/java/org/eclipse/rdf4j/common/xml/SimpleSAXParser.java index 39e79c3138e..76a4b40abe5 100644 --- a/core/util/src/main/java/org/eclipse/rdf4j/common/xml/SimpleSAXParser.java +++ b/core/util/src/main/java/org/eclipse/rdf4j/common/xml/SimpleSAXParser.java @@ -84,6 +84,7 @@ public class SimpleSAXParser { /*--------------* * Constructors * *--------------*/ + /** * Creates a new SimpleSAXParser that will use the supplied XMLReader for parsing the XML. One must set a * SimpleSAXListener on this object before calling one of the parse() methods. @@ -113,6 +114,7 @@ public SimpleSAXParser() throws SAXException { /*---------* * Methods * *---------*/ + /** * Sets the (new) listener that should receive any events from this parser. This listener will replace any * previously set listener. @@ -203,8 +205,8 @@ public synchronized void parse(InputSource inputSource) throws SAXException, IOE class SimpleSAXDefaultHandler extends DefaultHandler { /*-----------* - * Variables * - *-----------*/ + * Variables * + *-----------*/ /** * StringBuilder used to collect text during parsing. */ @@ -221,8 +223,8 @@ class SimpleSAXDefaultHandler extends DefaultHandler { private Map deferredAttributes = null; /*--------------* - * Constructors * - *--------------*/ + * Constructors * + *--------------*/ public SimpleSAXDefaultHandler() { super(); } diff --git a/core/util/src/main/java/org/eclipse/rdf4j/common/xml/XMLReaderFactory.java b/core/util/src/main/java/org/eclipse/rdf4j/common/xml/XMLReaderFactory.java index 29e9cd8806e..28e5fa4da4b 100644 --- a/core/util/src/main/java/org/eclipse/rdf4j/common/xml/XMLReaderFactory.java +++ b/core/util/src/main/java/org/eclipse/rdf4j/common/xml/XMLReaderFactory.java @@ -90,7 +90,7 @@ public static XMLReader createXMLReader() throws SAXException { /** * Creates an org.xml.sax.XMLReader object using the supplied name. - * + * * @return an XMLReader * @throws SAXException when the supplied XMLReader class name can not be found or instantiated. */ diff --git a/core/util/src/main/java/org/eclipse/rdf4j/common/xml/XMLWriter.java b/core/util/src/main/java/org/eclipse/rdf4j/common/xml/XMLWriter.java index 98ef5b85a82..fe84b213ce2 100644 --- a/core/util/src/main/java/org/eclipse/rdf4j/common/xml/XMLWriter.java +++ b/core/util/src/main/java/org/eclipse/rdf4j/common/xml/XMLWriter.java @@ -238,7 +238,7 @@ public void setAttribute(String name, boolean value) { * Writes a start tag containing the previously set attributes. * * @param elName The element name. - * @see #setAttribute(java.lang.String,java.lang.String) + * @see #setAttribute(java.lang.String, java.lang.String) */ public void startTag(String elName) throws IOException { _writeIndent(); @@ -263,7 +263,7 @@ public void endTag(String elName) throws IOException { * Writes an 'empty' element, e.g. <foo/>. The tag will contain any previously set attributes. * * @param elName The element name. - * @see #setAttribute(java.lang.String,java.lang.String) + * @see #setAttribute(java.lang.String, java.lang.String) */ public void emptyElement(String elName) throws IOException { _writeIndent(); @@ -289,7 +289,7 @@ public void writeStylesheet(String url) throws IOException { * * @param elName The element name. * @param text The text. - * @see #setAttribute(java.lang.String,java.lang.String) + * @see #setAttribute(java.lang.String, java.lang.String) */ public void textElement(String elName, String text) throws IOException { _writeIndent(); @@ -306,7 +306,7 @@ public void textElement(String elName, String text) throws IOException { * * @param elName The element name. * @param text The text. - * @see #setAttribute(java.lang.String,java.lang.String) + * @see #setAttribute(java.lang.String, java.lang.String) */ public void unescapedTextElement(String elName, String text) throws IOException { _writeIndent(); diff --git a/core/util/src/main/java/org/eclipse/rdf4j/util/UUIDable.java b/core/util/src/main/java/org/eclipse/rdf4j/util/UUIDable.java index e2aed44c558..c26b7a174e8 100644 --- a/core/util/src/main/java/org/eclipse/rdf4j/util/UUIDable.java +++ b/core/util/src/main/java/org/eclipse/rdf4j/util/UUIDable.java @@ -16,7 +16,7 @@ public interface UUIDable { /** * Returns the UUID of this object. - * + * * @return a non-null UUID. */ UUID getUUID(); diff --git a/core/util/src/main/java/org/eclipse/rdf4j/util/iterators/ConvertingIterator.java b/core/util/src/main/java/org/eclipse/rdf4j/util/iterators/ConvertingIterator.java index 37d4d79e483..84d8918e380 100644 --- a/core/util/src/main/java/org/eclipse/rdf4j/util/iterators/ConvertingIterator.java +++ b/core/util/src/main/java/org/eclipse/rdf4j/util/iterators/ConvertingIterator.java @@ -23,7 +23,7 @@ public abstract class ConvertingIterator implements Iterator { /** * Creates a new ConvertingIterator that operates on the supplied source type itertor. - * + * * @param iter The source type itertor for this ConvertingIterator, must not be null. */ protected ConvertingIterator(Iterator iter) { @@ -38,7 +38,7 @@ protected ConvertingIterator(Iterator iter) { /** * Checks whether the source type itertor contains more elements. - * + * * @return true if the source type itertor contains more elements, false otherwise. */ @Override @@ -48,7 +48,7 @@ public boolean hasNext() { /** * Returns the next element from the source type itertor. - * + * * @throws java.util.NoSuchElementException If all elements have been returned. * @throws IllegalStateException If the itertor has been closed. */ @@ -59,7 +59,7 @@ public T next() { /** * Calls remove() on the underlying itertor. - * + * * @throws UnsupportedOperationException If the wrapped itertor does not support the remove operation. * @throws IllegalStateException If the itertor has been closed, or if {@link #next} has not yet been * called, or {@link #remove} has already been called after the last call to diff --git a/core/util/src/main/java/org/eclipse/rdf4j/util/iterators/FilterIterator.java b/core/util/src/main/java/org/eclipse/rdf4j/util/iterators/FilterIterator.java index 1c82735c135..8ac09d9d660 100644 --- a/core/util/src/main/java/org/eclipse/rdf4j/util/iterators/FilterIterator.java +++ b/core/util/src/main/java/org/eclipse/rdf4j/util/iterators/FilterIterator.java @@ -64,7 +64,7 @@ public void remove() { /** * Tests whether or not the specified object should be returned by this iterator. All objects from the wrapped * iterator pass through this method in the same order as they are coming from the wrapped iterator. - * + * * @param object The object to be tested. * @return true if the object should be returned, false otherwise. * @throws X diff --git a/core/util/src/main/java/org/eclipse/rdf4j/util/iterators/Iterators.java b/core/util/src/main/java/org/eclipse/rdf4j/util/iterators/Iterators.java index 9064fdb7825..1efe78110de 100644 --- a/core/util/src/main/java/org/eclipse/rdf4j/util/iterators/Iterators.java +++ b/core/util/src/main/java/org/eclipse/rdf4j/util/iterators/Iterators.java @@ -24,7 +24,7 @@ public class Iterators { /** * Get a List containing all elements obtained from the specified iterator. - * + * * @param iter the iterator to get the elements from * @return a List containing all elements obtained from the specified iterator. */ @@ -36,7 +36,7 @@ public static List asList(Iterator iter) { /** * Adds all elements from the supplied iterator to the specified collection. - * + * * @param iter An iterator containing elements to add to the container. * @param collection The collection to add the elements to. * @return The collection object that was supplied to this method. @@ -52,7 +52,7 @@ public static > C addAll(Iterator iter, /** * Converts an iterator to a string by concatenating all of the string representations of objects in the iterator, * divided by a separator. - * + * * @param iter An iterator over arbitrary objects that are expected to implement {@link Object#toString()}. * @param separator The separator to insert between the object strings. * @return A String representation of the objects provided by the supplied iterator. @@ -66,7 +66,7 @@ public static String toString(Iterator iter, String separator) { /** * Converts an iterator to a string by concatenating all of the string representations of objects in the iterator, * divided by a separator. - * + * * @param iter An iterator over arbitrary objects that are expected to implement {@link Object#toString()}. * @param separator The separator to insert between the object strings. * @param sb A StringBuilder to append the iterator string to. @@ -83,7 +83,7 @@ public static void toString(Iterator iter, String separator, StringBuilder sb /** * Closes the given iterator if it implements {@link java.io.Closeable} else do nothing. - * + * * @param iter The iterator to close. * @throws IOException If an underlying I/O error occurs. */ @@ -96,7 +96,7 @@ public static void close(Iterator iter) throws IOException { /** * Closes the given iterator, swallowing any IOExceptions, if it implements {@link java.io.Closeable} else do * nothing. - * + * * @param iter The iterator to close. */ public static void closeSilently(Iterator iter) { diff --git a/core/util/src/test/java/org/eclipse/rdf4j/common/io/ByteArrayUtilTest.java b/core/util/src/test/java/org/eclipse/rdf4j/common/io/ByteArrayUtilTest.java index ad321dacf7f..a15f03ff369 100644 --- a/core/util/src/test/java/org/eclipse/rdf4j/common/io/ByteArrayUtilTest.java +++ b/core/util/src/test/java/org/eclipse/rdf4j/common/io/ByteArrayUtilTest.java @@ -1,6 +1,9 @@ package org.eclipse.rdf4j.common.io; -import static org.junit.Assert.*; +import static org.junit.Assert.assertArrayEquals; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; import java.util.BitSet; diff --git a/core/util/src/test/java/org/eclipse/rdf4j/common/iteration/AutoClosingIterationTest.java b/core/util/src/test/java/org/eclipse/rdf4j/common/iteration/AutoClosingIterationTest.java index a39a8c1628e..4fc83e21e4f 100644 --- a/core/util/src/test/java/org/eclipse/rdf4j/common/iteration/AutoClosingIterationTest.java +++ b/core/util/src/test/java/org/eclipse/rdf4j/common/iteration/AutoClosingIterationTest.java @@ -1,7 +1,6 @@ package org.eclipse.rdf4j.common.iteration; import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import java.util.Arrays; diff --git a/core/util/src/test/java/org/eclipse/rdf4j/common/iteration/SilentIterationTest.java b/core/util/src/test/java/org/eclipse/rdf4j/common/iteration/SilentIterationTest.java index ac6f79fee08..bb4259fbde4 100644 --- a/core/util/src/test/java/org/eclipse/rdf4j/common/iteration/SilentIterationTest.java +++ b/core/util/src/test/java/org/eclipse/rdf4j/common/iteration/SilentIterationTest.java @@ -14,7 +14,7 @@ public class SilentIterationTest { @SuppressWarnings("unchecked") private CloseableIteration delegate = mock(CloseableIteration.class); - private SilentIteration subject = new SilentIteration(delegate); + private SilentIteration subject = new SilentIteration<>(delegate); @Test public void hasNextSwallowsException() throws Exception { diff --git a/core/util/src/test/java/org/eclipse/rdf4j/common/net/ParsedIRITest.java b/core/util/src/test/java/org/eclipse/rdf4j/common/net/ParsedIRITest.java index a7736907fb0..02feaa40705 100644 --- a/core/util/src/test/java/org/eclipse/rdf4j/common/net/ParsedIRITest.java +++ b/core/util/src/test/java/org/eclipse/rdf4j/common/net/ParsedIRITest.java @@ -7,6 +7,7 @@ *******************************************************************************/ package org.eclipse.rdf4j.common.net; +import static org.assertj.core.api.Assertions.assertThat; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNull; @@ -59,6 +60,20 @@ public void testIncorrectIPv4() throws URISyntaxException { ParsedIRI iri = new ParsedIRI("http://127.0.0.256/"); } + @Test + public void testUnknownSchemeHostProcessing() throws URISyntaxException { + ParsedIRI uri = new ParsedIRI("bundleresource://385.fwk19480900/test.ttl"); + assertThat(uri.isAbsolute()); + assertThat(uri.getScheme()).isEqualTo("bundleresource"); + assertThat(uri.isOpaque()); + assertThat(uri.getHost()).isEqualTo("385.fwk19480900"); + } + + @Test(expected = URISyntaxException.class) + public void testHttpSchemeHostProcessing() throws URISyntaxException { + ParsedIRI uri = new ParsedIRI("http://385.fwk19480900/test.ttl"); + } + @Test public void absoluteHttpUriIsDescribedCorrectly() throws URISyntaxException { ParsedIRI uri = new ParsedIRI("http://example.test/"); diff --git a/core/util/src/test/java/org/eclipse/rdf4j/common/text/StringUtilTest.java b/core/util/src/test/java/org/eclipse/rdf4j/common/text/StringUtilTest.java index 7f2bde03d7c..f16d4678030 100644 --- a/core/util/src/test/java/org/eclipse/rdf4j/common/text/StringUtilTest.java +++ b/core/util/src/test/java/org/eclipse/rdf4j/common/text/StringUtilTest.java @@ -10,8 +10,6 @@ import static org.junit.Assert.assertEquals; import java.io.IOException; -import java.nio.charset.StandardCharsets; -import java.util.Arrays; import org.eclipse.rdf4j.common.net.ParsedIRI; import org.junit.Test; diff --git a/pom.xml b/pom.xml index 2173da6cccc..614d0ca9d61 100644 --- a/pom.xml +++ b/pom.xml @@ -1,10 +1,9 @@ - + 4.0.0 org.eclipse.rdf4j rdf4j - 3.1.5-SNAPSHOT + 3.2.2-SNAPSHOT pom Eclipse RDF4J An extensible Java framework for RDF and SPARQL @@ -146,9 +145,6 @@ - - 8 - org.apache.maven.plugins @@ -289,12 +285,12 @@ 4.4.12 2.9.9 0.12.5 - 2.0 + 3.1.4 2.3.1 7.5.0 6.5.4 3.1.0 - 5.2.1.RELEASE + 5.2.4.RELEASE 18.0 1.21 @@ -313,7 +309,7 @@ pom import - com.fasterxml.jackson.core @@ -323,7 +319,7 @@ com.opencsv opencsv - 4.3.2 + 4.6 @@ -350,12 +346,12 @@ org.apache.commons commons-text - 1.3 + 1.8 org.apache.commons commons-lang3 - 3.8.1 + 3.9 org.apache.httpcomponents @@ -809,7 +805,7 @@ com.github.siom79.japicmp japicmp-maven-plugin - 0.14.0 + 0.14.3 @@ -825,9 +821,25 @@ - true - true + true + true + + @org.eclipse.rdf4j.common.annotation.InternalUseOnly + @org.eclipse.rdf4j.common.annotation.Experimental + + + + METHOD_ABSTRACT_ADDED_IN_IMPLEMENTED_INTERFACE + true + true + + + METHOD_NEW_DEFAULT + true + true + + @@ -921,6 +933,24 @@ + + net.revelc.code.formatter + formatter-maven-plugin + 2.8.1 + + + ${maven.multiModuleProjectDirectory}/eclipse-settings/eclipse-rdf4j-conventions.xml + LF + true + + + + + validate + + + + diff --git a/testsuites/benchmark/pom.xml b/testsuites/benchmark/pom.xml index ddd926286b3..d3836f642eb 100644 --- a/testsuites/benchmark/pom.xml +++ b/testsuites/benchmark/pom.xml @@ -4,7 +4,7 @@ org.eclipse.rdf4j rdf4j-testsuites - 3.1.5-SNAPSHOT + 3.2.2-SNAPSHOT rdf4j-benchmark RDF4J: benchmarks diff --git a/testsuites/benchmark/src/main/java/org/eclipse/rdf4j/benchmark/QueryOrderBenchmark.java b/testsuites/benchmark/src/main/java/org/eclipse/rdf4j/benchmark/QueryOrderBenchmark.java index 40ad80592b7..56cb228ec95 100644 --- a/testsuites/benchmark/src/main/java/org/eclipse/rdf4j/benchmark/QueryOrderBenchmark.java +++ b/testsuites/benchmark/src/main/java/org/eclipse/rdf4j/benchmark/QueryOrderBenchmark.java @@ -34,7 +34,7 @@ /** * Designed to test the performance of ORDER BY queries. - * + * * @see https://github.com/eclipse/rdf4j/issues/971 * @author James Leigh */ diff --git a/testsuites/benchmark/src/main/java/org/eclipse/rdf4j/benchmark/ReasoningBenchmark.java b/testsuites/benchmark/src/main/java/org/eclipse/rdf4j/benchmark/ReasoningBenchmark.java index 6ecd3947dd0..ad6bdeb0918 100644 --- a/testsuites/benchmark/src/main/java/org/eclipse/rdf4j/benchmark/ReasoningBenchmark.java +++ b/testsuites/benchmark/src/main/java/org/eclipse/rdf4j/benchmark/ReasoningBenchmark.java @@ -22,16 +22,22 @@ import org.eclipse.rdf4j.sail.memory.MemoryStore; import org.openjdk.jmh.annotations.Benchmark; import org.openjdk.jmh.annotations.BenchmarkMode; +import org.openjdk.jmh.annotations.Fork; +import org.openjdk.jmh.annotations.Measurement; import org.openjdk.jmh.annotations.Mode; import org.openjdk.jmh.annotations.OutputTimeUnit; import org.openjdk.jmh.annotations.Param; import org.openjdk.jmh.annotations.Scope; import org.openjdk.jmh.annotations.State; +import org.openjdk.jmh.annotations.Warmup; /** * @author HÃ¥vard Mikkelsen Ottestad */ +@Measurement(iterations = 10) +@Warmup(iterations = 20) +@Fork(1) @State(Scope.Thread) public class ReasoningBenchmark { @@ -45,7 +51,6 @@ public class ReasoningBenchmark { @OutputTimeUnit(TimeUnit.MILLISECONDS) public void noReasoning() throws IOException { SailRepository sail = new SailRepository(new MemoryStore()); - sail.initialize(); try (SailRepositoryConnection connection = sail.getConnection()) { connection.begin(); @@ -62,7 +67,6 @@ public void noReasoning() throws IOException { @OutputTimeUnit(TimeUnit.MILLISECONDS) public void noReasoningMultipleTransactions() throws IOException { SailRepository sail = new SailRepository(new MemoryStore()); - sail.initialize(); try (SailRepositoryConnection connection = sail.getConnection()) { @@ -80,7 +84,6 @@ public void noReasoningMultipleTransactions() throws IOException { @OutputTimeUnit(TimeUnit.MILLISECONDS) public void forwardChainingRDFSInferencer() throws IOException { SailRepository sail = new SailRepository(new ForwardChainingRDFSInferencer(new MemoryStore())); - sail.initialize(); try (SailRepositoryConnection connection = sail.getConnection()) { connection.begin(); @@ -97,7 +100,6 @@ public void forwardChainingRDFSInferencer() throws IOException { @OutputTimeUnit(TimeUnit.MILLISECONDS) public void forwardChainingRDFSInferencerMultipleTransactions() throws IOException { SailRepository sail = new SailRepository(new ForwardChainingRDFSInferencer(new MemoryStore())); - sail.initialize(); try (SailRepositoryConnection connection = sail.getConnection()) { @@ -115,7 +117,6 @@ public void forwardChainingRDFSInferencerMultipleTransactions() throws IOExcepti @OutputTimeUnit(TimeUnit.MILLISECONDS) public void forwardChainingSchemaCachingRDFSInferencer() throws IOException { SailRepository sail = new SailRepository(new SchemaCachingRDFSInferencer(new MemoryStore())); - sail.initialize(); try (SailRepositoryConnection connection = sail.getConnection()) { connection.begin(); @@ -151,7 +152,6 @@ private int getSize(SailRepository sail) { @OutputTimeUnit(TimeUnit.MILLISECONDS) public void forwardChainingSchemaCachingRDFSInferencerMultipleTransactions() throws IOException { SailRepository sail = new SailRepository(new SchemaCachingRDFSInferencer(new MemoryStore())); - sail.initialize(); try (SailRepositoryConnection connection = sail.getConnection()) { @@ -171,7 +171,6 @@ public void forwardChainingSchemaCachingRDFSInferencerMultipleTransactions() thr @OutputTimeUnit(TimeUnit.MILLISECONDS) public void forwardChainingSchemaCachingRDFSInferencerSchema() throws IOException { SailRepository sail = new SailRepository(new SchemaCachingRDFSInferencer(new MemoryStore(), createSchema())); - sail.initialize(); try (SailRepositoryConnection connection = sail.getConnection()) { connection.begin(); @@ -187,7 +186,6 @@ public void forwardChainingSchemaCachingRDFSInferencerSchema() throws IOExceptio @OutputTimeUnit(TimeUnit.MILLISECONDS) public void forwardChainingSchemaCachingRDFSInferencerMultipleTransactionsSchema() throws IOException { SailRepository sail = new SailRepository(new SchemaCachingRDFSInferencer(new MemoryStore(), createSchema())); - sail.initialize(); try (SailRepositoryConnection connection = sail.getConnection()) { addAllDataMultipleTransactions(connection); diff --git a/testsuites/benchmark/src/main/java/org/eclipse/rdf4j/benchmark/ReasoningUpdateBenchmark.java b/testsuites/benchmark/src/main/java/org/eclipse/rdf4j/benchmark/ReasoningUpdateBenchmark.java new file mode 100644 index 00000000000..f3778a1e210 --- /dev/null +++ b/testsuites/benchmark/src/main/java/org/eclipse/rdf4j/benchmark/ReasoningUpdateBenchmark.java @@ -0,0 +1,129 @@ +/******************************************************************************* + * Copyright (c) 2020 Eclipse RDF4J contributors. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Distribution License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ + +package org.eclipse.rdf4j.benchmark; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.nio.charset.StandardCharsets; +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.TimeUnit; +import java.util.stream.Stream; + +import org.apache.commons.io.IOUtils; +import org.eclipse.rdf4j.model.IRI; +import org.eclipse.rdf4j.model.Literal; +import org.eclipse.rdf4j.model.Statement; +import org.eclipse.rdf4j.model.impl.SimpleValueFactory; +import org.eclipse.rdf4j.query.TupleQueryResult; +import org.eclipse.rdf4j.repository.sail.SailRepository; +import org.eclipse.rdf4j.repository.sail.SailRepositoryConnection; +import org.eclipse.rdf4j.rio.RDFFormat; +import org.eclipse.rdf4j.sail.inferencer.fc.SchemaCachingRDFSInferencer; +import org.eclipse.rdf4j.sail.memory.MemoryStore; +import org.openjdk.jmh.annotations.Benchmark; +import org.openjdk.jmh.annotations.BenchmarkMode; +import org.openjdk.jmh.annotations.Fork; +import org.openjdk.jmh.annotations.Measurement; +import org.openjdk.jmh.annotations.Mode; +import org.openjdk.jmh.annotations.OutputTimeUnit; +import org.openjdk.jmh.annotations.Param; +import org.openjdk.jmh.annotations.Scope; +import org.openjdk.jmh.annotations.State; +import org.openjdk.jmh.annotations.Warmup; + +/** + * @author HÃ¥vard Mikkelsen Ottestad + */ + +@Measurement(iterations = 10) +@Warmup(iterations = 20) +@Fork(1) +@State(Scope.Thread) +public class ReasoningUpdateBenchmark { + + private int expectedCount; + + @Param({ "moreRdfs::12180" }) + public String param; + + static private final IRI schemaGraph = SimpleValueFactory.getInstance().createIRI("http://example.org/schemaGraph"); + + @Benchmark + @BenchmarkMode(Mode.AverageTime) + @OutputTimeUnit(TimeUnit.MILLISECONDS) + public void forwardChainingSchemaCachingRDFSInferencer() throws IOException { + SailRepository sail = new SailRepository(new SchemaCachingRDFSInferencer(new MemoryStore())); + + try (SailRepositoryConnection connection = sail.getConnection()) { + connection.begin(); + connection.add(resourceAsStream("schema.ttl"), "", RDFFormat.TURTLE, schemaGraph); + connection.commit(); + + addAllDataMultipleTransactions(connection); + + } + + checkSize(sail); + } + + private void checkSize(SailRepository sail) { + + assert getSize(sail) == expectedCount : "Was " + getSize(sail) + " but expected " + expectedCount; + + } + + private int getSize(SailRepository sail) { + try (SailRepositoryConnection connection = sail.getConnection()) { + try (TupleQueryResult evaluate = connection + .prepareTupleQuery("select (count (*) as ?count) where {?a ?b ?c}") + .evaluate()) { + return ((Literal) evaluate.next().getBinding("count").getValue()).intValue(); + + } + } + } + + private void addAllDataMultipleTransactions(SailRepositoryConnection connection) throws IOException { + for (int i = 0; i <= 9; i++) { + + // remove a random statement + connection.begin(); + try (Stream stream = connection.getStatements(null, null, null).stream()) { + stream.findFirst().ifPresent(connection::remove); + } + connection.commit(); + + connection.begin(); + connection.add(resourceAsStream("data" + i++ + ".ttl"), "", RDFFormat.TURTLE); + connection.commit(); + } + } + + Map cache = new HashMap<>(); + + private InputStream resourceAsStream(String resourceName) { + String[] split = param.split("\\:\\:"); + this.expectedCount = Integer.parseInt(split[1]); + String filename = split[0] + "/" + resourceName; + String content = cache.computeIfAbsent(filename, (fn) -> { + try { + return IOUtils.toString(ReasoningUpdateBenchmark.class.getClassLoader().getResourceAsStream(fn), + StandardCharsets.UTF_8); + } catch (IOException e) { + throw new RuntimeException(e); + } + }); + + return new ByteArrayInputStream(content.getBytes(StandardCharsets.UTF_8)); + + } + +} diff --git a/testsuites/geosparql/pom.xml b/testsuites/geosparql/pom.xml index 3349179afcb..5c2cc77f38e 100644 --- a/testsuites/geosparql/pom.xml +++ b/testsuites/geosparql/pom.xml @@ -4,7 +4,7 @@ org.eclipse.rdf4j rdf4j-testsuites - 3.1.5-SNAPSHOT + 3.2.2-SNAPSHOT rdf4j-geosparql-testsuite RDF4J GeoSPARQL compliance test suite diff --git a/testsuites/lucene/pom.xml b/testsuites/lucene/pom.xml index 443a04dbfce..f48a6339400 100644 --- a/testsuites/lucene/pom.xml +++ b/testsuites/lucene/pom.xml @@ -4,7 +4,7 @@ org.eclipse.rdf4j rdf4j-testsuites - 3.1.5-SNAPSHOT + 3.2.2-SNAPSHOT rdf4j-lucene-testsuite RDF4J Lucene Sail Tests diff --git a/testsuites/lucene/src/main/java/org/eclipse/rdf4j/sail/lucene/AbstractLuceneSailIndexedPropertiesTest.java b/testsuites/lucene/src/main/java/org/eclipse/rdf4j/sail/lucene/AbstractLuceneSailIndexedPropertiesTest.java index e8632609134..e32e7bd3f68 100644 --- a/testsuites/lucene/src/main/java/org/eclipse/rdf4j/sail/lucene/AbstractLuceneSailIndexedPropertiesTest.java +++ b/testsuites/lucene/src/main/java/org/eclipse/rdf4j/sail/lucene/AbstractLuceneSailIndexedPropertiesTest.java @@ -35,7 +35,6 @@ import org.eclipse.rdf4j.repository.RepositoryConnection; import org.eclipse.rdf4j.repository.RepositoryException; import org.eclipse.rdf4j.repository.sail.SailRepository; -import org.eclipse.rdf4j.sail.lucene.LuceneSail; import org.eclipse.rdf4j.sail.memory.MemoryStore; import org.junit.After; import org.junit.Before; diff --git a/testsuites/lucene/src/main/java/org/eclipse/rdf4j/sail/lucene/AbstractLuceneSailTest.java b/testsuites/lucene/src/main/java/org/eclipse/rdf4j/sail/lucene/AbstractLuceneSailTest.java index 15d70571da5..a9f51c0756c 100644 --- a/testsuites/lucene/src/main/java/org/eclipse/rdf4j/sail/lucene/AbstractLuceneSailTest.java +++ b/testsuites/lucene/src/main/java/org/eclipse/rdf4j/sail/lucene/AbstractLuceneSailTest.java @@ -410,8 +410,9 @@ private void evaluate(String[] queries, ArrayList>> exp boolean matches; for (int resultSetID = 0; resultSetID < expectedResultSet.size(); resultSetID++) { // ignore results that matched before - if (matched.contains(resultSetID)) + if (matched.contains(resultSetID)) { continue; + } // assume it matches matches = true; @@ -635,12 +636,14 @@ public void testSnippetLimitedToPredicate() i.remove(); } } - if (snippet.contains(notexpected)) + if (snippet.contains(notexpected)) { fail("snippet '" + snippet + "' contained value '" + notexpected + "' from predicate " + PREDICATE_2); - if (!foundexpected) + } + if (!foundexpected) { fail("did not find any of the expected strings " + expectedSnippetPart + " in the snippet " + snippet); + } // there should be a score assertNotNull(bindings.getValue("Score")); @@ -700,9 +703,10 @@ public void testSnippetLimitedToPredicate() i.remove(); } } - if (!foundexpected) + if (!foundexpected) { fail("did not find any of the expected strings " + expectedSnippetPart + " in the snippet " + snippet); + } // there should be a score assertNotNull(bindings.getValue("Score")); diff --git a/testsuites/model/pom.xml b/testsuites/model/pom.xml index 63527b7d896..c03ad21ef5a 100644 --- a/testsuites/model/pom.xml +++ b/testsuites/model/pom.xml @@ -4,7 +4,7 @@ org.eclipse.rdf4j rdf4j-testsuites - 3.1.5-SNAPSHOT + 3.2.2-SNAPSHOT rdf4j-model-testsuite RDF4J: Model API testsuite @@ -20,5 +20,10 @@ junit compile + + org.assertj + assertj-core + compile + diff --git a/testsuites/model/src/main/java/org/eclipse/rdf4j/model/AbstractModelTest.java b/testsuites/model/src/main/java/org/eclipse/rdf4j/model/AbstractModelTest.java index e5aae450199..a957c9c27ab 100644 --- a/testsuites/model/src/main/java/org/eclipse/rdf4j/model/AbstractModelTest.java +++ b/testsuites/model/src/main/java/org/eclipse/rdf4j/model/AbstractModelTest.java @@ -7,11 +7,15 @@ *******************************************************************************/ package org.eclipse.rdf4j.model; +import static org.assertj.core.api.Assertions.assertThat; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; +import java.util.ConcurrentModificationException; +import java.util.Iterator; import java.util.Set; import org.eclipse.rdf4j.model.impl.SimpleValueFactory; @@ -60,7 +64,7 @@ public abstract class AbstractModelTest { /** * Helper method that asserts that the returned model is empty before returning. - * + * * @return An empty instance of the {@link Model} implementation being tested. */ protected Model getNewEmptyModel() { @@ -260,6 +264,71 @@ public void setUp() throws Exception { public void tearDown() throws Exception { } + @Test + public final void testGetStatements_SingleLiteral() { + Model model = getNewModelObjectSingleLiteral(); + + Iterator selection = model.getStatements(null, null, literal1).iterator(); + + assertThat(selection.hasNext()).isTrue(); + assertThat(selection.next().getObject()).isEqualTo(literal1); + assertThat(selection.hasNext()).isFalse(); + } + + @Test + public final void testGetStatements_IteratorModification() { + Model model = getNewEmptyModel(); + model.add(uri1, RDFS.LABEL, uri2); + model.add(uri1, RDFS.LABEL, uri3); + model.add(uri1, RDFS.LABEL, literal1); + model.add(uri1, RDFS.LABEL, literal2); + + Iterator selection = model.getStatements(uri1, null, null).iterator(); + while (selection.hasNext()) { + Statement st = selection.next(); + if (st.getObject().equals(uri2)) { + selection.remove(); + } + } + assertThat(model.contains(uri1, RDFS.LABEL, uri2)).isFalse(); + assertThat(model.contains(uri1, RDFS.LABEL, uri3)).isTrue(); + } + + @Test + public final void testGetStatements_ConcurrentModificationOfModel() { + Model model = getNewEmptyModel(); + model.add(uri1, RDFS.LABEL, uri2); + model.add(uri1, RDFS.LABEL, uri3); + model.add(uri1, RDFS.LABEL, literal1); + model.add(uri1, RDFS.LABEL, literal2); + + Iterator selection = model.getStatements(uri1, null, null).iterator(); + try { + while (selection.hasNext()) { + Statement st = selection.next(); + if (st.getObject().equals(uri2)) { + model.remove(uri1, RDFS.LABEL, uri3); + } + } + fail("should have resulted in ConcurrentModificationException"); + } catch (ConcurrentModificationException e) { + // do nothing, expected + } + } + + @Test + public final void testGetStatements_AddToEmptyModel() { + Model model = getNewEmptyModel(); + Iterator selection = model.getStatements(null, null, null).iterator(); + assertThat(selection.hasNext()).isFalse(); + + model.add(uri2, RDFS.LABEL, literal1); + assertThat(model.contains(uri2, RDFS.LABEL, literal1)).isTrue(); + assertThat(selection.hasNext()).isFalse(); + Iterator newSelection = model.getStatements(null, null, null).iterator(); + assertThat(newSelection.hasNext()).isTrue(); + } + /** * Test method for {@link org.eclipse.rdf4j.model.Model#filter(Resource, IRI, Value, Resource...)}. */ @@ -272,6 +341,74 @@ public final void testFilterSingleLiteral() { assertFalse(filter2.isEmpty()); } + @Test + public final void testFilter_AddToEmptyFilteredModel() { + Model model = getNewEmptyModel(); + Model filter = model.filter(null, null, null); + assertTrue(filter.isEmpty()); + + filter.add(uri2, RDFS.LABEL, literal1); + assertTrue(model.contains(uri2, RDFS.LABEL, literal1)); + assertTrue(filter.contains(uri2, RDFS.LABEL, literal1)); + } + + @Test + public final void testFilter_RemoveFromFilter() { + Model model = getNewEmptyModel(); + model.add(uri1, RDFS.LABEL, literal1, uri1); + Model filter = model.filter(uri1, RDFS.LABEL, literal1, uri1); + assertTrue(filter.contains(uri1, RDFS.LABEL, literal1)); + + filter.remove(uri1, RDFS.LABEL, literal1, uri1); + assertFalse(model.contains(uri1, RDFS.LABEL, literal1)); + assertFalse(filter.contains(uri1, RDFS.LABEL, literal1)); + } + + @Test + public final void testFilter_AddToNonEmptyFilteredModel() { + Model model = getNewModelObjectSingleLiteral(); + Model filter = model.filter(null, null, literal1); + assertFalse(filter.isEmpty()); + + filter.add(uri2, RDFS.LABEL, literal1); + assertTrue(model.contains(uri2, RDFS.LABEL, literal1)); + } + + @Test + public final void testFilter_AddToEmptyOriginalModel() { + Model model = getNewEmptyModel(); + Model filter = model.filter(null, null, null); + assertTrue(filter.isEmpty()); + + model.add(uri2, RDFS.LABEL, literal1); + assertTrue(model.contains(uri2, RDFS.LABEL, literal1)); + assertTrue(filter.contains(uri2, RDFS.LABEL, literal1)); + } + + @Test + public final void testFilter_RemoveFromOriginal() { + Model model = getNewEmptyModel(); + model.add(uri1, RDFS.LABEL, literal1, uri1); + Model filter = model.filter(uri1, RDFS.LABEL, literal1, uri1); + assertTrue(filter.contains(uri1, RDFS.LABEL, literal1)); + + model.remove(uri1, RDFS.LABEL, literal1, uri1); + assertFalse(model.contains(uri1, RDFS.LABEL, literal1)); + assertFalse(filter.contains(uri1, RDFS.LABEL, literal1)); + } + + @Test + public final void testFilter_AddToOriginalModel() { + Model model = getNewModelObjectSingleLiteral(); + Model filter = model.filter(null, null, literal1); + assertFalse(filter.isEmpty()); + assertTrue(filter.contains(uri1, RDFS.LABEL, literal1)); + assertFalse(filter.contains(uri2, RDFS.LABEL, literal1)); + + model.add(uri2, RDFS.LABEL, literal1); + assertTrue(filter.contains(uri2, RDFS.LABEL, literal1)); + } + /** * Test method for {@link org.eclipse.rdf4j.model.Model#contains(Resource, IRI, Value, Resource...)} . */ diff --git a/testsuites/model/src/main/java/org/eclipse/rdf4j/model/ModelNamespacesTest.java b/testsuites/model/src/main/java/org/eclipse/rdf4j/model/ModelNamespacesTest.java index c394012ddc4..dee51e234e6 100644 --- a/testsuites/model/src/main/java/org/eclipse/rdf4j/model/ModelNamespacesTest.java +++ b/testsuites/model/src/main/java/org/eclipse/rdf4j/model/ModelNamespacesTest.java @@ -14,8 +14,6 @@ import java.util.Set; -import org.eclipse.rdf4j.model.Model; -import org.eclipse.rdf4j.model.Namespace; import org.eclipse.rdf4j.model.impl.SimpleNamespace; import org.eclipse.rdf4j.model.vocabulary.DC; import org.eclipse.rdf4j.model.vocabulary.RDF; @@ -28,7 +26,7 @@ /** * An abstract test class to test the handling of namespaces by {@link Model} implementations. - * + * * @author Peter Ansell p_ansell@yahoo.com */ public abstract class ModelNamespacesTest { @@ -37,7 +35,7 @@ public abstract class ModelNamespacesTest { /** * Implementing tests must return a new, empty, Model for each call to this method. - * + * * @return A new empty implementation of {@link Model} that implements the namespace related methods, * {@link Model#getNamespace(String)}, {@link Model#getNamespaces()}, {@link Model#setNamespace(Namespace)}, * {@link Model#setNamespace(String, String)}, and {@link Model#removeNamespace(String)}. diff --git a/testsuites/pom.xml b/testsuites/pom.xml index bb2aaa54a33..737396b5d8f 100644 --- a/testsuites/pom.xml +++ b/testsuites/pom.xml @@ -4,7 +4,7 @@ org.eclipse.rdf4j rdf4j - 3.1.5-SNAPSHOT + 3.2.2-SNAPSHOT rdf4j-testsuites pom diff --git a/testsuites/queryresultio/pom.xml b/testsuites/queryresultio/pom.xml index b16986d21ed..012cfedeb0c 100644 --- a/testsuites/queryresultio/pom.xml +++ b/testsuites/queryresultio/pom.xml @@ -4,7 +4,7 @@ org.eclipse.rdf4j rdf4j-testsuites - 3.1.5-SNAPSHOT + 3.2.2-SNAPSHOT rdf4j-queryresultio-testsuite RDF4J: QueryResultIO testsuite diff --git a/testsuites/queryresultio/src/main/java/org/eclipse/rdf4j/query/resultio/AbstractQueryResultIOBooleanTest.java b/testsuites/queryresultio/src/main/java/org/eclipse/rdf4j/query/resultio/AbstractQueryResultIOBooleanTest.java index 39fab72901d..0be06372a90 100644 --- a/testsuites/queryresultio/src/main/java/org/eclipse/rdf4j/query/resultio/AbstractQueryResultIOBooleanTest.java +++ b/testsuites/queryresultio/src/main/java/org/eclipse/rdf4j/query/resultio/AbstractQueryResultIOBooleanTest.java @@ -14,7 +14,7 @@ /** * Abstract test for QueryResultIO. - * + * * @author jeen * @author Peter Ansell */ diff --git a/testsuites/queryresultio/src/main/java/org/eclipse/rdf4j/query/resultio/AbstractQueryResultIOTest.java b/testsuites/queryresultio/src/main/java/org/eclipse/rdf4j/query/resultio/AbstractQueryResultIOTest.java index 32a720c2501..41f52282857 100644 --- a/testsuites/queryresultio/src/main/java/org/eclipse/rdf4j/query/resultio/AbstractQueryResultIOTest.java +++ b/testsuites/queryresultio/src/main/java/org/eclipse/rdf4j/query/resultio/AbstractQueryResultIOTest.java @@ -28,6 +28,7 @@ import org.eclipse.rdf4j.model.ValueFactory; import org.eclipse.rdf4j.model.impl.SimpleValueFactory; +import org.eclipse.rdf4j.model.vocabulary.RDF; import org.eclipse.rdf4j.model.vocabulary.XMLSchema; import org.eclipse.rdf4j.query.BindingSet; import org.eclipse.rdf4j.query.BooleanQueryResultHandler; @@ -50,7 +51,7 @@ public abstract class AbstractQueryResultIOTest { private static final ValueFactory vf = SimpleValueFactory.getInstance(); /** - * + * */ public AbstractQueryResultIOTest() { super(); @@ -66,7 +67,7 @@ public AbstractQueryResultIOTest() { /** * Override this to customise how the tuple parsing is performed, particularly to test background and other parsing * strategies. - * + * * @param format The {@link TupleQueryResultFormat} for the parser. * @param in The InputStream to parse * @return A {@link TupleQueryResult} that can be parsed. @@ -130,8 +131,11 @@ protected TupleQueryResult createTupleSingleVarMultipleBindingSets() { MapBindingSet solution9 = new MapBindingSet(bindingNames.size()); solution9.addBinding("a", vf.createLiteral("newline at the end \n", XMLSchema.STRING)); + MapBindingSet solution10 = new MapBindingSet(bindingNames.size()); + solution10.addBinding("a", vf.createTriple(vf.createIRI("urn:a"), RDF.TYPE, vf.createIRI("urn:b"))); + List bindingSetList = Arrays.asList(solution1, solution2, solution3, solution4, solution5, - solution6, solution7, solution8, solution9); + solution6, solution7, solution8, solution9, solution10); IteratingTupleQueryResult result = new IteratingTupleQueryResult(bindingNames, bindingSetList); @@ -165,6 +169,11 @@ protected TupleQueryResult createTupleMultipleBindingSets() { solution5.addBinding("b", vf.createLiteral("\"\"double-quoted string")); solution5.addBinding("c", vf.createLiteral(" unencoded tab characters followed by encoded \t\t")); + MapBindingSet solution6 = new MapBindingSet(bindingNames.size()); + solution6.addBinding("a", vf.createTriple(vf.createIRI("urn:a"), RDF.TYPE, vf.createIRI("urn:b"))); + solution6.addBinding("b", vf.createIRI("urn:test")); + solution6.addBinding("c", vf.createBNode("bnode1")); + List bindingSetList = Arrays.asList(solution1, solution2, solution3, solution4, solution5); @@ -455,7 +464,7 @@ protected void doTupleMissingStartQueryResult(TupleQueryResultFormat format, Tup /** * Tests that parsing a tuple results set without specifying a {@link TupleQueryResultHandler} does not throw any * exceptions. - * + * * @param format * @param input * @throws QueryResultParseException @@ -481,7 +490,7 @@ protected void doTupleNoHandler(TupleQueryResultFormat format, TupleQueryResult * Tests that the parser returned for a TupleQueryResultFormat is not able to parse a BooleanQueryResultFormat using * the deprecated {@link TupleQueryResultParser#parse(java.io.InputStream)} method, and that it does indeed through * an exception of type {@link QueryResultParseException}. - * + * * @param format * @param input * @param matchingBooleanFormat A BooleanQueryResultFormat that matches the given TupleQueryResultFormat . @@ -652,7 +661,7 @@ protected void doBooleanStylesheet(BooleanQueryResultFormat format, boolean inpu /** * Tests that parsing a boolean without specifying a {@link BooleanQueryResultHandler} does not throw any * exceptions. - * + * * @param format * @param input * @throws QueryResultParseException @@ -672,7 +681,7 @@ protected void doBooleanNoHandler(BooleanQueryResultFormat format, boolean input * Tests that the parser returned for a BooleanQueryResultFormat is not able to parse a TupleQueryResultFormat using * the deprecated {@link BooleanQueryResultParser#parse(java.io.InputStream)} method, and that it does indeed * through an exception of type {@link QueryResultParseException}. - * + * * @param format * @param tqr * @param matchingTupleFormat A TupleQueryResultFormat that matches the given BooleanQueryResultFormat. diff --git a/testsuites/queryresultio/src/main/java/org/eclipse/rdf4j/query/resultio/AbstractQueryResultIOTupleTest.java b/testsuites/queryresultio/src/main/java/org/eclipse/rdf4j/query/resultio/AbstractQueryResultIOTupleTest.java index 856481107b4..09ac189ef81 100644 --- a/testsuites/queryresultio/src/main/java/org/eclipse/rdf4j/query/resultio/AbstractQueryResultIOTupleTest.java +++ b/testsuites/queryresultio/src/main/java/org/eclipse/rdf4j/query/resultio/AbstractQueryResultIOTupleTest.java @@ -8,13 +8,29 @@ package org.eclipse.rdf4j.query.resultio; -import java.util.Arrays; +import static org.junit.Assert.assertEquals; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import org.eclipse.rdf4j.model.ValueFactory; +import org.eclipse.rdf4j.model.impl.SimpleValueFactory; +import org.eclipse.rdf4j.model.vocabulary.RDF; +import org.eclipse.rdf4j.model.vocabulary.RDFS; +import org.eclipse.rdf4j.model.vocabulary.XMLSchema; +import org.eclipse.rdf4j.query.BindingSet; +import org.eclipse.rdf4j.query.TupleQueryResult; +import org.eclipse.rdf4j.query.impl.IteratingTupleQueryResult; +import org.eclipse.rdf4j.query.impl.MapBindingSet; import org.junit.Test; /** * Abstract test for QueryResultIO. - * + * * @author jeen * @author Peter Ansell */ @@ -180,4 +196,39 @@ public final void testMultipleExceptionHandleSolutionBeforeStartQueryResult() th doTupleMissingStartQueryResult(getTupleFormat(), createTupleMultipleBindingSets(), createTupleMultipleBindingSets(), Arrays.asList("info", "alternate", "other", "another"), "test.xsl"); } + + @Test + public final void testRDFStarCompatibility() throws IOException { + ValueFactory vf = SimpleValueFactory.getInstance(); + + List bindingNames = Arrays.asList("a", "b", "c"); + List bindings = new ArrayList<>(); + MapBindingSet bs1 = new MapBindingSet(); + // Note that the CSV format seems to ignore the datatype and assume it's xsd:integer + // so no other datatype works with it properly. + bs1.addBinding("a", vf.createLiteral("1984", XMLSchema.INTEGER)); + bs1.addBinding("b", vf.createIRI("urn:test")); + bs1.addBinding("c", vf.createBNode("bnode1")); + bindings.add(bs1); + MapBindingSet bs2 = new MapBindingSet(); + bs2.addBinding("a", vf.createLiteral("foo")); + bs2.addBinding("b", vf.createTriple(vf.createBNode("bnode2"), RDFS.LABEL, + vf.createLiteral("\"literal with\tfunny\nchars"))); + bs2.addBinding("c", vf.createTriple(vf.createTriple(vf.createTriple(vf.createIRI("urn:a"), RDF.TYPE, + vf.createIRI("urn:b")), vf.createIRI("urn:c"), vf.createIRI("urn:d")), vf.createIRI("urn:e"), + vf.createIRI("urn:f"))); + bindings.add(bs2); + + try (ByteArrayOutputStream bos = new ByteArrayOutputStream()) { + QueryResultIO.writeTuple(new IteratingTupleQueryResult(bindingNames, bindings), getTupleFormat(), bos); + System.out.println(bos.toString()); + try (ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray())) { + TupleQueryResult parsedBindings = QueryResultIO.parseTuple(bis, getTupleFormat()); + assertEquals(bindingNames, parsedBindings.getBindingNames()); + List actualBindings = new ArrayList<>(); + parsedBindings.forEach(actualBindings::add); + assertEquals(bindings, actualBindings); + } + } + } } diff --git a/testsuites/repository/pom.xml b/testsuites/repository/pom.xml index 94738b3c5de..2acb768edd1 100644 --- a/testsuites/repository/pom.xml +++ b/testsuites/repository/pom.xml @@ -4,7 +4,7 @@ org.eclipse.rdf4j rdf4j-testsuites - 3.1.5-SNAPSHOT + 3.2.2-SNAPSHOT rdf4j-repository-testsuite RDF4J: Repository API testsuite diff --git a/testsuites/repository/src/main/java/org/eclipse/rdf4j/repository/EquivalentTest.java b/testsuites/repository/src/main/java/org/eclipse/rdf4j/repository/EquivalentTest.java index 1cd297ce34f..23ab41dd9f7 100644 --- a/testsuites/repository/src/main/java/org/eclipse/rdf4j/repository/EquivalentTest.java +++ b/testsuites/repository/src/main/java/org/eclipse/rdf4j/repository/EquivalentTest.java @@ -148,8 +148,9 @@ public static void setUpClass() throws Exception { public static Collection params() { LinkedList params = new LinkedList<>(); for (String row : matrix.split("\n")) { - if (row.contains("_:")) + if (row.contains("_:")) { continue; + } String[] fields = row.split("\t", 3); if (fields[2].contains("neq")) { params.add(new Object[] { NEQ, fields[0], fields[1] }); @@ -217,36 +218,50 @@ protected Repository createRepository() throws Exception { private static Value getTerm(String label) { if (label.contains("xyz")) { - if (label.contains("integer")) + if (label.contains("integer")) { return xyz_integer; - if (label.contains("string")) + } + if (label.contains("string")) { return xyz_string; - if (label.contains("unknown")) + } + if (label.contains("unknown")) { return xyz_unknown; - if (label.contains("en")) + } + if (label.contains("en")) { return xyz_en; - if (label.contains("EN")) + } + if (label.contains("EN")) { return xyz_EN; - if (label.contains(":xyz")) + } + if (label.contains(":xyz")) { return xyz_uri; - if (label.contains("\"xyz\"")) + } + if (label.contains("\"xyz\"")) { return xyz_simple; + } } if (label.contains("abc")) { - if (label.contains("integer")) + if (label.contains("integer")) { return abc_integer; - if (label.contains("string")) + } + if (label.contains("string")) { return abc_string; - if (label.contains("unknown")) + } + if (label.contains("unknown")) { return abc_unknown; - if (label.contains("en")) + } + if (label.contains("en")) { return abc_en; - if (label.contains("EN")) + } + if (label.contains("EN")) { return abc_EN; - if (label.contains(":abc")) + } + if (label.contains(":abc")) { return abc_uri; - if (label.contains("\"abc\"")) + } + if (label.contains("\"abc\"")) { return abc_simple; + } } throw new AssertionError(label); } @@ -255,12 +270,15 @@ private String compare(Value term1, Value term2) throws Exception { boolean eq = evaluate(EQ); boolean neq = evaluate(NEQ); assertTrue(!eq || !neq); - if (eq && !neq) + if (eq && !neq) { return EQ; - if (!eq && neq) + } + if (!eq && neq) { return NEQ; - if (!eq && !neq) + } + if (!eq && !neq) { return IND; + } throw new AssertionError(); } diff --git a/testsuites/repository/src/main/java/org/eclipse/rdf4j/repository/RDFSchemaRepositoryConnectionTest.java b/testsuites/repository/src/main/java/org/eclipse/rdf4j/repository/RDFSchemaRepositoryConnectionTest.java index 64974cffcfc..afa6ba07b9d 100644 --- a/testsuites/repository/src/main/java/org/eclipse/rdf4j/repository/RDFSchemaRepositoryConnectionTest.java +++ b/testsuites/repository/src/main/java/org/eclipse/rdf4j/repository/RDFSchemaRepositoryConnectionTest.java @@ -180,8 +180,10 @@ public void testContextStatementsNotDuplicated() throws Exception { // the reasoner to support usage of other contexts, this will have to be amended. assertTrue("inferred triple should have been added to null context", testCon.hasStatement(bob, RDF.TYPE, RDFS.RESOURCE, true, (Resource) null)); - assertFalse("input triple should not have been re-added as inferred", - testCon.hasStatement(bob, RDF.TYPE, FOAF.PERSON, true, (Resource) null)); + +// It used to expected behaviour that all inferred statements be added to the null context except those that already existed in some other context. There is no longer a check for if an inferred statement exists in other contexts. +// assertFalse("input triple should not have been re-added as inferred", +// testCon.hasStatement(bob, RDF.TYPE, FOAF.PERSON, true, (Resource) null)); } @Test @@ -193,10 +195,13 @@ public void testContextStatementsNotDuplicated2() throws Exception { // the reasoner to support usage of other contexts, this will have to be amended. assertTrue("inferred triple should have been added to null context", testCon.hasStatement(FOAF.AGENT, RDF.TYPE, RDFS.CLASS, true, (Resource) null)); - assertFalse("input triple should not have been re-added as inferred", - testCon.hasStatement(FOAF.PERSON, RDF.TYPE, RDFS.CLASS, true, (Resource) null)); - assertFalse("input triple should not have been re-added as inferred", - testCon.hasStatement(FOAF.PERSON, RDFS.SUBCLASSOF, FOAF.AGENT, true, (Resource) null)); + // It used to expected behaviour that all inferred statements be added to the null context except those that + // already existed in some other context. There is no longer a check for if an inferred statement exists in + // other contexts. + // assertFalse("input triple should not have been re-added as inferred", testCon.hasStatement(FOAF.PERSON, + // RDF.TYPE, RDFS.CLASS, true, (Resource) null)); + // assertFalse("input triple should not have been re-added as inferred", testCon.hasStatement(FOAF.PERSON, + // RDFS.SUBCLASSOF, FOAF.AGENT, true, (Resource) null)); assertTrue("input triple should be explicitly present", testCon.hasStatement(FOAF.PERSON, RDFS.SUBCLASSOF, FOAF.AGENT, false)); assertTrue("input triple should be explicitly present", diff --git a/testsuites/repository/src/main/java/org/eclipse/rdf4j/repository/RDFStarSupportTest.java b/testsuites/repository/src/main/java/org/eclipse/rdf4j/repository/RDFStarSupportTest.java new file mode 100644 index 00000000000..ae9a38b31cd --- /dev/null +++ b/testsuites/repository/src/main/java/org/eclipse/rdf4j/repository/RDFStarSupportTest.java @@ -0,0 +1,154 @@ +/******************************************************************************* + * Copyright (c) 2020 Eclipse RDF4J contributors. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Distribution License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ +package org.eclipse.rdf4j.repository; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.Assert.fail; + +import java.util.List; +import java.util.concurrent.TimeUnit; + +import org.eclipse.rdf4j.model.BNode; +import org.eclipse.rdf4j.model.IRI; +import org.eclipse.rdf4j.model.Literal; +import org.eclipse.rdf4j.model.Triple; +import org.eclipse.rdf4j.model.ValueFactory; +import org.eclipse.rdf4j.model.vocabulary.FOAF; +import org.eclipse.rdf4j.model.vocabulary.RDF; +import org.eclipse.rdf4j.query.BindingSet; +import org.eclipse.rdf4j.query.QueryResults; +import org.junit.After; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.Timeout; + +/** + * Test cases for RDF* support in the Repository. + * + * @author Jeen Broekstra + * + */ +public abstract class RDFStarSupportTest { + /** + * Timeout all individual tests after 10 minutes. + */ + @Rule + public Timeout to = new Timeout(10, TimeUnit.MINUTES); + + private Repository testRepository; + + private RepositoryConnection testCon; + + private ValueFactory vf; + + private BNode bob; + + private BNode alice; + + private BNode alexander; + + private Literal nameAlice; + + private Literal nameBob; + + private Literal mboxAlice; + + private Literal mboxBob; + + private IRI context1; + + private IRI context2; + + @Before + public void setUp() throws Exception { + testRepository = createRepository(); + + testCon = testRepository.getConnection(); + testCon.clear(); + testCon.clearNamespaces(); + + vf = testRepository.getValueFactory(); + + // Initialize values + bob = vf.createBNode(); + alice = vf.createBNode(); + alexander = vf.createBNode(); + + nameAlice = vf.createLiteral("Alice"); + nameBob = vf.createLiteral("Bob"); + + mboxAlice = vf.createLiteral("alice@example.org"); + mboxBob = vf.createLiteral("bob@example.org"); + + context1 = vf.createIRI("urn:x-local:graph1"); + context2 = vf.createIRI("urn:x-local:graph2"); + } + + @After + public void tearDown() throws Exception { + try { + testCon.close(); + } finally { + testRepository.shutDown(); + } + } + + @Test + public void testAddRDFStarSubject() throws Exception { + Triple rdfStarTriple = vf.createTriple(bob, FOAF.NAME, nameBob); + + testCon.add(rdfStarTriple, RDF.TYPE, RDF.ALT); + + assertThat(testCon.hasStatement(rdfStarTriple, RDF.TYPE, RDF.ALT, false)).isTrue(); + } + + @Test + public void testAddRDFStarObject() throws Exception { + Triple rdfStarTriple = vf.createTriple(bob, FOAF.NAME, nameBob); + + testCon.add(RDF.ALT, RDF.TYPE, rdfStarTriple); + + assertThat(testCon.hasStatement(RDF.ALT, RDF.TYPE, rdfStarTriple, false)).isTrue(); + } + + @Test + public void testAddRDFStarContext() throws Exception { + Triple rdfStarTriple = vf.createTriple(bob, FOAF.NAME, nameBob); + + try { + testCon.add(RDF.ALT, RDF.TYPE, RDF.ALT, rdfStarTriple); + fail("RDF* triple value should not be allowed by store as context identifier"); + } catch (UnsupportedOperationException e) { + // fall through, expected behavior + testCon.rollback(); + } + + } + + @Test + public void testSparqlStar() { + Triple rdfStarTriple = vf.createTriple(bob, FOAF.NAME, nameBob); + + testCon.add(rdfStarTriple, RDF.TYPE, RDF.ALT); + + String query = "PREFIX foaf: <" + FOAF.NAMESPACE + ">\nSELECT DISTINCT * WHERE { <> ?b ?c. }"; + + List result = QueryResults.asList(testCon.prepareTupleQuery(query).evaluate()); + assertThat(result).hasSize(1); + + BindingSet bs = result.get(0); + assertThat(bs.getValue("s")).isEqualTo(bob); + assertThat(bs.getValue("o")).isEqualTo(nameBob); + assertThat(bs.getValue("b")).isEqualTo(RDF.TYPE); + assertThat(bs.getValue("c")).isEqualTo(RDF.ALT); + + } + + protected abstract Repository createRepository(); +} diff --git a/testsuites/repository/src/main/java/org/eclipse/rdf4j/repository/RepositoryConnectionTest.java b/testsuites/repository/src/main/java/org/eclipse/rdf4j/repository/RepositoryConnectionTest.java index ed94525175d..441494e9b2f 100644 --- a/testsuites/repository/src/main/java/org/eclipse/rdf4j/repository/RepositoryConnectionTest.java +++ b/testsuites/repository/src/main/java/org/eclipse/rdf4j/repository/RepositoryConnectionTest.java @@ -1071,6 +1071,21 @@ public void testRemoveStatements() throws Exception { assertThat(testCon.isEmpty()).isTrue(); } + @Test + public void testRemoveStatementWithContext() throws Exception { + Statement statement = vf.createStatement(alice, name, nameAlice, context1); + testCon.add(statement); + + assertThat(testCon.hasStatement(alice, name, nameAlice, false)).isTrue(); + assertThat(testCon.hasStatement(alice, name, nameAlice, false, context1)).isTrue(); + + testCon.remove(alice, name, nameAlice, context1); + + assertThat(testCon.hasStatement(alice, name, nameAlice, false)).isFalse(); + assertThat(testCon.hasStatement(alice, name, nameAlice, false, context1)).isFalse(); + + } + @Test public void testRemoveStatementCollection() throws Exception { testCon.begin(); diff --git a/testsuites/repository/src/main/java/org/eclipse/rdf4j/repository/RepositoryTest.java b/testsuites/repository/src/main/java/org/eclipse/rdf4j/repository/RepositoryTest.java index ab0ab94ebec..d41c754267f 100644 --- a/testsuites/repository/src/main/java/org/eclipse/rdf4j/repository/RepositoryTest.java +++ b/testsuites/repository/src/main/java/org/eclipse/rdf4j/repository/RepositoryTest.java @@ -25,7 +25,7 @@ /** * Integration test suite for implementations of Repository. - * + * * @author Jeen Broekstra */ public abstract class RepositoryTest { @@ -109,7 +109,7 @@ public void tearDown() throws Exception { /** * Gets an (uninitialized) instance of the repository that should be tested. - * + * * @return an uninitialized repository. */ protected abstract Repository createRepository() throws Exception; diff --git a/testsuites/repository/src/main/java/org/eclipse/rdf4j/repository/optimistic/IsolationLevelTest.java b/testsuites/repository/src/main/java/org/eclipse/rdf4j/repository/optimistic/IsolationLevelTest.java index b0114553a5f..e5cf46399e0 100644 --- a/testsuites/repository/src/main/java/org/eclipse/rdf4j/repository/optimistic/IsolationLevelTest.java +++ b/testsuites/repository/src/main/java/org/eclipse/rdf4j/repository/optimistic/IsolationLevelTest.java @@ -37,7 +37,7 @@ /** * Test that the Repository correctly supports claimed isolation levels. - * + * * @author James Leigh */ public class IsolationLevelTest { diff --git a/testsuites/repository/src/main/java/org/eclipse/rdf4j/repository/optimistic/RemoveIsolationTest.java b/testsuites/repository/src/main/java/org/eclipse/rdf4j/repository/optimistic/RemoveIsolationTest.java index 965b7413f4e..1cbd43e30f7 100644 --- a/testsuites/repository/src/main/java/org/eclipse/rdf4j/repository/optimistic/RemoveIsolationTest.java +++ b/testsuites/repository/src/main/java/org/eclipse/rdf4j/repository/optimistic/RemoveIsolationTest.java @@ -27,7 +27,7 @@ /** * Test isolation behavior on removal operations - * + * * @author jeen * */ diff --git a/testsuites/repository/src/main/java/org/eclipse/rdf4j/repository/optimistic/SerializableTest.java b/testsuites/repository/src/main/java/org/eclipse/rdf4j/repository/optimistic/SerializableTest.java index 7cc9fdf4524..cfbd2d6da8b 100644 --- a/testsuites/repository/src/main/java/org/eclipse/rdf4j/repository/optimistic/SerializableTest.java +++ b/testsuites/repository/src/main/java/org/eclipse/rdf4j/repository/optimistic/SerializableTest.java @@ -36,7 +36,7 @@ /** * Tests on behavior of SERIALIZABLE transactions. - * + * * @author jeen * */ diff --git a/testsuites/rio/pom.xml b/testsuites/rio/pom.xml index 774c1510b75..b0d3b3800e9 100644 --- a/testsuites/rio/pom.xml +++ b/testsuites/rio/pom.xml @@ -4,7 +4,7 @@ org.eclipse.rdf4j rdf4j-testsuites - 3.1.5-SNAPSHOT + 3.2.2-SNAPSHOT rdf4j-rio-testsuite RDF4J Rio compliance test suite diff --git a/testsuites/rio/src/main/java/org/eclipse/rdf4j/rio/NegativeParserTest.java b/testsuites/rio/src/main/java/org/eclipse/rdf4j/rio/NegativeParserTest.java index 8bb188882c6..a4493c5084c 100644 --- a/testsuites/rio/src/main/java/org/eclipse/rdf4j/rio/NegativeParserTest.java +++ b/testsuites/rio/src/main/java/org/eclipse/rdf4j/rio/NegativeParserTest.java @@ -89,4 +89,4 @@ protected void runTest() { } } -} // end inner class NegativeParserTest \ No newline at end of file +} // end inner class NegativeParserTest diff --git a/testsuites/rio/src/main/java/org/eclipse/rdf4j/rio/rdfjson/RDFJSONParserTestCase.java b/testsuites/rio/src/main/java/org/eclipse/rdf4j/rio/rdfjson/RDFJSONParserTestCase.java index 6865977ea8b..7ce56e981d8 100644 --- a/testsuites/rio/src/main/java/org/eclipse/rdf4j/rio/rdfjson/RDFJSONParserTestCase.java +++ b/testsuites/rio/src/main/java/org/eclipse/rdf4j/rio/rdfjson/RDFJSONParserTestCase.java @@ -34,7 +34,7 @@ /** * JUnit test for the RDFJSON Parser. - * + * * @author Peter Ansell */ public abstract class RDFJSONParserTestCase { diff --git a/testsuites/sail/pom.xml b/testsuites/sail/pom.xml index af7c3da35be..98389efd6ef 100644 --- a/testsuites/sail/pom.xml +++ b/testsuites/sail/pom.xml @@ -4,7 +4,7 @@ org.eclipse.rdf4j rdf4j-testsuites - 3.1.5-SNAPSHOT + 3.2.2-SNAPSHOT rdf4j-sail-testsuite RDF4J: Sail API testsuite diff --git a/testsuites/sail/src/main/java/org/eclipse/rdf4j/sail/EvaluationStrategyTest.java b/testsuites/sail/src/main/java/org/eclipse/rdf4j/sail/EvaluationStrategyTest.java index be2dcafadf4..cd2ed52c241 100644 --- a/testsuites/sail/src/main/java/org/eclipse/rdf4j/sail/EvaluationStrategyTest.java +++ b/testsuites/sail/src/main/java/org/eclipse/rdf4j/sail/EvaluationStrategyTest.java @@ -39,7 +39,7 @@ /** * Test cases for behavior of {@link StrictEvaluationStrategy} and {@link ExtendedEvaluationStrategy} on base Sail * implementations. - * + * * @author Jeen Broekstra */ public abstract class EvaluationStrategyTest { @@ -123,7 +123,7 @@ public void testDatetimeSubtypesExtended() { /** * Gets a configuration object for the base Sail that should be tested. - * + * * @return a {@link BaseSailConfig}. */ protected abstract BaseSailConfig getBaseSailConfig(); diff --git a/testsuites/sail/src/main/java/org/eclipse/rdf4j/sail/InferencingTest.java b/testsuites/sail/src/main/java/org/eclipse/rdf4j/sail/InferencingTest.java index 5ad1159de14..c803e8bcbbc 100644 --- a/testsuites/sail/src/main/java/org/eclipse/rdf4j/sail/InferencingTest.java +++ b/testsuites/sail/src/main/java/org/eclipse/rdf4j/sail/InferencingTest.java @@ -7,8 +7,6 @@ *******************************************************************************/ package org.eclipse.rdf4j.sail; -import static org.junit.Assert.fail; - import java.io.BufferedOutputStream; import java.io.File; import java.io.FileOutputStream; @@ -244,7 +242,7 @@ public void testTypeError002() throws Exception { /** * Gets an instance of the Sail that should be tested. - * + * * @return a SailRepo. */ protected abstract Sail createSail(); diff --git a/testsuites/sail/src/main/java/org/eclipse/rdf4j/sail/SailConcurrencyTest.java b/testsuites/sail/src/main/java/org/eclipse/rdf4j/sail/SailConcurrencyTest.java index e84761b4a5f..17d8643cce0 100644 --- a/testsuites/sail/src/main/java/org/eclipse/rdf4j/sail/SailConcurrencyTest.java +++ b/testsuites/sail/src/main/java/org/eclipse/rdf4j/sail/SailConcurrencyTest.java @@ -7,7 +7,6 @@ *******************************************************************************/ package org.eclipse.rdf4j.sail; -import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import java.util.Random; diff --git a/testsuites/sail/src/main/java/org/eclipse/rdf4j/sail/SailInterruptTest.java b/testsuites/sail/src/main/java/org/eclipse/rdf4j/sail/SailInterruptTest.java index 5c9f16a7c7f..ec2497bac80 100644 --- a/testsuites/sail/src/main/java/org/eclipse/rdf4j/sail/SailInterruptTest.java +++ b/testsuites/sail/src/main/java/org/eclipse/rdf4j/sail/SailInterruptTest.java @@ -21,7 +21,7 @@ /** * Tests thread interrupts on a Sail implementation. - * + * * @author Arjohn Kampman */ public abstract class SailInterruptTest { diff --git a/testsuites/serql/pom.xml b/testsuites/serql/pom.xml index 9b5a743de61..750674b9361 100644 --- a/testsuites/serql/pom.xml +++ b/testsuites/serql/pom.xml @@ -4,7 +4,7 @@ org.eclipse.rdf4j rdf4j-testsuites - 3.1.5-SNAPSHOT + 3.2.2-SNAPSHOT rdf4j-serql-testsuite RDF4J SeRQL test suite diff --git a/testsuites/shacl/pom.xml b/testsuites/shacl/pom.xml index 05d064565f5..8e878a0736c 100644 --- a/testsuites/shacl/pom.xml +++ b/testsuites/shacl/pom.xml @@ -4,7 +4,7 @@ org.eclipse.rdf4j rdf4j-testsuites - 3.1.5-SNAPSHOT + 3.2.2-SNAPSHOT rdf4j-shacl-testsuite RDF4J SHACL compliance test suite diff --git a/testsuites/shacl/src/main/java/org/eclipse/rdf4j/shacl/manifest/SHACLManifestTestSuiteFactory.java b/testsuites/shacl/src/main/java/org/eclipse/rdf4j/shacl/manifest/SHACLManifestTestSuiteFactory.java index 6adf081d5de..3aa665602f6 100644 --- a/testsuites/shacl/src/main/java/org/eclipse/rdf4j/shacl/manifest/SHACLManifestTestSuiteFactory.java +++ b/testsuites/shacl/src/main/java/org/eclipse/rdf4j/shacl/manifest/SHACLManifestTestSuiteFactory.java @@ -273,7 +273,7 @@ private TestSuite createSuiteEntry(String manifestFileURL, TestFactory factory, private String getManifestName(Model model, IRI manifest) throws QueryEvaluationException, RepositoryException, MalformedQueryException { // Try to extract suite name from manifest file - String label = Models.objectString(model.filter(manifest, RDFS.LABEL, null)).orElse(null); + String label = Models.objectString(model.getStatements(manifest, RDFS.LABEL, null)).orElse(null); if (label != null) { return label; } @@ -289,8 +289,8 @@ private List getListEntries(Model model, Resource rdfList) { if (rdfList == null || rdfList.equals(RDF.NIL)) { return new ArrayList<>(); } - Resource first = Models.objectResource(model.filter(rdfList, RDF.FIRST, null)).orElse(null); - Resource rest = Models.objectResource(model.filter(rdfList, RDF.REST, null)).orElse(null); + Resource first = Models.objectResource(model.getStatements(rdfList, RDF.FIRST, null)).orElse(null); + Resource rest = Models.objectResource(model.getStatements(rdfList, RDF.REST, null)).orElse(null); List list = getListEntries(model, rest); list.add(0, first); return list; @@ -298,13 +298,13 @@ private List getListEntries(Model model, Resource rdfList) { private Resource getResource(Model model, Resource subject, String pred) { ValueFactory vf = SimpleValueFactory.getInstance(); - Optional optional = Models.objectResource(model.filter(subject, vf.createIRI(pred), null)); + Optional optional = Models.objectResource(model.getStatements(subject, vf.createIRI(pred), null)); return optional.orElseThrow(Models.modelException("Missing " + subject + " " + pred)); } private Literal getLiteral(Model model, Resource subject, String pred) { ValueFactory vf = SimpleValueFactory.getInstance(); - Optional optional = Models.objectLiteral(model.filter(subject, vf.createIRI(pred), null)); + Optional optional = Models.objectLiteral(model.getStatements(subject, vf.createIRI(pred), null)); return optional.orElseThrow(Models.modelException("Missing " + subject + " " + pred)); } diff --git a/testsuites/sparql/pom.xml b/testsuites/sparql/pom.xml index daddf641e1d..57f01dd2d22 100644 --- a/testsuites/sparql/pom.xml +++ b/testsuites/sparql/pom.xml @@ -4,7 +4,7 @@ org.eclipse.rdf4j rdf4j-testsuites - 3.1.5-SNAPSHOT + 3.2.2-SNAPSHOT rdf4j-sparql-testsuite RDF4J SPARQL compliance test suite diff --git a/testsuites/sparql/src/main/java/org/eclipse/rdf4j/query/parser/sparql/ComplexSPARQLQueryTest.java b/testsuites/sparql/src/main/java/org/eclipse/rdf4j/query/parser/sparql/ComplexSPARQLQueryTest.java index b32a8613050..e850f957b3b 100644 --- a/testsuites/sparql/src/main/java/org/eclipse/rdf4j/query/parser/sparql/ComplexSPARQLQueryTest.java +++ b/testsuites/sparql/src/main/java/org/eclipse/rdf4j/query/parser/sparql/ComplexSPARQLQueryTest.java @@ -66,7 +66,7 @@ * A set of compliance tests on SPARQL query functionality which can not be easily executed using the * {@link SPARQL11ManifestTest} format. This includes tests on queries with non-deterministic output (e.g. * GROUP_CONCAT). - * + * * @author Jeen Broekstra */ public abstract class ComplexSPARQLQueryTest { @@ -2424,6 +2424,33 @@ public void testFilterExistsExternalValuesClause() throws Exception { assertEquals("http://subj1", result.get(0).getValue("s").stringValue()); } + @Test + public void testValuesClauseNamedGraph() throws Exception { + String ex = "http://example.org/"; + String data = "@prefix foaf: <" + FOAF.NAMESPACE + "> .\n" + + "@prefix ex: <" + ex + "> .\n" + + "ex:graph1 {\n" + + " ex:Person1 rdf:type foaf:Person ;\n" + + " foaf:name \"Person 1\" . ex:Person2 rdf:type foaf:Person ;\n" + + " foaf:name \"Person 2\" . ex:Person3 rdf:type foaf:Person ;\n" + + " foaf:name \"Person 3\" .\n" + + "}"; + + conn.add(new StringReader(data), "", RDFFormat.TRIG); + + String query = "SELECT ?person ?name ?__index \n" + + "WHERE { " + + " VALUES (?person ?name ?__index) { \n" + + " ( UNDEF \"0\") \n" + + " ( UNDEF \"2\") } \n" + + " GRAPH { ?person ?name . } }"; + + TupleQuery q = conn.prepareTupleQuery(query); + + List result = QueryResults.asList(q.evaluate()); + assertThat(result).hasSize(2); + } + /** * See https://github.com/eclipse/rdf4j/issues/1267 */ @@ -2478,7 +2505,7 @@ private int countCharOccurrences(String string, char ch) { /** * Get a set of useful namespace prefix declarations. - * + * * @return namespace prefix declarations for dc, foaf and ex. */ protected String getNamespaceDeclarations() { diff --git a/testsuites/sparql/src/main/java/org/eclipse/rdf4j/query/parser/sparql/SPARQLUpdateTest.java b/testsuites/sparql/src/main/java/org/eclipse/rdf4j/query/parser/sparql/SPARQLUpdateTest.java index 667d4da312c..34fe0d9e48a 100644 --- a/testsuites/sparql/src/main/java/org/eclipse/rdf4j/query/parser/sparql/SPARQLUpdateTest.java +++ b/testsuites/sparql/src/main/java/org/eclipse/rdf4j/query/parser/sparql/SPARQLUpdateTest.java @@ -30,10 +30,12 @@ import org.eclipse.rdf4j.model.vocabulary.SESAME; import org.eclipse.rdf4j.model.vocabulary.XMLSchema; import org.eclipse.rdf4j.query.BindingSet; +import org.eclipse.rdf4j.query.MalformedQueryException; import org.eclipse.rdf4j.query.QueryLanguage; import org.eclipse.rdf4j.query.TupleQueryResult; import org.eclipse.rdf4j.query.Update; import org.eclipse.rdf4j.query.UpdateExecutionException; +import org.eclipse.rdf4j.query.impl.SimpleDataset; import org.eclipse.rdf4j.repository.Repository; import org.eclipse.rdf4j.repository.RepositoryConnection; import org.eclipse.rdf4j.repository.RepositoryException; @@ -48,7 +50,7 @@ /** * Tests for SPARQL 1.1 Update functionality. - * + * * @author Jeen Broekstra */ public abstract class SPARQLUpdateTest { @@ -1717,12 +1719,43 @@ public void testUpdateSequenceWithRelativeIRI() throws Exception { operation.execute(); } + @Test + public void contextualInsertDeleteData() + throws RepositoryException, MalformedQueryException, UpdateExecutionException { + StringBuilder insert = new StringBuilder(); + insert.append(getNamespaceDeclarations()); + insert.append("INSERT DATA { ex:alice foaf:knows ex:bob. ex:alice foaf:mbox \"alice@example.org\" .} "); + + SimpleDataset ds = new SimpleDataset(); + ds.setDefaultInsertGraph(graph2); + ds.addDefaultRemoveGraph(graph2); + + Update updInsert = con.prepareUpdate(QueryLanguage.SPARQL, insert.toString()); + updInsert.setDataset(ds); + updInsert.execute(); + + assertTrue(con.hasStatement(alice, FOAF.KNOWS, bob, true, graph2)); + assertTrue(con.hasStatement(alice, FOAF.MBOX, f.createLiteral("alice@example.org"), true, graph2)); + + StringBuilder update = new StringBuilder(); + update.append(getNamespaceDeclarations()); + update.append("DELETE DATA { ex:alice foaf:knows ex:bob. ex:alice foaf:mbox \"alice@example.org\" .} "); + + Update updDelete = con.prepareUpdate(QueryLanguage.SPARQL, update.toString()); + updDelete.setDataset(ds); + updDelete.execute(); + + String msg = "statement should have been deleted."; + assertFalse(msg, con.hasStatement(alice, FOAF.KNOWS, bob, true, graph2)); + assertFalse(msg, con.hasStatement(alice, FOAF.MBOX, f.createLiteral("alice@example.org"), true, graph2)); + } + /* * @Test public void testLoad() throws Exception { String update = * "LOAD "; String ns = * "http://www.daml.org/2001/01/gedcom/gedcom#"; Update operation = con.prepareUpdate(QueryLanguage.SPARQL, update); * operation.execute(); assertTrue(con.hasStatement(null, RDF.TYPE, f.createURI(ns, "Family"), true)); } - * + * * @Test public void testLoadIntoGraph() throws Exception { String ns = * "http://www.daml.org/2001/01/gedcom/gedcom#"; String update = * "LOAD INTO GRAPH <" + ns + "> "; Update operation = @@ -1746,7 +1779,7 @@ protected void loadDataset(String datasetFile) throws RDFParseException, Reposit /** * Get a set of useful namespace prefix declarations. - * + * * @return namespace prefix declarations for rdf, rdfs, dc, foaf and ex. */ protected String getNamespaceDeclarations() { @@ -1764,7 +1797,7 @@ protected String getNamespaceDeclarations() { /** * Creates, initializes and clears a repository. - * + * * @return an initialized empty repository. * @throws Exception */ @@ -1781,7 +1814,7 @@ protected Repository createRepository() throws Exception { /** * Create a new Repository object. Subclasses are expected to implement this method to supply the test case with a * specific Repository type and configuration. - * + * * @return a new (uninitialized) Repository * @throws Exception */ diff --git a/testsuites/sparql/src/main/java/org/eclipse/rdf4j/query/parser/sparql/manifest/SPARQL10ManifestTest.java b/testsuites/sparql/src/main/java/org/eclipse/rdf4j/query/parser/sparql/manifest/SPARQL10ManifestTest.java index 29f1e9cf75b..55ef8566e59 100644 --- a/testsuites/sparql/src/main/java/org/eclipse/rdf4j/query/parser/sparql/manifest/SPARQL10ManifestTest.java +++ b/testsuites/sparql/src/main/java/org/eclipse/rdf4j/query/parser/sparql/manifest/SPARQL10ManifestTest.java @@ -169,4 +169,4 @@ static void addTurtle(RepositoryConnection con, URL url, String baseURI, Resourc in.close(); } } -} \ No newline at end of file +} diff --git a/testsuites/sparql/src/main/java/org/eclipse/rdf4j/query/parser/sparql/manifest/SPARQL11ManifestTest.java b/testsuites/sparql/src/main/java/org/eclipse/rdf4j/query/parser/sparql/manifest/SPARQL11ManifestTest.java index 610cf4cf4d5..155e0884b3d 100644 --- a/testsuites/sparql/src/main/java/org/eclipse/rdf4j/query/parser/sparql/manifest/SPARQL11ManifestTest.java +++ b/testsuites/sparql/src/main/java/org/eclipse/rdf4j/query/parser/sparql/manifest/SPARQL11ManifestTest.java @@ -38,7 +38,7 @@ /** * Functionality for creating a JUnit test suite out of a W3C Working Group-style manifest for SPARQL query and update * tests. - * + * * @author Jeen Broekstra */ public class SPARQL11ManifestTest { @@ -49,7 +49,7 @@ public class SPARQL11ManifestTest { /** * Creates a new {@link TestSuite} for execution of {@link SPARQLQueryTest} s. - * + * * @param factory a factory class that creates each individual test case. * @param manifestFile url of the manifest file (may be remote or local). * @param approvedTestsOnly if true, use working group-approved tests only. @@ -109,7 +109,7 @@ public void run(TestResult result) { /** * Creates a new {@link TestSuite} for execution of {@link SPARQLUpdateConformanceTest} s. - * + * * @param factory a factory class that creates each individual test case. * @param manifestFile url of the manifest file (may be remote or local). * @param approvedTestsOnly if true, use working group-approved tests only. @@ -170,7 +170,7 @@ public void run(TestResult result) { /** * Verifies if the selected subManifest occurs in the supplied list of excluded subdirs. - * + * * @param subManifestFile the url of a sub-manifest * @param excludedSubdirs an array of directory names. May be null. * @return false if the supplied list of excluded subdirs is not empty and contains a match for the diff --git a/testsuites/sparql/src/main/java/org/eclipse/rdf4j/query/parser/sparql/manifest/SPARQL11QueryComplianceTest.java b/testsuites/sparql/src/main/java/org/eclipse/rdf4j/query/parser/sparql/manifest/SPARQL11QueryComplianceTest.java new file mode 100644 index 00000000000..e811b611ea2 --- /dev/null +++ b/testsuites/sparql/src/main/java/org/eclipse/rdf4j/query/parser/sparql/manifest/SPARQL11QueryComplianceTest.java @@ -0,0 +1,664 @@ +/******************************************************************************* + * Copyright (c) 2020 Eclipse RDF4J contributors. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Distribution License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ +package org.eclipse.rdf4j.query.parser.sparql.manifest; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.fail; +import static org.assertj.core.api.Assumptions.assumeThat; + +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.net.URL; +import java.nio.charset.StandardCharsets; +import java.util.ArrayDeque; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.Deque; +import java.util.HashSet; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Optional; +import java.util.Set; + +import org.eclipse.rdf4j.common.io.IOUtil; +import org.eclipse.rdf4j.common.iteration.Iterations; +import org.eclipse.rdf4j.common.text.StringUtil; +import org.eclipse.rdf4j.model.IRI; +import org.eclipse.rdf4j.model.Resource; +import org.eclipse.rdf4j.model.Statement; +import org.eclipse.rdf4j.model.Value; +import org.eclipse.rdf4j.model.util.Literals; +import org.eclipse.rdf4j.model.util.Models; +import org.eclipse.rdf4j.query.BindingSet; +import org.eclipse.rdf4j.query.BooleanQuery; +import org.eclipse.rdf4j.query.Dataset; +import org.eclipse.rdf4j.query.GraphQuery; +import org.eclipse.rdf4j.query.GraphQueryResult; +import org.eclipse.rdf4j.query.Query; +import org.eclipse.rdf4j.query.QueryLanguage; +import org.eclipse.rdf4j.query.QueryResults; +import org.eclipse.rdf4j.query.TupleQuery; +import org.eclipse.rdf4j.query.TupleQueryResult; +import org.eclipse.rdf4j.query.dawg.DAWGTestResultSetUtil; +import org.eclipse.rdf4j.query.impl.MutableTupleQueryResult; +import org.eclipse.rdf4j.query.impl.SimpleDataset; +import org.eclipse.rdf4j.query.impl.TupleQueryResultBuilder; +import org.eclipse.rdf4j.query.resultio.BooleanQueryResultParserRegistry; +import org.eclipse.rdf4j.query.resultio.QueryResultFormat; +import org.eclipse.rdf4j.query.resultio.QueryResultIO; +import org.eclipse.rdf4j.query.resultio.TupleQueryResultParser; +import org.eclipse.rdf4j.repository.Repository; +import org.eclipse.rdf4j.repository.RepositoryConnection; +import org.eclipse.rdf4j.repository.sail.SailRepository; +import org.eclipse.rdf4j.repository.sail.SailRepositoryConnection; +import org.eclipse.rdf4j.repository.util.RDFInserter; +import org.eclipse.rdf4j.rio.RDFFormat; +import org.eclipse.rdf4j.rio.RDFParser; +import org.eclipse.rdf4j.rio.RDFParser.DatatypeHandling; +import org.eclipse.rdf4j.rio.Rio; +import org.eclipse.rdf4j.rio.helpers.BasicParserSettings; +import org.eclipse.rdf4j.rio.helpers.StatementCollector; +import org.eclipse.rdf4j.sail.memory.MemoryStore; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * A test suite that runs the W3C Approved SPARQL 1.1 query tests. + * + * @author Jeen Broekstra + * + * @see https://www.w3.org/2009/sparql/docs/tests/ + */ +@RunWith(Parameterized.class) +public abstract class SPARQL11QueryComplianceTest { + + private static final Logger logger = LoggerFactory.getLogger(SPARQL11QueryComplianceTest.class); + + private static final String[] defaultIgnoredTests = { + // test case incompatible with RDF 1.1 - see + // http://lists.w3.org/Archives/Public/public-sparql-dev/2013AprJun/0006.html + "STRDT() TypeErrors", + // test case incompatible with RDF 1.1 - see + // http://lists.w3.org/Archives/Public/public-sparql-dev/2013AprJun/0006.html + "STRLANG() TypeErrors", + // known issue: SES-937 + "sq03 - Subquery within graph pattern, graph variable is not bound" + }; + + private List ignoredTests = new ArrayList<>(Arrays.asList(defaultIgnoredTests)); + + private static final String[] excludedSubdirs = { "service" }; + + private String testURI; + private String name; + private String queryFileURL; + private String resultFileURL; + private Dataset dataset; + private boolean ordered; + private Repository dataRep; + + @Parameterized.Parameters(name = "{0}") + public static Collection data() { + return Arrays.asList(getTestData()); + } + + public SPARQL11QueryComplianceTest(String displayName, String testURI, String name, String queryFileURL, + String resultFileURL, Dataset dataset, boolean ordered) { + this.testURI = testURI; + this.name = name; + this.queryFileURL = queryFileURL; + this.resultFileURL = resultFileURL; + this.dataset = dataset; + this.ordered = ordered; + } + + @Before + public void setUp() throws Exception { + dataRep = createRepository(); + if (dataset != null) { + try { + uploadDataset(dataset); + } catch (Exception exc) { + try { + dataRep.shutDown(); + dataRep = null; + } catch (Exception e2) { + logger.error(e2.toString(), e2); + } + throw exc; + } + } + } + + @After + public void tearDown() throws Exception { + if (dataRep != null) { + dataRep.shutDown(); + dataRep = null; + } + } + + private final Repository createRepository() throws Exception { + Repository repo = newRepository(); + try (RepositoryConnection con = repo.getConnection()) { + con.clear(); + con.clearNamespaces(); + } + return repo; + } + + protected abstract Repository newRepository() throws Exception; + + @Test + public void test() throws Exception { + runTest(); + } + + private static Object[][] getTestData() { + + List tests = new ArrayList<>(); + + Deque manifests = new ArrayDeque<>(); + manifests.add( + SPARQL11QueryComplianceTest.class.getClassLoader() + .getResource("testcases-sparql-1.1-w3c/manifest-all.ttl") + .toExternalForm()); + while (!manifests.isEmpty()) { + String pop = manifests.pop(); + Manifest manifest = new Manifest(pop); + tests.addAll(manifest.tests); + manifests.addAll(manifest.subManifests); + } + + Object[][] result = new Object[tests.size()][6]; + tests.toArray(result); + + return result; + } + + static class Manifest { + List tests = new ArrayList<>(); + List subManifests = new ArrayList<>(); + + public Manifest(String filename) { + SailRepository sailRepository = new SailRepository(new MemoryStore()); + try (SailRepositoryConnection connection = sailRepository.getConnection()) { + connection.add(new URL(filename), filename, RDFFormat.TURTLE); + } catch (IOException e) { + throw new RuntimeException(e); + } + + try (SailRepositoryConnection connection = sailRepository.getConnection()) { + + String manifestQuery = " PREFIX qt: " + + "PREFIX mf: " + + "SELECT DISTINCT ?manifestFile " + + "WHERE { [] mf:include [ rdf:rest*/rdf:first ?manifestFile ] . } "; + + try (TupleQueryResult manifestResults = connection + .prepareTupleQuery(QueryLanguage.SPARQL, manifestQuery, filename) + .evaluate()) { + for (BindingSet bindingSet : manifestResults) { + String subManifestFile = bindingSet.getValue("manifestFile").stringValue(); + if (includeSubManifest(subManifestFile, excludedSubdirs)) { + subManifests.add(subManifestFile); + } + } + } + + StringBuilder query = new StringBuilder(512); + query.append(" PREFIX mf: \n"); + query.append(" PREFIX dawgt: \n"); + query.append(" PREFIX qt: \n"); + query.append(" PREFIX sd: \n"); + query.append(" PREFIX ent: \n"); + query.append( + " SELECT DISTINCT ?testURI ?testName ?resultFile ?action ?queryFile ?defaultGraph ?ordered \n"); + query.append(" WHERE { [] rdf:first ?testURI . \n"); +// if (approvedOnly) { + query.append(" ?testURI dawgt:approval dawgt:Approved . \n"); +// } + query.append(" ?testURI mf:name ?testName; \n"); + query.append(" mf:result ?resultFile . \n"); + query.append(" OPTIONAL { ?testURI mf:checkOrder ?ordered } \n"); + query.append(" OPTIONAL { ?testURI mf:requires ?requirement } \n"); + query.append(" ?testURI mf:action ?action. \n"); + query.append(" ?action qt:query ?queryFile . \n"); + query.append(" OPTIONAL { ?action qt:data ?defaultGraph } \n"); + query.append(" OPTIONAL { ?action sd:entailmentRegime ?regime } \n"); + // skip tests involving CSV result files, these are not query tests + query.append(" FILTER(!STRENDS(STR(?resultFile), \"csv\")) \n"); + // skip tests involving entailment regimes + query.append(" FILTER(!BOUND(?regime)) \n"); + // skip test involving basic federation, these are tested separately. + query.append(" FILTER (!BOUND(?requirement) || (?requirement != mf:BasicFederation)) \n"); + query.append(" }\n"); + + try (TupleQueryResult result = connection.prepareTupleQuery(query.toString()).evaluate()) { + + query.setLength(0); + query.append(" PREFIX qt: \n"); + query.append(" SELECT ?graph \n"); + query.append(" WHERE { ?action qt:graphData ?graph } \n"); + TupleQuery namedGraphsQuery = connection.prepareTupleQuery(query.toString()); + + for (BindingSet bs : result) { + // FIXME I'm sure there's a neater way to do this + String testName = bs.getValue("testName").stringValue(); + String displayName = filename.substring( + filename.lastIndexOf("testcases-sparql-1.1-w3c/") + + "testcases-sparql-1.1-w3c/".length(), + filename.lastIndexOf("/")) + + ": " + testName; + + IRI defaultGraphURI = (IRI) bs.getValue("defaultGraph"); + Value action = bs.getValue("action"); + Value ordered = bs.getValue("ordered"); + + SimpleDataset dataset = null; + + // Query named graphs + namedGraphsQuery.setBinding("action", action); + try (TupleQueryResult namedGraphs = namedGraphsQuery.evaluate()) { + if (defaultGraphURI != null || namedGraphs.hasNext()) { + dataset = new SimpleDataset(); + if (defaultGraphURI != null) { + dataset.addDefaultGraph(defaultGraphURI); + } + while (namedGraphs.hasNext()) { + BindingSet graphBindings = namedGraphs.next(); + IRI namedGraphURI = (IRI) graphBindings.getValue("graph"); + dataset.addNamedGraph(namedGraphURI); + } + } + } + + tests.add(new Object[] { + displayName, + bs.getValue("testURI").stringValue(), + testName, + bs.getValue("queryFile").stringValue(), + bs.getValue("resultFile").stringValue(), + dataset, + Literals.getBooleanValue(ordered, false) }); + } + } + + } + + } + + } + + private void runTest() throws Exception { + assumeThat(getIgnoredTests().contains(name)).withFailMessage("test case '%s' is ignored", name).isFalse(); + + logger.debug("running {}", name); + + try (RepositoryConnection conn = dataRep.getConnection()) { + // Some SPARQL Tests have non-XSD datatypes that must pass for the test + // suite to complete successfully + conn.getParserConfig().set(BasicParserSettings.VERIFY_DATATYPE_VALUES, Boolean.FALSE); + conn.getParserConfig().set(BasicParserSettings.FAIL_ON_UNKNOWN_DATATYPES, Boolean.FALSE); + + String queryString = readQueryString(); + Query query = conn.prepareQuery(QueryLanguage.SPARQL, queryString, queryFileURL); + if (dataset != null) { + query.setDataset(dataset); + } + + if (query instanceof TupleQuery) { + TupleQueryResult actualResult = ((TupleQuery) query).evaluate(); + TupleQueryResult expectedResult = readExpectedTupleQueryResult(); + compareTupleQueryResults(actualResult, expectedResult); + } else if (query instanceof GraphQuery) { + GraphQueryResult gqr = ((GraphQuery) query).evaluate(); + Set actualResult = Iterations.asSet(gqr); + Set expectedResult = readExpectedGraphQueryResult(); + + compareGraphs(actualResult, expectedResult); + } else if (query instanceof BooleanQuery) { + boolean actualResult = ((BooleanQuery) query).evaluate(); + boolean expectedResult = readExpectedBooleanQueryResult(); + assertThat(actualResult).isEqualTo(expectedResult); + } else { + throw new RuntimeException("Unexpected query type: " + query.getClass()); + } + } + } + + private final void uploadDataset(Dataset dataset) throws Exception { + try (RepositoryConnection con = dataRep.getConnection()) { + // Merge default and named graphs to filter duplicates + Set graphURIs = new HashSet<>(); + graphURIs.addAll(dataset.getDefaultGraphs()); + graphURIs.addAll(dataset.getNamedGraphs()); + + for (Resource graphURI : graphURIs) { + upload(((IRI) graphURI), graphURI); + } + } + } + + private void upload(IRI graphURI, Resource context) throws Exception { + RepositoryConnection con = dataRep.getConnection(); + + try { + con.begin(); + RDFFormat rdfFormat = Rio.getParserFormatForFileName(graphURI.toString()).orElse(RDFFormat.TURTLE); + RDFParser rdfParser = Rio.createParser(rdfFormat, dataRep.getValueFactory()); + rdfParser.setVerifyData(false); + rdfParser.setDatatypeHandling(DatatypeHandling.IGNORE); + // rdfParser.setPreserveBNodeIDs(true); + + RDFInserter rdfInserter = new RDFInserter(con); + rdfInserter.enforceContext(context); + rdfParser.setRDFHandler(rdfInserter); + + URL graphURL = new URL(graphURI.toString()); + InputStream in = graphURL.openStream(); + try { + rdfParser.parse(in, graphURI.toString()); + } finally { + in.close(); + } + + con.commit(); + } catch (Exception e) { + if (con.isActive()) { + con.rollback(); + } + throw e; + } finally { + con.close(); + } + } + + private final String readQueryString() throws IOException { + try (InputStream stream = new URL(queryFileURL).openStream()) { + return IOUtil.readString(new InputStreamReader(stream, StandardCharsets.UTF_8)); + } + } + + private final TupleQueryResult readExpectedTupleQueryResult() throws Exception { + Optional tqrFormat = QueryResultIO.getParserFormatForFileName(resultFileURL); + + if (tqrFormat.isPresent()) { + InputStream in = new URL(resultFileURL).openStream(); + try { + TupleQueryResultParser parser = QueryResultIO.createTupleParser(tqrFormat.get()); + parser.setValueFactory(dataRep.getValueFactory()); + + TupleQueryResultBuilder qrBuilder = new TupleQueryResultBuilder(); + parser.setQueryResultHandler(qrBuilder); + + parser.parseQueryResult(in); + return qrBuilder.getQueryResult(); + } finally { + in.close(); + } + } else { + Set resultGraph = readExpectedGraphQueryResult(); + return DAWGTestResultSetUtil.toTupleQueryResult(resultGraph); + } + } + + private final boolean readExpectedBooleanQueryResult() throws Exception { + Optional bqrFormat = BooleanQueryResultParserRegistry.getInstance() + .getFileFormatForFileName(resultFileURL); + + if (bqrFormat.isPresent()) { + InputStream in = new URL(resultFileURL).openStream(); + try { + return QueryResultIO.parseBoolean(in, bqrFormat.get()); + } finally { + in.close(); + } + } else { + Set resultGraph = readExpectedGraphQueryResult(); + return DAWGTestResultSetUtil.toBooleanQueryResult(resultGraph); + } + } + + private final Set readExpectedGraphQueryResult() throws Exception { + RDFFormat rdfFormat = Rio.getParserFormatForFileName(resultFileURL) + .orElseThrow(Rio.unsupportedFormat(resultFileURL)); + + RDFParser parser = Rio.createParser(rdfFormat); + parser.setDatatypeHandling(DatatypeHandling.IGNORE); + parser.setPreserveBNodeIDs(true); + parser.setValueFactory(dataRep.getValueFactory()); + + Set result = new LinkedHashSet<>(); + parser.setRDFHandler(new StatementCollector(result)); + + InputStream in = new URL(resultFileURL).openStream(); + try { + parser.parse(in, resultFileURL); + } finally { + in.close(); + } + + return result; + } + + private final void compareGraphs(Set queryResult, Set expectedResult) throws Exception { + if (!Models.isomorphic(expectedResult, queryResult)) { + StringBuilder message = new StringBuilder(128); + message.append("\n============ "); + message.append(name); + message.append(" =======================\n"); + message.append("Expected result: \n"); + for (Statement st : expectedResult) { + message.append(st.toString()); + message.append("\n"); + } + message.append("============="); + StringUtil.appendN('=', name.length(), message); + message.append("========================\n"); + + message.append("Query result: \n"); + for (Statement st : queryResult) { + message.append(st.toString()); + message.append("\n"); + } + message.append("============="); + StringUtil.appendN('=', name.length(), message); + message.append("========================\n"); + + logger.error(message.toString()); + fail(message.toString()); + } + } + + private final void compareTupleQueryResults(TupleQueryResult queryResult, TupleQueryResult expectedResult) + throws Exception { + // Create MutableTupleQueryResult to be able to re-iterate over the + // results + MutableTupleQueryResult queryResultTable = new MutableTupleQueryResult(queryResult); + MutableTupleQueryResult expectedResultTable = new MutableTupleQueryResult(expectedResult); + + boolean resultsEqual; + boolean laxCardinality = false; // TODO determine if we still need this + if (laxCardinality) { + resultsEqual = QueryResults.isSubset(queryResultTable, expectedResultTable); + } else { + resultsEqual = QueryResults.equals(queryResultTable, expectedResultTable); + + if (ordered) { + // also check the order in which solutions occur. + queryResultTable.beforeFirst(); + expectedResultTable.beforeFirst(); + + while (queryResultTable.hasNext()) { + BindingSet bs = queryResultTable.next(); + BindingSet expectedBs = expectedResultTable.next(); + + if (!bs.equals(expectedBs)) { + resultsEqual = false; + break; + } + } + } + } + + if (!resultsEqual) { + queryResultTable.beforeFirst(); + expectedResultTable.beforeFirst(); + + /* + * StringBuilder message = new StringBuilder(128); message.append("\n============ "); + * message.append(getName()); message.append(" =======================\n"); message.append( + * "Expected result: \n"); while (expectedResultTable.hasNext()) { + * message.append(expectedResultTable.next()); message.append("\n"); } message.append("============="); + * StringUtil.appendN('=', getName().length(), message); message.append("========================\n"); + * message.append("Query result: \n"); while (queryResultTable.hasNext()) { + * message.append(queryResultTable.next()); message.append("\n"); } message.append("============="); + * StringUtil.appendN('=', getName().length(), message); message.append("========================\n"); + */ + + List queryBindings = Iterations.asList(queryResultTable); + + List expectedBindings = Iterations.asList(expectedResultTable); + + List missingBindings = new ArrayList<>(expectedBindings); + missingBindings.removeAll(queryBindings); + + List unexpectedBindings = new ArrayList<>(queryBindings); + unexpectedBindings.removeAll(expectedBindings); + + StringBuilder message = new StringBuilder(128); + message.append("\n============ "); + message.append(name); + message.append(" =======================\n"); + + if (!missingBindings.isEmpty()) { + + message.append("Missing bindings: \n"); + for (BindingSet bs : missingBindings) { + printBindingSet(bs, message); + } + + message.append("============="); + StringUtil.appendN('=', name.length(), message); + message.append("========================\n"); + } + + if (!unexpectedBindings.isEmpty()) { + message.append("Unexpected bindings: \n"); + for (BindingSet bs : unexpectedBindings) { + printBindingSet(bs, message); + } + + message.append("============="); + StringUtil.appendN('=', name.length(), message); + message.append("========================\n"); + } + + if (ordered && missingBindings.isEmpty() && unexpectedBindings.isEmpty()) { + message.append("Results are not in expected order.\n"); + message.append(" =======================\n"); + message.append("query result: \n"); + for (BindingSet bs : queryBindings) { + printBindingSet(bs, message); + } + message.append(" =======================\n"); + message.append("expected result: \n"); + for (BindingSet bs : expectedBindings) { + printBindingSet(bs, message); + } + message.append(" =======================\n"); + + System.out.print(message.toString()); + } else if (missingBindings.isEmpty() && unexpectedBindings.isEmpty()) { + message.append("unexpected duplicate in result.\n"); + message.append(" =======================\n"); + message.append("query result: \n"); + for (BindingSet bs : queryBindings) { + printBindingSet(bs, message); + } + message.append(" =======================\n"); + message.append("expected result: \n"); + for (BindingSet bs : expectedBindings) { + printBindingSet(bs, message); + } + message.append(" =======================\n"); + + System.out.print(message.toString()); + } + + logger.error(message.toString()); + fail(message.toString()); + } + } + + private final void printBindingSet(BindingSet bs, StringBuilder appendable) { + List names = new ArrayList<>(bs.getBindingNames()); + Collections.sort(names); + + for (String name : names) { + if (bs.hasBinding(name)) { + appendable.append(bs.getBinding(name)); + appendable.append(' '); + } + } + appendable.append("\n"); + } + + /** + * Verifies if the selected subManifest occurs in the supplied list of excluded subdirs. + * + * @param subManifestFile the url of a sub-manifest + * @param excludedSubdirs an array of directory names. May be null. + * @return false if the supplied list of excluded subdirs is not empty and contains a match for the + * supplied sub-manifest, true otherwise. + */ + private static boolean includeSubManifest(String subManifestFile, String[] excludedSubdirs) { + boolean result = true; + + if (excludedSubdirs != null && excludedSubdirs.length > 0) { + int index = subManifestFile.lastIndexOf('/'); + String path = subManifestFile.substring(0, index); + String sd = path.substring(path.lastIndexOf('/') + 1); + + for (String subdir : excludedSubdirs) { + if (sd.equals(subdir)) { + result = false; + break; + } + } + } + return result; + } + + /** + * @return the ignoredTests + */ + protected List getIgnoredTests() { + return ignoredTests; + } + + protected void addIgnoredTest(String ignoredTest) { + this.ignoredTests.add(ignoredTest); + } + + /** + * @param ignoredTests the ignoredTests to set + */ + protected void setIgnoredTests(List ignoredTests) { + this.ignoredTests = ignoredTests; + } +} diff --git a/testsuites/sparql/src/main/java/org/eclipse/rdf4j/query/parser/sparql/manifest/SPARQL11SyntaxTest.java b/testsuites/sparql/src/main/java/org/eclipse/rdf4j/query/parser/sparql/manifest/SPARQL11SyntaxTest.java index 3a5613f9840..e36e44d1fa8 100644 --- a/testsuites/sparql/src/main/java/org/eclipse/rdf4j/query/parser/sparql/manifest/SPARQL11SyntaxTest.java +++ b/testsuites/sparql/src/main/java/org/eclipse/rdf4j/query/parser/sparql/manifest/SPARQL11SyntaxTest.java @@ -52,7 +52,7 @@ /** * A SPARQL 1.1 syntax test, created by reading in a W3C working-group style manifest. - * + * * @author Jeen Broekstra */ public abstract class SPARQL11SyntaxTest extends TestCase { diff --git a/testsuites/sparql/src/main/java/org/eclipse/rdf4j/query/parser/sparql/manifest/SPARQLQueryTest.java b/testsuites/sparql/src/main/java/org/eclipse/rdf4j/query/parser/sparql/manifest/SPARQLQueryTest.java index f0c9a1aecb9..e89c0d136df 100644 --- a/testsuites/sparql/src/main/java/org/eclipse/rdf4j/query/parser/sparql/manifest/SPARQLQueryTest.java +++ b/testsuites/sparql/src/main/java/org/eclipse/rdf4j/query/parser/sparql/manifest/SPARQLQueryTest.java @@ -69,7 +69,7 @@ /** * A SPARQL query test suite, created by reading in a W3C working-group style manifest. - * + * * @author Jeen Broekstra */ public abstract class SPARQLQueryTest extends TestCase { diff --git a/tools/config/pom.xml b/tools/config/pom.xml index 50af45fb421..0d1779a21cf 100644 --- a/tools/config/pom.xml +++ b/tools/config/pom.xml @@ -4,7 +4,7 @@ org.eclipse.rdf4j rdf4j-tools - 3.1.5-SNAPSHOT + 3.2.2-SNAPSHOT rdf4j-config RDF4J: application configuration diff --git a/tools/config/src/main/java/org/eclipse/rdf4j/RDF4J.java b/tools/config/src/main/java/org/eclipse/rdf4j/RDF4J.java index 70d74bb9af7..9b230c44b13 100644 --- a/tools/config/src/main/java/org/eclipse/rdf4j/RDF4J.java +++ b/tools/config/src/main/java/org/eclipse/rdf4j/RDF4J.java @@ -18,7 +18,7 @@ public class RDF4J { /** * Get version number string - * + * * @return version as string */ public final static String getVersion() { @@ -27,7 +27,7 @@ public final static String getVersion() { /** * Load version string from java package - * + * * @return version string */ private static String loadVersion() { diff --git a/tools/config/src/main/java/org/eclipse/rdf4j/common/app/AppConfiguration.java b/tools/config/src/main/java/org/eclipse/rdf4j/common/app/AppConfiguration.java index 314ad613bbd..f43200487b4 100644 --- a/tools/config/src/main/java/org/eclipse/rdf4j/common/app/AppConfiguration.java +++ b/tools/config/src/main/java/org/eclipse/rdf4j/common/app/AppConfiguration.java @@ -63,7 +63,7 @@ public AppConfiguration() { /** * Create the application configuration. - * + * * @param applicationId the ID of the application */ public AppConfiguration(final String applicationId) { @@ -73,7 +73,7 @@ public AppConfiguration(final String applicationId) { /** * Create the application configuration. - * + * * @param applicationId the ID of the application * @param version the application's version */ @@ -84,7 +84,7 @@ public AppConfiguration(final String applicationId, final AppVersion version) { /** * Create the application configuration. - * + * * @param applicationId the ID of the application * @param longName the long name of the application */ @@ -95,7 +95,7 @@ public AppConfiguration(final String applicationId, final String longName) { /** * Create the application configuration. - * + * * @param applicationId the ID of the application * @param longName the long name of the application * @param version the application's version @@ -138,7 +138,7 @@ public void init() throws IOException { /** * Initialize configuration and proxy settings, optionally load (logback) logging - * + * * @param loadLogConfig load logging configuration * @throws IOException */ @@ -172,7 +172,7 @@ public void destroy() throws IOException { /** * Get the name of the application (e.g. "AutoFocus" or "Metadata Server"). - * + * * @return the name of the application */ public String getApplicationId() { @@ -181,7 +181,7 @@ public String getApplicationId() { /** * Set the application ID string - * + * * @param applicationId string */ public final void setApplicationId(final String applicationId) { @@ -190,7 +190,7 @@ public final void setApplicationId(final String applicationId) { /** * Set the name of the data directory - * + * * @param dataDirName */ public void setDataDirName(final String dataDirName) { @@ -199,7 +199,7 @@ public void setDataDirName(final String dataDirName) { /** * Get the long name of the application (e.g. "Aduna AutoFocus" or "OpenRDF Sesame Server"). - * + * * @return the long name of the application */ public String getLongName() { @@ -208,7 +208,7 @@ public String getLongName() { /** * Set the long name of the application. - * + * * @param longName the new name */ public final void setLongName(final String longName) { @@ -218,7 +218,7 @@ public final void setLongName(final String longName) { /** * Get the full name of the application, which consists of the long name and the version number (e.g. "Aduna * AutoFocus 4.0-beta1" or "OpenRDF Sesame Webclient 2.0") - * + * * @return the full name of the application */ public String getFullName() { @@ -237,7 +237,7 @@ private void setFullName() { /** * Get the version of the application. - * + * * @return the version of the application */ public AppVersion getVersion() { @@ -249,7 +249,7 @@ public AppVersion getVersion() { /** * Set the version of the application. - * + * * @param version the new version */ public final void setVersion(final AppVersion version) { @@ -259,7 +259,7 @@ public final void setVersion(final AppVersion version) { /** * Get the command line arguments of the application. - * + * * @return A String array, as (typically) specified to the main method. */ public String[] getCommandLineArgs() { @@ -268,7 +268,7 @@ public String[] getCommandLineArgs() { /** * Set the command line arguments specified to the application. - * + * * @param args A String array containing the arguments as specified to the main method. */ public void setCommandLineArgs(final String[] args) { @@ -277,7 +277,7 @@ public void setCommandLineArgs(final String[] args) { /** * Get the data directory as File - * + * * @return data directory */ public File getDataDir() { @@ -286,7 +286,7 @@ public File getDataDir() { /** * Get logging configuration - * + * * @return log configuration */ public LogConfiguration getLogConfiguration() { @@ -295,7 +295,7 @@ public LogConfiguration getLogConfiguration() { /** * Get proxy settings - * + * * @return proxy settings */ public ProxySettings getProxySettings() { @@ -304,7 +304,7 @@ public ProxySettings getProxySettings() { /** * Set proxy settings - * + * * @param proxySettings proxy settings */ public void setProxySettings(final ProxySettings proxySettings) { @@ -331,7 +331,7 @@ private void configureDataDir() { /** * Load and instantiate the logging configuration. - * + * * @return the logging configuration * @throws ClassNotFoundException * @throws IllegalAccessException @@ -353,7 +353,7 @@ private LogConfiguration loadLogConfiguration() /** * Get the properties - * + * * @return Returns the properties. */ public Properties getProperties() { diff --git a/tools/config/src/main/java/org/eclipse/rdf4j/common/app/AppVersion.java b/tools/config/src/main/java/org/eclipse/rdf4j/common/app/AppVersion.java index 3b8d5d3f328..fce93e276be 100644 --- a/tools/config/src/main/java/org/eclipse/rdf4j/common/app/AppVersion.java +++ b/tools/config/src/main/java/org/eclipse/rdf4j/common/app/AppVersion.java @@ -62,7 +62,7 @@ public AppVersion() { /** * Creates a new major.minor version number, e.g.1.0. - * + * * @param major major number * @param minor minor number */ @@ -72,7 +72,7 @@ public AppVersion(int major, int minor) { /** * Creates a new major.minor.patch version number, e.g.1.0.1. - * + * * @param major major number * @param minor minor number * @param patch patch number @@ -83,7 +83,7 @@ public AppVersion(int major, int minor, int patch) { /** * Creates a new major.minor-modifier version number, e.g.1.0-beta1. - * + * * @param major major number * @param minor minor number * @param modifier additional string @@ -94,7 +94,7 @@ public AppVersion(int major, int minor, String modifier) { /** * Creates a new major.minor.patch-modifier version number, e.g.1.0.1-SNAPSHOT. - * + * * @param major major number * @param minor minor number * @param patch patch number @@ -106,7 +106,7 @@ public AppVersion(int major, int minor, int patch, String modifier) { /** * Creates a new major.minor.patchMmilestone-modifier version number, e.g.1.0.1M1-SNAPSHOT. - * + * * @param major major number * @param minor minor number * @param patch patch number @@ -119,7 +119,7 @@ public AppVersion(int major, int minor, int patch, int milestone, String modifie /** * Creates a new version number - * + * * @param major major number * @param minor minor number * @param patch patch number @@ -138,7 +138,7 @@ public AppVersion(int major, int minor, int patch, int milestone, String modifie /** * Gets the version's major version number. - * + * * @return major number */ public int getMajor() { @@ -147,7 +147,7 @@ public int getMajor() { /** * Set major number - * + * * @param major major number */ public void setMajor(int major) { @@ -156,7 +156,7 @@ public void setMajor(int major) { /** * Gets the version's minor version number. - * + * * @return minor number */ public int getMinor() { @@ -165,7 +165,7 @@ public int getMinor() { /** * Set minor number - * + * * @param minor minor number */ public void setMinor(int minor) { @@ -174,7 +174,7 @@ public void setMinor(int minor) { /** * Gets the version's micro version / patch level number. - * + * * @return patch level number */ public int getPatch() { @@ -183,7 +183,7 @@ public int getPatch() { /** * Sets the version's micro version / patch level number. - * + * * @param micro patch level number */ public void setPatch(int micro) { @@ -192,7 +192,7 @@ public void setPatch(int micro) { /** * Set the milestone number - * + * * @param milestone milestone number */ public void setMilestone(int milestone) { @@ -201,7 +201,7 @@ public void setMilestone(int milestone) { /** * Get the milestone number - * + * * @return milestone number */ public int getMilestone() { @@ -210,7 +210,7 @@ public int getMilestone() { /** * Gets the version's release modifier part. - * + * * @return modifier string */ public String getModifier() { @@ -219,7 +219,7 @@ public String getModifier() { /** * Set the version's release modifier part. - * + * * @param modifier modifier string */ public void setModifier(String modifier) { @@ -228,7 +228,7 @@ public void setModifier(String modifier) { /** * Check if two versions are exactly equal, modifier is case insensitive. - * + * * @param other second object * @return true if equal */ @@ -271,7 +271,7 @@ public int hashCode() { /** * Checks if this version is older than the specified version, according to the result of * {@link #compareTo(AppVersion)}. - * + * * @param other other version * @return true if this version is older than other */ @@ -282,7 +282,7 @@ public boolean olderThan(AppVersion other) { /** * Checks if this version is newer than the specified version, according to the result of * {@link #compareTo(AppVersion)}. - * + * * @param other other version * @return true if this version is newer than other */ @@ -295,7 +295,7 @@ public boolean newerThan(AppVersion other) { * oldest to newest version. If all version numbers are equal, then their modifiers are compared lexicographically * (based on the Unicode value of each character), ignoring case. Versions without a modifier or milestone are * considered to be the "final" versions and come after other versions with a modifier or milestone. - * + * * @param other * @return 0 if both versions are equal, a negative number if this version is older than other, or * a positive number otherwise. @@ -341,7 +341,7 @@ public int compareTo(AppVersion other) { /** * Parses a version string into a Version object. - * + * * @param versionString A version string, e.g. 1.0.1 or 1.0-beta1. * @return The parsed Version. * @exception NumberFormatException If versionString could not be parsed to a version. diff --git a/tools/config/src/main/java/org/eclipse/rdf4j/common/app/config/Configuration.java b/tools/config/src/main/java/org/eclipse/rdf4j/common/app/config/Configuration.java index 7fd239c498f..5456c666974 100644 --- a/tools/config/src/main/java/org/eclipse/rdf4j/common/app/config/Configuration.java +++ b/tools/config/src/main/java/org/eclipse/rdf4j/common/app/config/Configuration.java @@ -20,7 +20,7 @@ public interface Configuration { /** * Initialize the configuration settings. - * + * * @throws IOException if the configuration settings could not be initialized because of an I/O problem. */ public void init() throws IOException; @@ -29,21 +29,21 @@ public interface Configuration { * Load the configuration settings. Settings will be loaded from a user and application specific location first. If * no such settings exists, an attempt will be made to retrieve settings from a resource on the classpath. If no * such settings exist either, settings will be loaded from a default resource on the classpath. - * + * * @throws IOException if the configuration settings could not be loaded due to an I/O problem. */ public void load() throws IOException; /** * Store configuration settings. Settings will be stored in a user and application specific location. - * + * * @throws IOException if the configuration settings could not be saved due to an I/O problem. */ public void save() throws IOException; /** * Clean up configuration resources. - * + * * @throws IOException if one or more resources could not be cleaned up. Implementations should attempt to clean up * as many resources as possible before returning or throwing an exception. */ diff --git a/tools/config/src/main/java/org/eclipse/rdf4j/common/app/logging/LogConfiguration.java b/tools/config/src/main/java/org/eclipse/rdf4j/common/app/logging/LogConfiguration.java index b52cba4c843..b3ccbdb4b1f 100644 --- a/tools/config/src/main/java/org/eclipse/rdf4j/common/app/logging/LogConfiguration.java +++ b/tools/config/src/main/java/org/eclipse/rdf4j/common/app/logging/LogConfiguration.java @@ -16,7 +16,7 @@ /** * Configuration settings for application logging. - * + * * @author Herko ter Horst */ public interface LogConfiguration extends Configuration { @@ -40,28 +40,28 @@ public interface LogConfiguration extends Configuration { /** * The base location on the file system for logging configuration and data - * + * * @return the base location on the file system for logging configuration and data */ public abstract File getBaseDir(); /** * The location on the file system where logging configuration is stored. - * + * * @return the location on the file system where logging configuration is stored */ public abstract File getConfDir(); /** * The location on the file system where logging data is stored. - * + * * @return the location on the file system where logging data is stored */ public abstract File getLoggingDir(); /** * A reader that can read logging information as stored by the specific logger's appender. - * + * * @param appender Name of the appender to which the LogReader is attached * @return a reader that can read logging information as stored by the logger configured through this * LogConfiguration @@ -70,35 +70,35 @@ public interface LogConfiguration extends Configuration { /** * Default (fallback) LogReader instance. - * + * * @return default (fallback) LogReader instance. */ public abstract LogReader getDefaultLogReader(); /** * Is debug logging enabled? - * + * * @return true if debug logging is enabled, false otherwise */ public abstract boolean isDebugLoggingEnabled(); /** * Enable or disable debug logging. - * + * * @param enabled set to true if debug logging should be enabled, set to false otherwise */ public abstract void setDebugLoggingEnabled(boolean enabled); /** * Set application configuration - * + * * @param config application configuration */ public abstract void setAppConfiguration(AppConfiguration config); /** * Get application configuration - * + * * @return application configuration */ public abstract AppConfiguration getAppConfiguration(); diff --git a/tools/config/src/main/java/org/eclipse/rdf4j/common/app/logging/base/AbstractLogConfiguration.java b/tools/config/src/main/java/org/eclipse/rdf4j/common/app/logging/base/AbstractLogConfiguration.java index 19bd2c2ec63..3adbd2cc42d 100644 --- a/tools/config/src/main/java/org/eclipse/rdf4j/common/app/logging/base/AbstractLogConfiguration.java +++ b/tools/config/src/main/java/org/eclipse/rdf4j/common/app/logging/base/AbstractLogConfiguration.java @@ -22,7 +22,7 @@ /** * Base implementation of LogConfiguration. - * + * * @author Herko ter Horst */ public abstract class AbstractLogConfiguration implements LogConfiguration { @@ -43,7 +43,7 @@ public abstract class AbstractLogConfiguration implements LogConfiguration { /** * Constructor - * + * * @throws IOException */ protected AbstractLogConfiguration() throws IOException { @@ -79,7 +79,7 @@ public File getLoggingDir() { /** * Initialize logging, setting log levels and handlers. - * + * * @throws IOException */ private void initBase() throws IOException { @@ -123,7 +123,7 @@ public void setDebugLoggingEnabled(boolean debugLoggingEnabled) { /** * Get packages as a set - * + * * @return packages as set of string */ protected Set getPackages() { diff --git a/tools/config/src/main/java/org/eclipse/rdf4j/common/app/logging/base/LogConfigurationBase.java b/tools/config/src/main/java/org/eclipse/rdf4j/common/app/logging/base/LogConfigurationBase.java index 4b7e17a4ce5..7f0168ee9bd 100644 --- a/tools/config/src/main/java/org/eclipse/rdf4j/common/app/logging/base/LogConfigurationBase.java +++ b/tools/config/src/main/java/org/eclipse/rdf4j/common/app/logging/base/LogConfigurationBase.java @@ -18,7 +18,7 @@ public abstract class LogConfigurationBase extends AbstractLogConfiguration { /** * Constructor - * + * * @throws IOException */ protected LogConfigurationBase() throws IOException { diff --git a/tools/config/src/main/java/org/eclipse/rdf4j/common/app/logging/base/LogConverterHandler.java b/tools/config/src/main/java/org/eclipse/rdf4j/common/app/logging/base/LogConverterHandler.java index 7b621a22132..6b373fff394 100644 --- a/tools/config/src/main/java/org/eclipse/rdf4j/common/app/logging/base/LogConverterHandler.java +++ b/tools/config/src/main/java/org/eclipse/rdf4j/common/app/logging/base/LogConverterHandler.java @@ -16,7 +16,7 @@ /** * Handler to convert java.util.logging events to SLF4J logging events. - * + * * @author Herko ter Horst */ public class LogConverterHandler extends Handler { diff --git a/tools/config/src/main/java/org/eclipse/rdf4j/common/app/logging/logback/LogConfigurator.java b/tools/config/src/main/java/org/eclipse/rdf4j/common/app/logging/logback/LogConfigurator.java index f2563665d21..16b93a8bbbf 100644 --- a/tools/config/src/main/java/org/eclipse/rdf4j/common/app/logging/logback/LogConfigurator.java +++ b/tools/config/src/main/java/org/eclipse/rdf4j/common/app/logging/logback/LogConfigurator.java @@ -33,7 +33,7 @@ public class LogConfigurator extends JoranConfigurator { /** * Get default log reader - * + * * @return log reader */ public LogReader getDefaultLogReader() { @@ -46,7 +46,7 @@ public LogReader getDefaultLogReader() { } /** - * + * * @param appenderName * @return log reader */ diff --git a/tools/config/src/main/java/org/eclipse/rdf4j/common/app/net/ProxySettings.java b/tools/config/src/main/java/org/eclipse/rdf4j/common/app/net/ProxySettings.java index 08ba946d422..c883eb0b61a 100644 --- a/tools/config/src/main/java/org/eclipse/rdf4j/common/app/net/ProxySettings.java +++ b/tools/config/src/main/java/org/eclipse/rdf4j/common/app/net/ProxySettings.java @@ -104,7 +104,7 @@ public void setHttpProxyHost(String httpProxyHost) { /** * Get HTTP proxy port as string - * + * * @return proxy port */ public String getHttpProxyPort() { @@ -113,7 +113,7 @@ public String getHttpProxyPort() { /** * Set HTTP proxy port - * + * * @param httpProxyPort proxy port */ public void setHttpProxyPort(String httpProxyPort) { @@ -123,7 +123,7 @@ public void setHttpProxyPort(String httpProxyPort) { /** * Get HTTPS proxy host - * + * * @return proxy host as string */ public String getHttpsProxyHost() { @@ -132,7 +132,7 @@ public String getHttpsProxyHost() { /** * Get HTTPS proxy host - * + * * @param httpsProxyHost */ public void setHttpsProxyHost(String httpsProxyHost) { diff --git a/tools/config/src/main/java/org/eclipse/rdf4j/common/logging/LogReader.java b/tools/config/src/main/java/org/eclipse/rdf4j/common/logging/LogReader.java index 02b0564cc57..271488ae2a3 100644 --- a/tools/config/src/main/java/org/eclipse/rdf4j/common/logging/LogReader.java +++ b/tools/config/src/main/java/org/eclipse/rdf4j/common/logging/LogReader.java @@ -20,119 +20,119 @@ public interface LogReader extends Iterator { /** * Initialize the log reader. - * + * * @throws Exception */ public void init() throws Exception; /** * Destroy the log reader and release all used resources. - * + * * @throws Exception */ public void destroy() throws Exception; /** * Logging appender associated with this reader. - * + * * @param appender logging appender associated with this reader */ public void setAppender(Appender appender); /** * Logging appender associated with this reader. - * + * * @return logging appender associated with this reader. */ public Appender getAppender(); /** * Max. number of records returned by this log reader. Zero value (default) indicates no limit. - * + * * @param limit max. number of records returned by this log reader. */ public void setLimit(int limit); /** * Max. number of records returned by this log reader. - * + * * @return max. number of records returned by this log reader or zero value if no limit has been set. */ public int getLimit(); /** * Check if more records are available after limit is reached. - * + * * @return true if more records are available */ public boolean isMoreAvailable(); /** * Index of the first record returned by this log reader. - * + * * @param offset index of the first record returned by this log reader. */ public void setOffset(int offset); /** * Index of the first record returned by this log reader. - * + * * @return index of the first record returned by this log reader. */ public int getOffset(); /** * Test if this LogReader implementation supports level-based records filtering. - * + * * @return true if level filtering is supported. */ public boolean supportsLevelFilter(); /** * Level of the log records returned by this log reader. - * + * * @param level log level */ public void setLevel(LogLevel level); /** * Level of the log records returned by this log reader. - * + * * @return Level of the log records returned by this log reader or 'null' if no level filter has been set. */ public LogLevel getLevel(); /** * Test if this LogReader implementation supports thread-based records filtering. - * + * * @return true if thread filtering is supported. */ public boolean supportsThreadFilter(); /** * Thread name of the log records returned by this log reader. - * + * * @param threadname thread name */ public void setThread(String threadname); /** * Thread name of the log records returned by this log reader. - * + * * @return thread name of the log records returned by this log reader or 'null' if no thread filter has been set. */ public String getThread(); /** * All available thread names of the log records. - * + * * @return a List of thread names of the log records. */ public List getThreadNames(); /** * Test if this LogReader implementation supports date-based records filtering. - * + * * @return true if date filtering is supported */ public boolean supportsDateRanges(); @@ -144,35 +144,35 @@ public interface LogReader extends Iterator { /** * Start (earliest) date of the log records returned by this log reader. - * + * * @return Start date of the log records or 'null' if no start date has been set */ public Date getStartDate(); /** * End (latest) date of of the log records returned by this log reader. - * + * * @param date end date */ public void setEndDate(Date date); /** * End (latest) date of of the log records returned by this log reader. - * + * * @return End date of the log records or 'null' if no end date has been set */ public Date getEndDate(); /** * Min (earliest) available date of the log records. - * + * * @return minimum date */ public Date getMinDate(); /** * Max (latest) available date of the log records. - * + * * @return maximum date */ public Date getMaxDate(); diff --git a/tools/config/src/main/java/org/eclipse/rdf4j/common/logging/LogRecord.java b/tools/config/src/main/java/org/eclipse/rdf4j/common/logging/LogRecord.java index 7dc8f976c6e..1b92db9bcbe 100644 --- a/tools/config/src/main/java/org/eclipse/rdf4j/common/logging/LogRecord.java +++ b/tools/config/src/main/java/org/eclipse/rdf4j/common/logging/LogRecord.java @@ -20,35 +20,35 @@ public interface LogRecord { /** * Get log level - * + * * @return log level enumeration */ public LogLevel getLevel(); /** * Get date time - * + * * @return date */ public Date getTime(); /** * Get thread name - * + * * @return thread name */ public String getThreadName(); /** * Get message - * + * * @return text */ public String getMessage(); /** * Get stack trace as list of strings - * + * * @return list of strings */ public List getStackTrace(); diff --git a/tools/config/src/main/java/org/eclipse/rdf4j/common/logging/base/AbstractLogReader.java b/tools/config/src/main/java/org/eclipse/rdf4j/common/logging/base/AbstractLogReader.java index f75abb9e67f..9093ef6ce11 100644 --- a/tools/config/src/main/java/org/eclipse/rdf4j/common/logging/base/AbstractLogReader.java +++ b/tools/config/src/main/java/org/eclipse/rdf4j/common/logging/base/AbstractLogReader.java @@ -115,7 +115,7 @@ public boolean supportsThreadFilter() { /** * Get the limit. - * + * * @return limit */ @Override @@ -125,7 +125,7 @@ public int getLimit() { /** * Set the limit - * + * * @param limit The limit to set. */ @Override @@ -135,7 +135,7 @@ public void setLimit(int limit) { /** * Get the offset - * + * * @return offset. */ @Override @@ -145,7 +145,7 @@ public int getOffset() { /** * Set the offset - * + * * @param offset The offset to set. */ @Override diff --git a/tools/config/src/main/java/org/eclipse/rdf4j/common/logging/base/SimpleLogRecord.java b/tools/config/src/main/java/org/eclipse/rdf4j/common/logging/base/SimpleLogRecord.java index 1a5fd3cc23b..96aa5743703 100644 --- a/tools/config/src/main/java/org/eclipse/rdf4j/common/logging/base/SimpleLogRecord.java +++ b/tools/config/src/main/java/org/eclipse/rdf4j/common/logging/base/SimpleLogRecord.java @@ -52,7 +52,7 @@ public Date getTime() { /** * Set log level - * + * * @param level */ public void setLevel(LogLevel level) { @@ -61,7 +61,7 @@ public void setLevel(LogLevel level) { /** * Set message - * + * * @param message text */ public void setMessage(String message) { @@ -70,7 +70,7 @@ public void setMessage(String message) { /** * Set stack trace as list of strings - * + * * @param stackTrace list of strings */ public void setStackTrace(List stackTrace) { @@ -79,7 +79,7 @@ public void setStackTrace(List stackTrace) { /** * Set thread name - * + * * @param threadName */ public void setThreadName(String threadName) { @@ -88,7 +88,7 @@ public void setThreadName(String threadName) { /** * Set date time - * + * * @param time time */ public void setTime(Date time) { diff --git a/tools/config/src/main/java/org/eclipse/rdf4j/common/logging/file/logback/FileLogReader.java b/tools/config/src/main/java/org/eclipse/rdf4j/common/logging/file/logback/FileLogReader.java index 4593beadda4..eebf8e80ada 100644 --- a/tools/config/src/main/java/org/eclipse/rdf4j/common/logging/file/logback/FileLogReader.java +++ b/tools/config/src/main/java/org/eclipse/rdf4j/common/logging/file/logback/FileLogReader.java @@ -48,7 +48,7 @@ public FileLogReader() { /** * Constructor - * + * * @param logFile */ public FileLogReader(File logFile) { @@ -86,7 +86,7 @@ public void init() throws Exception { /** * Skip for a specific offset - * + * * @param offset offset */ private void doSkip(int offset) { diff --git a/tools/config/src/main/java/org/eclipse/rdf4j/common/logging/file/logback/MultipleFileLogReader.java b/tools/config/src/main/java/org/eclipse/rdf4j/common/logging/file/logback/MultipleFileLogReader.java index 46d3c0513ed..41aa47abd82 100644 --- a/tools/config/src/main/java/org/eclipse/rdf4j/common/logging/file/logback/MultipleFileLogReader.java +++ b/tools/config/src/main/java/org/eclipse/rdf4j/common/logging/file/logback/MultipleFileLogReader.java @@ -31,7 +31,7 @@ /** * Date range-enabled wrapper for FileLogReader. Reads multiple log files chunked by dates as a single log. - * + * * @author alex */ public class MultipleFileLogReader extends AbstractLogReader implements LogReader { @@ -114,8 +114,9 @@ public void init() throws Exception { currentReader = new FileLogReader(logFilesIterator.next()); currentReader.init(); next = getNext(); - if (getOffset() > 0) + if (getOffset() > 0) { doSkip(getOffset()); + } } } @@ -153,7 +154,7 @@ public LogRecord next() { /** * Get next log record - * + * * @return log record * @throws Exception */ @@ -171,7 +172,7 @@ private LogRecord getNext() throws Exception { /** * Skip for a specific offset - * + * * @param offset offset */ private void doSkip(int offset) { @@ -189,7 +190,7 @@ public void destroy() throws IOException { /** * Return the start date - * + * * @return start date. */ @Override @@ -199,7 +200,7 @@ public Date getStartDate() { /** * Set start date - * + * * @param startDate The startDate to set. */ @Override @@ -209,7 +210,7 @@ public void setStartDate(Date startDate) { /** * Return the end date - * + * * @return end date */ @Override @@ -219,7 +220,7 @@ public Date getEndDate() { /** * Set the end date - * + * * @param endDate The endDate to set. */ @Override @@ -239,7 +240,7 @@ public Date getMinDate() { /** * Custom filename filter - * + * * @author alex */ public class DateRangeFilenameFilter implements FilenameFilter { @@ -252,7 +253,7 @@ public class DateRangeFilenameFilter implements FilenameFilter { /** * Constructor - * + * * @param pattern * @param df * @param startCal diff --git a/tools/config/src/main/java/org/eclipse/rdf4j/common/logging/file/logback/StackTracePatternLayout.java b/tools/config/src/main/java/org/eclipse/rdf4j/common/logging/file/logback/StackTracePatternLayout.java index 55a8cfede90..8fd38a6e35a 100644 --- a/tools/config/src/main/java/org/eclipse/rdf4j/common/logging/file/logback/StackTracePatternLayout.java +++ b/tools/config/src/main/java/org/eclipse/rdf4j/common/logging/file/logback/StackTracePatternLayout.java @@ -14,7 +14,7 @@ /** * PatternLayout that also prints stack traces. - * + * * @author Herko ter Horst */ public class StackTracePatternLayout extends PatternLayout { @@ -33,7 +33,7 @@ public StackTracePatternLayout() { /** * Construct a StacktracePatternLayout with the specified conversion pattern. - * + * * @param conversionPattern the conversion pattern to use * @see Information on * Log4J conversion patterns. diff --git a/tools/config/src/main/java/org/eclipse/rdf4j/common/platform/AbstractPlatform.java b/tools/config/src/main/java/org/eclipse/rdf4j/common/platform/AbstractPlatform.java index 2a4f5b66370..3955d975b9c 100644 --- a/tools/config/src/main/java/org/eclipse/rdf4j/common/platform/AbstractPlatform.java +++ b/tools/config/src/main/java/org/eclipse/rdf4j/common/platform/AbstractPlatform.java @@ -73,7 +73,7 @@ public String getRelativeApplicationDataDir(String applicationName) { /** * Get the relative name of the application directory - * + * * @param applicationName name of the application * @param caseSensitive true when case-sensitive * @param replaceWhitespace true when whitespace is to be replaced diff --git a/tools/config/src/main/java/org/eclipse/rdf4j/common/platform/Platform.java b/tools/config/src/main/java/org/eclipse/rdf4j/common/platform/Platform.java index c4147161ebd..40c20cacef2 100644 --- a/tools/config/src/main/java/org/eclipse/rdf4j/common/platform/Platform.java +++ b/tools/config/src/main/java/org/eclipse/rdf4j/common/platform/Platform.java @@ -23,14 +23,14 @@ public interface Platform { /** * Get a descriptive name for this platform. - * + * * @return name of the platform */ public String getName(); /** * Returns the operating system dependent application data directory. - * + * * @return application directory */ public File getOSApplicationDataDir(); @@ -38,7 +38,7 @@ public interface Platform { /** * Returns the operating system dependent application data directory. This will be a sub-directory of the directory * returned by the no-argument version of this method. - * + * * @param applicationName name of the application * @return application directory */ @@ -46,7 +46,7 @@ public interface Platform { /** * Returns the directory for the current user. - * + * * @return the current user home directory */ public File getUserHome(); @@ -54,7 +54,7 @@ public interface Platform { /** * Returns the directory in which Aduna applications can store their application-dependent data, returns * 'getOSApplicationDataDir' unless the system property "aduna.platform.applicationdata.dir" has been set. - * + * * @return the Aduna-specific application data directory */ public File getApplicationDataDir(); @@ -63,7 +63,7 @@ public interface Platform { * Returns the directory in which a specific application can store all its application-dependent data. This will be * a sub-directory of the directory returned by the no-argument version of this method. Note: the directory might * not exist yet. - * + * * @see #getApplicationDataDir() * @param applicationName the name of the application for which to determine the directory * @return an application-specific data directory @@ -72,7 +72,7 @@ public interface Platform { /** * Get the directory relative to getApplicationDataDir() for the specified application. - * + * * @param applicationName the name of the application * @return the directory relative to getApplicationDataDir() for the specified application */ @@ -80,21 +80,21 @@ public interface Platform { /** * Check if case is preserved - * + * * @return boolean */ public boolean dataDirPreserveCase(); /** * Check if whitespace is replaced - * + * * @return boolean */ public boolean dataDirReplaceWhitespace(); /** * Check if colon is replaced - * + * * @return boolean */ public boolean dataDirReplaceColon(); diff --git a/tools/config/src/main/java/org/eclipse/rdf4j/common/platform/PlatformFactory.java b/tools/config/src/main/java/org/eclipse/rdf4j/common/platform/PlatformFactory.java index 272cc822350..37543b74542 100644 --- a/tools/config/src/main/java/org/eclipse/rdf4j/common/platform/PlatformFactory.java +++ b/tools/config/src/main/java/org/eclipse/rdf4j/common/platform/PlatformFactory.java @@ -25,7 +25,7 @@ public class PlatformFactory { /** * Returns the Platform instance corresponding with the current platform. - * + * * @return factory */ public static PlatformFactory getInstance() { @@ -111,7 +111,7 @@ private Platform createPlatform() { /** * Detect gnome environments. - * + * * @return true when Gnome session */ private boolean isGnome() { @@ -138,7 +138,7 @@ private boolean isGnome() { /** * Detect KDE environments. - * + * * @return true when KDE */ private boolean isKDE() { @@ -165,7 +165,7 @@ private boolean isKDE() { /** * Get system environment variable - * + * * @param propertyName * @return system environment variable */ @@ -180,7 +180,7 @@ private String getSystemEnv(String propertyName) { /** * Main - * + * * @param args arguments */ public static void main(String[] args) { diff --git a/tools/config/src/main/java/org/eclipse/rdf4j/common/platform/ProcessLauncher.java b/tools/config/src/main/java/org/eclipse/rdf4j/common/platform/ProcessLauncher.java index 0f43fa43127..a1798b3bd6d 100644 --- a/tools/config/src/main/java/org/eclipse/rdf4j/common/platform/ProcessLauncher.java +++ b/tools/config/src/main/java/org/eclipse/rdf4j/common/platform/ProcessLauncher.java @@ -43,7 +43,7 @@ public final class ProcessLauncher { /** * Constructs a new ProcessLauncher with the given command line. - * + * * @param commandLine command line */ public ProcessLauncher(String commandLine) { @@ -52,7 +52,7 @@ public ProcessLauncher(String commandLine) { /** * Constructs a new ProcessLauncher with the given command line and base directory - * + * * @param commandLine command line * @param baseDir base directory */ @@ -63,7 +63,7 @@ public ProcessLauncher(String commandLine, File baseDir) { /** * Constructs a new ProcessLauncher with the given command array. - * + * * @param commandArray command as array of strings */ public ProcessLauncher(String[] commandArray) { @@ -72,7 +72,7 @@ public ProcessLauncher(String[] commandArray) { /** * Constructs a new ProcessLauncher with the given command array and base directory. - * + * * @param commandArray command as array of strings * @param baseDir base directory */ @@ -83,7 +83,7 @@ public ProcessLauncher(String[] commandArray, File baseDir) { /** * Constructs new process launcher with the given command element list. - * + * * @param commandList command list */ public ProcessLauncher(ArrayList commandList) { @@ -92,7 +92,7 @@ public ProcessLauncher(ArrayList commandList) { /** * Constructs new process launcher with the given command element list and base directory. - * + * * @param commandList command list * @param baseDir base directory */ @@ -102,7 +102,7 @@ public ProcessLauncher(ArrayList commandList, File baseDir) { /** * Turn a list of objects into an array of strings - * + * * @param * @param list list of objects * @return array of strings @@ -124,14 +124,14 @@ public interface OutputListener { /** * Send to standard output - * + * * @param output text to output */ public void standardOutput(char[] output); /** * Send to standard error - * + * * @param output test to output */ public void errorOutput(char[] output); @@ -139,7 +139,7 @@ public interface OutputListener { /** * Add a listener for output from the to-be-launched process. - * + * * @param listener output listener */ public void addOutputListener(OutputListener listener) { @@ -148,7 +148,7 @@ public void addOutputListener(OutputListener listener) { /** * Fire error output event - * + * * @param err */ private void fireErr(char[] err) { @@ -163,7 +163,7 @@ private void fireErr(char[] err) { /** * Fire standard output event - * + * * @param out */ private void fireOut(char[] out) { @@ -178,7 +178,7 @@ private void fireOut(char[] out) { /** * Get standard output, in case no listeners were registered - never returns null. - * + * * @return standard output as string */ public String getStandardOutput() { @@ -191,7 +191,7 @@ public String getStandardOutput() { /** * Get error output, in case no listeners were registered - never returns null. - * + * * @return standard error as string */ public String getErrorOutput() { @@ -203,7 +203,7 @@ public String getErrorOutput() { /** * Get the commandline that is used to launch the process. - * + * * @return command line */ public String getCommandLine() { @@ -225,7 +225,7 @@ public String getCommandLine() { /** * Check whether execution has finished. - * + * * @return true when finished */ public boolean hasFinished() { @@ -316,7 +316,7 @@ private class BackgroundPrinter extends Thread implements Closeable { /** * Constructor - * + * * @param in inputstream * @param isErrorOutput true if standard error */ diff --git a/tools/config/src/main/java/org/eclipse/rdf4j/common/platform/support/WindowsPlatform.java b/tools/config/src/main/java/org/eclipse/rdf4j/common/platform/support/WindowsPlatform.java index ea044412ee0..07a277068ca 100644 --- a/tools/config/src/main/java/org/eclipse/rdf4j/common/platform/support/WindowsPlatform.java +++ b/tools/config/src/main/java/org/eclipse/rdf4j/common/platform/support/WindowsPlatform.java @@ -78,7 +78,7 @@ public File getUserHome() { /** * Returns an application data directory in the "Application Data" user directory of Windows. - * + * * @return directory */ @Override @@ -99,7 +99,7 @@ public File getOSApplicationDataDir() { /** * Warns when the platform is not a Windows 9x, NT or 2000 platform. - * + * * @return true when not Win9x/NT/2000 */ @Deprecated @@ -109,7 +109,7 @@ public boolean warnsWhenOpeningExecutable() { /** * Check whether this is windows 9x, or windows NT and higher. - * + * * @return true when Win9x or higher */ @Deprecated @@ -131,7 +131,7 @@ public boolean isWin9x() { /** * Check whether this is an Windows NT environment. - * + * * @return true when WinNT */ @Deprecated @@ -141,7 +141,7 @@ public boolean isWinNT() { /** * Check whether this is an Windows 2000 environment. - * + * * @return true when Win2000 */ @Deprecated @@ -151,7 +151,7 @@ public boolean isWin2000() { /** * Check whether this is an Windows XP environment. - * + * * @return true wen WinXP */ @Deprecated @@ -161,7 +161,7 @@ public boolean isWinXP() { /** * Check whether this is an Windows 2003 environment. - * + * * @return true when Win2003 */ @Deprecated @@ -171,7 +171,7 @@ public boolean isWin2003() { /** * Check whether this is an Windows Vista environment. - * + * * @return true when Vista */ @Deprecated @@ -181,7 +181,7 @@ public boolean isWinVista() { /** * Returns appropriate command shell for the current windows shell. - * + * * @return name of the command shell */ public String getCommandShell() { diff --git a/tools/console/pom.xml b/tools/console/pom.xml index 2d76b5eeb8a..5cc84252fe0 100644 --- a/tools/console/pom.xml +++ b/tools/console/pom.xml @@ -4,7 +4,7 @@ org.eclipse.rdf4j rdf4j-tools - 3.1.5-SNAPSHOT + 3.2.2-SNAPSHOT rdf4j-console RDF4J: Console diff --git a/tools/console/src/main/java/org/eclipse/rdf4j/console/Command.java b/tools/console/src/main/java/org/eclipse/rdf4j/console/Command.java index 93b91e72606..510d4148dea 100644 --- a/tools/console/src/main/java/org/eclipse/rdf4j/console/Command.java +++ b/tools/console/src/main/java/org/eclipse/rdf4j/console/Command.java @@ -25,7 +25,7 @@ public interface Command { /** * Return the names of the settings used. - * + * * @return string array of settings */ String[] usesSettings(); diff --git a/tools/console/src/main/java/org/eclipse/rdf4j/console/Console.java b/tools/console/src/main/java/org/eclipse/rdf4j/console/Console.java index 10734825b7d..9ffa69dfd25 100644 --- a/tools/console/src/main/java/org/eclipse/rdf4j/console/Console.java +++ b/tools/console/src/main/java/org/eclipse/rdf4j/console/Console.java @@ -85,7 +85,7 @@ public class Console { /** * Get console state - * + * * @return basic console state */ public ConsoleState getState() { @@ -94,7 +94,7 @@ public ConsoleState getState() { /** * Get console IO - * + * * @return console */ public ConsoleIO getConsoleIO() { @@ -103,7 +103,7 @@ public ConsoleIO getConsoleIO() { /** * Set exit on error mode - * + * * @param mode true when error should exit */ protected void setExitOnError(boolean mode) { @@ -112,7 +112,7 @@ protected void setExitOnError(boolean mode) { /** * Main - * + * * @param args command line arguments * @throws IOException */ @@ -144,7 +144,7 @@ public static void main(final String[] args) throws IOException { /** * Connect to (and open) a repository, exit when connection fails - * + * * @param console * @param selectedLocation s for server, d for local directory * @param location @@ -169,7 +169,7 @@ private static void connectAndOpen(Console console, String selectedLocation, Str /** * Add command to register of known commands - * + * * @param cmd command to be added */ public final void register(ConsoleCommand cmd) { @@ -178,7 +178,7 @@ public final void register(ConsoleCommand cmd) { /** * Add setting to register of known settings - * + * * @param setting setting to be added */ public final void register(ConsoleSetting setting) { @@ -187,7 +187,7 @@ public final void register(ConsoleSetting setting) { /** * Constructor - * + * * @throws IOException */ public Console() throws IOException { @@ -312,7 +312,7 @@ private void saveHistory() { /** * Start the interactive console, return error code on exit - * + * * @throws IOException */ public void start() throws IOException { @@ -356,7 +356,7 @@ public void start() throws IOException { /** * Execute a command - * + * * @param command * @return true when exit/quit command is entered * @throws IOException @@ -384,7 +384,7 @@ private boolean executeCommand(String command) throws IOException { /** * Split a command into an array of tokens - * + * * @param command command to parse * @return array of strings */ diff --git a/tools/console/src/main/java/org/eclipse/rdf4j/console/ConsoleIO.java b/tools/console/src/main/java/org/eclipse/rdf4j/console/ConsoleIO.java index fb0a571ca46..6a7df558434 100644 --- a/tools/console/src/main/java/org/eclipse/rdf4j/console/ConsoleIO.java +++ b/tools/console/src/main/java/org/eclipse/rdf4j/console/ConsoleIO.java @@ -40,7 +40,7 @@ public class ConsoleIO { /** * Constructor - * + * * @param input * @param out * @param info @@ -54,7 +54,7 @@ public ConsoleIO(InputStream input, OutputStream out, ConsoleState info) throws /** * Constructor - * + * * @param info * @throws IOException */ @@ -66,7 +66,7 @@ public ConsoleIO(ConsoleState info) throws IOException { /** * Build JLine line reader with default history - * + * * @return line reader */ private LineReader buildLineReader() { @@ -81,7 +81,7 @@ private LineReader buildLineReader() { /** * Get the JLine line reader - * + * * @return line reader */ public LineReader getLineReader() { @@ -90,7 +90,7 @@ public LineReader getLineReader() { /** * Get JLine terminal output stream - * + * * @return output stream */ public OutputStream getOutputStream() { @@ -99,7 +99,7 @@ public OutputStream getOutputStream() { /** * Read a command from input - * + * * @return one line of input, or null on error * @throws IOException */ @@ -121,9 +121,9 @@ protected String readCommand() throws IOException { /** * Get command prompt. - * + * * Contains the name of the current repository when connected. - * + * * @return command prompt string */ private String getPrompt() { @@ -139,7 +139,7 @@ private String getPrompt() { /** * Reads multiple lines from the input until a line that with a '.' on its own is read. - * + * * @return input string * @throws IOException */ @@ -149,7 +149,7 @@ public String readMultiLineInput() throws IOException { /** * Reads multiple lines from the input until a line that with a '.' on its own is read. - * + * * @param prompt * @return input string * @throws IOException @@ -179,7 +179,7 @@ public String readMultiLineInput(String prompt) throws IOException { /** * Read message from input - * + * * @param message one or multiple messages * @return input string * @throws IOException @@ -196,7 +196,7 @@ public String readln(String... message) throws IOException { /** * Read password from input - * + * * @param prompt prompt to display * @return password string * @throws IOException @@ -211,7 +211,7 @@ public String readPassword(final String prompt) throws IOException { /** * Write a string - * + * * @param string string to write */ public void write(final String string) { @@ -227,7 +227,7 @@ public void writeln() { /** * Write a string, followed by a newline - * + * * @param string string to write */ public void writeln(final String string) { @@ -236,7 +236,7 @@ public void writeln(final String string) { /** * Write an error message - * + * * @param errMsg error message */ public void writeError(final String errMsg) { @@ -253,7 +253,7 @@ public void writeUnopenedError() { /** * Write parser error - * + * * @param prefix * @param lineNo line number * @param colNo column number @@ -273,7 +273,7 @@ public void writeParseError(String prefix, long lineNo, long colNo, String msg) /** * Ask if the user wants to continue - * + * * @param msg confirmation question * @param defaultValue true when default is yes * @return true when continue @@ -303,7 +303,7 @@ public boolean askProceed(String msg, boolean defaultValue) throws IOException { /** * Whether to echo user input to output stream - * + * * @param echo true to echo input */ protected void setEcho(boolean echo) { @@ -312,7 +312,7 @@ protected void setEcho(boolean echo) { /** * Whether to suppress printing of prompts to output - * + * * @param quiet true to suppress printing */ public void setQuiet(boolean quiet) { @@ -335,7 +335,7 @@ public void setCautious() { /** * Check if an error was written to the console - * + * * @return true when error was written */ public boolean wasErrorWritten() { diff --git a/tools/console/src/main/java/org/eclipse/rdf4j/console/ConsoleState.java b/tools/console/src/main/java/org/eclipse/rdf4j/console/ConsoleState.java index 630afa738b6..15a652d7b72 100644 --- a/tools/console/src/main/java/org/eclipse/rdf4j/console/ConsoleState.java +++ b/tools/console/src/main/java/org/eclipse/rdf4j/console/ConsoleState.java @@ -14,77 +14,77 @@ /** * Console state interface - * + * * @author Dale Visser */ public interface ConsoleState { /** * Get application name - * + * * @return application name */ public String getApplicationName(); /** * Get repository data directory - * + * * @return directory */ public File getDataDirectory(); /** * Get repository manager ID - * + * * @return repository manager ID */ public String getManagerID(); /** * Get repository ID - * + * * @return repository ID */ public String getRepositoryID(); /** * Get repository manager - * + * * @return repository manager */ public RepositoryManager getManager(); /** * Set repository manager - * + * * @param manager repository manager */ public void setManager(RepositoryManager manager); /** * Set repository manager - * + * * @param managerID repository manager ID */ public void setManagerID(String managerID); /** * Get repository - * + * * @return repository */ public Repository getRepository(); /** * Set repository ID - * + * * @param repositoryID repository ID */ public void setRepositoryID(String repositoryID); /** * Set repository - * + * * @param repository repository */ public void setRepository(Repository repository); diff --git a/tools/console/src/main/java/org/eclipse/rdf4j/console/DefaultConsoleState.java b/tools/console/src/main/java/org/eclipse/rdf4j/console/DefaultConsoleState.java index 75dc9332105..be63eb6c454 100644 --- a/tools/console/src/main/java/org/eclipse/rdf4j/console/DefaultConsoleState.java +++ b/tools/console/src/main/java/org/eclipse/rdf4j/console/DefaultConsoleState.java @@ -15,7 +15,7 @@ /** * Console state helper class - * + * * @author Bart Hanssens */ class DefaultConsoleState implements ConsoleState { @@ -79,7 +79,7 @@ public void setRepository(Repository repository) { /** * Constructor - * + * * @param cfg */ DefaultConsoleState(AppConfiguration cfg) { diff --git a/tools/console/src/main/java/org/eclipse/rdf4j/console/Help.java b/tools/console/src/main/java/org/eclipse/rdf4j/console/Help.java index f9db4af391b..b0ff7841996 100644 --- a/tools/console/src/main/java/org/eclipse/rdf4j/console/Help.java +++ b/tools/console/src/main/java/org/eclipse/rdf4j/console/Help.java @@ -9,27 +9,27 @@ /** * Help interface - * + * * @author Bart Hanssens */ public interface Help { /** * Get the name of the command - * + * * @return string */ public String getName(); /** * Get short description, small enough to fit on one console row - * + * * @return string */ public String getHelpShort(); /** * Get long description - * + * * @return string, can be multiple lines */ public String getHelpLong(); diff --git a/tools/console/src/main/java/org/eclipse/rdf4j/console/LockRemover.java b/tools/console/src/main/java/org/eclipse/rdf4j/console/LockRemover.java index 7604f8f9536..79ff1d54240 100644 --- a/tools/console/src/main/java/org/eclipse/rdf4j/console/LockRemover.java +++ b/tools/console/src/main/java/org/eclipse/rdf4j/console/LockRemover.java @@ -22,7 +22,7 @@ public class LockRemover { /** * Try to remove lock from repository - * + * * @param repo * @param consoleIO * @return true if lock was removed @@ -45,7 +45,7 @@ public static boolean tryToRemoveLock(Repository repo, ConsoleIO consoleIO) /** * Try to remove lock when exception was raised - * + * * @param rle * @param consoleIO * @return true if lock was removed diff --git a/tools/console/src/main/java/org/eclipse/rdf4j/console/Setting.java b/tools/console/src/main/java/org/eclipse/rdf4j/console/Setting.java index f1c4b33238e..57460fa086e 100644 --- a/tools/console/src/main/java/org/eclipse/rdf4j/console/Setting.java +++ b/tools/console/src/main/java/org/eclipse/rdf4j/console/Setting.java @@ -9,7 +9,7 @@ /** * Setting interface - * + * * @author Bart Hanssens * @param */ @@ -17,28 +17,28 @@ public interface Setting { /** * Get the parameter type - * + * * @return class type */ public Class getType(); /** * Get the initial value - * + * * @return T */ public T getInitValue(); /** * Get the current value for this setting - * + * * @return value */ public T get(); /** * Set the value for this setting - * + * * @param value */ public void set(T value) throws IllegalArgumentException; diff --git a/tools/console/src/main/java/org/eclipse/rdf4j/console/Util.java b/tools/console/src/main/java/org/eclipse/rdf4j/console/Util.java index a956ccb6109..99fdb02be91 100644 --- a/tools/console/src/main/java/org/eclipse/rdf4j/console/Util.java +++ b/tools/console/src/main/java/org/eclipse/rdf4j/console/Util.java @@ -17,19 +17,20 @@ import org.eclipse.rdf4j.model.IRI; import org.eclipse.rdf4j.model.Literal; import org.eclipse.rdf4j.model.Resource; +import org.eclipse.rdf4j.model.Triple; import org.eclipse.rdf4j.model.Value; import org.eclipse.rdf4j.repository.Repository; -import org.eclipse.rdf4j.rio.ntriples.NTriplesUtil; +import org.eclipse.rdf4j.rio.helpers.NTriplesUtil; /** * Helper class - * + * * @author Bart Hanssens */ public class Util { /** * Get context IRI from string representation - * + * * @param repository repository * @param ctxID context as string * @return context IRI @@ -46,7 +47,7 @@ public static Resource getContext(Repository repository, String ctxID) { /** * Get context IRIs from a series of tokens, starting from (zero-based) position within the series. - * + * * @param tokens command as series of tokens * @param pos position to start from * @param repository repository @@ -68,7 +69,7 @@ public static Resource[] getContexts(String[] tokens, int pos, Repository reposi /** * Get path from file or URI - * + * * @param file file name * @return path or null */ @@ -89,7 +90,7 @@ public static Path getPath(String file) { /** * Check if a string looks like a HTTP, HTTPS or file URI. - * + * * @param str string * @return true if */ @@ -100,7 +101,7 @@ public static boolean isHttpOrFile(String str) { /** * Get path from file string if it's absolute, or from working directory if the file is relative. - * + * * @param workDir working dir * @param file file name * @return path normalized path @@ -116,7 +117,7 @@ public static Path getNormalizedPath(Path workDir, String file) { /** * Get string representation for a value. If the value is an IRI and is part of a known namespace, the prefix will * be used to shorten it. - * + * * @param value value * @param namespaces mapping (uri,prefix) * @return string representation @@ -143,13 +144,18 @@ public static String getPrefixedValue(Value value, Map namespace return "\"" + lit.getLabel() + "\"^^" + prefix + ":" + uri.getLocalName(); } } + if (value instanceof Triple) { + return "<<" + getPrefixedValue(((Triple) value).getSubject(), namespaces) + " " + + getPrefixedValue(((Triple) value).getPredicate(), namespaces) + " " + + getPrefixedValue(((Triple) value).getObject(), namespaces) + ">>"; + } return NTriplesUtil.toNTriplesString(value); } /** * Format a string of values, starting new line(s) when the joined values exceed the width. Primarily used for * displaying formatted help (e.g namespaces, config files) to the console. To be replaced by a commons text method - * + * * @param width maximum column width * @param padding left padding * @param str joined string diff --git a/tools/console/src/main/java/org/eclipse/rdf4j/console/VerificationListener.java b/tools/console/src/main/java/org/eclipse/rdf4j/console/VerificationListener.java index d8a6f04b94d..bbc9e779c58 100644 --- a/tools/console/src/main/java/org/eclipse/rdf4j/console/VerificationListener.java +++ b/tools/console/src/main/java/org/eclipse/rdf4j/console/VerificationListener.java @@ -14,7 +14,7 @@ /** * Listen to parser errors and warnings - * + * * @author Dale Visser */ public class VerificationListener extends AbstractRDFHandler implements ParseErrorListener { @@ -23,7 +23,7 @@ public class VerificationListener extends AbstractRDFHandler implements ParseErr /** * Constructor - * + * * @param consoleIO */ public VerificationListener(ConsoleIO consoleIO) { @@ -37,7 +37,7 @@ public VerificationListener(ConsoleIO consoleIO) { /** * Get number of warnings - * + * * @return number of warnings */ public int getWarnings() { @@ -46,7 +46,7 @@ public int getWarnings() { /** * Get number of errors - * + * * @return number of errors */ public int getErrors() { @@ -55,7 +55,7 @@ public int getErrors() { /** * Get number of statements - * + * * @return number of statements */ public int getStatements() { diff --git a/tools/console/src/main/java/org/eclipse/rdf4j/console/command/Clear.java b/tools/console/src/main/java/org/eclipse/rdf4j/console/command/Clear.java index 2d222681c72..b56125bbaae 100644 --- a/tools/console/src/main/java/org/eclipse/rdf4j/console/command/Clear.java +++ b/tools/console/src/main/java/org/eclipse/rdf4j/console/command/Clear.java @@ -21,7 +21,7 @@ /** * Clear command. - * + * * @author Dale Visser */ public class Clear extends ConsoleCommand { @@ -43,10 +43,10 @@ public String getHelpLong() { /** * Constructor - * + * * @param consoleIO * @param state - * + * */ public Clear(ConsoleIO consoleIO, ConsoleState state) { super(consoleIO, state); @@ -72,7 +72,7 @@ public void execute(String... tokens) { /** * Clear repository, either completely or only triples of specific contexts. - * + * * @param repository repository to be cleared * @param contexts array of contexts */ diff --git a/tools/console/src/main/java/org/eclipse/rdf4j/console/command/Close.java b/tools/console/src/main/java/org/eclipse/rdf4j/console/command/Close.java index 1884cbcb79b..7e1516f674f 100644 --- a/tools/console/src/main/java/org/eclipse/rdf4j/console/command/Close.java +++ b/tools/console/src/main/java/org/eclipse/rdf4j/console/command/Close.java @@ -13,7 +13,7 @@ /** * Close command - * + * * @author Dale Visser */ public class Close extends ConsoleCommand { @@ -35,7 +35,7 @@ public String getHelpLong() { /** * Constructor - * + * * @param consoleIO * @param state */ @@ -54,7 +54,7 @@ public void execute(String... tokens) { /** * Close repository - * + * * @param verbose print more information */ protected void closeRepository(final boolean verbose) { diff --git a/tools/console/src/main/java/org/eclipse/rdf4j/console/command/Connect.java b/tools/console/src/main/java/org/eclipse/rdf4j/console/command/Connect.java index 1532af1a44a..7e3db80cfeb 100644 --- a/tools/console/src/main/java/org/eclipse/rdf4j/console/command/Connect.java +++ b/tools/console/src/main/java/org/eclipse/rdf4j/console/command/Connect.java @@ -52,7 +52,7 @@ public String getHelpLong() { /** * Constructor - * + * * @param consoleIO * @param state * @param disconnect @@ -88,7 +88,7 @@ public void execute(String... tokens) { /** * Connect to default repository - * + * * @return true if connected */ public boolean connectDefault() { @@ -97,7 +97,7 @@ public boolean connectDefault() { /** * Connect to remote repository - * + * * @param url URL of remote repository * @param user username * @param passwd password @@ -147,7 +147,7 @@ private boolean connectRemote(final String url, final String user, final String /** * Connect to local repository - * + * * @param path directory of the local repository * @return true on success */ @@ -164,7 +164,7 @@ public boolean connectLocal(final String path) { /** * Install and initialize new repository manager - * + * * @param newManager repository manager * @param newManagerID repository manager ID * @return true on success @@ -195,7 +195,7 @@ private boolean installNewManager(final RepositoryManager newManager, final Stri /** * Connect to remote repository without username of password - * + * * @param url URL of the repository * @return true on success */ diff --git a/tools/console/src/main/java/org/eclipse/rdf4j/console/command/ConsoleCommand.java b/tools/console/src/main/java/org/eclipse/rdf4j/console/command/ConsoleCommand.java index a729bcd55f3..16742c861a6 100644 --- a/tools/console/src/main/java/org/eclipse/rdf4j/console/command/ConsoleCommand.java +++ b/tools/console/src/main/java/org/eclipse/rdf4j/console/command/ConsoleCommand.java @@ -20,7 +20,7 @@ /** * Abstract command - * + * * @author Bart Hanssens */ public abstract class ConsoleCommand implements Command, Help { @@ -33,7 +33,7 @@ public abstract class ConsoleCommand implements Command, Help { /** * Get console IO - * + * * @return console IO */ public ConsoleIO getConsoleIO() { @@ -42,7 +42,7 @@ public ConsoleIO getConsoleIO() { /** * Get console state - * + * * @return console state */ public ConsoleState getConsoleState() { @@ -51,7 +51,7 @@ public ConsoleState getConsoleState() { /** * Get console settings map - * + * * @return map of console settings */ public Map getConsoleSettings() { @@ -60,7 +60,7 @@ public Map getConsoleSettings() { /** * Get short description, small enough to fit on one console row - * + * * @return help string */ @Override @@ -70,7 +70,7 @@ public String getHelpShort() { /** * Get long description - * + * * @return string, can be multiple lines */ @Override @@ -85,7 +85,7 @@ public String[] usesSettings() { /** * Constructor - * + * * @param consoleIO */ public ConsoleCommand(ConsoleIO consoleIO) { @@ -96,7 +96,7 @@ public ConsoleCommand(ConsoleIO consoleIO) { /** * Constructor - * + * * @param consoleIO * @param state */ @@ -108,7 +108,7 @@ public ConsoleCommand(ConsoleIO consoleIO, ConsoleState state) { /** * Constructor - * + * * @param consoleIO console IO * @param state console state * @param settings console settings @@ -126,7 +126,7 @@ public void execute(String... parameters) throws IOException { /** * Write a string to the console - * + * * @param str text */ protected void write(String str) { @@ -135,7 +135,7 @@ protected void write(String str) { /** * Write a string + newline to the console - * + * * @param str text */ protected void writeln(String str) { @@ -144,7 +144,7 @@ protected void writeln(String str) { /** * Write a string + newline to the console and to the log at level INFO - * + * * @param str text */ protected void writeInfo(String str) { @@ -154,7 +154,7 @@ protected void writeInfo(String str) { /** * Write a string + newline to the console and to the log as an error - * + * * @param str text */ protected void writeError(String str) { @@ -164,7 +164,7 @@ protected void writeError(String str) { /** * Write a string + message of exception + newline to the console and to the log as an error - * + * * @param str text * @param e exception */ @@ -182,7 +182,7 @@ protected void writeUnopenedError() { /** * Ask user to proceed - * + * * @param str question to ask * @param defVal default value * @return true diff --git a/tools/console/src/main/java/org/eclipse/rdf4j/console/command/Convert.java b/tools/console/src/main/java/org/eclipse/rdf4j/console/command/Convert.java index 437bb5689ff..ba38d411314 100644 --- a/tools/console/src/main/java/org/eclipse/rdf4j/console/command/Convert.java +++ b/tools/console/src/main/java/org/eclipse/rdf4j/console/command/Convert.java @@ -29,7 +29,7 @@ /** * Convert RDF file from one format to another - * + * * @author Bart Hanssens */ public class Convert extends ConsoleCommand { @@ -55,7 +55,7 @@ public String[] usesSettings() { /** * Constructor - * + * * @param consoleIO * @param state * @param settings @@ -76,7 +76,7 @@ public void execute(String... tokens) { /** * Get working dir setting. - * + * * @return path of working dir */ private Path getWorkDir() { @@ -85,7 +85,7 @@ private Path getWorkDir() { /** * Convert a file - * + * * @param fileFrom file name * @param fileTo file name */ diff --git a/tools/console/src/main/java/org/eclipse/rdf4j/console/command/Create.java b/tools/console/src/main/java/org/eclipse/rdf4j/console/command/Create.java index 3e4b54be793..67a7dac8d49 100644 --- a/tools/console/src/main/java/org/eclipse/rdf4j/console/command/Create.java +++ b/tools/console/src/main/java/org/eclipse/rdf4j/console/command/Create.java @@ -192,7 +192,7 @@ private void createRepository(final String templateName) throws IOException { rdfParser.parse(new StringReader(configString), RepositoryConfigSchema.NAMESPACE); final Resource repositoryNode = Models - .subject(graph.filter(null, RDF.TYPE, RepositoryConfigSchema.REPOSITORY)) + .subject(graph.getStatements(null, RDF.TYPE, RepositoryConfigSchema.REPOSITORY)) .orElseThrow(() -> new RepositoryConfigException("missing repository node")); final RepositoryConfig repConfig = RepositoryConfig.create(graph, repositoryNode); diff --git a/tools/console/src/main/java/org/eclipse/rdf4j/console/command/Disconnect.java b/tools/console/src/main/java/org/eclipse/rdf4j/console/command/Disconnect.java index f1858cea23a..0b9841b9893 100644 --- a/tools/console/src/main/java/org/eclipse/rdf4j/console/command/Disconnect.java +++ b/tools/console/src/main/java/org/eclipse/rdf4j/console/command/Disconnect.java @@ -15,7 +15,7 @@ /** * Disconnect command - * + * * @author Dale Visser */ public class Disconnect extends ConsoleCommand { @@ -38,7 +38,7 @@ public String getHelpLong() { /** * Constructor - * + * * @param consoleIO * @param state * @param close @@ -50,7 +50,7 @@ public Disconnect(ConsoleIO consoleIO, ConsoleState state, Close close) { /** * Execute the command - * + * * @param verbose */ public void execute(boolean verbose) { diff --git a/tools/console/src/main/java/org/eclipse/rdf4j/console/command/Drop.java b/tools/console/src/main/java/org/eclipse/rdf4j/console/command/Drop.java index 0893d8f0073..3a3199c896a 100644 --- a/tools/console/src/main/java/org/eclipse/rdf4j/console/command/Drop.java +++ b/tools/console/src/main/java/org/eclipse/rdf4j/console/command/Drop.java @@ -39,7 +39,7 @@ public String getHelpLong() { /** * Constructor - * + * * @param consoleIO * @param state * @param close @@ -77,7 +77,7 @@ public void execute(String... tokens) throws IOException { /** * Try to drop a repository after confirmation from user - * + * * @param repoID repository ID * @throws IOException * @throws RepositoryException diff --git a/tools/console/src/main/java/org/eclipse/rdf4j/console/command/Export.java b/tools/console/src/main/java/org/eclipse/rdf4j/console/command/Export.java index cf1ca1c3acb..b6cf9bce90a 100644 --- a/tools/console/src/main/java/org/eclipse/rdf4j/console/command/Export.java +++ b/tools/console/src/main/java/org/eclipse/rdf4j/console/command/Export.java @@ -30,7 +30,7 @@ /** * Export triples to file - * + * * @author Bart Hanssens */ public class Export extends ConsoleCommand { @@ -57,7 +57,7 @@ public String[] usesSettings() { /** * Constructor - * + * * @param consoleIO * @param state * @param settings @@ -93,7 +93,7 @@ public void execute(String... tokens) { /** * Get working dir setting. - * + * * @return path of working dir */ private Path getWorkDir() { @@ -102,7 +102,7 @@ private Path getWorkDir() { /** * Export to a file - * + * * @param repository repository to export * @param fileName file name * @param context context(s) (if any) diff --git a/tools/console/src/main/java/org/eclipse/rdf4j/console/command/Federate.java b/tools/console/src/main/java/org/eclipse/rdf4j/console/command/Federate.java index 5a4056f2653..e2471e0cae1 100644 --- a/tools/console/src/main/java/org/eclipse/rdf4j/console/command/Federate.java +++ b/tools/console/src/main/java/org/eclipse/rdf4j/console/command/Federate.java @@ -54,7 +54,7 @@ public String getHelpLong() { /** * Constructor - * + * * @param consoleIO * @param state */ @@ -89,7 +89,7 @@ public void execute(String... parameters) throws IOException { /** * Check if all values are distinct - * + * * @param plist * @return true if all values are distinct */ @@ -99,7 +99,7 @@ private boolean distinctValues(Deque plist) { /** * Add one or more repositories to a repository federation - * + * * @param distinct * @param readonly true when all * @param fedID @@ -128,7 +128,7 @@ private void federate(boolean distinct, boolean readonly, String fedID, Deque parameters, String name, boo /** * Get the value of an optional string parameter or the default - * + * * @param parameters set of parameters * @param name parameter name * @param defaultValue default string value diff --git a/tools/console/src/main/java/org/eclipse/rdf4j/console/command/Load.java b/tools/console/src/main/java/org/eclipse/rdf4j/console/command/Load.java index 696b0ed363f..fbe07c160d5 100644 --- a/tools/console/src/main/java/org/eclipse/rdf4j/console/command/Load.java +++ b/tools/console/src/main/java/org/eclipse/rdf4j/console/command/Load.java @@ -30,7 +30,7 @@ /** * Load command - * + * * @author Dale Visser */ public class Load extends ConsoleCommand { @@ -60,7 +60,7 @@ public String[] usesSettings() { /** * Constructor - * + * * @param consoleIO * @param state * @param settings @@ -101,7 +101,7 @@ public void execute(final String... tokens) { /** * Get working dir setting. - * + * * @return path of working dir */ private Path getWorkDir() { @@ -110,7 +110,7 @@ private Path getWorkDir() { /** * Load data into a repository - * + * * @param repository repository * @param baseURI * @param context @@ -155,7 +155,7 @@ private void load(Repository repository, String baseURI, String context, final S /** * Handle exceptions when loading data in a read-only repository. If a lock is present and can be removed, the * command will be executed again. - * + * * @param repository repository * @param caught exception * @param tokens full command as series of tokens @@ -177,7 +177,7 @@ private void handleReadOnlyException(Repository repository, RepositoryReadOnlyEx /** * Add data from a URL or local file. If the dataURL is null, then the datafile will be used. - * + * * @param repository repository * @param baseURI base URI * @param context context (can be null) @@ -206,7 +206,7 @@ private void addData(Repository repository, String baseURI, String context, URL /** * Get context as resource - * + * * @param repository * @param context * @return array of size one, or null diff --git a/tools/console/src/main/java/org/eclipse/rdf4j/console/command/Open.java b/tools/console/src/main/java/org/eclipse/rdf4j/console/command/Open.java index fc9d2f19bd0..eb5662e4039 100644 --- a/tools/console/src/main/java/org/eclipse/rdf4j/console/command/Open.java +++ b/tools/console/src/main/java/org/eclipse/rdf4j/console/command/Open.java @@ -19,7 +19,7 @@ /** * Open command - * + * * @author Dale Visser */ public class Open extends ConsoleCommand { @@ -42,7 +42,7 @@ public String getHelpLong() { /** * Constructor - * + * * @param consoleIO * @param state * @param close @@ -65,7 +65,7 @@ public void execute(String... tokens) { /** * Open a repository - * + * * @param repoID repository ID */ public void openRepository(final String repoID) { diff --git a/tools/console/src/main/java/org/eclipse/rdf4j/console/command/PrintHelp.java b/tools/console/src/main/java/org/eclipse/rdf4j/console/command/PrintHelp.java index 11b5588c5c2..c2401268cc3 100644 --- a/tools/console/src/main/java/org/eclipse/rdf4j/console/command/PrintHelp.java +++ b/tools/console/src/main/java/org/eclipse/rdf4j/console/command/PrintHelp.java @@ -15,7 +15,7 @@ /** * Prints available command and options to the console. - * + * * @author Dale Visser */ public class PrintHelp extends ConsoleCommand { @@ -40,7 +40,7 @@ public String getHelpLong() { /** * Constructor - * + * * @param consoleIO * @param commands */ diff --git a/tools/console/src/main/java/org/eclipse/rdf4j/console/command/PrintInfo.java b/tools/console/src/main/java/org/eclipse/rdf4j/console/command/PrintInfo.java index fbb1b1cd262..afbca64ff45 100644 --- a/tools/console/src/main/java/org/eclipse/rdf4j/console/command/PrintInfo.java +++ b/tools/console/src/main/java/org/eclipse/rdf4j/console/command/PrintInfo.java @@ -12,7 +12,7 @@ /** * Print command - * + * * @author Dale Visser */ public class PrintInfo extends ConsoleCommand { @@ -34,7 +34,7 @@ public String getHelpLong() { /** * Constructor - * + * * @param consoleIO * @param state */ diff --git a/tools/console/src/main/java/org/eclipse/rdf4j/console/command/QueryEvaluator.java b/tools/console/src/main/java/org/eclipse/rdf4j/console/command/QueryEvaluator.java index 6a0717d5271..bda095e39c2 100644 --- a/tools/console/src/main/java/org/eclipse/rdf4j/console/command/QueryEvaluator.java +++ b/tools/console/src/main/java/org/eclipse/rdf4j/console/command/QueryEvaluator.java @@ -16,6 +16,7 @@ import java.nio.file.StandardOpenOption; import java.util.Arrays; import java.util.Collection; +import java.util.Collections; import java.util.List; import java.util.Locale; import java.util.Optional; @@ -56,7 +57,7 @@ /** * Abstract query evaluator command - * + * * @author Dale Visser * @author Bart Hanssens */ @@ -75,7 +76,7 @@ public abstract class QueryEvaluator extends ConsoleCommand { /** * Constructor - * + * * @param evaluator */ public QueryEvaluator(TupleAndGraphQueryEvaluator evaluator) { @@ -85,7 +86,7 @@ public QueryEvaluator(TupleAndGraphQueryEvaluator evaluator) { /** * Check if query string already contains query prefixes - * + * * @param query query string * @return true if namespaces are already used */ @@ -93,7 +94,7 @@ public QueryEvaluator(TupleAndGraphQueryEvaluator evaluator) { /** * Add namespace prefixes to query - * + * * @param result * @param namespaces collection of known namespaces */ @@ -108,7 +109,7 @@ public String[] usesSettings() { /** * Get console width setting. - * + * * @return width in columns */ private int getConsoleWidth() { @@ -117,7 +118,7 @@ private int getConsoleWidth() { /** * Get query prefix setting. - * + * * @return true if prefixes are used for querying */ private boolean getQueryPrefix() { @@ -126,7 +127,7 @@ private boolean getQueryPrefix() { /** * Get show prefix setting. - * + * * @return true if prefixes are used for displaying. */ private boolean getShowPrefix() { @@ -135,7 +136,7 @@ private boolean getShowPrefix() { /** * Get a set of namespaces - * + * * @return set of namespace prefixes */ private Set getPrefixes() { @@ -144,7 +145,7 @@ private Set getPrefixes() { /** * Get working dir setting Use a working dir setting when not found. - * + * * @return path of working dir */ private Path getWorkDir() { @@ -153,7 +154,7 @@ private Path getWorkDir() { /** * Execute a SPARQL or SERQL query, defaults to SPARQL - * + * * @param command to execute * @param operation "sparql", "serql", "base" or SPARQL query form */ @@ -205,7 +206,7 @@ private String readFile(String filename, String cset) throws IllegalArgumentExce /** * Get absolute path to output file, using working directory for relative file name. Verifies that the file doesn't * exist or can be overwritten if it does exist. - * + * * @param filename file name * @return path absolute path * @throws IllegalArgumentException @@ -226,7 +227,7 @@ private Path getPathForOutput(String filename) throws IllegalArgumentException, /** * Read (possibly multi-line) query. Returns multi-line query as one string, or the original string if query is not * multi-line. - * + * * @param queryLn query language * @param queryText query string * @return query or null @@ -249,7 +250,7 @@ private String readMultiline(QueryLanguage queryLn, String queryText) { /** * Parse and evaluate a SERQL or SPARQL query. Check if query is multi-line or to be read from input file, and check * if results are to be written to an output file. - * + * * @param queryLn query language * @param queryText query string */ @@ -306,7 +307,7 @@ private void parseAndEvaluateQuery(QueryLanguage queryLn, String queryText) { /** * Get a query result writer based upon the file name (extension), or return the console result writer when path is * null. - * + * * @param path path or null * @param out output stream or null * @return result writer @@ -333,7 +334,7 @@ private QueryResultWriter getQueryResultWriter(Path path, OutputStream out) thro /** * Get a graph result (RIO) writer based upon the file name (extension), or return the console result writer when * path is null. - * + * * @param path path or null * @param out output stream or null * @return result writer @@ -350,15 +351,12 @@ private RDFWriter getRDFWriter(Path path, OutputStream out) throws IllegalArgume } w = Rio.createWriter(fmt.get(), out); } - if (getShowPrefix()) { - getPrefixes().stream().forEach(ns -> w.handleNamespace(ns.getPrefix(), ns.getName())); - } return w; } /** * Get output stream for a file, or for the console output if path is null - * + * * @param path file path or null * @return file or console output stream * @throws IOException @@ -371,7 +369,7 @@ private OutputStream getOutputStream(Path path) throws IOException { /** * Evaluate a SPARQL or SERQL query that has already been parsed - * + * * @param queryLn query language * @param query parsed query * @param path @@ -394,7 +392,8 @@ private void evaluateQuery(QueryLanguage queryLn, ParsedOperation query, Path pa evaluator.evaluateBooleanQuery(queryLn, queryString, writer); } else if (query instanceof ParsedGraphQuery) { RDFWriter writer = getRDFWriter(path, os); - evaluator.evaluateGraphQuery(queryLn, queryString, writer); + evaluator.evaluateGraphQuery(queryLn, queryString, writer, + getShowPrefix() ? getPrefixes() : Collections.emptySet()); } else if (query instanceof ParsedUpdate) { // no outputstream for updates, can only be console output if (path != null) { @@ -411,7 +410,7 @@ private void evaluateQuery(QueryLanguage queryLn, ParsedOperation query, Path pa /** * Add namespace prefixes to SPARQL or SERQL query - * + * * @param queryString query string * @return query string with prefixes */ diff --git a/tools/console/src/main/java/org/eclipse/rdf4j/console/command/Serql.java b/tools/console/src/main/java/org/eclipse/rdf4j/console/command/Serql.java index 6ac306b6999..f9f7a25c2c4 100644 --- a/tools/console/src/main/java/org/eclipse/rdf4j/console/command/Serql.java +++ b/tools/console/src/main/java/org/eclipse/rdf4j/console/command/Serql.java @@ -14,7 +14,7 @@ /** * SERQL query command - * + * * @author Bart Hanssens */ public class Serql extends QueryEvaluator { @@ -43,7 +43,7 @@ public String getHelpLong() { /** * Constructor - * + * * @param evaluator */ public Serql(TupleAndGraphQueryEvaluator evaluator) { @@ -65,4 +65,4 @@ protected void addQueryPrefixes(StringBuffer result, Collection names str.append("<").append(SeRQLUtil.encodeString(namespace.getName())).append(">, "); } } -} \ No newline at end of file +} diff --git a/tools/console/src/main/java/org/eclipse/rdf4j/console/command/SetParameters.java b/tools/console/src/main/java/org/eclipse/rdf4j/console/command/SetParameters.java index d905f224ee7..ad9338bc4e4 100644 --- a/tools/console/src/main/java/org/eclipse/rdf4j/console/command/SetParameters.java +++ b/tools/console/src/main/java/org/eclipse/rdf4j/console/command/SetParameters.java @@ -16,7 +16,7 @@ /** * Set parameters command - * + * * @author dale */ public class SetParameters extends ConsoleCommand { @@ -42,7 +42,7 @@ public String getHelpLong() { /** * Constructor - * + * * @param consoleIO * @param state * @param settings @@ -79,7 +79,7 @@ public void execute(String... tokens) { /** * Show parameter - * + * * @param key parameter key */ private void showSetting(String key) { @@ -104,7 +104,7 @@ private void showSetting(String key) { /** * Set parameter - * + * * @param key * @param value */ diff --git a/tools/console/src/main/java/org/eclipse/rdf4j/console/command/Sparql.java b/tools/console/src/main/java/org/eclipse/rdf4j/console/command/Sparql.java index 024502cb96e..b39a3c5fb81 100644 --- a/tools/console/src/main/java/org/eclipse/rdf4j/console/command/Sparql.java +++ b/tools/console/src/main/java/org/eclipse/rdf4j/console/command/Sparql.java @@ -14,7 +14,7 @@ /** * SPARQL query command - * + * * @author Bart Hanssens */ public class Sparql extends QueryEvaluator { @@ -46,7 +46,7 @@ public String getHelpLong() { /** * Constructor - * + * * @param evaluator */ public Sparql(TupleAndGraphQueryEvaluator evaluator) { diff --git a/tools/console/src/main/java/org/eclipse/rdf4j/console/command/TupleAndGraphQueryEvaluator.java b/tools/console/src/main/java/org/eclipse/rdf4j/console/command/TupleAndGraphQueryEvaluator.java index 729da806f6c..11004520da9 100644 --- a/tools/console/src/main/java/org/eclipse/rdf4j/console/command/TupleAndGraphQueryEvaluator.java +++ b/tools/console/src/main/java/org/eclipse/rdf4j/console/command/TupleAndGraphQueryEvaluator.java @@ -7,12 +7,14 @@ *******************************************************************************/ package org.eclipse.rdf4j.console.command; +import java.util.Collection; import java.util.List; import java.util.Map; import org.eclipse.rdf4j.console.ConsoleIO; import org.eclipse.rdf4j.console.ConsoleState; import org.eclipse.rdf4j.console.setting.ConsoleSetting; +import org.eclipse.rdf4j.model.Namespace; import org.eclipse.rdf4j.query.GraphQueryResult; import org.eclipse.rdf4j.query.MalformedQueryException; import org.eclipse.rdf4j.query.QueryEvaluationException; @@ -30,7 +32,7 @@ /** * Evaluator tuple and graph queries - * + * * @author dale */ public class TupleAndGraphQueryEvaluator { @@ -50,7 +52,7 @@ public class TupleAndGraphQueryEvaluator { /** * Constructor - * + * * @param consoleIO * @param state * @param settings @@ -63,7 +65,7 @@ public TupleAndGraphQueryEvaluator(ConsoleIO consoleIO, ConsoleState state, Map< /** * Get console IO - * + * * @return console IO */ protected ConsoleIO getConsoleIO() { @@ -72,7 +74,7 @@ protected ConsoleIO getConsoleIO() { /** * Get console State - * + * * @return console state */ protected ConsoleState getConsoleState() { @@ -81,7 +83,7 @@ protected ConsoleState getConsoleState() { /** * Get console settings - * + * * @return console settings */ protected Map getConsoleSettings() { @@ -91,7 +93,7 @@ protected Map getConsoleSettings() { /** * Evaluate SPARQL or SERQL tuple query and send the output to a writer. If writer is null, the console will be used * for output. - * + * * @param queryLn query language * @param queryString query string * @param writer result writer or null @@ -137,18 +139,19 @@ protected void evaluateTupleQuery(QueryLanguage queryLn, String queryString, Que /** * Evaluate SPARQL or SERQL graph query - * + * * @param queryLn query language * @param queryString query string - * @param writer + * @param writer RDFWriter to write the results to + * @param namespaces namespaces to write to the RDFWriter * @throws UnsupportedQueryLanguageException * @throws MalformedQueryException * @throws QueryEvaluationException * @throws RepositoryException */ - protected void evaluateGraphQuery(QueryLanguage queryLn, String queryString, RDFWriter writer) - throws UnsupportedQueryLanguageException, MalformedQueryException, QueryEvaluationException, - RepositoryException { + protected void evaluateGraphQuery(QueryLanguage queryLn, String queryString, RDFWriter writer, + Collection namespaces) throws UnsupportedQueryLanguageException, MalformedQueryException, + QueryEvaluationException, RepositoryException { Repository repository = state.getRepository(); consoleIO.writeln("Evaluating " + queryLn.getName() + " query..."); @@ -162,6 +165,8 @@ protected void evaluateGraphQuery(QueryLanguage queryLn, String queryString, RDF writer.startRDF(); + namespaces.forEach(ns -> writer.handleNamespace(ns.getPrefix(), ns.getName())); + while (res.hasNext()) { writer.handleStatement(res.next()); resultCount++; @@ -174,7 +179,7 @@ protected void evaluateGraphQuery(QueryLanguage queryLn, String queryString, RDF /** * Evaluate a boolean SPARQL or SERQL query - * + * * @param queryLn query language * @param queryString query string * @param writer @@ -204,7 +209,7 @@ protected void evaluateBooleanQuery(QueryLanguage queryLn, String queryString, Q /** * Execute a SPARQL or SERQL update - * + * * @param queryLn query language * @param queryString query string * @throws RepositoryException diff --git a/tools/console/src/main/java/org/eclipse/rdf4j/console/command/Verify.java b/tools/console/src/main/java/org/eclipse/rdf4j/console/command/Verify.java index ebe5788391b..fe7fbd4b0c7 100644 --- a/tools/console/src/main/java/org/eclipse/rdf4j/console/command/Verify.java +++ b/tools/console/src/main/java/org/eclipse/rdf4j/console/command/Verify.java @@ -23,6 +23,7 @@ import org.eclipse.rdf4j.console.VerificationListener; import org.eclipse.rdf4j.console.setting.ConsoleSetting; import org.eclipse.rdf4j.console.setting.WorkDir; +import org.eclipse.rdf4j.exceptions.ValidationException; import org.eclipse.rdf4j.model.Model; import org.eclipse.rdf4j.model.vocabulary.RDF4J; import org.eclipse.rdf4j.repository.RepositoryException; @@ -39,11 +40,10 @@ import org.eclipse.rdf4j.rio.helpers.BasicWriterSettings; import org.eclipse.rdf4j.sail.memory.MemoryStore; import org.eclipse.rdf4j.sail.shacl.ShaclSail; -import org.eclipse.rdf4j.sail.shacl.ShaclSailValidationException; /** * Verify command - * + * * @author Dale Visser * @author Bart Hanssens */ @@ -73,7 +73,7 @@ public String[] usesSettings() { /** * Constructor - * + * * @param consoleIO * @param settings */ @@ -101,7 +101,7 @@ public void execute(String... tokens) { /** * Get working dir setting. - * + * * @return path of working dir */ private Path getWorkDir() { @@ -110,7 +110,7 @@ private Path getWorkDir() { /** * Verify an RDF file, either a local file or URL. - * + * * @param tokens parameters */ private void verify(String dataPath) { @@ -166,7 +166,7 @@ private void verify(String dataPath) { /** * Validate an RDF data source using a SHACL file or URL, writing the report to a file. - * + * * @param dataPath file or URL of the data to be validated * @param shaclPath file or URL of the SHACL * @param reportFile file to write validation report to @@ -223,9 +223,9 @@ private void shacl(String dataPath, String shaclPath, String reportFile) { writeError("Failed to load data", e); } catch (RepositoryException e) { Throwable cause = e.getCause(); - if (cause instanceof ShaclSailValidationException) { + if (cause instanceof ValidationException) { writeError("SHACL validation failed, writing report to " + reportFile); - ShaclSailValidationException sv = (ShaclSailValidationException) cause; + ValidationException sv = (ValidationException) cause; writeReport(sv.validationReportAsModel(), reportFile); } } @@ -234,7 +234,7 @@ private void shacl(String dataPath, String shaclPath, String reportFile) { /** * Parse URL or path to local file. Files will be prefixed with "file:" scheme - * + * * @param str * @return URL path as string */ @@ -253,7 +253,7 @@ private String parseDataPath(String str) { /** * Write SHACL validation report to a file. File extension is used to select the serialization format, TTL is used * as default. - * + * * @param model report * @param reportFile file name */ diff --git a/tools/console/src/main/java/org/eclipse/rdf4j/console/setting/ConsoleSetting.java b/tools/console/src/main/java/org/eclipse/rdf4j/console/setting/ConsoleSetting.java index 7edc480fc1b..5e2d53d1103 100644 --- a/tools/console/src/main/java/org/eclipse/rdf4j/console/setting/ConsoleSetting.java +++ b/tools/console/src/main/java/org/eclipse/rdf4j/console/setting/ConsoleSetting.java @@ -12,7 +12,7 @@ /** * Abstract setting - * + * * @author Bart Hanssens * @param */ @@ -23,7 +23,7 @@ public abstract class ConsoleSetting implements Setting, Help { /** * Constructor - * + * * @param initValue initial value */ public ConsoleSetting(T initValue) { @@ -61,7 +61,7 @@ public void set(T value) { /** * Get the value for this setting as a string - * + * * @return string value */ public String getAsString() { @@ -75,7 +75,7 @@ public void clear() { /** * Get short description, small enough to fit on one console row - * + * * @return help string */ @Override @@ -85,7 +85,7 @@ public String getHelpShort() { /** * Get long description - * + * * @return string, can be multiple lines */ @Override diff --git a/tools/console/src/main/java/org/eclipse/rdf4j/console/setting/ConsoleWidth.java b/tools/console/src/main/java/org/eclipse/rdf4j/console/setting/ConsoleWidth.java index d0ad35b1044..546434dd1db 100644 --- a/tools/console/src/main/java/org/eclipse/rdf4j/console/setting/ConsoleWidth.java +++ b/tools/console/src/main/java/org/eclipse/rdf4j/console/setting/ConsoleWidth.java @@ -9,7 +9,7 @@ /** * Console value setting - * + * * @author Bart Hanssens */ public class ConsoleWidth extends ConsoleSetting { @@ -22,7 +22,7 @@ public String getHelpLong() { /** * Constructor - * + * * Default width is 80. */ public ConsoleWidth() { @@ -31,7 +31,7 @@ public ConsoleWidth() { /** * Constructor - * + * * @param initValue */ public ConsoleWidth(Integer initValue) { diff --git a/tools/console/src/main/java/org/eclipse/rdf4j/console/setting/LogLevel.java b/tools/console/src/main/java/org/eclipse/rdf4j/console/setting/LogLevel.java index 411d1b19164..fcacb7b5f08 100644 --- a/tools/console/src/main/java/org/eclipse/rdf4j/console/setting/LogLevel.java +++ b/tools/console/src/main/java/org/eclipse/rdf4j/console/setting/LogLevel.java @@ -17,13 +17,14 @@ /** * Console log level setting. - * + * * @author Bart Hanssens */ public class LogLevel extends ConsoleSetting { public final static String NAME = "log"; private static final BiMap LOG_LEVELS; + static { ImmutableBiMap.Builder logLevels = ImmutableBiMap.builder(); diff --git a/tools/console/src/main/java/org/eclipse/rdf4j/console/setting/Prefixes.java b/tools/console/src/main/java/org/eclipse/rdf4j/console/setting/Prefixes.java index 0b5e33dcd84..28080d3f302 100644 --- a/tools/console/src/main/java/org/eclipse/rdf4j/console/setting/Prefixes.java +++ b/tools/console/src/main/java/org/eclipse/rdf4j/console/setting/Prefixes.java @@ -32,13 +32,14 @@ /** * Namespace prefix setting - * + * * @author Bart Hanssens */ public class Prefixes extends ConsoleSetting> { public final static String NAME = "prefixes"; public final static Set DEFAULT = new HashSet<>(); + static { DEFAULT.add(DCAT.NS); DEFAULT.add(DCTERMS.NS); @@ -67,7 +68,7 @@ public String getHelpLong() { /** * Constructor - * + * * Default set of namespaces are well-known ones */ public Prefixes() { @@ -76,7 +77,7 @@ public Prefixes() { /** * Constructor - * + * * @param initValue */ public Prefixes(Set initValue) { @@ -95,7 +96,7 @@ public void clear() { /** * Remove the namespace with specified prefix - * + * * @param prefix */ private void clearNamespace(String prefix) { @@ -112,7 +113,7 @@ public String getAsString() { /** * Set a namespace from a string, using one whitespace to separate prefix and namespace URI E.g. 'dcterms * http://purl.org/dc/terms/' - * + * * @param namespace */ private void setNamespace(String namespace) { diff --git a/tools/console/src/main/java/org/eclipse/rdf4j/console/setting/QueryPrefix.java b/tools/console/src/main/java/org/eclipse/rdf4j/console/setting/QueryPrefix.java index 064590eacbc..9d849666f84 100644 --- a/tools/console/src/main/java/org/eclipse/rdf4j/console/setting/QueryPrefix.java +++ b/tools/console/src/main/java/org/eclipse/rdf4j/console/setting/QueryPrefix.java @@ -9,7 +9,7 @@ /** * Use prefixes when querying. - * + * * @author Bart Hanssens */ public class QueryPrefix extends ConsoleSetting { @@ -29,7 +29,7 @@ public QueryPrefix() { /** * Constructor - * + * * @param initValue */ public QueryPrefix(Boolean initValue) { diff --git a/tools/console/src/main/java/org/eclipse/rdf4j/console/setting/SaveHistory.java b/tools/console/src/main/java/org/eclipse/rdf4j/console/setting/SaveHistory.java index 9d918ad62d7..c6192fff1cb 100644 --- a/tools/console/src/main/java/org/eclipse/rdf4j/console/setting/SaveHistory.java +++ b/tools/console/src/main/java/org/eclipse/rdf4j/console/setting/SaveHistory.java @@ -9,7 +9,7 @@ /** * Save command history to a file. - * + * * @author Bart Hanssens */ public class SaveHistory extends ConsoleSetting { @@ -29,7 +29,7 @@ public SaveHistory() { /** * Constructor - * + * * @param initValue */ public SaveHistory(Boolean initValue) { diff --git a/tools/console/src/main/java/org/eclipse/rdf4j/console/setting/ShowPrefix.java b/tools/console/src/main/java/org/eclipse/rdf4j/console/setting/ShowPrefix.java index 98a62fa8afb..558d0d517c2 100644 --- a/tools/console/src/main/java/org/eclipse/rdf4j/console/setting/ShowPrefix.java +++ b/tools/console/src/main/java/org/eclipse/rdf4j/console/setting/ShowPrefix.java @@ -9,7 +9,7 @@ /** * Show prefixes when displaying results. - * + * * @author Bart Hanssens */ public class ShowPrefix extends ConsoleSetting { @@ -30,7 +30,7 @@ public ShowPrefix() { /** * Constructor - * + * * @param initValue */ public ShowPrefix(Boolean initValue) { diff --git a/tools/console/src/main/java/org/eclipse/rdf4j/console/setting/WorkDir.java b/tools/console/src/main/java/org/eclipse/rdf4j/console/setting/WorkDir.java index 74cdf55d2b7..69abb1380e2 100644 --- a/tools/console/src/main/java/org/eclipse/rdf4j/console/setting/WorkDir.java +++ b/tools/console/src/main/java/org/eclipse/rdf4j/console/setting/WorkDir.java @@ -12,7 +12,7 @@ /** * Working directory setting - * + * * @author Bart Hanssens */ public class WorkDir extends ConsoleSetting { @@ -25,7 +25,7 @@ public String getHelpLong() { /** * Constructor - * + * * Default dir is system property user.dir (= current directory) */ public WorkDir() { @@ -34,7 +34,7 @@ public WorkDir() { /** * Constructor - * + * * @param initValue */ public WorkDir(Path initValue) { diff --git a/tools/console/src/main/java/org/eclipse/rdf4j/console/util/ConsoleQueryResultWriter.java b/tools/console/src/main/java/org/eclipse/rdf4j/console/util/ConsoleQueryResultWriter.java index a66679ed500..27187e0a046 100644 --- a/tools/console/src/main/java/org/eclipse/rdf4j/console/util/ConsoleQueryResultWriter.java +++ b/tools/console/src/main/java/org/eclipse/rdf4j/console/util/ConsoleQueryResultWriter.java @@ -20,10 +20,11 @@ import org.eclipse.rdf4j.query.TupleQueryResultHandlerException; import org.eclipse.rdf4j.query.resultio.AbstractQueryResultWriter; import org.eclipse.rdf4j.query.resultio.QueryResultFormat; +import org.eclipse.rdf4j.query.resultio.TupleQueryResultFormat; /** * Write query results to console - * + * * @author Bart Hanssens */ public class ConsoleQueryResultWriter extends AbstractQueryResultWriter { @@ -34,10 +35,12 @@ public class ConsoleQueryResultWriter extends AbstractQueryResultWriter { private int columnWidth; private String separatorLine = ""; private String header = ""; + private TupleQueryResultFormat queryResultFormat = new TupleQueryResultFormat("Console query result format", + "application/x-dummy", "dummy", true); /** * Constructor - * + * * @param consoleIO * @param consoleWidth console width */ @@ -48,8 +51,7 @@ public ConsoleQueryResultWriter(ConsoleIO consoleIO, int consoleWidth) { @Override public QueryResultFormat getQueryResultFormat() { - throw new UnsupportedOperationException("Not supported yet."); // To change body of generated methods, choose - // Tools | Templates. + return queryResultFormat; } @Override @@ -91,6 +93,8 @@ public void handleLinks(List linkUrls) throws QueryResultHandlerExceptio @Override public void startQueryResult(List bindingNames) throws TupleQueryResultHandlerException { + super.startQueryResult(bindingNames); + this.bindingNames = bindingNames; int columns = bindingNames.size(); columnWidth = (consoleWidth - 1) / columns - 3; @@ -121,7 +125,7 @@ public void endQueryResult() throws TupleQueryResultHandlerException { } @Override - public void handleSolution(BindingSet bindingSet) throws TupleQueryResultHandlerException { + protected void handleSolutionImpl(BindingSet bindingSet) throws TupleQueryResultHandlerException { StringBuilder builder = new StringBuilder(512); for (String bindingName : bindingNames) { diff --git a/tools/console/src/main/java/org/eclipse/rdf4j/console/util/ConsoleRDFWriter.java b/tools/console/src/main/java/org/eclipse/rdf4j/console/util/ConsoleRDFWriter.java index 5cc87f3d8e2..2f2452abc6d 100644 --- a/tools/console/src/main/java/org/eclipse/rdf4j/console/util/ConsoleRDFWriter.java +++ b/tools/console/src/main/java/org/eclipse/rdf4j/console/util/ConsoleRDFWriter.java @@ -7,6 +7,7 @@ *******************************************************************************/ package org.eclipse.rdf4j.console.util; +import java.nio.charset.StandardCharsets; import java.util.HashMap; import java.util.Map; @@ -20,7 +21,7 @@ /** * Write query results to console - * + * * @author Bart Hanssens */ public class ConsoleRDFWriter extends AbstractRDFWriter { @@ -30,10 +31,12 @@ public class ConsoleRDFWriter extends AbstractRDFWriter { private int columnWidth; private String separatorLine = ""; private String header = ""; + private RDFFormat rdfFormat = new RDFFormat("Console RDF", "application/x-dummy", StandardCharsets.UTF_8, + "dummy", true, false, true); /** * Constructor - * + * * @param consoleIO * @param consoleWidth console width */ @@ -44,28 +47,24 @@ public ConsoleRDFWriter(ConsoleIO consoleIO, int consoleWidth) { @Override public void handleNamespace(String prefix, String uri) throws QueryResultHandlerException { + checkWritingStarted(); // use uri as the key, so the prefix can be retrieved and shown on the console namespaces.put(uri, prefix); } @Override public RDFFormat getRDFFormat() { - throw new UnsupportedOperationException("Not supported yet."); // To change body of generated methods, choose - // Tools | Templates. - } - - @Override - public void startRDF() throws RDFHandlerException { - // do nothing + return rdfFormat; } @Override public void endRDF() throws RDFHandlerException { + checkWritingStarted(); // do nothing } @Override - public void handleStatement(Statement st) throws RDFHandlerException { + public void consumeStatement(Statement st) throws RDFHandlerException { consoleIO.write(Util.getPrefixedValue(st.getSubject(), namespaces)); consoleIO.write(" "); consoleIO.write(Util.getPrefixedValue(st.getPredicate(), namespaces)); @@ -76,6 +75,7 @@ public void handleStatement(Statement st) throws RDFHandlerException { @Override public void handleComment(String comment) throws RDFHandlerException { + checkWritingStarted(); // do nothing } } diff --git a/tools/console/src/test/java/org/eclipse/rdf4j/console/command/AbstractCommandTest.java b/tools/console/src/test/java/org/eclipse/rdf4j/console/command/AbstractCommandTest.java index e70de040aa1..1d28d6e8e12 100644 --- a/tools/console/src/test/java/org/eclipse/rdf4j/console/command/AbstractCommandTest.java +++ b/tools/console/src/test/java/org/eclipse/rdf4j/console/command/AbstractCommandTest.java @@ -61,7 +61,7 @@ public class AbstractCommandTest { /* * Switch off .silent() to debug specific tests and reenable it afterwards. - * + * * Note, .silent() was added in Mockito 2, so has been removed until we update. */ @Rule @@ -95,7 +95,7 @@ public void tearDown() throws Exception { /** * Copy file from resource to a specific path - * + * * @param fromRes file to load from resources * @param toFile target file * @throws IOException @@ -109,7 +109,7 @@ public void copyFromResource(String fromRes, File toFile) throws IOException { /** * Load triples or quads from a resource file into the repository - * + * * @param repId repository ID * @param data URL of the resource * @param file name of the file @@ -127,7 +127,7 @@ protected void loadData(String repId, URL data, String file) throws IOException, /** * Add one or more repositories to the repository manager, and load some content (if any). - * + * * @param command command / directory to load data from * @param identities name of the repository / file to load * @throws IOException @@ -157,7 +157,7 @@ protected void addRepositories(String command, String... identities) throws IOEx /*** * Add a new repository to the manager. - * + * * @param configStream input stream of the repository configuration * @return ID of the repository as string * @throws IOException @@ -189,7 +189,7 @@ protected String addRepository(InputStream configStream) throws IOException, RDF /** * Set working dir setting to root of temporarily folder - * + * * @param cmd console command */ protected void setWorkingDir(ConsoleCommand cmd) { diff --git a/tools/console/src/test/java/org/eclipse/rdf4j/console/command/FederateTest.java b/tools/console/src/test/java/org/eclipse/rdf4j/console/command/FederateTest.java index 00e2fbc5293..75daf37fc0a 100644 --- a/tools/console/src/test/java/org/eclipse/rdf4j/console/command/FederateTest.java +++ b/tools/console/src/test/java/org/eclipse/rdf4j/console/command/FederateTest.java @@ -29,16 +29,11 @@ import org.eclipse.rdf4j.repository.sparql.config.SPARQLRepositoryConfig; import org.eclipse.rdf4j.repository.sparql.config.SPARQLRepositoryFactory; import org.eclipse.rdf4j.sail.federation.config.FederationConfig; -import org.junit.After; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.rules.TemporaryFolder; import org.mockito.InjectMocks; -import org.slf4j.LoggerFactory; - -import ch.qos.logback.classic.Level; -import ch.qos.logback.classic.Logger; /** * Unit tests for {@link Federate}. diff --git a/tools/console/src/test/java/org/eclipse/rdf4j/console/command/SetParametersTest.java b/tools/console/src/test/java/org/eclipse/rdf4j/console/command/SetParametersTest.java index 2eea8321a8d..b872cf197be 100644 --- a/tools/console/src/test/java/org/eclipse/rdf4j/console/command/SetParametersTest.java +++ b/tools/console/src/test/java/org/eclipse/rdf4j/console/command/SetParametersTest.java @@ -19,7 +19,7 @@ /** * Test setting parameters - * + * * @author Bart Hanssens */ public class SetParametersTest extends AbstractCommandTest { diff --git a/tools/console/src/test/java/org/eclipse/rdf4j/console/command/SparqlTest.java b/tools/console/src/test/java/org/eclipse/rdf4j/console/command/SparqlTest.java index a1d16873a48..460109c9f5d 100644 --- a/tools/console/src/test/java/org/eclipse/rdf4j/console/command/SparqlTest.java +++ b/tools/console/src/test/java/org/eclipse/rdf4j/console/command/SparqlTest.java @@ -28,7 +28,7 @@ /** * Test SPARQL command - * + * * @author Bart Hanssens */ public class SparqlTest extends AbstractCommandTest { diff --git a/tools/console/src/test/java/org/eclipse/rdf4j/console/command/VerifyTest.java b/tools/console/src/test/java/org/eclipse/rdf4j/console/command/VerifyTest.java index e16668b3cb7..a8e95ac2e27 100644 --- a/tools/console/src/test/java/org/eclipse/rdf4j/console/command/VerifyTest.java +++ b/tools/console/src/test/java/org/eclipse/rdf4j/console/command/VerifyTest.java @@ -29,7 +29,7 @@ /** * Test verify command - * + * * @author Bart Hanssens */ public class VerifyTest extends AbstractCommandTest { @@ -50,7 +50,7 @@ public void setUp() throws IOException, RDF4JException { /** * Copy Turtle file from resource to temp directory - * + * * @param str name of the resource file * @return path to file in temp directory * @throws IOException diff --git a/tools/console/src/test/java/org/eclipse/rdf4j/console/package-info.java b/tools/console/src/test/java/org/eclipse/rdf4j/console/package-info.java index 0be944756ea..7f6127ef94a 100644 --- a/tools/console/src/test/java/org/eclipse/rdf4j/console/package-info.java +++ b/tools/console/src/test/java/org/eclipse/rdf4j/console/package-info.java @@ -7,7 +7,7 @@ *******************************************************************************/ /** * Unit tests for the OpenRDF Console application. - * + * * @author Dale Visser */ -package org.eclipse.rdf4j.console; \ No newline at end of file +package org.eclipse.rdf4j.console; diff --git a/tools/console/src/test/java/org/eclipse/rdf4j/console/setting/AbstractSettingTest.java b/tools/console/src/test/java/org/eclipse/rdf4j/console/setting/AbstractSettingTest.java index 386009b4166..4e826165642 100644 --- a/tools/console/src/test/java/org/eclipse/rdf4j/console/setting/AbstractSettingTest.java +++ b/tools/console/src/test/java/org/eclipse/rdf4j/console/setting/AbstractSettingTest.java @@ -19,7 +19,7 @@ /** * Abstract class for settings - * + * * @author Bart Hanssens */ public abstract class AbstractSettingTest { diff --git a/tools/console/src/test/java/org/eclipse/rdf4j/console/setting/ConsoleWidthTest.java b/tools/console/src/test/java/org/eclipse/rdf4j/console/setting/ConsoleWidthTest.java index bccff816d2b..58bb26f1c40 100644 --- a/tools/console/src/test/java/org/eclipse/rdf4j/console/setting/ConsoleWidthTest.java +++ b/tools/console/src/test/java/org/eclipse/rdf4j/console/setting/ConsoleWidthTest.java @@ -15,7 +15,7 @@ /** * Test console width - * + * * @author Bart Hanssens */ public class ConsoleWidthTest extends AbstractSettingTest { diff --git a/tools/console/src/test/java/org/eclipse/rdf4j/console/setting/LogLevelTest.java b/tools/console/src/test/java/org/eclipse/rdf4j/console/setting/LogLevelTest.java index cfe4810cb6b..4cbdc4037ef 100644 --- a/tools/console/src/test/java/org/eclipse/rdf4j/console/setting/LogLevelTest.java +++ b/tools/console/src/test/java/org/eclipse/rdf4j/console/setting/LogLevelTest.java @@ -21,7 +21,7 @@ /** * Test log level setting - * + * * @author Bart Hanssens */ public class LogLevelTest extends AbstractSettingTest { diff --git a/tools/console/src/test/java/org/eclipse/rdf4j/console/setting/PrefixesTest.java b/tools/console/src/test/java/org/eclipse/rdf4j/console/setting/PrefixesTest.java index 20b03690de7..a0f628252e6 100644 --- a/tools/console/src/test/java/org/eclipse/rdf4j/console/setting/PrefixesTest.java +++ b/tools/console/src/test/java/org/eclipse/rdf4j/console/setting/PrefixesTest.java @@ -18,7 +18,7 @@ /** * Test namespace prefixes setting - * + * * @author Bart Hanssens */ public class PrefixesTest extends AbstractSettingTest { diff --git a/tools/console/src/test/java/org/eclipse/rdf4j/console/setting/QueryPrefixTest.java b/tools/console/src/test/java/org/eclipse/rdf4j/console/setting/QueryPrefixTest.java index 592bbf6b78c..192bcc7946d 100644 --- a/tools/console/src/test/java/org/eclipse/rdf4j/console/setting/QueryPrefixTest.java +++ b/tools/console/src/test/java/org/eclipse/rdf4j/console/setting/QueryPrefixTest.java @@ -15,7 +15,7 @@ /** * Test query prefix setting - * + * * @author Bart Hanssens */ public class QueryPrefixTest extends AbstractSettingTest { diff --git a/tools/console/src/test/java/org/eclipse/rdf4j/console/setting/ShowPrefixTest.java b/tools/console/src/test/java/org/eclipse/rdf4j/console/setting/ShowPrefixTest.java index 0ffd9b0a73b..88263c3e24a 100644 --- a/tools/console/src/test/java/org/eclipse/rdf4j/console/setting/ShowPrefixTest.java +++ b/tools/console/src/test/java/org/eclipse/rdf4j/console/setting/ShowPrefixTest.java @@ -15,7 +15,7 @@ /** * Test show prefix setting - * + * * @author Bart Hanssens */ public class ShowPrefixTest extends AbstractSettingTest { diff --git a/tools/federation/pom.xml b/tools/federation/pom.xml index 415f19c8d77..b4f5d681645 100644 --- a/tools/federation/pom.xml +++ b/tools/federation/pom.xml @@ -8,7 +8,7 @@ org.eclipse.rdf4j rdf4j-tools - 3.1.5-SNAPSHOT + 3.2.2-SNAPSHOT 9.4.19.v20190610 @@ -124,6 +124,12 @@ + + ${project.groupId} + rdf4j-sparql-testsuite + ${project.version} + test + org.junit.jupiter junit-jupiter-api @@ -148,5 +154,10 @@ 1.4.2 test + + org.assertj + assertj-core + test + diff --git a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/EndpointManager.java b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/EndpointManager.java index f78f9e2ed2c..fd8f1aac249 100644 --- a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/EndpointManager.java +++ b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/EndpointManager.java @@ -22,7 +22,7 @@ /** * EndpointManager is the singleton instance that manages available {@link Endpoint}s. Particular endpoints can be * looked up by their id and connection and all relevant information can be used. - * + * * @author Andreas Schwarte * */ @@ -36,7 +36,7 @@ public class EndpointManager { /** * Initialize the singleton endpoint manager with the provided endpoints - * + * * @param endpoints */ public static synchronized EndpointManager initialize(List endpoints) { @@ -58,7 +58,7 @@ private EndpointManager() { /** * Construct an EndpointManager with the provided endpoints - * + * * @param endpoints */ private EndpointManager(List endpoints) { @@ -67,18 +67,20 @@ private EndpointManager(List endpoints) { /** * Initialize the endpoint mapping with the provided endpoints - * + * * @param _endpoints a list of (initialized) endpoints or null */ private void init(List _endpoints) { - if (_endpoints != null) - for (Endpoint e : _endpoints) + if (_endpoints != null) { + for (Endpoint e : _endpoints) { addEndpoint(e); + } + } } /** * Add the (initialized) endpoint to this endpoint manager to be used by the {@link FederationManager}. - * + * * @param e the endpoint */ public void addEndpoint(Endpoint e) { @@ -88,14 +90,15 @@ public void addEndpoint(Endpoint e) { /** * Remove the provided endpoint from this endpoint manager to be used by the {@link FederationManager}. In addition, * this method unregisters the {@link FederatedService} from Sesame - * + * * @param e the endpoint - * + * * @throws NoSuchElementException if there is no mapping for some endpoint id */ protected void removeEndpoint(Endpoint e) throws NoSuchElementException { - if (!endpoints.containsKey(e.getId())) + if (!endpoints.containsKey(e.getId())) { throw new NoSuchElementException("No endpoint avalaible for id " + e.getId()); + } endpoints.remove(e.getId()); } @@ -116,22 +119,24 @@ public Endpoint getEndpoint(String endpointID) { /** * Return the Endpoint for the provided endpoint url, if it exists. Otherwise return null. - * + * * @param endpointUrl * @return the endpoint by its URL */ public Endpoint getEndpointByUrl(String endpointUrl) { for (Endpoint e : endpoints.values()) { - if (e.getEndpoint().equals(endpointUrl)) + if (e.getEndpoint().equals(endpointUrl)) { return e; + } } return null; } public Endpoint getEndpointByName(String endpointName) { for (Endpoint e : endpoints.values()) { - if (e.getName().equals(endpointName)) + if (e.getName().equals(endpointName)) { return e; + } } return null; } @@ -139,15 +144,16 @@ public Endpoint getEndpointByName(String endpointName) { /** * @param endpointIDs * @return a list of endpoints corresponding to the provided ids - * + * * @throws NoSuchElementException if there is no mapping for some endpoint id */ public List getEndpoints(Set endpointIDs) throws NoSuchElementException { List res = new ArrayList<>(); for (String endpointID : endpointIDs) { Endpoint e = endpoints.get(endpointID); - if (e == null) + if (e == null) { throw new NoSuchElementException("No endpoint found for " + endpointID + "."); + } res.add(e); } return res; diff --git a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/FedX.java b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/FedX.java index acdab7707af..62ebd1bd5ae 100644 --- a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/FedX.java +++ b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/FedX.java @@ -17,6 +17,7 @@ import org.eclipse.rdf4j.federated.endpoint.ResolvableEndpoint; import org.eclipse.rdf4j.federated.exception.ExceptionUtil; import org.eclipse.rdf4j.federated.exception.FedXException; +import org.eclipse.rdf4j.federated.exception.FedXRuntimeException; import org.eclipse.rdf4j.federated.util.FedXUtil; import org.eclipse.rdf4j.federated.write.ReadOnlyWriteStrategy; import org.eclipse.rdf4j.federated.write.RepositoryWriteStrategy; @@ -36,11 +37,11 @@ * a normal repository in a Sesame environment. The federation layer enables transparent access to the underlying * members as if they were a central repository. *

    - * + * * For initialization of the federation and usage see {@link FederationManager}. - * + * * @author Andreas Schwarte - * + * */ public class FedX extends AbstractSail implements RepositoryResolverClient { @@ -70,7 +71,7 @@ public void setFederationContext(FederationContext federationContext) { *

    * If the federation is already initialized, the given endpoint is explicitly initialized as well. *

    - * + * * @param endpoint */ protected void addMember(Endpoint endpoint) { @@ -82,7 +83,7 @@ protected void addMember(Endpoint endpoint) { /** * Remove a member from the federation (internal) - * + * * @param endpoint * @return whether the member was removed */ @@ -93,19 +94,22 @@ public boolean removeMember(Endpoint endpoint) { /** * Compute and return the {@link WriteStrategy} depending on the current federation configuration. - * + * * The default implementation uses the {@link RepositoryWriteStrategy} with the first discovered writable * {@link Endpoint}. In none is found, the {@link ReadOnlyWriteStrategy} is used. - * + * * @return the {@link WriteStrategy} + * @throws FedXRuntimeException if the {@link WriteStrategy} could not be created */ public WriteStrategy getWriteStrategy() { - for (Endpoint e : members) { - if (e.isWritable()) { - return new RepositoryWriteStrategy(e.getRepository()); - } + try { + return federationContext.getConfig() + .getWriteStrategyFactory() + .newInstance() + .create(members, federationContext); + } catch (Exception e) { + throw new FedXRuntimeException("Failed to instantiate write strategy: " + e.getMessage(), e); } - return ReadOnlyWriteStrategy.INSTANCE; } @Override @@ -162,7 +166,7 @@ public void setDataDir(File dataDir) { /** * Try to shut down all federation members. - * + * * @throws FedXException if not all members could be shut down */ @Override @@ -178,12 +182,13 @@ protected void shutDownInternal() throws SailException { } } - if (errors.size() > 0) + if (errors.size() > 0) { throw new SailException("Federation could not be shut down. See logs for details."); + } } /** - * + * * @return an unmodifiable view of the current members */ public List getMembers() { diff --git a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/FedXConfig.java b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/FedXConfig.java index 260886d19f3..af6f93d1dc1 100644 --- a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/FedXConfig.java +++ b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/FedXConfig.java @@ -15,6 +15,8 @@ import org.eclipse.rdf4j.federated.evaluation.concurrent.ControlledWorkerScheduler; import org.eclipse.rdf4j.federated.monitoring.QueryLog; import org.eclipse.rdf4j.federated.monitoring.QueryPlanLog; +import org.eclipse.rdf4j.federated.write.DefaultWriteStrategyFactory; +import org.eclipse.rdf4j.federated.write.WriteStrategyFactory; import org.eclipse.rdf4j.query.Operation; import org.eclipse.rdf4j.query.Query; @@ -22,7 +24,7 @@ /** * Configuration class for FedX - * + * * @author Andreas Schwarte */ public class FedXConfig { @@ -57,17 +59,19 @@ public class FedXConfig { private Class sparqlEvaluationStrategy = SparqlFederationEvalStrategy.class; + private Class writeStrategyFactory = DefaultWriteStrategyFactory.class; + private String prefixDeclarations = null; /* factory like setters */ /** * Set whether the query plan shall be debugged. See {@link #isDebugQueryPlan()}. - * + * *

    * Can be set after federation construction and initialize. *

    - * + * * @param flag * @return the current config */ @@ -78,11 +82,11 @@ public FedXConfig withDebugQueryPlan(boolean flag) { /** * Set whether to log queries. See {@link #isLogQueries()}. - * + * *

    * Can only be set before federation initialization. *

    - * + * * @param flag * @return the current config */ @@ -93,11 +97,11 @@ public FedXConfig withLogQueries(boolean flag) { /** * Set the {@link FederationEvalStrategy} for SPARQL federations. See {@link #getSPARQLEvaluationStrategy()}. - * + * *

    * Can only be set before federation initialization. *

    - * + * * @param sparqlEvaluationStrategy * @return the current config */ @@ -108,11 +112,11 @@ public FedXConfig withSparqlEvaluationStrategy(Class * Can only be set before federation initialization. *

    - * + * * @param sailEvaluationStrategy * @return the current config */ @@ -121,13 +125,24 @@ public FedXConfig withSailEvaluationStrategy(Class writeStrategyFactory) { + this.writeStrategyFactory = writeStrategyFactory; + return this; + } + /** * Set enforce max query time. See {@link #getEnforceMaxQueryTime()}. - * + * *

    * Can be set after federation construction and initialize. *

    - * + * * @param enforceMaxQueryTime time in seconds, 0 to disable * @return the current config */ @@ -138,7 +153,7 @@ public FedXConfig withEnforceMaxQueryTime(int enforceMaxQueryTime) { /** * Set the default value supplied to {@link Query#setIncludeInferred(boolean)} - * + * * @param flag * @return the current config */ @@ -149,11 +164,11 @@ public FedXConfig withIncludeInferredDefault(boolean flag) { /** * Enable monitoring. See {@link #isEnableMonitoring()}. - * + * *

    * Can only be set before federation initialization. *

    - * + * * @param flag * @return the current config */ @@ -164,11 +179,11 @@ public FedXConfig withEnableMonitoring(boolean flag) { /** * Set the bound join block size. See {@link #getBoundJoinBlockSize()}. - * + * *

    * Can only be set before federation initialization. *

    - * + * * @param boundJoinBlockSize * @return the current config */ @@ -179,11 +194,11 @@ public FedXConfig withBoundJoinBlockSize(int boundJoinBlockSize) { /** * Set the number of join worker threads. See {@link #getJoinWorkerThreads()}. - * + * *

    * Can only be set before federation initialization. *

    - * + * * @param joinWorkerThreads * @return the current config */ @@ -194,11 +209,11 @@ public FedXConfig withJoinWorkerThreads(int joinWorkerThreads) { /** * Set the number of left join worker threads. See {@link #getLeftJoinWorkerThreads()}. - * + * *

    * Can only be set before federation initialization. *

    - * + * * @param leftJoinWorkerThreads * @return the current config */ @@ -209,11 +224,11 @@ public FedXConfig withLeftJoinWorkerThreads(int leftJoinWorkerThreads) { /** * Set the number of union worker threads. See {@link #getUnionWorkerThreads()}. - * + * *

    * Can only be set before federation initialization. *

    - * + * * @param unionWorkerThreads * @return the current config */ @@ -224,11 +239,11 @@ public FedXConfig withUnionWorkerThreads(int unionWorkerThreads) { /** * Set the optional prefix declarations file. See {@link #getPrefixDeclarations()}. - * + * *

    * Can only be set before federation initialization. *

    - * + * * @param prefixFile * @return config */ @@ -239,11 +254,11 @@ public FedXConfig withPrefixDeclarations(String prefixFile) { /** * Whether to log the query plan with {@link QueryPlanLog}. See {@link #isLogQueryPlan()}. - * + * *

    * Can only be set before federation initialization. *

    - * + * * @param flag * @return the current config */ @@ -255,7 +270,7 @@ public FedXConfig withLogQueryPlan(boolean flag) { /** * Whether external SERVICE clauses are evaluated using bound join (i.e. with the VALUES clause). Default * true - * + * * @param flag * @return the current config. */ @@ -267,7 +282,7 @@ public FedXConfig withEnableServiceAsBoundJoin(boolean flag) { /** * The cache specification for the {@link SourceSelectionMemoryCache}. If not set explicitly, the * {@link SourceSelectionMemoryCache#DEFAULT_CACHE_SPEC} is used. - * + * * @param cacheSpec the {@link CacheBuilderSpec} for the {@link SourceSelectionCache} * @return the current config * @see SourceSelectionMemoryCache @@ -280,7 +295,7 @@ public FedXConfig withSourceSelectionCacheSpec(String cacheSpec) { /** * The (maximum) number of join worker threads used in the {@link ControlledWorkerScheduler} for join operations. * Default is 20. - * + * * @return the number of join worker threads */ public int getJoinWorkerThreads() { @@ -290,7 +305,7 @@ public int getJoinWorkerThreads() { /** * The (maximum) number of union worker threads used in the {@link ControlledWorkerScheduler} for join operations. * Default is 20 - * + * * @return number of union worker threads */ public int getUnionWorkerThreads() { @@ -300,7 +315,7 @@ public int getUnionWorkerThreads() { /** * The (maximum) number of left join worker threads used in the {@link ControlledWorkerScheduler} for join * operations. Default is 10. - * + * * @return the number of left join worker threads */ public int getLeftJoinWorkerThreads() { @@ -310,7 +325,7 @@ public int getLeftJoinWorkerThreads() { /** * The block size for a bound join, i.e. the number of bindings that are integrated in a single subquery. Default is * 15. - * + * * @return the bound join block size */ public int getBoundJoinBlockSize() { @@ -320,11 +335,11 @@ public int getBoundJoinBlockSize() { /** * Returns a flag indicating whether vectored evaluation using the VALUES clause shall be applied for SERVICE * expressions. - * + * * Default: false - * + * * Note: for todays endpoints it is more efficient to disable vectored evaluation of SERVICE. - * + * * @return whether SERVICE expressions are evaluated using bound joins */ public boolean getEnableServiceAsBoundJoin() { @@ -338,10 +353,10 @@ public boolean getEnableServiceAsBoundJoin() { *

    * Set to 0 to disable query timeouts. *

    - * + * * The timeout is also applied for individual fine-granular join or union operations as a max time. *

    - * + * * @return the maximum query time in seconds */ public int getEnforceMaxQueryTime() { @@ -349,7 +364,7 @@ public int getEnforceMaxQueryTime() { } /** - * + * * @return the default for {@link Operation#getIncludeInferred()} */ public boolean getIncludeInferredDefault() { @@ -358,7 +373,7 @@ public boolean getIncludeInferredDefault() { /** * Flag to enable/disable monitoring features. Default=false. - * + * * @return whether monitoring is enabled */ public boolean isEnableMonitoring() { @@ -368,7 +383,7 @@ public boolean isEnableMonitoring() { /** * Flag to enable/disable query plan logging via {@link QueryPlanLog}. Default=false The {@link QueryPlanLog} * facility allows to retrieve the query execution plan from a variable local to the executing thread. - * + * * @return whether the query plan shall be logged */ public boolean isLogQueryPlan() { @@ -378,9 +393,9 @@ public boolean isLogQueryPlan() { /** * Flag to enable/disable query logging via {@link QueryLog}. Default=false The {@link QueryLog} facility allows to * log all queries to a file. See {@link QueryLog} for details. - * + * * Requires {@link #isEnableMonitoring()} to be active. - * + * * @return whether queries are logged */ public boolean isLogQueries() { @@ -392,15 +407,15 @@ public boolean isLogQueries() { *

    * Default: no prefixes are replaced. Note that prefixes are only replaced when using the {@link QueryManager} to * create/evaluate queries. - * + * * Example: - * + * * * foaf=http://xmlns.com/foaf/0.1/ * rdf=http://www.w3.org/1999/02/22-rdf-syntax-ns# * =http://mydefaultns.org/ * - * + * * @return the location of the prefix declarations or null if not configured */ public String getPrefixDeclarations() { @@ -410,7 +425,7 @@ public String getPrefixDeclarations() { /** * Returns the configured {@link CacheBuilderSpec} (if any) for the {@link SourceSelectionMemoryCache}. If not * defined, the {@link SourceSelectionMemoryCache#DEFAULT_CACHE_SPEC} is used. - * + * * @return the {@link CacheBuilderSpec} or null */ public String getSourceSelectionCacheSpec() { @@ -423,7 +438,7 @@ public String getSourceSelectionCacheSpec() { *

    * Default {@link SailFederationEvalStrategy} *

    - * + * * @return the evaluation strategy class */ public Class getSailEvaluationStrategy() { @@ -436,16 +451,29 @@ public Class getSailEvaluationStrategy() { *

    * Default {@link SparqlFederationEvalStrategy} *

    - * + * * @return the evaluation strategy class */ public Class getSPARQLEvaluationStrategy() { return sparqlEvaluationStrategy; } + /** + * Returns the class of the {@link WriteStrategyFactory} implementation. + * + *

    + * Default: {@link DefaultWriteStrategyFactory} + *

    + * + * @return the {@link WriteStrategyFactory} class + */ + public Class getWriteStrategyFactory() { + return writeStrategyFactory; + } + /** * The debug mode for query plan. If enabled, the query execution plan is printed to stdout - * + * * @return whether the query plan is printed to std out */ public boolean isDebugQueryPlan() { diff --git a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/FedXConnection.java b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/FedXConnection.java index 3b30ecfdca6..c39426fc435 100644 --- a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/FedXConnection.java +++ b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/FedXConnection.java @@ -14,12 +14,12 @@ import org.eclipse.rdf4j.common.iteration.DistinctIteration; import org.eclipse.rdf4j.common.iteration.EmptyIteration; import org.eclipse.rdf4j.common.iteration.ExceptionConvertingIteration; +import org.eclipse.rdf4j.common.iteration.Iterations; import org.eclipse.rdf4j.federated.endpoint.Endpoint; import org.eclipse.rdf4j.federated.evaluation.FederationEvalStrategy; import org.eclipse.rdf4j.federated.evaluation.FederationEvaluationStatistics; import org.eclipse.rdf4j.federated.evaluation.concurrent.ParallelExecutor; import org.eclipse.rdf4j.federated.evaluation.concurrent.ParallelTask; -import org.eclipse.rdf4j.federated.evaluation.iterator.RepositoryExceptionConvertingIteration; import org.eclipse.rdf4j.federated.evaluation.iterator.StopRemainingExecutionsOnCloseIteration; import org.eclipse.rdf4j.federated.evaluation.union.SynchronousWorkerUnion; import org.eclipse.rdf4j.federated.evaluation.union.WorkerUnionBase; @@ -34,15 +34,19 @@ import org.eclipse.rdf4j.model.Statement; import org.eclipse.rdf4j.model.Value; import org.eclipse.rdf4j.model.ValueFactory; +import org.eclipse.rdf4j.model.util.Literals; import org.eclipse.rdf4j.query.BindingSet; import org.eclipse.rdf4j.query.Dataset; import org.eclipse.rdf4j.query.Operation; import org.eclipse.rdf4j.query.QueryEvaluationException; import org.eclipse.rdf4j.query.algebra.TupleExpr; +import org.eclipse.rdf4j.query.explanation.Explanation; import org.eclipse.rdf4j.query.impl.EmptyBindingSet; import org.eclipse.rdf4j.query.impl.MapBindingSet; +import org.eclipse.rdf4j.query.impl.SimpleDataset; import org.eclipse.rdf4j.repository.RepositoryConnection; import org.eclipse.rdf4j.repository.RepositoryException; +import org.eclipse.rdf4j.repository.sparql.federation.CollectionIteration; import org.eclipse.rdf4j.sail.SailConnection; import org.eclipse.rdf4j.sail.SailException; import org.eclipse.rdf4j.sail.helpers.AbstractSail; @@ -55,13 +59,13 @@ * Prior to evaluation various optimizations are performed, see * {@link org.eclipse.rdf4j.federated.optimizer.FedXOptimizer} for further details. *

    - * + * * Since 4.0 FedX supports write operations using the supplied {@link WriteStrategy}, e.g. by writing to a designated * federation member. Note: the {@link WriteStrategy} is initialized lazily upon first access to a write operation, see * {@link #getWriteStrategyInternal()}. - * + * * Implementation notes: - not all methods are implemented as of now - * + * * @author Andreas Schwarte * @see FederationEvalStrategy * @see WriteStrategy @@ -73,7 +77,7 @@ public class FedXConnection extends AbstractSailConnection { protected final FederationContext federationContext; /** - * If set, contains the initialized write strategy. Always access via {@link #getWriteStrategyInternal()} + * If set, contains the write strategy. Always access via {@link #getWriteStrategyInternal()} */ private WriteStrategy writeStrategy; @@ -95,10 +99,11 @@ protected CloseableIteration eva QueryInfo queryInfo = null; if (true) { String queryString = getOriginalQueryString(bindings); - if (queryString == null) + if (queryString == null) { log.warn("Query string is null. Please check your FedX setup."); - queryInfo = new QueryInfo(queryString, getOriginalQueryType(bindings), - getOriginalMaxExecutionTime(bindings), includeInferred, federationContext); + } + queryInfo = new QueryInfo(queryString, getOriginalBaseURI(bindings), getOriginalQueryType(bindings), + getOriginalMaxExecutionTime(bindings), includeInferred, federationContext, dataset); if (log.isDebugEnabled()) { log.debug("Optimization start (Query: " + queryInfo.getQueryID() + ")"); @@ -114,9 +119,10 @@ protected CloseableIteration eva log.debug("Details: ", e); throw new SailException(e); } - if (log.isDebugEnabled()) + if (log.isDebugEnabled()) { log.debug(("Optimization duration: " + ((System.currentTimeMillis() - start))) + " (Query: " + queryInfo.getQueryID() + ")"); + } } // log the optimized query plan, if Config#isLogQueryPlan(), otherwise void operation @@ -132,8 +138,10 @@ protected CloseableIteration eva try { // make sure to apply any external bindings + // Note: we use a conditional check for performance reasons. + // Further note that we subtract -1 from the size as the baseUri is optional BindingSet queryBindings = EmptyBindingSet.getInstance(); - if (bindings.size() > FedXRepositoryConnection.FEDX_BINDINGS.size()) { + if (bindings.size() > FedXRepositoryConnection.FEDX_BINDINGS.size() - 1) { MapBindingSet actualQueryBindings = new MapBindingSet(); bindings.forEach(binding -> { if (!FedXRepositoryConnection.FEDX_BINDINGS.contains(binding.getName())) { @@ -153,12 +161,20 @@ protected CloseableIteration eva @Override protected void clearInternal(Resource... contexts) throws SailException { - throw new UnsupportedOperationException("Operation is not yet supported."); + try { + getWriteStrategyInternal().clear(contexts); + } catch (RepositoryException e) { + throw new SailException(e); + } } @Override protected void clearNamespacesInternal() throws SailException { - throw new UnsupportedOperationException("Operation is not yet supported."); + try { + getWriteStrategyInternal().clearNamespaces(); + } catch (RepositoryException e) { + throw new SailException(e); + } } @Override @@ -171,7 +187,6 @@ protected void closeInternal() throws SailException { // the write strategy needs to be closed try { - // Note: access the field directly to not initialize write connection if (this.writeStrategy != null) { this.writeStrategy.close(); } @@ -194,15 +209,19 @@ protected CloseableIteration getContextIDsInt FederationEvalStrategy strategy = federationContext.getStrategy(); final WorkerUnionBase union = new SynchronousWorkerUnion<>(strategy, - new QueryInfo("getContextIDsInternal", QueryType.UNKNOWN, 0, - federationContext.getConfig().getIncludeInferredDefault(), federationContext)); + new QueryInfo("getContextIDsInternal", null, QueryType.UNKNOWN, 0, + federationContext.getConfig().getIncludeInferredDefault(), federationContext, + new SimpleDataset())); for (final Endpoint e : federation.getMembers()) { union.addTask(new ParallelTask() { @Override public CloseableIteration performTask() throws Exception { try (RepositoryConnection conn = e.getConnection()) { - return new RepositoryExceptionConvertingIteration<>(conn.getContextIDs()); + // we need to materialize the contexts as they are only accessible + // while the connection is open + return new CollectionIteration<>( + Iterations.asList(conn.getContextIDs())); } } @@ -220,7 +239,7 @@ public void cancel() { // execute the union in a separate thread federationContext.getManager().getExecutor().execute(union); - return new DistinctIteration( + return new DistinctIteration<>( new ExceptionConvertingIteration(union) { @Override protected SailException convert(Exception e) { @@ -251,7 +270,8 @@ protected CloseableIteration getStatementsIn try { FederationEvalStrategy strategy = federationContext.getStrategy(); - QueryInfo queryInfo = new QueryInfo(subj, pred, obj, includeInferred, federationContext); + QueryInfo queryInfo = new QueryInfo(subj, pred, obj, includeInferred, federationContext, + new SimpleDataset()); federationContext.getMonitoringService().monitorQuery(queryInfo); CloseableIteration res = strategy.getStatements(queryInfo, subj, pred, obj, contexts); @@ -309,8 +329,9 @@ protected void setNamespaceInternal(String prefix, String name) throws SailExcep @Override protected long sizeInternal(Resource... contexts) throws SailException { - if (contexts != null && contexts.length > 0) + if (contexts != null && contexts.length > 0) { throw new UnsupportedOperationException("Context handling for size() not supported"); + } long size = 0; List errorEndpoints = new ArrayList<>(); for (Endpoint e : federation.getMembers()) { @@ -320,9 +341,10 @@ protected long sizeInternal(Resource... contexts) throws SailException { errorEndpoints.add(e.getId()); } } - if (errorEndpoints.size() > 0) + if (errorEndpoints.size() > 0) { throw new SailException("Could not determine size for members " + errorEndpoints.toString() + "(Supported for NativeStore and RemoteRepository only). Computed size: " + size); + } return size; } @@ -339,61 +361,69 @@ protected void startTransactionInternal() throws SailException { * Return the initialized {@link #writeStrategy}. If this has not been done yet, {@link WriteStrategy#initialize()} * is returned. This method guarantees lazy initialization upon the first write operation on this * {@link FedXConnection} instance. - * + * * @return the {@link WriteStrategy} */ protected synchronized WriteStrategy getWriteStrategyInternal() throws SailException { if (writeStrategy == null) { writeStrategy = federation.getWriteStrategy(); - try { - writeStrategy.initialize(); - } catch (RepositoryException e) { - throw new SailException(e); - } } return writeStrategy; } private static String getOriginalQueryString(BindingSet b) { - if (b == null) + if (b == null) { return null; + } Value q = b.getValue(FedXRepositoryConnection.BINDING_ORIGINAL_QUERY); - if (q != null) + if (q != null) { return q.stringValue(); + } return null; } + private static String getOriginalBaseURI(BindingSet b) { + if (b == null) { + return null; + } + return Literals.getLabel(b.getValue(FedXRepositoryConnection.BINDING_ORIGINAL_BASE_URI), null); + } + private static QueryType getOriginalQueryType(BindingSet b) { - if (b == null) + if (b == null) { return null; + } Value q = b.getValue(FedXRepositoryConnection.BINDING_ORIGINAL_QUERY_TYPE); - if (q != null) + if (q != null) { return QueryType.valueOf(q.stringValue()); + } return null; } /** * Return the original explicit {@link Operation#getMaxExecutionTime()} in seconds, 0 if * {@link FedXConfig#getEnforceMaxQueryTime()} should be applied. - * + * * @param b * @return */ private static int getOriginalMaxExecutionTime(BindingSet b) { - if (b == null) + if (b == null) { return 0; + } Value q = b.getValue(FedXRepositoryConnection.BINDING_ORIGINAL_MAX_EXECUTION_TIME); - if (q != null) + if (q != null) { return Integer.parseInt(q.stringValue()); + } return 0; } /** * A default implementation for {@link AbstractSail}. This implementation has no further use, however it is needed * for the constructor call. - * + * * @author as * */ @@ -429,4 +459,10 @@ public boolean pendingRemovals() { return false; } + @Override + public Explanation explain(Explanation.Level level, TupleExpr tupleExpr, Dataset dataset, + BindingSet bindings, boolean includeInferred, int timeoutSeconds) { + throw new UnsupportedOperationException(); + } + } diff --git a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/FedXFactory.java b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/FedXFactory.java index 57b6dbb871f..ffd06d897ae 100644 --- a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/FedXFactory.java +++ b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/FedXFactory.java @@ -28,11 +28,11 @@ /** * FedX initialization factory methods for convenience: methods initialize the {@link FederationManager} and all * required FedX structures. See {@link FederationManager} for some a code snippet. - * + * *

    * Use the {@link FedXFactory#newFederation()} builder to create an advanced and customized federation *

    - * + * * @author Andreas Schwarte * */ @@ -42,11 +42,11 @@ public class FedXFactory { /** * Create a federation with the provided sparql endpoints - * + * * @param sparqlEndpoints the list of SPARQL endpoints - * + * * @return the configured FedX federation {@link Sail} wrapped in a {@link FedXRepository} - * + * * @throws Exception */ public static FedXRepository createSparqlFederation( @@ -57,11 +57,11 @@ public static FedXRepository createSparqlFederation( /** * Create the federation with a specified data source configuration file (*.ttl). Federation members are constructed * from the data source configuration. Sample data source configuration files can be found in the documentation. - * + * * @param dataConfig the location of the data source configuration - * + * * @return the configured FedX federation {@link Sail} wrapped in a {@link FedXRepository} - * + * * @throws Exception */ public static FedXRepository createFederation(File dataConfig) @@ -73,11 +73,11 @@ public static FedXRepository createFederation(File dataConfig) * Create the federation by providing the endpoints to add. The fedx configuration can provide information about the * dataConfig to be used which may contain the default federation members. *

    - * + * * @param endpoints additional endpoints to be added, may be null or empty - * + * * @return the configured FedX federation {@link Sail} wrapped in a {@link FedXRepository} - * + * * @throws Exception */ public static FedXRepository createFederation( @@ -89,7 +89,7 @@ public static FedXRepository createFederation( /** * Create a new customizable FedX federation. Once all configuration is supplied, the Federation can be created * using {@link #create()} - * + * * @return the {@link FedXFactory} builder */ public static FedXFactory newFederation() { @@ -134,7 +134,7 @@ public FedXFactory withMembers(File dataConfig) { * the documentation in {@link NativeRepositoryInformation}, {@link ResolvableRepositoryInformation} and * {@link SPARQLRepositoryInformation}. *

    - * + * * @param model the model defining the federation members * @return the factory */ @@ -157,7 +157,11 @@ public FedXFactory withSparqlEndpoints(List sparqlEndpoints) { } public FedXFactory withResolvableEndpoint(String repositoryId) { - members.add(EndpointFactory.loadResolvableRepository(repositoryId)); + return withResolvableEndpoint(repositoryId, false); + } + + public FedXFactory withResolvableEndpoint(String repositoryId, boolean writable) { + members.add(EndpointFactory.loadResolvableRepository(repositoryId, writable)); return this; } @@ -168,7 +172,7 @@ public FedXFactory withConfig(FedXConfig config) { /** * Configure the FedX base directory at federation construction time. - * + * * @param fedxBaseDir the fedx base directory * @return the {@link FedXFactory} instance */ @@ -179,11 +183,10 @@ public FedXFactory withFedXBaseDir(File fedxBaseDir) { /** * Create the federation using the provided configuration - * + * * @return the configured {@link FedXRepository} */ public FedXRepository create() { - if (members.isEmpty()) { log.info("Initializing federation without any pre-configured members"); } diff --git a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/FederationContext.java b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/FederationContext.java index c464a2006ff..b213543ccfe 100644 --- a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/FederationContext.java +++ b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/FederationContext.java @@ -13,7 +13,7 @@ /** * Context to maintain the state of the current federation - * + * * @author Andreas Schwarte * */ diff --git a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/FederationManager.java b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/FederationManager.java index f0d3967220f..e02ea31ae2f 100644 --- a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/FederationManager.java +++ b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/FederationManager.java @@ -39,21 +39,21 @@ * federation layer instance, cache and statistics. It is Singleton and there can only be on federation instance at a * time. *

    - * + * * The factory {@link FedXFactory} provides various functions for initialization of FedX and should be used as the entry * point for any application using FedX. *

    - * + * *

      * Config.initialize(fedxConfig);
      * List<Endpoint> members = ...			// e.g. use EndpointFactory methods
      * FedXRepository repo = FedXFactory.initializeFederation(endpoints);
      * ReositoryConnection conn = repo.getConnection();
    - * 
    + *
      * // Do something with the connection, e.g. query evaluation
      * repo.shutDown();
      * 
    - * + * * @author Andreas Schwarte * */ @@ -63,7 +63,7 @@ public class FederationManager { /** * The Federation type definition: Local, Remote, Hybrid - * + * * @author Andreas Schwarte */ public static enum FederationType { @@ -103,18 +103,21 @@ public void reset() { log.debug("Scheduler for join and union are reset."); } - if (joinScheduler != null) + if (joinScheduler != null) { joinScheduler.abort(); + } joinScheduler = new ControlledWorkerScheduler<>(federationContext.getConfig().getJoinWorkerThreads(), "Join Scheduler"); - if (unionScheduler != null) + if (unionScheduler != null) { unionScheduler.abort(); + } unionScheduler = new ControlledWorkerScheduler<>(federationContext.getConfig().getUnionWorkerThreads(), "Union Scheduler"); - if (leftJoinScheduler != null) + if (leftJoinScheduler != null) { leftJoinScheduler.abort(); + } leftJoinScheduler = new ControlledWorkerScheduler<>(federationContext.getConfig().getLeftJoinWorkerThreads(), "Left Join Scheduler"); @@ -151,32 +154,35 @@ public FederationType getFederationType() { /** * Add the specified endpoint to the federation. The federation must not contain a member with the same endpoint * location. - * + * * @param e the endpoint * @param updateStrategy optional parameter, to determine if strategy is to be updated, default=true - * + * * @throws FedXRuntimeException if the federation has already a member with the same location */ public void addEndpoint(Endpoint e, boolean... updateStrategy) throws FedXRuntimeException { log.info("Adding endpoint " + e.getId() + " to federation ..."); /* check for duplicate before adding: heuristic => same location */ - for (Endpoint member : federation.getMembers()) - if (member.getEndpoint().equals(e.getEndpoint())) + for (Endpoint member : federation.getMembers()) { + if (member.getEndpoint().equals(e.getEndpoint())) { throw new FedXRuntimeException("Adding failed: there exists already an endpoint with location " + e.getEndpoint() + " (eid=" + member.getId() + ")"); + } + } federation.addMember(e); federationContext.getEndpointManager().addEndpoint(e); if (updateStrategy == null || updateStrategy.length == 0 - || (updateStrategy.length == 1 && updateStrategy[0] == true)) + || (updateStrategy.length == 1 && updateStrategy[0] == true)) { updateStrategy(); + } } /** * Add the specified endpoints to the federation and take care for updating all structures. - * + * * @param endpoints a list of endpoints to add */ public void addAll(List endpoints) { @@ -191,7 +197,7 @@ public void addAll(List endpoints) { /** * Remove the specified endpoint from the federation. - * + * * @param e the endpoint * @param updateStrategy optional parameter, to determine if strategy is to be updated, default=true */ @@ -199,21 +205,23 @@ public void removeEndpoint(Endpoint e, boolean... updateStrategy) throws Reposit log.info("Removing endpoint " + e.getId() + " from federation ..."); /* check if e is a federation member */ - if (!federation.getMembers().contains(e)) + if (!federation.getMembers().contains(e)) { throw new FedXRuntimeException("Endpoint " + e.getId() + " is not a member of the current federation."); + } federation.removeMember(e); federationContext.getEndpointManager().removeEndpoint(e); if (updateStrategy == null || updateStrategy.length == 0 - || (updateStrategy.length == 1 && updateStrategy[0] == true)) + || (updateStrategy.length == 1 && updateStrategy[0] == true)) { updateStrategy(); + } } /** * Remove all endpoints from the federation, e.g. to load a new preset. Repositories of the endpoints are shutDown, * and the EndpointManager is added accordingly. - * + * * @throws RepositoryException */ public void removeAll() throws RepositoryException { @@ -229,13 +237,13 @@ public void removeAll() throws RepositoryException { /** * Shutdown the federation including the following operations: *

    - * + * *

      *
    • shut down repositories of all federation members
    • *
    • persist the cached information
    • *
    • clear the endpoint manager
    • *
    - * + * * @throws FedXException if an error occurs while shutting down the federation */ public synchronized void shutDown() throws FedXException { @@ -274,16 +282,17 @@ public synchronized void shutDown() throws FedXException { /** * Create an appropriate worker union for this federation, i.e. a synchronous worker union for local federations and * a multithreaded worker union for remote & hybrid federations. - * + * * @return the {@link WorkerUnionBase} - * + * * @see ControlledWorkerUnion * @see SynchronousWorkerUnion */ public WorkerUnionBase createWorkerUnion(QueryInfo queryInfo) { FederationEvalStrategy strategy = getStrategy(); - if (type == FederationType.LOCAL) + if (type == FederationType.LOCAL) { return new SynchronousWorkerUnion<>(strategy, queryInfo); + } return new ControlledWorkerUnion<>(strategy, unionScheduler, queryInfo); } @@ -292,25 +301,26 @@ public WorkerUnionBase createWorkerUnion(QueryInfo queryInfo) { * Update the federation evaluation strategy using the classification of endpoints as provided by * {@link Endpoint#getEndpointClassification()}: *

    - * + * * Which strategy is applied depends on {@link FederationEvaluationStrategyFactory}. - * + * * Default strategies: *

      *
    • local federation: {@link SailFederationEvalStrategy}
    • *
    • endpoint federation: {@link SparqlFederationEvalStrategy}
    • *
    • hybrid federation: {@link SparqlFederationEvalStrategy}
    • *
    - * + * */ public void updateStrategy() { int localCount = 0, remoteCount = 0; for (Endpoint e : federation.getMembers()) { - if (e.getEndpointClassification() == EndpointClassification.Remote) + if (e.getEndpointClassification() == EndpointClassification.Remote) { remoteCount++; - else + } else { localCount++; + } } boolean updated = false; diff --git a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/QueryManager.java b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/QueryManager.java index dd27f66328b..c448c9d3781 100644 --- a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/QueryManager.java +++ b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/QueryManager.java @@ -48,9 +48,9 @@ /** * QueryManager to manage queries. - * + * * a) Management of running queries (abort, finish) b) Factory to create queries - * + * * @author Andreas Schwarte */ public class QueryManager { @@ -118,7 +118,7 @@ public void shutdown() { /** * Add the query to the set of running queries, queries are identified via a unique id - * + * * @param queryInfo */ public void registerQuery(QueryInfo queryInfo) { @@ -137,8 +137,9 @@ public int getNumberOfRunningQueries() { public void abortQuery(QueryInfo queryInfo) { synchronized (queryInfo) { - if (!runningQueries.contains(queryInfo)) + if (!runningQueries.contains(queryInfo)) { return; + } log.info("Aborting query " + queryInfo.getQueryID()); queryInfo.abort(); runningQueries.remove(queryInfo); @@ -156,9 +157,9 @@ public boolean isRunning(QueryInfo queryInfo) { /** * Register a prefix declaration to be used during query evaluation. If a known prefix is used in a query, it is * substituted in the parsing step. - * + * * If namespace is null, the corresponding entry is removed. - * + * * @param prefix a common prefix, e.g. rdf * @param namespace the corresponding namespace, e.g. "http://www.w3.org/1999/02/22-rdf-syntax-ns#" */ @@ -174,10 +175,10 @@ public void addPrefixDeclaration(String prefix, String namespace) { /** * Prepare a tuple query which uses the underlying federation to evaluate the query. *

    - * + * * The queryString is modified to use the declared PREFIX declarations, see * {@link FedXConfig#getPrefixDeclarations()} for details. - * + * * @param queryString * @return the prepared tuple query * @throws MalformedQueryException @@ -185,18 +186,19 @@ public void addPrefixDeclaration(String prefix, String namespace) { public TupleQuery prepareTupleQuery(String queryString) throws MalformedQueryException { Query q = prepareQuery(queryString); - if (!(q instanceof TupleQuery)) + if (!(q instanceof TupleQuery)) { throw new FedXRuntimeException("Query is not a tuple query: " + q.getClass()); + } return (TupleQuery) q; } /** * Prepare a tuple query which uses the underlying federation to evaluate the query. *

    - * + * * The queryString is modified to use the declared PREFIX declarations, see * {@link FedXConfig#getPrefixDeclarations()} for details. - * + * * @param queryString * @return the prepared graph query * @throws MalformedQueryException @@ -204,18 +206,19 @@ public TupleQuery prepareTupleQuery(String queryString) throws MalformedQueryExc public GraphQuery prepareGraphQuery(String queryString) throws MalformedQueryException { Query q = prepareQuery(queryString); - if (!(q instanceof GraphQuery)) + if (!(q instanceof GraphQuery)) { throw new FedXRuntimeException("Query is not a graph query: " + q.getClass()); + } return (GraphQuery) q; } /** * Prepare a boolean query which uses the underlying federation to evaluate the query. *

    - * + * * The queryString is modified to use the declared PREFIX declarations, see * {@link FedXConfig#getPrefixDeclarations()} for details. - * + * * @param queryString * @return the prepared {@link BooleanQuery} * @throws MalformedQueryException @@ -223,8 +226,9 @@ public GraphQuery prepareGraphQuery(String queryString) throws MalformedQueryExc public BooleanQuery prepareBooleanQuery(String queryString) throws MalformedQueryException { Query q = prepareQuery(queryString); - if (!(q instanceof BooleanQuery)) + if (!(q instanceof BooleanQuery)) { throw new FedXRuntimeException("Unexpected query type: " + q.getClass()); + } return (BooleanQuery) q; } @@ -235,10 +239,10 @@ public BooleanQuery prepareBooleanQuery(String queryString) throws MalformedQuer /** * Prepare a {@link Query} which uses the underlying federation to evaluate the SPARQL query. *

    - * + * * The queryString is modified to use the declared PREFIX declarations, see * {@link FedXConfig#getPrefixDeclarations()} for details. - * + * * @param queryString * @return the prepared {@link Query} * @throws MalformedQueryException @@ -251,10 +255,11 @@ public Query prepareQuery(String queryString) throws MalformedQueryException { * we have to check for prefixes in the query to not add duplicate entries. In case duplicates are present * RDF4J throws a MalformedQueryException */ - if (prefixCheck.matcher(queryString).matches()) + if (prefixCheck.matcher(queryString).matches()) { queryString = getPrefixDeclarationsCheck(queryString) + queryString; - else + } else { queryString = getPrefixDeclarations() + queryString; + } } Query q; @@ -271,7 +276,7 @@ public Query prepareQuery(String queryString) throws MalformedQueryException { /** * Retrieve the query plan for the given query string. - * + * * @param queryString * @return the query plan * @throws MalformedQueryException @@ -285,18 +290,21 @@ public String getQueryPlan(String queryString) throws MalformedQueryException, F * we have to check for prefixes in the query to not add duplicate entries. In case duplicates are present * RDF4J throws a MalformedQueryException */ - if (prefixCheck.matcher(queryString).matches()) + if (prefixCheck.matcher(queryString).matches()) { queryString = getPrefixDeclarationsCheck(queryString) + queryString; - else + } else { queryString = getPrefixDeclarations() + queryString; + } } ParsedOperation query = QueryParserUtil.parseOperation(QueryLanguage.SPARQL, queryString, null); - if (!(query instanceof ParsedQuery)) + if (!(query instanceof ParsedQuery)) { throw new MalformedQueryException("Not a ParsedQuery: " + query.getClass()); + } // we use a dummy query info object here QueryInfo qInfo = new QueryInfo(queryString, QueryType.SELECT, - federationContext.getConfig().getIncludeInferredDefault(), federationContext); + federationContext.getConfig().getIncludeInferredDefault(), federationContext, + ((ParsedQuery) query).getDataset()); TupleExpr tupleExpr = ((ParsedQuery) query).getTupleExpr(); try { FederationEvaluationStatistics evaluationStatistics = new FederationEvaluationStatistics(qInfo, @@ -311,7 +319,7 @@ public String getQueryPlan(String queryString) throws MalformedQueryException, F /** * Computes the (incremental) next query identifier. Implementation is thread safe and synchronized. - * + * * @return the next query identifier */ public BigInteger getNextQueryId() { @@ -320,7 +328,7 @@ public BigInteger getNextQueryId() { /** * Get the prefix declarations that have to be prepended to the query. - * + * * @return the prefix declarations */ protected String getPrefixDeclarations() { @@ -338,7 +346,7 @@ protected String getPrefixDeclarations() { /** * Get the prefix declarations that have to be added while considering prefixes that are already declared in the * query. The issue here is that duplicate declaration causes exceptions in Sesame - * + * * @param queryString * @return the prefix declarations */ @@ -348,8 +356,9 @@ protected String getPrefixDeclarationsCheck(String queryString) { StringBuilder sb = new StringBuilder(); for (String prefix : prefixDeclarations.keySet()) { - if (queryPrefixes.contains(prefix)) + if (queryPrefixes.contains(prefix)) { continue; // already there, do not add + } sb.append("PREFIX ") .append(prefix) .append(": <") @@ -361,7 +370,7 @@ protected String getPrefixDeclarationsCheck(String queryString) { /** * Find all prefixes declared in the query - * + * * @param queryString * @return the prefixes */ @@ -375,8 +384,9 @@ protected static Set findQueryPrefixes(String queryString) { MatchResult m = sc.match(); res.add(m.group(1)); } - if (!sc.hasNextLine()) + if (!sc.hasNextLine()) { break; + } sc.nextLine(); } sc.close(); diff --git a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/algebra/BoundFiltersNode.java b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/algebra/BoundFiltersNode.java index 803e37e90ab..71e6c7e350a 100644 --- a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/algebra/BoundFiltersNode.java +++ b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/algebra/BoundFiltersNode.java @@ -15,7 +15,7 @@ /** * A {@link QueryModelNode} for printing the bound filter vars (e.g. in a {@link FedXStatementPattern}) - * + * * @author Andreas Schwarte * */ diff --git a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/algebra/BoundJoinTupleExpr.java b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/algebra/BoundJoinTupleExpr.java index f2acedf310a..adafad534ee 100644 --- a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/algebra/BoundJoinTupleExpr.java +++ b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/algebra/BoundJoinTupleExpr.java @@ -12,7 +12,7 @@ /** * Marker interface indicating that instances are applicable for bound join processing (see * {@link ControlledWorkerBoundJoin} - * + * * @author Andreas Schwarte * @see ControlledWorkerBoundJoin */ diff --git a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/algebra/CheckStatementPattern.java b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/algebra/CheckStatementPattern.java index 496ac3d5b3d..db3dd8a3031 100644 --- a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/algebra/CheckStatementPattern.java +++ b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/algebra/CheckStatementPattern.java @@ -28,9 +28,9 @@ /** * A statement pattern with no free variables when provided with some particular BindingSet in evaluate. For evaluation * a boolean ASK query is performed. - * + * * Wraps a StatementTupleExpr - * + * * @author Andreas Schwarte */ public class CheckStatementPattern implements StatementTupleExpr, BoundJoinTupleExpr { @@ -41,6 +41,11 @@ public class CheckStatementPattern implements StatementTupleExpr, BoundJoinTuple protected final String id; protected final QueryInfo queryInfo; + private double resultSizeEstimate = -1; + private double costEstimate = -1; + private long resultSizeActual = -1; + private long totalTimeNanosActual = -1; + public CheckStatementPattern(StatementTupleExpr stmt, QueryInfo queryInfo) { super(); this.stmt = stmt; @@ -130,6 +135,46 @@ public CheckStatementPattern clone() { throw new RuntimeException("Operation not supported on this node!"); } + @Override + public double getResultSizeEstimate() { + return resultSizeEstimate; + } + + @Override + public void setResultSizeEstimate(double resultSizeEstimate) { + this.resultSizeEstimate = resultSizeEstimate; + } + + @Override + public long getResultSizeActual() { + return resultSizeActual; + } + + @Override + public void setResultSizeActual(long resultSizeActual) { + this.resultSizeActual = resultSizeActual; + } + + @Override + public double getCostEstimate() { + return costEstimate; + } + + @Override + public void setCostEstimate(double costEstimate) { + this.costEstimate = costEstimate; + } + + @Override + public long getTotalTimeNanosActual() { + return totalTimeNanosActual; + } + + @Override + public void setTotalTimeNanosActual(long totalTimeNanosActual) { + this.totalTimeNanosActual = totalTimeNanosActual; + } + @Override public CloseableIteration evaluate(BindingSet bindings) throws QueryEvaluationException { @@ -143,8 +188,9 @@ public CloseableIteration evaluate(Binding .getEndpointManager() .getEndpoint(source.getEndpointID()); TripleSource t = ownedEndpoint.getTripleSource(); - if (t.hasStatements(st, bindings, queryInfo)) + if (t.hasStatements(st, bindings, queryInfo, queryInfo.getDataset())) { return new SingleBindingSetIteration(bindings); + } } } catch (RepositoryException | MalformedQueryException e) { throw new QueryEvaluationException(e); diff --git a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/algebra/ConjunctiveFilterExpr.java b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/algebra/ConjunctiveFilterExpr.java index 7e768a32f3c..0824c03b7ea 100644 --- a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/algebra/ConjunctiveFilterExpr.java +++ b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/algebra/ConjunctiveFilterExpr.java @@ -16,7 +16,7 @@ /** * ConjunctiveFilterExpr maintains a list of conjunctive (i.e. AND connected) constraints. - * + * * @author Andreas Schwarte * */ @@ -32,11 +32,13 @@ public ConjunctiveFilterExpr(FilterExpr expr1, FilterExpr expr2) { } public ConjunctiveFilterExpr(Collection expressions) { - if (expressions.size() < 2) + if (expressions.size() < 2) { throw new IllegalArgumentException("Conjunctive Expression must have at least two arguments."); + } this.expressions = new ArrayList<>(expressions.size()); - for (FilterExpr expr : expressions) + for (FilterExpr expr : expressions) { addExpression(expr); + } } public void addExpression(FilterExpr expr) { @@ -63,8 +65,9 @@ public void visit(QueryModelVisitor visitor) public void visitChildren(QueryModelVisitor visitor) throws X { super.visitChildren(visitor); - for (FilterExpr expr : expressions) + for (FilterExpr expr : expressions) { expr.getExpression().visit(visitor); + } } } diff --git a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/algebra/EmptyNJoin.java b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/algebra/EmptyNJoin.java index 95c8ae8e4d2..5fc27bfd637 100644 --- a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/algebra/EmptyNJoin.java +++ b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/algebra/EmptyNJoin.java @@ -11,7 +11,7 @@ /** * Algebra construct representing an empty join. - * + * * @author Andreas Schwarte * */ diff --git a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/algebra/EmptyNUnion.java b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/algebra/EmptyNUnion.java index 3dbd0b80c32..957d0338e6f 100644 --- a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/algebra/EmptyNUnion.java +++ b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/algebra/EmptyNUnion.java @@ -14,7 +14,7 @@ /** * Algebra construct representing an empty union. - * + * * @author Andreas Schwarte * */ diff --git a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/algebra/EmptyResult.java b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/algebra/EmptyResult.java index 2bff926f7b4..bdba5d01dd0 100644 --- a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/algebra/EmptyResult.java +++ b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/algebra/EmptyResult.java @@ -9,9 +9,9 @@ /** * A generic interface to mark some TupleExpr as empty. - * + * * @author Andreas Schwarte - * + * * @see EmptyStatementPattern * @see EmptyNJoin * diff --git a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/algebra/EmptyStatementPattern.java b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/algebra/EmptyStatementPattern.java index 9e4e22f8cde..fdfc2887775 100644 --- a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/algebra/EmptyStatementPattern.java +++ b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/algebra/EmptyStatementPattern.java @@ -12,7 +12,7 @@ /** * EmptyStatementPattern represents a statement that cannot produce any results for the registered endpoints. - * + * * @author Andreas Schwarte * */ diff --git a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/algebra/ExclusiveArbitraryLengthPath.java b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/algebra/ExclusiveArbitraryLengthPath.java index 304740e2841..1cfecb1f7d9 100644 --- a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/algebra/ExclusiveArbitraryLengthPath.java +++ b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/algebra/ExclusiveArbitraryLengthPath.java @@ -21,7 +21,7 @@ /** * An {@link ArbitraryLengthPath} node which can be evaluated at a single node. - * + * * @author Andreas Schwarte * */ diff --git a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/algebra/ExclusiveGroup.java b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/algebra/ExclusiveGroup.java index 4843b1d154a..1798fb884af 100644 --- a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/algebra/ExclusiveGroup.java +++ b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/algebra/ExclusiveGroup.java @@ -32,7 +32,7 @@ /** * Represents a group of {@link ExclusiveTupleExpr} that can only produce results at a single endpoint, the * {@link StatementSource}. - * + * * @author Andreas Schwarte * */ @@ -144,9 +144,11 @@ public List getStatementSources() { @Override public boolean hasFreeVarsFor(BindingSet bindings) { - for (String var : freeVars) - if (!bindings.hasBinding(var)) + for (String var : freeVars) { + if (!bindings.hasBinding(var)) { return true; + } + } return false; } @@ -166,9 +168,9 @@ public CloseableIteration evaluate(Binding @Override public void addFilterExpr(FilterExpr expr) { - if (filterExpr == null) + if (filterExpr == null) { filterExpr = expr; - else if (filterExpr instanceof ConjunctiveFilterExpr) { + } else if (filterExpr instanceof ConjunctiveFilterExpr) { ((ConjunctiveFilterExpr) filterExpr).addExpression(expr); } else if (filterExpr instanceof FilterExpr) { filterExpr = new ConjunctiveFilterExpr((FilterExpr) filterExpr, expr); diff --git a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/algebra/ExclusiveStatement.java b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/algebra/ExclusiveStatement.java index 55a06dc2935..4ae41b4ba0e 100644 --- a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/algebra/ExclusiveStatement.java +++ b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/algebra/ExclusiveStatement.java @@ -26,7 +26,7 @@ /** * Represents a StatementPattern that can only produce results at a single endpoint, the owner. - * + * * @author Andreas Schwarte */ public class ExclusiveStatement extends FedXStatementPattern implements ExclusiveTupleExpr { @@ -62,16 +62,17 @@ public CloseableIteration evaluate( */ CloseableIteration res = null; - if (t.usePreparedQuery()) { + if (t.usePreparedQuery(this, queryInfo)) { AtomicBoolean isEvaluated = new AtomicBoolean(false); // is filter evaluated String preparedQuery; try { - preparedQuery = QueryStringUtil.selectQueryString(this, bindings, filterExpr, isEvaluated); + preparedQuery = QueryStringUtil.selectQueryString(this, bindings, filterExpr, isEvaluated, + queryInfo.getDataset()); } catch (IllegalQueryException e1) { // TODO there might be an issue with filters being evaluated => investigate /* all vars are bound, this must be handled as a check query, can occur in joins */ - if (t.hasStatements(this, bindings, queryInfo)) { + if (t.hasStatements(this, bindings, queryInfo, queryInfo.getDataset())) { res = new SingleBindingSetIteration(bindings); if (boundFilters != null) { // make sure to insert any values from FILTER expressions that are directly diff --git a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/algebra/ExclusiveTupleExpr.java b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/algebra/ExclusiveTupleExpr.java index 0cdd4b0f885..3b81625c10e 100644 --- a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/algebra/ExclusiveTupleExpr.java +++ b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/algebra/ExclusiveTupleExpr.java @@ -12,14 +12,14 @@ *

    * Implementations are recommended to additionally implement {@link ExclusiveTupleExprRenderer} *

    - * + * * @author Andreas Schwarte * @see ExclusiveStatement */ public interface ExclusiveTupleExpr extends FedXTupleExpr { /** - * + * * @return the owner for this expression */ public StatementSource getOwner(); diff --git a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/algebra/ExclusiveTupleExprRenderer.java b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/algebra/ExclusiveTupleExprRenderer.java index 549a6161675..05fd9cc59fb 100644 --- a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/algebra/ExclusiveTupleExprRenderer.java +++ b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/algebra/ExclusiveTupleExprRenderer.java @@ -15,11 +15,11 @@ /** * A specialization of {@link ExclusiveTupleExpr} which provides definitions how the expressions can be rendered to a * sub-query. - * + * *

    * This is required for the evaluation of sub queries. *

    - * + * * @author Andreas Schwarte * */ @@ -31,7 +31,7 @@ public interface ExclusiveTupleExprRenderer extends ExclusiveTupleExpr { * Implementations are required to create a valid query string for this expression where the given bindings are * inserted. *

    - * + * * @param varNames the set of resulting (unbound) variables from this expression * @param bindings the optional input bindings * @return the query string part @@ -44,7 +44,7 @@ public interface ExclusiveTupleExprRenderer extends ExclusiveTupleExpr { * Implementations are required to create a new equivalent expression or clone, where any provided input bindings * are inserted. The free variable names after insertion need to be added to the provided set. *

    - * + * * @param varNames the set of resulting (unbound) variables from this expression * @param bindings the input bindings that need to be inserted * @return the algebra expression diff --git a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/algebra/FedXLeftJoin.java b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/algebra/FedXLeftJoin.java index 98afa17cf18..f52990c9438 100644 --- a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/algebra/FedXLeftJoin.java +++ b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/algebra/FedXLeftJoin.java @@ -12,7 +12,7 @@ /** * Abstraction of {@link LeftJoin} to maintain the {@link QueryInfo}. - * + * * @author Andreas Schwarte * */ diff --git a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/algebra/FedXStatementPattern.java b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/algebra/FedXStatementPattern.java index a47da5b2875..5ea4e5d9f36 100644 --- a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/algebra/FedXStatementPattern.java +++ b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/algebra/FedXStatementPattern.java @@ -23,7 +23,7 @@ /** * Base class providing all common functionality for FedX StatementPatterns - * + * * @author Andreas Schwarte * @see StatementSourcePattern * @see ExclusiveStatement @@ -41,11 +41,12 @@ public abstract class FedXStatementPattern extends StatementPattern protected final List freeVars = new ArrayList<>(3); protected FilterValueExpr filterExpr = null; protected QueryBindingSet boundFilters = null; // contains bound filter bindings, that need to be added as - // additional bindings + // additional bindings protected long upperLimit = -1; // if set to a positive number, this upper limit is applied to any subquery public FedXStatementPattern(StatementPattern node, QueryInfo queryInfo) { super(node.getSubjectVar(), node.getPredicateVar(), node.getObjectVar(), node.getContextVar()); + setScope(node.getScope()); this.id = NodeFactory.getNextId(); this.queryInfo = queryInfo; initFreeVars(); @@ -55,8 +56,9 @@ public FedXStatementPattern(StatementPattern node, QueryInfo queryInfo) { public void visitChildren(QueryModelVisitor visitor) throws X { super.visitChildren(visitor); - for (StatementSource s : sort(statementSources)) + for (StatementSource s : sort(statementSources)) { s.visit(visitor); + } if (boundFilters != null) { BoundFiltersNode.visit(visitor, boundFilters); @@ -66,8 +68,9 @@ public void visitChildren(QueryModelVisitor visitor) new UpperLimitNode(upperLimit).visit(visitor); } - if (filterExpr != null) + if (filterExpr != null) { filterExpr.visit(visitor); + } } @Override @@ -77,12 +80,15 @@ public void visit(QueryModelVisitor visitor) } protected void initFreeVars() { - if (getSubjectVar().getValue() == null) + if (getSubjectVar().getValue() == null) { freeVars.add(getSubjectVar().getName()); - if (getPredicateVar().getValue() == null) + } + if (getPredicateVar().getValue() == null) { freeVars.add(getPredicateVar().getName()); - if (getObjectVar().getValue() == null) + } + if (getObjectVar().getValue() == null) { freeVars.add(getObjectVar().getName()); + } } @Override @@ -107,9 +113,11 @@ public String getId() { @Override public boolean hasFreeVarsFor(BindingSet bindings) { - for (String var : freeVars) - if (!bindings.hasBinding(var)) + for (String var : freeVars) { + if (!bindings.hasBinding(var)) { return true; + } + } return false; } @@ -140,9 +148,9 @@ public boolean hasFilter() { @Override public void addFilterExpr(FilterExpr expr) { - if (filterExpr == null) + if (filterExpr == null) { filterExpr = expr; - else if (filterExpr instanceof ConjunctiveFilterExpr) { + } else if (filterExpr instanceof ConjunctiveFilterExpr) { ((ConjunctiveFilterExpr) filterExpr).addExpression(expr); } else if (filterExpr instanceof FilterExpr) { filterExpr = new ConjunctiveFilterExpr((FilterExpr) filterExpr, expr); @@ -165,12 +173,15 @@ public void addBoundFilter(String varName, Value value) { } // visit Var nodes and set value for matching var names - if (getSubjectVar().getName().equals(varName)) + if (getSubjectVar().getName().equals(varName)) { getSubjectVar().setValue(value); - if (getPredicateVar().getName().equals(varName)) + } + if (getPredicateVar().getName().equals(varName)) { getPredicateVar().setValue(value); - if (getObjectVar().getName().equals(varName)) + } + if (getObjectVar().getName().equals(varName)) { getObjectVar().setValue(value); + } boundFilters.addBinding(varName, value); @@ -184,7 +195,7 @@ public void addBoundFilter(String varName, Value value) { /** * Set the upper limit for this statement expression (i.e. applied in the evaluation to individual subqueries of * this expr) - * + * * @param upperLimit the upper limit, a negative number means unlimited */ public void setUpperLimit(long upperLimit) { @@ -192,7 +203,7 @@ public void setUpperLimit(long upperLimit) { } /** - * + * * @return the upper limit or a negative number (meaning no LIMIT) */ public long getUpperLimit() { diff --git a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/algebra/FedXTupleExpr.java b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/algebra/FedXTupleExpr.java index 6d30efbde97..8f56cd20fc6 100644 --- a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/algebra/FedXTupleExpr.java +++ b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/algebra/FedXTupleExpr.java @@ -11,7 +11,7 @@ /** * Interface marking known FedX algebra nodes. - * + * * @author Andreas Schwarte * @see StatementTupleExpr * @see ExclusiveTupleExpr diff --git a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/algebra/FilterExpr.java b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/algebra/FilterExpr.java index 9b194fce4cf..8cf617930b5 100644 --- a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/algebra/FilterExpr.java +++ b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/algebra/FilterExpr.java @@ -17,7 +17,7 @@ /** * FilterExpr maintains information for a particular FILTER expression. - * + * * @author Andreas Schwarte * */ diff --git a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/algebra/FilterTuple.java b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/algebra/FilterTuple.java index e91be353ba7..17b86586254 100644 --- a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/algebra/FilterTuple.java +++ b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/algebra/FilterTuple.java @@ -14,13 +14,13 @@ /** * Expressions implementing this interface can apply some {@link FilterValueExpr} during evaluation. - * + * * @author Andreas Schwarte - * + * * @see StatementSourcePattern * @see ExclusiveStatement * @see ExclusiveGroup - * + * */ public interface FilterTuple { @@ -32,27 +32,27 @@ public interface FilterTuple { /** * register a new filter expression. If the expr has already a filter registered, the new expression is added to a * {@link ConjunctiveFilterExpr}. - * + * * @param expr */ public void addFilterExpr(FilterExpr expr); /** * register a filter that can be directly expressed as a binding, e.g. - * + * * SELECT * WHERE { ?s p o . FILTER (?s = X) } - * + * * is equivalent to - * + * * SELECT * WHERE { X p o . } - * + * * @param varName * @param value */ public void addBoundFilter(String varName, Value value); /** - * + * * @return the currently registered filter expressions, usually of type {@link FilterExpr} or * {@link ConjunctiveFilterExpr} */ @@ -65,7 +65,7 @@ public interface FilterTuple { /** * Returns bound filter bindings, that need to be added as additional bindings to the final result - * + * * @return the bound filters, or null */ public BindingSet getBoundFilters(); diff --git a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/algebra/FilterValueExpr.java b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/algebra/FilterValueExpr.java index f678c86c1ef..1d76b993c67 100644 --- a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/algebra/FilterValueExpr.java +++ b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/algebra/FilterValueExpr.java @@ -12,9 +12,9 @@ /** * Interface to indicate filter expressions. Does not provide methods since implementing classes have different * purposes, this interface is just a marker. - * + * * @author Andreas Schwarte - * + * * @see FilterExpr * @see ConjunctiveFilterExpr */ diff --git a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/algebra/NJoin.java b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/algebra/NJoin.java index 677b13f3c76..dc72656d514 100644 --- a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/algebra/NJoin.java +++ b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/algebra/NJoin.java @@ -18,7 +18,7 @@ /** * A tuple expression that represents an nary-Join. - * + * * @author Andreas Schwarte * */ @@ -28,7 +28,7 @@ public class NJoin extends NTuple implements TupleExpr { /** * Construct an nary-tuple. Note that the parentNode of all arguments is set to this instance. - * + * * @param args */ public NJoin(List args, QueryInfo queryInfo) { @@ -48,7 +48,7 @@ public NJoin clone() { /** * Returns the commons variables of the join with the given index. - * + * * @param joinIndex the join index, starting with 1 * @return the set of join variables */ diff --git a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/algebra/NTuple.java b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/algebra/NTuple.java index f9f9642839b..c95d1ef63d1 100644 --- a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/algebra/NTuple.java +++ b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/algebra/NTuple.java @@ -19,9 +19,9 @@ /** * Base class for any nary-tuple expression - * + * * @author Andreas Schwarte - * + * * @see NJoin * @see NUnion */ @@ -34,15 +34,16 @@ public abstract class NTuple extends AbstractQueryModelNode implements TupleExpr /** * Construct an nary-tuple. Note that the parentNode of all arguments is set to this instance. - * + * * @param args */ public NTuple(List args, QueryInfo queryInfo) { super(); this.queryInfo = queryInfo; this.args = args; - for (TupleExpr expr : args) + for (TupleExpr expr : args) { expr.setParentNode(this); + } } public TupleExpr getArg(int i) { @@ -59,8 +60,9 @@ public int getNumberOfArguments() { @Override public void visitChildren(QueryModelVisitor visitor) throws X { - for (TupleExpr expr : args) + for (TupleExpr expr : args) { expr.visit(visitor); + } } @Override diff --git a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/algebra/NUnion.java b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/algebra/NUnion.java index 6c35a6eda3c..3a71114638b 100644 --- a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/algebra/NUnion.java +++ b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/algebra/NUnion.java @@ -15,7 +15,7 @@ /** * A tuple expression that represents an nary-Union. - * + * * @author Andreas Schwarte * */ @@ -25,7 +25,7 @@ public class NUnion extends NTuple implements TupleExpr { /** * Construct an nary-tuple. Note that the parentNode of all arguments is set to this instance. - * + * * @param args */ public NUnion(List args, QueryInfo queryInfo) { diff --git a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/algebra/NodeFactory.java b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/algebra/NodeFactory.java index 3b152e151f4..b6416ffe73a 100644 --- a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/algebra/NodeFactory.java +++ b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/algebra/NodeFactory.java @@ -12,7 +12,7 @@ /** * A factory that produces globally unique IDS which are used as node identifiers, e.g. in * {@link StatementSourcePattern}. - * + * * @author Andreas Schwarte */ public class NodeFactory { diff --git a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/algebra/PrecompiledQueryNode.java b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/algebra/PrecompiledQueryNode.java index 6d8c133bc5e..106e7241c2d 100644 --- a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/algebra/PrecompiledQueryNode.java +++ b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/algebra/PrecompiledQueryNode.java @@ -13,7 +13,7 @@ /** * Node representing a precompiled query. - * + * * @author Andreas Schwarte * @see SailTripleSource */ diff --git a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/algebra/QueryRef.java b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/algebra/QueryRef.java index ffa251d41db..97592e53da5 100644 --- a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/algebra/QueryRef.java +++ b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/algebra/QueryRef.java @@ -12,7 +12,7 @@ /** * Interface to access the {@link QueryInfo} from all FedX Algebra nodes. All FedX Algebra nodes should implement this * interface. - * + * * @author Andreas Schwarte * */ @@ -20,7 +20,7 @@ public interface QueryRef { /** * Retrieve the attached query information of the tuple expression - * + * * @return the {@link QueryInfo} */ public QueryInfo getQueryInfo(); diff --git a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/algebra/SingleSourceQuery.java b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/algebra/SingleSourceQuery.java index 2ffddc8aaa3..2c6f2ae20be 100644 --- a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/algebra/SingleSourceQuery.java +++ b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/algebra/SingleSourceQuery.java @@ -17,7 +17,7 @@ /** * A query which has a single relevant source. These queries can be sent entirely to the endpoint as-is. - * + * * @author Andreas Schwarte */ public class SingleSourceQuery extends AbstractQueryModelNode implements TupleExpr, QueryRef { diff --git a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/algebra/StatementSource.java b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/algebra/StatementSource.java index 884f01c70f7..92e14aa77de 100644 --- a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/algebra/StatementSource.java +++ b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/algebra/StatementSource.java @@ -12,7 +12,7 @@ /** * A structure representing a relevant source for some expression. - * + * * @author Andreas Schwarte * */ @@ -68,23 +68,30 @@ public int hashCode() { @Override public boolean equals(Object obj) { - if (this == obj) + if (this == obj) { return true; - if (obj == null) + } + if (obj == null) { return false; - if (getClass() != obj.getClass()) + } + if (getClass() != obj.getClass()) { return false; + } StatementSource other = (StatementSource) obj; if (id == null) { - if (other.id != null) + if (other.id != null) { return false; - } else if (!id.equals(other.id)) + } + } else if (!id.equals(other.id)) { return false; + } if (type == null) { - if (other.type != null) + if (other.type != null) { return false; - } else if (!type.equals(other.type)) + } + } else if (!type.equals(other.type)) { return false; + } return true; } diff --git a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/algebra/StatementSourcePattern.java b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/algebra/StatementSourcePattern.java index f00341f0445..bfb161741b4 100644 --- a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/algebra/StatementSourcePattern.java +++ b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/algebra/StatementSourcePattern.java @@ -30,9 +30,9 @@ /** * Represents statements that can produce results at a some particular endpoints, the statement sources. - * + * * @author Andreas Schwarte - * + * * @see StatementSource */ public class StatementSourcePattern extends FedXStatementPattern { @@ -75,12 +75,13 @@ public CloseableIteration evaluate(Binding * efficient to use getStatements(subj, pred, obj) instead of evaluating a prepared query. */ - if (t.usePreparedQuery()) { + if (t.usePreparedQuery(this, queryInfo)) { // queryString needs to be constructed only once for a given bindingset if (preparedQuery == null) { try { - preparedQuery = QueryStringUtil.selectQueryString(this, bindings, filterExpr, isEvaluated); + preparedQuery = QueryStringUtil.selectQueryString(this, bindings, filterExpr, isEvaluated, + queryInfo.getDataset()); } catch (IllegalQueryException e1) { /* all vars are bound, this must be handled as a check query, can occur in joins */ CloseableIteration res = handleStatementSourcePatternCheck( @@ -127,8 +128,9 @@ protected CloseableIteration handleStateme .getEndpointManager() .getEndpoint(source.getEndpointID()); TripleSource t = ownedEndpoint.getTripleSource(); - if (t.hasStatements(this, bindings, queryInfo)) + if (t.hasStatements(this, bindings, queryInfo, queryInfo.getDataset())) { return new SingleBindingSetIteration(bindings); + } } return new EmptyIteration<>(); diff --git a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/algebra/StatementTupleExpr.java b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/algebra/StatementTupleExpr.java index 3900e53d552..df62fe21198 100644 --- a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/algebra/StatementTupleExpr.java +++ b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/algebra/StatementTupleExpr.java @@ -15,7 +15,7 @@ /** * Interface for any expression that can be evaluated - * + * * @author Andreas Schwarte * * @see StatementSourcePattern @@ -36,7 +36,7 @@ public interface StatementTupleExpr extends FedXTupleExpr, QueryRef { /** * returns true iff this statement has free variables in the presence of the specified binding set - * + * * @param binding * @return whether the statement has free vars */ @@ -44,10 +44,10 @@ public interface StatementTupleExpr extends FedXTupleExpr, QueryRef { /** * Evaluate this expression using the provided bindings - * + * * @param bindings * @return the result iteration - * + * * @throws QueryEvaluationException */ public CloseableIteration evaluate(BindingSet bindings) diff --git a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/algebra/TrueStatementPattern.java b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/algebra/TrueStatementPattern.java index 59dd9bd01e8..e9014725044 100644 --- a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/algebra/TrueStatementPattern.java +++ b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/algebra/TrueStatementPattern.java @@ -12,7 +12,7 @@ /** * A TrueStatementPattern represents a stmt with no free variables which in addition is available at one of the provided * sources. - * + * * @author Andreas Schwarte * */ diff --git a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/algebra/VariableExpr.java b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/algebra/VariableExpr.java index 1d423ca8322..ea904cf73b9 100644 --- a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/algebra/VariableExpr.java +++ b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/algebra/VariableExpr.java @@ -13,7 +13,7 @@ /** * Interface for algebra nodes that can return the free variables of the expression. - * + * * @author Andreas Schwarte * @see QueryAlgebraUtil#getFreeVars(org.eclipse.rdf4j.query.algebra.TupleExpr) */ diff --git a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/cache/CacheUtils.java b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/cache/CacheUtils.java index ad9beb09ae7..5d8517b273f 100644 --- a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/cache/CacheUtils.java +++ b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/cache/CacheUtils.java @@ -27,21 +27,25 @@ public class CacheUtils { /** * Perform a "ASK" query for the provided statement to check if the endpoint can provide results. Update the cache * with the new information. - * + * * @param cache * @param endpoint - * @param stmt + * @param subj + * @param pred + * @param obj + * @param queryInfo + * @param contexts * @return * @throws OptimizationException */ private static boolean checkEndpointForResults(SourceSelectionCache cache, Endpoint endpoint, Resource subj, - IRI pred, Value obj, QueryInfo queryInfo) + IRI pred, Value obj, QueryInfo queryInfo, Resource... contexts) throws OptimizationException { try { TripleSource t = endpoint.getTripleSource(); - boolean hasResults = t.hasStatements(subj, pred, obj, queryInfo); + boolean hasResults = t.hasStatements(subj, pred, obj, queryInfo, contexts); - cache.updateInformation(new SubQuery(subj, pred, obj), endpoint, hasResults); + cache.updateInformation(new SubQuery(subj, pred, obj, contexts), endpoint, hasResults); return hasResults; } catch (Exception e) { @@ -53,27 +57,31 @@ private static boolean checkEndpointForResults(SourceSelectionCache cache, Endpo /** * Checks the cache if some endpoint can provide results to the subquery. If the cache has no knowledge a remote ask * query is performed and the cache is updated with appropriate information. - * + * * @param cache * @param endpoints * @param subj * @param pred * @param obj + * @param queryInfo + * @param contexts * @return whether some endpoint can provide results */ public static boolean checkCacheUpdateCache(SourceSelectionCache cache, List endpoints, Resource subj, IRI pred, - Value obj, QueryInfo queryInfo) { + Value obj, QueryInfo queryInfo, Resource... contexts) { - SubQuery q = new SubQuery(subj, pred, obj); + SubQuery q = new SubQuery(subj, pred, obj, contexts); for (Endpoint e : endpoints) { StatementSourceAssurance a = cache.getAssurance(q, e); - if (a == StatementSourceAssurance.HAS_REMOTE_STATEMENTS) + if (a == StatementSourceAssurance.HAS_REMOTE_STATEMENTS) { return true; + } if (a == StatementSourceAssurance.POSSIBLY_HAS_STATEMENTS - && checkEndpointForResults(cache, e, subj, pred, obj, queryInfo)) + && checkEndpointForResults(cache, e, subj, pred, obj, queryInfo, contexts)) { return true; + } } return false; } @@ -81,20 +89,22 @@ && checkEndpointForResults(cache, e, subj, pred, obj, queryInfo)) /** * Checks the cache for relevant statement sources to the provided statement. If the cache has no knowledge ask the * endpoint for further information. - * + * * @param cache * @param endpoints * @param subj * @param pred * @param obj - * + * @param queryInfo + * @param contexts + * * @return the list of relevant statement sources */ public static List checkCacheForStatementSourcesUpdateCache(SourceSelectionCache cache, List endpoints, - Resource subj, IRI pred, Value obj, QueryInfo queryInfo) { + Resource subj, IRI pred, Value obj, QueryInfo queryInfo, Resource... contexts) { - SubQuery q = new SubQuery(subj, pred, obj); + SubQuery q = new SubQuery(subj, pred, obj, contexts); List sources = new ArrayList<>(endpoints.size()); for (Endpoint e : endpoints) { @@ -105,8 +115,9 @@ public static List checkCacheForStatementSourcesUpdateCache(Sou } else if (a == StatementSourceAssurance.POSSIBLY_HAS_STATEMENTS) { // check if the endpoint has results (statistics + ask request) - if (CacheUtils.checkEndpointForResults(cache, e, subj, pred, obj, queryInfo)) + if (CacheUtils.checkEndpointForResults(cache, e, subj, pred, obj, queryInfo, contexts)) { sources.add(new StatementSource(e.getId(), StatementSourceType.REMOTE)); + } } } return sources; diff --git a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/cache/SourceSelectionCache.java b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/cache/SourceSelectionCache.java index 7d68d9ee63c..88a8a9a58ec 100644 --- a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/cache/SourceSelectionCache.java +++ b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/cache/SourceSelectionCache.java @@ -13,7 +13,7 @@ /** * Describes a cache that can be used for {@link SourceSelection} to reduce the number of remote requests. - * + * * @author Andreas Schwarte */ public interface SourceSelectionCache { @@ -40,11 +40,11 @@ public static enum StatementSourceAssurance { * Implementations may infer information by applying logical rules, e.g. if a cache knows that an endpoint can * provide statements {s, foaf:name, "Alan"}, it can also provide results for {s, foaf:name, ?name}. *

    - * + * *

    * If a cache cannot provide information for the given arguments, it must return * {@link StatementSourceAssurance#POSSIBLY_HAS_STATEMENTS} in order to trigger a remote check.

    * Implementations must make sure that any operations are thread-safe *

    - * + * * @param subQuery * @param endpoint * @param hasStatements diff --git a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/cache/SourceSelectionMemoryCache.java b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/cache/SourceSelectionMemoryCache.java index e145f499325..f2262eb5b15 100644 --- a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/cache/SourceSelectionMemoryCache.java +++ b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/cache/SourceSelectionMemoryCache.java @@ -22,7 +22,7 @@ /** * An implementation of {@link SourceSelectionCache} which uses an in memory Guava {@link Cache} as data structure to * maintain information. - * + * * @author Andreas Schwarte * */ @@ -37,7 +37,7 @@ public SourceSelectionMemoryCache() { } /** - * + * * @param cacheSpec a Guava compatible {@link CacheBuilderSpec}, if null the * {@link #DEFAULT_CACHE_SPEC} is used */ @@ -62,8 +62,9 @@ public StatementSourceAssurance getAssurance(SubQuery subQuery, Endpoint endpoin // check if we can infer something from other cached entries // if endpoint does not have data for {?s foaf:name ?o}, it does also not have data for {?s foaf:name "Alan" } if (subQuery.object() != null) { - if (getAssurance(new SubQuery(subQuery.subject(), subQuery.predicate(), null), endpoint) - .equals(StatementSourceAssurance.NONE)) { + if (getAssurance(new SubQuery(subQuery.subject(), subQuery.predicate(), null, subQuery.contexts()), + endpoint) + .equals(StatementSourceAssurance.NONE)) { return StatementSourceAssurance.NONE; } } @@ -104,7 +105,7 @@ private void updateInferredInformation(SubQuery subQuery, Endpoint endpoint, boo /** * Entry representing the state for a sub query - * + * * @author Andreas Schwarte * */ @@ -119,7 +120,7 @@ public void setEndpointInfo(Endpoint e, boolean hasStatements) { /** * The {@link StatementSourceAssurance} for the given {@link Endpoint}, * {@link StatementSourceAssurance#POSSIBLY_HAS_STATEMENTS if unknown. - * + * * @param e * @return */ diff --git a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/endpoint/Endpoint.java b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/endpoint/Endpoint.java index ed30c3d2c82..7282b2ffc8d 100644 --- a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/endpoint/Endpoint.java +++ b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/endpoint/Endpoint.java @@ -15,19 +15,19 @@ import org.eclipse.rdf4j.repository.RepositoryException; /** - * + * * Structure to maintain endpoint information, e.g. {@link Repository} type, location. - * + * *

    * The {@link Repository} to use can be obtained by calling {@link #getRepository()} *

    - * + * *

    * A {@link RepositoryConnection} for interacting with the store can be obtained using {@link #getConnection()}. Note * that typically the {@link TripleSource} of the endpoint should be used. *

    - * - * + * + * * @author Andreas Schwarte * @see ManagedRepositoryEndpoint * @see RepositoryEndpoint @@ -37,7 +37,7 @@ public interface Endpoint { /** - * + * * @return the initialized {@link Repository} */ public Repository getRepository(); @@ -47,68 +47,68 @@ public interface Endpoint { *

    * Callers of this method need to ensure to close the connection after use. *

    - * + * *

    * Typical pattern: *

    - * + * *
     	 * try (RepositoryConnection conn = endpoint.getConnection()) {
     	 * 	// do something with the connection
     	 * }
     	 * 
    - * + * *

    * If the {@link RepositoryConnection} needs to stay open outside the scope of a method (e.g. for streaming * results), consider using {@link CloseDependentConnectionIteration}. *

    - * + * * @return the repository connection - * + * * @throws RepositoryException if the repository is not initialized */ public RepositoryConnection getConnection(); /** - * + * * @return the {@link TripleSource} */ public TripleSource getTripleSource(); /** - * + * * @return the {@link EndpointClassification} */ public EndpointClassification getEndpointClassification(); /** - * + * * @return whether this endpoint is writable */ public boolean isWritable(); /** - * + * * @return the identifier of the federation member */ public String getId(); /** - * + * * @return the name of the federation member */ public String getName(); /** * Get the endpoint location, e.g. for SPARQL endpoints the url - * + * * @return the endpoint location */ public String getEndpoint(); /** * Returns the size of the given repository, i.e. the number of triples. - * + * * @return the size of the endpoint * @throws RepositoryException */ @@ -116,7 +116,7 @@ public interface Endpoint { /** * Initialize this {@link Endpoint} - * + * * @param federationContext * @throws RepositoryException */ @@ -124,20 +124,20 @@ public interface Endpoint { /** * Shutdown this {@link Endpoint} - * + * * @throws RepositoryException */ public void shutDown() throws RepositoryException; /** - * + * * @return whether this Endpoint is initialized */ public boolean isInitialized(); /** * Additional endpoint specific configuration. - * + * * @return the endpointConfiguration */ public EndpointConfiguration getEndpointConfiguration(); diff --git a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/endpoint/EndpointBase.java b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/endpoint/EndpointBase.java index 048fda0b63c..565c2e59d6f 100644 --- a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/endpoint/EndpointBase.java +++ b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/endpoint/EndpointBase.java @@ -22,13 +22,13 @@ /** * Base implementation for an {@link Endpoint}. - * + * *

    * Provides implementation for the common behavior as well as connection management. Typically a fresh * {@link RepositoryConnection} is returned when invoking {@link #getConnection()}, however, it is configurable that a * managed (singleton) connection can be used. *

    - * + * * @author Andreas Schwarte * @see EndpointManager */ @@ -51,6 +51,7 @@ public EndpointBase(RepositoryInformation repoInfo, String endpoint, super(); this.repoInfo = repoInfo; this.endpoint = endpoint; + this.writable = repoInfo.isWritable(); this.endpointClassification = endpointClassification; } @@ -107,8 +108,9 @@ public void setEndpointConfiguration(EndpointConfiguration endpointConfiguration @Override public RepositoryConnection getConnection() { - if (!initialized) + if (!initialized) { throw new FedXRuntimeException("Repository for endpoint " + getId() + " not initialized"); + } if (dependentConn != null) { return this.dependentConn; } @@ -147,8 +149,9 @@ public long size() throws RepositoryException { @Override public void init(FederationContext federationContext) throws RepositoryException { - if (isInitialized()) + if (isInitialized()) { return; + } Repository repo = getRepository(); tripleSource = TripleSourceFactory.tripleSourceFor(this, getType(), federationContext); if (useSingleConnection()) { @@ -159,11 +162,11 @@ public void init(FederationContext federationContext) throws RepositoryException /** * Whether to reuse the same {@link RepositoryConnection} throughout the lifetime of this Endpoint. - * + * *

    * Note that the {@link RepositoryConnection} is wrapped as {@link ManagedRepositoryConnection} *

    - * + * * @return indicator whether a single connection should be used */ protected boolean useSingleConnection() { @@ -172,8 +175,9 @@ protected boolean useSingleConnection() { @Override public void shutDown() throws RepositoryException { - if (!isInitialized()) + if (!isInitialized()) { return; + } if (dependentConn != null) { dependentConn.closeManagedConnection(); dependentConn = null; @@ -192,23 +196,30 @@ public int hashCode() { @Override public boolean equals(Object obj) { - if (this == obj) + if (this == obj) { return true; - if (obj == null) + } + if (obj == null) { return false; - if (getClass() != obj.getClass()) + } + if (getClass() != obj.getClass()) { return false; + } EndpointBase other = (EndpointBase) obj; if (getId() == null) { - if (other.getId() != null) + if (other.getId() != null) { return false; - } else if (!getId().equals(other.getId())) + } + } else if (!getId().equals(other.getId())) { return false; + } if (getType() == null) { - if (other.getType() != null) + if (other.getType() != null) { return false; - } else if (!getType().equals(other.getType())) + } + } else if (!getType().equals(other.getType())) { return false; + } return true; } @@ -220,7 +231,7 @@ public String toString() { /** * A wrapper for managed {@link RepositoryConnection}s which makes sure that {@link #close()} is a no-op, i.e. the * actual closing of the managed connection is controlled by the {@link Endpoint}. - * + * * @author Andreas Schwarte * */ diff --git a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/endpoint/EndpointClassification.java b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/endpoint/EndpointClassification.java index 948c5c67aa2..61f94e07aa5 100644 --- a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/endpoint/EndpointClassification.java +++ b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/endpoint/EndpointClassification.java @@ -9,10 +9,10 @@ /** * Classify endpoints into remote or local ones. - * + * * @author Andreas Schwarte */ public enum EndpointClassification { Local, Remote; -} \ No newline at end of file +} diff --git a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/endpoint/EndpointConfiguration.java b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/endpoint/EndpointConfiguration.java index 5f1c6086ef6..c0d355a9899 100644 --- a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/endpoint/EndpointConfiguration.java +++ b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/endpoint/EndpointConfiguration.java @@ -11,10 +11,10 @@ /** * Additional marker interface for Endpoint Configurations. - * + * * An {@link EndpointConfiguration} may bring additional configuration settings for an {@link Endpoint}, e.g. in the * case of a {@link SparqlTripleSource} it may decide whether ASK or SELECT queries shall be used for source selection. - * + * * @author Andreas Schwarte * */ diff --git a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/endpoint/EndpointFactory.java b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/endpoint/EndpointFactory.java index 257ff17a21a..4f4a9ce3a38 100644 --- a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/endpoint/EndpointFactory.java +++ b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/endpoint/EndpointFactory.java @@ -49,7 +49,7 @@ /** * Utility class providing various methods to create Endpoints to be used as federation members. - * + * * @author Andreas Schwarte * */ @@ -59,12 +59,12 @@ public class EndpointFactory { /** * Construct a SPARQL endpoint using the the provided information. - * + * * @param name a descriptive name, e.g. http://dbpedia * @param endpoint the URL of the SPARQL endpoint, e.g. http://dbpedia.org/sparql - * + * * @return an initialized {@link EndpointBase} containing the repository - * + * * @throws Exception */ public static Endpoint loadSPARQLEndpoint(String name, String endpoint) throws FedXException { @@ -75,18 +75,19 @@ public static Endpoint loadSPARQLEndpoint(String name, String endpoint) throws F /** * Construct a SPARQL endpoint using the the provided information and the host of the url as name. - * + * * @param endpoint the URL of the SPARQL endpoint, e.g. http://dbpedia.org/sparql - * + * * @return an initialized {@link EndpointBase} containing the repository - * + * * @throws FedXException */ public static Endpoint loadSPARQLEndpoint(String endpoint) throws FedXException { try { String id = new URL(endpoint).getHost(); - if (id.equals("localhost")) + if (id.equals("localhost")) { id = id + "_" + new URL(endpoint).getPort(); + } return loadSPARQLEndpoint("http://" + id, endpoint); } catch (MalformedURLException e) { throw new FedXException("Malformed URL: " + endpoint); @@ -94,45 +95,78 @@ public static Endpoint loadSPARQLEndpoint(String endpoint) throws FedXException } public static Endpoint loadRemoteRepository(String repositoryServer, String repositoryName) throws FedXException { + return loadRemoteRepository(repositoryServer, repositoryName, false); + } + + public static Endpoint loadRemoteRepository(String repositoryServer, String repositoryName, boolean writable) + throws FedXException { RemoteRepositoryProvider repProvider = new RemoteRepositoryProvider(); - return repProvider.loadEndpoint(new RemoteRepositoryRepositoryInformation(repositoryServer, repositoryName)); + RemoteRepositoryRepositoryInformation info = new RemoteRepositoryRepositoryInformation(repositoryServer, + repositoryName); + info.setWritable(writable); + return repProvider.loadEndpoint(info); } /** * Load a {@link ResolvableEndpoint} - * + * *

    * The federation must be initialized with a {@link RepositoryResolver} ( see * {@link FedXFactory#withRepositoryResolver(RepositoryResolver)}) and this resolver must offer a Repository with * the id provided by {@link Endpoint#getId()} *

    - * + * *

    * Note that the name is set to "http://" + repositoryId *

    - * + * * @param repositoryId the repository identifier * @return the configured {@link Endpoint} * @see ResolvableRepositoryProvider * @see ResolvableRepositoryInformation */ public static Endpoint loadResolvableRepository(String repositoryId) { + return loadResolvableRepository(repositoryId, false); + } + + /** + * Load a {@link ResolvableEndpoint} + * + *

    + * The federation must be initialized with a {@link RepositoryResolver} ( see + * {@link FedXFactory#withRepositoryResolver(RepositoryResolver)}) and this resolver must offer a Repository with + * the id provided by {@link Endpoint#getId()} + *

    + * + *

    + * Note that the name is set to "http://" + repositoryId + *

    + * + * @param repositoryId the repository identifier + * @param writable whether to configure the endpoint as writable. + * @return the configured {@link Endpoint} + * @see ResolvableRepositoryProvider + * @see ResolvableRepositoryInformation + */ + public static Endpoint loadResolvableRepository(String repositoryId, boolean writable) { ResolvableRepositoryProvider repProvider = new ResolvableRepositoryProvider(); - return repProvider.loadEndpoint(new ResolvableRepositoryInformation(repositoryId)); + ResolvableRepositoryInformation info = new ResolvableRepositoryInformation(repositoryId); + info.setWritable(writable); + return repProvider.loadEndpoint(info); } /** - * Load an {@link EndpointBase} for a given (configured) Repository. + * Load an {@link Endpoint} for a given (configured) Repository. *

    * Note that {@link EndpointType} is set to {@link EndpointType#Other} *

    - * + * *

    * If the repository is already initialized, it is assumed that the lifecycle is managed externally. Otherwise, FedX * will make sure to take care for the lifecycle of the repository, i.e. initialize and shutdown. *

    - * + * * @param id the identifier, e.g. "myRepository" * @param repository the constructed repository * @return the initialized endpoint @@ -154,18 +188,18 @@ public static Endpoint loadEndpoint(String id, Repository repository) /** * Construct a NativeStore endpoint using the provided information. - * + * *

    * If the repository location denotes an absolute path, the native store directory must already exist. If a relative * path is used, the repository is created on the fly (if necessary). *

    - * + * * @param name a descriptive name, e.g. http://dbpedia * @param location the location of the data store, either absolute or relative in a "repositories" subfolder * {@link FedXRepository#getDataDir()} - * + * * @return an initialized endpoint containing the repository - * + * * @throws Exception */ public static Endpoint loadNativeEndpoint(String name, File location) throws FedXException { @@ -177,16 +211,16 @@ public static Endpoint loadNativeEndpoint(String name, File location) throws Fed /** * Construct a {@link NativeStore} endpoint using the provided information and the file location as name. - * + * *

    * If the repository location denotes an absolute path, the native store directory must already exist. If a relative * path is used, the repository is created on the fly (if necessary). *

    - * + * * @param location the location of the data store - * + * * @return an initialized endpoint containing the repository - * + * * @throws Exception */ public static Endpoint loadNativeEndpoint(File location) throws FedXException { @@ -195,25 +229,26 @@ public static Endpoint loadNativeEndpoint(File location) throws FedXException { /** * Utility function to load federation members from a data configuration file. - * + * *

    * A data configuration file provides information about federation members in form of turtle. Currently the types * NativeStore, ResolvableEndpoint and SPARQLEndpoint are supported. For details please refer to the documentation * in {@link NativeRepositoryInformation}, {@link ResolvableRepositoryInformation} and * {@link SPARQLRepositoryInformation}. *

    - * + * * @param dataConfig - * + * * @return a list of initialized endpoints, i.e. the federation members - * + * * @throws IOException * @throws Exception */ public static List loadFederationMembers(File dataConfig, File fedXBaseDir) throws FedXException { - if (!dataConfig.exists()) + if (!dataConfig.exists()) { throw new FedXRuntimeException("File does not exist: " + dataConfig.getAbsolutePath()); + } Model graph = new TreeModel(); RDFParser parser = Rio.createParser(RDFFormat.TURTLE); @@ -235,7 +270,7 @@ public static List loadFederationMembers(File dataConfig, File fedXBas * the documentation in {@link NativeRepositoryInformation}, {@link ResolvableRepositoryInformation} and * {@link SPARQLRepositoryInformation}. *

    - * + * * @param members * @param baseDir * @return list of endpoints @@ -244,7 +279,7 @@ public static List loadFederationMembers(File dataConfig, File fedXBas public static List loadFederationMembers(Model members, File baseDir) throws FedXException { List res = new ArrayList<>(); - for (Statement st : members.filter(null, Vocabulary.FEDX.STORE, null)) { + for (Statement st : members.getStatements(null, Vocabulary.FEDX.STORE, null)) { Endpoint e = loadEndpoint(members, st.getSubject(), st.getObject(), baseDir); res.add(e); } @@ -285,9 +320,7 @@ else if (repType.equals(FedXUtil.literal("Other"))) { // TODO add reflection techniques to allow for flexibility throw new UnsupportedOperationException("Operation not yet supported for generic type."); - } - - else { + } else { throw new FedXRuntimeException("Repository type not supported: " + repType.stringValue()); } @@ -295,12 +328,12 @@ else if (repType.equals(FedXUtil.literal("Other"))) { /** * Construct a unique id for the provided SPARQL Endpoint, e.g - * + * * http://dbpedia.org/ => %type%_dbpedia.org - * + * * @param endpointID * @param type the repository type, e.g. native, sparql, etc - * + * * @return the ID for the SPARQL endpoint */ public static String getId(String endpointID, String type) { diff --git a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/endpoint/EndpointType.java b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/endpoint/EndpointType.java index 9a732ae9cf0..e4478201394 100644 --- a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/endpoint/EndpointType.java +++ b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/endpoint/EndpointType.java @@ -12,7 +12,7 @@ /** * Information about the type of an endpoint - * + * * @author Andreas Schwarte * */ @@ -31,7 +31,7 @@ private EndpointType(List formatNames) { /** * Returns true if the endpoint type supports the given format (e.g. mime-type). Consider as an example the * SparqlEndpoint which supports format "api/sparql". - * + * * @param format * @return true if the endpoint supports the given format */ @@ -41,16 +41,19 @@ public boolean supportsFormat(String format) { /** * returns true if the given format is supported by some repository type. - * + * * @param format * @return wheter the given format is supported */ public static boolean isSupportedFormat(String format) { - if (format == null) + if (format == null) { return false; - for (EndpointType e : values()) - if (e.supportsFormat(format)) + } + for (EndpointType e : values()) { + if (e.supportsFormat(format)) { return true; + } + } return false; } -} \ No newline at end of file +} diff --git a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/endpoint/ManagedRepositoryEndpoint.java b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/endpoint/ManagedRepositoryEndpoint.java index b5931c9bb64..1b0dde7a732 100644 --- a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/endpoint/ManagedRepositoryEndpoint.java +++ b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/endpoint/ManagedRepositoryEndpoint.java @@ -15,7 +15,7 @@ /** * A specialized {@link RepositoryEndpoint} where the lifecycle of the {@link Repository} is managed by this endpoint, * i.e. this instance takes care for initialize and shutdown of the repository. - * + * * @author Andreas Schwarte * @see RepositoryEndpoint */ diff --git a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/endpoint/RepositoryEndpoint.java b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/endpoint/RepositoryEndpoint.java index ca3154bc24d..4e93efa8977 100644 --- a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/endpoint/RepositoryEndpoint.java +++ b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/endpoint/RepositoryEndpoint.java @@ -12,12 +12,12 @@ /** * A specialized {@link Endpoint} that has a reference to a configured {@link Repository}. - * + * *

    * Note that this implementation does not take care for the lifecycle of the repository. If the lifecycle of the * {@link Repository} should be managed by FedX, consider using {@link ManagedRepositoryEndpoint} *

    - * + * * @author Andreas Schwarte * */ diff --git a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/endpoint/ResolvableEndpoint.java b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/endpoint/ResolvableEndpoint.java index 557b91c5503..e6152263bb6 100644 --- a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/endpoint/ResolvableEndpoint.java +++ b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/endpoint/ResolvableEndpoint.java @@ -17,7 +17,7 @@ *

    * The Repository lifecycle is assumed to be managed externally. *

    - * + * * @author Andreas Schwarte * */ diff --git a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/endpoint/SparqlEndpointConfiguration.java b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/endpoint/SparqlEndpointConfiguration.java index f4e76e27a69..e6859281f38 100644 --- a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/endpoint/SparqlEndpointConfiguration.java +++ b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/endpoint/SparqlEndpointConfiguration.java @@ -11,7 +11,7 @@ /** * Additional {@link EndpointConfiguration} for SPARQL endpoints. - * + * * @author Andreas Schwarte * */ @@ -22,7 +22,7 @@ public class SparqlEndpointConfiguration implements EndpointConfiguration { /** * Flag indicating whether ASK queries are supported. Specific {@link TripleSource} implementations may use this * information to decide whether to use ASK or SELECT for source selection. - * + * * @return boolean indicating whether ASK queries are supported */ public boolean supportsASKQueries() { @@ -31,7 +31,7 @@ public boolean supportsASKQueries() { /** * Define whether this endpoint supports ASK queries. - * + * * @param flag */ public void setSupportsASKQueries(boolean flag) { diff --git a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/endpoint/provider/EndpointProvider.java b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/endpoint/provider/EndpointProvider.java index 42684439fde..0629fde1640 100644 --- a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/endpoint/provider/EndpointProvider.java +++ b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/endpoint/provider/EndpointProvider.java @@ -12,7 +12,7 @@ /** * Generic interface to create {@link Endpoint}s from a repository information. - * + * * @author Andreas Schwarte * */ diff --git a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/endpoint/provider/NativeRepositoryInformation.java b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/endpoint/provider/NativeRepositoryInformation.java index 690679f348b..f4cd98b1ea0 100644 --- a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/endpoint/provider/NativeRepositoryInformation.java +++ b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/endpoint/provider/NativeRepositoryInformation.java @@ -7,45 +7,49 @@ *******************************************************************************/ package org.eclipse.rdf4j.federated.endpoint.provider; +import static org.eclipse.rdf4j.model.util.Models.getPropertyLiteral; +import static org.eclipse.rdf4j.model.util.Models.getPropertyString; + import java.io.File; import org.eclipse.rdf4j.federated.endpoint.EndpointType; import org.eclipse.rdf4j.federated.repository.FedXRepository; import org.eclipse.rdf4j.federated.util.Vocabulary; +import org.eclipse.rdf4j.model.Literal; import org.eclipse.rdf4j.model.Model; import org.eclipse.rdf4j.model.Resource; import org.eclipse.rdf4j.sail.nativerdf.NativeStore; /** * Graph information for RDF4J {@link NativeStore} initialization. - * + * *

    * Format: *

    - * + * *
      * <%name%> a sd:Service ;
      *  	fedx:store "NativeStore" ;
      *  	fedx:RepositoryLocation "%location%".
    - * 
    + *
      * relative path (to {@link FedXRepository#getDataDir()}) in a "repositories" subfolder
    - * 
    + *
      *  a sd:Service ;
      *  	fedx:store "NativeStore" ;
      *  	fedx:repositoryLocation "data\\repositories\\native-storage.dbpedia".
    - *  
    + *
      * absolute Path
    - * 
    + *
      *  a sd:Service ;
      *  	fedx:store "NativeStore" ;
      *  	fedx:repositoryLocation "D:\\data\\repositories\\native-storage.dbpedia".
      * 
    - * + * *

    * Note: the id is constructed from the location: repositories\\native-storage.dbpedia => native-storage.dbpedia *

    - * - * + * + * * @author Andreas Schwarte * */ @@ -65,12 +69,15 @@ protected void initialize(Model graph, Resource repNode) { // name: the node's value setProperty("name", repNode.stringValue()); + setWritable(getPropertyLiteral(graph, repNode, Vocabulary.FEDX.WRITABLE) + .map(Literal::booleanValue) + .orElse(false)); + // location - Model location = graph.filter(repNode, Vocabulary.FEDX.REPOSITORY_LOCATION, null); - String repoLocation = location.iterator().next().getObject().stringValue(); - setProperty("location", repoLocation); + String location = getPropertyString(graph, repNode, Vocabulary.FEDX.REPOSITORY_LOCATION).orElse(null); + setProperty("location", location); // id: the name of the location - setProperty("id", new File(repoLocation).getName()); + setProperty("id", new File(location).getName()); } } diff --git a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/endpoint/provider/NativeStoreProvider.java b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/endpoint/provider/NativeStoreProvider.java index aca7382e7fd..e2f35494980 100644 --- a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/endpoint/provider/NativeStoreProvider.java +++ b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/endpoint/provider/NativeStoreProvider.java @@ -25,12 +25,12 @@ * Provider for an Endpoint that uses a RDF4J {@link NativeStore} as underlying repository. For optimization purposes * the {@link SailSourceEvaluationStrategyFactory} is used to allow for evaluation of prepared queries without prior * optimization. Note that NativeStores are always classified as 'Local'. - * + * *

    * If the repository location denotes an absolute path, the native store directory must already exist. If a relative * path is used, the repository is created on the fly (if necessary). *

    - * + * * @author Andreas Schwarte */ public class NativeStoreProvider implements EndpointProvider { @@ -96,7 +96,7 @@ public Endpoint loadEndpoint(NativeRepositoryInformation repoInfo) throws FedXEx /** * Create a {@link NativeStore} and apply the {@link SailSourceEvaluationStrategyFactory}. - * + * * @param store * @return the store */ diff --git a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/endpoint/provider/RemoteRepositoryProvider.java b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/endpoint/provider/RemoteRepositoryProvider.java index aef4030f66b..86939e5da74 100644 --- a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/endpoint/provider/RemoteRepositoryProvider.java +++ b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/endpoint/provider/RemoteRepositoryProvider.java @@ -19,7 +19,7 @@ /** * Provider for an Endpoint that uses a RDF4J {@link HTTPRepository} as underlying repository. All SPARQL endpoints are * considered Remote. - * + * * @author Andreas Schwarte */ public class RemoteRepositoryProvider implements EndpointProvider { @@ -31,9 +31,10 @@ public Endpoint loadEndpoint(RemoteRepositoryRepositoryInformation repoInfo) String repositoryServer = repoInfo.get("repositoryServer"); String repositoryName = repoInfo.get("repositoryName"); - if (repositoryServer == null || repositoryName == null) + if (repositoryServer == null || repositoryName == null) { throw new FedXException("Invalid configuration, repositoryServer and repositoryName are required for " + repoInfo.getName()); + } try { HTTPRepository repo = new HTTPRepository(repositoryServer, repositoryName); diff --git a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/endpoint/provider/RemoteRepositoryRepositoryInformation.java b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/endpoint/provider/RemoteRepositoryRepositoryInformation.java index 3e82b2bef3e..8689ddbb934 100644 --- a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/endpoint/provider/RemoteRepositoryRepositoryInformation.java +++ b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/endpoint/provider/RemoteRepositoryRepositoryInformation.java @@ -15,28 +15,28 @@ /** * Class holding information for RDF4J {@link HTTPRepository} initialization. - * + * *

    * Format: *

    - * + * *
      * <%name%> a sd:Service ;
      *  	fedx:store "RemoteRepository" ;
      *  	fedx:repositoryServer "%location%" ;
      *  	fedx:repositoryName "%name%" .
    - * 
    + *
      *  a sd:Service ;
      *  	fedx:store "RemoteRepository";
      *  	fedx:repositoryServer "http:///openrdf-sesame" ;
      *  	fedx:repositoryName "dbpedia" .
      * 
    - * + * *

    * Note: the id is constructed from the name: http://dbpedia.org/ => remote_dbpedia.org *

    - * - * + * + * * @author Andreas Schwarte * */ diff --git a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/endpoint/provider/RepositoryEndpointProvider.java b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/endpoint/provider/RepositoryEndpointProvider.java index 7ed73eaa385..277504e1d77 100644 --- a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/endpoint/provider/RepositoryEndpointProvider.java +++ b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/endpoint/provider/RepositoryEndpointProvider.java @@ -18,13 +18,13 @@ /** * Returns an {@link Endpoint} for an already configured {@link Repository}. - * + * *

    * If the repository is already initialized, it is assumed that the lifecycle is managed externally (see * {@link RepositoryEndpoint}. Otherwise, FedX will make sure to take care for the lifecycle of the repository, i.e. * initialize and shutdown (see {@link ManagedRepositoryEndpoint}). *

    - * + * * @author Andreas Schwarte * @see RepositoryEndpoint * @see ManagedRepositoryEndpoint diff --git a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/endpoint/provider/RepositoryInformation.java b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/endpoint/provider/RepositoryInformation.java index 7b8330d1eec..6c689708add 100644 --- a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/endpoint/provider/RepositoryInformation.java +++ b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/endpoint/provider/RepositoryInformation.java @@ -18,6 +18,8 @@ public class RepositoryInformation { private EndpointType type = EndpointType.Other; // the endpoint type, default Other private EndpointConfiguration endpointConfiguration; // optional configuration settings for the endpoint + private boolean writable; + public RepositoryInformation(String id, String name, String location, EndpointType type) { props.setProperty("id", id); props.setProperty("name", name); @@ -71,4 +73,18 @@ public void setProperty(String key, String value) { public void setType(EndpointType type) { this.type = type; } + + /** + * @return the writable + */ + public boolean isWritable() { + return writable; + } + + /** + * @param writable the writable to set + */ + public void setWritable(boolean writable) { + this.writable = writable; + } } diff --git a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/endpoint/provider/ResolvableRepositoryInformation.java b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/endpoint/provider/ResolvableRepositoryInformation.java index ec040ab2fb9..b48d2e2470a 100644 --- a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/endpoint/provider/ResolvableRepositoryInformation.java +++ b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/endpoint/provider/ResolvableRepositoryInformation.java @@ -19,19 +19,19 @@ * Graph information for a {@link ResolvableEndpoint} where the {@link Repository} is looked up using the configured * {@link RepositoryResolver}. *

    - * + * * Format: *

    - * + * *

      * @prefix sd: <http://www.w3.org/ns/sparql-service-description#> .
      * @prefix fedx: <http://www.fluidops.com/config/fedx#> .
    - * 
    + *
      * <http://myname> a sd:Service ;
      *  	fedx:store "ResolvableRepository";
      *  	fedx:repositoryName "myRepoId"
      * 
    - * + * * @author Andreas Schwarte * @see ResolvableEndpoint * @see ResolvableRepositoryProvider diff --git a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/endpoint/provider/ResolvableRepositoryProvider.java b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/endpoint/provider/ResolvableRepositoryProvider.java index 50b957807c2..772612ce387 100644 --- a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/endpoint/provider/ResolvableRepositoryProvider.java +++ b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/endpoint/provider/ResolvableRepositoryProvider.java @@ -16,13 +16,13 @@ /** * An {@link EndpointProvider} for a {@link ResolvableEndpoint}. - * + * *

    * The federation must be initialized with a {@link RepositoryResolver} ( see * {@link FedXFactory#withRepositoryResolver(RepositoryResolver)}) and this resolver must offer a Repository with the id * provided by {@link Endpoint#getId()} *

    - * + * * @author Andreas Schwarte * */ diff --git a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/endpoint/provider/SPARQLProvider.java b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/endpoint/provider/SPARQLProvider.java index 757ec23a4ac..8e7babd180c 100644 --- a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/endpoint/provider/SPARQLProvider.java +++ b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/endpoint/provider/SPARQLProvider.java @@ -23,10 +23,10 @@ * Provider for an Endpoint that uses a RDF4j {@link SPARQLRepository} as underlying repository. All SPARQL endpoints * are considered Remote. *

    - * + * * This {@link SPARQLProvider} implements special hard-coded endpoint configuration for the DBpedia endpoint: the * support for ASK queries is always set to false. - * + * * @author Andreas Schwarte */ public class SPARQLProvider implements EndpointProvider { @@ -65,7 +65,7 @@ public Endpoint loadEndpoint(SPARQLRepositoryInformation repoInfo) /** * Manipulate the endpoint configuration for certain common endpoints, e.g. DBpedia => does not support ASK queries - * + * * @param location * @param ep * @return diff --git a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/endpoint/provider/SPARQLRepositoryInformation.java b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/endpoint/provider/SPARQLRepositoryInformation.java index 85633291dfd..fbc972f4b9b 100644 --- a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/endpoint/provider/SPARQLRepositoryInformation.java +++ b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/endpoint/provider/SPARQLRepositoryInformation.java @@ -20,32 +20,32 @@ *

    * Format: *

    - * + * *
      * @prefix sd:  .
      * @prefix fedx: .
    - * 
    + *
      * <%name%> a sd:Service ;
      *  	fedx:store "SPARQLEndpoint";
      *  	sd:endpoint "%location%"
    - * 
    + *
      *  a sd:Service ;
      *  	fedx:store "SPARQLEndpoint";
      *  	sd:endpoint "http://dbpedia.org/sparql".
      * 
    - * + * * Note: the id is constructed from the name: http://dbpedia.org/ => sparql_dbpedia.org *

    - * - * + * + * * The following properties can be used to define additional endpoint settings. *

    - * + * *

      * fedx:supportsASKQueries => "true"|"false" (default: true)
      * 
    - * - * + * + * * @author Andreas Schwarte * */ @@ -82,8 +82,9 @@ protected void initialize(Model graph, Resource repNode) { if (graph.contains(repNode, Vocabulary.FEDX.SUPPORTS_ASK_QUERIES, FedXUtil.literal("false")) || graph.contains(repNode, Vocabulary.FEDX.SUPPORTS_ASK_QUERIES, - FedXUtil.valueFactory().createLiteral(false))) + FedXUtil.valueFactory().createLiteral(false))) { c.setSupportsASKQueries(false); + } setEndpointConfiguration(c); } @@ -95,7 +96,7 @@ protected boolean hasAdditionalSettings(Model graph, Resource repNode) { /** * Derive an identifier from the endpoint - * + * * @param endpoint * @return the identifier */ diff --git a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/endpoint/provider/SailSourceEvaluationStrategyFactory.java b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/endpoint/provider/SailSourceEvaluationStrategyFactory.java index 28c99ecc5bc..26dae08e30e 100644 --- a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/endpoint/provider/SailSourceEvaluationStrategyFactory.java +++ b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/endpoint/provider/SailSourceEvaluationStrategyFactory.java @@ -34,7 +34,7 @@ * All other types of {@link TupleExpr} are optimized and evaluated through the configured delegate strategy, i.e. * typically the one provided by the sail itself. *

    - * + * * @author Andreas Schwarte * @see NativeStoreProvider */ @@ -78,7 +78,7 @@ public EvaluationStrategy createEvaluationStrategy(Dataset dataset, TripleSource /** * {@link EvaluationStrategy} that can handle {@link PrecompiledQueryNode} without prior optimization. All other * {@link TupleExpr} are handled in the respective delegate. - * + * * @author Andreas Schwarte * */ diff --git a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/DelegateFederatedServiceResolver.java b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/DelegateFederatedServiceResolver.java index a36d207547a..031e929e692 100644 --- a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/DelegateFederatedServiceResolver.java +++ b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/DelegateFederatedServiceResolver.java @@ -19,7 +19,7 @@ /** * A {@link FederatedServiceResolver} which redirects SERVICE requests to the federation member (if the SERVICE IRI * correspond to a member) or to the provided delegate. - * + * * @author as * */ @@ -88,17 +88,18 @@ protected boolean isFedXEndpoint(String serviceUrl) { /** * Return the FedX endpoint corresponding to the given service URI. If there is no such endpoint in FedX, this * method returns null. - * + * * Note that this method compares the endpoint URL first, however, that the name of the endpoint can be used as * identifier as well. Note that the name must be a valid URI, i.e. start with http:// - * + * * @param serviceUri * @return */ private Endpoint getFedXEndpoint(String serviceUri) { Endpoint e = endpointManager.getEndpointByUrl(serviceUri); - if (e != null) + if (e != null) { return e; + } e = endpointManager.getEndpointByName(serviceUri); return e; } diff --git a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/FederationEvalStrategy.java b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/FederationEvalStrategy.java index e47305d0fb9..2ee1502e3ee 100644 --- a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/FederationEvalStrategy.java +++ b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/FederationEvalStrategy.java @@ -80,6 +80,7 @@ import org.eclipse.rdf4j.query.MalformedQueryException; import org.eclipse.rdf4j.query.QueryEvaluationException; import org.eclipse.rdf4j.query.algebra.QueryRoot; +import org.eclipse.rdf4j.query.algebra.Service; import org.eclipse.rdf4j.query.algebra.TupleExpr; import org.eclipse.rdf4j.query.algebra.ValueExpr; import org.eclipse.rdf4j.query.algebra.Var; @@ -104,9 +105,9 @@ /** * Base class for the Evaluation strategies. - * + * * @author Andreas Schwarte - * + * * @see SailFederationEvalStrategy * @see SparqlFederationEvalStrategy * @@ -145,7 +146,7 @@ public ValueFactory getValueFactory() { /** * Create the {@link SourceSelectionCache} - * + * * @return the {@link SourceSelectionCache} * @see FedXConfig#getSourceSelectionCacheSpec() */ @@ -188,15 +189,16 @@ public TupleExpr optimize(TupleExpr expr, EvaluationStatistics evaluationStatist info.optimize(query); // if the federation has a single member only, evaluate the entire query there - if (members.size() == 1 && queryInfo.getQuery() != null && !info.hasService() - && queryInfo.getQueryType() != QueryType.UPDATE) + if (members.size() == 1 && queryInfo.getQuery() != null && propagateServices(info.getServices()) + && queryInfo.getQueryType() != QueryType.UPDATE) { return new SingleSourceQuery(expr, members.get(0), queryInfo); + } if (log.isTraceEnabled()) { log.trace("Query before Optimization: " + query); } - /* original sesame optimizers */ + /* original RDF4J optimizers */ new ConstantOptimizer(this).optimize(query, dataset, bindings); // maybe remove this optimizer later new DisjunctiveConstraintOptimizer().optimize(query, dataset, bindings); @@ -208,15 +210,18 @@ public TupleExpr optimize(TupleExpr expr, EvaluationStatistics evaluationStatist /* custom optimizers, execute only when needed */ - // if the query has a single relevant source (and if it is no a SERVICE query), evaluate at this source only + // if the query has a single relevant source (and if it is not a SERVICE query), evaluate at this source only // Note: UPDATE queries are always handled in the federation engine to adhere to the configured // write strategy Set relevantSources = performSourceSelection(members, cache, queryInfo, info); - if (relevantSources.size() == 1 && !info.hasService() && queryInfo.getQueryType() != QueryType.UPDATE) + if (relevantSources.size() == 1 && propagateServices(info.getServices()) + && queryInfo.getQueryType() != QueryType.UPDATE) { return new SingleSourceQuery(query, relevantSources.iterator().next(), queryInfo); + } - if (info.hasService()) + if (info.hasService()) { new ServiceOptimizer(queryInfo).optimize(query); + } // optimize unions, if available if (info.hasUnion()) { @@ -235,8 +240,9 @@ public TupleExpr optimize(TupleExpr expr, EvaluationStatistics evaluationStatist // optimize Filters, if available // Note: this is done after the join order is determined to ease filter pushing - if (info.hasFilter()) + if (info.hasFilter()) { new FilterOptimizer().optimize(query); + } if (log.isTraceEnabled()) { log.trace("Query after Optimization: " + query); @@ -248,7 +254,7 @@ public TupleExpr optimize(TupleExpr expr, EvaluationStatistics evaluationStatist /** * Perform source selection for all statements of the query. As a result of this method all statement nodes are * annotated with their relevant sources. - * + * * @param members * @param cache * @param queryInfo @@ -271,9 +277,28 @@ protected void optimizeJoinOrder(TupleExpr query, QueryInfo queryInfo, GenericIn new StatementGroupAndJoinOptimizer(queryInfo, DefaultFedXCostModel.INSTANCE).optimize(query); } + /** + * Whether to propagate a {@link SingleSourceQuery} containing SERVICE clauses. By default, the query is always + * evaluated within the FedX engine if it contains a SERVICE clause. + *

    + * Customized implementation may propagate a {@link SingleSourceQuery} including the SERVICE clause (e.g. for + * Wikidata the Label service can only be accessed in the wikidata endpoint. + *

    + * + * @param serviceNodes + * @return if true, a {@link SingleSourceQuery} containing SERVICE clauses is propagated as-is + */ + protected boolean propagateServices(List serviceNodes) { + boolean hasServices = serviceNodes != null && !serviceNodes.isEmpty(); + if (hasServices) { + return false; + } + return true; + } + /** * Optimize {@link ExclusiveTupleExpr}, e.g. restructure the exclusive parts of the query AST. - * + * * @param query * @param queryInfo * @param info @@ -312,15 +337,17 @@ public CloseableIteration evaluate( return evaluateLeftJoin((FedXLeftJoin) expr, bindings); } - if (expr instanceof SingleSourceQuery) + if (expr instanceof SingleSourceQuery) { return evaluateSingleSourceQuery((SingleSourceQuery) expr, bindings); + } if (expr instanceof FedXService) { return evaluateService((FedXService) expr, bindings); } - if (expr instanceof EmptyResult) + if (expr instanceof EmptyResult) { return new EmptyIteration<>(); + } return super.evaluate(expr, bindings); } @@ -328,20 +355,20 @@ public CloseableIteration evaluate( /** * Retrieve the statements matching the provided subject, predicate and object value from the federation members. *

    - * + * * For a bound statement, i.e. a statement with no free variables, the statement itself is returned if some member * has this statement, an empty iteration otherwise. *

    - * + * * If the statement has free variables, i.e. one of the provided arguments in null, the union of * results from relevant statement sources is constructed. - * + * * @param subj * @param pred * @param obj * @param contexts * @return the statement iteration - * + * * @throws RepositoryException * @throws MalformedQueryException * @throws QueryEvaluationException @@ -350,15 +377,12 @@ public CloseableIteration getStatements(Que IRI pred, Value obj, Resource... contexts) throws RepositoryException, MalformedQueryException, QueryEvaluationException { - if (contexts.length != 0) - log.warn("Context queries are not yet supported by FedX."); - List members = federationContext.getFederation().getMembers(); // a bound query: if at least one fed member provides results // return the statement, otherwise empty result if (subj != null && pred != null && obj != null) { - if (CacheUtils.checkCacheUpdateCache(cache, members, subj, pred, obj, queryInfo)) { + if (CacheUtils.checkCacheUpdateCache(cache, members, subj, pred, obj, queryInfo, contexts)) { return new SingletonIteration<>( FedXUtil.valueFactory().createStatement(subj, pred, obj)); } @@ -367,10 +391,11 @@ public CloseableIteration getStatements(Que // form the union of results from relevant endpoints List sources = CacheUtils.checkCacheForStatementSourcesUpdateCache(cache, members, subj, pred, - obj, queryInfo); + obj, queryInfo, contexts); - if (sources.isEmpty()) + if (sources.isEmpty()) { return new EmptyIteration<>(); + } if (sources.size() == 1) { Endpoint e = federationContext.getEndpointManager().getEndpoint(sources.get(0).getEndpointID()); @@ -434,7 +459,7 @@ public CloseableIteration evaluateNJoin(NJ /** * Evaluate a {@link FedXLeftJoin} (i.e. an OPTIONAL clause) - * + * * @param leftJoin * @param bindings * @return the resulting iteration @@ -446,7 +471,7 @@ protected CloseableIteration evaluateLeftJ /* * NOTE: this implementation is taken from StrictEvaluationStrategy.evaluate(LeftJoin, BindingSet) - * + * * However, we have to take care for some concurrency scheduling to guarantee the order in which subqueries are * executed. */ @@ -501,15 +526,15 @@ public CloseableIteration evaluateNaryUnio /** * Execute the join in a separate thread using some join executor. - * + * * Join executors are for instance: - {@link SynchronousJoin} - {@link SynchronousBoundJoin} - * {@link ControlledWorkerJoin} - {@link ControlledWorkerBoundJoin} * * For endpoint federation use controlled worker bound join, for local federation use controlled worker join. The * other operators are there for completeness. - * + * * Use {@link FederationEvalStrategy#executor} to execute the join (it is a runnable). - * + * * @param joinScheduler * @param leftIter * @param rightArg @@ -530,7 +555,7 @@ public abstract CloseableIteration evaluat /** * Evaluate an {@link ExclusiveTupleExpr}. The default implementation converts the given expression to a SELECT * query string and evaluates it at the source. - * + * * @param expr * @param bindings * @return the result @@ -561,13 +586,14 @@ protected CloseableIteration evaluateExclu FilterValueExpr filterValueExpr = null; // TODO consider optimization using FilterTuple String preparedQuery = QueryStringUtil.selectQueryString((ExclusiveTupleExprRenderer) expr, bindings, filterValueExpr, - isEvaluated); + isEvaluated, expr.getQueryInfo().getDataset()); return t.getStatements(preparedQuery, bindings, (isEvaluated.get() ? null : filterValueExpr), expr.getQueryInfo()); } catch (IllegalQueryException e) { /* no projection vars, e.g. local vars only, can occur in joins */ - if (t.hasStatements(expr, bindings)) + if (t.hasStatements(expr, bindings)) { return new SingleBindingSetIteration(bindings); + } return new EmptyIteration<>(); } } @@ -575,7 +601,7 @@ protected CloseableIteration evaluateExclu /** * Evaluate a bound join at the relevant endpoint, i.e. i.e. for a group of bindings retrieve results for the bound * statement from the relevant endpoints - * + * * @param stmt * @param bindings * @return the result iteration @@ -587,7 +613,7 @@ public abstract CloseableIteration evaluat /** * Perform a grouped check at the relevant endpoints, i.e. for a group of bindings keep only those for which at * least one endpoint provides a result to the bound statement. - * + * * @param stmt * @param bindings * @return the result iteration @@ -598,9 +624,9 @@ public abstract CloseableIteration evaluat /** * Evaluate a SERVICE using vectored evaluation, taking the provided bindings as input. - * + * * See {@link ControlledWorkerBoundJoin} and {@link FedXConfig#getEnableServiceAsBoundJoin()} - * + * * @param service * @param bindings * @return the result iteration @@ -632,10 +658,12 @@ public CloseableIteration evaluateService( public Value evaluate(ValueExpr expr, BindingSet bindings) throws ValueExprEvaluationException, QueryEvaluationException { - if (expr instanceof FilterExpr) + if (expr instanceof FilterExpr) { return evaluate((FilterExpr) expr, bindings); - if (expr instanceof ConjunctiveFilterExpr) + } + if (expr instanceof ConjunctiveFilterExpr) { return evaluate((ConjunctiveFilterExpr) expr, bindings); + } return super.evaluate(expr, bindings); } @@ -664,18 +692,21 @@ public Value evaluate(ConjunctiveFilterExpr node, BindingSet bindings) } } - if (error != null) + if (error != null) { throw error; + } return BooleanLiteral.TRUE; } protected CloseableIteration evaluateAtStatementSources(Object preparedQuery, List statementSources, QueryInfo queryInfo) throws QueryEvaluationException { - if (preparedQuery instanceof String) + if (preparedQuery instanceof String) { return evaluateAtStatementSources((String) preparedQuery, statementSources, queryInfo); - if (preparedQuery instanceof TupleExpr) + } + if (preparedQuery instanceof TupleExpr) { return evaluateAtStatementSources((TupleExpr) preparedQuery, statementSources, queryInfo); + } throw new RuntimeException( "Unsupported type for prepared query: " + preparedQuery.getClass().getCanonicalName()); } @@ -692,9 +723,7 @@ protected CloseableIteration evaluateAtSta org.eclipse.rdf4j.federated.evaluation.TripleSource t = ownedEndpoint.getTripleSource(); result = t.getStatements(preparedQuery, EmptyBindingSet.getInstance(), (FilterValueExpr) null, queryInfo); - } - - else { + } else { WorkerUnionBase union = federationContext.getManager().createWorkerUnion(queryInfo); for (StatementSource source : statementSources) { @@ -728,9 +757,7 @@ protected CloseableIteration evaluateAtSta .getEndpoint(statementSources.get(0).getEndpointID()); org.eclipse.rdf4j.federated.evaluation.TripleSource t = ownedEndpoint.getTripleSource(); result = t.getStatements(preparedQuery, EmptyBindingSet.getInstance(), null, queryInfo); - } - - else { + } else { WorkerUnionBase union = federationContext.getManager().createWorkerUnion(queryInfo); for (StatementSource source : statementSources) { diff --git a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/FederationEvaluationStatistics.java b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/FederationEvaluationStatistics.java index 6643bc4cc47..4c56c66796c 100644 --- a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/FederationEvaluationStatistics.java +++ b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/FederationEvaluationStatistics.java @@ -17,7 +17,7 @@ *

    * The statistics are instantiated per query. *

    - * + * * @author Andreas Schwarte * */ diff --git a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/FederationEvaluationStrategyFactory.java b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/FederationEvaluationStrategyFactory.java index 622209cb591..c5f9db2d43b 100644 --- a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/FederationEvaluationStrategyFactory.java +++ b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/FederationEvaluationStrategyFactory.java @@ -13,7 +13,7 @@ /** * Factory class for retrieving the {@link FederationEvalStrategy} to be used - * + * * @author Andreas Schwarte */ public class FederationEvaluationStrategyFactory { @@ -22,7 +22,7 @@ public class FederationEvaluationStrategyFactory { * Return an instance of {@link FederationEvalStrategy} which is used for evaluating the query. The type depends on * the {@link FederationType} as well as on the actual implementations given by the configuration, in particular * this is {@link FedXConfig#getSailEvaluationStrategy()} and {@link FedXConfig#getSPARQLEvaluationStrategy()}. - * + * * @param federationType * @param federationContext * @return the {@link FederationEvalStrategy} diff --git a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/SailFederationEvalStrategy.java b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/SailFederationEvalStrategy.java index 0f12c95f8f3..e9bbc640103 100644 --- a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/SailFederationEvalStrategy.java +++ b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/SailFederationEvalStrategy.java @@ -37,9 +37,9 @@ * Implementation of a federation evaluation strategy which provides some special optimizations for Native (local) * Sesame repositories. The most important optimization is to use prepared Queries that are already created in the * internal representation used by Sesame. This is necessary to avoid String parsing overhead. - * + * * Joins are executed using {@link ControlledWorkerJoin} - * + * * @author Andreas Schwarte * */ @@ -55,12 +55,14 @@ public CloseableIteration evaluateBoundJoi throws QueryEvaluationException { // we can omit the bound join handling - if (bindings.size() == 1) + if (bindings.size() == 1) { return evaluate(stmt, bindings.get(0)); + } FilterValueExpr filterExpr = null; - if (stmt instanceof FilterTuple) + if (stmt instanceof FilterTuple) { filterExpr = ((FilterTuple) stmt).getFilterExpr(); + } Boolean isEvaluated = false; TupleExpr preparedQuery = QueryAlgebraUtil.selectQueryBoundUnion((StatementPattern) stmt, bindings, filterExpr, @@ -73,8 +75,9 @@ public CloseableIteration evaluateBoundJoi if (filterExpr != null && !isEvaluated) { result = new BoundJoinConversionIteration(result, bindings); // apply conversion result = new FilteringIteration(filterExpr, result, this); // apply filter - if (!result.hasNext()) + if (!result.hasNext()) { return new EmptyIteration<>(); + } } else { result = new BoundJoinConversionIteration(result, bindings); } @@ -87,8 +90,9 @@ public CloseableIteration evaluateGroupedC CheckStatementPattern stmt, List bindings) throws QueryEvaluationException { - if (bindings.size() == 1) + if (bindings.size() == 1) { return stmt.evaluate(bindings.get(0)); + } TupleExpr preparedQuery = QueryAlgebraUtil.selectQueryStringBoundCheck(stmt.getStatementPattern(), bindings); diff --git a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/SailTripleSource.java b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/SailTripleSource.java index 3c8b1cdf8a8..9744d9a4cae 100644 --- a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/SailTripleSource.java +++ b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/SailTripleSource.java @@ -15,21 +15,20 @@ import org.eclipse.rdf4j.federated.algebra.FilterValueExpr; import org.eclipse.rdf4j.federated.algebra.PrecompiledQueryNode; import org.eclipse.rdf4j.federated.endpoint.Endpoint; -import org.eclipse.rdf4j.federated.evaluation.iterator.FilteringInsertBindingsIteration; import org.eclipse.rdf4j.federated.evaluation.iterator.FilteringIteration; import org.eclipse.rdf4j.federated.evaluation.iterator.InsertBindingsIteration; import org.eclipse.rdf4j.federated.evaluation.iterator.StatementConversionIteration; import org.eclipse.rdf4j.federated.structures.QueryInfo; +import org.eclipse.rdf4j.federated.util.FedXUtil; import org.eclipse.rdf4j.federated.util.QueryAlgebraUtil; import org.eclipse.rdf4j.model.IRI; import org.eclipse.rdf4j.model.Resource; import org.eclipse.rdf4j.model.Statement; import org.eclipse.rdf4j.model.Value; import org.eclipse.rdf4j.query.BindingSet; +import org.eclipse.rdf4j.query.Dataset; import org.eclipse.rdf4j.query.MalformedQueryException; import org.eclipse.rdf4j.query.QueryEvaluationException; -import org.eclipse.rdf4j.query.QueryLanguage; -import org.eclipse.rdf4j.query.TupleQuery; import org.eclipse.rdf4j.query.algebra.StatementPattern; import org.eclipse.rdf4j.query.algebra.TupleExpr; import org.eclipse.rdf4j.query.impl.EmptyBindingSet; @@ -43,7 +42,7 @@ /** * A triple source to be used on any repository. - * + * * @author Andreas Schwarte * */ @@ -55,42 +54,6 @@ public class SailTripleSource extends TripleSourceBase implements TripleSource { super(federationContext, endpoint); } - @Override - public CloseableIteration getStatements( - String preparedQuery, final BindingSet bindings, final FilterValueExpr filterExpr, QueryInfo queryInfo) - throws RepositoryException, MalformedQueryException, - QueryEvaluationException { - - return withConnection((conn, resultHolder) -> { - - TupleQuery query = conn.prepareTupleQuery(QueryLanguage.SPARQL, preparedQuery, null); - configureInference(query, queryInfo); - applyMaxExecutionTimeUpperBound(query); - - // evaluate the query - CloseableIteration res = query.evaluate(); - resultHolder.set(res); - - // apply filter and/or insert original bindings - if (filterExpr != null) { - if (bindings.size() > 0) - res = new FilteringInsertBindingsIteration(filterExpr, bindings, res, - SailTripleSource.this.strategy); - else - res = new FilteringIteration(filterExpr, res, SailTripleSource.this.strategy); - if (!res.hasNext()) { - Iterations.closeCloseable(res); - resultHolder.set(new EmptyIteration<>()); - return; - } - } else if (bindings.size() > 0) { - res = new InsertBindingsIteration(res, bindings); - } - - resultHolder.set(res); - }); - } - @Override public CloseableIteration getStatements( StatementPattern stmt, @@ -104,8 +67,11 @@ public CloseableIteration getStatements( return withConnection((conn, resultHolder) -> { + // TODO we need to fix this here: if the dataset contains FROM NAMED, we cannot use + // the API and require to write as query + RepositoryResult repoResult = conn.getStatements((Resource) subjValue, (IRI) predValue, objValue, - queryInfo.getIncludeInferred(), new Resource[0]); + queryInfo.getIncludeInferred(), FedXUtil.toContexts(stmt, queryInfo.getDataset())); // XXX implementation remark and TODO taken from Sesame // The same variable might have been used multiple times in this @@ -134,11 +100,10 @@ public CloseableIteration getStatements( throws RepositoryException, MalformedQueryException, QueryEvaluationException { - // TODO add handling for contexts return withConnection((conn, resultHolder) -> { RepositoryResult repoResult = conn.getStatements(subj, pred, obj, - queryInfo.getIncludeInferred()); + queryInfo.getIncludeInferred(), contexts); // XXX implementation remark and TODO taken from Sesame // The same variable might have been used multiple times in this @@ -155,7 +120,7 @@ protected QueryEvaluationException convert(Exception arg0) { @Override public boolean hasStatements(StatementPattern stmt, - BindingSet bindings, QueryInfo queryInfo) + BindingSet bindings, QueryInfo queryInfo, Dataset dataset) throws RepositoryException, MalformedQueryException, QueryEvaluationException { @@ -163,14 +128,31 @@ public boolean hasStatements(StatementPattern stmt, Value predValue = QueryAlgebraUtil.getVarValue(stmt.getPredicateVar(), bindings); Value objValue = QueryAlgebraUtil.getVarValue(stmt.getObjectVar(), bindings); + Resource[] contexts = FedXUtil.toContexts(dataset); + try (RepositoryConnection conn = endpoint.getConnection()) { return conn.hasStatement((Resource) subjValue, (IRI) predValue, objValue, queryInfo.getIncludeInferred(), - new Resource[0]); + contexts); } } @Override - public boolean usePreparedQuery() { + public boolean usePreparedQuery(StatementPattern stmt, QueryInfo queryInfo) { + // we use a prepared query for variable GRAPH patterns (=> cannot be done + // using the Repository API). + if (stmt.getContextVar() != null && !stmt.getContextVar().hasValue()) { + return true; + } + Dataset ds = queryInfo.getDataset(); + if (ds != null) { + + // if FROM NAMED is used we rely on a prepared query + if (!ds.getNamedGraphs().isEmpty()) { + return true; + } + } + + // in all other cases: try to use the Repository API return false; } @@ -184,7 +166,7 @@ public CloseableIteration getStatements( /* * Implementation note: - * + * * a special strategy is registered for NativeStore instances. The specialized strategy allows to evaluate * prepared queries without prior (obsolete) optimization. */ @@ -217,5 +199,4 @@ public CloseableIteration getStatements( resultHolder.set(res); }); } - } diff --git a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/SparqlFederationEvalStrategy.java b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/SparqlFederationEvalStrategy.java index 2f97d898328..39b5d1ea787 100644 --- a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/SparqlFederationEvalStrategy.java +++ b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/SparqlFederationEvalStrategy.java @@ -49,7 +49,7 @@ * This implementation uses the SPARQL 1.1 VALUES operator for the bound-join evaluation *

    * s - * + * * @author Andreas Schwarte * */ @@ -65,16 +65,18 @@ public CloseableIteration evaluateBoundJoi throws QueryEvaluationException { // we can omit the bound join handling - if (bindings.size() == 1) + if (bindings.size() == 1) { return evaluate(stmt, bindings.get(0)); + } FilterValueExpr filterExpr = null; - if (stmt instanceof FilterTuple) + if (stmt instanceof FilterTuple) { filterExpr = ((FilterTuple) stmt).getFilterExpr(); + } AtomicBoolean isEvaluated = new AtomicBoolean(false); String preparedQuery = QueryStringUtil.selectQueryStringBoundJoinVALUES((StatementPattern) stmt, bindings, - filterExpr, isEvaluated); + filterExpr, isEvaluated, stmt.getQueryInfo().getDataset()); CloseableIteration result = null; try { @@ -84,8 +86,9 @@ public CloseableIteration evaluateBoundJoi if (filterExpr != null && !isEvaluated.get()) { result = new BoundJoinVALUESConversionIteration(result, bindings); // apply conversion result = new FilteringIteration(filterExpr, result, this); // apply filter - if (!result.hasNext()) + if (!result.hasNext()) { return new EmptyIteration<>(); + } } else { result = new BoundJoinVALUESConversionIteration(result, bindings); } @@ -99,7 +102,7 @@ public CloseableIteration evaluateBoundJoi /** * Alternative evaluation implementation using UNION. Nowadays we use a VALUES clause based implementation - * + * * @deprecated */ protected CloseableIteration evaluateBoundJoinStatementPattern_UNION( @@ -107,16 +110,18 @@ protected CloseableIteration evaluateBound throws QueryEvaluationException { // we can omit the bound join handling - if (bindings.size() == 1) + if (bindings.size() == 1) { return evaluate(stmt, bindings.get(0)); + } FilterValueExpr filterExpr = null; - if (stmt instanceof FilterTuple) + if (stmt instanceof FilterTuple) { filterExpr = ((FilterTuple) stmt).getFilterExpr(); + } Boolean isEvaluated = false; String preparedQuery = QueryStringUtil.selectQueryStringBoundUnion((StatementPattern) stmt, bindings, - filterExpr, isEvaluated); + filterExpr, isEvaluated, stmt.getQueryInfo().getDataset()); CloseableIteration result = evaluateAtStatementSources(preparedQuery, stmt.getStatementSources(), stmt.getQueryInfo()); @@ -125,8 +130,9 @@ protected CloseableIteration evaluateBound if (filterExpr != null && !isEvaluated) { result = new BoundJoinConversionIteration(result, bindings); // apply conversion result = new FilteringIteration(filterExpr, result, this); // apply filter - if (!result.hasNext()) + if (!result.hasNext()) { return new EmptyIteration<>(); + } } else { result = new BoundJoinConversionIteration(result, bindings); } @@ -139,10 +145,12 @@ public CloseableIteration evaluateGroupedC CheckStatementPattern stmt, List bindings) throws QueryEvaluationException { - if (bindings.size() == 1) + if (bindings.size() == 1) { return stmt.evaluate(bindings.get(0)); + } - String preparedQuery = QueryStringUtil.selectQueryStringBoundCheck(stmt.getStatementPattern(), bindings); + String preparedQuery = QueryStringUtil.selectQueryStringBoundCheck(stmt.getStatementPattern(), bindings, + stmt.getQueryInfo().getDataset()); CloseableIteration result = evaluateAtStatementSources(preparedQuery, stmt.getStatementSources(), stmt.getQueryInfo()); @@ -174,7 +182,7 @@ public CloseableIteration evaluateExclusiv try { String preparedQuery = QueryStringUtil.selectQueryString(group, bindings, group.getFilterExpr(), - isEvaluated); + isEvaluated, group.getQueryInfo().getDataset()); return tripleSource.getStatements(preparedQuery, bindings, (isEvaluated.get() ? null : group.getFilterExpr()), group.getQueryInfo()); } catch (IllegalQueryException e) { diff --git a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/SparqlTripleSource.java b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/SparqlTripleSource.java index bd21a7e5190..ae5166db8bf 100644 --- a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/SparqlTripleSource.java +++ b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/SparqlTripleSource.java @@ -8,20 +8,16 @@ package org.eclipse.rdf4j.federated.evaluation; import org.eclipse.rdf4j.common.iteration.CloseableIteration; -import org.eclipse.rdf4j.common.iteration.EmptyIteration; import org.eclipse.rdf4j.common.iteration.ExceptionConvertingIteration; -import org.eclipse.rdf4j.common.iteration.Iterations; import org.eclipse.rdf4j.federated.FederationContext; import org.eclipse.rdf4j.federated.algebra.ExclusiveTupleExpr; import org.eclipse.rdf4j.federated.algebra.FilterValueExpr; import org.eclipse.rdf4j.federated.endpoint.Endpoint; import org.eclipse.rdf4j.federated.endpoint.SparqlEndpointConfiguration; import org.eclipse.rdf4j.federated.evaluation.iterator.ConsumingIteration; -import org.eclipse.rdf4j.federated.evaluation.iterator.FilteringInsertBindingsIteration; -import org.eclipse.rdf4j.federated.evaluation.iterator.FilteringIteration; -import org.eclipse.rdf4j.federated.evaluation.iterator.InsertBindingsIteration; import org.eclipse.rdf4j.federated.exception.ExceptionUtil; import org.eclipse.rdf4j.federated.structures.QueryInfo; +import org.eclipse.rdf4j.federated.util.FedXUtil; import org.eclipse.rdf4j.federated.util.QueryStringUtil; import org.eclipse.rdf4j.model.IRI; import org.eclipse.rdf4j.model.Resource; @@ -29,6 +25,7 @@ import org.eclipse.rdf4j.model.Value; import org.eclipse.rdf4j.query.BindingSet; import org.eclipse.rdf4j.query.BooleanQuery; +import org.eclipse.rdf4j.query.Dataset; import org.eclipse.rdf4j.query.MalformedQueryException; import org.eclipse.rdf4j.query.QueryEvaluationException; import org.eclipse.rdf4j.query.QueryLanguage; @@ -45,13 +42,13 @@ /** * A triple source to be used for (remote) SPARQL endpoints. *

    - * + * * This triple source supports the {@link SparqlEndpointConfiguration} for defining whether ASK queries are to be used * for source selection. - * + * * The query result of {@link #getStatements(String, BindingSet, FilterValueExpr, QueryInfo)} is wrapped in a * {@link ConsumingIteration} to avoid blocking behavior.. - * + * * @author Andreas Schwarte * */ @@ -67,45 +64,6 @@ public class SparqlTripleSource extends TripleSourceBase implements TripleSource } } - @Override - public CloseableIteration getStatements( - String preparedQuery, BindingSet bindings, FilterValueExpr filterExpr, QueryInfo queryInfo) - throws RepositoryException, MalformedQueryException, - QueryEvaluationException { - - return withConnection((conn, resultHolder) -> { - - TupleQuery query = conn.prepareTupleQuery(QueryLanguage.SPARQL, preparedQuery, null); - applyMaxExecutionTimeUpperBound(query); - configureInference(query, queryInfo); - - // evaluate the query - monitorRemoteRequest(); - CloseableIteration res = query.evaluate(); - resultHolder.set(res); - - // apply filter and/or insert original bindings - if (filterExpr != null) { - if (bindings.size() > 0) - res = new FilteringInsertBindingsIteration(filterExpr, bindings, res, - SparqlTripleSource.this.strategy); - else - res = new FilteringIteration(filterExpr, res, SparqlTripleSource.this.strategy); - if (!res.hasNext()) { - Iterations.closeCloseable(res); - conn.close(); - resultHolder.set(new EmptyIteration<>()); - return; - } - } else if (bindings.size() > 0) { - res = new InsertBindingsIteration(res, bindings); - } - - resultHolder.set(new ConsumingIteration(res)); - - }); - } - @Override public CloseableIteration getStatements( StatementPattern stmt, BindingSet bindings, FilterValueExpr filterExpr, QueryInfo queryInfo) @@ -122,8 +80,9 @@ public boolean hasStatements(Resource subj, if (!useASKQueries) { StatementPattern st = new StatementPattern(new Var("s", subj), new Var("p", pred), new Var("o", obj)); + Dataset dataset = FedXUtil.toDataset(contexts); try { - return hasStatements(st, EmptyBindingSet.getInstance(), queryInfo); + return hasStatements(st, EmptyBindingSet.getInstance(), queryInfo, dataset); } catch (Exception e) { throw new RepositoryException(e); } @@ -133,13 +92,13 @@ public boolean hasStatements(Resource subj, @Override public boolean hasStatements(StatementPattern stmt, - BindingSet bindings, QueryInfo queryInfo) throws RepositoryException, + BindingSet bindings, QueryInfo queryInfo, Dataset dataset) throws RepositoryException, MalformedQueryException, QueryEvaluationException { // decide whether to use ASK queries or a SELECT query if (useASKQueries) { /* remote boolean query */ - String queryString = QueryStringUtil.askQueryString(stmt, bindings); + String queryString = QueryStringUtil.askQueryString(stmt, bindings, dataset); try (RepositoryConnection conn = endpoint.getConnection()) { BooleanQuery query = conn.prepareBooleanQuery(QueryLanguage.SPARQL, queryString, null); @@ -157,7 +116,7 @@ public boolean hasStatements(StatementPattern stmt, } else { /* remote select limit 1 query */ try (RepositoryConnection conn = endpoint.getConnection()) { - String queryString = QueryStringUtil.selectQueryStringLimit1(stmt, bindings); + String queryString = QueryStringUtil.selectQueryStringLimit1(stmt, bindings, dataset); TupleQuery query = conn.prepareTupleQuery(QueryLanguage.SPARQL, queryString); configureInference(query, queryInfo); applyMaxExecutionTimeUpperBound(query); @@ -186,7 +145,8 @@ public boolean hasStatements(ExclusiveTupleExpr expr, /* remote select limit 1 query */ try (RepositoryConnection conn = endpoint.getConnection()) { - String queryString = QueryStringUtil.selectQueryStringLimit1(expr, bindings); + String queryString = QueryStringUtil.selectQueryStringLimit1(expr, bindings, + expr.getQueryInfo().getDataset()); TupleQuery query = conn.prepareTupleQuery(QueryLanguage.SPARQL, queryString); configureInference(query, expr.getQueryInfo()); applyMaxExecutionTimeUpperBound(query); @@ -208,7 +168,7 @@ public boolean hasStatements(ExclusiveTupleExpr expr, } @Override - public boolean usePreparedQuery() { + public boolean usePreparedQuery(StatementPattern stmt, QueryInfo queryInfo) { return true; } @@ -227,11 +187,10 @@ public CloseableIteration getStatements( Resource... contexts) throws RepositoryException, MalformedQueryException, QueryEvaluationException { - // TODO add handling for contexts return withConnection((conn, resultHolder) -> { monitorRemoteRequest(); RepositoryResult repoResult = conn.getStatements(subj, pred, obj, - queryInfo.getIncludeInferred()); + queryInfo.getIncludeInferred(), contexts); resultHolder.set(new ExceptionConvertingIteration(repoResult) { @Override diff --git a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/TripleSource.java b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/TripleSource.java index 706f7c9f0aa..0980daf4a04 100644 --- a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/TripleSource.java +++ b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/TripleSource.java @@ -18,6 +18,7 @@ import org.eclipse.rdf4j.model.Statement; import org.eclipse.rdf4j.model.Value; import org.eclipse.rdf4j.query.BindingSet; +import org.eclipse.rdf4j.query.Dataset; import org.eclipse.rdf4j.query.MalformedQueryException; import org.eclipse.rdf4j.query.QueryEvaluationException; import org.eclipse.rdf4j.query.algebra.StatementPattern; @@ -28,7 +29,7 @@ /** * Interface for implementations of triple sources. Particular implementations define how to evaluate the expression on * the endpoint. Different implementations might be necessary depending on the underlying repository. - * + * * @author Andreas Schwarte * * @see SparqlTripleSource @@ -38,13 +39,13 @@ public interface TripleSource { /** * Evaluate the prepared query in its internal representation on the provided endpoint. - * + * * @param preparedQuery a prepared query to evaluate * @param bindings the bindings to use * @param filterExpr the filter expression to apply or null if there is no filter or if it is evaluated already - * + * * @return the resulting iteration - * + * * @throws RepositoryException * @throws MalformedQueryException * @throws QueryEvaluationException @@ -55,13 +56,13 @@ public CloseableIteration getStatements(Tu /** * Evaluate the prepared query (SPARQL query as String) on the provided endpoint. - * + * * @param preparedQuery a prepared query to evaluate (SPARQL query as String) * @param bindings the bindings to use * @param filterExpr the filter expression to apply or null if there is no filter or if it is evaluated already - * + * * @return the resulting iteration - * + * * @throws RepositoryException * @throws MalformedQueryException * @throws QueryEvaluationException @@ -72,7 +73,7 @@ public CloseableIteration getStatements(St /** * Evaluate a given SPARQL query of the provided query type at the given source. - * + * * @param preparedQuery * @param queryType * @param queryInfo @@ -92,7 +93,7 @@ public default CloseableIteration getState /** * Evaluate a given SPARQL query of the provided query type at the given source. - * + * * @param preparedQuery * @param queryBindings optional query bindings, use {@link EmptyBindingSet} if there are none * @param queryType @@ -109,13 +110,13 @@ public CloseableIteration getStatements(St /** * Evaluate the query expression on the provided endpoint. - * + * * @param stmt the stmt expression to evaluate * @param bindings the bindings to use * @param filterExpr the filter expression to apply or null if there is no filter or if it is evaluated already - * + * * @return the resulting iteration - * + * * @throws RepositoryException * @throws MalformedQueryException * @throws QueryEvaluationException @@ -126,14 +127,14 @@ public CloseableIteration getStatements(St /** * Return the statements matching the given pattern as a {@link Statement} iteration. - * + * * @param subj * @param pred * @param obj * @param contexts - * + * * @return the resulting iteration - * + * * @throws RepositoryException * @throws MalformedQueryException * @throws QueryEvaluationException @@ -144,22 +145,24 @@ public CloseableIteration getStatements( /** * Check if the provided statement can return results. - * + * * @param stmt - * @param bindings a binding set. in case no bindings are present, an {@link EmptyBindingSet} can be used (i.e. - * never null) - * + * @param bindings a binding set. in case no bindings are present, an {@link EmptyBindingSet} can be used (i.e. + * never null) + * @param queryInfo + * @param dataset + * * @return whether the source can return results * @throws RepositoryException * @throws MalformedQueryException * @throws QueryEvaluationException */ - public boolean hasStatements(StatementPattern stmt, BindingSet bindings, QueryInfo queryInfo) + public boolean hasStatements(StatementPattern stmt, BindingSet bindings, QueryInfo queryInfo, Dataset dataset) throws RepositoryException, MalformedQueryException, QueryEvaluationException; /** * Check if the repository can return results for the given triple pattern represented by subj, pred and obj - * + * * @param subj * @param pred * @param obj @@ -174,7 +177,7 @@ public boolean hasStatements(Resource subj, IRI pred, Value obj, QueryInfo query /** * Check if the repository can return results for the given {@link ExclusiveTupleExpr}, e.g. for an * {@link ExclusiveGroup} with a list of Statements. - * + * * @param group * @param bindings * @return whether the repository can return results @@ -184,9 +187,21 @@ public boolean hasStatements(ExclusiveTupleExpr expr, BindingSet bindings) throws RepositoryException, MalformedQueryException, QueryEvaluationException; /** - * + * + * @return true if a prepared query is to be used preferably, false otherwise + * @deprecated replaced with {@link #usePreparedQuery(StatementPattern, QueryInfo)}, to be removed in 4.0 + */ + @Deprecated + public default boolean usePreparedQuery() { + return true; + } + + /** + * + * @param stmt + * @param queryInfo * @return true if a prepared query is to be used preferably, false otherwise */ - public boolean usePreparedQuery(); + public boolean usePreparedQuery(StatementPattern stmt, QueryInfo queryInfo); } diff --git a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/TripleSourceBase.java b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/TripleSourceBase.java index 4584534acdc..27099d86b66 100644 --- a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/TripleSourceBase.java +++ b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/TripleSourceBase.java @@ -14,9 +14,14 @@ import org.eclipse.rdf4j.common.iteration.Iterations; import org.eclipse.rdf4j.federated.FederationContext; import org.eclipse.rdf4j.federated.algebra.ExclusiveTupleExpr; +import org.eclipse.rdf4j.federated.algebra.FilterValueExpr; import org.eclipse.rdf4j.federated.endpoint.Endpoint; import org.eclipse.rdf4j.federated.evaluation.iterator.CloseDependentConnectionIteration; +import org.eclipse.rdf4j.federated.evaluation.iterator.ConsumingIteration; +import org.eclipse.rdf4j.federated.evaluation.iterator.FilteringInsertBindingsIteration; +import org.eclipse.rdf4j.federated.evaluation.iterator.FilteringIteration; import org.eclipse.rdf4j.federated.evaluation.iterator.GraphToBindingSetConversionIteration; +import org.eclipse.rdf4j.federated.evaluation.iterator.InsertBindingsIteration; import org.eclipse.rdf4j.federated.evaluation.iterator.SingleBindingSetIteration; import org.eclipse.rdf4j.federated.exception.ExceptionUtil; import org.eclipse.rdf4j.federated.monitoring.Monitoring; @@ -65,10 +70,11 @@ public CloseableIteration getStatements( QueryEvaluationException { return withConnection((conn, resultHolder) -> { + final String baseURI = queryInfo.getBaseURI(); switch (queryType) { case SELECT: monitorRemoteRequest(); - TupleQuery tQuery = conn.prepareTupleQuery(QueryLanguage.SPARQL, preparedQuery); + TupleQuery tQuery = conn.prepareTupleQuery(QueryLanguage.SPARQL, preparedQuery, baseURI); applyBindings(tQuery, queryBindings); applyMaxExecutionTimeUpperBound(tQuery); configureInference(tQuery, queryInfo); @@ -76,7 +82,7 @@ public CloseableIteration getStatements( return; case CONSTRUCT: monitorRemoteRequest(); - GraphQuery gQuery = conn.prepareGraphQuery(QueryLanguage.SPARQL, preparedQuery); + GraphQuery gQuery = conn.prepareGraphQuery(QueryLanguage.SPARQL, preparedQuery, baseURI); applyBindings(gQuery, queryBindings); applyMaxExecutionTimeUpperBound(gQuery); configureInference(gQuery, queryInfo); @@ -86,7 +92,7 @@ public CloseableIteration getStatements( monitorRemoteRequest(); boolean hasResults = false; try (RepositoryConnection _conn = conn) { - BooleanQuery bQuery = _conn.prepareBooleanQuery(QueryLanguage.SPARQL, preparedQuery); + BooleanQuery bQuery = _conn.prepareBooleanQuery(QueryLanguage.SPARQL, preparedQuery, baseURI); applyBindings(bQuery, queryBindings); applyMaxExecutionTimeUpperBound(bQuery); configureInference(bQuery, queryInfo); @@ -109,6 +115,46 @@ private void applyBindings(Operation operation, BindingSet queryBindings) { } } + @Override + public CloseableIteration getStatements( + String preparedQuery, BindingSet bindings, FilterValueExpr filterExpr, QueryInfo queryInfo) + throws RepositoryException, MalformedQueryException, + QueryEvaluationException { + + return withConnection((conn, resultHolder) -> { + + TupleQuery query = conn.prepareTupleQuery(QueryLanguage.SPARQL, preparedQuery, null); + applyMaxExecutionTimeUpperBound(query); + configureInference(query, queryInfo); + + // evaluate the query + monitorRemoteRequest(); + CloseableIteration res = query.evaluate(); + resultHolder.set(res); + + // apply filter and/or insert original bindings + if (filterExpr != null) { + if (bindings.size() > 0) { + res = new FilteringInsertBindingsIteration(filterExpr, bindings, res, + this.strategy); + } else { + res = new FilteringIteration(filterExpr, res, this.strategy); + } + if (!res.hasNext()) { + Iterations.closeCloseable(res); + conn.close(); + resultHolder.set(new EmptyIteration<>()); + return; + } + } else if (bindings.size() > 0) { + res = new InsertBindingsIteration(res, bindings); + } + + resultHolder.set(new ConsumingIteration(res)); + + }); + } + @Override public boolean hasStatements(Resource subj, IRI pred, Value obj, QueryInfo queryInfo, Resource... contexts) throws RepositoryException { @@ -123,7 +169,7 @@ public boolean hasStatements(ExclusiveTupleExpr group, BindingSet bindings) QueryEvaluationException { monitorRemoteRequest(); - String preparedAskQuery = QueryStringUtil.askQueryString(group, bindings); + String preparedAskQuery = QueryStringUtil.askQueryString(group, bindings, group.getQueryInfo().getDataset()); try (RepositoryConnection conn = endpoint.getConnection()) { BooleanQuery query = conn.prepareBooleanQuery(QueryLanguage.SPARQL, preparedAskQuery); configureInference(query, group.getQueryInfo()); @@ -137,14 +183,15 @@ protected void monitorRemoteRequest() { } private CloseableIteration booleanToBindingSetIteration(boolean hasResult) { - if (hasResult) + if (hasResult) { return new SingleBindingSetIteration(EmptyBindingSet.getInstance()); + } return new EmptyIteration<>(); } /** * Set includeInferred depending on {@link QueryInfo#getIncludeInferred()} - * + * * @param query * @param queryInfo */ @@ -161,7 +208,7 @@ protected void configureInference(Query query, QueryInfo queryInfo) { /** * Apply an upper bound of the maximum execution time using * {@link FedXUtil#applyMaxQueryExecutionTime(Operation, FederationContext)}. - * + * * @param operation the operation */ protected void applyMaxExecutionTimeUpperBound(Operation operation) { @@ -176,7 +223,7 @@ private CloseableIteration closeConn(Repository /** * Convenience method to perform an operation on a {@link RepositoryConnection}. This method takes care for closing * resources as well error handling. The resulting iteration has to be supplied to the {@link ResultHolder}. - * + * * @param operation the {@link ConnectionOperation} * @return the resulting iteration */ @@ -208,19 +255,19 @@ protected CloseableIteration withConnection(Con /** * Interface defining the operation to be perform on the connection - * + * *

    * Typical pattern *

    - * + * *
     	 * CloseableIteration<BindingSet, QueryEvaluationException> res = withConnection((conn, resultHolder) -> {
     	 *  	// do something with conn
     	 * 		resultHolder.set(...)
     	 * });
    -	 * 
    +	 *
     	 * 
    - * + * * @author Andreas Schwarte * * @param @@ -233,7 +280,7 @@ protected static interface ConnectionOperation { /** * Holder for a result iteration to be used with {@link TripleSourceBase#withConnection(ConnectionOperation)}. Note * that the result holder should also be set with temporary results to properly allow error handling. - * + * * @author Andreas Schwarte * * @param diff --git a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/concurrent/ControlledWorkerScheduler.java b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/concurrent/ControlledWorkerScheduler.java index 42b3f0bf00f..877bc89c43e 100644 --- a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/concurrent/ControlledWorkerScheduler.java +++ b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/concurrent/ControlledWorkerScheduler.java @@ -28,10 +28,10 @@ * ControlledWorkerScheduler is a task scheduler that uses a FIFO queue for managing its process. Each instance has a * pool with a fixed number of worker threads. Once notified a worker picks the next task from the queue and executes * it. The results is then returned to the controlling instance retrieved from the task. - * - * + * + * * @author Andreas Schwarte - * + * * @see ControlledWorkerUnion * @see ControlledWorkerJoin * @see ControlledWorkerBoundJoin @@ -56,7 +56,7 @@ public ControlledWorkerScheduler() { /** * Construct a new instance with the specified number of workers and the given name. - * + * * @param nWorkers * @param name */ @@ -68,7 +68,7 @@ public ControlledWorkerScheduler(int nWorkers, String name) { /** * Schedule the specified parallel task. - * + * * @param task the task to schedule */ @Override @@ -91,7 +91,7 @@ public void schedule(ParallelTask task) { /** * Schedule the given tasks and inform about finish using the same lock, i.e. all tasks are scheduled one after the * other. - * + * * @param tasks * @param control */ @@ -148,7 +148,7 @@ public void informFinish() { /** * Inform this scheduler that the specified control instance will no longer submit tasks. - * + * * @param control */ public void informFinish(ParallelExecutor control) { @@ -164,9 +164,9 @@ public boolean isRunning() { /** * Determine if there are still task running or queued for the specified control. - * + * * @param control - * + * * @return true, if there are unfinished tasks, false otherwise */ public boolean isRunning(ParallelExecutor control) { @@ -224,7 +224,7 @@ public void abort() { /** * Structure to maintain the status for a given control instance. - * + * * @author Andreas Schwarte */ protected class ControlStatus { diff --git a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/concurrent/FedXQueueCursor.java b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/concurrent/FedXQueueCursor.java index ecf4cc5374f..5a822dc793d 100644 --- a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/concurrent/FedXQueueCursor.java +++ b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/concurrent/FedXQueueCursor.java @@ -19,8 +19,8 @@ /** * Specialized variants of {@link QueueCursor} which avoids converting any exception if it is already of * type{@link QueryEvaluationException}. - * - * + * + * * @author Andreas Schwarte * * @param diff --git a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/concurrent/ParallelExecutor.java b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/concurrent/ParallelExecutor.java index 205258ef564..44cfb55d0e0 100644 --- a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/concurrent/ParallelExecutor.java +++ b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/concurrent/ParallelExecutor.java @@ -17,9 +17,9 @@ * Interface for any parallel cursor, i.e. result iterations. Implementations can act as control for scheduler * implementations, e.g. {@link ControlledWorkerScheduler}. The common use case is to pass results from the scheduler to * the controlling result iteration. - * + * * @author Andreas Schwarte - * + * * @see JoinExecutorBase * @see UnionExecutorBase */ @@ -28,14 +28,14 @@ public interface ParallelExecutor extends Runnable { /** * Handle the result appropriately, e.g. add it to the result iteration. Take care for synchronization in a * multithreaded environment - * + * * @param res */ public void addResult(CloseableIteration res); /** * Toss some exception to the controlling instance - * + * * @param e */ public void toss(Exception e); @@ -47,14 +47,14 @@ public interface ParallelExecutor extends Runnable { /** * Return true if this executor is finished or aborted - * + * * @return whether the execution is finished */ public boolean isFinished(); /** * Return the query info of the associated query - * + * * @return the query info */ public QueryInfo getQueryInfo(); diff --git a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/concurrent/ParallelExecutorBase.java b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/concurrent/ParallelExecutorBase.java index 35785bcbaa8..7e700f66452 100644 --- a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/concurrent/ParallelExecutorBase.java +++ b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/concurrent/ParallelExecutorBase.java @@ -24,7 +24,7 @@ /** * Base class for common parallel executors such as {@link JoinExecutorBase} and {@link UnionExecutorBase}. - * + * * @author Andreas Schwarte * * @param @@ -60,8 +60,9 @@ public ParallelExecutorBase(FederationEvalStrategy strategy, QueryInfo queryInfo public final void run() { evaluationThread = Thread.currentThread(); - if (log.isTraceEnabled()) + if (log.isTraceEnabled()) { log.trace("Performing execution of " + getDisplayId() + ", thread: " + evaluationThread.getName()); + } try { performExecution(); @@ -74,15 +75,16 @@ public final void run() { rightQueue.done(); } - if (log.isTraceEnabled()) + if (log.isTraceEnabled()) { log.trace(getDisplayId() + " is finished."); + } } /** * Perform the parallel execution. - * + * * Note that this method must block until the execution is completed. - * + * * @throws Exception */ protected abstract void performExecution() throws Exception; @@ -90,8 +92,9 @@ public final void run() { @Override public void addResult(CloseableIteration res) { /* optimization: avoid adding empty results */ - if (res instanceof EmptyIteration) + if (res instanceof EmptyIteration) { return; + } try { rightQueue.put(res); @@ -137,7 +140,7 @@ public T getNextElement() throws QueryEvaluationException { /** * Checks whether the query execution has run into a timeout. If so, a {@link QueryInterruptedException} is thrown. - * + * * @throws QueryInterruptedException */ protected void checkTimeout() throws QueryInterruptedException { @@ -165,7 +168,7 @@ public void handleClose() throws QueryEvaluationException { /** * Return true if this executor is finished or aborted - * + * * @return whether the executor is finished */ @Override @@ -190,7 +193,7 @@ public String getDisplayId() { } /** - * + * * @return the executor type, e.g. "Join". Default "Executor" */ protected String getExecutorType() { diff --git a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/concurrent/ParallelServiceExecutor.java b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/concurrent/ParallelServiceExecutor.java index 98d8ba24b79..9a3a654b6cc 100644 --- a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/concurrent/ParallelServiceExecutor.java +++ b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/concurrent/ParallelServiceExecutor.java @@ -26,9 +26,9 @@ /** * Parallel executor for {@link FedXService} nodes, which wrap SERVICE expressions. - * + * * Uses the union scheduler to execute the task - * + * * @author Andreas Schwarte */ public class ParallelServiceExecutor extends LookAheadIteration @@ -36,7 +36,7 @@ public class ParallelServiceExecutor extends LookAheadIteration { diff --git a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/concurrent/ParallelTask.java b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/concurrent/ParallelTask.java index 4b4176eb36a..49a26a77224 100644 --- a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/concurrent/ParallelTask.java +++ b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/concurrent/ParallelTask.java @@ -13,7 +13,7 @@ /** * Interface for any parallel task that can be performed in Scheduler implementations. - * + * * @author Andreas Schwarte * */ @@ -24,13 +24,13 @@ public interface ParallelTask { /** * return the controlling instance, e.g. in most cases the instance of a thread. Shared variables are used to inform * the thread about new events. - * + * * @return the control executor */ public ParallelExecutor getControl(); /** - * + * * @return the {@link QueryInfo} */ public default QueryInfo getQueryInfo() { diff --git a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/concurrent/Scheduler.java b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/concurrent/Scheduler.java index a4382505549..301bc1e8c04 100644 --- a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/concurrent/Scheduler.java +++ b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/concurrent/Scheduler.java @@ -12,7 +12,7 @@ /** * Interface for any scheduler. - * + * * @author Andreas Schwarte * * @see ControlledWorkerScheduler @@ -21,34 +21,34 @@ public interface Scheduler { /** * Schedule the provided task. - * + * * @param task */ public void schedule(ParallelTask task); /** * Callback to handle the result. - * + * * @param res */ public void handleResult(CloseableIteration res); /** * Inform the scheduler that a certain task is done. - * + * */ public void done(); /** * Toss an exception to the scheduler. - * + * * @param e */ public void toss(Exception e); /** * Abort the execution of running and queued tasks. - * + * */ public void abort(); @@ -61,7 +61,7 @@ public interface Scheduler { /** * Determine if the scheduler has unfinished tasks. - * + * * @return whether the scheduler is running */ public boolean isRunning(); diff --git a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/iterator/BoundJoinConversionIteration.java b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/iterator/BoundJoinConversionIteration.java index c6f15802d07..5e4d3bef14d 100644 --- a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/iterator/BoundJoinConversionIteration.java +++ b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/iterator/BoundJoinConversionIteration.java @@ -19,7 +19,7 @@ /** * Inserts original bindings into the result. - * + * * @author Andreas Schwarte */ public class BoundJoinConversionIteration diff --git a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/iterator/BoundJoinVALUESConversionIteration.java b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/iterator/BoundJoinVALUESConversionIteration.java index 193f9f82bf3..c91933c1928 100644 --- a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/iterator/BoundJoinVALUESConversionIteration.java +++ b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/iterator/BoundJoinVALUESConversionIteration.java @@ -26,7 +26,7 @@ * It is assumed the the query results contain a binding for "?__index" which corresponds to the index in the input * mappings. See {@link QueryStringUtil} for details *

    - * + * * @author Andreas Schwarte * @see SparqlFederationEvalStrategy * @since 3.0 @@ -54,12 +54,14 @@ protected BindingSet convert(BindingSet bIn) throws QueryEvaluationException { Iterator bIter = bIn.iterator(); while (bIter.hasNext()) { Binding b = bIter.next(); - if (b.getName().equals(INDEX_BINDING_NAME)) + if (b.getName().equals(INDEX_BINDING_NAME)) { continue; + } res.addBinding(b); } - for (Binding bs : bindings.get(bIndex)) + for (Binding bs : bindings.get(bIndex)) { res.setBinding(bs); + } return res; } } diff --git a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/iterator/CloseDependentConnectionIteration.java b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/iterator/CloseDependentConnectionIteration.java index 08b46747791..29f3043d1e6 100644 --- a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/iterator/CloseDependentConnectionIteration.java +++ b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/iterator/CloseDependentConnectionIteration.java @@ -16,7 +16,7 @@ /** * A wrapping iteration that attempts to close the dependent {@link RepositoryConnection} after consumption. - * + * * @author Andreas Schwarte * */ diff --git a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/iterator/ConsumingIteration.java b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/iterator/ConsumingIteration.java index 83a3fab773a..51426ad0e15 100644 --- a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/iterator/ConsumingIteration.java +++ b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/iterator/ConsumingIteration.java @@ -21,10 +21,10 @@ * A specialized {@link CloseableIteration} that consumes part (or the entire input iteration if it fits into the * buffer) and keeps data for further processing in memory. If the buffer is full, the remaining items will be read from * the iteration lazily. - * + * * This implementation can be used to avoid blocking behavior in HTTP connection streams, i.e. to process results in * memory and close the underlying HTTP stream. - * + * * @author Andreas Schwarte * */ diff --git a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/iterator/FilteringInsertBindingsIteration.java b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/iterator/FilteringInsertBindingsIteration.java index 782aa46e40b..6730bdebffe 100644 --- a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/iterator/FilteringInsertBindingsIteration.java +++ b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/iterator/FilteringInsertBindingsIteration.java @@ -16,7 +16,7 @@ /** * Filters iteration according to specified filterExpr and inserts original bindings into filtered results. - * + * * @author Andreas Schwarte */ public class FilteringInsertBindingsIteration extends FilteringIteration { @@ -33,8 +33,9 @@ public FilteringInsertBindingsIteration(FilterValueExpr filterExpr, BindingSet b @Override public BindingSet next() throws QueryEvaluationException { BindingSet next = super.next(); - if (next == null) + if (next == null) { return null; + } QueryBindingSet res = new QueryBindingSet(bindings.size() + next.size()); res.addAll(bindings); res.addAll(next); diff --git a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/iterator/FilteringIteration.java b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/iterator/FilteringIteration.java index 29b2eb3b0bf..313ec3ac773 100644 --- a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/iterator/FilteringIteration.java +++ b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/iterator/FilteringIteration.java @@ -19,7 +19,7 @@ /** * Filters iteration according to specified filterExpr. - * + * * @author Andreas Schwarte */ public class FilteringIteration extends FilterIteration { diff --git a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/iterator/GraphToBindingSetConversionIteration.java b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/iterator/GraphToBindingSetConversionIteration.java index 6669e36d434..18eec389915 100644 --- a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/iterator/GraphToBindingSetConversionIteration.java +++ b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/iterator/GraphToBindingSetConversionIteration.java @@ -18,7 +18,7 @@ /** * Converts graph results into a binding set iteration - * + * * @author Andreas Schwarte */ public class GraphToBindingSetConversionIteration diff --git a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/iterator/GroupedCheckConversionIteration.java b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/iterator/GroupedCheckConversionIteration.java index e4f8605a0a6..ce53254ce28 100644 --- a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/iterator/GroupedCheckConversionIteration.java +++ b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/iterator/GroupedCheckConversionIteration.java @@ -18,7 +18,7 @@ /** * Retrieves the original bindings for the particular result - * + * * @author Andreas Schwarte */ public class GroupedCheckConversionIteration diff --git a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/iterator/IndependentJoingroupBindingsIteration.java b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/iterator/IndependentJoingroupBindingsIteration.java index 0cdb61af760..1442d37baa7 100644 --- a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/iterator/IndependentJoingroupBindingsIteration.java +++ b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/iterator/IndependentJoingroupBindingsIteration.java @@ -19,7 +19,7 @@ /** * Inserts original bindings into the result. - * + * * @author Andreas Schwarte */ public class IndependentJoingroupBindingsIteration extends LookAheadIteration { @@ -42,8 +42,9 @@ protected BindingSet getNextElement() throws QueryEvaluationException { result = computeResult(); } - if (currentIdx >= result.size()) + if (currentIdx >= result.size()) { return null; + } return result.get(currentIdx++); } @@ -59,20 +60,22 @@ protected ArrayList computeResult() throws QueryEvaluationException BindingSet bIn = iter.next(); - if (bIn.size() != 1) + if (bIn.size() != 1) { throw new RuntimeException( "For this optimization a bindingset needs to have exactly one binding, it has " + bIn.size() + ": " + bIn); + } Binding b = bIn.getBinding(bIn.getBindingNames().iterator().next()); int bIndex = Integer.parseInt(b.getName().substring(b.getName().lastIndexOf('_') + 1)); - if (bIndex == 0) + if (bIndex == 0) { a_res.add(b); - else if (bIndex == 1) + } else if (bIndex == 1) { b_res.add(b); - else + } else { throw new RuntimeException("Unexpected binding value."); + } } ArrayList res = new ArrayList<>(a_res.size() * b_res.size()); diff --git a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/iterator/IndependentJoingroupBindingsIteration2.java b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/iterator/IndependentJoingroupBindingsIteration2.java index 662f008a832..ae0baafd338 100644 --- a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/iterator/IndependentJoingroupBindingsIteration2.java +++ b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/iterator/IndependentJoingroupBindingsIteration2.java @@ -22,7 +22,7 @@ /** * Inserts original bindings into the result. - * + * * @author Andreas Schwarte */ public class IndependentJoingroupBindingsIteration2 extends LookAheadIteration { @@ -48,8 +48,9 @@ protected BindingSet getNextElement() throws QueryEvaluationException { result = computeResult(); } - if (currentIdx >= result.size()) + if (currentIdx >= result.size()) { return null; + } return result.get(currentIdx++); } @@ -65,17 +66,19 @@ protected ArrayList computeResult() throws QueryEvaluationException BindingSet bIn = iter.next(); - if (bIn.size() != 1) + if (bIn.size() != 1) { throw new RuntimeException( "For this optimization a bindingset needs to have exactly one binding, it has " + bIn.size() + ": " + bIn); + } Binding b = bIn.getBinding(bIn.getBindingNames().iterator().next()); // name is something like myVar_%outerID%_bindingId, e.g. name_0_0 Matcher m = pattern.matcher(b.getName()); - if (!m.find()) + if (!m.find()) { throw new QueryEvaluationException("Unexpected pattern for binding name: " + b.getName()); + } BindingInfo bInfo = new BindingInfo(m.group(1), Integer.parseInt(m.group(3)), b.getValue()); int bIndex = Integer.parseInt(m.group(2)); @@ -91,18 +94,20 @@ protected ArrayList computeResult() throws QueryEvaluationException // add a new binding info to the correct result list if (bIndex == 0) { a_res.add(bInfo); - } else if (bIndex == 1) + } else if (bIndex == 1) { b_res.add(bInfo); - else + } else { throw new RuntimeException("Unexpected binding value."); + } } ArrayList res = new ArrayList<>(a_res.size() * b_res.size()); for (BindingInfo a : a_res) { for (BindingInfo b : b_res) { - if (a.bindingsIdx != b.bindingsIdx) + if (a.bindingsIdx != b.bindingsIdx) { continue; + } QueryBindingSet newB = new QueryBindingSet(bindings.size() + 2); newB.addBinding(a.name, a.value); newB.addBinding(b.name, b.value); diff --git a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/iterator/IndependentJoingroupBindingsIteration3.java b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/iterator/IndependentJoingroupBindingsIteration3.java index 4bb7bb5461a..2eabb2ef0d0 100644 --- a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/iterator/IndependentJoingroupBindingsIteration3.java +++ b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/iterator/IndependentJoingroupBindingsIteration3.java @@ -23,7 +23,7 @@ /** * Inserts original bindings into the result. - * + * * @author Andreas Schwarte */ public class IndependentJoingroupBindingsIteration3 extends LookAheadIteration { @@ -49,8 +49,9 @@ protected BindingSet getNextElement() throws QueryEvaluationException { result = computeResult(); } - if (currentIdx >= result.size()) + if (currentIdx >= result.size()) { return null; + } return result.get(currentIdx++); } @@ -75,17 +76,19 @@ protected ArrayList computeResult() throws QueryEvaluationException BindingSet bIn = iter.next(); - if (bIn.size() != 1) + if (bIn.size() != 1) { throw new RuntimeException( "For this optimization a bindingset needs to have exactly one binding, it has " + bIn.size() + ": " + bIn); + } Binding b = bIn.getBinding(bIn.getBindingNames().iterator().next()); // name is something like myVar_%outerID%_bindingId, e.g. name_0_0 Matcher m = pattern.matcher(b.getName()); - if (!m.find()) + if (!m.find()) { throw new QueryEvaluationException("Unexpected pattern for binding name: " + b.getName()); + } BindingInfo bInfo = new BindingInfo(m.group(1), Integer.parseInt(m.group(3)), b.getValue()); int bIndex = Integer.parseInt(m.group(2)); @@ -101,10 +104,11 @@ protected ArrayList computeResult() throws QueryEvaluationException // add a new binding info to the correct result list if (bIndex == 0) { a_res.get(bInfo.bindingsIdx).add(bInfo); - } else if (bIndex == 1) + } else if (bIndex == 1) { b_res.get(bInfo.bindingsIdx).add(bInfo); - else + } else { throw new RuntimeException("Unexpected binding value."); + } } // TODO think about a better upper bound or use linked list diff --git a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/iterator/InsertBindingsIteration.java b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/iterator/InsertBindingsIteration.java index 3c44ba2e1c4..83fd2ba9b6b 100644 --- a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/iterator/InsertBindingsIteration.java +++ b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/iterator/InsertBindingsIteration.java @@ -15,7 +15,7 @@ /** * Inserts original bindings into the result. - * + * * @author Andreas Schwarte */ public class InsertBindingsIteration extends ConvertingIteration { diff --git a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/iterator/LazyMutableClosableIteration.java b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/iterator/LazyMutableClosableIteration.java index df13b25b124..5e4a762ca34 100644 --- a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/iterator/LazyMutableClosableIteration.java +++ b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/iterator/LazyMutableClosableIteration.java @@ -20,7 +20,7 @@ *

    * Note that the inner iteration is lazily consumed. *

    - * + * * @author Andreas Schwarte * */ diff --git a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/iterator/PrintingIteration.java b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/iterator/PrintingIteration.java index 64e44823c9a..0c454c249dd 100644 --- a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/iterator/PrintingIteration.java +++ b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/iterator/PrintingIteration.java @@ -17,7 +17,7 @@ /** * Print the bindings of the inner iteration to stdout, however maintain a copy, which is accessible through this * iteration. - * + * * @author Andreas Schwarte * */ diff --git a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/iterator/QueryResultIteration.java b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/iterator/QueryResultIteration.java index 829c1f71aa7..11825e0019c 100644 --- a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/iterator/QueryResultIteration.java +++ b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/iterator/QueryResultIteration.java @@ -17,14 +17,14 @@ /** * An iteration which wraps the final result and in case of exceptions aborts query evaluation for the corresponding * query in fedx (potentially subqueries are still running, and jobs are scheduled). - * + * * If some external component calls close() on this iteration AND if the corresponding query is still running, the query * is aborted within FedX. An example case would be Sesame's QueryInteruptIterations, which is used to enforce * maxQueryTime. - * + * * If the query is finished, the FederationManager is notified that the query is done, and the query is removed from the * set of running queries. - * + * * @author Andreas Schwarte * */ @@ -46,9 +46,9 @@ public QueryResultIteration( @Override public boolean hasNext() throws QueryEvaluationException { - if (inner.hasNext()) + if (inner.hasNext()) { return true; - else { + } else { // inform the query manager that this query is done qm.finishQuery(queryInfo); return false; @@ -59,8 +59,9 @@ public boolean hasNext() throws QueryEvaluationException { public BindingSet next() throws QueryEvaluationException { try { BindingSet next = inner.next(); - if (next == null) + if (next == null) { qm.finishQuery(queryInfo); + } return next; } catch (QueryEvaluationException e) { abortQuery(); @@ -83,7 +84,8 @@ protected void handleClose() throws QueryEvaluationException { * Abort the query in the schedulers if it is still running. */ protected void abortQuery() { - if (qm.isRunning(queryInfo)) + if (qm.isRunning(queryInfo)) { qm.abortQuery(queryInfo); + } } } diff --git a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/iterator/RepositoryExceptionConvertingIteration.java b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/iterator/RepositoryExceptionConvertingIteration.java index f253c7378a6..b891da1a42a 100644 --- a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/iterator/RepositoryExceptionConvertingIteration.java +++ b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/iterator/RepositoryExceptionConvertingIteration.java @@ -14,7 +14,7 @@ /** * Convenience iteration to convert {@link RepositoryResult} exceptions to {@link QueryEvaluationException}. - * + * * @author Andreas Schwarte * * @param diff --git a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/iterator/SingleBindingSetIteration.java b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/iterator/SingleBindingSetIteration.java index 6856dff04b5..8e8fc83a343 100644 --- a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/iterator/SingleBindingSetIteration.java +++ b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/iterator/SingleBindingSetIteration.java @@ -13,7 +13,7 @@ /** * Represents an iteration that contains only a single binding set. - * + * * @author Andreas Schwarte * */ diff --git a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/iterator/StatementConversionIteration.java b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/iterator/StatementConversionIteration.java index d0b23a8c2e3..1b6fb0e1c8c 100644 --- a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/iterator/StatementConversionIteration.java +++ b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/iterator/StatementConversionIteration.java @@ -21,7 +21,7 @@ /** * Converts Statement iteration (i.e. RepositoryResult) into the corresponding binding set. Note that exceptions are * converted appropriately as well. - * + * * @author Andreas Schwarte */ public class StatementConversionIteration extends AbstractCloseableIteration { diff --git a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/iterator/StopRemainingExecutionsOnCloseIteration.java b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/iterator/StopRemainingExecutionsOnCloseIteration.java index feb2e93de79..eb7c30e710f 100644 --- a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/iterator/StopRemainingExecutionsOnCloseIteration.java +++ b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/iterator/StopRemainingExecutionsOnCloseIteration.java @@ -21,7 +21,7 @@ *

    * This is required for instance if the resulting iteration is not fully consumed. *

    - * + * * @author Andreas Schwarte * @see QueryInfo#close() * @see ParallelTask#cancel() diff --git a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/join/ControlledWorkerBoundJoin.java b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/join/ControlledWorkerBoundJoin.java index e8e78947ca5..9c13640ca7f 100644 --- a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/join/ControlledWorkerBoundJoin.java +++ b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/join/ControlledWorkerBoundJoin.java @@ -30,15 +30,15 @@ /** * Execute the nested loop join in an asynchronous fashion, using grouped requests, i.e. group bindings into one SPARQL * request using the UNION operator. - * + * * The number of concurrent threads is controlled by a {@link ControlledWorkerScheduler} which works according to the * FIFO principle and uses worker threads. - * + * * This join cursor blocks until all scheduled tasks are finished, however the result iteration can be accessed from * different threads to allow for pipelining. - * + * * @author Andreas Schwarte - * + * */ public class ControlledWorkerBoundJoin extends ControlledWorkerJoin { @@ -95,18 +95,19 @@ protected void handleBindings() throws Exception { /* * XXX idea: - * + * * make nBindings dependent on the number of intermediate results of the left argument. - * + * * If many intermediate results, increase the number of bindings. This will result in less remote SPARQL * requests. - * + * */ - if (totalBindings > 10) + if (totalBindings > 10) { nBindings = nBindingsCfg; - else + } else { nBindings = 3; + } bindings = new ArrayList<>(nBindings); @@ -134,16 +135,17 @@ protected void handleBindings() throws Exception { /** * Returns true if the vectored evaluation can be applied for the join argument, i.e. there is no fallback to * {@link ControlledWorkerJoin#handleBindings()}. This is - * + * * a) if the expr is a {@link BoundJoinTupleExpr} (Mind the special handling for {@link FedXService} as defined in * b) b) if the expr is a {@link FedXService} and {@link FedXConfig#getEnableServiceAsBoundJoin()} - * + * * @return */ private boolean canApplyVectoredEvaluation(TupleExpr expr) { if (expr instanceof BoundJoinTupleExpr) { - if (expr instanceof FedXService) + if (expr instanceof FedXService) { return this.queryInfo.getFederationContext().getConfig().getEnableServiceAsBoundJoin(); + } return true; } return false; diff --git a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/join/ControlledWorkerJoin.java b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/join/ControlledWorkerJoin.java index d35d90a4906..308503ece11 100644 --- a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/join/ControlledWorkerJoin.java +++ b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/join/ControlledWorkerJoin.java @@ -22,13 +22,13 @@ /** * Execute the nested loop join in an asynchronous fashion, i.e. one binding after the other (but concurrently) - * + * * The number of concurrent threads is controlled by a {@link ControlledWorkerScheduler} which works according to the * FIFO principle. - * + * * This join cursor blocks until all scheduled tasks are finished, however the result iteration can be accessed from * different threads to allow for pipelining. - * + * * @author Andreas Schwarte */ public class ControlledWorkerJoin extends JoinExecutorBase { diff --git a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/join/ControlledWorkerLeftJoin.java b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/join/ControlledWorkerLeftJoin.java index a9d41b94a5d..aea797e86e5 100644 --- a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/join/ControlledWorkerLeftJoin.java +++ b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/join/ControlledWorkerLeftJoin.java @@ -22,13 +22,13 @@ /** * Execute the nested loop join in an asynchronous fashion, i.e. one binding after the other (but concurrently) - * + * * The number of concurrent threads is controlled by a {@link ControlledWorkerScheduler} which works according to the * FIFO principle. - * + * * This join cursor blocks until all scheduled tasks are finished, however the result iteration can be accessed from * different threads to allow for pipelining. - * + * * @author Andreas Schwarte */ public class ControlledWorkerLeftJoin extends JoinExecutorBase { diff --git a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/join/HashJoin.java b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/join/HashJoin.java index 04fce634d38..10ac90cf336 100644 --- a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/join/HashJoin.java +++ b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/join/HashJoin.java @@ -28,7 +28,7 @@ /** * Operator for a hash join of tuple expressions. - * + * * @author Andreas Schwarte * @since 6.0 */ @@ -96,7 +96,7 @@ protected void handleBindings() throws Exception { *

    * See {@link #join(Collection, Collection, Set, Collection)} and {@link #addResult(CloseableIteration)}. *

    - * + * * @param leftBlock * @param rightBlock * @param joinVariables @@ -113,7 +113,7 @@ protected void performJoin(Collection leftBlock, Collection - * + * * @param leftBlock * @param rightBlock * @param joinVariables diff --git a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/join/JoinExecutorBase.java b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/join/JoinExecutorBase.java index 8252ecb2b9c..9a8ed8d73ef 100644 --- a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/join/JoinExecutorBase.java +++ b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/join/JoinExecutorBase.java @@ -20,10 +20,10 @@ /** * Base class for any join parallel join executor. - * + * * Note that this class extends {@link LookAheadIteration} and thus any implementation of this class is applicable for * pipelining when used in a different thread (access to shared variables is synchronized). - * + * * @author Andreas Schwarte */ public abstract class JoinExecutorBase extends ParallelExecutorBase { @@ -54,17 +54,17 @@ protected final void performExecution() throws Exception { /** * Implementations must implement this method to handle bindings. - * + * * Use the following as a template * while (!closed && leftIter.hasNext()) { * // your code * } * - * + * * and add results to rightQueue. Note that addResult() is implemented synchronized and thus thread safe. In case * you can guarantee sequential access, it is also possible to directly access rightQueue - * - * + * + * * Note that the implementation must block until the entire join is executed. */ protected abstract void handleBindings() throws Exception; @@ -93,7 +93,7 @@ public Set getJoinVars() { /** * Set the join variables - * + * * @param joinVars the join variables */ public void setJoinVars(Set joinVars) { diff --git a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/join/ParallelBoundJoinTask.java b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/join/ParallelBoundJoinTask.java index 08efa0f81c6..bce79aa33da 100644 --- a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/join/ParallelBoundJoinTask.java +++ b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/join/ParallelBoundJoinTask.java @@ -21,7 +21,7 @@ * A task implementation representing a bound join, see * {@link FederationEvalStrategy#evaluateBoundJoinStatementPattern(StatementTupleExpr, List)} for further details on the * evaluation process. - * + * * @author Andreas Schwarte */ public class ParallelBoundJoinTask extends ParallelTaskBase { diff --git a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/join/ParallelCheckJoinTask.java b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/join/ParallelCheckJoinTask.java index 73bfefefeb9..1a6a13baf8b 100644 --- a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/join/ParallelCheckJoinTask.java +++ b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/join/ParallelCheckJoinTask.java @@ -20,7 +20,7 @@ /** * A task implementation representing a grouped bound check. See * {@link FederationEvalStrategy#evaluateGroupedCheck(CheckStatementPattern, List)} for further details. - * + * * @author Andreas Schwarte */ public class ParallelCheckJoinTask extends ParallelTaskBase { diff --git a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/join/ParallelJoinTask.java b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/join/ParallelJoinTask.java index b98b77296f9..bd8f7bffc9f 100644 --- a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/join/ParallelJoinTask.java +++ b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/join/ParallelJoinTask.java @@ -17,7 +17,7 @@ /** * A task implementation representing a join, i.e. the provided expression is evaluated with the given bindings. - * + * * @author Andreas Schwarte */ public class ParallelJoinTask extends ParallelTaskBase { diff --git a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/join/ParallelLeftJoinTask.java b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/join/ParallelLeftJoinTask.java index 3fcfe382c93..4355ef67a92 100644 --- a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/join/ParallelLeftJoinTask.java +++ b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/join/ParallelLeftJoinTask.java @@ -25,7 +25,7 @@ /** * A task implementation representing a join, i.e. the provided expression is evaluated with the given bindings. - * + * * @author Andreas Schwarte */ public class ParallelLeftJoinTask extends ParallelTaskBase { diff --git a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/join/ParallelServiceJoinTask.java b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/join/ParallelServiceJoinTask.java index a829a1fe62f..6ba8ff42354 100644 --- a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/join/ParallelServiceJoinTask.java +++ b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/join/ParallelServiceJoinTask.java @@ -22,7 +22,7 @@ /** * A task implementation representing the evaluation of a SERVICE which is to be evaluated using block input. See * {@link FederationEvalStrategy#evaluateService(FedXService, List)} for details. - * + * * @author Andreas Schwarte */ public class ParallelServiceJoinTask extends ParallelTaskBase { diff --git a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/join/SynchronousBoundJoin.java b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/join/SynchronousBoundJoin.java index ea69c040dc3..18259240b92 100644 --- a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/join/SynchronousBoundJoin.java +++ b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/join/SynchronousBoundJoin.java @@ -25,7 +25,7 @@ /** * Execute the nested loop join in a synchronous fashion, using grouped requests, i.e. group bindings into one SPARQL * request using the UNION operator - * + * * @author Andreas Schwarte */ public class SynchronousBoundJoin extends SynchronousJoin { @@ -63,8 +63,9 @@ protected void handleBindings() throws Exception { BindingSet b = leftIter.next(); totalBindings++; hasFreeVars = stmt.hasFreeVarsFor(b); - if (!hasFreeVars) + if (!hasFreeVars) { stmt = new CheckStatementPattern(stmt, queryInfo); + } rightQueue.put(strategy.evaluate(stmt, b)); } @@ -74,17 +75,18 @@ protected void handleBindings() throws Exception { /* * XXX idea: - * + * * make nBindings dependent on the number of intermediate results of the left argument. - * + * * If many intermediate results, increase the number of bindings. This will result in less remote SPARQL * requests. - * + * */ - if (totalBindings > 10) + if (totalBindings > 10) { nBindings = nBindingsCfg; - else + } else { nBindings = 3; + } bindings = new ArrayList<>(nBindings); diff --git a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/join/SynchronousJoin.java b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/join/SynchronousJoin.java index 5789aa4f121..42adf3792df 100644 --- a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/join/SynchronousJoin.java +++ b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/join/SynchronousJoin.java @@ -16,7 +16,7 @@ /** * Execute the nested loop join in a synchronous fashion, i.e. one binding after the other - * + * * @author Andreas Schwarte */ public class SynchronousJoin extends JoinExecutorBase { diff --git a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/union/ParallelGetStatementsTask.java b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/union/ParallelGetStatementsTask.java index 054cd12942b..71633aeb5a9 100644 --- a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/union/ParallelGetStatementsTask.java +++ b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/union/ParallelGetStatementsTask.java @@ -22,7 +22,7 @@ /** * A task implementation to retrieve statements for a given {@link StatementPattern} using the provided triple source. - * + * * @author Andreas Schwarte */ public class ParallelGetStatementsTask extends ParallelTaskBase { diff --git a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/union/ParallelPreparedAlgebraUnionTask.java b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/union/ParallelPreparedAlgebraUnionTask.java index cf5d81dedc3..94947666bf4 100644 --- a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/union/ParallelPreparedAlgebraUnionTask.java +++ b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/union/ParallelPreparedAlgebraUnionTask.java @@ -21,7 +21,7 @@ /** * A task implementation representing a prepared union, i.e. the prepared query is executed on the provided triple * source. - * + * * @author Andreas Schwarte */ public class ParallelPreparedAlgebraUnionTask extends ParallelTaskBase { diff --git a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/union/ParallelPreparedUnionTask.java b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/union/ParallelPreparedUnionTask.java index aac323c4e0e..ff93d7507a2 100644 --- a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/union/ParallelPreparedUnionTask.java +++ b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/union/ParallelPreparedUnionTask.java @@ -20,7 +20,7 @@ /** * A task implementation representing a prepared union, i.e. the prepared query is executed on the provided triple * source. - * + * * @author Andreas Schwarte */ public class ParallelPreparedUnionTask extends ParallelTaskBase { diff --git a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/union/ParallelUnionOperatorTask.java b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/union/ParallelUnionOperatorTask.java index aff34cd2807..f94d51ee347 100644 --- a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/union/ParallelUnionOperatorTask.java +++ b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/union/ParallelUnionOperatorTask.java @@ -17,7 +17,7 @@ /** * A task implementation representing a UNION operator expression to be evaluated. - * + * * @author Andreas Schwarte */ public class ParallelUnionOperatorTask extends ParallelTaskBase { diff --git a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/union/ParallelUnionTask.java b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/union/ParallelUnionTask.java index 6ce115c6081..bee7ce59b35 100644 --- a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/union/ParallelUnionTask.java +++ b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/union/ParallelUnionTask.java @@ -21,7 +21,7 @@ /** * A task implementation representing a statement expression to be evaluated. - * + * * @author Andreas Schwarte */ public class ParallelUnionTask extends ParallelTaskBase { diff --git a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/union/SynchronousWorkerUnion.java b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/union/SynchronousWorkerUnion.java index ab144f463ca..9d83ab43b8a 100644 --- a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/union/SynchronousWorkerUnion.java +++ b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/union/SynchronousWorkerUnion.java @@ -14,7 +14,7 @@ /** * Synchronous execution of union tasks, i.e. one after the other. The union result is contained in this iteration. Note * that the union operation is to be executed with the {@link #run()} method - * + * * @author Andreas Schwarte */ public class SynchronousWorkerUnion extends WorkerUnionBase { @@ -25,7 +25,8 @@ public SynchronousWorkerUnion(FederationEvalStrategy strategy, QueryInfo queryIn @Override protected void union() throws Exception { - for (ParallelTask task : tasks) + for (ParallelTask task : tasks) { addResult(task.performTask()); + } } } diff --git a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/union/UnionExecutorBase.java b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/union/UnionExecutorBase.java index e642752a274..25cac3c74ba 100644 --- a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/union/UnionExecutorBase.java +++ b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/union/UnionExecutorBase.java @@ -14,10 +14,10 @@ /** * Base class for any parallel union executor. - * + * * Note that this class extends {@link LookAheadIteration} and thus any implementation of this class is applicable for * pipelining when used in a different thread (access to shared variables is synchronized). - * + * * @author Andreas Schwarte * */ @@ -33,12 +33,12 @@ protected final void performExecution() throws Exception { } /** - * + * * Note: this method must block until the union is executed completely. Otherwise the result queue is marked as * committed while this isn't the case. The blocking behavior in general is no problem: If you need concurrent * access to the result (i.e. pipelining) just run the union in a separate thread. Access to the result iteration is * synchronized. - * + * * @throws Exception */ protected abstract void union() throws Exception; diff --git a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/union/WorkerUnionBase.java b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/union/WorkerUnionBase.java index cf604d55190..f96ad2be784 100644 --- a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/union/WorkerUnionBase.java +++ b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/evaluation/union/WorkerUnionBase.java @@ -16,9 +16,9 @@ /** * Base class for worker unions providing convenience functions to add tasks. - * + * * @author Andreas Schwarte - * + * * @see SynchronousWorkerUnion * @see ControlledWorkerUnion */ @@ -32,12 +32,13 @@ public WorkerUnionBase(FederationEvalStrategy strategy, QueryInfo queryInfo) { /** * Add a generic parallel task. Note that it is required that the task has this instance as its control. - * + * * @param task */ public void addTask(ParallelTask task) { - if (task.getControl() != this) + if (task.getControl() != this) { throw new RuntimeException("Controlling instance of task must be the same as this ControlledWorkerUnion."); + } tasks.add(task); } } diff --git a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/exception/EntryAlreadyExistsException.java b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/exception/EntryAlreadyExistsException.java index 205d234f8d3..7405ebe2483 100644 --- a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/exception/EntryAlreadyExistsException.java +++ b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/exception/EntryAlreadyExistsException.java @@ -8,7 +8,7 @@ package org.eclipse.rdf4j.federated.exception; /** - * + * * @author Andreas Schwarte * */ diff --git a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/exception/EntryUpdateException.java b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/exception/EntryUpdateException.java index bbfdd76e835..5795b179e11 100644 --- a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/exception/EntryUpdateException.java +++ b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/exception/EntryUpdateException.java @@ -8,7 +8,7 @@ package org.eclipse.rdf4j.federated.exception; /** - * + * * @author Andreas Schwarte */ public class EntryUpdateException extends Exception { diff --git a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/exception/ExceptionUtil.java b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/exception/ExceptionUtil.java index 874ad97480e..0ca2d37a6c6 100644 --- a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/exception/ExceptionUtil.java +++ b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/exception/ExceptionUtil.java @@ -20,7 +20,7 @@ /** * Convenience functions to handle exceptions. - * + * * @author Andreas Schwarte * */ @@ -30,7 +30,7 @@ public class ExceptionUtil { /** * Regex pattern to identify http error codes from the title of the returned document: - * + * * * Matcher m = httpErrorPattern.matcher("[..] 503 Service Unavailable [..]"); * if (m.matches()) { @@ -44,14 +44,14 @@ public class ExceptionUtil { * Trace the exception source within the exceptions to identify the originating endpoint. The message of the * provided exception is adapted to "@ endpoint.getId() - %orginalMessage". *

    - * + * * Note that in addition HTTP error codes are extracted from the title, if the exception resulted from an HTTP * error, such as for instance "503 Service unavailable" - * + * * @param endpoint the the endpoint * @param ex the exception * @param additionalInfo additional information that might be helpful, e.g. the subquery - * + * * @return a modified exception with endpoint source */ public static QueryEvaluationException traceExceptionSource(Endpoint endpoint, Throwable ex, @@ -89,7 +89,7 @@ public static QueryEvaluationException traceExceptionSource(Endpoint endpoint, T /** * Repair the connection and then trace the exception source. - * + * * @param endpoint * @param ex * @return the exception @@ -101,10 +101,10 @@ public static QueryEvaluationException traceExceptionSourceAndRepair(Endpoint en /** * Return the exception in a convenient representation, i.e. '%msg% (%CLASS%): %ex.getMessage()%' - * + * * @param msg * @param ex - * + * * @return the exception in a convenient representation */ public static String getExceptionString(String msg, Throwable ex) { @@ -115,12 +115,12 @@ public static String getExceptionString(String msg, Throwable ex) { * If possible change the message text of the specified exception. This is only possible if the provided exception * has a public constructor with String and Throwable as argument. The new message is set to 'msgPrefix. * ex.getMessage()', all other exception elements remain the same. - * + * * @param * @param msgPrefix * @param ex * @param exClazz - * + * * @return the updated exception */ public static E changeExceptionMessage(String msgPrefix, E ex, Class exClazz) { @@ -156,7 +156,7 @@ public static E changeExceptionMessage(String msgPrefix, E /** * Converts the {@link Throwable} to an {@link Exception}. If it is already of type exception, it is returned as is. * Otherwise, we create a new {@link QueryEvaluationException}, and attach the stack trace and a meaningful message. - * + * * @param t * @return the {@link Exception} */ @@ -179,7 +179,7 @@ public static Exception toException(Throwable t) { /** * Converts the given Throwable to a {@link QueryEvaluationException}. If it is already of type * {@link QueryEvaluationException} no transformation is done, otherwise the throwable is wrapped. - * + * * @param t * @return the {@link QueryEvaluationException} */ diff --git a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/exception/FedXException.java b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/exception/FedXException.java index e75239592ab..0b00ff2a8c0 100644 --- a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/exception/FedXException.java +++ b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/exception/FedXException.java @@ -11,7 +11,7 @@ /** * Base class for any FedX Exception. - * + * * @author Andreas Schwarte * */ diff --git a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/exception/FedXQueryException.java b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/exception/FedXQueryException.java index 5bc09471065..44b1caaa12f 100644 --- a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/exception/FedXQueryException.java +++ b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/exception/FedXQueryException.java @@ -10,7 +10,7 @@ /** * Exception to be thrown if during query evaluation a data source is not reachable, i.e. SocketException. All endpoints * are repaired and should work for the next query. - * + * * @author Andreas Schwarte * */ diff --git a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/exception/FedXRuntimeException.java b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/exception/FedXRuntimeException.java index 1d334e762d1..4d33664a00e 100644 --- a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/exception/FedXRuntimeException.java +++ b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/exception/FedXRuntimeException.java @@ -9,7 +9,7 @@ /** * Base class for any FedX Exception. - * + * * @author Andreas Schwarte * */ diff --git a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/exception/FilterConversionException.java b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/exception/FilterConversionException.java index 3b6114fb34d..9ee5e64b31e 100644 --- a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/exception/FilterConversionException.java +++ b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/exception/FilterConversionException.java @@ -9,7 +9,7 @@ /** * Thrown if a filter could not be converted. - * + * * @author Andreas Schwarte */ public class FilterConversionException extends Exception { diff --git a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/exception/IllegalQueryException.java b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/exception/IllegalQueryException.java index e50881c73a4..9a7585e6922 100644 --- a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/exception/IllegalQueryException.java +++ b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/exception/IllegalQueryException.java @@ -9,7 +9,7 @@ /** * Thrown if something is wrong while constructing the query string. - * + * * @author Andreas Schwarte */ public class IllegalQueryException extends Exception { diff --git a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/monitoring/MonitoringFactory.java b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/monitoring/MonitoringFactory.java index 22d07f8a37b..6a565d96ce2 100644 --- a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/monitoring/MonitoringFactory.java +++ b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/monitoring/MonitoringFactory.java @@ -13,13 +13,14 @@ public class MonitoringFactory { /** * Create a new monitoring instance depending on {@link FedXConfig#isEnableMonitoring()} - * + * * @return the {@link Monitoring} instance */ public static Monitoring createMonitoring(FedXConfig config) { - if (config.isEnableMonitoring()) + if (config.isEnableMonitoring()) { return new MonitoringImpl(config); + } return new NoopMonitoringImpl(); } } diff --git a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/monitoring/MonitoringImpl.java b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/monitoring/MonitoringImpl.java index f7b24ecd751..c38147da3e1 100644 --- a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/monitoring/MonitoringImpl.java +++ b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/monitoring/MonitoringImpl.java @@ -21,10 +21,10 @@ /** * Implementation supporting the following monitoring features: - * + * * - monitor remote requests per endpoint - maintain a query backlog using {@link QueryLog} - * - * + * + * * @author andreas_s * */ @@ -46,8 +46,9 @@ public class MonitoringImpl implements MonitoringService { } catch (IOException e) { throw new FedXRuntimeException("QueryLog cannot be initialized: " + e.getMessage()); } - } else + } else { queryLog = null; + } } @Override @@ -104,8 +105,9 @@ public int getNumberOfRequests() { @Override public void monitorQuery(QueryInfo query) { - if (queryLog != null) + if (queryLog != null) { queryLog.logQuery(query); + } } @Override diff --git a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/monitoring/MonitoringUtil.java b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/monitoring/MonitoringUtil.java index 20d6142c981..7291a4eb7e9 100644 --- a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/monitoring/MonitoringUtil.java +++ b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/monitoring/MonitoringUtil.java @@ -26,8 +26,9 @@ public static void printMonitoringInformation(FederationContext federationContex private static MonitoringService getMonitoringService(FederationContext federationContext) throws FedXRuntimeException { Monitoring m = federationContext.getMonitoringService(); - if (m instanceof MonitoringService) + if (m instanceof MonitoringService) { return (MonitoringService) m; + } throw new FedXRuntimeException("Monitoring is currently disabled for this system."); } diff --git a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/monitoring/NoopMonitoringImpl.java b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/monitoring/NoopMonitoringImpl.java index 7e20eac1b7c..db69e6bcf53 100644 --- a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/monitoring/NoopMonitoringImpl.java +++ b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/monitoring/NoopMonitoringImpl.java @@ -14,7 +14,9 @@ public class NoopMonitoringImpl implements Monitoring { public NoopMonitoringImpl() { - }; + } + + ; @Override public void monitorRemoteRequest(Endpoint e) { diff --git a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/monitoring/QueryLog.java b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/monitoring/QueryLog.java index 0c4271a5b4e..fdb9f088e6c 100644 --- a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/monitoring/QueryLog.java +++ b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/monitoring/QueryLog.java @@ -21,12 +21,12 @@ *

    * Requires monitoring to be enabled: *

    - * + * *
      *
    • {@link FedXConfig#isEnableMonitoring()}
    • *
    • {@link FedXConfig#isLogQueries()}
    • *
    - * + * * @author Andreas Schwarte * */ diff --git a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/monitoring/QueryPlanLog.java b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/monitoring/QueryPlanLog.java index b61b06fb74d..9a2e8d874bc 100644 --- a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/monitoring/QueryPlanLog.java +++ b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/monitoring/QueryPlanLog.java @@ -13,16 +13,16 @@ /** * Monitoring facility to maintain the query execution plan in a variable local to the executing thread. Can be used to * retrieve the query plan from the outside in the evaluation thread. - * + * * This module is only active if {@link FedXConfig#isLogQueryPlan()} is enabled. In addition * {@link FedXConfig#isEnableMonitoring()} must be set. In any other case, this class is a void operation. - * + * * @author Andreas Schwarte * */ public class QueryPlanLog { - static ThreadLocal queryPlan = new ThreadLocal(); + static ThreadLocal queryPlan = new ThreadLocal<>(); public static String getQueryPlan() { return queryPlan.get(); diff --git a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/optimizer/DefaultFedXCostModel.java b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/optimizer/DefaultFedXCostModel.java index 83d5f8cd3f0..49c0e415e93 100644 --- a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/optimizer/DefaultFedXCostModel.java +++ b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/optimizer/DefaultFedXCostModel.java @@ -29,7 +29,7 @@ /** * Default implementation of the {@link FedXCostModel} - * + * * @author Andreas Schwarte * */ @@ -42,22 +42,30 @@ public class DefaultFedXCostModel implements FedXCostModel { @Override public double estimateCost(TupleExpr tupleExpr, Set joinVars) { - if (tupleExpr instanceof StatementSourcePattern) + if (tupleExpr instanceof StatementSourcePattern) { return estimateCost((StatementSourcePattern) tupleExpr, joinVars); - if (tupleExpr instanceof ExclusiveStatement) + } + if (tupleExpr instanceof ExclusiveStatement) { return estimateCost((ExclusiveStatement) tupleExpr, joinVars); - if (tupleExpr instanceof ExclusiveGroup) + } + if (tupleExpr instanceof ExclusiveGroup) { return estimateCost((ExclusiveGroup) tupleExpr, joinVars); - if (tupleExpr instanceof NJoin) + } + if (tupleExpr instanceof NJoin) { return estimateCost((NJoin) tupleExpr, joinVars); - if (tupleExpr instanceof NUnion) + } + if (tupleExpr instanceof NUnion) { return estimateCost((NUnion) tupleExpr, joinVars); - if (tupleExpr instanceof FedXService) + } + if (tupleExpr instanceof FedXService) { return estimateCost((FedXService) tupleExpr, joinVars); - if (tupleExpr instanceof Projection) + } + if (tupleExpr instanceof Projection) { return estimateCost((Projection) tupleExpr, joinVars); - if (tupleExpr instanceof BindingSetAssignment) + } + if (tupleExpr instanceof BindingSetAssignment) { return 0; + } if (tupleExpr instanceof Extension) { return 0; } @@ -76,9 +84,11 @@ private double estimateCost(ExclusiveGroup group, Set joinVars) { // use the same counting technique as for others if (joinVars.size() > 0) { int count = 0; - for (String var : group.getFreeVars()) - if (!joinVars.contains(var)) + for (String var : group.getFreeVars()) { + if (!joinVars.contains(var)) { count++; + } + } return 100 + (count / group.getExclusiveExpressions().size()); } @@ -99,8 +109,9 @@ private double estimateCost(ExclusiveGroup group, Set joinVars) { // add some slight cost factor, if the subject in the query is not the same additionalCost += computeAdditionPatternCost(group.getExclusiveExpressions()); - if (!hasSelectiveStatement) + if (!hasSelectiveStatement) { additionalCost += 4; + } // if (hasExpensiveType) // additionalCost += 1; @@ -111,17 +122,17 @@ private double estimateCost(ExclusiveGroup group, Set joinVars) { /** * If the subject is not the same for all triple patterns in the group, an additional cost of .5 is considered. - * + * *

    * Example: *

    - * + * *
     	 * ?x p o . ?x p2 o2 => cost is 0 
    -	 * 
    +	 *
     	 * ?x p ?s . ?s ?p2 val => additional cost is 0.5
     	 * 
    - * + * * @return */ private double computeAdditionPatternCost(List stmts) { @@ -132,8 +143,9 @@ private double computeAdditionPatternCost(List stmts) { return 0.5; } String currentVar = QueryStringUtil.toString(((ExclusiveStatement) st).getSubjectVar()); - if (!currentVar.equals(s) && s != null) + if (!currentVar.equals(s) && s != null) { return 0.5; + } s = currentVar; } return 0.0; @@ -147,12 +159,15 @@ private double estimateCost(ExclusiveStatement owned, Set joinVars) { // special heuristic: if exclusive statement with one free variable, more selective than owned group // with more than 3 free variable - if (owned.getFreeVarCount() <= 1 && joinVars.isEmpty()) + if (owned.getFreeVarCount() <= 1 && joinVars.isEmpty()) { count = 3; + } - for (String var : owned.getFreeVars()) - if (!joinVars.contains(var)) + for (String var : owned.getFreeVars()) { + if (!joinVars.contains(var)) { count++; + } + } return count; } @@ -168,10 +183,11 @@ private double estimateCost(FedXService service, Set joinVars) { } if (service.getNumberOfTriplePatterns() <= 1) { - if (joinVars.isEmpty() && service.getFreeVarCount() <= 1) + if (joinVars.isEmpty() && service.getFreeVarCount() <= 1) { additionalCost = 3; // compare exclusive statement - else + } else { additionalCost += 100; // compare all statements + } } return 0 + additionalCost + service.getFreeVarCount(); @@ -189,9 +205,11 @@ private double estimateCost(StatementSourcePattern stmt, Set joinVars) { /* currently the cost is the number of free vars that are executed in the join */ int count = 100; - for (String var : stmt.getFreeVars()) - if (!joinVars.contains(var)) + for (String var : stmt.getFreeVars()) { + if (!joinVars.contains(var)) { count++; + } + } return count; } @@ -203,8 +221,9 @@ private double estimateCost(NUnion nunion, Set joinVars) { double min = Double.MAX_VALUE; for (TupleExpr t : nunion.getArgs()) { double cost = estimateCost(t, joinVars); - if (cost < min) + if (cost < min) { min = cost; + } } return min + nunion.getNumberOfArguments() - 1; diff --git a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/optimizer/ExclusiveTupleExprOptimizer.java b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/optimizer/ExclusiveTupleExprOptimizer.java index 136d5fdf7ea..599634af6d8 100644 --- a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/optimizer/ExclusiveTupleExprOptimizer.java +++ b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/optimizer/ExclusiveTupleExprOptimizer.java @@ -18,7 +18,7 @@ /** * A specialized optimizer which identifies and marks {@link ExclusiveTupleExpr}. - * + * * @author Andreas Schwarte * */ diff --git a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/optimizer/FedXCostModel.java b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/optimizer/FedXCostModel.java index 3d460d7e9d9..2fd905a5a40 100644 --- a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/optimizer/FedXCostModel.java +++ b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/optimizer/FedXCostModel.java @@ -13,7 +13,7 @@ /** * Interface for a cost model used in {@link StatementGroupAndJoinOptimizer}. - * + * * @author Andreas Schwarte * */ @@ -21,7 +21,7 @@ public interface FedXCostModel { /** * Return the estimated cost for the given {@link TupleExpr} - * + * * @param tupleExpr * @param joinVars * @return the cost associated to the tupleExpr diff --git a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/optimizer/FedXOptimizer.java b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/optimizer/FedXOptimizer.java index 737eb220815..4e8141f43d0 100644 --- a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/optimizer/FedXOptimizer.java +++ b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/optimizer/FedXOptimizer.java @@ -11,7 +11,7 @@ /** * Interface for any FedX optimizer - * + * * @author Andreas Schwarte * */ @@ -19,7 +19,7 @@ public interface FedXOptimizer { /** * Optimize the provided tuple expression - * + * * @param tupleExpr */ public void optimize(TupleExpr tupleExpr); diff --git a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/optimizer/FilterOptimizer.java b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/optimizer/FilterOptimizer.java index 61021becdf5..94a623f14f9 100644 --- a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/optimizer/FilterOptimizer.java +++ b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/optimizer/FilterOptimizer.java @@ -35,7 +35,7 @@ /** * Filter optimizer to push down FILTER expressions as far as possible. - * + * * @author Andreas Schwarte * */ @@ -90,8 +90,9 @@ public void meet(Filter filter) { filter.getArg().visit(filterExprVst); // if the filter expr. is handled in the stmt we do not have to keep it - if (filterExprVst.canRemove()) + if (filterExprVst.canRemove()) { continue; + } remainingExpr.add(filterExpr.getExpression()); @@ -103,13 +104,9 @@ public void meet(Filter filter) { if (remainingExpr.isEmpty()) { filter.replaceWith(filter.getArg()); // remove the filter - } - - else if (remainingExpr.size() == 1) { + } else if (remainingExpr.size() == 1) { filter.setCondition(remainingExpr.get(0)); // just apply the remaining condition - } - - else { + } else { // construct conjunctive value expr And root = new And(); @@ -144,14 +141,15 @@ protected void getConjunctiveExpressions(ValueExpr expr, List conjExp And and = (And) expr; getConjunctiveExpressions(and.getLeftArg(), conjExpr); getConjunctiveExpressions(and.getRightArg(), conjExpr); - } else + } else { conjExpr.add(expr); + } } /** * returns true if this filter can be used for optimization. Currently no conjunctive or disjunctive expressions are * supported. - * + * * @param e * @return whether the expression is compatible */ @@ -180,8 +178,9 @@ public HashSet findVars(ValueExpr expr) { @Override public void meet(Var var) { - if (var.getValue() == null) + if (var.getValue() == null) { vars.add(var.getName()); + } super.meet(var); } } @@ -211,13 +210,9 @@ public void meetOther(QueryModelNode node) { node.visitChildren(this); } handleFilter((FilterTuple) node, filterExpr); - } - - else if (node instanceof StatementTupleExpr) { + } else if (node instanceof StatementTupleExpr) { return; - } - - else { + } else { super.meetOther(node); } } @@ -226,19 +221,20 @@ private void handleFilter(FilterTuple filterTuple, FilterExpr expr) { /* * CompareEQ expressions are inserted as bindings if possible - * + * * if the filtertuple contains all vars of the filterexpr, we can evaluate the filter expr safely on the * filterTuple - * + * * if there is no intersection of variables, the filter is irrelevant for this expr - * + * * if there is some intersection, we cannot remove the filter and have to keep it in the query plan for * postfiltering */ int intersected = 0; for (String filterVar : expr.getVars()) { - if (filterTuple.getFreeVars().contains(filterVar)) + if (filterTuple.getFreeVars().contains(filterVar)) { intersected++; + } } // filter expression is irrelevant for this expression @@ -268,7 +264,7 @@ private void handleFilter(FilterTuple filterTuple, FilterExpr expr) { /** * Bind the given compare filter expression in the tuple expression, i.e. insert the value as binding for the * respective variable. - * + * * @param filterTuple * @param cmp * @return @@ -287,8 +283,9 @@ private boolean bindCompareInExpression(FilterTuple filterTuple, Compare cmp) { // since for instance subj can only be URIs (i.e. literals are // not allowed). For other types the Filter remains in place. - if (isVarLeft && isVarRight) + if (isVarLeft && isVarRight) { return false; + } if (isVarLeft && cmp.getRightArg() instanceof ValueConstant) { String varName = ((Var) cmp.getLeftArg()).getName(); diff --git a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/optimizer/GenericInfoOptimizer.java b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/optimizer/GenericInfoOptimizer.java index d50875a42e6..c62c23acfc1 100644 --- a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/optimizer/GenericInfoOptimizer.java +++ b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/optimizer/GenericInfoOptimizer.java @@ -8,6 +8,7 @@ package org.eclipse.rdf4j.federated.optimizer; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import org.eclipse.rdf4j.federated.algebra.FedXLeftJoin; @@ -27,18 +28,18 @@ /** * Generic optimizer - * + * * Tasks: - Collect information (hasUnion, hasFilter, hasService) - Collect all statements in a list (for source * selection), do not collect SERVICE expressions - Collect all Join arguments and group them in the NJoin structure for * easier optimization (flatten) - * + * * @author Andreas Schwarte */ public class GenericInfoOptimizer extends AbstractQueryModelVisitor implements FedXOptimizer { protected boolean hasFilter = false; protected boolean hasUnion = false; - protected boolean hasService = false; + protected List services = null; protected long limit = -1; // set to a positive number if the main query has a limit protected List stmts = new ArrayList<>(); @@ -99,7 +100,10 @@ public void meet(Filter filter) { @Override public void meet(Service service) { - hasService = true; + if (services == null) { + services = new ArrayList<>(); + } + services.add(service); } @Override @@ -107,7 +111,7 @@ public void meet(Join node) { /* * Optimization task: - * + * * Collect all join arguments recursively and create the NJoin structure for easier join order optimization */ @@ -149,6 +153,10 @@ public void meet(Slice node) throws OptimizationException { } public boolean hasService() { - return hasService; + return services != null && services.size() > 0; + } + + public List getServices() { + return services == null ? Collections.emptyList() : services; } } diff --git a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/optimizer/LimitOptimizer.java b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/optimizer/LimitOptimizer.java index f00fbf267b6..153068c11f6 100644 --- a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/optimizer/LimitOptimizer.java +++ b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/optimizer/LimitOptimizer.java @@ -17,10 +17,10 @@ /** * An optimizer that attempts to push upper limits into BGPs of the query. - * + * * Currently upper limits are only pushed for simple queries consisting of a single BGP. - * - * + * + * * @author Andreas Schwarte * */ diff --git a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/optimizer/NaryJoinArgumentsComparator.java b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/optimizer/NaryJoinArgumentsComparator.java index fafd8af8e20..df08f690dd0 100644 --- a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/optimizer/NaryJoinArgumentsComparator.java +++ b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/optimizer/NaryJoinArgumentsComparator.java @@ -15,9 +15,9 @@ /** * Comparator: - * + * * partial order: OwnedStatementSourcePatternGroup -> OwnedStatementSourcePattern -> StatementSourcePattern - * + * * @author Andreas * */ @@ -27,24 +27,20 @@ public class NaryJoinArgumentsComparator implements Comparator { public int compare(TupleExpr a, TupleExpr b) { if (a instanceof ExclusiveGroup) { - if (b instanceof ExclusiveGroup) + if (b instanceof ExclusiveGroup) { return 0; - else + } else { return -1; - } - - else if (b instanceof ExclusiveGroup) { + } + } else if (b instanceof ExclusiveGroup) { return 1; - } - - else if (a instanceof ExclusiveStatement) { - if (b instanceof ExclusiveStatement) + } else if (a instanceof ExclusiveStatement) { + if (b instanceof ExclusiveStatement) { return 0; // 0 - else + } else { return -1; // -1 - } - - else if (b instanceof ExclusiveStatement) { + } + } else if (b instanceof ExclusiveStatement) { return 1; // 1 } diff --git a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/optimizer/OptimizerUtil.java b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/optimizer/OptimizerUtil.java index 08212dd6f21..69ff04d2c9f 100644 --- a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/optimizer/OptimizerUtil.java +++ b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/optimizer/OptimizerUtil.java @@ -19,7 +19,7 @@ public class OptimizerUtil { /** * Flatten the join to one layer, i.e. collect all join arguments - * + * * @param join * @param queryInfo * @return the flattened {@link NJoin} @@ -32,7 +32,7 @@ public static NJoin flattenJoin(Join join, QueryInfo queryInfo) { /** * Collect join arguments by descending the query tree (recursively). - * + * * @param node * @param joinArgs */ @@ -41,7 +41,8 @@ protected static void collectJoinArgs(TupleExpr node, List joinArgs) if (node instanceof Join) { collectJoinArgs(((Join) node).getLeftArg(), joinArgs); collectJoinArgs(((Join) node).getRightArg(), joinArgs); - } else + } else { joinArgs.add(node); + } } } diff --git a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/optimizer/ServiceOptimizer.java b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/optimizer/ServiceOptimizer.java index dc4e2d5ad5e..1870675740a 100644 --- a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/optimizer/ServiceOptimizer.java +++ b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/optimizer/ServiceOptimizer.java @@ -28,7 +28,7 @@ /** * Optimizer for SERVICE nodes. - * + * * @author Andreas Schwarte * */ @@ -118,18 +118,19 @@ protected TupleExpr optimizeService(Service service) { /** * Return the FedX endpoint corresponding to the given service URI. If there is no such endpoint in FedX, this * method returns null. - * + * * Note that this method compares the endpoint URL first, however, that the name of the endpoint can be used as * identifier as well. Note that the name must be a valid URI, i.e. start with http:// - * + * * @param serviceUri * @return */ private Endpoint getFedXEndpoint(String serviceUri) { EndpointManager em = queryInfo.getFederationContext().getEndpointManager(); Endpoint e = em.getEndpointByUrl(serviceUri); - if (e != null) + if (e != null) { return e; + } e = em.getEndpointByName(serviceUri); return e; } diff --git a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/optimizer/SourceSelection.java b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/optimizer/SourceSelection.java index 2d12fea6edf..4cf0dca748b 100644 --- a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/optimizer/SourceSelection.java +++ b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/optimizer/SourceSelection.java @@ -44,7 +44,7 @@ /** * Perform source selection during optimization - * + * * @author Andreas Schwarte * */ @@ -69,12 +69,12 @@ public SourceSelection(List endpoints, SourceSelectionCache cache, Que /** * Perform source selection for the provided statements using cache or remote ASK queries. - * + * * Remote ASK queries are evaluated in parallel using the concurrency infrastructure of FedX. Note, that this method * is blocking until every source is resolved. - * + * * The statement patterns are replaced by appropriate annotations in this optimization. - * + * * @param stmts */ public void doSourceSelection(List stmts) { @@ -91,7 +91,7 @@ public void doSourceSelection(List stmts) { stmtToSources.put(stmt, new ArrayList<>()); - SubQuery q = new SubQuery(stmt); + SubQuery q = new SubQuery(stmt, queryInfo.getDataset()); // check for each current federation member (cache or remote ASK) for (Endpoint e : endpoints) { @@ -127,19 +127,17 @@ public void doSourceSelection(List stmts) { if (sources.size() > 1) { StatementSourcePattern stmtNode = new StatementSourcePattern(stmt, queryInfo); - for (StatementSource s : sources) + for (StatementSource s : sources) { stmtNode.addStatementSource(s); + } stmt.replaceWith(stmtNode); - } - - else if (sources.size() == 1) { + } else if (sources.size() == 1) { stmt.replaceWith(new ExclusiveStatement(stmt, sources.get(0), queryInfo)); - } - - else { - if (log.isDebugEnabled()) + } else { + if (log.isDebugEnabled()) { log.debug("Statement " + QueryStringUtil.toString(stmt) + " does not produce any results at the provided sources, replacing node with EmptyStatementPattern."); + } stmt.replaceWith(new EmptyStatementPattern(stmt)); } } @@ -147,21 +145,23 @@ else if (sources.size() == 1) { /** * Retrieve a set of relevant sources for this query. - * + * * @return the relevant sources */ public Set getRelevantSources() { Set endpoints = new HashSet<>(); - for (List sourceList : stmtToSources.values()) - for (StatementSource source : sourceList) + for (List sourceList : stmtToSources.values()) { + for (StatementSource source : sourceList) { endpoints .add(queryInfo.getFederationContext().getEndpointManager().getEndpoint(source.getEndpointID())); + } + } return endpoints; } /** * Add a source to the given statement in the map (synchronized through map) - * + * * @param stmt * @param source */ @@ -179,7 +179,7 @@ protected static class SourceSelectionExecutorWithLatch implements ParallelExecu * Execute the given list of tasks in parallel, and block the thread until all tasks are completed. * Synchronization is achieved by means of a latch. Results are added to the map of the source selection * instance. Errors are reported as {@link OptimizationException} instances. - * + * * @param tasks */ public static void run(SourceSelection sourceSelection, List tasks, SourceSelectionCache cache) { @@ -201,16 +201,18 @@ private SourceSelectionExecutorWithLatch(SourceSelection sourceSelection) { /** * Execute the given list of tasks in parallel, and block the thread until all tasks are completed. * Synchronization is achieved by means of a latch - * + * * @param tasks */ private void executeRemoteSourceSelection(List tasks, SourceSelectionCache cache) { - if (tasks.isEmpty()) + if (tasks.isEmpty()) { return; + } latch = new CountDownLatch(tasks.size()); - for (CheckTaskPair task : tasks) + for (CheckTaskPair task : tasks) { scheduler.schedule(new ParallelCheckTask(task.e, task.t, task.queryInfo, this)); + } try { boolean completed = latch.await(getQueryInfo().getMaxRemainingTimeMS(), TimeUnit.MILLISECONDS); @@ -230,15 +232,17 @@ private void executeRemoteSourceSelection(List tasks, SourceSelec sb.append( errors.size() + " errors were reported while optimizing query " + getQueryInfo().getQueryID()); - for (Exception e : errors) + for (Exception e : errors) { sb.append("\n" + ExceptionUtil.getExceptionString("Error occured", e)); + } log.debug(sb.toString()); Exception ex = errors.get(0); errors.clear(); - if (ex instanceof OptimizationException) + if (ex instanceof OptimizationException) { throw (OptimizationException) ex; + } throw new OptimizationException(ex.getMessage(), ex); } @@ -246,7 +250,8 @@ private void executeRemoteSourceSelection(List tasks, SourceSelec @Override public void run() { - /* not needed */ } + /* not needed */ + } @Override public void addResult(CloseableIteration res) { @@ -262,7 +267,8 @@ public void toss(Exception e) { @Override public void done() { - /* not needed */ } + /* not needed */ + } @Override public boolean isFinished() { @@ -289,7 +295,7 @@ public CheckTaskPair(Endpoint e, StatementPattern t, QueryInfo queryInfo) { /** * Task for sending an ASK request to the endpoints (for source selection) - * + * * @author Andreas Schwarte */ protected static class ParallelCheckTask extends ParallelTaskBase { @@ -312,13 +318,15 @@ public CloseableIteration performTask() th try { TripleSource t = endpoint.getTripleSource(); boolean hasResults = false; - hasResults = t.hasStatements(stmt, EmptyBindingSet.getInstance(), queryInfo); + hasResults = t.hasStatements(stmt, EmptyBindingSet.getInstance(), queryInfo, queryInfo.getDataset()); SourceSelection sourceSelection = control.sourceSelection; - sourceSelection.cache.updateInformation(new SubQuery(stmt), endpoint, hasResults); + sourceSelection.cache.updateInformation(new SubQuery(stmt, queryInfo.getDataset()), endpoint, + hasResults); - if (hasResults) + if (hasResults) { sourceSelection.addSource(stmt, new StatementSource(endpoint.getId(), StatementSourceType.REMOTE)); + } return null; } catch (Exception e) { diff --git a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/optimizer/StatementGroupAndJoinOptimizer.java b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/optimizer/StatementGroupAndJoinOptimizer.java index 00c26614560..c3d1ef4bc4c 100644 --- a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/optimizer/StatementGroupAndJoinOptimizer.java +++ b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/optimizer/StatementGroupAndJoinOptimizer.java @@ -32,11 +32,11 @@ /** * Optimizer with the following tasks: - * + * * 1. Group {@link ExclusiveStatement} into {@link ExclusiveGroup} 2. Adjust the join order using * {@link DefaultFedXCostModel} - * - * + * + * * @author as */ public class StatementGroupAndJoinOptimizer extends AbstractQueryModelVisitor @@ -104,7 +104,7 @@ protected void meetNJoin(NJoin node) { /** * Group {@link ExclusiveStatement}s having the same source into an {@link ExclusiveGroup}. - * + * * @param originalArgs * @return the new (potentially grouped) join arguments. If empty, the join will not produce any results. */ @@ -221,9 +221,7 @@ else if (te instanceof ExclusiveTupleExpr) { } else { newArgs.add(current); } - } - - else { + } else { newArgs.add(t); } } @@ -233,12 +231,12 @@ else if (te instanceof ExclusiveTupleExpr) { /** * Join Order Optimizer - * + * * Group -> Statements according to number of free Variables - * + * * Additional Heuristics: - ExclusiveGroups are cheaper than any other subquery - owned statements are cheaper if * they have a single free variable - * + * * @param joinArgs * @return */ @@ -263,8 +261,9 @@ protected List optimizeJoinOrder(List joinArgs) { } joinVars.addAll(QueryAlgebraUtil.getFreeVars(item)); - if (log.isTraceEnabled()) + if (log.isTraceEnabled()) { log.trace("Cost of " + item.getClass().getSimpleName() + " is determined as " + minCost); + } optimized.add(item); left.remove(item); } diff --git a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/optimizer/UnionOptimizer.java b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/optimizer/UnionOptimizer.java index a5cb33314ae..6f0fa09b52a 100644 --- a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/optimizer/UnionOptimizer.java +++ b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/optimizer/UnionOptimizer.java @@ -21,7 +21,7 @@ /** * Optimizer to flatten the UNION operations. - * + * * @author Andreas Schwarte * */ @@ -49,8 +49,9 @@ public void meet(Union union) { // remove any tuple expressions that do not produce any result List filtered = new ArrayList<>(args.size()); for (TupleExpr arg : args) { - if (arg instanceof EmptyResult) + if (arg instanceof EmptyResult) { continue; + } filtered.add(arg); } @@ -58,20 +59,16 @@ public void meet(Union union) { // however, check if we only have zero or one argument first if (filtered.isEmpty()) { union.replaceWith(new EmptyNUnion(args, queryInfo)); - } - - else if (filtered.size() == 1) { + } else if (filtered.size() == 1) { union.replaceWith(filtered.get(0)); - } - - else { + } else { union.replaceWith(new NUnion(filtered, queryInfo)); } } /** * Add the union arguments to the args list, includes a recursion step for nested unions. - * + * * @param union * @param args */ diff --git a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/repository/FedXRepository.java b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/repository/FedXRepository.java index 56f0c55ce9a..a659480f6fa 100644 --- a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/repository/FedXRepository.java +++ b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/repository/FedXRepository.java @@ -28,7 +28,7 @@ /** * A special {@link SailRepository} which performs the actions as defined in {@link FedXRepositoryConnection}. - * + * * @author as */ public class FedXRepository extends SailRepository { @@ -115,26 +115,27 @@ public void setFederatedServiceResolver(FederatedServiceResolver resolver) { /** * return the number of triples in the federation as string. Retrieving the size is only supported * {@link EndpointType#NativeStore} and {@link EndpointType#RemoteRepository}. - * + * * If the federation contains other types of endpoints, the size is indicated as a lower bound, i.e. the string * starts with a larger sign. - * + * * @return the number of triples in the federation */ public String getFederationSize() { long size = 0; boolean isLowerBound = false; - for (Endpoint e : federation.getMembers()) + for (Endpoint e : federation.getMembers()) { try { size += e.size(); } catch (RepositoryException e1) { isLowerBound = true; } + } return isLowerBound ? ">" + size : Long.toString(size); } /** - * + * * @return the {@link FederationContext} */ public FederationContext getFederationContext() { @@ -142,7 +143,7 @@ public FederationContext getFederationContext() { } /** - * + * * @return the {@link QueryManager} from the {@link FederationContext} */ public QueryManager getQueryManager() { diff --git a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/repository/FedXRepositoryConfig.java b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/repository/FedXRepositoryConfig.java index 9d41b5999ee..a9d8e864ef1 100644 --- a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/repository/FedXRepositoryConfig.java +++ b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/repository/FedXRepositoryConfig.java @@ -25,7 +25,7 @@ /** * A {@link RepositoryImplConfig} to configure FedX for the use in the RDF4J workbench. - * + * *

    * Federation member repositories (e.g. NativeStore or SPARQL endpoints) can be managed in the RDF4J Workbench, and * referenced as members in the federation. Alternatively, FedX can manage repositories, please refer to the @@ -34,24 +34,24 @@ *

    * Example configuration file: *

    - * + * *
      * # RDF4J configuration template for a FedX Repository
    - * 
    + *
      * @prefix rdfs: .
      * @prefix rep: .
      * @prefix fedx: .
    - * 
    + *
      * [] a rep:Repository ;
      * rep:repositoryImpl [
      *   rep:repositoryType "fedx:FedXRepository" ;
      *   fedx:member [
      *      fedx:store "ResolvableRepository" ;
    - *      fedx:repositoryName "endpoint1" 
    + *      fedx:repositoryName "endpoint1"
      *   ],
      *   [
      *      fedx:store "ResolvableRepository" ;
    - *      fedx:repositoryName "endpoint2" 
    + *      fedx:repositoryName "endpoint2"
      *   ]
      *   # optionally define data config
      *   #fedx:fedxConfig "fedxConfig.prop" ;
    @@ -60,12 +60,12 @@
      * rep:repositoryID "fedx" ;
      * rdfs:label "FedX Federation" .
      * 
    - * + * *

    * Note that the location of the fedx config and the data config is relative to the repository's data dir (as managed by * the RDF4J repository manager) *

    - * + * * @author Andreas Schwarte * */ @@ -100,7 +100,7 @@ public class FedXRepositoryConfig extends AbstractRepositoryImplConfig { /** * the model representing the members - * + * *
     	 * :member1 fedx:store "ResolvableRepository" ;
     	 * 		fedx:repositoryName "endpoint1" .
    @@ -186,7 +186,7 @@ public void parse(Model m, Resource implNode) throws RepositoryConfigException {
     		super.parse(m, implNode);
     
     		try {
    -			Models.objectLiteral(m.filter(implNode, DATA_CONFIG, null))
    +			Models.objectLiteral(m.getStatements(implNode, DATA_CONFIG, null))
     					.ifPresent(value -> setDataConfig(value.stringValue()));
     
     			Set memberNodes = m.filter(implNode, MEMBER, null).objects();
    diff --git a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/repository/FedXRepositoryConfigBuilder.java b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/repository/FedXRepositoryConfigBuilder.java
    index d4b6ad90e67..7a0216f01cd 100644
    --- a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/repository/FedXRepositoryConfigBuilder.java
    +++ b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/repository/FedXRepositoryConfigBuilder.java
    @@ -19,7 +19,7 @@
     
     /**
      * Builder for {@link FedXRepositoryConfig}
    - * 
    + *
      * @author Andreas Schwarte
      */
     public class FedXRepositoryConfigBuilder {
    @@ -52,7 +52,7 @@ public FedXRepositoryConfigBuilder withMembers(Collection members) {
     
     	/**
     	 * Build the {@link FedXRepositoryConfig} that can be used in the {@link RepositoryConfig}.
    -	 * 
    +	 *
     	 * @return the {@link FedXRepositoryConfig}
     	 */
     	public FedXRepositoryConfig build() {
    @@ -63,7 +63,7 @@ public FedXRepositoryConfig build() {
     
     	/**
     	 * Build the {@link RepositoryConfig}
    -	 * 
    +	 *
     	 * @param repositoryId    the repository identifier
     	 * @param repositoryTitle the repository title
     	 * @return the {@link RepositoryConfig} (incorporating {@link FedXRepositoryConfig})
    diff --git a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/repository/FedXRepositoryConnection.java b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/repository/FedXRepositoryConnection.java
    index 293ca070edc..f20aa2b92a9 100644
    --- a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/repository/FedXRepositoryConnection.java
    +++ b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/repository/FedXRepositoryConnection.java
    @@ -35,7 +35,7 @@
      * A special {@link SailRepositoryConnection} which adds the original query string as binding to the returned query. The
      * binding name is defined by {@link #BINDING_ORIGINAL_QUERY} and is added to all query instances returned by the
      * available prepare methods.
    - * 
    + *
      * @author Andreas Schwarte
      *
      */
    @@ -46,18 +46,20 @@ public class FedXRepositoryConnection extends SailRepositoryConnection {
     	 * endpoint if there is only a single federation member is relevant for this query.
     	 */
     	public static final String BINDING_ORIGINAL_QUERY = "__originalQuery";
    +	public static final String BINDING_ORIGINAL_BASE_URI = "__originalBaseURI";
     	public static final String BINDING_ORIGINAL_QUERY_TYPE = "__originalQueryType";
     	public static final String BINDING_ORIGINAL_MAX_EXECUTION_TIME = "__originalQueryMaxExecutionTime";
     
     	/**
     	 * The number of bindings in the external binding set that are added by FedX.
    -	 * 
    +	 *
     	 * @see #BINDING_ORIGINAL_QUERY
     	 * @see #BINDING_ORIGINAL_QUERY_TYPE
     	 * @see #BINDING_ORIGINAL_MAX_EXECUTION_TIME
     	 */
     	public static final Set FEDX_BINDINGS = Collections.unmodifiableSet(
    -			Sets.newHashSet(BINDING_ORIGINAL_QUERY, BINDING_ORIGINAL_QUERY_TYPE, BINDING_ORIGINAL_MAX_EXECUTION_TIME));
    +			Sets.newHashSet(BINDING_ORIGINAL_QUERY, BINDING_ORIGINAL_BASE_URI, BINDING_ORIGINAL_QUERY_TYPE,
    +					BINDING_ORIGINAL_MAX_EXECUTION_TIME));
     
     	private final FederationContext federationContext;
     
    @@ -72,13 +74,13 @@ public SailQuery prepareQuery(QueryLanguage ql, String queryString,
     			String baseURI) throws MalformedQueryException {
     		SailQuery q = super.prepareQuery(ql, queryString, baseURI);
     		if (q instanceof SailTupleQuery) {
    -			insertOriginalQueryString(q, queryString, QueryType.SELECT);
    +			insertOriginalQueryString(q, queryString, baseURI, QueryType.SELECT);
     			q = new FedXTupleQuery((SailTupleQuery) q);
     		} else if (q instanceof GraphQuery) {
    -			insertOriginalQueryString(q, queryString, QueryType.CONSTRUCT);
    +			insertOriginalQueryString(q, queryString, baseURI, QueryType.CONSTRUCT);
     			q = new FedXGraphQuery((SailGraphQuery) q);
     		} else if (q instanceof SailBooleanQuery) {
    -			insertOriginalQueryString(q, queryString, QueryType.ASK);
    +			insertOriginalQueryString(q, queryString, baseURI, QueryType.ASK);
     			q = new FedXBooleanQuery((SailBooleanQuery) q);
     		}
     		setIncludeInferredDefault(q);
    @@ -89,7 +91,7 @@ public SailQuery prepareQuery(QueryLanguage ql, String queryString,
     	public FedXTupleQuery prepareTupleQuery(QueryLanguage ql,
     			String queryString, String baseURI) throws MalformedQueryException {
     		SailTupleQuery q = super.prepareTupleQuery(ql, queryString, baseURI);
    -		insertOriginalQueryString(q, queryString, QueryType.SELECT);
    +		insertOriginalQueryString(q, queryString, baseURI, QueryType.SELECT);
     		setIncludeInferredDefault(q);
     		return new FedXTupleQuery(q);
     	}
    @@ -98,7 +100,7 @@ public FedXTupleQuery prepareTupleQuery(QueryLanguage ql,
     	public FedXGraphQuery prepareGraphQuery(QueryLanguage ql,
     			String queryString, String baseURI) throws MalformedQueryException {
     		SailGraphQuery q = super.prepareGraphQuery(ql, queryString, baseURI);
    -		insertOriginalQueryString(q, queryString, QueryType.CONSTRUCT);
    +		insertOriginalQueryString(q, queryString, baseURI, QueryType.CONSTRUCT);
     		setIncludeInferredDefault(q);
     		return new FedXGraphQuery(q);
     	}
    @@ -107,7 +109,7 @@ public FedXGraphQuery prepareGraphQuery(QueryLanguage ql,
     	public SailBooleanQuery prepareBooleanQuery(QueryLanguage ql,
     			String queryString, String baseURI) throws MalformedQueryException {
     		SailBooleanQuery q = super.prepareBooleanQuery(ql, queryString, baseURI);
    -		insertOriginalQueryString(q, queryString, QueryType.ASK);
    +		insertOriginalQueryString(q, queryString, baseURI, QueryType.ASK);
     		setIncludeInferredDefault(q);
     		return new FedXBooleanQuery(q);
     	}
    @@ -116,7 +118,7 @@ public SailBooleanQuery prepareBooleanQuery(QueryLanguage ql,
     	public Update prepareUpdate(QueryLanguage ql, String updateString, String baseURI)
     			throws RepositoryException, MalformedQueryException {
     		Update update = super.prepareUpdate(ql, updateString, baseURI);
    -		insertOriginalQueryString(update, updateString, QueryType.UPDATE);
    +		insertOriginalQueryString(update, updateString, baseURI, QueryType.UPDATE);
     		return update;
     	}
     
    @@ -124,7 +126,10 @@ private void setIncludeInferredDefault(SailQuery query) {
     		query.setIncludeInferred(federationContext.getConfig().getIncludeInferredDefault());
     	}
     
    -	private void insertOriginalQueryString(Operation query, String queryString, QueryType qt) {
    +	private void insertOriginalQueryString(Operation query, String queryString, String baseURI, QueryType qt) {
    +		if (baseURI != null) {
    +			query.setBinding(BINDING_ORIGINAL_BASE_URI, FedXUtil.literal(baseURI));
    +		}
     		query.setBinding(BINDING_ORIGINAL_QUERY, FedXUtil.literal(queryString));
     		query.setBinding(BINDING_ORIGINAL_QUERY_TYPE, FedXUtil.literal(qt.name()));
     	}
    diff --git a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/repository/FedXRepositoryFactory.java b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/repository/FedXRepositoryFactory.java
    index 0463a92d93f..3601c8dde0a 100644
    --- a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/repository/FedXRepositoryFactory.java
    +++ b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/repository/FedXRepositoryFactory.java
    @@ -17,11 +17,11 @@
     /**
      * A {@link RepositoryFactory} to use FedX in settings with a repository manager, e.g. in the RDF4J workbench.
      * 

    - * + * *

    * See {@link FedXRepositoryConfig} for the configuration. *

    - * + * * @author Andreas Schwarte * @see FedXRepositoryConfig * diff --git a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/repository/FedXRepositoryWrapper.java b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/repository/FedXRepositoryWrapper.java index 1ae9ae8994f..53c6d01ae40 100644 --- a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/repository/FedXRepositoryWrapper.java +++ b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/repository/FedXRepositoryWrapper.java @@ -21,16 +21,16 @@ /** * Wrapper for the {@link FedXRepository} in order to allow for lazy initialization. - * + * *

    * The wrapper is used from {@link FedXRepositoryFactory} in environments with a {@link RepositoryManager}, e.g. in the * RDF4J workbench. The background is that the RDF4J repository manager requires control over the repository instance. *

    - * + * *

    * The data directory and the {@link RepositoryResolver} are handled by RDF4J {@link RepositoryManager}. *

    - * + * * @author Andreas Schwarte * @see FedXFactory * diff --git a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/structures/FedXBooleanQuery.java b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/structures/FedXBooleanQuery.java index ede3c502162..864e01b1036 100644 --- a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/structures/FedXBooleanQuery.java +++ b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/structures/FedXBooleanQuery.java @@ -19,10 +19,10 @@ /** * Abstraction of a {@link SailBooleanQuery} which takes care for tracking the * {@link FedXRepositoryConnection#BINDING_ORIGINAL_MAX_EXECUTION_TIME} during evaluation. - * + * * All methods are delegated to the actual {@link SailBooleanQuery}. - * - * + * + * * @author Andreas Schwarte * */ @@ -113,8 +113,8 @@ public boolean getIncludeInferred() { } @Override - public void setMaxExecutionTime(int maxExecutionTime) { - delegate.setMaxExecutionTime(maxExecutionTime); + public void setMaxExecutionTime(int maxExecutionTimeSeconds) { + delegate.setMaxExecutionTime(maxExecutionTimeSeconds); } @Override diff --git a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/structures/FedXDataset.java b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/structures/FedXDataset.java index 9fc61c50e93..98902f8a7f3 100644 --- a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/structures/FedXDataset.java +++ b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/structures/FedXDataset.java @@ -23,7 +23,7 @@ *

    * Example *

    - * + * *
      * TupleQuery tq = ...; 
      * FedXDataset ds = new FedXDataset(tq.getDataset);
    @@ -32,7 +32,7 @@
      * tq.setDataset(ds)
      * TupleQueryResult res = tq.evaluate()
      * 
    - * + * * @author Andreas Schwarte * */ @@ -61,21 +61,33 @@ public Set getEndpoints() { @Override public Set getDefaultGraphs() { + if (delegate == null) { + return Collections.emptySet(); + } return delegate.getDefaultGraphs(); } @Override public IRI getDefaultInsertGraph() { + if (delegate == null) { + return null; + } return delegate.getDefaultInsertGraph(); } @Override public Set getDefaultRemoveGraphs() { + if (delegate == null) { + return Collections.emptySet(); + } return delegate.getDefaultRemoveGraphs(); } @Override public Set getNamedGraphs() { + if (delegate == null) { + return Collections.emptySet(); + } return delegate.getNamedGraphs(); } diff --git a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/structures/FedXGraphQuery.java b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/structures/FedXGraphQuery.java index 56307b6bf1f..6f2bfdd6e52 100644 --- a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/structures/FedXGraphQuery.java +++ b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/structures/FedXGraphQuery.java @@ -22,10 +22,10 @@ /** * Abstraction of a {@link SailGraphQuery} which takes care for tracking the * {@link FedXRepositoryConnection#BINDING_ORIGINAL_MAX_EXECUTION_TIME} during evaluation. - * + * * All methods are delegated to the actual {@link SailGraphQuery}. - * - * + * + * * @author Andreas Schwarte * */ @@ -122,8 +122,8 @@ public boolean getIncludeInferred() { } @Override - public void setMaxExecutionTime(int maxExecutionTime) { - delegate.setMaxExecutionTime(maxExecutionTime); + public void setMaxExecutionTime(int maxExecutionTimeSeconds) { + delegate.setMaxExecutionTime(maxExecutionTimeSeconds); } @Override diff --git a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/structures/FedXTupleQuery.java b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/structures/FedXTupleQuery.java index 57ab5e55ff2..5fd9247c444 100644 --- a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/structures/FedXTupleQuery.java +++ b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/structures/FedXTupleQuery.java @@ -22,10 +22,10 @@ /** * Abstraction of a {@link SailTupleQuery} which takes care for tracking the * {@link FedXRepositoryConnection#BINDING_ORIGINAL_MAX_EXECUTION_TIME} during evaluation. - * + * * All methods are delegated to the actual {@link SailTupleQuery}. - * - * + * + * * @author Andreas Schwarte * */ @@ -124,8 +124,8 @@ public boolean getIncludeInferred() { } @Override - public void setMaxExecutionTime(int maxExecutionTime) { - delegate.setMaxExecutionTime(maxExecutionTime); + public void setMaxExecutionTime(int maxExecutionTimeSeconds) { + delegate.setMaxExecutionTime(maxExecutionTimeSeconds); } @Override diff --git a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/structures/QueryInfo.java b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/structures/QueryInfo.java index ca0d013b928..47c3d6a6c8a 100644 --- a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/structures/QueryInfo.java +++ b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/structures/QueryInfo.java @@ -18,6 +18,7 @@ import org.eclipse.rdf4j.model.IRI; import org.eclipse.rdf4j.model.Resource; import org.eclipse.rdf4j.model.Value; +import org.eclipse.rdf4j.query.Dataset; import org.eclipse.rdf4j.query.QueryEvaluationException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -25,9 +26,9 @@ /** * Structure to maintain query information during evaluation, is attached to algebra nodes. Each instance is uniquely * attached to the query. - * + * * The queryId can be used to abort tasks belonging to a particular evaluation. - * + * * @author Andreas Schwarte * */ @@ -39,10 +40,13 @@ public class QueryInfo { private final BigInteger queryID; private final String query; + private final String baseURI; + private final QueryType queryType; private final long maxExecutionTimeMs; private final long start; private final boolean includeInferred; + private final Dataset dataset; private final FederationContext federationContext; @@ -51,28 +55,31 @@ public class QueryInfo { protected Set> scheduledSubtasks = ConcurrentHashMap.newKeySet(); public QueryInfo(String query, QueryType queryType, boolean incluedInferred, - FederationContext federationContext) { - this(query, queryType, 0, incluedInferred, federationContext); + FederationContext federationContext, Dataset dataset) { + this(query, null, queryType, 0, incluedInferred, federationContext, dataset); } /** - * + * * @param query * @param queryType * @param maxExecutionTime the maximum explicit query time in seconds, if 0 use * {@link org.eclipse.rdf4j.federated.FedXConfig#getEnforceMaxQueryTime()} * @param includeInferred whether to include inferred statements * @param federationContext the {@link FederationContext} + * @param dataset the {@link Dataset} */ - public QueryInfo(String query, QueryType queryType, int maxExecutionTime, boolean includeInferred, - FederationContext federationContext) { + public QueryInfo(String query, String baseURI, QueryType queryType, int maxExecutionTime, boolean includeInferred, + FederationContext federationContext, Dataset dataset) { super(); this.queryID = federationContext.getQueryManager().getNextQueryId(); this.federationContext = federationContext; this.query = query; + this.baseURI = baseURI; this.queryType = queryType; + this.dataset = dataset; int _maxExecutionTime = maxExecutionTime <= 0 ? federationContext.getConfig().getEnforceMaxQueryTime() : maxExecutionTime; @@ -82,9 +89,9 @@ public QueryInfo(String query, QueryType queryType, int maxExecutionTime, boolea } public QueryInfo(Resource subj, IRI pred, Value obj, boolean includeInferred, - FederationContext federationContext) { - this(QueryStringUtil.toString(subj, (IRI) pred, obj), QueryType.GET_STATEMENTS, includeInferred, - federationContext); + FederationContext federationContext, Dataset dataset) { + this(QueryStringUtil.toString(subj, pred, obj), QueryType.GET_STATEMENTS, includeInferred, + federationContext, dataset); } public BigInteger getQueryID() { @@ -103,8 +110,19 @@ public boolean getIncludeInferred() { return includeInferred; } + public Dataset getDataset() { + return dataset; + } + /** - * + * @return the baseURI + */ + public String getBaseURI() { + return baseURI; + } + + /** + * * @return the {@link FederationContext} in which this query is executed */ public FederationContext getFederationContext() { @@ -112,7 +130,7 @@ public FederationContext getFederationContext() { } /** - * + * * @return the maximum remaining time in ms until the query runs into a timeout. If negative, timeout has been * reached */ @@ -132,7 +150,7 @@ public long getMaxRemainingTimeMS() { /** * Register a new scheduled task for this query. - * + * * @param task * @throws QueryEvaluationException if the query has been aborted or closed */ @@ -146,7 +164,7 @@ public synchronized void registerScheduledTask(ParallelTask task) throws Quer /** * Mark the query as aborted and abort all scheduled (future) tasks known at this point in time. Also do not accept * any new scheduled tasks - * + * */ public synchronized void abort() { if (done) { @@ -160,7 +178,7 @@ public synchronized void abort() { /** * Close this query. If exists, all scheduled (future) tasks known at this point in time are aborted. Also do not * accept any new scheduled tasks - * + * */ public synchronized void close() { @@ -194,18 +212,23 @@ public int hashCode() { @Override public boolean equals(Object obj) { - if (this == obj) + if (this == obj) { return true; - if (obj == null) + } + if (obj == null) { return false; - if (getClass() != obj.getClass()) + } + if (getClass() != obj.getClass()) { return false; + } QueryInfo other = (QueryInfo) obj; if (queryID == null) { - if (other.queryID != null) + if (other.queryID != null) { return false; - } else if (!queryID.equals(other.queryID)) + } + } else if (!queryID.equals(other.queryID)) { return false; + } return true; } diff --git a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/structures/SubQuery.java b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/structures/SubQuery.java index 9b1b69b0aa6..03d090d3ddb 100644 --- a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/structures/SubQuery.java +++ b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/structures/SubQuery.java @@ -8,10 +8,13 @@ package org.eclipse.rdf4j.federated.structures; import java.io.Serializable; +import java.util.Arrays; +import org.eclipse.rdf4j.federated.util.FedXUtil; import org.eclipse.rdf4j.model.IRI; import org.eclipse.rdf4j.model.Resource; import org.eclipse.rdf4j.model.Value; +import org.eclipse.rdf4j.query.Dataset; import org.eclipse.rdf4j.query.algebra.StatementPattern; public class SubQuery implements Serializable { @@ -21,21 +24,26 @@ public class SubQuery implements Serializable { protected final Resource subj; protected final IRI pred; protected final Value obj; + /** + * the contexts, length zero array for triple mode query + */ + protected final Resource[] contexts; - public SubQuery(Resource subj, IRI pred, Value obj) { + public SubQuery(Resource subj, IRI pred, Value obj, Resource... contexts) { super(); this.subj = subj; this.pred = pred; this.obj = obj; + this.contexts = contexts; } - public SubQuery(StatementPattern stmt) { + public SubQuery(StatementPattern stmt, Dataset dataset) { this((Resource) stmt.getSubjectVar().getValue(), (IRI) stmt.getPredicateVar().getValue(), - stmt.getObjectVar().getValue()); + stmt.getObjectVar().getValue(), FedXUtil.toContexts(stmt, dataset)); } /** - * + * * @return true if this subquery is unbound in all three positions */ public boolean isUnbound() { @@ -54,10 +62,15 @@ public Value object() { return this.obj; } + public Resource[] contexts() { + return this.contexts; + } + @Override public int hashCode() { final int prime = 31; int result = 1; + result = prime * result + Arrays.hashCode(contexts); result = prime * result + ((obj == null) ? 0 : obj.hashCode()); result = prime * result + ((pred == null) ? 0 : pred.hashCode()); result = prime * result + ((subj == null) ? 0 : subj.hashCode()); @@ -66,28 +79,40 @@ public int hashCode() { @Override public boolean equals(Object obj) { - if (this == obj) + if (this == obj) { return true; - if (obj == null) + } + if (obj == null) { return false; - if (getClass() != obj.getClass()) + } + if (getClass() != obj.getClass()) { return false; + } SubQuery other = (SubQuery) obj; + if (!Arrays.equals(contexts, other.contexts)) { + return false; + } if (this.obj == null) { - if (other.obj != null) + if (other.obj != null) { return false; - } else if (!this.obj.equals(other.obj)) + } + } else if (!this.obj.equals(other.obj)) { return false; + } if (pred == null) { - if (other.pred != null) + if (other.pred != null) { return false; - } else if (!pred.equals(other.pred)) + } + } else if (!pred.equals(other.pred)) { return false; + } if (subj == null) { - if (other.subj != null) + if (other.subj != null) { return false; - } else if (!subj.equals(other.subj)) + } + } else if (!subj.equals(other.subj)) { return false; + } return true; } diff --git a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/util/FedXUtil.java b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/util/FedXUtil.java index e98b8803c0f..5d6e7ae084e 100644 --- a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/util/FedXUtil.java +++ b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/util/FedXUtil.java @@ -7,6 +7,7 @@ *******************************************************************************/ package org.eclipse.rdf4j.federated.util; +import java.util.Set; import java.util.concurrent.atomic.AtomicLong; import org.eclipse.rdf4j.federated.FedXConfig; @@ -14,19 +15,31 @@ import org.eclipse.rdf4j.federated.repository.FedXRepositoryConnection; import org.eclipse.rdf4j.model.IRI; import org.eclipse.rdf4j.model.Literal; +import org.eclipse.rdf4j.model.Resource; +import org.eclipse.rdf4j.model.Value; import org.eclipse.rdf4j.model.ValueFactory; import org.eclipse.rdf4j.model.impl.SimpleValueFactory; +import org.eclipse.rdf4j.query.Dataset; import org.eclipse.rdf4j.query.Operation; +import org.eclipse.rdf4j.query.algebra.StatementPattern; +import org.eclipse.rdf4j.query.algebra.StatementPattern.Scope; +import org.eclipse.rdf4j.query.impl.SimpleDataset; import org.eclipse.rdf4j.repository.sail.SailQuery; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.google.common.collect.Sets; /** * General utility functions - * + * * @author Andreas Schwarte * @since 5.0 */ public class FedXUtil { + private static final Logger log = LoggerFactory.getLogger(FedXUtil.class); + private static final AtomicLong count = new AtomicLong(0L); /** @@ -38,7 +51,7 @@ public static IRI iri(String iri) { } /** - * + * * @param literal * @return the string literal */ @@ -47,7 +60,7 @@ public static Literal literal(String literal) { } /** - * + * * @return a {@link SimpleValueFactory} instance */ public static ValueFactory valueFactory() { @@ -57,7 +70,7 @@ public static ValueFactory valueFactory() { /** * Apply query bindings to transfer information from the query into the evaluation routine, e.g. the query execution * time. - * + * * @param query */ public static void applyQueryBindings(SailQuery query) { @@ -67,7 +80,7 @@ public static void applyQueryBindings(SailQuery query) { /** * Hexadecimal representation of an incremental integer. - * + * * @return an incremental hex UUID */ public static String getIncrementalUUID() { @@ -77,10 +90,10 @@ public static String getIncrementalUUID() { /** * Set a maximum execution time corresponding to {@link FedXConfig#getEnforceMaxQueryTime()} to this operation. - * + * * Note that this is an upper bound only as FedX applies other means for evaluation the maximum query execution * time. - * + * * @param operation the {@link Operation} * @param federationContext the {@link FederationContext} */ @@ -91,4 +104,98 @@ public static void applyMaxQueryExecutionTime(Operation operation, FederationCon } operation.setMaxExecutionTime(maxExecutionTime); } + + /** + * Convert the given contexts to a {@link Dataset} representation. + * + * @param contexts + * @return + */ + public static Dataset toDataset(Resource[] contexts) { + SimpleDataset dataset = new SimpleDataset(); + for (Resource context : contexts) { + if (!(context instanceof IRI)) { + log.warn("FedX does not support to use non-IRIs as context identifier. Ignoring {}", context); + continue; + } + dataset.addDefaultGraph((IRI) context); + } + return dataset; + } + + /** + * Convert the given {@link Dataset} to an array of contexts + * + * @param ds + * @return + */ + public static Resource[] toContexts(Dataset ds) { + if (ds == null) { + return new Resource[0]; + } + return ds.getDefaultGraphs().toArray(new Resource[0]); + } + + /** + * Retrieve the contexts from the {@link StatementPattern} and {@link Dataset}. + * + * @param stmt + * @param dataset + * @return + */ + public static Resource[] toContexts(StatementPattern stmt, Dataset dataset) { + if (dataset == null && (stmt.getContextVar() == null || !stmt.getContextVar().hasValue())) { + return new Resource[0]; + } + + Set contexts = Sets.newHashSet(); + + if (dataset != null) { + contexts.addAll(dataset.getDefaultGraphs()); + } + + if (stmt.getScope().equals(Scope.NAMED_CONTEXTS)) { + if (stmt.getContextVar().hasValue()) { + contexts.add((Resource) stmt.getContextVar().getValue()); + } + } + + return contexts.toArray(new Resource[contexts.size()]); + } + + /** + * Returns a {@link Dataset} representation of the given {@link StatementPattern} and {@link Dataset}. + *

    + * If the {@link StatementPattern} does not have a context value, the {@link Dataset} is returned as-is, which may + * also be null. + *

    + * + *

    + * Otherwise the newly constructed {@link Dataset} contains all information from the original one plus the context + * from the statement. + *

    + * + * @param stmt + * @param dataset + * @return + */ + public static Dataset toDataset(StatementPattern stmt, Dataset dataset) { + if (stmt.getContextVar() == null || !stmt.getContextVar().hasValue()) { + return dataset; + } + SimpleDataset res = new SimpleDataset(); + if (dataset != null) { + dataset.getDefaultGraphs().forEach(iri -> res.addDefaultGraph(iri)); + dataset.getNamedGraphs().forEach(iri -> res.addNamedGraph(iri)); + dataset.getDefaultRemoveGraphs().forEach(iri -> res.addDefaultRemoveGraph(iri)); + res.setDefaultInsertGraph(dataset.getDefaultInsertGraph()); + } + Value stmtContext = stmt.getContextVar().getValue(); + if (stmtContext instanceof IRI) { + res.addDefaultGraph((IRI) stmtContext); + } else { + log.warn("FedX named graph handling does not support non-IRIs: " + stmtContext); + } + return res; + } } diff --git a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/util/FilterUtils.java b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/util/FilterUtils.java index 18c10b2f341..90690b38484 100644 --- a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/util/FilterUtils.java +++ b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/util/FilterUtils.java @@ -24,29 +24,31 @@ /** * Various utility functions to handle filter expressions. - * + * * NOTE: currently only implemented for {@link Compare}, other filter expressions need to be added. If an unexpected * filter expression occurs, the filter evaluation is done locally. - * + * * @author Andreas Schwarte */ public class FilterUtils { /** * Returns a SPARQL representation of the provided expression, - * + * * e.g Compare(?v, "<", 3) is converted to "?v < '3'" - * + * * @param filterExpr * @return the SPARQL string * @throws FilterConversionException */ public static String toSparqlString(FilterValueExpr filterExpr) throws FilterConversionException { - if (filterExpr instanceof FilterExpr) + if (filterExpr instanceof FilterExpr) { return toSparqlString((FilterExpr) filterExpr); - if (filterExpr instanceof ConjunctiveFilterExpr) + } + if (filterExpr instanceof ConjunctiveFilterExpr) { return toSparqlString((ConjunctiveFilterExpr) filterExpr); + } throw new RuntimeException("Unsupported type: " + filterExpr.getClass().getCanonicalName()); } @@ -64,8 +66,9 @@ public static String toSparqlString(ConjunctiveFilterExpr filterExpr) throws Fil sb.append("( "); for (FilterExpr expr : filterExpr.getExpressions()) { append(expr.getExpression(), sb); - if (++count < filterExpr.getExpressions().size()) + if (++count < filterExpr.getExpressions().size()) { sb.append(" && "); + } } sb.append(" )"); @@ -74,10 +77,12 @@ public static String toSparqlString(ConjunctiveFilterExpr filterExpr) throws Fil public static ValueExpr toFilter(FilterValueExpr filterExpr) throws FilterConversionException { - if (filterExpr instanceof FilterExpr) + if (filterExpr instanceof FilterExpr) { return toFilter((FilterExpr) filterExpr); - if (filterExpr instanceof ConjunctiveFilterExpr) + } + if (filterExpr instanceof ConjunctiveFilterExpr) { return toFilter((ConjunctiveFilterExpr) filterExpr); + } throw new RuntimeException("Unsupported type: " + filterExpr.getClass().getCanonicalName()); } @@ -147,10 +152,12 @@ protected static void append(ValueConstant vc, StringBuilder sb) { protected static StringBuilder appendValue(StringBuilder sb, Value value) { - if (value instanceof IRI) + if (value instanceof IRI) { return appendURI(sb, (IRI) value); - if (value instanceof Literal) + } + if (value instanceof Literal) { return appendLiteral(sb, (Literal) value); + } // XXX check for other types ? BNode ? throw new RuntimeException("Type not supported: " + value.getClass().getCanonicalName()); diff --git a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/util/QueryAlgebraUtil.java b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/util/QueryAlgebraUtil.java index 4f1a4905d9f..c77961b9054 100644 --- a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/util/QueryAlgebraUtil.java +++ b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/util/QueryAlgebraUtil.java @@ -56,7 +56,7 @@ /** * Various static functions for query handling and parsing (alegbra expression). - * + * * @author Andreas Schwarte */ public class QueryAlgebraUtil { @@ -65,15 +65,16 @@ public class QueryAlgebraUtil { /** * returns true iff there is at least one free variable, i.e. there is no binding for any variable - * + * * @param stmt * @param bindings * @return whether there is at least one free variable */ public static boolean hasFreeVars(StatementPattern stmt, BindingSet bindings) { for (Var var : stmt.getVarList()) { - if (!var.hasValue() && !bindings.hasBinding(var.getName())) + if (!var.hasValue() && !bindings.hasBinding(var.getName())) { return true; // there is at least one free var + } } return false; } @@ -81,10 +82,10 @@ public static boolean hasFreeVars(StatementPattern stmt, BindingSet bindings) { /** * Return the {@link Value} of the variable which is either taken from the variable itself (bound) or from the * bindingsset (unbound). - * + * * @param var * @param bindings the bindings, must not be null, use {@link EmptyBindingSet} instead - * + * * @return the value or null */ public static Value getVarValue(Var var, BindingSet bindings) { @@ -99,7 +100,7 @@ public static Value getVarValue(Var var, BindingSet bindings) { /** * Convert the given {@link ArbitraryLengthPath} to a fresh {@link TupleExpr} where all provided bindings are bound. - * + * * @param node * @param varNames * @param bindings @@ -143,13 +144,13 @@ public static Statement toStatement(StatementPattern stmt, BindingSet bindings) /** * Construct a SELECT query for the provided statement. - * + * * @param stmt * @param bindings * @param filterExpr * @param evaluated parameter can be used outside this method to check whether FILTER has been evaluated, false in * beginning - * + * * @return the SELECT query * @throws IllegalQueryException */ @@ -159,8 +160,9 @@ public static TupleExpr selectQuery(StatementPattern stmt, BindingSet bindings, Set varNames = new HashSet<>(); TupleExpr expr = constructStatement(stmt, varNames, bindings); - if (varNames.isEmpty()) + if (varNames.isEmpty()) { throw new IllegalQueryException("SELECT query needs at least one projection!"); + } if (filterExpr != null) { try { @@ -173,8 +175,9 @@ public static TupleExpr selectQuery(StatementPattern stmt, BindingSet bindings, } ProjectionElemList projList = new ProjectionElemList(); - for (String var : varNames) + for (String var : varNames) { projList.addElement(new ProjectionElem(var)); + } Projection proj = new Projection(expr, projList); @@ -184,13 +187,13 @@ public static TupleExpr selectQuery(StatementPattern stmt, BindingSet bindings, /** * Construct a SELECT query for the provided {@link ExclusiveGroup}. Note that bindings and filterExpr are applied * whenever possible. - * + * * @param group the expression for the query * @param bindings the bindings to be applied * @param filterExpr a filter expression or null * @param evaluated parameter can be used outside this method to check whether FILTER has been evaluated, false in * beginning - * + * * @return the SELECT query */ public static TupleExpr selectQuery(ExclusiveGroup group, BindingSet bindings, FilterValueExpr filterExpr, @@ -231,8 +234,9 @@ public static TupleExpr selectQuery(ExclusiveGroup group, BindingSet bindings, F } ProjectionElemList projList = new ProjectionElemList(); - for (String var : varNames) + for (String var : varNames) { projList.addElement(new ProjectionElem(var)); + } Projection proj = new Projection(expr, projList); @@ -241,19 +245,19 @@ public static TupleExpr selectQuery(ExclusiveGroup group, BindingSet bindings, F /** * Construct a SELECT query expression for a bound union. - * + * * Pattern: - * + * * SELECT ?v_1 ?v_2 ?v_N WHERE { { ?v_1 p o } UNION { ?v_2 p o } UNION ... } - * + * * Note that the filterExpr is not evaluated at the moment. - * + * * @param stmt * @param unionBindings * @param filterExpr * @param evaluated parameter can be used outside this method to check whether FILTER has been evaluated, false * in beginning - * + * * @return the SELECT query */ public static TupleExpr selectQueryBoundUnion(StatementPattern stmt, List unionBindings, @@ -276,8 +280,9 @@ public static TupleExpr selectQueryBoundUnion(StatementPattern stmt, List - * + * * @param exclusiveExpr * @param varNames * @param bindings @@ -368,11 +374,11 @@ private static TupleExpr constructJoinArg(ExclusiveTupleExpr exclusiveExpr, Set< /** * Construct the statement string, i.e. "s p o . " with bindings inserted wherever possible. Note that the free * variables are added to the varNames set for further evaluation. - * + * * @param stmt * @param varNames * @param bindings - * + * * @return the {@link StatementPattern} */ protected static StatementPattern constructStatement(StatementPattern stmt, Set varNames, @@ -389,11 +395,11 @@ protected static StatementPattern constructStatement(StatementPattern stmt, Set< * Construct the statement string, i.e. "s p o . " with bindings inserted wherever possible. Variables are renamed * to "var_"+varId to identify query results in bound queries. Note that the free variables are also added to the * varNames set for further evaluation. - * + * * @param stmt * @param varNames * @param bindings - * + * * @return the {@link StatementPattern} */ protected static StatementPattern constructStatementId(StatementPattern stmt, String varID, Set varNames, @@ -409,7 +415,7 @@ protected static StatementPattern constructStatementId(StatementPattern stmt, St /** * Construct the statement string, i.e. "s p ?o_varID FILTER ?o_N=o ". This kind of statement pattern is necessary * to later on identify available results. - * + * * @param stmt * @param varID * @param varNames @@ -445,33 +451,34 @@ protected static TupleExpr constructStatementCheckId(StatementPattern stmt, int /** * Clone the specified variable and attach bindings. - * + * * @param var * @param varNames * @param bindings - * + * * @return the variable - * + * */ protected static Var appendVar(Var var, Set varNames, BindingSet bindings) { Var res = var.clone(); if (!var.hasValue()) { - if (bindings.hasBinding(var.getName())) + if (bindings.hasBinding(var.getName())) { res.setValue(bindings.getValue(var.getName())); - else + } else { varNames.add(var.getName()); + } } return res; } /** * Clone the specified variable and attach bindings, moreover change name of variable by appending "_varId" to it. - * + * * @param var * @param varID * @param varNames * @param bindings - * + * * @return the variable */ protected static Var appendVarId(Var var, String varID, Set varNames, BindingSet bindings) { @@ -490,7 +497,7 @@ protected static Var appendVarId(Var var, String varID, Set varNames, Bi /** * A helper class to insert bindings in the {@link Var} nodes of the given {@link TupleExpr}. - * + * * @author Andreas Schwarte * */ @@ -520,7 +527,7 @@ public void meet(Var node) throws QueryEvaluationException { /** * Computes the collection of free variables in the given {@link TupleExpr}. - * + * * @param tupleExpr the expression * @return the free variables * @see VariableExpr @@ -539,8 +546,9 @@ public static Collection getFreeVars(TupleExpr tupleExpr) { if (tupleExpr instanceof NTuple) { HashSet freeVars = new HashSet<>(); NTuple ntuple = (NTuple) tupleExpr; - for (TupleExpr t : ntuple.getArgs()) + for (TupleExpr t : ntuple.getArgs()) { freeVars.addAll(getFreeVars(t)); + } return freeVars; } @@ -556,12 +564,15 @@ public static Collection getFreeVars(TupleExpr tupleExpr) { if (tupleExpr instanceof StatementPattern) { List freeVars = new ArrayList<>(); StatementPattern st = (StatementPattern) tupleExpr; - if (st.getSubjectVar().getValue() == null) + if (st.getSubjectVar().getValue() == null) { freeVars.add(st.getSubjectVar().getName()); - if (st.getPredicateVar().getValue() == null) + } + if (st.getPredicateVar().getValue() == null) { freeVars.add(st.getPredicateVar().getName()); - if (st.getObjectVar().getValue() == null) + } + if (st.getObjectVar().getValue() == null) { freeVars.add(st.getObjectVar().getName()); + } return freeVars; } @@ -575,8 +586,8 @@ public static Collection getFreeVars(TupleExpr tupleExpr) { } if (tupleExpr instanceof Extension) { - // for a BIND extension in our cost model we work with 0 free vars - return new ArrayList(); + // for a BIND extension in our cost model we use the binding names + return new ArrayList<>(tupleExpr.getBindingNames()); } if (tupleExpr instanceof ArbitraryLengthPath) { @@ -593,6 +604,6 @@ public static Collection getFreeVars(TupleExpr tupleExpr) { log.debug("Type " + tupleExpr.getClass().getSimpleName() + " not supported for computing free vars. If you run into this, please report a bug."); - return new ArrayList(); + return new ArrayList<>(); } } diff --git a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/util/QueryStringUtil.java b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/util/QueryStringUtil.java index ef42dd23f11..b9e14a5179f 100644 --- a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/util/QueryStringUtil.java +++ b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/util/QueryStringUtil.java @@ -33,9 +33,11 @@ import org.eclipse.rdf4j.model.Resource; import org.eclipse.rdf4j.model.Value; import org.eclipse.rdf4j.query.BindingSet; +import org.eclipse.rdf4j.query.Dataset; import org.eclipse.rdf4j.query.algebra.ArbitraryLengthPath; import org.eclipse.rdf4j.query.algebra.Join; import org.eclipse.rdf4j.query.algebra.StatementPattern; +import org.eclipse.rdf4j.query.algebra.StatementPattern.Scope; import org.eclipse.rdf4j.query.algebra.Var; import org.eclipse.rdf4j.query.impl.EmptyBindingSet; import org.slf4j.Logger; @@ -43,7 +45,7 @@ /** * Various static functions for query handling and parsing. - * + * * @author Andreas Schwarte */ public class QueryStringUtil { @@ -60,15 +62,16 @@ public class QueryStringUtil { /** * returns true iff there is at least one free variable, i.e. there is no binding for any variable - * + * * @param stmt * @param bindings * @return whether free vars are available */ public static boolean hasFreeVars(StatementPattern stmt, BindingSet bindings) { for (Var var : stmt.getVarList()) { - if (!var.hasValue() && !bindings.hasBinding(var.getName())) + if (!var.hasValue() && !bindings.hasBinding(var.getName())) { return true; // there is at least one free var + } } return false; } @@ -76,9 +79,9 @@ public static boolean hasFreeVars(StatementPattern stmt, BindingSet bindings) { /** * Return a string representation of this statement using the following pattern, where variables are indicated using * ?var and values are represented as strings. - * + * * Pattern: {s; p; o} - * + * * @param stmt * @return a string representation of the statement */ @@ -96,11 +99,11 @@ public static String toString(StatementPattern stmt) { /** * Converts an {@link ArbitraryLengthPath} node to a sub query string and makes sure to insert any bindings. - * + * *

    * This method assumes that the {@link ArbitraryLengthPath#getPathExpression()} is a {@link StatementPattern}. *

    - * + * * @param node * @param varNames * @param bindings @@ -131,17 +134,18 @@ public static String toString(ArbitraryLengthPath node, Set varNames, Bi } public static String toString(Var var) { - if (!var.hasValue()) + if (!var.hasValue()) { return "?" + var.getName(); + } return getValueString(var.getValue()); } /** * Return a string representation of this statement using the following pattern, where variables are indicated using * ?var and values are represented as strings. - * + * * Pattern: {s; p; o} - * + * * @param subj the subject * @param pred the predicate * @param obj the object @@ -153,18 +157,18 @@ public static String toString(Resource subj, IRI pred, Value obj) { /** * Construct a SELECT query for the provided statement. - * + * * @param stmt * @param bindings * @param filterExpr * @param evaluated parameter can be used outside this method to check whether FILTER has been evaluated, false in * beginning - * + * * @return the SELECT query * @throws IllegalQueryException if the query does not have any free variables */ - public static String selectQueryString(FedXStatementPattern stmt, BindingSet bindings, FilterValueExpr filterExpr, - AtomicBoolean evaluated) throws IllegalQueryException { + public static String selectQueryString(StatementPattern stmt, BindingSet bindings, FilterValueExpr filterExpr, + AtomicBoolean evaluated, Dataset dataset) throws IllegalQueryException { Set varNames = new HashSet<>(); String s = constructStatement(stmt, varNames, bindings); @@ -173,13 +177,17 @@ public static String selectQueryString(FedXStatementPattern stmt, BindingSet bin res.append("SELECT "); - if (varNames.isEmpty()) + if (varNames.isEmpty()) { throw new IllegalQueryException("SELECT query needs at least one projection!"); + } - for (String var : varNames) + for (String var : varNames) { res.append(" ?").append(var); + } - res.append(" WHERE { ").append(s); + res.append(" "); + appendDatasetClause(res, dataset); + res.append("WHERE { ").append(s); if (filterExpr != null) { try { @@ -194,28 +202,31 @@ public static String selectQueryString(FedXStatementPattern stmt, BindingSet bin res.append(" }"); - long upperLimit = stmt.getUpperLimit(); - if (upperLimit > 0) { - res.append(" LIMIT ").append(upperLimit); + if (stmt instanceof FedXStatementPattern) { + long upperLimit = ((FedXStatementPattern) stmt).getUpperLimit(); + if (upperLimit > 0) { + res.append(" LIMIT ").append(upperLimit); + } } + return res.toString(); } /** * Construct a SELECT query for the provided {@link ExclusiveTupleExprRenderer} - * + * * @param stmt * @param bindings * @param filterExpr * @param evaluated parameter can be used outside this method to check whether FILTER has been evaluated, false in * beginning - * + * * @return the SELECT query * @throws IllegalQueryException if the query does not have any free variables */ public static String selectQueryString(ExclusiveTupleExprRenderer expr, BindingSet bindings, FilterValueExpr filterExpr, - AtomicBoolean evaluated) throws IllegalQueryException { + AtomicBoolean evaluated, Dataset dataset) throws IllegalQueryException { Set varNames = new HashSet<>(); String s = constructJoinArg(expr, varNames, bindings); @@ -224,13 +235,17 @@ public static String selectQueryString(ExclusiveTupleExprRenderer expr, BindingS res.append("SELECT "); - if (varNames.isEmpty()) + if (varNames.isEmpty()) { throw new IllegalQueryException("SELECT query needs at least one projection!"); + } - for (String var : varNames) + for (String var : varNames) { res.append(" ?").append(var); + } - res.append(" WHERE { ").append(s); + res.append(" "); + appendDatasetClause(res, dataset); + res.append("WHERE { ").append(s); if (filterExpr != null) { try { @@ -256,36 +271,41 @@ public static String selectQueryString(ExclusiveTupleExprRenderer expr, BindingS /** * Construct a SELECT query for the provided {@link ExclusiveGroup}. Note that bindings and filterExpr are applied * whenever possible. - * + * * @param group the expression for the query * @param bindings the bindings to be applied * @param filterExpr a filter expression or null * @param evaluated parameter can be used outside this method to check whether FILTER has been evaluated, false in * beginning - * + * * @return the SELECT query string * @throws IllegalQueryException - * + * */ public static String selectQueryString(ExclusiveGroup group, BindingSet bindings, FilterValueExpr filterExpr, - AtomicBoolean evaluated) throws IllegalQueryException { + AtomicBoolean evaluated, Dataset dataset) throws IllegalQueryException { StringBuilder sb = new StringBuilder(); Set varNames = new HashSet<>(); - for (ExclusiveTupleExpr s : group.getExclusiveExpressions()) + for (ExclusiveTupleExpr s : group.getExclusiveExpressions()) { sb.append(constructJoinArg(s, varNames, bindings)); + } - if (varNames.isEmpty()) + if (varNames.isEmpty()) { throw new IllegalQueryException("SELECT query needs at least one projection!"); + } StringBuilder res = new StringBuilder(); res.append("SELECT "); - for (String var : varNames) + for (String var : varNames) { res.append(" ?").append(var); + } - res.append(" WHERE { ").append(sb); + res.append(" "); + appendDatasetClause(res, dataset); + res.append("WHERE { ").append(sb); if (filterExpr != null) { try { @@ -305,51 +325,53 @@ public static String selectQueryString(ExclusiveGroup group, BindingSet bindings /** * Transform the {@link ExclusiveTupleExpr} into a ASK query string - * + * * @param expr * @param bindings * @return the ASK query string * @throws IllegalQueryException */ - public static String askQueryString(ExclusiveTupleExpr expr, BindingSet bindings) { + public static String askQueryString(ExclusiveTupleExpr expr, BindingSet bindings, Dataset dataset) { Set varNames = new HashSet<>(); StringBuilder res = new StringBuilder(); - res.append("ASK { ").append(constructJoinArg(expr, varNames, bindings)).append(" }"); + res.append("ASK "); + appendDatasetClause(res, dataset); + res.append("{ ").append(constructJoinArg(expr, varNames, bindings)).append(" }"); return res.toString(); } /** * Construct a SELECT query string for a bound union. - * + * * Pattern: - * + * * SELECT ?v_1 ?v_2 ?v_N WHERE { { ?v_1 p o } UNION { ?v_2 p o } UNION ... } - * + * * Note that the filterExpr is not evaluated at the moment. - * + * * @param stmt * @param unionBindings * @param filterExpr * @param evaluated parameter can be used outside this method to check whether FILTER has been evaluated, false * in beginning - * + * * @return the SELECT query string * @deprecated replaced with * {@link #selectQueryStringBoundJoinVALUES(StatementPattern, List, FilterValueExpr, AtomicBoolean)} */ @Deprecated public static String selectQueryStringBoundUnion(StatementPattern stmt, List unionBindings, - FilterValueExpr filterExpr, Boolean evaluated) { + FilterValueExpr filterExpr, Boolean evaluated, Dataset dataset) { Set varNames = new HashSet<>(); - StringBuilder unions = new StringBuilder(); for (int i = 0; i < unionBindings.size(); i++) { String s = constructStatementId(stmt, Integer.toString(i), varNames, unionBindings.get(i)); - if (i > 0) + if (i > 0) { unions.append(" UNION"); + } unions.append(" { ").append(s).append(" }"); } @@ -357,10 +379,13 @@ public static String selectQueryStringBoundUnion(StatementPattern stmt, List * Example subquery: *

    - * + * *
    -	 * SELECT ?v ?__index WHERE { 
    -	 *    VALUES (?s ?__index) { 
    +	 * SELECT ?v ?__index WHERE {
    +	 *    VALUES (?s ?__index) {
     	 *      (:s1 1) (:s2 2) 
     	 *      ... 
     	 *      (:sN N) 
    -	 *    } 
    +	 *    }
     	 *    ?s name ?v. 
     	 * }
     	 * 
    - * + * * @param stmt * @param unionBindings * @param filterExpr * @param evaluated parameter can be used outside this method to check whether FILTER has been evaluated, false * in beginning - * + * * @return the SELECT query string * @see SparqlFederationEvalStrategy * @see BoundJoinVALUESConversionIteration * @since 3.0 */ public static String selectQueryStringBoundJoinVALUES(StatementPattern stmt, List unionBindings, - FilterValueExpr filterExpr, AtomicBoolean evaluated) { + FilterValueExpr filterExpr, AtomicBoolean evaluated, Dataset dataset) { Set varNames = new LinkedHashSet<>(); StringBuilder res = new StringBuilder(); @@ -411,10 +436,15 @@ public static String selectQueryStringBoundJoinVALUES(StatementPattern stmt, Lis String stmtPattern = constructStatement(stmt, varNames, new EmptyBindingSet()); res.append("SELECT "); - for (String var : varNames) + for (String var : varNames) { res.append(" ?").append(var); + } + + res.append(" ?").append(BoundJoinVALUESConversionIteration.INDEX_BINDING_NAME); - res.append(" ?").append(BoundJoinVALUESConversionIteration.INDEX_BINDING_NAME).append(" WHERE {"); + res.append(" "); + appendDatasetClause(res, dataset); + res.append("WHERE {"); // TODO evaluate filter expression remote // if (filterExpr!=null) { @@ -425,18 +455,20 @@ public static String selectQueryStringBoundJoinVALUES(StatementPattern stmt, Lis res.append(" VALUES ("); // find relevant bindings - for (String var : varNames) + for (String var : varNames) { res.append("?").append(var).append(" "); + } res.append(" ?__index) { "); int index = 0; for (BindingSet b : unionBindings) { res.append("("); for (String var : varNames) { - if (b.hasBinding(var)) + if (b.hasBinding(var)) { appendValue(res, b.getValue(var)).append(" "); - else + } else { res.append("UNDEF "); + } } res.append("\"").append(index).append("\") "); index++; @@ -453,24 +485,26 @@ public static String selectQueryStringBoundJoinVALUES(StatementPattern stmt, Lis /** * Construct a SELECT query for a grouped bound check. - * + * * Pattern: - * + * * SELECT ?o_1 .. ?o_N WHERE { { s1 p1 ?o_1 FILTER ?o_1=o1 } UNION ... UNION { sN pN ?o_N FILTER ?o_N=oN }} - * + * * @param stmt * @param unionBindings * @return the SELECT query string */ - public static String selectQueryStringBoundCheck(StatementPattern stmt, List unionBindings) { + public static String selectQueryStringBoundCheck(StatementPattern stmt, List unionBindings, + Dataset dataset) { Set varNames = new HashSet<>(); StringBuilder unions = new StringBuilder(); for (int i = 0; i < unionBindings.size(); i++) { String s = constructStatementCheckId(stmt, i, varNames, unionBindings.get(i)); - if (i > 0) + if (i > 0) { unions.append(" UNION"); + } unions.append(" { ").append(s).append(" }"); } @@ -478,10 +512,15 @@ public static String selectQueryStringBoundCheck(StatementPattern stmt, List 0) + if (idx > 0) { innerUnion.append("UNION "); + } innerUnion.append("{") .append(constructStatementId(stmt, outerID + "_" + idx, varNames, bindings.get(idx))) .append("} "); @@ -510,7 +550,7 @@ protected static String constructInnerUnion(StatementPattern stmt, int outerID, * {@link ExclusiveTupleExprRenderer} capabilities. An exception to this is if the given expression is a * {@link StatementPattern}, e.g. an {@link ExclusiveStatement} or {@link ExclusiveGroup}. *

    - * + * * @param exclusiveExpr * @param varNames * @param bindings @@ -540,19 +580,21 @@ protected static String constructJoinArg(ExclusiveTupleExpr exclusiveExpr, Set varNames = new HashSet<>(); String s = constructStatement(stmt, varNames, bindings); StringBuilder res = new StringBuilder(); - res.append("ASK {"); + res.append("ASK "); + appendDatasetClause(res, dataset); + res.append(" { "); res.append(s).append(" }"); return res.toString(); @@ -561,19 +603,21 @@ public static String askQueryString(StatementPattern stmt, BindingSet bindings) /** * Construct a SELECT query for the provided statement with LIMIT 1. Such query can be used for source selection * instead of ASK queries. - * + * * @param stmt * @param bindings * @return the SELECT query string */ - public static String selectQueryStringLimit1(StatementPattern stmt, BindingSet bindings) { + public static String selectQueryStringLimit1(StatementPattern stmt, BindingSet bindings, Dataset dataset) { Set varNames = new HashSet<>(); String s = constructStatement(stmt, varNames, bindings); StringBuilder res = new StringBuilder(); - res.append("SELECT * WHERE {"); + res.append("SELECT * "); + appendDatasetClause(res, dataset); + res.append("WHERE { "); res.append(s).append(" } LIMIT 1"); return res.toString(); @@ -582,15 +626,15 @@ public static String selectQueryStringLimit1(StatementPattern stmt, BindingSet b /** * Construct a SELECT query for the provided expr with LIMIT 1. Such query can be used for source selection instead * of ASK queries. - * + * * @param stmt * @param bindings * @return the SELECT query string */ - public static String selectQueryStringLimit1(ExclusiveTupleExpr expr, BindingSet bindings) { + public static String selectQueryStringLimit1(ExclusiveTupleExpr expr, BindingSet bindings, Dataset dataset) { if (expr instanceof ExclusiveGroup) { - return selectQueryStringLimit1((ExclusiveGroup) expr, bindings); + return selectQueryStringLimit1((ExclusiveGroup) expr, bindings, dataset); } Set varNames = new HashSet<>(); @@ -598,7 +642,9 @@ public static String selectQueryStringLimit1(ExclusiveTupleExpr expr, BindingSet StringBuilder res = new StringBuilder(); - res.append("SELECT * WHERE {"); + res.append("SELECT * "); + appendDatasetClause(res, dataset); + res.append("WHERE {"); res.append(s).append(" } LIMIT 1"); return res.toString(); @@ -607,20 +653,23 @@ public static String selectQueryStringLimit1(ExclusiveTupleExpr expr, BindingSet /** * Construct a SELECT query for the provided {@link ExclusiveGroup} with LIMIT 1. Such query can be used for source * selection instead of ASK queries. - * + * * @param group * @param bindings * @return the SELECT query string */ - public static String selectQueryStringLimit1(ExclusiveGroup group, BindingSet bindings) { + public static String selectQueryStringLimit1(ExclusiveGroup group, BindingSet bindings, Dataset dataset) { Set varNames = new HashSet<>(); StringBuilder res = new StringBuilder(); - res.append("SELECT * WHERE { "); + res.append("SELECT * "); + appendDatasetClause(res, dataset); + res.append("WHERE {"); - for (ExclusiveTupleExpr s : group.getExclusiveExpressions()) + for (ExclusiveTupleExpr s : group.getExclusiveExpressions()) { res.append(constructJoinArg(s, varNames, bindings)); + } res.append(" } LIMIT 1"); @@ -630,20 +679,29 @@ public static String selectQueryStringLimit1(ExclusiveGroup group, BindingSet bi /** * Construct the statement string, i.e. "s p o . " with bindings inserted wherever possible. Note that the relevant * free variables are added to the varNames set for further evaluation. - * + * * @param stmt * @param varNames * @param bindings - * + * * @return the constructed statement pattern */ protected static String constructStatement(StatementPattern stmt, Set varNames, BindingSet bindings) { StringBuilder sb = new StringBuilder(); + if (stmt.getScope().equals(Scope.NAMED_CONTEXTS)) { + sb.append("GRAPH "); + appendVar(sb, stmt.getContextVar(), varNames, bindings); + sb.append(" { "); + } sb = appendVar(sb, stmt.getSubjectVar(), varNames, bindings).append(" "); sb = appendVar(sb, stmt.getPredicateVar(), varNames, bindings).append(" "); sb = appendVar(sb, stmt.getObjectVar(), varNames, bindings).append(" . "); + if (stmt.getScope().equals(Scope.NAMED_CONTEXTS)) { + sb.append("} "); + } + return sb.toString(); } @@ -651,11 +709,11 @@ protected static String constructStatement(StatementPattern stmt, Set va * Construct the statement string, i.e. "s p o . " with bindings inserted wherever possible. Variables are renamed * to "var_"+varId to identify query results in bound queries. Note that the free variables are also added to the * varNames set for further evaluation. - * + * * @param stmt * @param varNames * @param bindings - * + * * @return the constructed statement pattern */ protected static String constructStatementId(StatementPattern stmt, String varID, Set varNames, @@ -672,7 +730,7 @@ protected static String constructStatementId(StatementPattern stmt, String varID /** * Construct the statement string, i.e. "s p ?o_varID FILTER ?o_N=o ". This kind of statement pattern is necessary * to later on identify available results. - * + * * @param stmt * @param varID * @param varNames @@ -707,57 +765,61 @@ protected static String constructStatementCheckId(StatementPattern stmt, int var /** * Append the variable to the provided StringBuilder. - * + * * Cases: 1) unbound: check provided bindingset for possible match a) match found: append matching value b) no * match: append ?varName and add to varNames 2) bound: append value - * + * * @param sb * @param var * @param varNames * @param bindings - * + * * @return the stringbuilder */ protected static StringBuilder appendVar(StringBuilder sb, Var var, Set varNames, BindingSet bindings) { if (!var.hasValue()) { - if (bindings.hasBinding(var.getName())) + if (bindings.hasBinding(var.getName())) { return appendValue(sb, bindings.getValue(var.getName())); + } varNames.add(var.getName()); return sb.append("?").append(var.getName()); - } else + } else { return appendValue(sb, var.getValue()); + } } /** * Append the variable to the provided StringBuilder, however change name of variable by appending "_varId" to it. - * + * * Cases: 1) unbound: check provided bindingset for possible match a) match found: append matching value b) no * match: append ?varName_varId and add to varNames 2) bound: append value - * + * * @param sb * @param var * @param varNames * @param bindings - * + * * @return the complemented string builder */ protected static StringBuilder appendVarId(StringBuilder sb, Var var, String varID, Set varNames, BindingSet bindings) { if (!var.hasValue()) { - if (bindings.hasBinding(var.getName())) + if (bindings.hasBinding(var.getName())) { return appendValue(sb, bindings.getValue(var.getName())); + } String newName = var.getName() + "_" + varID; varNames.add(newName); return sb.append("?").append(newName); - } else + } else { return appendValue(sb, var.getValue()); + } } /** * Return the string representation of this value, see {@link #appendValue(StringBuilder, Value)} for details. - * + * * @param value - * + * * @return the string representation */ protected static String getValueString(Value value) { @@ -768,27 +830,30 @@ protected static String getValueString(Value value) { /** * Append a string representation of the value to the string builder. - * + * * 1. URI: 2. Literal: "myLiteral"^^ - * + * * @param sb * @param value * @return the string builder */ protected static StringBuilder appendValue(StringBuilder sb, Value value) { - if (value instanceof IRI) + if (value instanceof IRI) { return appendURI(sb, (IRI) value); - if (value instanceof Literal) + } + if (value instanceof Literal) { return appendLiteral(sb, (Literal) value); - if (value instanceof BNode) + } + if (value instanceof BNode) { return appendBNode(sb, (BNode) value); + } throw new RuntimeException("Type not supported: " + value.getClass().getCanonicalName()); } /** * Append the uri to the stringbuilder, i.e. . - * + * * @param sb * @param uri * @return the string builder @@ -800,10 +865,10 @@ protected static StringBuilder appendURI(StringBuilder sb, IRI uri) { /** * Append a dummy string (see {@link #BNODE_URI}) to represent the BNode. - * + * * Note: currently it is not possible to retrieve values for a BNode via SPARQL, hence we use a dummy BNode which * does not produce any results. A warning is printed to debug. - * + * * @param sb * @param bNode * @return the string builder @@ -818,7 +883,7 @@ protected static StringBuilder appendBNode(StringBuilder sb, BNode bNode) { /** * Append the literal to the stringbuilder. - * + * * @param sb * @param lit * @return the string builder @@ -843,16 +908,16 @@ protected static StringBuilder appendLiteral(StringBuilder sb, Literal lit) { /** * load the queries from a queries file located at the specified path. - * + * * Expected format: - Queries are SPARQL queries in String format - queries are allowed to span several lines - a * query is interpreted to be finished if an empty line occurs - * + * * Ex: - * + * * QUERY1 ... Q1 cntd - * + * * QUERY2 - * + * * @param queryFile * @return a list of queries for the query type * @throws FileNotFoundException @@ -865,17 +930,32 @@ public static List loadQueries(String queryFile) throws FileNotFoundExce String tmpQuery = ""; while ((tmp = in.readLine()) != null) { if (tmp.isEmpty()) { - if (!tmpQuery.isEmpty()) + if (!tmpQuery.isEmpty()) { res.add(tmpQuery); + } tmpQuery = ""; } else { tmpQuery = tmpQuery + tmp; } } - if (!tmpQuery.isEmpty()) + if (!tmpQuery.isEmpty()) { res.add(tmpQuery); + } return res; } } + + private static StringBuilder appendDatasetClause(StringBuilder sb, Dataset dataset) { + if (dataset == null) { + return sb; + } + for (IRI context : dataset.getDefaultGraphs()) { + sb.append("FROM <").append(context.stringValue()).append("> "); + } + for (IRI namedContext : dataset.getNamedGraphs()) { + sb.append("FROM NAMED <").append(namedContext.stringValue()).append("> "); + } + return sb; + } } diff --git a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/util/Version.java b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/util/Version.java index 78efea3a40c..69ed4b229ed 100644 --- a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/util/Version.java +++ b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/util/Version.java @@ -17,7 +17,7 @@ /** * Version utility: read the version from the Jar's manifest file. - * + * * @author Andreas Schwarte * */ @@ -39,7 +39,7 @@ public class Version { /** * Return the version instance - * + * * @return the {@link Version} instance */ public static Version getVersionInfo() { @@ -142,7 +142,7 @@ public String getProductName() { /** * Prints the version info. - * + * * @param args */ public static void main(String[] args) { diff --git a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/util/Vocabulary.java b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/util/Vocabulary.java index b285accc80d..7c16a523e3b 100644 --- a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/util/Vocabulary.java +++ b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/util/Vocabulary.java @@ -13,7 +13,7 @@ /** * Vocabulary used in FedX to describe endpoints and services - * + * * @author Andreas Schwarte * */ @@ -23,7 +23,7 @@ public class Vocabulary { /** * FedX specific vocabulary - * + * * @author Andreas Schwarte * */ @@ -44,13 +44,15 @@ public static class FEDX { public static final IRI REPOSITORY_SERVER = vf.createIRI(NAMESPACE, "repositoryServer"); public static final IRI REPOSITORY_NAME = vf.createIRI(NAMESPACE, "repositoryName"); + + public static final IRI WRITABLE = vf.createIRI(NAMESPACE, "writable"); } /** * Vocabulary from the SPARQL 1.1. service description - * + * * See https://www.w3.org/TR/sparql11-service-description/ - * + * * @author Andreas Schwarte * */ diff --git a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/write/DefaultWriteStrategyFactory.java b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/write/DefaultWriteStrategyFactory.java new file mode 100644 index 00000000000..d7338b3ffea --- /dev/null +++ b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/write/DefaultWriteStrategyFactory.java @@ -0,0 +1,37 @@ +/******************************************************************************* + * Copyright (c) 2020 Eclipse RDF4J contributors. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Distribution License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ +package org.eclipse.rdf4j.federated.write; + +import java.util.List; + +import org.eclipse.rdf4j.federated.FederationContext; +import org.eclipse.rdf4j.federated.endpoint.Endpoint; + +/** + * Default implementation of {@link WriteStrategyFactory}. + * + *

    + * The default implementation uses the {@link RepositoryWriteStrategy} with the first discovered writable + * {@link Endpoint}. In none is found, the {@link ReadOnlyWriteStrategy} is used. + *

    + * + * @author Andreas Schwarte + * + */ +public class DefaultWriteStrategyFactory implements WriteStrategyFactory { + + @Override + public WriteStrategy create(List members, FederationContext federationContext) { + for (Endpoint e : members) { + if (e.isWritable()) { + return new RepositoryWriteStrategy(e.getRepository()); + } + } + return ReadOnlyWriteStrategy.INSTANCE; + } +} diff --git a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/write/ReadOnlyWriteStrategy.java b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/write/ReadOnlyWriteStrategy.java index 3b6150ab8a5..aedb037a481 100644 --- a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/write/ReadOnlyWriteStrategy.java +++ b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/write/ReadOnlyWriteStrategy.java @@ -15,7 +15,7 @@ /** * Default {@link WriteStrategy} implementation for read only federations. In case a user attempts to perform a write * operation a {@link UnsupportedOperationException} is thrown. - * + * * @author Andreas Schwarte * */ @@ -54,7 +54,8 @@ public void removeStatement(Resource subj, IRI pred, Value obj, } @Override - public void initialize() throws RepositoryException { + public void clear(Resource... contexts) throws RepositoryException { + throw new UnsupportedOperationException("Writing not supported to a federation: the federation is readonly."); } @Override @@ -62,8 +63,8 @@ public void close() throws RepositoryException { } @Override - public boolean isInitialized() { - return true; + public void clearNamespaces() throws RepositoryException { + throw new UnsupportedOperationException("Writing not supported to a federation: the federation is readonly."); } } diff --git a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/write/RepositoryWriteStrategy.java b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/write/RepositoryWriteStrategy.java index 3870eb3408e..1bb506409c9 100644 --- a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/write/RepositoryWriteStrategy.java +++ b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/write/RepositoryWriteStrategy.java @@ -17,12 +17,12 @@ /** * A {@link WriteStrategy} to write to a designated {@link Repository}. This write strategy opens a fresh * {@link RepositoryConnection} and keeps this until a call of {@link #close()}. - * - * + * + * *

    * Note: this is an experimental feature which is subject to change in a future version. *

    - * + * * @author Andreas Schwarte * @see WriteStrategy */ @@ -36,46 +36,60 @@ public RepositoryWriteStrategy(Repository writeRepository) { this.writeRepository = writeRepository; } - @Override - public void initialize() throws RepositoryException { - connection = writeRepository.getConnection(); - } - - @Override - public boolean isInitialized() { - return connection != null; - } - @Override public void close() throws RepositoryException { - connection.close(); + if (connection != null) { + connection.close(); + } } @Override public void begin() throws RepositoryException { + createConnection(); connection.begin(); } @Override public void commit() throws RepositoryException { + createConnection(); connection.commit(); } @Override public void rollback() throws RepositoryException { + createConnection(); connection.rollback(); } @Override public void addStatement(Resource subj, IRI pred, Value obj, Resource... contexts) throws RepositoryException { + createConnection(); connection.add(subj, pred, obj, contexts); - } @Override public void removeStatement(Resource subj, IRI pred, Value obj, Resource... contexts) throws RepositoryException { + createConnection(); connection.remove(subj, pred, obj, contexts); } + + @Override + public void clear(Resource... contexts) throws RepositoryException { + createConnection(); + connection.clear(contexts); + } + + private void createConnection() throws RepositoryException { + if (connection == null || !connection.isOpen()) { + connection = writeRepository.getConnection(); + } + } + + @Override + public void clearNamespaces() throws RepositoryException { + createConnection(); + connection.clearNamespaces(); + } } diff --git a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/write/WriteStrategy.java b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/write/WriteStrategy.java index e2bb3ccfc64..4e99deea84b 100644 --- a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/write/WriteStrategy.java +++ b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/write/WriteStrategy.java @@ -10,84 +10,73 @@ import org.eclipse.rdf4j.model.IRI; import org.eclipse.rdf4j.model.Resource; import org.eclipse.rdf4j.model.Value; -import org.eclipse.rdf4j.repository.RepositoryConnection; import org.eclipse.rdf4j.repository.RepositoryException; /** * Interface for the {@link WriteStrategy} that is used for writing data to the federation. The implementation can * decided upon how is data written to the underlying federation members (e.g. to a designated federation member) - * + * *

    * Note: this is an experimental feature which is subject to change in a future version. *

    - * + * * @author Andreas Schwarte * @see RepositoryWriteStrategy * @see ReadOnlyWriteStrategy */ -public interface WriteStrategy { - - /** - * Initialize the write strategy (e.g. open a shared {@link RepositoryConnection}. - * - * @throws RepositoryException - */ - public void initialize() throws RepositoryException; - - /** - * Returns true if this instance is initialized - * - * @return flag indicating the initialization resources - */ - public boolean isInitialized(); - +public interface WriteStrategy extends AutoCloseable { /** * Close this write strategy (e.g. close a shared {@link RepositoryException}). - * + * * @throws RepositoryException */ - public void close() throws RepositoryException; + @Override + void close() throws RepositoryException; /** * Begin a transaction. - * + * * @throws RepositoryException */ - public void begin() throws RepositoryException; + void begin() throws RepositoryException; /** * Commit a transaction. - * + * * @throws RepositoryException */ - public void commit() throws RepositoryException; + void commit() throws RepositoryException; /** * Rollback a transaction. - * + * * @throws RepositoryException */ - public void rollback() throws RepositoryException; + void rollback() throws RepositoryException; /** * Add a statement - * + * * @param subj * @param pred * @param obj * @param contexts * @throws RepositoryException */ - public void addStatement(Resource subj, IRI pred, Value obj, Resource... contexts) throws RepositoryException; + void addStatement(Resource subj, IRI pred, Value obj, Resource... contexts) throws RepositoryException; /** * Remove a statement - * + * * @param subj * @param pred * @param obj * @param contexts * @throws RepositoryException */ - public void removeStatement(Resource subj, IRI pred, Value obj, Resource... contexts) throws RepositoryException; + void removeStatement(Resource subj, IRI pred, Value obj, Resource... contexts) throws RepositoryException; + + void clear(Resource... contexts) throws RepositoryException; + + void clearNamespaces() throws RepositoryException; } diff --git a/tools/federation/src/main/java/org/eclipse/rdf4j/federated/write/WriteStrategyFactory.java b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/write/WriteStrategyFactory.java new file mode 100644 index 00000000000..165b6ec79ae --- /dev/null +++ b/tools/federation/src/main/java/org/eclipse/rdf4j/federated/write/WriteStrategyFactory.java @@ -0,0 +1,35 @@ +/******************************************************************************* + * Copyright (c) 2020 Eclipse RDF4J contributors. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Distribution License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ +package org.eclipse.rdf4j.federated.write; + +import java.util.List; + +import org.eclipse.rdf4j.federated.FederationContext; +import org.eclipse.rdf4j.federated.endpoint.Endpoint; + +/** + * Factory to create {@link WriteStrategy} instantiations. + * + *

    + * Implementations must have a default constructor. + *

    + * + * @author Andreas Schwarte + * + */ +public interface WriteStrategyFactory { + + /** + * Create the {@link WriteStrategy} using the provided context + * + * @param members the current federation members + * @param federationContext the federation context + * @return the {@link WriteStrategy} + */ + public WriteStrategy create(List members, FederationContext federationContext); +} diff --git a/tools/federation/src/test/java/demos/Demo2.java b/tools/federation/src/test/java/demos/Demo2.java index 5bad6bc6d2e..a1238003119 100644 --- a/tools/federation/src/test/java/demos/Demo2.java +++ b/tools/federation/src/test/java/demos/Demo2.java @@ -20,8 +20,9 @@ public class Demo2 { public static void main(String[] args) throws Exception { - if (System.getProperty("log4j.configuration") == null) + if (System.getProperty("log4j.configuration") == null) { System.setProperty("log4j.configuration", "file:local/log4j.properties"); + } File dataConfig = new File("local/LifeScience-FedX-SPARQL.ttl"); Repository repo = FedXFactory.createFederation(dataConfig); diff --git a/tools/federation/src/test/java/demos/Demo3.java b/tools/federation/src/test/java/demos/Demo3.java index 97e983bfd8d..dd16500e843 100644 --- a/tools/federation/src/test/java/demos/Demo3.java +++ b/tools/federation/src/test/java/demos/Demo3.java @@ -47,4 +47,4 @@ public static void main(String[] args) throws Exception { System.exit(0); } -} \ No newline at end of file +} diff --git a/tools/federation/src/test/java/demos/Demo4.java b/tools/federation/src/test/java/demos/Demo4.java index 976bf06b612..50ac03778c5 100644 --- a/tools/federation/src/test/java/demos/Demo4.java +++ b/tools/federation/src/test/java/demos/Demo4.java @@ -43,4 +43,4 @@ public static void main(String[] args) throws Exception { System.exit(0); } -} \ No newline at end of file +} diff --git a/tools/federation/src/test/java/demos/Demo5.java b/tools/federation/src/test/java/demos/Demo5.java index 0cdd6fabb2e..d8751f935d0 100644 --- a/tools/federation/src/test/java/demos/Demo5.java +++ b/tools/federation/src/test/java/demos/Demo5.java @@ -42,4 +42,4 @@ public static void main(String[] args) throws Exception { System.exit(0); } -} \ No newline at end of file +} diff --git a/tools/federation/src/test/java/demos/FedXWithRemoteRepositoryManager.java b/tools/federation/src/test/java/demos/FedXWithRemoteRepositoryManager.java index e363b3dbd2d..85361cb4903 100644 --- a/tools/federation/src/test/java/demos/FedXWithRemoteRepositoryManager.java +++ b/tools/federation/src/test/java/demos/FedXWithRemoteRepositoryManager.java @@ -20,7 +20,7 @@ /** * Demo which shows an example of a local federation which uses repositories from a remote RDF4J instance as federation * members. - * + * * @author Andreas Schwarte * */ diff --git a/tools/federation/src/test/java/org/eclipse/rdf4j/federated/BindTests.java b/tools/federation/src/test/java/org/eclipse/rdf4j/federated/BindTests.java index f1a50317d3b..91a3931eee7 100644 --- a/tools/federation/src/test/java/org/eclipse/rdf4j/federated/BindTests.java +++ b/tools/federation/src/test/java/org/eclipse/rdf4j/federated/BindTests.java @@ -2,17 +2,10 @@ import java.util.Arrays; import java.util.List; -import java.util.Set; -import java.util.stream.Collectors; -import org.eclipse.rdf4j.model.IRI; -import org.eclipse.rdf4j.model.Literal; -import org.eclipse.rdf4j.model.Value; -import org.eclipse.rdf4j.model.impl.SimpleValueFactory; import org.eclipse.rdf4j.query.BindingSet; import org.eclipse.rdf4j.query.QueryResults; import org.eclipse.rdf4j.repository.util.Repositories; -import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -68,16 +61,4 @@ protected List runQuery(String query) { return Repositories.tupleQueryNoTransaction(this.fedxRule.repository, query, it -> QueryResults.asList(it)); } - protected void assertContainsAll(List res, String bindingName, Set expected) { - Assertions.assertEquals(expected, - res.stream().map(bs -> bs.getValue(bindingName)).collect(Collectors.toSet())); - } - - protected IRI fullIri(String iri) { - return SimpleValueFactory.getInstance().createIRI(iri); - } - - protected Literal l(String literal) { - return SimpleValueFactory.getInstance().createLiteral(literal); - } } diff --git a/tools/federation/src/test/java/org/eclipse/rdf4j/federated/FedXBaseTest.java b/tools/federation/src/test/java/org/eclipse/rdf4j/federated/FedXBaseTest.java index 20225548b28..8266293ed70 100644 --- a/tools/federation/src/test/java/org/eclipse/rdf4j/federated/FedXBaseTest.java +++ b/tools/federation/src/test/java/org/eclipse/rdf4j/federated/FedXBaseTest.java @@ -61,8 +61,9 @@ public abstract class FedXBaseTest { @BeforeAll public static void initLogging() throws Exception { - if (System.getProperty("log4j.configurationFile") == null) + if (System.getProperty("log4j.configurationFile") == null) { System.setProperty("log4j.configurationFile", "file:build/test/log4j-debug.properties"); + } log = LoggerFactory.getLogger(FedXBaseTest.class); } @@ -75,7 +76,7 @@ public static void initLogging() throws Exception { /** * Execute a testcase, both queryFile and expectedResultFile must be files - * + * * @param queryFile * @param expectedResultFile * @param checkOrder @@ -156,7 +157,7 @@ protected Literal l(String value) { } /** - * + * * @param localName * @return the IRI in the instance's {@link #defaultNamespace} */ @@ -164,13 +165,17 @@ protected IRI iri(String localName) { return iri(defaultNamespace, localName); } - protected IRI iri(String namespace, String localName) { + protected static IRI iri(String namespace, String localName) { return vf.createIRI(namespace, localName); } + protected static IRI fullIri(String fullIri) { + return vf.createIRI(fullIri); + } + /** * Read the query string from the specified resource - * + * * @param queryResource * @return * @throws RepositoryException @@ -182,7 +187,7 @@ protected String readQueryString(String queryFile) throws RepositoryException, I /** * Read resource from classpath as string, e.g. /tests/basic/data01endpoint1.ttl - * + * * @param resource * @return * @throws IOException @@ -198,7 +203,7 @@ protected String readResourceAsString(String resource) throws IOException { /** * Read the expected tuple query result from the specified resource - * + * * @param queryResource * @return * @throws RepositoryException @@ -209,8 +214,9 @@ protected TupleQueryResult readExpectedTupleQueryResult(String resultFile) throw if (tqrFormat != null) { InputStream in = SPARQLBaseTest.class.getResourceAsStream(resultFile); - if (in == null) + if (in == null) { throw new IOException("File could not be opened: " + resultFile); + } try { TupleQueryResultParser parser = QueryResultIO.createTupleParser(tqrFormat); @@ -231,7 +237,7 @@ protected TupleQueryResult readExpectedTupleQueryResult(String resultFile) throw /** * Read the expected graph query result from the specified resource - * + * * @param resultFile * @return * @throws Exception @@ -284,9 +290,9 @@ protected SimpleTupleQueryResultBuilder tupleQueryResultBuilder(List bin } /** - * + * * Note: metod can only be used after initialization phase - * + * * @return the current {@link FederationContext} */ protected abstract FederationContext federationContext(); @@ -297,7 +303,7 @@ protected QueryManager queryManager() { /** * Compare two tuple query results - * + * * @param queryResult * @param expectedResult * @param checkOrder @@ -391,7 +397,7 @@ protected void compareTupleQueryResults(TupleQueryResult queryResult, TupleQuery /** * Compare two graphs - * + * * @param queryResult * @param expectedResult * @throws Exception @@ -419,7 +425,7 @@ protected void compareGraphs(Set queryResult, Set expected /** * A builder for {@link TupleQueryResult}s. - * + * * @author as * */ @@ -434,7 +440,7 @@ private SimpleTupleQueryResultBuilder(List bindingNames) { /** * Add the {@link BindingSet} to the result. - * + * * @param b * @return * @throws IllegalArgumentException if the provided binding names is not a subset of the defined result binding @@ -443,10 +449,11 @@ private SimpleTupleQueryResultBuilder(List bindingNames) { public SimpleTupleQueryResultBuilder add(BindingSet b) throws IllegalArgumentException { // check if the binding names are a subset of defined binding names - if (!bindingNames.containsAll(b.getBindingNames())) + if (!bindingNames.containsAll(b.getBindingNames())) { throw new IllegalArgumentException( "Provided binding set does must be a subset of defined binding names: " + bindingNames + ". Was: " + b.getBindingNames()); + } this.bindings.add(b); return this; } diff --git a/tools/federation/src/test/java/org/eclipse/rdf4j/federated/FedXFactoryTest.java b/tools/federation/src/test/java/org/eclipse/rdf4j/federated/FedXFactoryTest.java index 357d84137fa..9d42385153f 100644 --- a/tools/federation/src/test/java/org/eclipse/rdf4j/federated/FedXFactoryTest.java +++ b/tools/federation/src/test/java/org/eclipse/rdf4j/federated/FedXFactoryTest.java @@ -52,6 +52,35 @@ public void testFederationWithResolver() throws Exception { repo.shutDown(); } + @Test + public void testFederationWithResolver_writable() throws Exception { + + assumeSparqlEndpoint(); + + // load some data into endpoint2 + loadDataSet(server.getRepository(2), "/tests/medium/data2.ttl"); + + RepositoryResolver repositoryResolver = ((SPARQLEmbeddedServer) server).getRepositoryResolver(); + + FedXRepository repo = FedXFactory.newFederation() + .withRepositoryResolver(repositoryResolver) + .withResolvableEndpoint("endpoint1", true) + .withResolvableEndpoint("endpoint2") + .create(); + + repo.init(); + + // load data into the endpoint1 via the federation + loadDataSet(repo, "/tests/medium/data1.ttl"); + + federationContext = repo.getFederationContext(); + try (RepositoryConnection conn = repo.getConnection()) { + execute(conn, "/tests/medium/query01.rq", "/tests/medium/query01.srx", false); + } + + repo.shutDown(); + } + @Test public void testFederationWithResolver_DataConfig() throws Exception { diff --git a/tools/federation/src/test/java/org/eclipse/rdf4j/federated/NamedGraphTests.java b/tools/federation/src/test/java/org/eclipse/rdf4j/federated/NamedGraphTests.java new file mode 100644 index 00000000000..5adaa3d776c --- /dev/null +++ b/tools/federation/src/test/java/org/eclipse/rdf4j/federated/NamedGraphTests.java @@ -0,0 +1,337 @@ +/******************************************************************************* + * Copyright (c) 2020 Eclipse RDF4J contributors. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Distribution License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ +package org.eclipse.rdf4j.federated; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +import org.eclipse.rdf4j.common.iteration.Iterations; +import org.eclipse.rdf4j.model.IRI; +import org.eclipse.rdf4j.model.Resource; +import org.eclipse.rdf4j.model.Value; +import org.eclipse.rdf4j.model.impl.SimpleValueFactory; +import org.eclipse.rdf4j.model.util.Models; +import org.eclipse.rdf4j.model.vocabulary.FOAF; +import org.eclipse.rdf4j.model.vocabulary.OWL; +import org.eclipse.rdf4j.model.vocabulary.RDF; +import org.eclipse.rdf4j.query.BindingSet; +import org.eclipse.rdf4j.query.TupleQuery; +import org.eclipse.rdf4j.query.TupleQueryResult; +import org.eclipse.rdf4j.repository.RepositoryConnection; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +public class NamedGraphTests extends SPARQLBaseTest { + + private static class TestVocabulary { + public final String NAMESPACE; + + public final IRI GRAPH_1; + public final IRI GRAPH_2; + public final IRI SHARED_GRAPH; + + public TestVocabulary(String namespace) { + this.NAMESPACE = namespace; + this.GRAPH_1 = iri("graph1"); + this.GRAPH_2 = iri("graph2"); + this.SHARED_GRAPH = iri("sharedGraph"); + } + + public IRI iri(String localName) { + return SimpleValueFactory.getInstance().createIRI(NAMESPACE, localName); + } + } + + private static TestVocabulary NS_1 = new TestVocabulary("http://namespace1.org/"); + private static TestVocabulary NS_2 = new TestVocabulary("http://namespace2.org/"); + private static TestVocabulary NS_3 = new TestVocabulary("http://namespace3.org/"); + private static TestVocabulary NS_4 = new TestVocabulary("http://namespace4.org/"); + private static TestVocabulary EX = new TestVocabulary("http://example.org/"); + + @BeforeEach + public void registerPrefixes() { + QueryManager qm = federationContext().getQueryManager(); + qm.addPrefixDeclaration("foaf", FOAF.NAMESPACE); + qm.addPrefixDeclaration("owl", OWL.NAMESPACE); + qm.addPrefixDeclaration("ns1", NS_1.NAMESPACE); + qm.addPrefixDeclaration("ns4", NS_4.NAMESPACE); + } + + @Test + public void testGetContextIDs() throws Exception { + prepareTest(Arrays.asList("/tests/named-graphs/data1.trig", "/tests/named-graphs/data2.trig", + "/tests/named-graphs/data3.trig", "/tests/named-graphs/data4.trig")); + + try (RepositoryConnection conn = fedxRule.getRepository().getConnection()) { + List graphs = Iterations.asList(conn.getContextIDs()); + + assertThat(graphs).containsExactlyInAnyOrder(NS_1.GRAPH_1, NS_1.GRAPH_2, NS_3.SHARED_GRAPH, NS_2.GRAPH_1, + NS_2.GRAPH_2); + } + } + + @Test + public void testGetStatements() throws Exception { + + prepareTest(Arrays.asList("/tests/named-graphs/data1.trig", "/tests/named-graphs/data2.trig", + "/tests/named-graphs/data3.trig", "/tests/named-graphs/data4.trig")); + + try (RepositoryConnection conn = fedxRule.getRepository().getConnection()) { + + // 1. named graph only present in single endpoint + assertThat(Models.subjectIRIs(conn.getStatements(null, RDF.TYPE, FOAF.PERSON, NS_1.GRAPH_1))) + .containsExactlyInAnyOrder(NS_1.iri("Person_1"), NS_1.iri("Person_2")); + + // 2. multiple graphs + assertThat(Models.subjectIRIs(conn.getStatements(null, RDF.TYPE, FOAF.PERSON, NS_1.GRAPH_1, NS_2.GRAPH_1))) + .containsExactlyInAnyOrder( + NS_1.iri("Person_1"), NS_1.iri("Person_2"), NS_2.iri("Person_6"), NS_2.iri("Person_7")); + + // 3. graph is available in multiple endpoints + assertThat(Models.subjectIRIs(conn.getStatements(null, RDF.TYPE, FOAF.PERSON, NS_3.SHARED_GRAPH))) + .containsExactlyInAnyOrder(NS_1.iri("Person_5"), NS_2.iri("Person_10")); + } + } + + @Test + public void testSimpleSelect_FromClause() throws Exception { + + prepareTest(Arrays.asList("/tests/named-graphs/data1.trig", "/tests/named-graphs/data2.trig", + "/tests/named-graphs/data3.trig", "/tests/named-graphs/data4.trig")); + + List res; + + // 1. named graph only present in single endpoint + res = runQuery("SELECT ?person FROM WHERE { ?person a foaf:Person }"); + assertThat(values(res, "person")) + .containsExactlyInAnyOrder(NS_1.iri("Person_1"), NS_1.iri("Person_2")); + + // 2. multiple graphs + res = runQuery( + "SELECT ?person FROM " + + "FROM " + + "WHERE { ?person a foaf:Person }"); + assertThat(values(res, "person")) + .containsExactlyInAnyOrder(NS_1.iri("Person_1"), NS_1.iri("Person_2"), NS_2.iri("Person_6"), + NS_2.iri("Person_7")); + + // 3. graph is available in multiple endpoints + res = runQuery( + "SELECT ?person FROM WHERE { ?person a foaf:Person }"); + assertThat(values(res, "person")) + .containsExactlyInAnyOrder(NS_1.iri("Person_5"), NS_2.iri("Person_10")); + } + + @Test + public void testSimpleSelect_GraphClause() throws Exception { + + prepareTest(Arrays.asList("/tests/named-graphs/data1.trig", "/tests/named-graphs/data2.trig", + "/tests/named-graphs/data3.trig", "/tests/named-graphs/data4.trig")); + + List res; + + // 1. named graph only present in single endpoint + res = runQuery( + "SELECT ?person WHERE { GRAPH { ?person a foaf:Person } }"); + + assertThat(values(res, "person")) + .containsExactlyInAnyOrder(NS_1.iri("Person_1"), NS_1.iri("Person_2")); + + // 3. graph is available in multiple endpoints + res = runQuery( + "SELECT ?person WHERE { GRAPH { ?person a foaf:Person } }"); + + assertThat(values(res, "person")) + .containsExactlyInAnyOrder(NS_1.iri("Person_5"), NS_2.iri("Person_10")); + + } + + @Test + public void testSimpleSelect_FromNamedClause() throws Exception { + + prepareTest(Arrays.asList("/tests/named-graphs/data1.trig", "/tests/named-graphs/data2.trig", + "/tests/named-graphs/data3.trig", "/tests/named-graphs/data4.trig")); + + List res; + + res = runQuery("SELECT ?person FROM NAMED " + + "WHERE { GRAPH { ?person a foaf:Person } }"); + + assertThat(values(res, "person")) + .containsExactlyInAnyOrder(NS_1.iri("Person_1"), NS_1.iri("Person_2")); + + res = runQuery("SELECT ?person FROM NAMED " + + "WHERE { ?person a foaf:Person }"); + assertThat(values(res, "person")).isEmpty(); + + // 3. graph is available in multiple endpoints + res = runQuery("SELECT ?person FROM NAMED " + + " WHERE { GRAPH { ?person a foaf:Person } }"); + + assertThat(values(res, "person")) + .containsExactlyInAnyOrder(NS_1.iri("Person_5"), NS_2.iri("Person_10")); + + } + + @Test + public void testSimpleSelect_ExclusiveGroup_GraphClause() throws Exception { + + prepareTest(Arrays.asList("/tests/named-graphs/data1.trig", "/tests/named-graphs/data2.trig", + "/tests/named-graphs/data3.trig", "/tests/named-graphs/data4.trig")); + + List res; + + // 1. named graph only present in single endpoint + // => single source query + res = runQuery( + "SELECT ?person ?name WHERE { GRAPH { ?person a foaf:Person . ?person foaf:name ?name } }"); + + assertThat(values(res, "person")) + .containsExactlyInAnyOrder(NS_1.iri("Person_1"), NS_1.iri("Person_2")); + assertThat(values(res, "name")) + .containsExactlyInAnyOrder(l("Person1"), l("Person2")); + + // 2. graph is available in multiple endpoints + res = runQuery( + "SELECT ?person ?name WHERE { GRAPH { ?person a foaf:Person . ?person foaf:name ?name } }"); + + assertThat(values(res, "person")) + .containsExactlyInAnyOrder(NS_1.iri("Person_5"), NS_2.iri("Person_10")); + assertThat(values(res, "name")) + .containsExactlyInAnyOrder(l("Person5"), l("Person10")); + + // 3. graph is available in multiple endpoints, data is exclusive to ep1 + // join argument is present in other endpoint + res = runQuery( + "SELECT ?person ?name WHERE { " + + "GRAPH { ns1:Person_5 a foaf:Person . ns1:Person_5 foaf:name ?name } " + + "?author owl:sameAs ns1:Person_5 " + + "}"); + + assertThat(values(res, "name")) + .containsExactlyInAnyOrder(l("Person5")); + } + + @Test + public void testSelect_JoinOfGraphs() throws Exception { + + prepareTest(Arrays.asList("/tests/named-graphs/data1.trig", "/tests/named-graphs/data2.trig", + "/tests/named-graphs/data3.trig", "/tests/named-graphs/data4.trig")); + + List res; + + res = runQuery( + "SELECT ?person ?author WHERE { " + + "GRAPH { ?person a foaf:Person } " + + "GRAPH { ?author owl:sameAs ?person } " + + "}"); + + assertThat(values(res, "person")) + .containsExactlyInAnyOrder(NS_1.iri("Person_2")); + assertThat(values(res, "author")) + .containsExactlyInAnyOrder(NS_4.iri("Author_2")); + + // 2. more complex join groups + res = runQuery( + "SELECT ?person ?author ?name ?authorId WHERE { " + + "GRAPH { ?person a foaf:Person . ?person foaf:name ?name } " + + "GRAPH { ?author owl:sameAs ?person . ?author ns4:authorId ?authorId } " + + "}"); + + assertThat(values(res, "person")) + .containsExactlyInAnyOrder(NS_1.iri("Person_2")); + assertThat(values(res, "author")) + .containsExactlyInAnyOrder(NS_4.iri("Author_2")); + assertThat(values(res, "name")) + .containsExactlyInAnyOrder(l("Person2")); + assertThat(values(res, "authorId")) + .containsExactlyInAnyOrder(l("Author2")); + } + + @Test + public void testBoundJoin() throws Exception { + + prepareTest( + Arrays.asList("/tests/named-graphs/data-boundjoin1.trig", "/tests/named-graphs/data-boundjoin2.trig")); + + List res; + res = runQuery( + "SELECT ?person ?name WHERE { GRAPH { ?person a foaf:Person . ?person foaf:name ?name } }"); + + assertThat(values(res, "person")) + .containsExactlyInAnyOrder(EX.iri("Person1"), EX.iri("Person2"), EX.iri("Person3"), + EX.iri("Person4"), EX.iri("Person11"), EX.iri("Person12"), + EX.iri("Person13"), EX.iri("Person14")); + assertThat(values(res, "name")) + .containsExactlyInAnyOrder(l("Person 1"), l("Person 2"), l("Person 3"), l("Person 4"), + l("Person 11"), l("Person 12"), l("Person 13"), l("Person 14")); + } + + @Test + public void testBoundJoin_FROM_CLAUSE() throws Exception { + + prepareTest( + Arrays.asList("/tests/named-graphs/data-boundjoin1.trig", "/tests/named-graphs/data-boundjoin2.trig")); + + List res; + res = runQuery( + "SELECT ?person ?name FROM WHERE { ?person a foaf:Person . ?person foaf:name ?name }"); + + assertThat(values(res, "person")) + .containsExactlyInAnyOrder(EX.iri("Person1"), EX.iri("Person2"), EX.iri("Person3"), + EX.iri("Person4"), EX.iri("Person11"), EX.iri("Person12"), + EX.iri("Person13"), EX.iri("Person14")); + assertThat(values(res, "name")) + .containsExactlyInAnyOrder(l("Person 1"), l("Person 2"), l("Person 3"), l("Person 4"), + l("Person 11"), l("Person 12"), l("Person 13"), l("Person 14")); + } + + @Test + public void testVariableGraph() throws Exception { + + prepareTest(Arrays.asList("/tests/named-graphs/data1.trig", "/tests/named-graphs/data2.trig", + "/tests/named-graphs/data3.trig", "/tests/named-graphs/data4.trig")); + + List res; + + res = runQuery( + "SELECT DISTINCT ?g WHERE { GRAPH ?g { ?person a foaf:Person } }"); + + assertThat(values(res, "g")) + .containsExactlyInAnyOrder(NS_1.GRAPH_1, NS_1.GRAPH_2, NS_2.GRAPH_1, NS_2.GRAPH_2, NS_3.SHARED_GRAPH); + + res = runQuery( + "SELECT DISTINCT ?g WHERE { GRAPH ?g { ?person a foaf:Person . ?person foaf:age ?age } }"); + + System.out.println(res); + + assertThat(values(res, "g")) + .containsExactlyInAnyOrder(NS_1.GRAPH_1, NS_1.GRAPH_2, NS_2.GRAPH_1); + + res = runQuery( + "SELECT ?person WHERE { BIND ( AS ?g) . GRAPH ?g { ?person a foaf:Person } }"); + + assertThat(values(res, "person")) + .containsExactlyInAnyOrder(NS_1.iri("Person_1"), NS_1.iri("Person_2")); + } + + private List values(List result, String bindingName) { + return result.stream().map(bs -> bs.getValue(bindingName)).collect(Collectors.toList()); + } + + protected List runQuery(String query) { + TupleQuery tq = federationContext().getQueryManager().prepareTupleQuery(query); + try (TupleQueryResult tqr = tq.evaluate()) { + return Iterations.asList(tqr); + } + + } +} diff --git a/tools/federation/src/test/java/org/eclipse/rdf4j/federated/QueryManagerTest.java b/tools/federation/src/test/java/org/eclipse/rdf4j/federated/QueryManagerTest.java index e6e830e3d69..daa4c56e9b6 100644 --- a/tools/federation/src/test/java/org/eclipse/rdf4j/federated/QueryManagerTest.java +++ b/tools/federation/src/test/java/org/eclipse/rdf4j/federated/QueryManagerTest.java @@ -9,13 +9,12 @@ import java.util.Set; -import org.eclipse.rdf4j.federated.QueryManager; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; /** * Various tests for the junit framework - * + * * @author as * */ diff --git a/tools/federation/src/test/java/org/eclipse/rdf4j/federated/QueryPlanTest.java b/tools/federation/src/test/java/org/eclipse/rdf4j/federated/QueryPlanTest.java index cf2ad9a72f3..6a73b8aa8da 100644 --- a/tools/federation/src/test/java/org/eclipse/rdf4j/federated/QueryPlanTest.java +++ b/tools/federation/src/test/java/org/eclipse/rdf4j/federated/QueryPlanTest.java @@ -19,4 +19,12 @@ public void testQueryPlan_q03() throws Exception { "/tests/medium/data4.ttl")); evaluateQueryPlan("/tests/medium/query03.rq", "/tests/medium/query03.qp"); } + + @Test + public void testQueryPlan_joinOrderBind() throws Exception { + prepareTest(Arrays.asList("/tests/medium/data1.ttl", "/tests/medium/data2.ttl", "/tests/medium/data3.ttl", + "/tests/medium/data4.ttl")); + evaluateQueryPlan("/tests/optimizer/queryPlan_bind.rq", "/tests/optimizer/queryPlan_bind.qp"); + } + } diff --git a/tools/federation/src/test/java/org/eclipse/rdf4j/federated/SPARQLBaseTest.java b/tools/federation/src/test/java/org/eclipse/rdf4j/federated/SPARQLBaseTest.java index 84807c86911..1c5da52fb37 100644 --- a/tools/federation/src/test/java/org/eclipse/rdf4j/federated/SPARQLBaseTest.java +++ b/tools/federation/src/test/java/org/eclipse/rdf4j/federated/SPARQLBaseTest.java @@ -20,7 +20,7 @@ /** * Base class for any federation test, this class is self-contained with regard to testing if run in a distinct JVM. - * + * * @author as * */ @@ -43,7 +43,7 @@ protected void initFedXConfig() { /** * Execute a testcase, both queryFile and expectedResultFile must be files - * + * * @param queryFile * @param expectedResultFile * @param checkOrder diff --git a/tools/federation/src/test/java/org/eclipse/rdf4j/federated/SPARQLServerBaseTest.java b/tools/federation/src/test/java/org/eclipse/rdf4j/federated/SPARQLServerBaseTest.java index ab42a1ca58b..d11de46502f 100644 --- a/tools/federation/src/test/java/org/eclipse/rdf4j/federated/SPARQLServerBaseTest.java +++ b/tools/federation/src/test/java/org/eclipse/rdf4j/federated/SPARQLServerBaseTest.java @@ -34,7 +34,7 @@ /** * Base class for any federation test, this class is self-contained with regard to testing if run in a distinct JVM. - * + * * @author as * */ @@ -69,8 +69,9 @@ public static void initTest() throws Exception { log = LoggerFactory.getLogger(SPARQLServerBaseTest.class); - if (System.getProperty("repositoryType") != null) + if (System.getProperty("repositoryType") != null) { repositoryType = REPOSITORY_TYPE.valueOf(System.getProperty("repositoryType")); + } switch (repositoryType) { case NATIVE: @@ -85,8 +86,9 @@ public static void initTest() throws Exception { @AfterAll public static void afterTest() throws Exception { - if (server != null) + if (server != null) { server.shutdown(); + } } @BeforeEach @@ -106,15 +108,16 @@ public boolean isSPARQLServer() { /** * Initialization of the embedded web server hosting an openrdf workbench. Used for remote and sparql repository * setting - * + * * @throws Exception */ private static void initializeServer() throws Exception { // set up the server: the maximal number of endpoints must be known List repositoryIds = new ArrayList<>(MAX_ENDPOINTS); - for (int i = 1; i <= MAX_ENDPOINTS; i++) + for (int i = 1; i <= MAX_ENDPOINTS; i++) { repositoryIds.add("endpoint" + i); + } File dataDir = new File(tempDir.toFile(), "datadir"); server = new SPARQLEmbeddedServer(dataDir, repositoryIds, repositoryType == REPOSITORY_TYPE.REMOTEREPOSITORY); @@ -124,7 +127,7 @@ private static void initializeServer() throws Exception { /** * Initialization of the embedded web server hosting an openrdf workbench. Used for remote and sparql repository * setting - * + * * @throws Exception */ private static void initializeLocalNativeStores() throws Exception { @@ -136,9 +139,9 @@ private static void initializeLocalNativeStores() throws Exception { /** * Get the repository, initialized repositories are called - * + * * endpoint1 endpoint2 .. endpoint%MAX_ENDPOINTS% - * + * * @param i the index of the repository, starting with 1 * @return */ @@ -152,9 +155,10 @@ protected List prepareTest(List sparqlEndpointData) throws Exc federationContext().getManager().removeAll(); // prepare the test endpoints (i.e. load data) - if (sparqlEndpointData.size() > MAX_ENDPOINTS) + if (sparqlEndpointData.size() > MAX_ENDPOINTS) { throw new RuntimeException("MAX_ENDPOINTs to low, " + sparqlEndpointData.size() + " repositories needed. Adjust configuration"); + } int i = 1; // endpoint id, start with 1 for (String s : sparqlEndpointData) { @@ -173,7 +177,7 @@ protected List prepareTest(List sparqlEndpointData) throws Exc /** * Load a dataset. Note: the repositories are cleared before loading data - * + * * @param rep * @param datasetFile * @throws RDFParseException @@ -221,7 +225,7 @@ protected void assumeSparqlEndpoint() { /** * Return the {@link RepositorySettings} for configuring the repository - * + * * @param endpoint the endpoint index, starting with 1 * @return */ diff --git a/tools/federation/src/test/java/org/eclipse/rdf4j/federated/endpoint/EndpointFactoryTest.java b/tools/federation/src/test/java/org/eclipse/rdf4j/federated/endpoint/EndpointFactoryTest.java index 7d0013b06c2..12f708d71f3 100644 --- a/tools/federation/src/test/java/org/eclipse/rdf4j/federated/endpoint/EndpointFactoryTest.java +++ b/tools/federation/src/test/java/org/eclipse/rdf4j/federated/endpoint/EndpointFactoryTest.java @@ -7,6 +7,8 @@ *******************************************************************************/ package org.eclipse.rdf4j.federated.endpoint; +import static org.assertj.core.api.Assertions.assertThat; + import java.io.File; import java.util.Arrays; import java.util.List; @@ -81,4 +83,25 @@ public void testDataConfig() throws Exception { } + @Test + public void testDataConfig_writableEndpoint() throws Exception { + + File baseDir = new File("target/tmp/fedxTest"); + + File dataConfig = new File( + EndpointFactoryTest.class.getResource("/tests/dataconfig/endpointfactoryTest_writable.ttl").toURI()); + + List endpoints = EndpointFactory.loadFederationMembers(dataConfig, baseDir); + + endpoints.sort((e1, e2) -> e1.getName().compareTo(e2.getName())); + + assertThat(endpoints.size()).isEqualTo(3); + + Endpoint nativeStore = endpoints.get(2); + assertThat(nativeStore.getName()).isEqualTo("http://dbpedia.native"); + assertThat(nativeStore.getId()).isEqualTo("dbmodel"); + assertThat(nativeStore.getEndpoint()).isEqualTo("dbmodel"); + assertThat(nativeStore.isWritable()).isTrue(); + } + } diff --git a/tools/federation/src/test/java/org/eclipse/rdf4j/federated/endpoint/provider/NativeStoreProvideTest.java b/tools/federation/src/test/java/org/eclipse/rdf4j/federated/endpoint/provider/NativeStoreProvideTest.java index 4bac9c7e262..f74ab033427 100644 --- a/tools/federation/src/test/java/org/eclipse/rdf4j/federated/endpoint/provider/NativeStoreProvideTest.java +++ b/tools/federation/src/test/java/org/eclipse/rdf4j/federated/endpoint/provider/NativeStoreProvideTest.java @@ -15,9 +15,9 @@ public class NativeStoreProvideTest { /** * Create a NativeStore using {@link NativeStoreProvider}. - * + * * Makes the method accessible for test infrastructure - * + * * @param store * @return */ diff --git a/tools/federation/src/test/java/org/eclipse/rdf4j/federated/evaluation/join/HashJoinTest.java b/tools/federation/src/test/java/org/eclipse/rdf4j/federated/evaluation/join/HashJoinTest.java index 345c7483de9..03d09bbe226 100644 --- a/tools/federation/src/test/java/org/eclipse/rdf4j/federated/evaluation/join/HashJoinTest.java +++ b/tools/federation/src/test/java/org/eclipse/rdf4j/federated/evaluation/join/HashJoinTest.java @@ -13,7 +13,6 @@ import org.eclipse.rdf4j.common.iteration.CloseableIteration; import org.eclipse.rdf4j.common.iteration.Iterations; -import org.eclipse.rdf4j.federated.evaluation.join.HashJoin; import org.eclipse.rdf4j.model.IRI; import org.eclipse.rdf4j.model.Literal; import org.eclipse.rdf4j.model.Value; diff --git a/tools/federation/src/test/java/org/eclipse/rdf4j/federated/generator/DataGenerator.java b/tools/federation/src/test/java/org/eclipse/rdf4j/federated/generator/DataGenerator.java index 578a6be0d72..ea9850288fa 100644 --- a/tools/federation/src/test/java/org/eclipse/rdf4j/federated/generator/DataGenerator.java +++ b/tools/federation/src/test/java/org/eclipse/rdf4j/federated/generator/DataGenerator.java @@ -16,10 +16,10 @@ /** * Data generator for 4 endpoints - * + * * Endpoint1: Person Data (rdf:type={foaf:Person, ns1:Person}, foaf:project, foaf:name, owl:sameAs{author in ns4) - * - * + * + * * @author andreas_s * */ @@ -98,30 +98,35 @@ protected void init() { protected void createPersons() { // endpoint 1 - for (int i = 1; i <= PERSONS_1; i++) + for (int i = 1; i <= PERSONS_1; i++) { appendLine(endpoint1, createPerson(i)); + } // endpoint 2 - for (int i = PERSONS_1 + 1; i <= PERSONS_1 + PERSONS_2; i++) + for (int i = PERSONS_1 + 1; i <= PERSONS_1 + PERSONS_2; i++) { appendLine(endpoint2, createPerson(i)); + } } protected void createProjects() { // endpoint 3 - for (int i = 1; i <= PROJECTS; i++) + for (int i = 1; i <= PROJECTS; i++) { appendLine(endpoint3, createProject(i)); + } } protected void createPublications() { // endpoint 4 - for (int i = 1; i <= AUTHORS; i++) + for (int i = 1; i <= AUTHORS; i++) { appendLine(endpoint4, createAuthor(i)); + } // endpoint 4 - for (int i = 1; i <= PUBLICATIONS; i++) + for (int i = 1; i <= PUBLICATIONS; i++) { appendLine(endpoint4, createPublication(i)); + } } @@ -159,7 +164,7 @@ protected String createProject(int id) { /** * Create a publication for endpoint 3, and randomly assign up to 4 authors - * + * * @param id * @return */ @@ -176,8 +181,9 @@ protected String createPublication(int id) { Set authors = new HashSet<>(); for (int i = 0; i < hasAuthors; i++) { int authorId = rand(AUTHORS); - if (authors.contains(authorId)) + if (authors.contains(authorId)) { continue; + } authors.add(authorId); appendLine(sb, pubUri + " :hasAuthor :Author_" + authorId + " ."); } @@ -218,7 +224,7 @@ private void appendLine(StringBuilder sb, String line) { /** * Return an integer between 1 and upper (inclusive) - * + * * @param upperInclusive * @return */ @@ -228,7 +234,7 @@ private int rand(int upperInclusive) { /** * Returns true if the the event is probable using random generator. True iff rand(100) - * + * *

    * Note that the performance scenario does include the correctness check, i.e. it does not only evaluate the pure query * duration, but also checks the query results against a prepared result. *

    - * + * *

    * Example performance run in local environment: *

    - * + * *
      * query01: avg=916, min=858, max=984
      * query02: avg=5, min=5, max=6
    @@ -49,8 +49,8 @@
      * query10: avg=785, min=664, max=1006
      * query11: avg=2465, min=2249, max=3707
      * 
    - * - * + * + * * @author Andreas Schwarte * */ @@ -63,9 +63,7 @@ public class FedXPerformanceTest extends SPARQLBaseTest { @Test @Disabled - public void testPerformance() throws Throwable - - { + public void testPerformance() throws Throwable { String basePackage = "/tests/performance/"; /* prepare endpoints */ diff --git a/tools/federation/src/test/java/org/eclipse/rdf4j/federated/performance/RemoteRepositoryTest.java b/tools/federation/src/test/java/org/eclipse/rdf4j/federated/performance/RemoteRepositoryTest.java index fa4800139d6..9f79e200d6f 100644 --- a/tools/federation/src/test/java/org/eclipse/rdf4j/federated/performance/RemoteRepositoryTest.java +++ b/tools/federation/src/test/java/org/eclipse/rdf4j/federated/performance/RemoteRepositoryTest.java @@ -54,8 +54,9 @@ public static void main(String[] args) throws Exception { long start = System.currentTimeMillis(); int count = 0; for (final IRI instance : instances) { - if (++count > N_QUERIES) + if (++count > N_QUERIES) { break; + } // b) multithreaded final RepositoryConnection _conn = conn; @@ -93,8 +94,9 @@ private static List retrieveInstances(RepositoryConnection conn, IRI type) } } finally { try { - if (qres != null) + if (qres != null) { qres.close(); + } } catch (Exception ignore) { } } @@ -116,8 +118,9 @@ private static int runQuery(RepositoryConnection conn, IRI instance) throws Exce } return count; } finally { - if (res != null) + if (res != null) { res.close(); + } } } } diff --git a/tools/federation/src/test/java/org/eclipse/rdf4j/federated/performance/RepositoryPerformance.java b/tools/federation/src/test/java/org/eclipse/rdf4j/federated/performance/RepositoryPerformance.java index 6ccbc604385..c4a08190083 100644 --- a/tools/federation/src/test/java/org/eclipse/rdf4j/federated/performance/RepositoryPerformance.java +++ b/tools/federation/src/test/java/org/eclipse/rdf4j/federated/performance/RepositoryPerformance.java @@ -81,8 +81,9 @@ public void run() throws Exception { start = System.currentTimeMillis(); int count = 0; for (final IRI instance : instances) { - if (++count > N_QUERIES) + if (++count > N_QUERIES) { break; + } // a) synchronously // runQuery(conn, instance); @@ -107,8 +108,9 @@ public void run() throws Exception { System.out.println("Done evaluating queries. Duration " + (System.currentTimeMillis() - start) + "ms"); } finally { - if (conn != null) + if (conn != null) { conn.close(); + } shutdown(); executor.shutdown(); } @@ -128,8 +130,9 @@ private List retrieveInstances(RepositoryConnection conn) throws Exception } } finally { try { - if (qres != null) + if (qres != null) { qres.close(); + } } catch (Exception ignore) { } } @@ -154,8 +157,9 @@ private int runQuery(RepositoryConnection conn, IRI instance) throws Exception { + (System.currentTimeMillis() - start) + "ms"); return count; } finally { - if (res != null) + if (res != null) { res.close(); + } } } diff --git a/tools/federation/src/test/java/org/eclipse/rdf4j/federated/performance/SPARQLRepositoryPerformance.java b/tools/federation/src/test/java/org/eclipse/rdf4j/federated/performance/SPARQLRepositoryPerformance.java index 079b14d568b..2fd2ef68416 100644 --- a/tools/federation/src/test/java/org/eclipse/rdf4j/federated/performance/SPARQLRepositoryPerformance.java +++ b/tools/federation/src/test/java/org/eclipse/rdf4j/federated/performance/SPARQLRepositoryPerformance.java @@ -38,10 +38,12 @@ public static void main(String[] args) throws Exception { System.out.println("Done."); ; } finally { - if (qRes != null) + if (qRes != null) { qRes.close(); - if (conn != null) + } + if (conn != null) { conn.close(); + } } repo.shutDown(); diff --git a/tools/federation/src/test/java/org/eclipse/rdf4j/federated/performance/SparqlRepositoryTest.java b/tools/federation/src/test/java/org/eclipse/rdf4j/federated/performance/SparqlRepositoryTest.java index a20b672c463..7c9e99cf81b 100644 --- a/tools/federation/src/test/java/org/eclipse/rdf4j/federated/performance/SparqlRepositoryTest.java +++ b/tools/federation/src/test/java/org/eclipse/rdf4j/federated/performance/SparqlRepositoryTest.java @@ -64,8 +64,9 @@ public static void main(String[] args) throws Exception { // while (qRes2.hasNext()) { // qRes2.next(); // } - for (Future t : tasks) + for (Future t : tasks) { t.get(); + } System.out.println("Done"); executor.shutdown(); System.exit(1); diff --git a/tools/federation/src/test/java/org/eclipse/rdf4j/federated/repository/ConfigurableSailRepository.java b/tools/federation/src/test/java/org/eclipse/rdf4j/federated/repository/ConfigurableSailRepository.java index ecdd1be6fdd..649e67d9f1a 100644 --- a/tools/federation/src/test/java/org/eclipse/rdf4j/federated/repository/ConfigurableSailRepository.java +++ b/tools/federation/src/test/java/org/eclipse/rdf4j/federated/repository/ConfigurableSailRepository.java @@ -17,7 +17,7 @@ /** * Specialized {@link SailRepository} that allows configuration of various behaviors, e.g. fail after N operations. - * + * * @author Andreas Schwarte * */ @@ -77,4 +77,4 @@ public SailRepositoryConnection getConnection() public void setLatencySimulator(Runnable runnable) { this.latencySimulator = runnable; } -} \ No newline at end of file +} diff --git a/tools/federation/src/test/java/org/eclipse/rdf4j/federated/repository/ConfigurableSailRepositoryConnection.java b/tools/federation/src/test/java/org/eclipse/rdf4j/federated/repository/ConfigurableSailRepositoryConnection.java index 8cad5e8cbfd..d6502ca683b 100644 --- a/tools/federation/src/test/java/org/eclipse/rdf4j/federated/repository/ConfigurableSailRepositoryConnection.java +++ b/tools/federation/src/test/java/org/eclipse/rdf4j/federated/repository/ConfigurableSailRepositoryConnection.java @@ -26,7 +26,7 @@ /** * Specialized {@link SailRepositoryConnection} that can be used with {@link ConfigurableSailRepository} - * + * * @author Andreas Schwarte * */ @@ -141,9 +141,11 @@ private void checkFail(boolean isWrite) throws FailingRepositoryException { rep.operationsCount.set(0); } - if (isWrite && !rep.writable) + if (isWrite && !rep.writable) { throw new FailingRepositoryException("Operation failed, not writable"); - if (rep.failAfter != -1 && _operationsCount > rep.failAfter) + } + if (rep.failAfter != -1 && _operationsCount > rep.failAfter) { throw new FailingRepositoryException("Operation failed"); + } } -} \ No newline at end of file +} diff --git a/tools/federation/src/test/java/org/eclipse/rdf4j/federated/repository/ConfigurableSailRepositoryFactory.java b/tools/federation/src/test/java/org/eclipse/rdf4j/federated/repository/ConfigurableSailRepositoryFactory.java index c5e4def42b1..fbeb1c6060b 100644 --- a/tools/federation/src/test/java/org/eclipse/rdf4j/federated/repository/ConfigurableSailRepositoryFactory.java +++ b/tools/federation/src/test/java/org/eclipse/rdf4j/federated/repository/ConfigurableSailRepositoryFactory.java @@ -24,7 +24,7 @@ /** * See {@link SailRepositoryFactory} - * + * * @author Andreas Schwarte * */ diff --git a/tools/federation/src/test/java/org/eclipse/rdf4j/federated/repository/FedXRepositoryConfigTest.java b/tools/federation/src/test/java/org/eclipse/rdf4j/federated/repository/FedXRepositoryConfigTest.java index fe0907597ff..ebc701fee02 100644 --- a/tools/federation/src/test/java/org/eclipse/rdf4j/federated/repository/FedXRepositoryConfigTest.java +++ b/tools/federation/src/test/java/org/eclipse/rdf4j/federated/repository/FedXRepositoryConfigTest.java @@ -7,27 +7,26 @@ *******************************************************************************/ package org.eclipse.rdf4j.federated.repository; +import static org.assertj.core.api.Assertions.assertThat; +import static org.eclipse.rdf4j.model.util.Models.subject; + import java.io.InputStream; -import java.util.stream.Collectors; import org.eclipse.rdf4j.federated.util.Vocabulary.FEDX; import org.eclipse.rdf4j.model.Model; import org.eclipse.rdf4j.model.Resource; +import org.eclipse.rdf4j.model.Value; import org.eclipse.rdf4j.model.impl.TreeModel; -import org.eclipse.rdf4j.model.util.Models; import org.eclipse.rdf4j.repository.config.RepositoryConfigSchema; import org.eclipse.rdf4j.rio.RDFFormat; import org.eclipse.rdf4j.rio.Rio; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; -import com.github.jsonldjava.shaded.com.google.common.collect.Sets; - public class FedXRepositoryConfigTest { @Test public void testParseConfig() throws Exception { - Model model = readConfig("/tests/rdf4jserver/config.ttl"); FedXRepositoryConfig config = new FedXRepositoryConfig(); @@ -36,19 +35,14 @@ public void testParseConfig() throws Exception { Assertions.assertNull(config.getDataConfig()); Model members = config.getMembers(); - Assertions.assertEquals(2, members.filter(null, FEDX.STORE, null).size()); // 2 members - Assertions.assertEquals(Sets.newHashSet("endpoint1", "endpoint2"), - members.filter(null, FEDX.REPOSITORY_NAME, null) - .objects() - .stream() - .map(v -> v.stringValue()) - .collect(Collectors.toSet())); + assertThat(members.filter(null, FEDX.STORE, null).size()).isEqualTo(2); + assertThat(members.filter(null, FEDX.REPOSITORY_NAME, null).objects().stream().map(Value::stringValue)) + .containsExactly("endpoint1", "endpoint2"); } @Test public void testParseConfig_DataConfig() throws Exception { - Model model = readConfig("/tests/rdf4jserver/config-withDataConfig.ttl"); FedXRepositoryConfig config = new FedXRepositoryConfig(); @@ -62,7 +56,6 @@ public void testParseConfig_DataConfig() throws Exception { @Test public void testExport() throws Exception { - Model model = readConfig("/tests/rdf4jserver/config.ttl"); FedXRepositoryConfig config = new FedXRepositoryConfig(); @@ -72,13 +65,10 @@ public void testExport() throws Exception { Model export = new TreeModel(); Resource implNode = config.export(export); - Assertions.assertEquals(2, export.filter(implNode, FedXRepositoryConfig.MEMBER, null).size()); // 2 members - Assertions.assertEquals(Sets.newHashSet("endpoint1", "endpoint2"), - export.filter(null, FEDX.REPOSITORY_NAME, null) - .objects() - .stream() - .map(v -> v.stringValue()) - .collect(Collectors.toSet())); + assertThat(export.filter(implNode, FedXRepositoryConfig.MEMBER, null).size()).isEqualTo(2); + + assertThat(export.filter(null, FEDX.REPOSITORY_NAME, null).objects().stream().map(Value::stringValue)) + .containsExactly("endpoint1", "endpoint2"); } protected Model readConfig(String configResource) throws Exception { @@ -88,7 +78,7 @@ protected Model readConfig(String configResource) throws Exception { } protected Resource implNode(Model model) { - return Models.subject(model.filter(null, RepositoryConfigSchema.REPOSITORYTYPE, null)).get(); + return subject(model.filter(null, RepositoryConfigSchema.REPOSITORYTYPE, null)).get(); } } diff --git a/tools/federation/src/test/java/org/eclipse/rdf4j/federated/repository/RepositorySettings.java b/tools/federation/src/test/java/org/eclipse/rdf4j/federated/repository/RepositorySettings.java index 3f6c2ef51b6..526f8543451 100644 --- a/tools/federation/src/test/java/org/eclipse/rdf4j/federated/repository/RepositorySettings.java +++ b/tools/federation/src/test/java/org/eclipse/rdf4j/federated/repository/RepositorySettings.java @@ -9,7 +9,7 @@ /** * Interface for defining settings on a repository, e.g {@link ConfigurableSailRepository} - * + * * @author Andreas Schwarte * */ @@ -21,7 +21,7 @@ public interface RepositorySettings { public void setFailAfter(int nOperations); /** - * + * * @param flag */ public void setWritable(boolean flag); @@ -29,7 +29,7 @@ public interface RepositorySettings { public void resetOperationsCounter(); /** - * + * * @param runnable a runnable that can be used to simulate latency, e.g. by letting the thread sleep */ public void setLatencySimulator(Runnable runnable); diff --git a/tools/federation/src/test/java/org/eclipse/rdf4j/federated/server/CustomAppConfiguration.java b/tools/federation/src/test/java/org/eclipse/rdf4j/federated/server/CustomAppConfiguration.java index 9f5148a5b75..cf0fcdfe047 100644 --- a/tools/federation/src/test/java/org/eclipse/rdf4j/federated/server/CustomAppConfiguration.java +++ b/tools/federation/src/test/java/org/eclipse/rdf4j/federated/server/CustomAppConfiguration.java @@ -15,9 +15,9 @@ /** * A bean for configuring the RDF4J Http Server webapp. Makes sure to initialize the logging framework properly. - * + * * See build/test/rdf4j-server/WEB-INF/rdf4j-http-server-servlet.xml - * + * * @author andreas.schwarte * */ diff --git a/tools/federation/src/test/java/org/eclipse/rdf4j/federated/server/FedXRepositoryResolverBean.java b/tools/federation/src/test/java/org/eclipse/rdf4j/federated/server/FedXRepositoryResolverBean.java index 38e57af2863..3ecde8c1b75 100644 --- a/tools/federation/src/test/java/org/eclipse/rdf4j/federated/server/FedXRepositoryResolverBean.java +++ b/tools/federation/src/test/java/org/eclipse/rdf4j/federated/server/FedXRepositoryResolverBean.java @@ -11,11 +11,11 @@ /** * A resolver bean that provides static access to a {@link RepositoryResolver}. - * + * *

    * For use in the RDF4J workbench the following Spring bean can be registered: *

    - * + * *
      * <!-- Inject the local repository manager as RepositoryResolver into FedX -->
      * <bean id="fedxRepositoryResolver"
    @@ -24,7 +24,7 @@
      *  	<property name="repositoryResolver" ref="rdf4jRepositoryManager" />
      * </bean>
      * 
    - * + * * @author Andreas Schwarte * */ diff --git a/tools/federation/src/test/java/org/eclipse/rdf4j/federated/server/SPARQLEmbeddedServer.java b/tools/federation/src/test/java/org/eclipse/rdf4j/federated/server/SPARQLEmbeddedServer.java index 66e6e97447e..17d5f17db35 100644 --- a/tools/federation/src/test/java/org/eclipse/rdf4j/federated/server/SPARQLEmbeddedServer.java +++ b/tools/federation/src/test/java/org/eclipse/rdf4j/federated/server/SPARQLEmbeddedServer.java @@ -27,7 +27,7 @@ /** * An embedded http server for SPARQL query testing. Initializes a memory store repository for each specified * reposiotoryId. - * + * * @author Andreas Schwarte */ public class SPARQLEmbeddedServer extends EmbeddedServer implements Server { @@ -150,7 +150,7 @@ public Endpoint loadEndpoint(int i) throws Exception { } /** - * + * * @param i the index of the repository, starting with 1 * @return the repository */ diff --git a/tools/federation/src/test/java/org/eclipse/rdf4j/federated/server/Server.java b/tools/federation/src/test/java/org/eclipse/rdf4j/federated/server/Server.java index dbc68a036a1..3a2f448626f 100644 --- a/tools/federation/src/test/java/org/eclipse/rdf4j/federated/server/Server.java +++ b/tools/federation/src/test/java/org/eclipse/rdf4j/federated/server/Server.java @@ -12,9 +12,9 @@ /** * Interface for the server: - * + * * {@link SPARQLEmbeddedServer} and {@link NativeStoreServer} - * + * * @author as * */ @@ -28,7 +28,7 @@ public interface Server { /** * Returns the actual {@link ConfigurableSailRepository} instance for the endpoint - * + * * @param i the endpoint index starting with 1 * @return */ diff --git a/tools/federation/src/test/java/org/eclipse/rdf4j/federated/util/FilterUtilTest.java b/tools/federation/src/test/java/org/eclipse/rdf4j/federated/util/FilterUtilTest.java index 43de38eb38e..8f9871cdc5f 100644 --- a/tools/federation/src/test/java/org/eclipse/rdf4j/federated/util/FilterUtilTest.java +++ b/tools/federation/src/test/java/org/eclipse/rdf4j/federated/util/FilterUtilTest.java @@ -11,8 +11,6 @@ import org.eclipse.rdf4j.federated.algebra.ConjunctiveFilterExpr; import org.eclipse.rdf4j.federated.algebra.FilterExpr; -import org.eclipse.rdf4j.federated.util.FedXUtil; -import org.eclipse.rdf4j.federated.util.FilterUtils; import org.eclipse.rdf4j.query.algebra.Compare; import org.eclipse.rdf4j.query.algebra.Compare.CompareOp; import org.eclipse.rdf4j.query.algebra.ValueConstant; diff --git a/tools/federation/src/test/java/org/eclipse/rdf4j/federated/write/WriteTest.java b/tools/federation/src/test/java/org/eclipse/rdf4j/federated/write/WriteTest.java index 0f22019adc4..31be41340f6 100644 --- a/tools/federation/src/test/java/org/eclipse/rdf4j/federated/write/WriteTest.java +++ b/tools/federation/src/test/java/org/eclipse/rdf4j/federated/write/WriteTest.java @@ -10,20 +10,26 @@ import java.util.Arrays; import java.util.Iterator; import java.util.List; +import java.util.concurrent.atomic.AtomicInteger; import org.eclipse.rdf4j.common.iteration.Iterations; +import org.eclipse.rdf4j.federated.FederationContext; import org.eclipse.rdf4j.federated.SPARQLBaseTest; import org.eclipse.rdf4j.federated.endpoint.Endpoint; import org.eclipse.rdf4j.federated.endpoint.EndpointBase; import org.eclipse.rdf4j.model.IRI; +import org.eclipse.rdf4j.model.Resource; import org.eclipse.rdf4j.model.Statement; +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.FOAF; import org.eclipse.rdf4j.model.vocabulary.RDF; import org.eclipse.rdf4j.query.QueryLanguage; import org.eclipse.rdf4j.query.Update; +import org.eclipse.rdf4j.repository.Repository; import org.eclipse.rdf4j.repository.RepositoryConnection; +import org.eclipse.rdf4j.repository.RepositoryException; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -161,9 +167,61 @@ public void testSimpleRemove() throws Exception { } } + @Test + public void testCustomWriteStrategy() throws Exception { + + prepareTest(Arrays.asList("/tests/basic/data_emptyStore.ttl", "/tests/basic/data_emptyStore.ttl")); + + // configure the test write strategy factory + fedxRule.getFederationContext().getConfig().withWriteStrategyFactory(TestWriteStrategyFactory.class); + + try (RepositoryConnection conn = fedxRule.getRepository().getConnection()) { + Update update = conn.prepareUpdate(QueryLanguage.SPARQL, + "PREFIX : INSERT { :subject a :Person } WHERE { }"); + update.execute(); + + // test that statement is returned from federation + List stmts = Iterations.asList(conn.getStatements(null, null, null, true)); + Assertions.assertEquals(1, stmts.size()); + Assertions.assertEquals(RDF.TYPE, stmts.get(0).getPredicate()); + + Assertions.assertEquals(1, writeOperations.get()); + } + } + protected Statement simpleStatement() { ValueFactory vf = SimpleValueFactory.getInstance(); IRI subject = vf.createIRI("http://example.org/person1"); return vf.createStatement(subject, RDF.TYPE, FOAF.PERSON); } + + @BeforeEach + public void clearWriteOperations() throws Exception { + writeOperations.set(0); + } + + // write operations done + static final AtomicInteger writeOperations = new AtomicInteger(0); + + public static class TestWriteStrategyFactory implements WriteStrategyFactory { + + @Override + public WriteStrategy create(List members, FederationContext federationContext) { + return new TestWriteStrategy(members.get(0).getRepository()); + } + } + + static class TestWriteStrategy extends RepositoryWriteStrategy { + + public TestWriteStrategy(Repository writeRepository) { + super(writeRepository); + } + + @Override + public void addStatement(Resource subj, IRI pred, Value obj, Resource... contexts) throws RepositoryException { + writeOperations.incrementAndGet(); + super.addStatement(subj, pred, obj, contexts); + } + + } } diff --git a/tools/federation/src/test/resources/tests/basic/query_limit01.qp b/tools/federation/src/test/resources/tests/basic/query_limit01.qp index ad963da82cc..237b654eb6f 100644 --- a/tools/federation/src/test/resources/tests/basic/query_limit01.qp +++ b/tools/federation/src/test/resources/tests/basic/query_limit01.qp @@ -1,5 +1,5 @@ QueryRoot - Slice ( limit=1 ) + Slice (limit=1) Projection ProjectionElemList ProjectionElem "person" diff --git a/tools/federation/src/test/resources/tests/dataconfig/endpointfactoryTest_writable.ttl b/tools/federation/src/test/resources/tests/dataconfig/endpointfactoryTest_writable.ttl new file mode 100644 index 00000000000..178bf8fa5fe --- /dev/null +++ b/tools/federation/src/test/resources/tests/dataconfig/endpointfactoryTest_writable.ttl @@ -0,0 +1,17 @@ +@prefix sd: . +@prefix fedx: . + + a sd:Service ; + fedx:store "SPARQLEndpoint"; + sd:endpoint "http://dbpedia.org/sparql". + + a sd:Service ; + fedx:store "RemoteRepository"; + fedx:repositoryServer "http://10.212.10.29:8088/rdf4j-server"; + fedx:repositoryName "dbpedia". + + a sd:Service ; + fedx:store "NativeStore" ; + fedx:repositoryLocation "dbmodel" ; + fedx:writable true . + diff --git a/tools/federation/src/test/resources/tests/named-graphs/data-boundjoin1.trig b/tools/federation/src/test/resources/tests/named-graphs/data-boundjoin1.trig new file mode 100644 index 00000000000..addd9e13545 --- /dev/null +++ b/tools/federation/src/test/resources/tests/named-graphs/data-boundjoin1.trig @@ -0,0 +1,41 @@ +@prefix ex: . +@prefix foaf: . +@prefix rdf: . + + +ex:graph1 { + ex:Person1 rdf:type foaf:Person ; + foaf:name "Person 1" . + + ex:Person2 rdf:type foaf:Person ; + foaf:name "Person 2" . + + ex:Person3 rdf:type foaf:Person ; + foaf:name "Person 3" . + + ex:Person4 rdf:type foaf:Person ; + foaf:name "Person 4" . + + ex:Person5 rdf:type foaf:Person . +} + +ex:graph2 { + ex:Person6 rdf:type foaf:Person ; + foaf:name "Person 6" . + + ex:Person7 rdf:type foaf:Person ; + foaf:name "Person 7" . + + ex:Person8 rdf:type foaf:Person ; + foaf:name "Person 8" . + + ex:Person9 rdf:type foaf:Person ; + foaf:name "Person 9" . + + ex:Person10 rdf:type foaf:Person ; + foaf:name "Person 10" . +} + +ex:graph3 { + ex:Person5 foaf:name "Person 5" . +} \ No newline at end of file diff --git a/tools/federation/src/test/resources/tests/named-graphs/data-boundjoin2.trig b/tools/federation/src/test/resources/tests/named-graphs/data-boundjoin2.trig new file mode 100644 index 00000000000..3aea42e7236 --- /dev/null +++ b/tools/federation/src/test/resources/tests/named-graphs/data-boundjoin2.trig @@ -0,0 +1,41 @@ +@prefix ex: . +@prefix foaf: . +@prefix rdf: . + + +ex:graph1 { + ex:Person11 rdf:type foaf:Person ; + foaf:name "Person 11" . + + ex:Person12 rdf:type foaf:Person ; + foaf:name "Person 12" . + + ex:Person13 rdf:type foaf:Person ; + foaf:name "Person 13" . + + ex:Person14 rdf:type foaf:Person ; + foaf:name "Person 14" . + + ex:Person15 rdf:type foaf:Person . +} + +ex:graph2 { + ex:Person16 rdf:type foaf:Person ; + foaf:name "Person 16" . + + ex:Person17 rdf:type foaf:Person ; + foaf:name "Person 17" . + + ex:Person18 rdf:type foaf:Person ; + foaf:name "Person 18" . + + ex:Person19 rdf:type foaf:Person ; + foaf:name "Person 19" . + + ex:Person20 rdf:type foaf:Person ; + foaf:name "Person 20" . +} + +ex:graph3 { + ex:Person15 foaf:name "Person 15" . +} \ No newline at end of file diff --git a/tools/federation/src/test/resources/tests/named-graphs/data1.trig b/tools/federation/src/test/resources/tests/named-graphs/data1.trig new file mode 100644 index 00000000000..f6d826daa89 --- /dev/null +++ b/tools/federation/src/test/resources/tests/named-graphs/data1.trig @@ -0,0 +1,37 @@ +@prefix : . +@prefix ns3: . +@prefix foaf: . +@prefix rdf: . +@prefix rdfs: . +@prefix owl: . +@prefix xsd: . + +:graph1 { + :Person_1 rdf:type foaf:Person . + :Person_1 rdf:type :Person . + :Person_1 foaf:name "Person1" . + :Person_1 foaf:age "20"^^xsd:integer . + + :Person_2 rdf:type foaf:Person . + :Person_2 rdf:type :Person . + :Person_2 foaf:name "Person2" . + :Person_2 foaf:age "27"^^xsd:integer . +} + +:graph2 { + :Person_3 rdf:type foaf:Person . + :Person_3 rdf:type :Person . + :Person_3 foaf:name "Person3" . + :Person_3 foaf:age "30"^^xsd:integer . + + :Person_4 rdf:type foaf:Person . + :Person_4 rdf:type :Person . + :Person_4 foaf:name "Person4" . +} + +ns3:sharedGraph { + :Person_5 rdf:type foaf:Person . + :Person_5 rdf:type :Person . + :Person_5 foaf:name "Person5" . +} + diff --git a/tools/federation/src/test/resources/tests/named-graphs/data2.trig b/tools/federation/src/test/resources/tests/named-graphs/data2.trig new file mode 100644 index 00000000000..fa0ff82c42c --- /dev/null +++ b/tools/federation/src/test/resources/tests/named-graphs/data2.trig @@ -0,0 +1,35 @@ +@prefix : . +@prefix ns3: . +@prefix foaf: . +@prefix rdf: . +@prefix rdfs: . +@prefix owl: . +@prefix xsd: . + +:graph1 { + :Person_6 rdf:type foaf:Person . + :Person_6 rdf:type :Person . + :Person_6 foaf:name "Person6" . + :Person_6 foaf:age "25"^^xsd:integer . + + :Person_7 rdf:type foaf:Person . + :Person_7 rdf:type :Person . + :Person_7 foaf:name "Person7" . +} + +:graph2 { + :Person_8 rdf:type foaf:Person . + :Person_8 rdf:type :Person . + :Person_8 foaf:name "Person8" . + + :Person_9 rdf:type foaf:Person . + :Person_9 rdf:type :Person . + :Person_9 foaf:name "Person9" . +} + +ns3:sharedGraph { + :Person_10 rdf:type foaf:Person . + :Person_10 rdf:type :Person . + :Person_10 foaf:name "Person10" . +} + diff --git a/tools/federation/src/test/resources/tests/named-graphs/data3.trig b/tools/federation/src/test/resources/tests/named-graphs/data3.trig new file mode 100644 index 00000000000..32d3f09b373 --- /dev/null +++ b/tools/federation/src/test/resources/tests/named-graphs/data3.trig @@ -0,0 +1,20 @@ +@prefix : . +@prefix ns1: . +@prefix ns2: . +@prefix foaf: . +@prefix rdf: . +@prefix rdfs: . +@prefix owl: . + +:sharedGraph { + :Project_1 rdf:type :Project . + :Project_1 rdfs:label "Project1" . + :Project_1 :responsible ns2:Person_7 . + + :Project_2 rdf:type :Project . + :Project_2 rdfs:label "Project2" . + + :Project_3 rdf:type :Project . + :Project_3 rdfs:label "Project3" . +} + diff --git a/tools/federation/src/test/resources/tests/named-graphs/data4.trig b/tools/federation/src/test/resources/tests/named-graphs/data4.trig new file mode 100644 index 00000000000..51423ecb830 --- /dev/null +++ b/tools/federation/src/test/resources/tests/named-graphs/data4.trig @@ -0,0 +1,132 @@ +@prefix : . +@prefix ns1: . +@prefix ns2: . +@prefix ns3: . +@prefix foaf: . +@prefix rdf: . +@prefix rdfs: . +@prefix owl: . + +ns3:sharedGraph { + + :Author_1 rdf:type :Author . + :Author_1 :authorId "Author1" . + + :Author_2 rdf:type :Author . + :Author_2 :authorId "Author2" . + :Author_2 owl:sameAs ns1:Person_2 . + + :Author_3 rdf:type :Author . + :Author_3 :authorId "Author3" . + + :Author_4 rdf:type :Author . + :Author_4 :authorId "Author4" . + + :Author_5 rdf:type :Author . + :Author_5 :authorId "Author5" . + :Author_5 owl:sameAs ns1:Person_5 . + + :Author_6 rdf:type :Author . + :Author_6 :authorId "Author6" . + + :Author_7 rdf:type :Author . + :Author_7 :authorId "Author7" . + :Author_7 owl:sameAs ns2:Person_7 . + + :Author_8 rdf:type :Author . + :Author_8 :authorId "Author8" . + :Author_8 owl:sameAs ns2:Person_8 . + + :Author_9 rdf:type :Author . + :Author_9 :authorId "Author9" . + + :Author_10 rdf:type :Author . + :Author_10 :authorId "Author10" . + + :Author_11 rdf:type :Author . + :Author_11 :authorId "Author11" . + + :Author_12 rdf:type :Author . + :Author_12 :authorId "Author12" . + + :Author_13 rdf:type :Author . + :Author_13 :authorId "Author13" . + + :Author_14 rdf:type :Author . + :Author_14 :authorId "Author14" . + + :Author_15 rdf:type :Author . + :Author_15 :authorId "Author15" . + + :Author_16 rdf:type :Author . + :Author_16 :authorId "Author16" . + + :Author_17 rdf:type :Author . + :Author_17 :authorId "Author17" . + + :Author_18 rdf:type :Author . + :Author_18 :authorId "Author18" . + + :Author_19 rdf:type :Author . + :Author_19 :authorId "Author19" . + + :Author_20 rdf:type :Author . + :Author_20 :authorId "Author20" . + + :Publication_1 rdf:type :Publication . + :Publication_1 :title "Publication1" . + :Publication_1 :hasAuthor :Author_14 . + :Publication_1 :hasAuthor :Author_1 . + + :Publication_2 rdf:type :Publication . + :Publication_2 :title "Publication2" . + :Publication_2 :hasAuthor :Author_11 . + :Publication_2 :hasAuthor :Author_3 . + :Publication_2 :hasAuthor :Author_12 . + :Publication_2 :hasAuthor :Author_18 . + + :Publication_3 rdf:type :Publication . + :Publication_3 :title "Publication3" . + :Publication_3 :hasAuthor :Author_18 . + + :Publication_4 rdf:type :Publication . + :Publication_4 :title "Publication4" . + :Publication_4 :hasAuthor :Author_18 . + :Publication_4 :hasAuthor :Author_11 . + :Publication_4 :hasAuthor :Author_10 . + + :Publication_5 rdf:type :Publication . + :Publication_5 :title "Publication5" . + :Publication_5 :hasAuthor :Author_7 . + :Publication_5 :hasAuthor :Author_3 . + + :Publication_6 rdf:type :Publication . + :Publication_6 :title "Publication6" . + :Publication_6 :hasAuthor :Author_1 . + :Publication_6 :hasAuthor :Author_19 . + :Publication_6 :hasAuthor :Author_18 . + :Publication_6 :hasAuthor :Author_8 . + + :Publication_7 rdf:type :Publication . + :Publication_7 :title "Publication7" . + :Publication_7 :hasAuthor :Author_19 . + :Publication_7 :hasAuthor :Author_2 . + :Publication_7 :hasAuthor :Author_1 . + + :Publication_8 rdf:type :Publication . + :Publication_8 :title "Publication8" . + :Publication_8 :hasAuthor :Author_20 . + :Publication_8 :hasAuthor :Author_11 . + :Publication_8 :hasAuthor :Author_14 . + :Publication_8 :hasAuthor :Author_12 . + + :Publication_9 rdf:type :Publication . + :Publication_9 :title "Publication9" . + :Publication_9 :hasAuthor :Author_19 . + + :Publication_10 rdf:type :Publication . + :Publication_10 :title "Publication10" . + :Publication_10 :hasAuthor :Author_20 . + :Publication_10 :hasAuthor :Author_9 . + :Publication_10 :hasAuthor :Author_1 . +} diff --git a/tools/federation/src/test/resources/tests/optimizer/queryPlan_Join_1.txt b/tools/federation/src/test/resources/tests/optimizer/queryPlan_Join_1.txt index a42d9c18a9f..47ce705a38a 100644 --- a/tools/federation/src/test/resources/tests/optimizer/queryPlan_Join_1.txt +++ b/tools/federation/src/test/resources/tests/optimizer/queryPlan_Join_1.txt @@ -3,7 +3,7 @@ QueryRoot ProjectionElemList ProjectionElem "person" NUnion - Extension + Extension (new scope) ExtensionElem (nameOut) Var (name=name) EmptyNJoin diff --git a/tools/federation/src/test/resources/tests/optimizer/queryPlan_bind.qp b/tools/federation/src/test/resources/tests/optimizer/queryPlan_bind.qp new file mode 100644 index 00000000000..971dc75822a --- /dev/null +++ b/tools/federation/src/test/resources/tests/optimizer/queryPlan_bind.qp @@ -0,0 +1,23 @@ +QueryRoot + Projection + ProjectionElemList + ProjectionElem "project" + ProjectionElem "label" + NJoin + Extension + ExtensionElem (type) + ValueConstant (value=http://namespace3.org/Project) + SingletonSet + StatementSourcePattern + Var (name=project) + Var (name=_const_f5e5585a_uri, value=http://www.w3.org/1999/02/22-rdf-syntax-ns#type, anonymous) + Var (name=type) + StatementSource (id=endpoint1, type=REMOTE) + StatementSource (id=endpoint2, type=REMOTE) + StatementSource (id=endpoint3, type=REMOTE) + StatementSource (id=endpoint4, type=REMOTE) + ExclusiveStatement + Var (name=project) + Var (name=_const_9285ccfc_uri, value=http://www.w3.org/2000/01/rdf-schema#label, anonymous) + Var (name=label) + StatementSource (id=endpoint3, type=REMOTE) diff --git a/tools/federation/src/test/resources/tests/optimizer/queryPlan_bind.rq b/tools/federation/src/test/resources/tests/optimizer/queryPlan_bind.rq new file mode 100644 index 00000000000..17b923dcf5e --- /dev/null +++ b/tools/federation/src/test/resources/tests/optimizer/queryPlan_bind.rq @@ -0,0 +1,13 @@ +# test for join order optimizer to re-order bound type + +PREFIX ns3: +PREFIX foaf: +PREFIX rdf: +PREFIX rdfs: +PREFIX owl: + +SELECT ?project ?label WHERE { + BIND(ns3:Project AS ?type) + ?project rdfs:label ?label . + ?project rdf:type ?type . +} \ No newline at end of file diff --git a/tools/federation/src/test/resources/tests/rdf4jserver/config.ttl b/tools/federation/src/test/resources/tests/rdf4jserver/config.ttl index 6c8d7fb2bb2..e0bfcca8335 100644 --- a/tools/federation/src/test/resources/tests/rdf4jserver/config.ttl +++ b/tools/federation/src/test/resources/tests/rdf4jserver/config.ttl @@ -10,7 +10,8 @@ rep:repositoryType "fedx:FedXRepository" ; fedx:member [ fedx:store "ResolvableRepository" ; - fedx:repositoryName "endpoint1" + fedx:repositoryName "endpoint1" ; + fedx:writable true ] , [ fedx:store "ResolvableRepository" ; diff --git a/tools/federation/src/test/resources/tests/rdf4jserver/dataConfig.ttl b/tools/federation/src/test/resources/tests/rdf4jserver/dataConfig.ttl index dbeadb55c95..ba59d54da79 100644 --- a/tools/federation/src/test/resources/tests/rdf4jserver/dataConfig.ttl +++ b/tools/federation/src/test/resources/tests/rdf4jserver/dataConfig.ttl @@ -3,8 +3,9 @@ a sd:Service ; fedx:store "ResolvableRepository" ; - fedx:repositoryName "endpoint1" . + fedx:repositoryName "endpoint1" ; + fedx:writable true. a sd:Service ; fedx:store "ResolvableRepository" ; - fedx:repositoryName "endpoint2" . \ No newline at end of file + fedx:repositoryName "endpoint2" . diff --git a/tools/pom.xml b/tools/pom.xml index 6f8ca785157..710726d7a8d 100644 --- a/tools/pom.xml +++ b/tools/pom.xml @@ -4,7 +4,7 @@ org.eclipse.rdf4j rdf4j - 3.1.5-SNAPSHOT + 3.2.2-SNAPSHOT org.eclipse.rdf4j rdf4j-tools diff --git a/tools/runtime-osgi/pom.xml b/tools/runtime-osgi/pom.xml index 44fcdacb488..f989215c378 100644 --- a/tools/runtime-osgi/pom.xml +++ b/tools/runtime-osgi/pom.xml @@ -4,7 +4,7 @@ org.eclipse.rdf4j rdf4j-tools - 3.1.5-SNAPSHOT + 3.2.2-SNAPSHOT rdf4j-runtime-osgi bundle @@ -35,16 +35,7 @@ org.eclipse.rdf4j !*text-base,!*prop-base,org.eclipse.rdf4j.* - - org.slf4j.*, - javax.*;resolution:=optional, - org.apache.*;resolution:=optional, - org.springframework.*;resolution:=optional, - org.locationtech;resolution:=optional, - org.elasticsearch;resolution:=optional, - ch.qos.logback;resolution:=optional, - * - + org.slf4j.*, javax.*;resolution:=optional, org.apache.*;resolution:=optional, org.springframework.*;resolution:=optional, org.locationtech;resolution:=optional, org.elasticsearch;resolution:=optional, ch.qos.logback;resolution:=optional, * *; groupId=org.eclipse.rdf4j; scope=compile|runtime; type=!pom; inline=true true diff --git a/tools/runtime/pom.xml b/tools/runtime/pom.xml index 33ffa2f278f..64f987e9d45 100644 --- a/tools/runtime/pom.xml +++ b/tools/runtime/pom.xml @@ -4,7 +4,7 @@ org.eclipse.rdf4j rdf4j-tools - 3.1.5-SNAPSHOT + 3.2.2-SNAPSHOT rdf4j-runtime RDF4J: Runtime diff --git a/tools/server-spring/pom.xml b/tools/server-spring/pom.xml index 488ffb8db0a..666ba90bdaa 100644 --- a/tools/server-spring/pom.xml +++ b/tools/server-spring/pom.xml @@ -4,7 +4,7 @@ org.eclipse.rdf4j rdf4j-tools - 3.1.5-SNAPSHOT + 3.2.2-SNAPSHOT rdf4j-http-server-spring RDF4J: HTTP server - core diff --git a/tools/server-spring/src/main/java/org/eclipse/rdf4j/common/webapp/CommonValuesHandlerInterceptor.java b/tools/server-spring/src/main/java/org/eclipse/rdf4j/common/webapp/CommonValuesHandlerInterceptor.java index 3b0de8003d2..7c7fda8e2dc 100644 --- a/tools/server-spring/src/main/java/org/eclipse/rdf4j/common/webapp/CommonValuesHandlerInterceptor.java +++ b/tools/server-spring/src/main/java/org/eclipse/rdf4j/common/webapp/CommonValuesHandlerInterceptor.java @@ -19,7 +19,7 @@ * Interceptor that inserts some commonly used values into the model. The inserted values are: - path, equal to * request.getContextPath() (e.g. /context) - basePath, equal to the fully qualified context path (e.g. * http://www.example.com/context/) - currentYear, equal to the current year - * + * * @author Herko ter Horst */ public class CommonValuesHandlerInterceptor implements HandlerInterceptor { diff --git a/tools/server-spring/src/main/java/org/eclipse/rdf4j/common/webapp/Message.java b/tools/server-spring/src/main/java/org/eclipse/rdf4j/common/webapp/Message.java index 2be0c7d1b87..ad0978e6198 100644 --- a/tools/server-spring/src/main/java/org/eclipse/rdf4j/common/webapp/Message.java +++ b/tools/server-spring/src/main/java/org/eclipse/rdf4j/common/webapp/Message.java @@ -18,7 +18,9 @@ public static enum Type { ERROR, WARN, INFO - }; + } + + ; private Type type; diff --git a/tools/server-spring/src/main/java/org/eclipse/rdf4j/common/webapp/MessageHandlerInterceptor.java b/tools/server-spring/src/main/java/org/eclipse/rdf4j/common/webapp/MessageHandlerInterceptor.java index 89271e43cec..5c880ab91ac 100644 --- a/tools/server-spring/src/main/java/org/eclipse/rdf4j/common/webapp/MessageHandlerInterceptor.java +++ b/tools/server-spring/src/main/java/org/eclipse/rdf4j/common/webapp/MessageHandlerInterceptor.java @@ -19,7 +19,7 @@ * Interceptor that inserts some commonly used values into the model. The inserted values are: - path, equal to * request.getContextPath() (e.g. /context) - basePath, equal to the fully qualified context path (e.g. * http://www.example.com/context/) - currentYear, equal to the current year - * + * * @author Herko ter Horst */ public class MessageHandlerInterceptor implements HandlerInterceptor { diff --git a/tools/server-spring/src/main/java/org/eclipse/rdf4j/common/webapp/navigation/AbstractNavigationNode.java b/tools/server-spring/src/main/java/org/eclipse/rdf4j/common/webapp/navigation/AbstractNavigationNode.java index c7bfdb563e1..6b93411ba00 100644 --- a/tools/server-spring/src/main/java/org/eclipse/rdf4j/common/webapp/navigation/AbstractNavigationNode.java +++ b/tools/server-spring/src/main/java/org/eclipse/rdf4j/common/webapp/navigation/AbstractNavigationNode.java @@ -9,7 +9,7 @@ /** * Base implementation of the NavigationNode interface. - * + * * @author Herko ter Horst */ public abstract class AbstractNavigationNode implements NavigationNode { diff --git a/tools/server-spring/src/main/java/org/eclipse/rdf4j/common/webapp/navigation/Group.java b/tools/server-spring/src/main/java/org/eclipse/rdf4j/common/webapp/navigation/Group.java index 14b777a4212..6b26444fab7 100644 --- a/tools/server-spring/src/main/java/org/eclipse/rdf4j/common/webapp/navigation/Group.java +++ b/tools/server-spring/src/main/java/org/eclipse/rdf4j/common/webapp/navigation/Group.java @@ -14,7 +14,7 @@ /** * Group represents a logical group of views in a NavigationModel. - * + * * @author Herko ter Horst */ public class Group extends AbstractNavigationNode { @@ -27,7 +27,7 @@ public class Group extends AbstractNavigationNode { /** * Construct a new group with the specified ID. - * + * * @param id the ID of the group */ public Group(String id) { @@ -39,7 +39,7 @@ public Group(String id) { /** * Add a group to this group. The group becomes a sub-group of this group. - * + * * @param group the group to add */ public void addGroup(Group group) { @@ -49,7 +49,7 @@ public void addGroup(Group group) { /** * Get the sub-group with the specified ID. - * + * * @param id the ID of the sub-group * @return the sub-group with the specified ID, or null if this group doesn't contain a sub-group with that ID */ @@ -59,7 +59,7 @@ public Group getGroup(String id) { /** * Get the list of sub-groups - * + * * @return the list of sub-groups */ public List getGroups() { @@ -68,7 +68,7 @@ public List getGroups() { /** * Add a view to this group. - * + * * @param view the view to add */ public void addView(View view) { @@ -83,7 +83,7 @@ public View getView(String viewId) { /** * Get the view with the specified name. - * + * * @param viewName the name of the view (ID+suffix) * @return the view with the specified name, or null if this group doesn't contain a view with that name */ @@ -108,7 +108,7 @@ protected View findViewInternal(String viewName) { /** * Get the list of views. - * + * * @return the list of views */ public List getViews() { diff --git a/tools/server-spring/src/main/java/org/eclipse/rdf4j/common/webapp/navigation/NavigationHandlerInterceptor.java b/tools/server-spring/src/main/java/org/eclipse/rdf4j/common/webapp/navigation/NavigationHandlerInterceptor.java index 057e6123249..c7fdd07407e 100644 --- a/tools/server-spring/src/main/java/org/eclipse/rdf4j/common/webapp/navigation/NavigationHandlerInterceptor.java +++ b/tools/server-spring/src/main/java/org/eclipse/rdf4j/common/webapp/navigation/NavigationHandlerInterceptor.java @@ -16,7 +16,7 @@ /** * Interceptor that inserts the navigation model for the current Spring view into the model. - * + * * @author Herko ter Horst */ public class NavigationHandlerInterceptor implements HandlerInterceptor { diff --git a/tools/server-spring/src/main/java/org/eclipse/rdf4j/common/webapp/navigation/NavigationModel.java b/tools/server-spring/src/main/java/org/eclipse/rdf4j/common/webapp/navigation/NavigationModel.java index 5e0ad0990bb..4f1eb56950e 100644 --- a/tools/server-spring/src/main/java/org/eclipse/rdf4j/common/webapp/navigation/NavigationModel.java +++ b/tools/server-spring/src/main/java/org/eclipse/rdf4j/common/webapp/navigation/NavigationModel.java @@ -14,7 +14,7 @@ /** * NavigationModel represents the navigation structure of a web application. A model consists of groups and views. - * + * * @author Herko ter Horst */ public class NavigationModel extends Group { @@ -66,7 +66,7 @@ public NavigationModel() { /** * Construct a new emtpy NavigationModel with the specified ID. - * + * * @param id the ID of the NavigationModel */ public NavigationModel(String id) { @@ -184,7 +184,7 @@ public String getViewSuffix() { /** * Find the view with the specified name in the NavigationModel. - * + * * @param viewName the name of the view, specified as a /-separated hierarchy of groups, where the part after the * last / is interpreted as the name of the view itself. * @return the view, or null if no view matching the specified name could be found @@ -202,7 +202,7 @@ public View findView(String viewName) { /** * Add another NavigationModel to this one. This is done by adding all groups and view from the other model to this * one. - * + * * @param other the model to add to this one. */ public void addModel(NavigationModel other) { @@ -217,7 +217,7 @@ public void addModel(NavigationModel other) { /** * Set the locations of the navigation model resources to be used in the construction of this model. Calling this * method will cause this NavigationModel to be initialized. - * + * * @param navigationModelLocations a list of resource names */ public void setNavigationModels(List navigationModelLocations) { diff --git a/tools/server-spring/src/main/java/org/eclipse/rdf4j/common/webapp/navigation/NavigationNode.java b/tools/server-spring/src/main/java/org/eclipse/rdf4j/common/webapp/navigation/NavigationNode.java index 9f575f309bf..74a18fff022 100644 --- a/tools/server-spring/src/main/java/org/eclipse/rdf4j/common/webapp/navigation/NavigationNode.java +++ b/tools/server-spring/src/main/java/org/eclipse/rdf4j/common/webapp/navigation/NavigationNode.java @@ -9,63 +9,63 @@ /** * NavigationNode represents a node in a NavigationModel. - * + * * @author Herko ter Horst */ public interface NavigationNode extends Cloneable { /** * Get the ID of the node. - * + * * @return the ID of the node */ public String getId(); /** * Is the node hidden? - * + * * @return true if the node is hidden, false otherwise */ public boolean isHidden(); /** * Set the hidden status of the node. - * + * * @param hidden the new hidden status of the node */ public void setHidden(boolean hidden); /** * Is the node enabled/active? - * + * * @return true if the node is enabled, false otherwise */ public boolean isEnabled(); /** * Set the enabled status of the node. - * + * * @param enabled the new enabled status of the node */ public void setEnabled(boolean enabled); /** * Get the parent node of this node. - * + * * @return the parent node of this node, or null if this node is the root NavigationModel */ public NavigationNode getParent(); /** * Set the parent of this node. - * + * * @param parent the new parent of this node */ public void setParent(NavigationNode parent); /** * Is this node a parent of the specified node? - * + * * @param node the node to check * @return true if this node is a direct or indirect parent of the specified node, false otherwise */ @@ -74,7 +74,7 @@ public interface NavigationNode extends Cloneable { /** * Get the depth of this node in the hierarchy. The root NavigationModel has depth 0, all other nodes have a depth * equal to the depth of their parent + 1. - * + * * @return the depth of the node in the hierarhcy */ public int getDepth(); @@ -110,4 +110,4 @@ public interface NavigationNode extends Cloneable { public String getViewSuffix(); public void setViewSuffix(String suffix); -} \ No newline at end of file +} diff --git a/tools/server-spring/src/main/java/org/eclipse/rdf4j/common/webapp/navigation/NavigationXmlParser.java b/tools/server-spring/src/main/java/org/eclipse/rdf4j/common/webapp/navigation/NavigationXmlParser.java index cabfe14b9ca..334ac5627f8 100644 --- a/tools/server-spring/src/main/java/org/eclipse/rdf4j/common/webapp/navigation/NavigationXmlParser.java +++ b/tools/server-spring/src/main/java/org/eclipse/rdf4j/common/webapp/navigation/NavigationXmlParser.java @@ -22,7 +22,7 @@ /** * XPath-based parser for NavigationModel configuration files. - * + * * @author Herko ter Horst */ public class NavigationXmlParser { diff --git a/tools/server-spring/src/main/java/org/eclipse/rdf4j/common/webapp/navigation/View.java b/tools/server-spring/src/main/java/org/eclipse/rdf4j/common/webapp/navigation/View.java index e8f5e548897..f35d68508c2 100644 --- a/tools/server-spring/src/main/java/org/eclipse/rdf4j/common/webapp/navigation/View.java +++ b/tools/server-spring/src/main/java/org/eclipse/rdf4j/common/webapp/navigation/View.java @@ -9,14 +9,14 @@ /** * View represents a "leaf" in the navigation model, for example a page in a website. - * + * * @author Herko ter Horst */ public class View extends AbstractNavigationNode { /** * Construct a new view with the specified ID. - * + * * @param id the ID of the view */ public View(String id) { diff --git a/tools/server-spring/src/main/java/org/eclipse/rdf4j/common/webapp/navigation/functions/NavigationFunctions.java b/tools/server-spring/src/main/java/org/eclipse/rdf4j/common/webapp/navigation/functions/NavigationFunctions.java index af6035deb26..58e5661779a 100644 --- a/tools/server-spring/src/main/java/org/eclipse/rdf4j/common/webapp/navigation/functions/NavigationFunctions.java +++ b/tools/server-spring/src/main/java/org/eclipse/rdf4j/common/webapp/navigation/functions/NavigationFunctions.java @@ -11,14 +11,14 @@ /** * JSTL functions for navigation. - * + * * @author Herko ter Horst */ public class NavigationFunctions { /** * Is the specified potential parent indeed a parent of the specified node. - * + * * @param potentialParent the potential parent * @param node the node * @return true if the potential parent is part of the hierarchical string of parents for the specified node diff --git a/tools/server-spring/src/main/java/org/eclipse/rdf4j/common/webapp/util/HttpServerUtil.java b/tools/server-spring/src/main/java/org/eclipse/rdf4j/common/webapp/util/HttpServerUtil.java index 59683e001ed..08a73f98e96 100644 --- a/tools/server-spring/src/main/java/org/eclipse/rdf4j/common/webapp/util/HttpServerUtil.java +++ b/tools/server-spring/src/main/java/org/eclipse/rdf4j/common/webapp/util/HttpServerUtil.java @@ -20,7 +20,7 @@ public class HttpServerUtil { /** * Extracts the MIME type from the specified content type string. This method parses the content type string and * returns just the MIME type, ignoring any parameters that are included. - * + * * @param contentType A content type string, e.g. application/xml; charset=utf-8 . * @return The MIME type part of the specified content type string, or null if the specified content type * string was null. @@ -36,7 +36,7 @@ public static String getMIMEType(String contentType) { /** * Selects from a set of MIME types, the MIME type that has the highest quality score when matched with the Accept * headers in the supplied request. - * + * * @param mimeTypes The set of available MIME types. * @param request The request to match the MIME types against. * @return The MIME type that best matches the types that the client finds acceptable, or null in case no @@ -99,7 +99,7 @@ public static String selectPreferredMIMEType(Iterator mimeTypes, HttpSer /** * Checks if the first supplied MIME type is more specific than the second supplied MIME type. - * + * * @param leftMimeTypeElem * @param rightMimeTypeElem * @return true iff leftMimeTypeElem is a more specific MIME type spec than rightMimeTypeElem, false otherwise. @@ -141,7 +141,7 @@ private static String[] splitMIMEType(String mimeTypeString) { /** * Gets the elements of the request header with the specified name. - * + * * @param request The request to get the header from. * @param headerName The name of the header to get the elements of. * @return A List of {@link HeaderElement} objects. @@ -171,7 +171,7 @@ public static List getHeaderElements(HttpServletRequest request, /** * Splits the supplied string into sub parts using the specified splitChar as a separator, ignoring occurrences of * this character inside quoted strings. - * + * * @param s The header string to split into sub parts. * @param splitChar The character to use as separator. * @return A List of Strings. @@ -203,7 +203,7 @@ public static List splitHeaderString(String s, char splitChar) { /** * Tries to match the specified MIME type spec against the list of Accept header elements, returning the applicable * header element if available. - * + * * @param mimeTypeSpec The MIME type to determine the quality for, e.g. "text/plain" or "application/xml; * charset=utf-8". * @param acceptElements A List of {@link HeaderElement} objects. @@ -280,7 +280,7 @@ private static boolean matchesAcceptHeader(HeaderElement mimeTypeElem, HeaderEle * null * * - * + * * @param mimeTypeElem The MIME type element that should be generalized. * @return The generalized MIME type element, or null if it could not be generalized any further. */ @@ -318,7 +318,7 @@ private static HeaderElement generalizeMIMEType(HeaderElement mimeTypeElem) { /** * Gets the trimmed value of a request parameter as a String. - * + * * @return The trimmed value, or null if the parameter does not exist. */ public static String getPostDataParameter(Map formData, String name) { diff --git a/tools/server-spring/src/main/java/org/eclipse/rdf4j/common/webapp/views/SimpleResponseView.java b/tools/server-spring/src/main/java/org/eclipse/rdf4j/common/webapp/views/SimpleResponseView.java index 39269def9e3..4b4ea2fb024 100644 --- a/tools/server-spring/src/main/java/org/eclipse/rdf4j/common/webapp/views/SimpleResponseView.java +++ b/tools/server-spring/src/main/java/org/eclipse/rdf4j/common/webapp/views/SimpleResponseView.java @@ -53,7 +53,7 @@ public void render(Map model, HttpServletRequest request, HttpServletResponse re } response.setStatus(sc.intValue()); - response.setContentType(CONTENT_TYPE); + response.setContentType(getContentType()); if (model.containsKey(CUSTOM_HEADERS_KEY)) { Map customHeaders = (Map) model.get(CUSTOM_HEADERS_KEY); diff --git a/tools/server-spring/src/main/java/org/eclipse/rdf4j/http/server/ClientHTTPException.java b/tools/server-spring/src/main/java/org/eclipse/rdf4j/http/server/ClientHTTPException.java index fad2e8631e8..e1efee88d27 100644 --- a/tools/server-spring/src/main/java/org/eclipse/rdf4j/http/server/ClientHTTPException.java +++ b/tools/server-spring/src/main/java/org/eclipse/rdf4j/http/server/ClientHTTPException.java @@ -13,7 +13,7 @@ * HTTP-related exception indicating that an HTTP client has erred. Status codes for these types of errors are in the * 4xx range. The default status code for constructors without a statusCode parameter is * 400 Bad Request. - * + * * @author Arjohn Kampman */ public class ClientHTTPException extends HTTPException { @@ -45,7 +45,7 @@ public ClientHTTPException(String msg, Throwable t) { /** * Creates a {@link ClientHTTPException} with the specified status code. - * + * * @throws IllegalArgumentException If statusCode is not in the 4xx range. */ public ClientHTTPException(int statusCode) { @@ -54,7 +54,7 @@ public ClientHTTPException(int statusCode) { /** * Creates a {@link ClientHTTPException} with the specified status code. - * + * * @throws IllegalArgumentException If statusCode is not in the 4xx range. */ public ClientHTTPException(int statusCode, String message) { @@ -63,7 +63,7 @@ public ClientHTTPException(int statusCode, String message) { /** * Creates a {@link ClientHTTPException} with the specified status code. - * + * * @throws IllegalArgumentException If statusCode is not in the 4xx range. */ public ClientHTTPException(int statusCode, String message, Throwable t) { @@ -72,7 +72,7 @@ public ClientHTTPException(int statusCode, String message, Throwable t) { /** * Creates a {@link ClientHTTPException} with the specified status code. - * + * * @throws IllegalArgumentException If statusCode is not in the 4xx range. */ public ClientHTTPException(int statusCode, Throwable t) { diff --git a/tools/server-spring/src/main/java/org/eclipse/rdf4j/http/server/HTTPException.java b/tools/server-spring/src/main/java/org/eclipse/rdf4j/http/server/HTTPException.java index 1a954b212f9..01c1515a504 100644 --- a/tools/server-spring/src/main/java/org/eclipse/rdf4j/http/server/HTTPException.java +++ b/tools/server-spring/src/main/java/org/eclipse/rdf4j/http/server/HTTPException.java @@ -9,7 +9,7 @@ /** * HTTP-related exception that includes the relevant HTTP status code. - * + * * @author Arjohn Kampman */ public class HTTPException extends Exception { diff --git a/tools/server-spring/src/main/java/org/eclipse/rdf4j/http/server/ProtocolExceptionResolver.java b/tools/server-spring/src/main/java/org/eclipse/rdf4j/http/server/ProtocolExceptionResolver.java index cee05c361d0..6d5fe98de22 100644 --- a/tools/server-spring/src/main/java/org/eclipse/rdf4j/http/server/ProtocolExceptionResolver.java +++ b/tools/server-spring/src/main/java/org/eclipse/rdf4j/http/server/ProtocolExceptionResolver.java @@ -7,6 +7,7 @@ *******************************************************************************/ package org.eclipse.rdf4j.http.server; +import java.io.StringWriter; import java.util.HashMap; import java.util.Map; @@ -14,6 +15,10 @@ import javax.servlet.http.HttpServletResponse; import org.eclipse.rdf4j.common.webapp.views.SimpleResponseView; +import org.eclipse.rdf4j.exceptions.ValidationException; +import org.eclipse.rdf4j.model.Model; +import org.eclipse.rdf4j.rio.RDFFormat; +import org.eclipse.rdf4j.rio.Rio; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.web.servlet.HandlerExceptionResolver; @@ -21,7 +26,7 @@ /** * Simple resolver for Exceptions: returns the correct response code and message to the client. - * + * * @author Herko ter Horst */ public class ProtocolExceptionResolver implements HandlerExceptionResolver { @@ -33,6 +38,8 @@ public ModelAndView resolveException(HttpServletRequest request, HttpServletResp Exception exception) { logger.debug("ProtocolExceptionResolver.resolveException() called"); + Map model = new HashMap<>(); + int statusCode = HttpServletResponse.SC_INTERNAL_SERVER_ERROR; String errMsg = exception.getMessage(); @@ -49,7 +56,37 @@ public ModelAndView resolveException(HttpServletRequest request, HttpServletResp logger.error("Error while handling request", exception); } - Map model = new HashMap<>(); + int depth = 10; + Throwable temp = exception; + while (!(temp instanceof ValidationException)) { + if (depth-- == 0) { + break; + } + if (temp == null) { + break; + } + temp = temp.getCause(); + } + + if (temp instanceof ValidationException) { + // This is currently just a simple fix that causes the validation report to be printed. + // This should not be the final solution. + Model validationReportModel = ((ValidationException) temp).validationReportAsModel(); + + StringWriter stringWriter = new StringWriter(); + + // We choose NQUADS because we want to support streaming in the future, and because there could be a use for + // different graphs in the future + Rio.write(validationReportModel, stringWriter, RDFFormat.NQUADS); + + statusCode = HttpServletResponse.SC_CONFLICT; + errMsg = stringWriter.toString(); + + Map headers = new HashMap<>(); + headers.put("Content-Type", "application/shacl-validation-report+n-quads"); + model.put(SimpleResponseView.CUSTOM_HEADERS_KEY, headers); + } + model.put(SimpleResponseView.SC_KEY, statusCode); model.put(SimpleResponseView.CONTENT_KEY, errMsg); diff --git a/tools/server-spring/src/main/java/org/eclipse/rdf4j/http/server/ProtocolUtil.java b/tools/server-spring/src/main/java/org/eclipse/rdf4j/http/server/ProtocolUtil.java index 03cb48d5323..0ee6a2f1210 100644 --- a/tools/server-spring/src/main/java/org/eclipse/rdf4j/http/server/ProtocolUtil.java +++ b/tools/server-spring/src/main/java/org/eclipse/rdf4j/http/server/ProtocolUtil.java @@ -33,7 +33,7 @@ /** * Utilities to help with the transition between HTTP requests/responses and values expected by the protocol. - * + * * @author Herko ter Horst * @author Arjohn Kampman */ @@ -182,7 +182,7 @@ public static S getAcceptableService(HttpServletReque /** * Reads the {@link Protocol#TIMEOUT_PARAM_NAME} parameter from the request and (if present) parses it into an * integer value. - * + * * @param request the {@link HttpServletRequest} to read the parameter from * @return the value of the timeout parameter as an integer (representing the timeout time in seconds), or 0 if no * timeout parameter is specified in the request. diff --git a/tools/server-spring/src/main/java/org/eclipse/rdf4j/http/server/ServerHTTPException.java b/tools/server-spring/src/main/java/org/eclipse/rdf4j/http/server/ServerHTTPException.java index 35512505f74..2bd5d7cb540 100644 --- a/tools/server-spring/src/main/java/org/eclipse/rdf4j/http/server/ServerHTTPException.java +++ b/tools/server-spring/src/main/java/org/eclipse/rdf4j/http/server/ServerHTTPException.java @@ -13,7 +13,7 @@ * HTTP-related exception indicating that an error occurred in a server. Status codes for these types of errors are in * the 5xx range. The default status code for constructors without a statusCode parameter is * 500 Internal Server Error. - * + * * @author Arjohn Kampman */ public class ServerHTTPException extends HTTPException { @@ -46,7 +46,7 @@ public ServerHTTPException(String msg, Throwable t) { /** * Creates a {@link ServerHTTPException} with the specified status code. The supplied status code must be in the 5xx * range. - * + * * @throws IllegalArgumentException If statusCode is not in the 5xx range. */ public ServerHTTPException(int statusCode) { @@ -56,7 +56,7 @@ public ServerHTTPException(int statusCode) { /** * Creates a {@link ServerHTTPException} with the specified status code. The supplied status code must be in the 5xx * range. - * + * * @throws IllegalArgumentException If statusCode is not in the 5xx range. */ public ServerHTTPException(int statusCode, String message) { @@ -66,7 +66,7 @@ public ServerHTTPException(int statusCode, String message) { /** * Creates a {@link ServerHTTPException} with the specified status code. The supplied status code must be in the 5xx * range. - * + * * @throws IllegalArgumentException If statusCode is not in the 5xx range. */ public ServerHTTPException(int statusCode, String message, Throwable t) { @@ -76,7 +76,7 @@ public ServerHTTPException(int statusCode, String message, Throwable t) { /** * Creates a {@link ServerHTTPException} with the specified status code. The supplied status code must be in the 5xx * range. - * + * * @throws IllegalArgumentException If statusCode is not in the 5xx range. */ public ServerHTTPException(int statusCode, Throwable t) { diff --git a/tools/server-spring/src/main/java/org/eclipse/rdf4j/http/server/ServerInterceptor.java b/tools/server-spring/src/main/java/org/eclipse/rdf4j/http/server/ServerInterceptor.java index 5cc7eb7fee7..e60cbd0d0f4 100644 --- a/tools/server-spring/src/main/java/org/eclipse/rdf4j/http/server/ServerInterceptor.java +++ b/tools/server-spring/src/main/java/org/eclipse/rdf4j/http/server/ServerInterceptor.java @@ -16,7 +16,7 @@ * Base class for single-use request interceptors. This implementation sets the thread name to something sensible at the * start of the request handling and resets the name at the end. This is useful for logging frameworks that make use of * thread names, such as Log4J. Should not be a singleton bean! Configure as inner bean in openrdf-servlet.xml - * + * * @author Herko ter Horst */ public abstract class ServerInterceptor extends HandlerInterceptorAdapter { @@ -46,7 +46,7 @@ public void afterCompletion(HttpServletRequest request, HttpServletResponse resp /** * Determine the thread name to use. Called before the request is forwarded to a handler. - * + * * @return a name that makes sense based on the request * @throws ServerHTTPException if it was impossible to determine a name due to an internal error */ @@ -55,7 +55,7 @@ public void afterCompletion(HttpServletRequest request, HttpServletResponse resp /** * Set attributes for this request. Called before the request is forwarded to a handler. By default, this method * does nothing. - * + * * @param request the request * @throws ClientHTTPException if it was impossible to set one or more attributes due to a bad request on the part * of the client @@ -67,7 +67,7 @@ protected void setRequestAttributes(HttpServletRequest request) throws ClientHTT /** * Clean up resources used in handling this request. Called after the request is handled and a the view is rendered * (or an exception has occurred). By default, this method does nothing. - * + * * @throws ServerHTTPException if some resources could not be cleaned up because of an internal error */ protected void cleanUpResources() throws ServerHTTPException { diff --git a/tools/server-spring/src/main/java/org/eclipse/rdf4j/http/server/protocol/ProtocolController.java b/tools/server-spring/src/main/java/org/eclipse/rdf4j/http/server/protocol/ProtocolController.java index 1255fe4380b..3ec20d139fd 100644 --- a/tools/server-spring/src/main/java/org/eclipse/rdf4j/http/server/protocol/ProtocolController.java +++ b/tools/server-spring/src/main/java/org/eclipse/rdf4j/http/server/protocol/ProtocolController.java @@ -21,7 +21,7 @@ /** * Handles requests for protocol information. Currently returns the protocol version as plain text. - * + * * @author Herko ter Horst */ public class ProtocolController extends AbstractController { diff --git a/tools/server-spring/src/main/java/org/eclipse/rdf4j/http/server/protocol/ProtocolInterceptor.java b/tools/server-spring/src/main/java/org/eclipse/rdf4j/http/server/protocol/ProtocolInterceptor.java index 4e1430b3506..19bd61d5c18 100644 --- a/tools/server-spring/src/main/java/org/eclipse/rdf4j/http/server/protocol/ProtocolInterceptor.java +++ b/tools/server-spring/src/main/java/org/eclipse/rdf4j/http/server/protocol/ProtocolInterceptor.java @@ -12,7 +12,7 @@ /** * Interceptor for protocol requests. Should not be a singleton bean! Configure as inner bean in openrdf-servlet.xml - * + * * @author Herko ter Horst */ public class ProtocolInterceptor extends ServerInterceptor { diff --git a/tools/server-spring/src/main/java/org/eclipse/rdf4j/http/server/repository/BooleanQueryResultView.java b/tools/server-spring/src/main/java/org/eclipse/rdf4j/http/server/repository/BooleanQueryResultView.java index bf5ef4bd5f7..8e9acea03ab 100644 --- a/tools/server-spring/src/main/java/org/eclipse/rdf4j/http/server/repository/BooleanQueryResultView.java +++ b/tools/server-spring/src/main/java/org/eclipse/rdf4j/http/server/repository/BooleanQueryResultView.java @@ -23,7 +23,7 @@ /** * View used to render boolean query results. Renders results in a format specified using a parameter or Accept header. - * + * * @author Arjohn Kampman */ public class BooleanQueryResultView extends QueryResultView { diff --git a/tools/server-spring/src/main/java/org/eclipse/rdf4j/http/server/repository/GraphQueryResultView.java b/tools/server-spring/src/main/java/org/eclipse/rdf4j/http/server/repository/GraphQueryResultView.java index 48873a68727..fc5a4dd13e8 100644 --- a/tools/server-spring/src/main/java/org/eclipse/rdf4j/http/server/repository/GraphQueryResultView.java +++ b/tools/server-spring/src/main/java/org/eclipse/rdf4j/http/server/repository/GraphQueryResultView.java @@ -32,7 +32,7 @@ /** * View used to render graph query results. Renders the graph as RDF using a serialization specified using a parameter * or Accept header. - * + * * @author Herko ter Horst * @author Arjohn Kampman */ diff --git a/tools/server-spring/src/main/java/org/eclipse/rdf4j/http/server/repository/QueryResultView.java b/tools/server-spring/src/main/java/org/eclipse/rdf4j/http/server/repository/QueryResultView.java index 3c06ef0a649..51fc5a5e627 100644 --- a/tools/server-spring/src/main/java/org/eclipse/rdf4j/http/server/repository/QueryResultView.java +++ b/tools/server-spring/src/main/java/org/eclipse/rdf4j/http/server/repository/QueryResultView.java @@ -24,7 +24,7 @@ /** * Base class for rendering query results. - * + * * @author Herko ter Horst * @author Arjohn Kampman */ diff --git a/tools/server-spring/src/main/java/org/eclipse/rdf4j/http/server/repository/RepositoryConfigRepository.java b/tools/server-spring/src/main/java/org/eclipse/rdf4j/http/server/repository/RepositoryConfigRepository.java index 1da8506b6ae..80904c24152 100644 --- a/tools/server-spring/src/main/java/org/eclipse/rdf4j/http/server/repository/RepositoryConfigRepository.java +++ b/tools/server-spring/src/main/java/org/eclipse/rdf4j/http/server/repository/RepositoryConfigRepository.java @@ -118,9 +118,8 @@ public RepositoryResult getContextIDs() throws RepositoryException { @Override public RepositoryResult getStatements(Resource subj, IRI pred, Value obj, boolean includeInferred, Resource... contexts) throws RepositoryException { - Model model = committed.filter(subj, pred, obj, contexts); - CloseableIteration iter; - iter = new CloseableIteratorIteration<>(model.iterator()); + CloseableIteration iter = new CloseableIteratorIteration<>( + committed.getStatements(subj, pred, obj, contexts).iterator()); return new RepositoryResult<>(iter); } diff --git a/tools/server-spring/src/main/java/org/eclipse/rdf4j/http/server/repository/RepositoryController.java b/tools/server-spring/src/main/java/org/eclipse/rdf4j/http/server/repository/RepositoryController.java index 18d7e7e6e2c..4c1b2f0d8fe 100644 --- a/tools/server-spring/src/main/java/org/eclipse/rdf4j/http/server/repository/RepositoryController.java +++ b/tools/server-spring/src/main/java/org/eclipse/rdf4j/http/server/repository/RepositoryController.java @@ -79,7 +79,7 @@ /** * Handles queries and admin (delete) operations on a repository and renders the results in a format suitable to the * type of operation. - * + * * @author Herko ter Horst */ public class RepositoryController extends AbstractController { @@ -119,8 +119,9 @@ protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpSer } catch (IOException e) { throw new HTTPException(HttpStatus.SC_BAD_REQUEST, "Error reading request message body", e); } - if (queryStr.isEmpty()) + if (queryStr.isEmpty()) { queryStr = null; + } } } else if (METHOD_DELETE.equals(reqMethod)) { String repId = RepositoryInterceptor.getRepositoryID(request); @@ -375,8 +376,9 @@ private Query getQuery(Repository repository, RepositoryConnection repositoryCon } private IRI createURIOrNull(Repository repository, String graphURI) { - if ("null".equals(graphURI)) + if ("null".equals(graphURI)) { return null; + } return repository.getValueFactory().createIRI(graphURI); } diff --git a/tools/server-spring/src/main/java/org/eclipse/rdf4j/http/server/repository/RepositoryInterceptor.java b/tools/server-spring/src/main/java/org/eclipse/rdf4j/http/server/repository/RepositoryInterceptor.java index 234d355021d..f3d892e62f5 100644 --- a/tools/server-spring/src/main/java/org/eclipse/rdf4j/http/server/repository/RepositoryInterceptor.java +++ b/tools/server-spring/src/main/java/org/eclipse/rdf4j/http/server/repository/RepositoryInterceptor.java @@ -30,7 +30,7 @@ /** * Interceptor for repository requests. Should not be a singleton bean! Configure as inner bean in openrdf-servlet.xml - * + * * @author Herko ter Horst * @author Arjohn Kampman */ @@ -126,7 +126,7 @@ public static Repository getRepository(HttpServletRequest request) { /** * Obtain a new {@link RepositoryConnection} with suitable parser/writer configuration for handling the incoming * HTTP request. The caller of this method is responsible for closing the connection. - * + * * @param request the {@link HttpServletRequest} for which a {@link RepositoryConnection} is to be returned * @return a configured {@link RepositoryConnection} */ diff --git a/tools/server-spring/src/main/java/org/eclipse/rdf4j/http/server/repository/RepositoryListController.java b/tools/server-spring/src/main/java/org/eclipse/rdf4j/http/server/repository/RepositoryListController.java index 5fd184f8423..1f76c4ed0bb 100644 --- a/tools/server-spring/src/main/java/org/eclipse/rdf4j/http/server/repository/RepositoryListController.java +++ b/tools/server-spring/src/main/java/org/eclipse/rdf4j/http/server/repository/RepositoryListController.java @@ -32,7 +32,7 @@ /** * Handles requests for the list of repositories available on this server. - * + * * @author Herko ter Horst */ public class RepositoryListController extends AbstractController { diff --git a/tools/server-spring/src/main/java/org/eclipse/rdf4j/http/server/repository/TupleQueryResultView.java b/tools/server-spring/src/main/java/org/eclipse/rdf4j/http/server/repository/TupleQueryResultView.java index b98a3f910bc..0465f84d3bb 100644 --- a/tools/server-spring/src/main/java/org/eclipse/rdf4j/http/server/repository/TupleQueryResultView.java +++ b/tools/server-spring/src/main/java/org/eclipse/rdf4j/http/server/repository/TupleQueryResultView.java @@ -33,7 +33,7 @@ /** * View used to render tuple query results. Renders results in a format specified using a parameter or Accept header. - * + * * @author Herko ter Horst * @author Arjohn Kampman */ @@ -110,4 +110,4 @@ protected void renderInternal(Map model, HttpServletRequest request, HttpServlet } logEndOfRequest(request); } -} \ No newline at end of file +} diff --git a/tools/server-spring/src/main/java/org/eclipse/rdf4j/http/server/repository/config/ConfigController.java b/tools/server-spring/src/main/java/org/eclipse/rdf4j/http/server/repository/config/ConfigController.java index d850fefe6b7..cb2a8da2a8d 100644 --- a/tools/server-spring/src/main/java/org/eclipse/rdf4j/http/server/repository/config/ConfigController.java +++ b/tools/server-spring/src/main/java/org/eclipse/rdf4j/http/server/repository/config/ConfigController.java @@ -39,7 +39,7 @@ /** * Handles requests related to repository configuration. - * + * * @author Jeen Broekstra */ public class ConfigController extends AbstractController { diff --git a/tools/server-spring/src/main/java/org/eclipse/rdf4j/http/server/repository/config/ConfigView.java b/tools/server-spring/src/main/java/org/eclipse/rdf4j/http/server/repository/config/ConfigView.java index 2fc3455a9f0..195cce0010a 100644 --- a/tools/server-spring/src/main/java/org/eclipse/rdf4j/http/server/repository/config/ConfigView.java +++ b/tools/server-spring/src/main/java/org/eclipse/rdf4j/http/server/repository/config/ConfigView.java @@ -27,7 +27,7 @@ /** * View used to export a repository config. Renders the statements as RDF using a serialization specified using a * parameter or Accept header. - * + * * @author Jeen Broekstra */ public class ConfigView implements View { diff --git a/tools/server-spring/src/main/java/org/eclipse/rdf4j/http/server/repository/contexts/ContextsController.java b/tools/server-spring/src/main/java/org/eclipse/rdf4j/http/server/repository/contexts/ContextsController.java index 45b55c43fab..f2cc2b4cec8 100644 --- a/tools/server-spring/src/main/java/org/eclipse/rdf4j/http/server/repository/contexts/ContextsController.java +++ b/tools/server-spring/src/main/java/org/eclipse/rdf4j/http/server/repository/contexts/ContextsController.java @@ -36,7 +36,7 @@ /** * Handles requests for the list of contexts in a repository. - * + * * @author Herko ter Horst */ public class ContextsController extends AbstractController { diff --git a/tools/server-spring/src/main/java/org/eclipse/rdf4j/http/server/repository/graph/GraphController.java b/tools/server-spring/src/main/java/org/eclipse/rdf4j/http/server/repository/graph/GraphController.java index b06a980eea1..d0ca3f00d03 100644 --- a/tools/server-spring/src/main/java/org/eclipse/rdf4j/http/server/repository/graph/GraphController.java +++ b/tools/server-spring/src/main/java/org/eclipse/rdf4j/http/server/repository/graph/GraphController.java @@ -48,7 +48,7 @@ /** * Handles requests for manipulating the named graphs in a repository. - * + * * @author Jeen Broekstra */ public class GraphController extends AbstractController { @@ -122,7 +122,7 @@ private IRI getGraphName(HttpServletRequest request, ValueFactory vf) throws Cli /** * Get all statements and export them as RDF. - * + * * @return a model and view for exporting the statements. */ private ModelAndView getExportStatementsResult(Repository repository, HttpServletRequest request, diff --git a/tools/server-spring/src/main/java/org/eclipse/rdf4j/http/server/repository/namespaces/NamespaceController.java b/tools/server-spring/src/main/java/org/eclipse/rdf4j/http/server/repository/namespaces/NamespaceController.java index 8153f8d0174..82aef4e352c 100644 --- a/tools/server-spring/src/main/java/org/eclipse/rdf4j/http/server/repository/namespaces/NamespaceController.java +++ b/tools/server-spring/src/main/java/org/eclipse/rdf4j/http/server/repository/namespaces/NamespaceController.java @@ -33,7 +33,7 @@ /** * Handles requests for manipulating a specific namespace definition in a repository. - * + * * @author Herko ter Horst * @author Arjohn Kampman */ @@ -63,9 +63,7 @@ protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpSer if (METHOD_GET.equals(reqMethod)) { logger.info("GET namespace for prefix {}", prefix); return getExportNamespaceResult(request, prefix); - } - - else if ("PUT".equals(reqMethod)) { + } else if ("PUT".equals(reqMethod)) { logger.info("PUT prefix {}", prefix); return getUpdateNamespaceResult(request, prefix); } else if ("DELETE".equals(reqMethod)) { diff --git a/tools/server-spring/src/main/java/org/eclipse/rdf4j/http/server/repository/namespaces/NamespacesController.java b/tools/server-spring/src/main/java/org/eclipse/rdf4j/http/server/repository/namespaces/NamespacesController.java index 0950f89a7a1..3c1e5ce4edc 100644 --- a/tools/server-spring/src/main/java/org/eclipse/rdf4j/http/server/repository/namespaces/NamespacesController.java +++ b/tools/server-spring/src/main/java/org/eclipse/rdf4j/http/server/repository/namespaces/NamespacesController.java @@ -42,7 +42,7 @@ /** * Handles requests for the list of namespace definitions for a repository. - * + * * @author Herko ter Horst */ public class NamespacesController extends AbstractController { diff --git a/tools/server-spring/src/main/java/org/eclipse/rdf4j/http/server/repository/size/SizeController.java b/tools/server-spring/src/main/java/org/eclipse/rdf4j/http/server/repository/size/SizeController.java index 0710e77d02f..dd59d943718 100644 --- a/tools/server-spring/src/main/java/org/eclipse/rdf4j/http/server/repository/size/SizeController.java +++ b/tools/server-spring/src/main/java/org/eclipse/rdf4j/http/server/repository/size/SizeController.java @@ -29,7 +29,7 @@ /** * Handles requests for the size of (set of contexts in) a repository. - * + * * @author Herko ter Horst */ public class SizeController extends AbstractController { diff --git a/tools/server-spring/src/main/java/org/eclipse/rdf4j/http/server/repository/statements/ExportStatementsView.java b/tools/server-spring/src/main/java/org/eclipse/rdf4j/http/server/repository/statements/ExportStatementsView.java index af24a659de2..364accb0416 100644 --- a/tools/server-spring/src/main/java/org/eclipse/rdf4j/http/server/repository/statements/ExportStatementsView.java +++ b/tools/server-spring/src/main/java/org/eclipse/rdf4j/http/server/repository/statements/ExportStatementsView.java @@ -32,7 +32,7 @@ /** * View used to export statements. Renders the statements as RDF using a serialization specified using a parameter or * Accept header. - * + * * @author Herko ter Horst */ public class ExportStatementsView implements View { diff --git a/tools/server-spring/src/main/java/org/eclipse/rdf4j/http/server/repository/statements/StatementsController.java b/tools/server-spring/src/main/java/org/eclipse/rdf4j/http/server/repository/statements/StatementsController.java index 0e1a2a83938..804b206bfed 100644 --- a/tools/server-spring/src/main/java/org/eclipse/rdf4j/http/server/repository/statements/StatementsController.java +++ b/tools/server-spring/src/main/java/org/eclipse/rdf4j/http/server/repository/statements/StatementsController.java @@ -76,7 +76,7 @@ /** * Handles requests for manipulating the statements in a repository. - * + * * @author Herko ter Horst * @author Arjohn Kampman */ @@ -145,8 +145,9 @@ private ModelAndView getSparqlUpdateResult(Repository repository, HttpServletReq } catch (IOException e) { throw new ClientHTTPException(SC_BAD_REQUEST, "Error reading request message body", e); } - if (sparqlUpdateString.isEmpty()) + if (sparqlUpdateString.isEmpty()) { sparqlUpdateString = null; + } } else { sparqlUpdateString = request.getParameterValues(Protocol.UPDATE_PARAM_NAME)[0]; } @@ -277,14 +278,15 @@ private ModelAndView getSparqlUpdateResult(Repository repository, HttpServletReq } private IRI createURIOrNull(Repository repository, String graphURI) { - if ("null".equals(graphURI)) + if ("null".equals(graphURI)) { return null; + } return repository.getValueFactory().createIRI(graphURI); } /** * Get all statements and export them as RDF. - * + * * @return a model and view for exporting the statements. */ private ModelAndView getExportStatementsResult(Repository repository, HttpServletRequest request, diff --git a/tools/server-spring/src/main/java/org/eclipse/rdf4j/http/server/repository/transaction/ActiveTransactionRegistry.java b/tools/server-spring/src/main/java/org/eclipse/rdf4j/http/server/repository/transaction/ActiveTransactionRegistry.java index 853d25a93fb..0924f145741 100644 --- a/tools/server-spring/src/main/java/org/eclipse/rdf4j/http/server/repository/transaction/ActiveTransactionRegistry.java +++ b/tools/server-spring/src/main/java/org/eclipse/rdf4j/http/server/repository/transaction/ActiveTransactionRegistry.java @@ -8,7 +8,6 @@ package org.eclipse.rdf4j.http.server.repository.transaction; import java.util.UUID; -import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; @@ -20,12 +19,11 @@ import com.google.common.cache.Cache; import com.google.common.cache.CacheBuilder; import com.google.common.cache.RemovalCause; -import com.google.common.cache.RemovalListener; import com.google.common.cache.RemovalNotification; /** * Registry keeping track of active transactions identified by a {@link UUID}. - * + * * @author Jeen Broekstra */ public enum ActiveTransactionRegistry { @@ -39,7 +37,7 @@ public enum ActiveTransactionRegistry { /** * Configurable system property {@code rdf4j.server.txn.registry.timeout} for specifying the transaction cache * timeout (in seconds). - * + * * @deprecated since 2.3 use {@link Protocol#CACHE_TIMEOUT_PROPERTY} */ @Deprecated @@ -47,7 +45,7 @@ public enum ActiveTransactionRegistry { /** * Default timeout setting for transaction cache entries (in seconds). - * + * * @deprecated since 2.3 use {@link Protocol#DEFAULT_TIMEOUT} */ @Deprecated @@ -186,7 +184,7 @@ public void deregister(Transaction transaction) { /** * Checks if the given transaction entry is still in the secondary cache (resetting its last access time in the * process) and if not reinserts it. - * + * * @param transaction the transaction to check */ private void updateSecondaryCache(final Transaction transaction) { diff --git a/tools/server-spring/src/main/java/org/eclipse/rdf4j/http/server/repository/transaction/TransactionController.java b/tools/server-spring/src/main/java/org/eclipse/rdf4j/http/server/repository/transaction/TransactionController.java index 7862affda97..fde46574ba0 100644 --- a/tools/server-spring/src/main/java/org/eclipse/rdf4j/http/server/repository/transaction/TransactionController.java +++ b/tools/server-spring/src/main/java/org/eclipse/rdf4j/http/server/repository/transaction/TransactionController.java @@ -90,7 +90,7 @@ /** * Handles requests for transaction creation on a repository. - * + * * @author Jeen Broekstra */ public class TransactionController extends AbstractController { @@ -298,7 +298,7 @@ private ModelAndView getSize(Transaction transaction, HttpServletRequest request /** * Get all statements and export them as RDF. - * + * * @return a model and view for exporting the statements. */ private ModelAndView getExportStatementsResult(Transaction transaction, HttpServletRequest request, @@ -393,7 +393,7 @@ private ModelAndView processQuery(Transaction txn, HttpServletRequest request, H model.put(QueryResultView.QUERY_RESULT_KEY, queryResult); model.put(QueryResultView.FACTORY_KEY, factory); model.put(QueryResultView.HEADERS_ONLY, false); // TODO needed for HEAD - // requests. + // requests. return new ModelAndView(view, model); } diff --git a/tools/server-spring/src/main/java/org/eclipse/rdf4j/http/server/repository/transaction/TransactionExportStatementsView.java b/tools/server-spring/src/main/java/org/eclipse/rdf4j/http/server/repository/transaction/TransactionExportStatementsView.java index d0a46b99746..0c65534aab6 100644 --- a/tools/server-spring/src/main/java/org/eclipse/rdf4j/http/server/repository/transaction/TransactionExportStatementsView.java +++ b/tools/server-spring/src/main/java/org/eclipse/rdf4j/http/server/repository/transaction/TransactionExportStatementsView.java @@ -30,7 +30,7 @@ /** * View used to export statements as part of a transaction. Renders the statements as RDF using a serialization * specified using a parameter or Accept header. - * + * * @author Herko ter Horst * @author Jeen Broekstra */ diff --git a/tools/server-spring/src/main/java/org/eclipse/rdf4j/http/server/repository/transaction/TransactionStartController.java b/tools/server-spring/src/main/java/org/eclipse/rdf4j/http/server/repository/transaction/TransactionStartController.java index 14cc7c29df2..ec800daf69d 100644 --- a/tools/server-spring/src/main/java/org/eclipse/rdf4j/http/server/repository/transaction/TransactionStartController.java +++ b/tools/server-spring/src/main/java/org/eclipse/rdf4j/http/server/repository/transaction/TransactionStartController.java @@ -38,7 +38,7 @@ /** * Handles requests for transaction creation on a repository. - * + * * @author Jeen Broekstra */ public class TransactionStartController extends AbstractController { diff --git a/tools/server-spring/src/test/java/org/eclipse/rdf4j/common/webapp/util/HttpServerUtilTest.java b/tools/server-spring/src/test/java/org/eclipse/rdf4j/common/webapp/util/HttpServerUtilTest.java index 6c1be0b0736..944d83938c9 100644 --- a/tools/server-spring/src/test/java/org/eclipse/rdf4j/common/webapp/util/HttpServerUtilTest.java +++ b/tools/server-spring/src/test/java/org/eclipse/rdf4j/common/webapp/util/HttpServerUtilTest.java @@ -471,7 +471,7 @@ public boolean isRequestedSessionIdFromUrl() { /* * (non-Javadoc) - * + * * @see javax.servlet.ServletRequest#getServletContext() */ @Override @@ -482,7 +482,7 @@ public ServletContext getServletContext() { /* * (non-Javadoc) - * + * * @see javax.servlet.ServletRequest#startAsync() */ @Override @@ -493,7 +493,7 @@ public AsyncContext startAsync() throws IllegalStateException { /* * (non-Javadoc) - * + * * @see javax.servlet.ServletRequest#startAsync(javax.servlet.ServletRequest, javax.servlet.ServletResponse) */ @Override @@ -505,7 +505,7 @@ public AsyncContext startAsync(ServletRequest servletRequest, ServletResponse se /* * (non-Javadoc) - * + * * @see javax.servlet.ServletRequest#isAsyncStarted() */ @Override @@ -516,7 +516,7 @@ public boolean isAsyncStarted() { /* * (non-Javadoc) - * + * * @see javax.servlet.ServletRequest#isAsyncSupported() */ @Override @@ -527,7 +527,7 @@ public boolean isAsyncSupported() { /* * (non-Javadoc) - * + * * @see javax.servlet.ServletRequest#getAsyncContext() */ @Override @@ -538,7 +538,7 @@ public AsyncContext getAsyncContext() { /* * (non-Javadoc) - * + * * @see javax.servlet.ServletRequest#getDispatcherType() */ @Override @@ -549,7 +549,7 @@ public DispatcherType getDispatcherType() { /* * (non-Javadoc) - * + * * @see javax.servlet.http.HttpServletRequest#authenticate(javax.servlet.http.HttpServletResponse) */ @Override @@ -560,7 +560,7 @@ public boolean authenticate(HttpServletResponse response) throws IOException, Se /* * (non-Javadoc) - * + * * @see javax.servlet.http.HttpServletRequest#login(java.lang.String, java.lang.String) */ @Override @@ -571,7 +571,7 @@ public void login(String username, String password) throws ServletException { /* * (non-Javadoc) - * + * * @see javax.servlet.http.HttpServletRequest#logout() */ @Override @@ -582,7 +582,7 @@ public void logout() throws ServletException { /* * (non-Javadoc) - * + * * @see javax.servlet.http.HttpServletRequest#getParts() */ @Override @@ -593,7 +593,7 @@ public Collection getParts() throws IOException, ServletException { /* * (non-Javadoc) - * + * * @see javax.servlet.http.HttpServletRequest#getPart(java.lang.String) */ @Override diff --git a/tools/server/pom.xml b/tools/server/pom.xml index 030432d3ece..d0083585e56 100644 --- a/tools/server/pom.xml +++ b/tools/server/pom.xml @@ -4,7 +4,7 @@ org.eclipse.rdf4j rdf4j-tools - 3.1.5-SNAPSHOT + 3.2.2-SNAPSHOT rdf4j-http-server war diff --git a/tools/server/src/test/java/org/eclipse/rdf4j/http/server/ProtocolTest.java b/tools/server/src/test/java/org/eclipse/rdf4j/http/server/ProtocolTest.java index 03209769503..9b8edc97438 100644 --- a/tools/server/src/test/java/org/eclipse/rdf4j/http/server/ProtocolTest.java +++ b/tools/server/src/test/java/org/eclipse/rdf4j/http/server/ProtocolTest.java @@ -368,7 +368,7 @@ public void testUpdateResponse_HEAD() throws Exception { /** * Test for SES-1861 - * + * * @throws Exception */ @Test @@ -399,7 +399,7 @@ public void testSequentialNamespaceUpdates() throws Exception { /** * Test for GitHub issue #262 - * + * * @throws Exception */ @Test @@ -423,7 +423,7 @@ public void testPutEmptyPrefix() throws Exception { /** * Test for SES-1861 - * + * * @throws Exception */ @Test diff --git a/tools/server/src/test/java/org/eclipse/rdf4j/http/server/ShaclValidationReportTest.java b/tools/server/src/test/java/org/eclipse/rdf4j/http/server/ShaclValidationReportTest.java new file mode 100644 index 00000000000..5d216fc8d70 --- /dev/null +++ b/tools/server/src/test/java/org/eclipse/rdf4j/http/server/ShaclValidationReportTest.java @@ -0,0 +1,128 @@ +/******************************************************************************* + * Copyright (c) 2020 Eclipse RDF4J contributors. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Distribution License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ +package org.eclipse.rdf4j.http.server; + +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +import java.io.IOException; +import java.io.StringReader; + +import org.eclipse.rdf4j.exceptions.ValidationException; +import org.eclipse.rdf4j.http.protocol.Protocol; +import org.eclipse.rdf4j.model.ValueFactory; +import org.eclipse.rdf4j.model.impl.SimpleValueFactory; +import org.eclipse.rdf4j.model.vocabulary.RDF; +import org.eclipse.rdf4j.model.vocabulary.RDF4J; +import org.eclipse.rdf4j.model.vocabulary.RDFS; +import org.eclipse.rdf4j.model.vocabulary.SHACL; +import org.eclipse.rdf4j.repository.Repository; +import org.eclipse.rdf4j.repository.RepositoryConnection; +import org.eclipse.rdf4j.repository.http.HTTPRepository; +import org.eclipse.rdf4j.rio.RDFFormat; +import org.junit.AfterClass; +import org.junit.BeforeClass; +import org.junit.Test; + +public class ShaclValidationReportTest { + + private static TestServer server; + + private static ValueFactory vf = SimpleValueFactory.getInstance(); + + @BeforeClass + public static void startServer() throws Exception { + server = new TestServer(); + try { + server.start(); + } catch (Exception e) { + server.stop(); + throw e; + } + } + + @AfterClass + public static void stopServer() throws Exception { + server.stop(); + } + + String shacl = "@base .\n" + + "@prefix ex: .\n" + + "@prefix owl: .\n" + + "@prefix rdf: .\n" + + "@prefix rdfs: .\n" + + "@prefix sh: .\n" + + "@prefix xsd: .\n" + + "\n" + + "ex:PersonShape\n" + + "\ta sh:NodeShape ;\n" + + "\tsh:targetClass rdfs:Resource ;\n" + + "\tsh:property ex:PersonShapeProperty .\n" + + "\n" + + "\n" + + "ex:PersonShapeProperty\n" + + " sh:path rdfs:label ;\n" + + " sh:minCount 1 ."; + + @Test + public void testSparqlUpdate() throws IOException { + + Repository systemRepo = new HTTPRepository( + Protocol.getRepositoryLocation(TestServer.SERVER_URL, TestServer.TEST_SHACL_REPO_ID)); + try (RepositoryConnection connection = systemRepo.getConnection()) { + connection.begin(); + connection.add(new StringReader(shacl), "", RDFFormat.TURTLE, RDF4J.SHACL_SHAPE_GRAPH); + connection.commit(); + + try { + connection.begin(); + connection.prepareUpdate("INSERT DATA {[] a rdfs:Resource}").execute(); + connection.commit(); + fail(); + } catch (Throwable e) { + assertExceptionIsShaclReport(e); + } + } + + } + + private void assertExceptionIsShaclReport(Throwable e) { + ValidationException remoteShaclSailValidationException = null; + if (e instanceof ValidationException) { + remoteShaclSailValidationException = (ValidationException) e; + } else if (e.getCause() instanceof ValidationException) { + remoteShaclSailValidationException = (ValidationException) e.getCause(); + } + + assert remoteShaclSailValidationException != null; + assertTrue(remoteShaclSailValidationException.validationReportAsModel().contains(null, SHACL.CONFORMS, null)); + } + + @Test + public void testAddingData() throws IOException { + + Repository systemRepo = new HTTPRepository( + Protocol.getRepositoryLocation(TestServer.SERVER_URL, TestServer.TEST_SHACL_REPO_ID)); + try (RepositoryConnection connection = systemRepo.getConnection()) { + connection.begin(); + connection.add(new StringReader(shacl), "", RDFFormat.TURTLE, RDF4J.SHACL_SHAPE_GRAPH); + connection.commit(); + + try { + connection.begin(); + connection.add(vf.createBNode(), RDF.TYPE, RDFS.RESOURCE); + connection.commit(); + fail(); + } catch (Exception e) { + assertExceptionIsShaclReport(e); + } + } + + } + +} diff --git a/tools/server/src/test/java/org/eclipse/rdf4j/http/server/TestServer.java b/tools/server/src/test/java/org/eclipse/rdf4j/http/server/TestServer.java index 298e7d3e256..b189ea57a85 100644 --- a/tools/server/src/test/java/org/eclipse/rdf4j/http/server/TestServer.java +++ b/tools/server/src/test/java/org/eclipse/rdf4j/http/server/TestServer.java @@ -22,8 +22,9 @@ import org.eclipse.rdf4j.repository.http.HTTPRepository; import org.eclipse.rdf4j.repository.manager.SystemRepository; import org.eclipse.rdf4j.repository.sail.config.SailRepositoryConfig; -import org.eclipse.rdf4j.sail.inferencer.fc.config.ForwardChainingRDFSInferencerConfig; +import org.eclipse.rdf4j.sail.inferencer.fc.config.SchemaCachingRDFSInferencerConfig; import org.eclipse.rdf4j.sail.memory.config.MemoryStoreConfig; +import org.eclipse.rdf4j.sail.shacl.config.ShaclSailConfig; /** * @author Herko ter Horst @@ -34,13 +35,14 @@ public class TestServer { private static final int PORT = 18080; - private static final String TEST_REPO_ID = "Test"; + public static final String TEST_REPO_ID = "Test"; - private static final String TEST_INFERENCE_REPO_ID = "Test-RDFS"; + public static final String TEST_INFERENCE_REPO_ID = "Test-RDFS"; + public static final String TEST_SHACL_REPO_ID = "Test-SHACL"; private static final String RDF4J_CONTEXT = "/rdf4j"; - private static final String SERVER_URL = "http://" + HOST + ":" + PORT + RDF4J_CONTEXT; + public static final String SERVER_URL = "http://" + HOST + ":" + PORT + RDF4J_CONTEXT; public static String REPOSITORY_URL = Protocol.getRepositoryLocation(SERVER_URL, TEST_REPO_ID); @@ -96,11 +98,20 @@ private void createTestRepositories() throws RepositoryException, RepositoryConf RepositoryConfigUtil.updateRepositoryConfigs(systemRep, repConfig); // create an inferencing memory store - ForwardChainingRDFSInferencerConfig inferMemStoreConfig = new ForwardChainingRDFSInferencerConfig( + SchemaCachingRDFSInferencerConfig inferMemStoreConfig = new SchemaCachingRDFSInferencerConfig( new MemoryStoreConfig()); sailRepConfig = new SailRepositoryConfig(inferMemStoreConfig); repConfig = new RepositoryConfig(TEST_INFERENCE_REPO_ID, sailRepConfig); RepositoryConfigUtil.updateRepositoryConfigs(systemRep, repConfig); + + // create memory store with shacl support + ShaclSailConfig shaclConfig = new ShaclSailConfig(new MemoryStoreConfig()); + sailRepConfig = new SailRepositoryConfig(shaclConfig); + repConfig = new RepositoryConfig(TEST_SHACL_REPO_ID, sailRepConfig); + + RepositoryConfigUtil.updateRepositoryConfigs(systemRep, repConfig); + } + } diff --git a/tools/workbench/pom.xml b/tools/workbench/pom.xml index c61dd937e11..c5d0ee59d8a 100644 --- a/tools/workbench/pom.xml +++ b/tools/workbench/pom.xml @@ -4,7 +4,7 @@ org.eclipse.rdf4j rdf4j-tools - 3.1.5-SNAPSHOT + 3.2.2-SNAPSHOT rdf4j-http-workbench war diff --git a/tools/workbench/src/main/java/org/eclipse/rdf4j/workbench/base/AbstractRepositoryServlet.java b/tools/workbench/src/main/java/org/eclipse/rdf4j/workbench/base/AbstractRepositoryServlet.java index 92028bc79d9..e0112cb903a 100644 --- a/tools/workbench/src/main/java/org/eclipse/rdf4j/workbench/base/AbstractRepositoryServlet.java +++ b/tools/workbench/src/main/java/org/eclipse/rdf4j/workbench/base/AbstractRepositoryServlet.java @@ -68,12 +68,14 @@ public void setRepository(Repository repository) { public void init(ServletConfig config) throws ServletException { super.init(config); if (repository == null) { - if (config.getInitParameter(REPOSITORY_PARAM) != null) + if (config.getInitParameter(REPOSITORY_PARAM) != null) { setRepository((Repository) lookup(config, REPOSITORY_PARAM)); + } } if (manager == null) { - if (config.getInitParameter(MANAGER_PARAM) == null) + if (config.getInitParameter(MANAGER_PARAM) == null) { throw new MissingInitParameterException(MANAGER_PARAM); + } manager = (RepositoryManager) lookup(config, MANAGER_PARAM); } if (info == null) { diff --git a/tools/workbench/src/main/java/org/eclipse/rdf4j/workbench/base/AbstractServlet.java b/tools/workbench/src/main/java/org/eclipse/rdf4j/workbench/base/AbstractServlet.java index 66a1ab22a17..044d612b28e 100644 --- a/tools/workbench/src/main/java/org/eclipse/rdf4j/workbench/base/AbstractServlet.java +++ b/tools/workbench/src/main/java/org/eclipse/rdf4j/workbench/base/AbstractServlet.java @@ -66,6 +66,7 @@ public abstract class AbstractServlet implements Servlet { protected static final String APPLICATION_SPARQL_RESULTS_XML = "application/sparql-results+xml"; protected static final String TEXT_HTML = "text/html"; + protected static final String TEXT_PLAIN = "text/plain"; protected static final String USER_AGENT = "User-Agent"; @@ -195,7 +196,7 @@ protected QueryResultWriter getResultWriter(final HttpServletRequest req, final /** * Gets a {@link TupleResultBuilder} based on the Accept header, and sets the result content type to the best * available match for that, returning a builder that can be used to write out the results. - * + * * @param req the current HTTP request * @param resp the current HTTP response * @param outputStream TODO diff --git a/tools/workbench/src/main/java/org/eclipse/rdf4j/workbench/base/TupleServlet.java b/tools/workbench/src/main/java/org/eclipse/rdf4j/workbench/base/TupleServlet.java index 51f8d117d6c..f27e191971c 100644 --- a/tools/workbench/src/main/java/org/eclipse/rdf4j/workbench/base/TupleServlet.java +++ b/tools/workbench/src/main/java/org/eclipse/rdf4j/workbench/base/TupleServlet.java @@ -57,4 +57,4 @@ protected void service(WorkbenchRequest req, HttpServletResponse resp, TupleResu protected void service(TupleResultBuilder builder, RepositoryConnection con) throws Exception { } -} \ No newline at end of file +} diff --git a/tools/workbench/src/main/java/org/eclipse/rdf4j/workbench/commands/AddServlet.java b/tools/workbench/src/main/java/org/eclipse/rdf4j/workbench/commands/AddServlet.java index 30fd7ec0d93..6048da4709c 100644 --- a/tools/workbench/src/main/java/org/eclipse/rdf4j/workbench/commands/AddServlet.java +++ b/tools/workbench/src/main/java/org/eclipse/rdf4j/workbench/commands/AddServlet.java @@ -129,4 +129,4 @@ public void service(TupleResultBuilder builder, String xslPath) builder.end(); } -} \ No newline at end of file +} diff --git a/tools/workbench/src/main/java/org/eclipse/rdf4j/workbench/commands/ClearServlet.java b/tools/workbench/src/main/java/org/eclipse/rdf4j/workbench/commands/ClearServlet.java index 91b02b02a2c..49cb2c088bf 100644 --- a/tools/workbench/src/main/java/org/eclipse/rdf4j/workbench/commands/ClearServlet.java +++ b/tools/workbench/src/main/java/org/eclipse/rdf4j/workbench/commands/ClearServlet.java @@ -61,4 +61,4 @@ public void service(TupleResultBuilder builder, String xslPath) builder.end(); } -} \ No newline at end of file +} diff --git a/tools/workbench/src/main/java/org/eclipse/rdf4j/workbench/commands/ContextsServlet.java b/tools/workbench/src/main/java/org/eclipse/rdf4j/workbench/commands/ContextsServlet.java index 2c14a9f7d53..886037dc720 100644 --- a/tools/workbench/src/main/java/org/eclipse/rdf4j/workbench/commands/ContextsServlet.java +++ b/tools/workbench/src/main/java/org/eclipse/rdf4j/workbench/commands/ContextsServlet.java @@ -29,4 +29,4 @@ protected void service(TupleResultBuilder builder, RepositoryConnection con) } } -} \ No newline at end of file +} diff --git a/tools/workbench/src/main/java/org/eclipse/rdf4j/workbench/commands/CreateServlet.java b/tools/workbench/src/main/java/org/eclipse/rdf4j/workbench/commands/CreateServlet.java index ac3d6a6ff73..6e3be34b6a7 100644 --- a/tools/workbench/src/main/java/org/eclipse/rdf4j/workbench/commands/CreateServlet.java +++ b/tools/workbench/src/main/java/org/eclipse/rdf4j/workbench/commands/CreateServlet.java @@ -64,7 +64,7 @@ protected void doPost(final WorkbenchRequest req, final HttpServletResponse resp /** * GET requests to this servlet come from the Workbench side bar or from create.xsl form submissions. - * + * * @throws RepositoryException * @throws QueryResultHandlerException */ @@ -113,7 +113,7 @@ RepositoryConfig updateRepositoryConfig(final String configString) throws IOExce rdfParser.setRDFHandler(new StatementCollector(graph)); rdfParser.parse(new StringReader(configString), RepositoryConfigSchema.NAMESPACE); - Resource res = Models.subject(graph.filter(null, RDF.TYPE, RepositoryConfigSchema.REPOSITORY)) + Resource res = Models.subject(graph.getStatements(null, RDF.TYPE, RepositoryConfigSchema.REPOSITORY)) .orElseThrow(() -> new RepositoryException("could not find instance of Repository class in config")); final RepositoryConfig repConfig = RepositoryConfig.create(graph, res); repConfig.validate(); diff --git a/tools/workbench/src/main/java/org/eclipse/rdf4j/workbench/commands/ExploreServlet.java b/tools/workbench/src/main/java/org/eclipse/rdf4j/workbench/commands/ExploreServlet.java index a542c4805b6..4e67bf7645c 100644 --- a/tools/workbench/src/main/java/org/eclipse/rdf4j/workbench/commands/ExploreServlet.java +++ b/tools/workbench/src/main/java/org/eclipse/rdf4j/workbench/commands/ExploreServlet.java @@ -86,7 +86,7 @@ protected void service(final WorkbenchRequest req, final HttpServletResponse res /** * Query the repository for all instances of the given value, optionally writing the results into the HTTP response. - * + * * @param con the connection to the repository * @param builder used for writing to the HTTP response * @param value the value to query the repository for @@ -131,7 +131,7 @@ protected ResultCursor processResource(final RepositoryConnection con, final Tup *
  • export(*, null, null, object, null)
  • *
  • export(*, null, null, null, context)
  • * - * + * * @param con the connection to the repository * @param builder used for writing to the HTTP response * @param cursor used for keeping track of our location in the result set @@ -159,7 +159,7 @@ private void export(RepositoryConnection con, TupleResultBuilder builder, Result /** * Gets whether this is the first time the result quad has been seen. - * + * * @param patternPredicate the predicate asked for, or null if another quad element was asked for * @param patternObject the object asked for, or null if another quad element was asked for * @param result the result statement to determine if we've already seen @@ -191,7 +191,7 @@ private boolean isFirstTimeSeen(Statement result, IRI patternPredicate, Value pa /** * Class for keeping track of location within the result set, relative to offset and limit. - * + * * @author Dale Visser */ protected class ResultCursor { @@ -220,7 +220,7 @@ public ResultCursor(final int offset, final int limit, final boolean render) { /** * Gets the total number of results. Only meant to be called after advance() has been called for all results in * the set. - * + * * @return the number of times advance() has been called */ public int getTotalResultCount() { @@ -230,7 +230,7 @@ public int getTotalResultCount() { /** * Gets the number of results that were actually rendered. Only meant to be called after advance() has been * called for all results in the set. - * + * * @return the number of times advance() has been called when this.mayRender() evaluated to true */ public int getRenderedResultCount() { @@ -258,4 +258,4 @@ public void advance() { } } } -} \ No newline at end of file +} diff --git a/tools/workbench/src/main/java/org/eclipse/rdf4j/workbench/commands/QueryServlet.java b/tools/workbench/src/main/java/org/eclipse/rdf4j/workbench/commands/QueryServlet.java index c1200fcf0e3..7809c5fef58 100644 --- a/tools/workbench/src/main/java/org/eclipse/rdf4j/workbench/commands/QueryServlet.java +++ b/tools/workbench/src/main/java/org/eclipse/rdf4j/workbench/commands/QueryServlet.java @@ -81,11 +81,11 @@ public class QueryServlet extends TransformationServlet { // Poor Man's Cache: At the very least, garbage collection can clean up keys // followed by values whenever the JVM faces memory pressure. - private static Map queryCache = Collections.synchronizedMap(new WeakHashMap()); + private static Map queryCache = Collections.synchronizedMap(new WeakHashMap<>()); /** * For testing purposes only. - * + * * @param testQueryCache cache to use instead of the production cache instance */ protected static void substituteQueryCache(Map testQueryCache) { @@ -112,7 +112,7 @@ public String[] getCookieNames() { /** * Initialize this instance of the servlet. - * + * * @param config configuration passed in by the application container */ @Override @@ -151,7 +151,7 @@ public final void service(final HttpServletRequest req, final HttpServletRespons *

    * Note: This is a separate method for testing purposes. *

    - * + * * @param queryText the text received as the value for the parameter 'query' */ protected boolean shouldWriteQueryCookie(String queryText) { @@ -397,4 +397,4 @@ private boolean canReadSavedQuery(WorkbenchRequest req) throws BadRequestExcepti } } -} \ No newline at end of file +} diff --git a/tools/workbench/src/main/java/org/eclipse/rdf4j/workbench/commands/RemoveServlet.java b/tools/workbench/src/main/java/org/eclipse/rdf4j/workbench/commands/RemoveServlet.java index d3fc4daea3b..ae5874b348a 100644 --- a/tools/workbench/src/main/java/org/eclipse/rdf4j/workbench/commands/RemoveServlet.java +++ b/tools/workbench/src/main/java/org/eclipse/rdf4j/workbench/commands/RemoveServlet.java @@ -88,4 +88,4 @@ public void service(TupleResultBuilder builder, String xslPath) builder.end(); } -} \ No newline at end of file +} diff --git a/tools/workbench/src/main/java/org/eclipse/rdf4j/workbench/commands/RepositoriesServlet.java b/tools/workbench/src/main/java/org/eclipse/rdf4j/workbench/commands/RepositoriesServlet.java index 242d4083ffe..3f7dad6be09 100644 --- a/tools/workbench/src/main/java/org/eclipse/rdf4j/workbench/commands/RepositoriesServlet.java +++ b/tools/workbench/src/main/java/org/eclipse/rdf4j/workbench/commands/RepositoriesServlet.java @@ -29,4 +29,4 @@ public void service(TupleResultBuilder builder, String xslPath) } builder.end(); } -} \ No newline at end of file +} diff --git a/tools/workbench/src/main/java/org/eclipse/rdf4j/workbench/commands/SavedQueriesServlet.java b/tools/workbench/src/main/java/org/eclipse/rdf4j/workbench/commands/SavedQueriesServlet.java index 3e73e68e48c..54ac1c41a5a 100644 --- a/tools/workbench/src/main/java/org/eclipse/rdf4j/workbench/commands/SavedQueriesServlet.java +++ b/tools/workbench/src/main/java/org/eclipse/rdf4j/workbench/commands/SavedQueriesServlet.java @@ -27,7 +27,7 @@ /** * Servlet that provides a page to access saved queries. - * + * * @author Dale Visser */ public class SavedQueriesServlet extends TransformationServlet { @@ -96,4 +96,4 @@ private void getSavedQueries(final WorkbenchRequest req, final TupleResultBuilde } storage.selectSavedQueries(repo, user, builder); } -} \ No newline at end of file +} diff --git a/tools/workbench/src/main/java/org/eclipse/rdf4j/workbench/commands/TypesServlet.java b/tools/workbench/src/main/java/org/eclipse/rdf4j/workbench/commands/TypesServlet.java index 7300289b4f1..7a01d2f5ed2 100644 --- a/tools/workbench/src/main/java/org/eclipse/rdf4j/workbench/commands/TypesServlet.java +++ b/tools/workbench/src/main/java/org/eclipse/rdf4j/workbench/commands/TypesServlet.java @@ -33,4 +33,4 @@ protected void service(TupleResultBuilder builder, RepositoryConnection con) thr } } -} \ No newline at end of file +} diff --git a/tools/workbench/src/main/java/org/eclipse/rdf4j/workbench/commands/UpdateServlet.java b/tools/workbench/src/main/java/org/eclipse/rdf4j/workbench/commands/UpdateServlet.java index 6ae0bb199ad..9249af108be 100644 --- a/tools/workbench/src/main/java/org/eclipse/rdf4j/workbench/commands/UpdateServlet.java +++ b/tools/workbench/src/main/java/org/eclipse/rdf4j/workbench/commands/UpdateServlet.java @@ -15,7 +15,6 @@ import org.eclipse.rdf4j.query.MalformedQueryException; import org.eclipse.rdf4j.query.QueryLanguage; import org.eclipse.rdf4j.query.QueryResultHandlerException; -import org.eclipse.rdf4j.query.Update; import org.eclipse.rdf4j.query.UpdateExecutionException; import org.eclipse.rdf4j.repository.RepositoryConnection; import org.eclipse.rdf4j.repository.RepositoryException; diff --git a/tools/workbench/src/main/java/org/eclipse/rdf4j/workbench/proxy/CacheFilter.java b/tools/workbench/src/main/java/org/eclipse/rdf4j/workbench/proxy/CacheFilter.java index c637b407c08..f1283cc3e8d 100644 --- a/tools/workbench/src/main/java/org/eclipse/rdf4j/workbench/proxy/CacheFilter.java +++ b/tools/workbench/src/main/java/org/eclipse/rdf4j/workbench/proxy/CacheFilter.java @@ -22,7 +22,7 @@ /** * Resource cache expiry filter for Tomcat 6, based on code authored by Saket Kumar. - * + * * @see Enable Caching in Tomcat 6 * @author Dale Visser */ @@ -37,7 +37,7 @@ public class CacheFilter implements Filter { /** * Maximum allowed expiry lifetime in seconds, set to one year according to the advice in RFC 2616. - * + * * @see RFC 2616: HTTP/1.1 */ public final static long MAX_EXPIRY = (365 * 24 + 6) * 60 * 60; @@ -65,7 +65,7 @@ public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) * Parse the Cache-Control configuration parameter as a long integer, and set the filter expiry value, modulo the * minimum and maximum expiry constraints. If the configuration parameter is not present, or not a valid long * integer value, then no Cache-Control headers will be applied by the filter. - * + * * @see #MIN_EXPIRY * @see #MAX_EXPIRY */ @@ -86,4 +86,4 @@ public void init(FilterConfig config) throws ServletException { public void destroy() { expiry = null; } -} \ No newline at end of file +} diff --git a/tools/workbench/src/main/java/org/eclipse/rdf4j/workbench/proxy/CookieCacheControlFilter.java b/tools/workbench/src/main/java/org/eclipse/rdf4j/workbench/proxy/CookieCacheControlFilter.java index dd84b234daa..245995f6e6d 100644 --- a/tools/workbench/src/main/java/org/eclipse/rdf4j/workbench/proxy/CookieCacheControlFilter.java +++ b/tools/workbench/src/main/java/org/eclipse/rdf4j/workbench/proxy/CookieCacheControlFilter.java @@ -26,7 +26,7 @@ /** * Browsers do not expire cache if Cookies have changed. Even if "Vary: Cookie" header is set. This filter intercepts * the Last-Modified and If-Modified-Since headers to include modification of browser cookies. - * + * * @author James Leigh */ public class CookieCacheControlFilter implements Filter { diff --git a/tools/workbench/src/main/java/org/eclipse/rdf4j/workbench/proxy/CookieHandler.java b/tools/workbench/src/main/java/org/eclipse/rdf4j/workbench/proxy/CookieHandler.java index 87b2d20327f..43080b9402c 100644 --- a/tools/workbench/src/main/java/org/eclipse/rdf4j/workbench/proxy/CookieHandler.java +++ b/tools/workbench/src/main/java/org/eclipse/rdf4j/workbench/proxy/CookieHandler.java @@ -82,4 +82,4 @@ protected void addNewCookie(final HttpServletRequest req, final HttpServletRespo public String getMaxAge() { return maxAge; } -} \ No newline at end of file +} diff --git a/tools/workbench/src/main/java/org/eclipse/rdf4j/workbench/proxy/ProxyRepositoryServlet.java b/tools/workbench/src/main/java/org/eclipse/rdf4j/workbench/proxy/ProxyRepositoryServlet.java index 857936e172c..a7c663c0533 100644 --- a/tools/workbench/src/main/java/org/eclipse/rdf4j/workbench/proxy/ProxyRepositoryServlet.java +++ b/tools/workbench/src/main/java/org/eclipse/rdf4j/workbench/proxy/ProxyRepositoryServlet.java @@ -41,8 +41,9 @@ public class ProxyRepositoryServlet extends AbstractRepositoryServlet { public void init(ServletConfig config) throws ServletException { super.init(config); lastModified = System.currentTimeMillis(); - if (config.getInitParameter(DEFAULT_PATH_PARAM) == null) + if (config.getInitParameter(DEFAULT_PATH_PARAM) == null) { throw new MissingInitParameterException(DEFAULT_PATH_PARAM); + } Enumeration names = config.getInitParameterNames(); while (names.hasMoreElements()) { String path = names.nextElement(); @@ -87,8 +88,9 @@ public void service(HttpServletRequest req, HttpServletResponse resp) throws Ser resp.sendRedirect(req.getRequestURI() + defaultPath.substring(1)); } else { RepositoryServlet servlet = servlets.get(pathInfo); - if (servlet == null) + if (servlet == null) { throw new BadRequestException("Unconfigured path: " + pathInfo); + } DynamicHttpRequest hreq = new DynamicHttpRequest(req); hreq.setServletPath(hreq.getServletPath() + hreq.getPathInfo()); hreq.setPathInfo(null); @@ -105,8 +107,9 @@ public void service(HttpServletRequest req, HttpServletResponse resp) throws Ser } private boolean isCachable(HttpServletRequest req) { - if (!"GET".equals(req.getMethod())) + if (!"GET".equals(req.getMethod())) { return false; + } // MSIE does not cache different url parameters separately return req.getRequestURL().toString().indexOf(';') < 0; } diff --git a/tools/workbench/src/main/java/org/eclipse/rdf4j/workbench/proxy/ServerValidator.java b/tools/workbench/src/main/java/org/eclipse/rdf4j/workbench/proxy/ServerValidator.java index 35745f14ec3..d87638d0dbc 100644 --- a/tools/workbench/src/main/java/org/eclipse/rdf4j/workbench/proxy/ServerValidator.java +++ b/tools/workbench/src/main/java/org/eclipse/rdf4j/workbench/proxy/ServerValidator.java @@ -51,7 +51,7 @@ private boolean isDirectory(final String server) { /** * Returns whether the given server can be connected to. - * + * * @param server the server path * @param password the optional password * @param user the optional username @@ -72,7 +72,7 @@ protected boolean isValidServer(final String server) { /** * Returns whether the server prefix is in the list of acceptable prefixes, as given by the space-separated * configuration parameter value for 'accepted-server-prefixes'. - * + * * @param server the server for which to check the prefix * @return whether the server prefix is in the list of acceptable prefixes */ @@ -114,4 +114,4 @@ private boolean canConnect(final String server) { private File asLocalFile(final URL rdf) throws UnsupportedEncodingException { return new File(URLDecoder.decode(rdf.getFile(), "UTF-8")); } -} \ No newline at end of file +} diff --git a/tools/workbench/src/main/java/org/eclipse/rdf4j/workbench/proxy/WorkbenchGateway.java b/tools/workbench/src/main/java/org/eclipse/rdf4j/workbench/proxy/WorkbenchGateway.java index d186067d79b..c7586da208b 100644 --- a/tools/workbench/src/main/java/org/eclipse/rdf4j/workbench/proxy/WorkbenchGateway.java +++ b/tools/workbench/src/main/java/org/eclipse/rdf4j/workbench/proxy/WorkbenchGateway.java @@ -74,7 +74,7 @@ public String getChangeServerPath() { /** * Returns the value of the default-server configuration variable. Often, this is simply a relative path on the same * HTTP server. - * + * * @return the path to the default Sesame server instance */ public String getDefaultServerPath() { @@ -83,7 +83,7 @@ public String getDefaultServerPath() { /** * Whether the server path is fixed, which is when the change-server-path configuration value is not set. - * + * * @return true, if the change-server-path configuration variable is not set, meaning that changing the server is * blocked */ @@ -125,7 +125,7 @@ private void resetCache() { /** * Handles requests to the "change server" page. - * + * * @param req the servlet request object * @param resp the servlet response object * @throws IOException if an issue occurs writing to the response @@ -191,7 +191,7 @@ private String getOptionalParameter(final HttpServletRequest req, final String n /** * Returns the user requested server, if valid, or the default server. - * + * * @param req the request * @param resp the response * @return the user's requested server, if valid, or the default server @@ -213,7 +213,7 @@ private String findServer(final HttpServletRequest req, final HttpServletRespons /** * Returns a WorkbenchServlet instance allocated for the requested server. - * + * * @param req the current request * @param resp the current response * @return a WorkbenchServlet instance allocated for the requested server @@ -251,7 +251,7 @@ private WorkbenchServlet findWorkbenchServlet(final HttpServletRequest req, fina /** * Returns the full URL to the default server on the same server as the given request. - * + * * @param req the request to find the default server relative to * @return the full URL to the default server on the same server as the given request */ @@ -268,7 +268,7 @@ private String getDefaultServer(final HttpServletRequest req) { /** * Returns the full path for the given request. - * + * * @param req the request for which the path is sought * @return the full path for the given request */ @@ -290,4 +290,4 @@ private String getTransformationUrl(final HttpServletRequest req) { final String contextPath = req.getContextPath(); return contextPath + config.getInitParameter(TRANSFORMATIONS); } -} \ No newline at end of file +} diff --git a/tools/workbench/src/main/java/org/eclipse/rdf4j/workbench/proxy/WorkbenchServlet.java b/tools/workbench/src/main/java/org/eclipse/rdf4j/workbench/proxy/WorkbenchServlet.java index e8304e50736..7d5645d15e9 100644 --- a/tools/workbench/src/main/java/org/eclipse/rdf4j/workbench/proxy/WorkbenchServlet.java +++ b/tools/workbench/src/main/java/org/eclipse/rdf4j/workbench/proxy/WorkbenchServlet.java @@ -9,6 +9,7 @@ import java.io.File; import java.io.IOException; +import java.io.PrintWriter; import java.io.UnsupportedEncodingException; import java.net.MalformedURLException; import java.net.URL; @@ -23,7 +24,9 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import org.eclipse.rdf4j.exceptions.ValidationException; import org.eclipse.rdf4j.http.protocol.UnauthorizedException; +import org.eclipse.rdf4j.model.Model; import org.eclipse.rdf4j.query.QueryResultHandlerException; import org.eclipse.rdf4j.repository.Repository; import org.eclipse.rdf4j.repository.RepositoryException; @@ -31,6 +34,10 @@ import org.eclipse.rdf4j.repository.manager.LocalRepositoryManager; import org.eclipse.rdf4j.repository.manager.RemoteRepositoryManager; import org.eclipse.rdf4j.repository.manager.RepositoryManager; +import org.eclipse.rdf4j.rio.RDFFormat; +import org.eclipse.rdf4j.rio.Rio; +import org.eclipse.rdf4j.rio.WriterConfig; +import org.eclipse.rdf4j.rio.helpers.BasicWriterSettings; import org.eclipse.rdf4j.workbench.base.AbstractServlet; import org.eclipse.rdf4j.workbench.exceptions.BadRequestException; import org.eclipse.rdf4j.workbench.exceptions.MissingInitParameterException; @@ -127,7 +134,27 @@ private void handleRequest(final HttpServletRequest req, final HttpServletRespon } catch (UnauthorizedException e) { handleUnauthorizedException(req, resp); } catch (RepositoryConfigException | RepositoryException e) { - throw new ServletException(e); + if (e.getCause() instanceof ValidationException) { + Model model = ((ValidationException) e.getCause()).validationReportAsModel(); + + resp.setStatus(HttpServletResponse.SC_CONFLICT); + resp.setContentType(TEXT_PLAIN); + PrintWriter writer = resp.getWriter(); + + writer.println("SHACL validation failed with the following report:\n"); + WriterConfig writerConfig = new WriterConfig(); + writerConfig.set(BasicWriterSettings.PRETTY_PRINT, true); + writerConfig.set(BasicWriterSettings.INLINE_BLANK_NODES, true); + Rio.write(model, writer, RDFFormat.TURTLE, writerConfig); + + writer.println( + "\n" + + "THIS ERROR MESSAGE IS EXPERIMENTAL AND IS SUBJECT TO CHANGE - " + + "DO NOT TRY TO PARSE THIS ERROR MESSAGE"); + + } else { + throw new ServletException(e); + } } catch (ServletException e) { if (e.getCause() instanceof UnauthorizedException) { handleUnauthorizedException(req, resp); @@ -210,7 +237,7 @@ private String getTransformationUrl(final HttpServletRequest req) { /** * Set the username and password for all requests to the repository. - * + * * @param req the servlet request * @param resp the servlet response * @throws MalformedURLException if the repository location is malformed @@ -241,4 +268,4 @@ private void setCredentials(final HttpServletRequest req, final HttpServletRespo rrm.initialize(); } } -} \ No newline at end of file +} diff --git a/tools/workbench/src/main/java/org/eclipse/rdf4j/workbench/util/CookieHandler.java b/tools/workbench/src/main/java/org/eclipse/rdf4j/workbench/util/CookieHandler.java index 2c504e120c9..77f5aae8e60 100644 --- a/tools/workbench/src/main/java/org/eclipse/rdf4j/workbench/util/CookieHandler.java +++ b/tools/workbench/src/main/java/org/eclipse/rdf4j/workbench/util/CookieHandler.java @@ -22,7 +22,7 @@ /** * Handles cookies for TransformationServlet. - * + * * @author Dale Visser */ public class CookieHandler { @@ -80,7 +80,7 @@ private void addCookie(final WorkbenchRequest req, final HttpServletResponse res /** * Add a 'total_result_count' cookie. Used by both QueryServlet and ExploreServlet. - * + * * @param req the request object * @param resp the response object * @value the value to give the cookie diff --git a/tools/workbench/src/main/java/org/eclipse/rdf4j/workbench/util/PagedQuery.java b/tools/workbench/src/main/java/org/eclipse/rdf4j/workbench/util/PagedQuery.java index d65eb84c519..aa074130433 100644 --- a/tools/workbench/src/main/java/org/eclipse/rdf4j/workbench/util/PagedQuery.java +++ b/tools/workbench/src/main/java/org/eclipse/rdf4j/workbench/util/PagedQuery.java @@ -41,7 +41,7 @@ public class PagedQuery { *

    * Implementation note: The new object contains the user's query with appended or modified LIMIT and OFFSET clauses. *

    - * + * * @param query as it was specified by the user * @param language SPARQL or SeRQL, as specified by the user * @param requestLimit maximum number of results to return, as specified by the URL query parameters or cookies @@ -136,7 +136,7 @@ private static String modifyLimit(final QueryLanguage language, final String que /** * Insert a given string into another string at the point at which the given matcher matches, making sure to place * the insertion string on its own line. If there is no match, appends to end on own line. - * + * * @param pattern pattern to search for insertion location * @param orig string to perform insertion on * @param insert string to insert on own line diff --git a/tools/workbench/src/main/java/org/eclipse/rdf4j/workbench/util/QueryEvaluator.java b/tools/workbench/src/main/java/org/eclipse/rdf4j/workbench/util/QueryEvaluator.java index 725a187dae1..b47d02d8061 100644 --- a/tools/workbench/src/main/java/org/eclipse/rdf4j/workbench/util/QueryEvaluator.java +++ b/tools/workbench/src/main/java/org/eclipse/rdf4j/workbench/util/QueryEvaluator.java @@ -50,7 +50,7 @@ private QueryEvaluator() { /** * Evaluates the query submitted with the given request. - * + * * @param builder used to build the response * @param resp the response object * @param out the output writer @@ -100,7 +100,7 @@ public void extractQueryAndEvaluate(final TupleResultBuilder builder, final Http /*** * Evaluate a tuple query, and create an XML results document. This method completes writing of the response. !paged * means use all results. - * + * * @param builder response builder helper for generating the XML response to the client, which must not * have had start() called on it * @param xslPath needed to begin writing response body after writing result count cookie @@ -151,7 +151,7 @@ private void addResult(final TupleResultBuilder builder, final String[] names, f /*** * Evaluate a tuple query, and create an XML results document. It is still necessary to call end() on the builder * after calling this method. - * + * * @param builder response builder helper for generating the XML response to the client, which must have * had start() called on it * @param query the query to be evaluated @@ -173,7 +173,7 @@ public void evaluateTupleQuery(final TupleResultBuilder builder, final TupleQuer /*** * Evaluate a graph query, and create an XML results document. - * + * * @param builder response builder helper for generating the XML response to the client, which must not * have had start() called on it * @param xslPath needed to begin writing response body after writing result count cookie diff --git a/tools/workbench/src/main/java/org/eclipse/rdf4j/workbench/util/QueryStringBuilder.java b/tools/workbench/src/main/java/org/eclipse/rdf4j/workbench/util/QueryStringBuilder.java index f6e7f52e89e..2c9d38f72ab 100644 --- a/tools/workbench/src/main/java/org/eclipse/rdf4j/workbench/util/QueryStringBuilder.java +++ b/tools/workbench/src/main/java/org/eclipse/rdf4j/workbench/util/QueryStringBuilder.java @@ -12,7 +12,7 @@ /** * Helper class for substituting in variables to query templates for the purpose of saving and retrieving user queries * to a repository local to the workbench. - * + * * @author Dale Visser */ public class QueryStringBuilder { @@ -23,7 +23,7 @@ public class QueryStringBuilder { /** * Creates a new builder from the given template. - * + * * @param template */ public QueryStringBuilder(final String template) { @@ -46,7 +46,7 @@ public String toString() { /** * Replace the repository variable with the current repository URL. - * + * * @param paramText the $<...> formatted parameter name * @param uri any object who's toString() returns a valid URI */ @@ -56,7 +56,7 @@ protected void replaceURI(final String paramText, final Object uri) { /** * Replace instances of the old text with a copy of the new text. - * + * * @param paramText parameter in the form "$" * @param newText the new text */ @@ -74,7 +74,7 @@ protected void replaceQuote(final String paramText, final String newText) { /** * Place double quotes around the given string. - * + * * @param value the string to add quotes to * @return a copy of the given strings quoted with double quotes */ @@ -84,7 +84,7 @@ private static String quote(final String value) { /** * Place double quotes around the given string and append an XSD data type. - * + * * @param value the value to quote * @param type the XSD data type name * @return a copy of the given string quoted with XSD data type appended @@ -95,7 +95,7 @@ protected static String xsdQuote(final String value, final String type) { /** * Place angle brackets around a URI or URL. - * + * * @param uri an object whose toString() returns a URI or URL * @return a string quoting the given URI with angle brackets */ @@ -106,4 +106,4 @@ private static String uriQuote(final Object uri) { protected static String quote(final String value, final String left, final String right) { return left + value + right; } -} \ No newline at end of file +} diff --git a/tools/workbench/src/main/java/org/eclipse/rdf4j/workbench/util/TupleResultBuilder.java b/tools/workbench/src/main/java/org/eclipse/rdf4j/workbench/util/TupleResultBuilder.java index afbb61f75d6..91e30c78052 100644 --- a/tools/workbench/src/main/java/org/eclipse/rdf4j/workbench/util/TupleResultBuilder.java +++ b/tools/workbench/src/main/java/org/eclipse/rdf4j/workbench/util/TupleResultBuilder.java @@ -24,7 +24,7 @@ /** * A small wrapper around {@link QueryResultWriter} to make it easier to generate results in servlets. - * + * * @author peter */ public class TupleResultBuilder { @@ -51,7 +51,7 @@ public TupleResultBuilder transform(String path, String xsl) throws QueryResultH /** * This must be called before calling {@link #namedResult(String, Object)} or {@link #result(Object...)}. - * + * * @param variables one or more variable names * @return this builder, for the convenience of chaining calls * @throws QueryResultHandlerException @@ -84,7 +84,7 @@ public TupleResultBuilder bool(boolean result) throws QueryResultHandlerExceptio /** * {@link #start(String...)} must be called before using this method. - * + * * @param result a single result, one value for each variable, in the same order as the variable names were provided * @return this builder, for the convenience of chaining calls * @throws QueryResultHandlerException @@ -92,8 +92,9 @@ public TupleResultBuilder bool(boolean result) throws QueryResultHandlerExceptio public TupleResultBuilder result(Object... result) throws QueryResultHandlerException { QueryBindingSet bindingSet = new QueryBindingSet(); for (int i = 0; i < result.length; i++) { - if (result[i] == null) + if (result[i] == null) { continue; + } bindingSet.addBinding(outputNamedResult(variables.get(i), result[i])); } out.handleSolution(bindingSet); @@ -102,7 +103,7 @@ public TupleResultBuilder result(Object... result) throws QueryResultHandlerExce /** * {@link #start(String...)} must be called before using this method. - * + * * @param name the variable name, from the set of provided variable names * @param result the result value associated with the given variable name * @return this builder, for the convenience of chaining calls @@ -136,7 +137,7 @@ private Binding outputNamedResult(String name, Object result) throws QueryResult * {@link #namedResult(String, Object)} or {@link #result(Object...)}. *

    * This must not be called if {@link #bool(boolean)} or {@link #endBoolean()} have been called. - * + * * @return This object, for chaining with other calls. * @throws QueryResultHandlerException */ diff --git a/tools/workbench/src/main/java/org/eclipse/rdf4j/workbench/util/ValueDecoder.java b/tools/workbench/src/main/java/org/eclipse/rdf4j/workbench/util/ValueDecoder.java index 550d2788efb..6f989c5880b 100644 --- a/tools/workbench/src/main/java/org/eclipse/rdf4j/workbench/util/ValueDecoder.java +++ b/tools/workbench/src/main/java/org/eclipse/rdf4j/workbench/util/ValueDecoder.java @@ -30,7 +30,7 @@ class ValueDecoder { /** * Creates an instance of ValueDecoder. - * + * * @param repository to get namespaces from * @param factory to generate values */ @@ -41,7 +41,7 @@ protected ValueDecoder(Repository repository, ValueFactory factory) { /** * Decode the given string into a {@link org.eclipse.rdf4j.model.Value}. - * + * * @param string representation of an RDF value * @return the parsed value, or null if the string is null, empty, only whitespace, or * {@link java.lang.String#equals(Object)} "null". diff --git a/tools/workbench/src/test/java/org/eclipse/rdf4j/workbench/commands/TestInfoServlet.java b/tools/workbench/src/test/java/org/eclipse/rdf4j/workbench/commands/TestInfoServlet.java index 81c14ad9d6a..25a02537129 100644 --- a/tools/workbench/src/test/java/org/eclipse/rdf4j/workbench/commands/TestInfoServlet.java +++ b/tools/workbench/src/test/java/org/eclipse/rdf4j/workbench/commands/TestInfoServlet.java @@ -45,7 +45,7 @@ public void setUp() throws Exception { /** * Throwing exceptions for invalid repository ID's results in a 500 response code to the client. As seen in the bug * report, some versions of Internet Explorer don't gracefully handle error responses during XSLT parsing. - * + * * @see SES-1770 */ @Test diff --git a/tools/workbench/src/test/java/org/eclipse/rdf4j/workbench/commands/TestRemoveServlet.java b/tools/workbench/src/test/java/org/eclipse/rdf4j/workbench/commands/TestRemoveServlet.java index 2436c052017..b7d05046015 100644 --- a/tools/workbench/src/test/java/org/eclipse/rdf4j/workbench/commands/TestRemoveServlet.java +++ b/tools/workbench/src/test/java/org/eclipse/rdf4j/workbench/commands/TestRemoveServlet.java @@ -29,7 +29,7 @@ /** * Unit and regression tests for {@link RemoteServlet}. - * + * * @author Dale Visser */ public class TestRemoveServlet {

      *    Class A is a direct subclass of B iff:
      *       1. A is a subclass of B and;
      *       2. A and B are not equa and;
      *       3. there is no class C (unequal A and B) such that 
      *          A is a subclass of C and C of B.
    - *   
    + *
      *    Property P is a direct subproperty of Q iff:
      *       1. P is a subproperty of Q and;
      *       2. P and Q are not equal and;
      *       3. there is no property R (unequal P and Q) such that
      *          P is a subproperty of R and R of Q.
    - *   
    + *
      *    Resource I is of direct type T iff:
      *       1. I is of type T and
      *       2. There is no class U (unequal T) such that:
    @@ -68,7 +68,7 @@ public class DirectTypeHierarchyInferencer extends NotifyingSailWrapper {
     	private static final Logger logger = LoggerFactory.getLogger(DirectTypeHierarchyInferencer.class);
     
     	/*-----------*
    -	 * Constants * 
    +	 * Constants *
     	 *-----------*/
     
     	private static final ParsedGraphQuery DIRECT_SUBCLASSOF_MATCHER;
    @@ -116,7 +116,7 @@ public class DirectTypeHierarchyInferencer extends NotifyingSailWrapper {
     	}
     
     	/*--------------*
    -	 * Constructors * 
    +	 * Constructors *
     	 *--------------*/
     
     	public DirectTypeHierarchyInferencer() {
    @@ -128,7 +128,7 @@ public DirectTypeHierarchyInferencer(NotifyingSail baseSail) {
     	}
     
     	/*---------*
    -	 * Methods * 
    +	 * Methods *
     	 *---------*/
     
     	@Override
    diff --git a/core/sail/inferencer/src/main/java/org/eclipse/rdf4j/sail/inferencer/fc/ForwardChainingRDFSInferencer.java b/core/sail/inferencer/src/main/java/org/eclipse/rdf4j/sail/inferencer/fc/ForwardChainingRDFSInferencer.java
    index f5ae7e81239..b392acc50bd 100644
    --- a/core/sail/inferencer/src/main/java/org/eclipse/rdf4j/sail/inferencer/fc/ForwardChainingRDFSInferencer.java
    +++ b/core/sail/inferencer/src/main/java/org/eclipse/rdf4j/sail/inferencer/fc/ForwardChainingRDFSInferencer.java
    @@ -17,7 +17,7 @@
      * RDF Semantics Recommendation (10 February 2004). This
      * inferencer can be used to add RDF Schema semantics to any Sail that returns {@link InferencerConnection}s from their
      * {@link Sail#getConnection()} method.
    - * 
    + *
      * @deprecated since 2.5. This inferencer implementation will be phased out. Consider switching to the
      *             {@link SchemaCachingRDFSInferencer} instead.
      */
    diff --git a/core/sail/inferencer/src/main/java/org/eclipse/rdf4j/sail/inferencer/fc/ForwardChainingRDFSInferencerConnection.java b/core/sail/inferencer/src/main/java/org/eclipse/rdf4j/sail/inferencer/fc/ForwardChainingRDFSInferencerConnection.java
    index 6652d4d843a..9f8b4b4052c 100644
    --- a/core/sail/inferencer/src/main/java/org/eclipse/rdf4j/sail/inferencer/fc/ForwardChainingRDFSInferencerConnection.java
    +++ b/core/sail/inferencer/src/main/java/org/eclipse/rdf4j/sail/inferencer/fc/ForwardChainingRDFSInferencerConnection.java
    @@ -14,7 +14,7 @@
     import org.eclipse.rdf4j.model.Resource;
     import org.eclipse.rdf4j.model.Statement;
     import org.eclipse.rdf4j.model.Value;
    -import org.eclipse.rdf4j.model.impl.TreeModel;
    +import org.eclipse.rdf4j.model.impl.DynamicModelFactory;
     import org.eclipse.rdf4j.model.vocabulary.RDF;
     import org.eclipse.rdf4j.model.vocabulary.RDFS;
     import org.eclipse.rdf4j.sail.Sail;
    @@ -28,7 +28,7 @@
      * RDF Semantics Recommendation (10 February 2004). This
      * inferencer can be used to add RDF Schema semantics to any Sail that returns {@link InferencerConnection}s from their
      * {@link Sail#getConnection()} method.
    - * 
    + *
      * @deprecated since 2.5. This inferencer implementation will be phased out. Consider switching to the
      *             {@link SchemaCachingRDFSInferencer} instead.
      */
    @@ -73,7 +73,7 @@ public ForwardChainingRDFSInferencerConnection(Sail sail, InferencerConnection c
     	// Called by base sail
     	@Override
     	protected Model createModel() {
    -		return new TreeModel();
    +		return new DynamicModelFactory().createEmptyModel();
     	}
     
     	/**
    @@ -310,7 +310,7 @@ protected int applyRuleInternal(int rule) throws SailException {
     	private int applyRuleRdf1() throws SailException {
     		int nofInferred = 0;
     
    -		Model iter = newThisIteration.filter(null, null, null);
    +		Iterable iter = newThisIteration.getStatements(null, null, null);
     
     		for (Statement st : iter) {
     			boolean added = addInferredStatement(st.getPredicate(), RDF.TYPE, RDF.PROPERTY);
    @@ -327,7 +327,7 @@ private int applyRuleRdf1() throws SailException {
     	private int applyRuleRdfs2_1() throws SailException {
     		int nofInferred = 0;
     
    -		Model ntIter = newThisIteration.filter(null, null, null);
    +		Iterable ntIter = newThisIteration.getStatements(null, null, null);
     
     		for (Statement nt : ntIter) {
     			Resource xxx = nt.getSubject();
    @@ -357,7 +357,7 @@ private int applyRuleRdfs2_1() throws SailException {
     	private int applyRuleRdfs2_2() throws SailException {
     		int nofInferred = 0;
     
    -		Model ntIter = newThisIteration.filter(null, RDFS.DOMAIN, null);
    +		Iterable ntIter = newThisIteration.getStatements(null, RDFS.DOMAIN, null);
     
     		for (Statement nt : ntIter) {
     			Resource aaa = nt.getSubject();
    @@ -387,7 +387,7 @@ private int applyRuleRdfs2_2() throws SailException {
     	private int applyRuleRdfs3_1() throws SailException {
     		int nofInferred = 0;
     
    -		Model ntIter = newThisIteration.filter(null, null, null);
    +		Iterable ntIter = newThisIteration.getStatements(null, null, null);
     
     		for (Statement nt : ntIter) {
     			IRI aaa = nt.getPredicate();
    @@ -418,7 +418,7 @@ private int applyRuleRdfs3_1() throws SailException {
     	private int applyRuleRdfs3_2() throws SailException {
     		int nofInferred = 0;
     
    -		Model ntIter = newThisIteration.filter(null, RDFS.RANGE, null);
    +		Iterable ntIter = newThisIteration.getStatements(null, RDFS.RANGE, null);
     
     		for (Statement nt : ntIter) {
     			Resource aaa = nt.getSubject();
    @@ -451,7 +451,7 @@ private int applyRuleRdfs3_2() throws SailException {
     	private int applyRuleRdfs4a() throws SailException {
     		int nofInferred = 0;
     
    -		Model iter = newThisIteration.filter(null, null, null);
    +		Iterable iter = newThisIteration.getStatements(null, null, null);
     
     		for (Statement st : iter) {
     			boolean added = addInferredStatement(st.getSubject(), RDF.TYPE, RDFS.RESOURCE);
    @@ -467,7 +467,7 @@ private int applyRuleRdfs4a() throws SailException {
     	private int applyRuleRdfs4b() throws SailException {
     		int nofInferred = 0;
     
    -		Model iter = newThisIteration.filter(null, null, null);
    +		Iterable iter = newThisIteration.getStatements(null, null, null);
     
     		for (Statement st : iter) {
     			Value uuu = st.getObject();
    @@ -487,7 +487,7 @@ private int applyRuleRdfs4b() throws SailException {
     	private int applyRuleRdfs5_1() throws SailException {
     		int nofInferred = 0;
     
    -		Model ntIter = newThisIteration.filter(null, RDFS.SUBPROPERTYOF, null);
    +		Iterable ntIter = newThisIteration.getStatements(null, RDFS.SUBPROPERTYOF, null);
     
     		for (Statement nt : ntIter) {
     			Resource aaa = nt.getSubject();
    @@ -521,7 +521,7 @@ private int applyRuleRdfs5_1() throws SailException {
     	private int applyRuleRdfs5_2() throws SailException {
     		int nofInferred = 0;
     
    -		Model ntIter = newThisIteration.filter(null, RDFS.SUBPROPERTYOF, null);
    +		Iterable ntIter = newThisIteration.getStatements(null, RDFS.SUBPROPERTYOF, null);
     
     		for (Statement nt : ntIter) {
     			Resource bbb = nt.getSubject();
    @@ -551,7 +551,7 @@ private int applyRuleRdfs5_2() throws SailException {
     	private int applyRuleRdfs6() throws SailException {
     		int nofInferred = 0;
     
    -		Model iter = newThisIteration.filter(null, RDF.TYPE, RDF.PROPERTY);
    +		Iterable iter = newThisIteration.getStatements(null, RDF.TYPE, RDF.PROPERTY);
     
     		for (Statement st : iter) {
     			Resource xxx = st.getSubject();
    @@ -568,7 +568,7 @@ private int applyRuleRdfs6() throws SailException {
     	private int applyRuleRdfs7_1() throws SailException {
     		int nofInferred = 0;
     
    -		Model ntIter = newThisIteration.filter(null, null, null);
    +		Iterable ntIter = newThisIteration.getStatements(null, null, null);
     
     		for (Statement nt : ntIter) {
     			Resource xxx = nt.getSubject();
    @@ -599,7 +599,7 @@ private int applyRuleRdfs7_1() throws SailException {
     	private int applyRuleRdfs7_2() throws SailException {
     		int nofInferred = 0;
     
    -		Model ntIter = newThisIteration.filter(null, RDFS.SUBPROPERTYOF, null);
    +		Iterable ntIter = newThisIteration.getStatements(null, RDFS.SUBPROPERTYOF, null);
     
     		for (Statement nt : ntIter) {
     			Resource aaa = nt.getSubject();
    @@ -631,7 +631,7 @@ private int applyRuleRdfs7_2() throws SailException {
     	private int applyRuleRdfs8() throws SailException {
     		int nofInferred = 0;
     
    -		Model iter = newThisIteration.filter(null, RDF.TYPE, RDFS.CLASS);
    +		Iterable iter = newThisIteration.getStatements(null, RDF.TYPE, RDFS.CLASS);
     
     		for (Statement st : iter) {
     			Resource xxx = st.getSubject();
    @@ -649,7 +649,7 @@ private int applyRuleRdfs8() throws SailException {
     	private int applyRuleRdfs9_1() throws SailException {
     		int nofInferred = 0;
     
    -		Model ntIter = newThisIteration.filter(null, RDFS.SUBCLASSOF, null);
    +		Iterable ntIter = newThisIteration.getStatements(null, RDFS.SUBCLASSOF, null);
     
     		for (Statement nt : ntIter) {
     			Resource xxx = nt.getSubject();
    @@ -680,7 +680,7 @@ private int applyRuleRdfs9_1() throws SailException {
     	private int applyRuleRdfs9_2() throws SailException {
     		int nofInferred = 0;
     
    -		Model ntIter = newThisIteration.filter(null, RDF.TYPE, null);
    +		Iterable ntIter = newThisIteration.getStatements(null, RDF.TYPE, null);
     
     		for (Statement nt : ntIter) {
     			Resource aaa = nt.getSubject();
    @@ -713,7 +713,7 @@ private int applyRuleRdfs9_2() throws SailException {
     	private int applyRuleRdfs10() throws SailException {
     		int nofInferred = 0;
     
    -		Model iter = newThisIteration.filter(null, RDF.TYPE, RDFS.CLASS);
    +		Iterable iter = newThisIteration.getStatements(null, RDF.TYPE, RDFS.CLASS);
     
     		for (Statement st : iter) {
     			Resource xxx = st.getSubject();
    @@ -732,7 +732,7 @@ private int applyRuleRdfs10() throws SailException {
     	private int applyRuleRdfs11_1() throws SailException {
     		int nofInferred = 0;
     
    -		Model ntIter = newThisIteration.filter(null, RDFS.SUBCLASSOF, null);
    +		Iterable ntIter = newThisIteration.getStatements(null, RDFS.SUBCLASSOF, null);
     
     		for (Statement nt : ntIter) {
     			Resource xxx = nt.getSubject();
    @@ -766,7 +766,7 @@ private int applyRuleRdfs11_1() throws SailException {
     	private int applyRuleRdfs11_2() throws SailException {
     		int nofInferred = 0;
     
    -		Model ntIter = newThisIteration.filter(null, RDFS.SUBCLASSOF, null);
    +		Iterable ntIter = newThisIteration.getStatements(null, RDFS.SUBCLASSOF, null);
     
     		for (Statement nt : ntIter) {
     			Resource yyy = nt.getSubject();
    @@ -798,7 +798,7 @@ private int applyRuleRdfs11_2() throws SailException {
     	private int applyRuleRdfs12() throws SailException {
     		int nofInferred = 0;
     
    -		Model iter = newThisIteration.filter(null, RDF.TYPE, RDFS.CONTAINERMEMBERSHIPPROPERTY);
    +		Iterable iter = newThisIteration.getStatements(null, RDF.TYPE, RDFS.CONTAINERMEMBERSHIPPROPERTY);
     
     		for (Statement st : iter) {
     			Resource xxx = st.getSubject();
    @@ -816,7 +816,7 @@ private int applyRuleRdfs12() throws SailException {
     	private int applyRuleRdfs13() throws SailException {
     		int nofInferred = 0;
     
    -		Model iter = newThisIteration.filter(null, RDF.TYPE, RDFS.DATATYPE);
    +		Iterable iter = newThisIteration.getStatements(null, RDF.TYPE, RDFS.DATATYPE);
     
     		for (Statement st : iter) {
     			Resource xxx = st.getSubject();
    @@ -837,7 +837,7 @@ private int applyRuleX1() throws SailException {
     		int nofInferred = 0;
     
     		String prefix = RDF.NAMESPACE + "_";
    -		Model iter = newThisIteration.filter(null, null, null);
    +		Iterable iter = newThisIteration.getStatements(null, null, null);
     
     		for (Statement st : iter) {
     			IRI predNode = st.getPredicate();
    diff --git a/core/sail/inferencer/src/main/java/org/eclipse/rdf4j/sail/inferencer/fc/SchemaCachingRDFSInferencer.java b/core/sail/inferencer/src/main/java/org/eclipse/rdf4j/sail/inferencer/fc/SchemaCachingRDFSInferencer.java
    index 237c70d76e0..b9501f11345 100644
    --- a/core/sail/inferencer/src/main/java/org/eclipse/rdf4j/sail/inferencer/fc/SchemaCachingRDFSInferencer.java
    +++ b/core/sail/inferencer/src/main/java/org/eclipse/rdf4j/sail/inferencer/fc/SchemaCachingRDFSInferencer.java
    @@ -22,7 +22,6 @@
     
     import org.eclipse.rdf4j.IsolationLevel;
     import org.eclipse.rdf4j.IsolationLevels;
    -import org.eclipse.rdf4j.common.iteration.Iterations;
     import org.eclipse.rdf4j.model.IRI;
     import org.eclipse.rdf4j.model.Resource;
     import org.eclipse.rdf4j.model.Statement;
    @@ -31,7 +30,6 @@
     import org.eclipse.rdf4j.model.vocabulary.RDFS;
     import org.eclipse.rdf4j.repository.Repository;
     import org.eclipse.rdf4j.repository.RepositoryConnection;
    -import org.eclipse.rdf4j.repository.RepositoryResult;
     import org.eclipse.rdf4j.sail.NotifyingSail;
     import org.eclipse.rdf4j.sail.SailException;
     import org.eclipse.rdf4j.sail.helpers.NotifyingSailWrapper;
    diff --git a/core/sail/inferencer/src/main/java/org/eclipse/rdf4j/sail/inferencer/fc/config/CustomGraphQueryInferencerConfig.java b/core/sail/inferencer/src/main/java/org/eclipse/rdf4j/sail/inferencer/fc/config/CustomGraphQueryInferencerConfig.java
    index fce6bbef379..99c6a387f5c 100644
    --- a/core/sail/inferencer/src/main/java/org/eclipse/rdf4j/sail/inferencer/fc/config/CustomGraphQueryInferencerConfig.java
    +++ b/core/sail/inferencer/src/main/java/org/eclipse/rdf4j/sail/inferencer/fc/config/CustomGraphQueryInferencerConfig.java
    @@ -36,7 +36,7 @@
     
     /**
      * Configuration handling for {@link org.eclipse.rdf4j.sail.inferencer.fc.CustomGraphQueryInferencer}.
    - * 
    + *
      * @author Dale Visser
      */
     public final class CustomGraphQueryInferencerConfig extends AbstractDelegatingSailImplConfig {
    @@ -79,7 +79,7 @@ public String getRuleQuery() {
     
     	/**
     	 * Set the optional matcher query.
    -	 * 
    +	 *
     	 * @param matcherQuery if null, internal value will be set to the empty string
     	 */
     	public void setMatcherQuery(String matcherQuery) {
    @@ -96,7 +96,7 @@ public void parse(Model m, Resource implNode) throws SailConfigException {
     
     		try {
     
    -			Optional language = Models.objectLiteral(m.filter(implNode, QUERY_LANGUAGE, null));
    +			Optional language = Models.objectLiteral(m.getStatements(implNode, QUERY_LANGUAGE, null));
     
     			if (language.isPresent()) {
     				setQueryLanguage(QueryLanguage.valueOf(language.get().stringValue()));
    @@ -108,15 +108,15 @@ public void parse(Model m, Resource implNode) throws SailConfigException {
     				setQueryLanguage(QueryLanguage.SPARQL);
     			}
     
    -			Optional object = Models.objectResource(m.filter(implNode, RULE_QUERY, null));
    +			Optional object = Models.objectResource(m.getStatements(implNode, RULE_QUERY, null));
     			if (object.isPresent()) {
    -				Models.objectLiteral(m.filter(object.get(), SP.TEXT_PROPERTY, null))
    +				Models.objectLiteral(m.getStatements(object.get(), SP.TEXT_PROPERTY, null))
     						.ifPresent(lit -> setRuleQuery(lit.stringValue()));
     			}
     
    -			object = Models.objectResource(m.filter(implNode, MATCHER_QUERY, null));
    +			object = Models.objectResource(m.getStatements(implNode, MATCHER_QUERY, null));
     			if (object.isPresent()) {
    -				Models.objectLiteral(m.filter(object.get(), SP.TEXT_PROPERTY, null))
    +				Models.objectLiteral(m.getStatements(object.get(), SP.TEXT_PROPERTY, null))
     						.ifPresent(lit -> setMatcherQuery(lit.stringValue()));
     			}
     		} catch (ModelException e) {
    @@ -189,4 +189,4 @@ private void addQueryNode(Model m, Resource implNode, IRI predicate, String quer
     			m.add(queryNode, SP.TEXT_PROPERTY, factory.createLiteral(queryText));
     		}
     	}
    -}
    \ No newline at end of file
    +}
    diff --git a/core/sail/inferencer/src/main/java/org/eclipse/rdf4j/sail/inferencer/fc/config/CustomGraphQueryInferencerFactory.java b/core/sail/inferencer/src/main/java/org/eclipse/rdf4j/sail/inferencer/fc/config/CustomGraphQueryInferencerFactory.java
    index 0578f0a0cab..9bbfb7a7d2d 100644
    --- a/core/sail/inferencer/src/main/java/org/eclipse/rdf4j/sail/inferencer/fc/config/CustomGraphQueryInferencerFactory.java
    +++ b/core/sail/inferencer/src/main/java/org/eclipse/rdf4j/sail/inferencer/fc/config/CustomGraphQueryInferencerFactory.java
    @@ -16,14 +16,14 @@
     
     /**
      * A {@link SailFactory} that creates a {@link CustomGraphQueryInferencer} based on RDF configuration data.
    - * 
    + *
      * @author Dale Visser
      */
     public class CustomGraphQueryInferencerFactory implements SailFactory {
     
     	/**
     	 * The type of repositories that are created by this factory.
    -	 * 
    +	 *
     	 * @see SailFactory#getSailType()
     	 */
     	public static final String SAIL_TYPE = "openrdf:CustomGraphQueryInferencer";
    @@ -58,4 +58,4 @@ public Sail getSail(SailImplConfig config) throws SailConfigException {
     		}
     		return sail;
     	}
    -}
    \ No newline at end of file
    +}
    diff --git a/core/sail/inferencer/src/main/java/org/eclipse/rdf4j/sail/inferencer/fc/config/CustomGraphQueryInferencerSchema.java b/core/sail/inferencer/src/main/java/org/eclipse/rdf4j/sail/inferencer/fc/config/CustomGraphQueryInferencerSchema.java
    index 3c3c0cfdd6e..baa838720d1 100644
    --- a/core/sail/inferencer/src/main/java/org/eclipse/rdf4j/sail/inferencer/fc/config/CustomGraphQueryInferencerSchema.java
    +++ b/core/sail/inferencer/src/main/java/org/eclipse/rdf4j/sail/inferencer/fc/config/CustomGraphQueryInferencerSchema.java
    @@ -14,7 +14,7 @@
     
     /**
      * Configuration schema URI's for {@link CustomGraphQueryInferencer}.
    - * 
    + *
      * @author Dale Visser
      */
     public class CustomGraphQueryInferencerSchema {
    @@ -40,4 +40,4 @@ public class CustomGraphQueryInferencerSchema {
     		RULE_QUERY = factory.createIRI(NAMESPACE, "ruleQuery");
     		MATCHER_QUERY = factory.createIRI(NAMESPACE, "matcherQuery");
     	}
    -}
    \ No newline at end of file
    +}
    diff --git a/core/sail/inferencer/src/main/java/org/eclipse/rdf4j/sail/inferencer/fc/config/DedupingInferencerFactory.java b/core/sail/inferencer/src/main/java/org/eclipse/rdf4j/sail/inferencer/fc/config/DedupingInferencerFactory.java
    index 9a4bb6eb6f8..34c1f35323a 100644
    --- a/core/sail/inferencer/src/main/java/org/eclipse/rdf4j/sail/inferencer/fc/config/DedupingInferencerFactory.java
    +++ b/core/sail/inferencer/src/main/java/org/eclipse/rdf4j/sail/inferencer/fc/config/DedupingInferencerFactory.java
    @@ -17,7 +17,7 @@ public class DedupingInferencerFactory implements SailFactory {
     
     	/**
     	 * The type of repositories that are created by this factory.
    -	 * 
    +	 *
     	 * @see SailFactory#getSailType()
     	 */
     	public static final String SAIL_TYPE = "openrdf:DedupingInferencer";
    diff --git a/core/sail/inferencer/src/main/java/org/eclipse/rdf4j/sail/inferencer/fc/config/DirectTypeHierarchyInferencerFactory.java b/core/sail/inferencer/src/main/java/org/eclipse/rdf4j/sail/inferencer/fc/config/DirectTypeHierarchyInferencerFactory.java
    index 69ec2a3cf97..6a11a338364 100644
    --- a/core/sail/inferencer/src/main/java/org/eclipse/rdf4j/sail/inferencer/fc/config/DirectTypeHierarchyInferencerFactory.java
    +++ b/core/sail/inferencer/src/main/java/org/eclipse/rdf4j/sail/inferencer/fc/config/DirectTypeHierarchyInferencerFactory.java
    @@ -15,14 +15,14 @@
     
     /**
      * A {@link SailFactory} that creates {@link DirectTypeHierarchyInferencer}s based on RDF configuration data.
    - * 
    + *
      * @author Arjohn Kampman
      */
     public class DirectTypeHierarchyInferencerFactory implements SailFactory {
     
     	/**
     	 * The type of repositories that are created by this factory.
    -	 * 
    +	 *
     	 * @see SailFactory#getSailType()
     	 */
     	public static final String SAIL_TYPE = "openrdf:DirectTypeHierarchyInferencer";
    diff --git a/core/sail/inferencer/src/main/java/org/eclipse/rdf4j/sail/inferencer/fc/config/ForwardChainingRDFSInferencerFactory.java b/core/sail/inferencer/src/main/java/org/eclipse/rdf4j/sail/inferencer/fc/config/ForwardChainingRDFSInferencerFactory.java
    index 9bfb2ead1e3..8e17fc606a9 100644
    --- a/core/sail/inferencer/src/main/java/org/eclipse/rdf4j/sail/inferencer/fc/config/ForwardChainingRDFSInferencerFactory.java
    +++ b/core/sail/inferencer/src/main/java/org/eclipse/rdf4j/sail/inferencer/fc/config/ForwardChainingRDFSInferencerFactory.java
    @@ -15,7 +15,7 @@
     
     /**
      * A {@link SailFactory} that creates {@link ForwardChainingRDFSInferencer}s based on RDF configuration data.
    - * 
    + *
      * @author Arjohn Kampman
      */
     @Deprecated
    @@ -23,7 +23,7 @@ public class ForwardChainingRDFSInferencerFactory implements SailFactory {
     
     	/**
     	 * The type of repositories that are created by this factory.
    -	 * 
    +	 *
     	 * @see SailFactory#getSailType()
     	 */
     	public static final String SAIL_TYPE = "openrdf:ForwardChainingRDFSInferencer";
    diff --git a/core/sail/inferencer/src/main/java/org/eclipse/rdf4j/sail/inferencer/fc/config/SchemaCachingRDFSInferencerConfig.java b/core/sail/inferencer/src/main/java/org/eclipse/rdf4j/sail/inferencer/fc/config/SchemaCachingRDFSInferencerConfig.java
    index 5e0bbf20cd6..d445873410a 100644
    --- a/core/sail/inferencer/src/main/java/org/eclipse/rdf4j/sail/inferencer/fc/config/SchemaCachingRDFSInferencerConfig.java
    +++ b/core/sail/inferencer/src/main/java/org/eclipse/rdf4j/sail/inferencer/fc/config/SchemaCachingRDFSInferencerConfig.java
    @@ -13,7 +13,7 @@
     
     /**
      * {@link SailImplConfig} for the {@link SchemaCachingRDFSInferencer}
    - * 
    + *
      * @author Jeen Broekstra
      */
     public class SchemaCachingRDFSInferencerConfig extends AbstractDelegatingSailImplConfig {
    diff --git a/core/sail/inferencer/src/main/java/org/eclipse/rdf4j/sail/inferencer/fc/config/SchemaCachingRDFSInferencerFactory.java b/core/sail/inferencer/src/main/java/org/eclipse/rdf4j/sail/inferencer/fc/config/SchemaCachingRDFSInferencerFactory.java
    index e7eace4514f..b0f6c38c5a3 100644
    --- a/core/sail/inferencer/src/main/java/org/eclipse/rdf4j/sail/inferencer/fc/config/SchemaCachingRDFSInferencerFactory.java
    +++ b/core/sail/inferencer/src/main/java/org/eclipse/rdf4j/sail/inferencer/fc/config/SchemaCachingRDFSInferencerFactory.java
    @@ -15,14 +15,14 @@
     
     /**
      * A {@link SailFactory} that creates {@link SchemaCachingRDFSInferencer}s based on RDF configuration data.
    - * 
    + *
      * @author Jeen Broekstra
      */
     public class SchemaCachingRDFSInferencerFactory implements SailFactory {
     
     	/**
     	 * The type of repositories that are created by this factory.
    -	 * 
    +	 *
     	 * @see SailFactory#getSailType()
     	 */
     	public static final String SAIL_TYPE = "rdf4j:SchemaCachingRDFSInferencer";
    diff --git a/core/sail/inferencer/src/main/java/org/eclipse/rdf4j/sail/inferencer/util/RDFInferencerInserter.java b/core/sail/inferencer/src/main/java/org/eclipse/rdf4j/sail/inferencer/util/RDFInferencerInserter.java
    index ddeb8f54670..d71a6d9598f 100644
    --- a/core/sail/inferencer/src/main/java/org/eclipse/rdf4j/sail/inferencer/util/RDFInferencerInserter.java
    +++ b/core/sail/inferencer/src/main/java/org/eclipse/rdf4j/sail/inferencer/util/RDFInferencerInserter.java
    @@ -36,7 +36,7 @@ public class RDFInferencerInserter extends AbstractRDFInserter {
     	/**
     	 * Creates a new RDFInserter object that preserves bnode IDs and that does not enforce any context upon statements
     	 * that are reported to it.
    -	 * 
    +	 *
     	 * @param con The connection to use for the add operations.
     	 */
     	public RDFInferencerInserter(InferencerConnection con, ValueFactory vf) {
    diff --git a/core/sail/inferencer/src/test/java/org/eclipse/rdf4j/sail/inferencer/fc/CustomGraphQueryInferencerRepositoryConnectionTest.java b/core/sail/inferencer/src/test/java/org/eclipse/rdf4j/sail/inferencer/fc/CustomGraphQueryInferencerRepositoryConnectionTest.java
    index fa1b7a48302..97285686a6e 100644
    --- a/core/sail/inferencer/src/test/java/org/eclipse/rdf4j/sail/inferencer/fc/CustomGraphQueryInferencerRepositoryConnectionTest.java
    +++ b/core/sail/inferencer/src/test/java/org/eclipse/rdf4j/sail/inferencer/fc/CustomGraphQueryInferencerRepositoryConnectionTest.java
    @@ -18,7 +18,6 @@
     import org.eclipse.rdf4j.repository.RepositoryConnectionTest;
     import org.eclipse.rdf4j.repository.sail.SailRepository;
     import org.eclipse.rdf4j.sail.SailException;
    -import org.eclipse.rdf4j.sail.inferencer.fc.CustomGraphQueryInferencer;
     import org.eclipse.rdf4j.sail.memory.MemoryStore;
     
     public class CustomGraphQueryInferencerRepositoryConnectionTest extends RepositoryConnectionTest {
    @@ -34,4 +33,4 @@ protected Repository createRepository()
     				ResourceUtil.getString("/custom-query-inferencing/rule.rq"),
     				ResourceUtil.getString("/custom-query-inferencing/match.rq")));
     	}
    -}
    \ No newline at end of file
    +}
    diff --git a/core/sail/inferencer/src/test/java/org/eclipse/rdf4j/sail/inferencer/fc/NativeStoreInferencingTest.java b/core/sail/inferencer/src/test/java/org/eclipse/rdf4j/sail/inferencer/fc/NativeStoreInferencingTest.java
    index c0a3bee2fdf..e8e1f4faef9 100644
    --- a/core/sail/inferencer/src/test/java/org/eclipse/rdf4j/sail/inferencer/fc/NativeStoreInferencingTest.java
    +++ b/core/sail/inferencer/src/test/java/org/eclipse/rdf4j/sail/inferencer/fc/NativeStoreInferencingTest.java
    @@ -12,7 +12,6 @@
     import org.eclipse.rdf4j.sail.InferencingTest;
     import org.eclipse.rdf4j.sail.NotifyingSail;
     import org.eclipse.rdf4j.sail.Sail;
    -import org.eclipse.rdf4j.sail.inferencer.fc.SchemaCachingRDFSInferencer;
     import org.eclipse.rdf4j.sail.nativerdf.NativeStore;
     import org.junit.Rule;
     import org.junit.rules.TemporaryFolder;
    diff --git a/core/sail/inferencer/src/test/java/org/eclipse/rdf4j/sail/inferencer/fc/RDFSchemaMemoryRepositoryConnectionTest.java b/core/sail/inferencer/src/test/java/org/eclipse/rdf4j/sail/inferencer/fc/RDFSchemaMemoryRepositoryConnectionTest.java
    index 40b43b666cd..522c062dab1 100644
    --- a/core/sail/inferencer/src/test/java/org/eclipse/rdf4j/sail/inferencer/fc/RDFSchemaMemoryRepositoryConnectionTest.java
    +++ b/core/sail/inferencer/src/test/java/org/eclipse/rdf4j/sail/inferencer/fc/RDFSchemaMemoryRepositoryConnectionTest.java
    @@ -11,7 +11,6 @@
     import org.eclipse.rdf4j.repository.RDFSchemaRepositoryConnectionTest;
     import org.eclipse.rdf4j.repository.Repository;
     import org.eclipse.rdf4j.repository.sail.SailRepository;
    -import org.eclipse.rdf4j.sail.inferencer.fc.ForwardChainingRDFSInferencer;
     import org.eclipse.rdf4j.sail.memory.MemoryStore;
     
     public class RDFSchemaMemoryRepositoryConnectionTest extends RDFSchemaRepositoryConnectionTest {
    diff --git a/core/sail/inferencer/src/test/java/org/eclipse/rdf4j/sail/inferencer/fc/RDFSchemaNativeRepositoryConnectionTest.java b/core/sail/inferencer/src/test/java/org/eclipse/rdf4j/sail/inferencer/fc/RDFSchemaNativeRepositoryConnectionTest.java
    index f4970e2b20c..3c5326675c3 100644
    --- a/core/sail/inferencer/src/test/java/org/eclipse/rdf4j/sail/inferencer/fc/RDFSchemaNativeRepositoryConnectionTest.java
    +++ b/core/sail/inferencer/src/test/java/org/eclipse/rdf4j/sail/inferencer/fc/RDFSchemaNativeRepositoryConnectionTest.java
    @@ -15,7 +15,6 @@
     import org.eclipse.rdf4j.repository.RDFSchemaRepositoryConnectionTest;
     import org.eclipse.rdf4j.repository.Repository;
     import org.eclipse.rdf4j.repository.sail.SailRepository;
    -import org.eclipse.rdf4j.sail.inferencer.fc.ForwardChainingRDFSInferencer;
     import org.eclipse.rdf4j.sail.nativerdf.NativeStore;
     
     public class RDFSchemaNativeRepositoryConnectionTest extends RDFSchemaRepositoryConnectionTest {
    diff --git a/core/sail/inferencer/src/test/java/org/eclipse/rdf4j/sail/inferencer/fc/SchemaCachingRDFSInferencerNativeIsolationLevelTest.java b/core/sail/inferencer/src/test/java/org/eclipse/rdf4j/sail/inferencer/fc/SchemaCachingRDFSInferencerNativeIsolationLevelTest.java
    index f7ea4a73526..a4b01fc3ea8 100644
    --- a/core/sail/inferencer/src/test/java/org/eclipse/rdf4j/sail/inferencer/fc/SchemaCachingRDFSInferencerNativeIsolationLevelTest.java
    +++ b/core/sail/inferencer/src/test/java/org/eclipse/rdf4j/sail/inferencer/fc/SchemaCachingRDFSInferencerNativeIsolationLevelTest.java
    @@ -10,10 +10,8 @@
     import java.io.IOException;
     
     import org.eclipse.rdf4j.sail.NotifyingSail;
    -import org.eclipse.rdf4j.sail.Sail;
     import org.eclipse.rdf4j.sail.SailException;
     import org.eclipse.rdf4j.sail.SailIsolationLevelTest;
    -import org.eclipse.rdf4j.sail.memory.MemoryStore;
     import org.eclipse.rdf4j.sail.nativerdf.NativeStore;
     import org.junit.Rule;
     import org.junit.rules.TemporaryFolder;
    diff --git a/core/sail/inferencer/src/test/java/org/eclipse/rdf4j/sail/inferencer/fc/SchemaCachingRDFSInferencerNativeRepositoryConnectionTest.java b/core/sail/inferencer/src/test/java/org/eclipse/rdf4j/sail/inferencer/fc/SchemaCachingRDFSInferencerNativeRepositoryConnectionTest.java
    index 9c0a3566bd8..2903ee07473 100644
    --- a/core/sail/inferencer/src/test/java/org/eclipse/rdf4j/sail/inferencer/fc/SchemaCachingRDFSInferencerNativeRepositoryConnectionTest.java
    +++ b/core/sail/inferencer/src/test/java/org/eclipse/rdf4j/sail/inferencer/fc/SchemaCachingRDFSInferencerNativeRepositoryConnectionTest.java
    @@ -8,8 +8,6 @@
     package org.eclipse.rdf4j.sail.inferencer.fc;
     
     import static org.junit.Assert.assertEquals;
    -import static org.junit.Assert.assertFalse;
    -import static org.junit.Assert.assertTrue;
     
     import java.io.File;
     import java.io.IOException;
    @@ -17,18 +15,13 @@
     
     import org.eclipse.rdf4j.IsolationLevel;
     import org.eclipse.rdf4j.common.io.FileUtil;
    -import org.eclipse.rdf4j.common.iteration.Iterations;
     import org.eclipse.rdf4j.model.IRI;
    -import org.eclipse.rdf4j.model.Resource;
     import org.eclipse.rdf4j.model.Statement;
    -import org.eclipse.rdf4j.model.vocabulary.FOAF;
     import org.eclipse.rdf4j.model.vocabulary.RDF;
     import org.eclipse.rdf4j.model.vocabulary.RDFS;
     import org.eclipse.rdf4j.repository.RDFSchemaRepositoryConnectionTest;
     import org.eclipse.rdf4j.repository.Repository;
    -import org.eclipse.rdf4j.repository.RepositoryResult;
     import org.eclipse.rdf4j.repository.sail.SailRepository;
    -import org.eclipse.rdf4j.sail.inferencer.fc.SchemaCachingRDFSInferencer;
     import org.eclipse.rdf4j.sail.nativerdf.NativeStore;
     import org.junit.Ignore;
     import org.junit.Test;
    diff --git a/core/sail/inferencer/src/test/java/org/eclipse/rdf4j/sail/inferencer/fc/SchemaCachingRDFSInferencerRDFSchemaMemoryRepositoryConnectionTest.java b/core/sail/inferencer/src/test/java/org/eclipse/rdf4j/sail/inferencer/fc/SchemaCachingRDFSInferencerRDFSchemaMemoryRepositoryConnectionTest.java
    index 092c7589415..f6f0482ec9a 100644
    --- a/core/sail/inferencer/src/test/java/org/eclipse/rdf4j/sail/inferencer/fc/SchemaCachingRDFSInferencerRDFSchemaMemoryRepositoryConnectionTest.java
    +++ b/core/sail/inferencer/src/test/java/org/eclipse/rdf4j/sail/inferencer/fc/SchemaCachingRDFSInferencerRDFSchemaMemoryRepositoryConnectionTest.java
    @@ -10,12 +10,10 @@
     import static junit.framework.TestCase.assertTrue;
     import static org.junit.Assert.assertEquals;
     import static org.junit.Assert.assertFalse;
    -import static org.junit.Assert.assertThat;
     
     import java.util.stream.Stream;
     
     import org.eclipse.rdf4j.IsolationLevel;
    -import org.eclipse.rdf4j.common.iteration.Iterations;
     import org.eclipse.rdf4j.model.IRI;
     import org.eclipse.rdf4j.model.Statement;
     import org.eclipse.rdf4j.model.vocabulary.RDF;
    @@ -24,7 +22,6 @@
     import org.eclipse.rdf4j.repository.Repository;
     import org.eclipse.rdf4j.repository.sail.SailRepository;
     import org.eclipse.rdf4j.repository.sail.SailRepositoryConnection;
    -import org.eclipse.rdf4j.sail.inferencer.fc.SchemaCachingRDFSInferencer;
     import org.eclipse.rdf4j.sail.memory.MemoryStore;
     import org.junit.Ignore;
     import org.junit.Test;
    diff --git a/core/sail/lucene-api/pom.xml b/core/sail/lucene-api/pom.xml
    index 1b1c2386e3a..543e9e6b33b 100644
    --- a/core/sail/lucene-api/pom.xml
    +++ b/core/sail/lucene-api/pom.xml
    @@ -4,7 +4,7 @@
     	
     		org.eclipse.rdf4j
     		rdf4j-sail
    -		3.1.5-SNAPSHOT
    +		3.2.2-SNAPSHOT
     	
     	rdf4j-sail-lucene-api
     	RDF4J Lucene Sail API
    diff --git a/core/sail/lucene-api/src/main/java/org/eclipse/rdf4j/sail/lucene/AbstractReaderMonitor.java b/core/sail/lucene-api/src/main/java/org/eclipse/rdf4j/sail/lucene/AbstractReaderMonitor.java
    index 68579e37e82..0f9bcfeebd6 100644
    --- a/core/sail/lucene-api/src/main/java/org/eclipse/rdf4j/sail/lucene/AbstractReaderMonitor.java
    +++ b/core/sail/lucene-api/src/main/java/org/eclipse/rdf4j/sail/lucene/AbstractReaderMonitor.java
    @@ -14,7 +14,7 @@
     /**
      * ReaderMonitor holds IndexReader and IndexSearcher. When ReaderMonitor is closed it do not close IndexReader and
      * IndexSearcher as long as someone reads from them. Variable readingCount remember how many times it was read.
    - * 
    + *
      * @author Tomasz Trela, DFKI Gmbh
      */
     public abstract class AbstractReaderMonitor {
    @@ -37,7 +37,7 @@ public final int getReadingCount() {
     	}
     
     	/**
    -	 * 
    +	 *
     	 */
     	public final synchronized void beginReading() {
     		if (closed.get()) {
    @@ -53,7 +53,7 @@ public final synchronized void beginReading() {
     
     	/**
     	 * called by the iterator
    -	 * 
    +	 *
     	 * @throws IOException
     	 */
     	public final synchronized void endReading() throws IOException {
    @@ -71,7 +71,7 @@ public final synchronized void endReading() throws IOException {
     
     	/**
     	 * This method is called in LecenIndex invalidateReaders or on commit
    -	 * 
    +	 *
     	 * @return true if the close succeeded, false otherwise.
     	 * @throws IOException
     	 */
    @@ -91,7 +91,7 @@ public final void close() throws IOException {
     
     	/**
     	 * This method is thread-safe (i.e. it is not called concurrently).
    -	 * 
    +	 *
     	 * @throws IOException
     	 */
     	protected abstract void handleClose() throws IOException;
    diff --git a/core/sail/lucene-api/src/main/java/org/eclipse/rdf4j/sail/lucene/AbstractSearchIndex.java b/core/sail/lucene-api/src/main/java/org/eclipse/rdf4j/sail/lucene/AbstractSearchIndex.java
    index 1858099b030..ff0c1cb4ac6 100644
    --- a/core/sail/lucene-api/src/main/java/org/eclipse/rdf4j/sail/lucene/AbstractSearchIndex.java
    +++ b/core/sail/lucene-api/src/main/java/org/eclipse/rdf4j/sail/lucene/AbstractSearchIndex.java
    @@ -51,7 +51,7 @@ public abstract class AbstractSearchIndex implements SearchIndex {
     
     	private final ValueFactory vf = SimpleValueFactory.getInstance();
     
    -	private static final Set REJECTED_DATATYPES = new HashSet();
    +	private static final Set REJECTED_DATATYPES = new HashSet<>();
     
     	static {
     		REJECTED_DATATYPES.add("http://www.w3.org/2001/XMLSchema#float");
    @@ -77,19 +77,21 @@ public void initialize(Properties parameters) throws Exception {
     	/**
     	 * Returns whether the provided literal is accepted by the LuceneIndex to be indexed. It for instance does not make
     	 * much since to index xsd:float.
    -	 * 
    +	 *
     	 * @param literal the literal to be accepted
     	 * @return true if the given literal will be indexed by this LuceneIndex
     	 */
     	@Override
     	public boolean accept(Literal literal) {
     		// we reject null literals
    -		if (literal == null)
    +		if (literal == null) {
     			return false;
    +		}
     
     		// we reject literals that are in the list of rejected data types
    -		if ((literal.getDatatype() != null) && (REJECTED_DATATYPES.contains(literal.getDatatype().stringValue())))
    +		if ((literal.getDatatype() != null) && (REJECTED_DATATYPES.contains(literal.getDatatype().stringValue()))) {
     			return false;
    +		}
     
     		return true;
     	}
    @@ -184,7 +186,7 @@ public final synchronized void removeStatement(Statement statement) throws IOExc
     	/**
     	 * Add many statements at the same time, remove many statements at the same time. Ordering by resource has to be
     	 * done inside this method. The passed added/removed sets are disjunct, no statement can be in both
    -	 * 
    +	 *
     	 * @param added   all added statements, can have multiple subjects
     	 * @param removed all removed statements, can have multiple subjects
     	 */
    @@ -246,10 +248,11 @@ public final synchronized void addRemoveStatements(Collection added,
     					updater.add(document);
     
     					// THERE SHOULD BE NO DELETED TRIPLES ON A NEWLY ADDED RESOURCE
    -					if (stmtsToRemove.containsKey(contextId))
    +					if (stmtsToRemove.containsKey(contextId)) {
     						logger.info(
     								"Statements are marked to be removed that should not be in the store, for resource {} and context {}. Nothing done.",
     								resource, contextId);
    +					}
     				} else {
     					// update the Document
     
    @@ -358,7 +361,7 @@ private static int countPropertyValues(SearchDocument document) {
     	/**
     	 * Add a complete Lucene Document based on these statements. Do not search for an existing document with the same
     	 * subject id. (assume the existing document was deleted)
    -	 * 
    +	 *
     	 * @param statements the statements that make up the resource
     	 * @throws IOException
     	 */
    @@ -395,7 +398,7 @@ public final synchronized void addDocuments(Resource subject, List st
     	/**
     	 * check if the passed statement should be added (is it indexed? is it stored?) and add it as predicate to the
     	 * passed document. No checks whether the predicate was already there.
    -	 * 
    +	 *
     	 * @param statement the statement to add
     	 * @param document  the document to add to
     	 */
    @@ -449,7 +452,7 @@ public final Collection evaluate(SearchQueryEvaluator evaluator) thr
     	/**
     	 * Evaluates one Lucene Query. It distinguishes between two cases, the one where no subject is given and the one
     	 * were it is given.
    -	 * 
    +	 *
     	 * @param query the Lucene query to evaluate
     	 * @return QueryResult consisting of hits and highlighter
     	 */
    @@ -481,7 +484,7 @@ private Iterable evaluateQuery(QuerySpec query) {
     
     	/**
     	 * This method generates bindings from the given result of a Lucene query.
    -	 * 
    +	 *
     	 * @param query the Lucene query
     	 * @return a LinkedHashSet containing generated bindings
     	 * @throws SailException
    @@ -522,8 +525,9 @@ private Collection generateBindingSets(QuerySpec query, Iterable generateBindingSets(QuerySpec query, Iterable 0.0f))
    +				if ((scoreVar != null) && (score > 0.0f)) {
     					derivedBindings.addBinding(scoreVar, SearchFields.scoreToLiteral(score));
    +				}
     
     				if (snippetVar != null || propertyVar != null) {
     					if (hit.isHighlighted()) {
    @@ -654,8 +659,9 @@ private Collection generateBindingSets(DistanceQuerySpec query,
     			for (DocumentDistance hit : hits) {
     				// get the current hit
     				SearchDocument doc = hit.getDocument();
    -				if (doc == null)
    +				if (doc == null) {
     					continue;
    +				}
     
     				List geometries = doc.getProperty(SearchFields.getPropertyField(query.getGeoProperty()));
     				for (String geometry : geometries) {
    @@ -753,8 +759,9 @@ private Collection generateBindingSets(GeoRelationQuerySpec query,
     			for (DocumentResult hit : hits) {
     				// get the current hit
     				SearchDocument doc = hit.getDocument();
    -				if (doc == null)
    +				if (doc == null) {
     					continue;
    +				}
     
     				List geometries = doc.getProperty(SearchFields.getPropertyField(query.getGeoProperty()));
     				for (String geometry : geometries) {
    diff --git a/core/sail/lucene-api/src/main/java/org/eclipse/rdf4j/sail/lucene/DistanceQuerySpecBuilder.java b/core/sail/lucene-api/src/main/java/org/eclipse/rdf4j/sail/lucene/DistanceQuerySpecBuilder.java
    index 9a34b9f3ab2..c20cb41e6ca 100644
    --- a/core/sail/lucene-api/src/main/java/org/eclipse/rdf4j/sail/lucene/DistanceQuerySpecBuilder.java
    +++ b/core/sail/lucene-api/src/main/java/org/eclipse/rdf4j/sail/lucene/DistanceQuerySpecBuilder.java
    @@ -167,4 +167,4 @@ private static Object[] getFilterAndDistance(QueryModelNode node, String compare
     		}
     		return rv;
     	}
    -}
    \ No newline at end of file
    +}
    diff --git a/core/sail/lucene-api/src/main/java/org/eclipse/rdf4j/sail/lucene/IndexableStatementFilter.java b/core/sail/lucene-api/src/main/java/org/eclipse/rdf4j/sail/lucene/IndexableStatementFilter.java
    index 5718bf768d3..9c334ba4e5f 100644
    --- a/core/sail/lucene-api/src/main/java/org/eclipse/rdf4j/sail/lucene/IndexableStatementFilter.java
    +++ b/core/sail/lucene-api/src/main/java/org/eclipse/rdf4j/sail/lucene/IndexableStatementFilter.java
    @@ -12,11 +12,11 @@
     /**
      * Specifies a filter, which determines whether a statement should be included in the keyword index when performing
      * complete reindexing. See {@link LuceneSail#registerStatementFilter(IndexableStatementFilter)}.}
    - * 
    + *
      * @author andriy.nikolov
      */
     public interface IndexableStatementFilter {
     
     	public boolean accept(Statement statement);
     
    -}
    \ No newline at end of file
    +}
    diff --git a/core/sail/lucene-api/src/main/java/org/eclipse/rdf4j/sail/lucene/LuceneSailBuffer.java b/core/sail/lucene-api/src/main/java/org/eclipse/rdf4j/sail/lucene/LuceneSailBuffer.java
    index f05d92a6d82..6a97e5b215e 100644
    --- a/core/sail/lucene-api/src/main/java/org/eclipse/rdf4j/sail/lucene/LuceneSailBuffer.java
    +++ b/core/sail/lucene-api/src/main/java/org/eclipse/rdf4j/sail/lucene/LuceneSailBuffer.java
    @@ -21,10 +21,10 @@
     /**
      * A buffer collecting all transaction operations (triples that need to be added, removed, clear operations) so that
      * they can be executed at once during commit.
    - * 
    + *
      * @author sauermann
      * @author andriy.nikolov
    - * 
    + *
      * @deprecated since 3.0. This feature is for internal use only: its existence, signature or behavior may change without
      *             warning from one release to the next.
      */
    @@ -39,8 +39,9 @@ private static class ContextAwareStatementImpl implements Statement {
     		private Statement delegate;
     
     		public ContextAwareStatementImpl(Statement delegate) {
    -			if (delegate == null)
    +			if (delegate == null) {
     				throw new RuntimeException("Trying to add/remove a null statement");
    +			}
     			this.delegate = delegate;
     		}
     
    @@ -66,8 +67,9 @@ public Resource getContext() {
     
     		@Override
     		public boolean equals(Object obj) {
    -			if (this == obj)
    +			if (this == obj) {
     				return true;
    +			}
     			if (obj instanceof Statement) {
     				Statement other = (Statement) obj;
     
    @@ -101,13 +103,15 @@ public static class AddRemoveOperation extends Operation {
     		HashSet removed = new HashSet<>();
     
     		public void add(Statement s) {
    -			if (!removed.remove(s))
    +			if (!removed.remove(s)) {
     				added.add(s);
    +			}
     		}
     
     		public void remove(Statement s) {
    -			if (!added.remove(s))
    +			if (!added.remove(s)) {
     				removed.add(s);
    +			}
     		}
     
     		/**
    @@ -151,7 +155,7 @@ public static class ClearOperation extends Operation {
     
     	/**
     	 * Add this statement to the buffer
    -	 * 
    +	 *
     	 * @param s the statement
     	 */
     	public synchronized void add(Statement s) {
    @@ -167,7 +171,7 @@ public synchronized void add(Statement s) {
     
     	/**
     	 * Remove this statement to the buffer
    -	 * 
    +	 *
     	 * @param s the statement
     	 */
     	public synchronized void remove(Statement s) {
    @@ -182,10 +186,11 @@ public synchronized void remove(Statement s) {
     	}
     
     	public synchronized void clear(Resource[] contexts) {
    -		if ((contexts == null) || (contexts.length == 0))
    +		if ((contexts == null) || (contexts.length == 0)) {
     			operations.add(new ClearOperation());
    -		else
    +		} else {
     			operations.add(new ClearContextOperation(contexts));
    +		}
     	}
     
     	/**
    diff --git a/core/sail/lucene-api/src/main/java/org/eclipse/rdf4j/sail/lucene/LuceneSailConnection.java b/core/sail/lucene-api/src/main/java/org/eclipse/rdf4j/sail/lucene/LuceneSailConnection.java
    index ae2f6bb2ab1..0ed1600e599 100644
    --- a/core/sail/lucene-api/src/main/java/org/eclipse/rdf4j/sail/lucene/LuceneSailConnection.java
    +++ b/core/sail/lucene-api/src/main/java/org/eclipse/rdf4j/sail/lucene/LuceneSailConnection.java
    @@ -115,13 +115,15 @@ public void statementAdded(Statement statement) {
     			// we only consider statements that contain literals
     			if (statement.getObject() instanceof Literal) {
     				statement = sail.mapStatement(statement);
    -				if (statement == null)
    +				if (statement == null) {
     					return;
    +				}
     				// we further only index statements where the Literal's datatype is
     				// accepted
     				Literal literal = (Literal) statement.getObject();
    -				if (luceneIndex.accept(literal))
    +				if (luceneIndex.accept(literal)) {
     					buffer.add(statement);
    +				}
     			}
     		}
     
    @@ -130,13 +132,15 @@ public void statementRemoved(Statement statement) {
     			// we only consider statements that contain literals
     			if (statement.getObject() instanceof Literal) {
     				statement = sail.mapStatement(statement);
    -				if (statement == null)
    +				if (statement == null) {
     					return;
    +				}
     				// we further only indexed statements where the Literal's datatype
     				// is accepted
     				Literal literal = (Literal) statement.getObject();
    -				if (luceneIndex.accept(literal))
    +				if (luceneIndex.accept(literal)) {
     					buffer.remove(statement);
    +				}
     			}
     		}
     	};
    diff --git a/core/sail/lucene-api/src/main/java/org/eclipse/rdf4j/sail/lucene/LuceneSailSchema.java b/core/sail/lucene-api/src/main/java/org/eclipse/rdf4j/sail/lucene/LuceneSailSchema.java
    index 91075f061d8..f89c7c0b299 100644
    --- a/core/sail/lucene-api/src/main/java/org/eclipse/rdf4j/sail/lucene/LuceneSailSchema.java
    +++ b/core/sail/lucene-api/src/main/java/org/eclipse/rdf4j/sail/lucene/LuceneSailSchema.java
    @@ -47,7 +47,7 @@ public class LuceneSailSchema {
     
     	static {
     		ValueFactory factory = SimpleValueFactory.getInstance(); // compatible with beta4:
    -																	// creating a new factory
    +		// creating a new factory
     		LUCENE_QUERY = factory.createIRI(NAMESPACE + "LuceneQuery");
     		SCORE = factory.createIRI(NAMESPACE + "score");
     		QUERY = factory.createIRI(NAMESPACE + "query");
    diff --git a/core/sail/lucene-api/src/main/java/org/eclipse/rdf4j/sail/lucene/QuerySpec.java b/core/sail/lucene-api/src/main/java/org/eclipse/rdf4j/sail/lucene/QuerySpec.java
    index 52331a8377f..23f41f9db50 100644
    --- a/core/sail/lucene-api/src/main/java/org/eclipse/rdf4j/sail/lucene/QuerySpec.java
    +++ b/core/sail/lucene-api/src/main/java/org/eclipse/rdf4j/sail/lucene/QuerySpec.java
    @@ -123,7 +123,7 @@ public QueryModelNode removeQueryPatterns() {
     
     	/**
     	 * Replace the given pattern with a new instance of the given replacement type.
    -	 * 
    +	 *
     	 * @param pattern     the pattern to remove
     	 * @param replacement the replacement type
     	 */
    @@ -139,7 +139,7 @@ public StatementPattern getMatchesPattern() {
     
     	/**
     	 * return the name of the bound variable that should match the query
    -	 * 
    +	 *
     	 * @return the name of the variable or null, if no name set
     	 */
     	public String getMatchesVariableName() {
    @@ -164,7 +164,7 @@ public StatementPattern getScorePattern() {
     
     	/**
     	 * The variable name associated with the query score
    -	 * 
    +	 *
     	 * @return the name or null, if no score is queried in the pattern
     	 */
     	public String getScoreVariableName() {
    @@ -185,14 +185,15 @@ public StatementPattern getTypePattern() {
     
     	/**
     	 * the type of query, must equal {@link LuceneSailSchema#LUCENE_QUERY}. A null type is possible, but not valid.
    -	 * 
    +	 *
     	 * @return the type of the Query or null, if no type assigned.
     	 */
     	public IRI getQueryType() {
    -		if (typePattern != null)
    +		if (typePattern != null) {
     			return (IRI) typePattern.getObjectVar().getValue();
    -		else
    +		} else {
     			return null;
    +		}
     	}
     
     	public Resource getSubject() {
    @@ -201,7 +202,7 @@ public Resource getSubject() {
     
     	/**
     	 * return the literal expression of the query or null, if none set. (null values are possible, but not valid).
    -	 * 
    +	 *
     	 * @return the query or null
     	 */
     	public String getQueryString() {
    @@ -238,8 +239,9 @@ public String toString() {
     	}
     
     	private void append(StatementPattern pattern, StringBuilder buffer) {
    -		if (pattern == null)
    +		if (pattern == null) {
     			return;
    +		}
     
     		buffer.append("   ");
     		buffer.append("StatementPattern\n");
    diff --git a/core/sail/lucene-api/src/main/java/org/eclipse/rdf4j/sail/lucene/QuerySpecBuilder.java b/core/sail/lucene-api/src/main/java/org/eclipse/rdf4j/sail/lucene/QuerySpecBuilder.java
    index 34a2ff6483c..9d3c87cdc29 100644
    --- a/core/sail/lucene-api/src/main/java/org/eclipse/rdf4j/sail/lucene/QuerySpecBuilder.java
    +++ b/core/sail/lucene-api/src/main/java/org/eclipse/rdf4j/sail/lucene/QuerySpecBuilder.java
    @@ -251,8 +251,9 @@ private StatementPattern getPattern(Var subjectVar, ArrayList
     			}
     		}
     		// remove the result from the list, to filter out superflous patterns
    -		if (result != null)
    +		if (result != null) {
     			patterns.remove(result);
    +		}
     		return result;
     	}
     
    @@ -296,4 +297,4 @@ public void meet(StatementPattern node) {
     			}
     		}
     	}
    -}
    \ No newline at end of file
    +}
    diff --git a/core/sail/lucene-api/src/main/java/org/eclipse/rdf4j/sail/lucene/SearchFields.java b/core/sail/lucene-api/src/main/java/org/eclipse/rdf4j/sail/lucene/SearchFields.java
    index 70512fb0caa..bdc6c492d63 100644
    --- a/core/sail/lucene-api/src/main/java/org/eclipse/rdf4j/sail/lucene/SearchFields.java
    +++ b/core/sail/lucene-api/src/main/java/org/eclipse/rdf4j/sail/lucene/SearchFields.java
    @@ -86,20 +86,21 @@ public static String getResourceID(Resource resource) {
     
     	/**
     	 * Get the ID for a context. Context can be null, then the "null" string is returned
    -	 * 
    +	 *
     	 * @param resource the context
     	 * @return a string
     	 */
     	public static String getContextID(Resource resource) {
    -		if (resource == null)
    +		if (resource == null) {
     			return CONTEXT_NULL;
    -		else
    +		} else {
     			return getResourceID(resource);
    +		}
     	}
     
     	/**
     	 * Parses an id-string (a serialized resource) back to a resource Inverse method of {@link #getResourceID(Resource)}
    -	 * 
    +	 *
     	 * @param idString
     	 * @return resource
     	 */
    @@ -151,7 +152,7 @@ public static String formIdString(String resourceId, String contextId) {
     
     	/**
     	 * Returns a score value encoded as a Literal.
    -	 * 
    +	 *
     	 * @param score the float score to convert
     	 * @return the score as a literal
     	 */
    diff --git a/core/sail/lucene-api/src/main/java/org/eclipse/rdf4j/sail/lucene/SearchIndex.java b/core/sail/lucene-api/src/main/java/org/eclipse/rdf4j/sail/lucene/SearchIndex.java
    index 5d4ac71b846..b569725593b 100644
    --- a/core/sail/lucene-api/src/main/java/org/eclipse/rdf4j/sail/lucene/SearchIndex.java
    +++ b/core/sail/lucene-api/src/main/java/org/eclipse/rdf4j/sail/lucene/SearchIndex.java
    @@ -21,7 +21,7 @@
     /**
      * A SearchIndex is a one-stop-shop abstraction of a Lucene index. It takes care of proper synchronization of
      * IndexReaders, IndexWriters and IndexSearchers in a way that is suitable for a LuceneSail.
    - * 
    + *
      * @see LuceneSail
      */
     public interface SearchIndex {
    @@ -47,7 +47,7 @@ public interface SearchIndex {
     	/**
     	 * Returns whether the provided literal is accepted by the LuceneIndex to be indexed. It for instance does not make
     	 * much since to index xsd:float.
    -	 * 
    +	 *
     	 * @param literal the literal to be accepted
     	 * @return true if the given literal will be indexed by this LuceneIndex
     	 */
    @@ -55,7 +55,7 @@ public interface SearchIndex {
     
     	/**
     	 * Returns true if the given property contains a geometry.
    -	 * 
    +	 *
     	 * @param propertyName
     	 * @return boolean
     	 */
    @@ -63,7 +63,7 @@ public interface SearchIndex {
     
     	/**
     	 * Begins a transaction.
    -	 * 
    +	 *
     	 * @throws java.io.IOException
     	 */
     	void begin() throws IOException;
    @@ -72,7 +72,7 @@ public interface SearchIndex {
     	 * Commits any changes done to the LuceneIndex since the last commit.The semantics is synchronous to
     	 * SailConnection.commit(), i.e. the LuceneIndex should be committed/rollbacked whenever the LuceneSailConnection is
     	 * committed/rollbacked.
    -	 * 
    +	 *
     	 * @throws IOException
     	 */
     	void commit() throws IOException;
    @@ -81,7 +81,7 @@ public interface SearchIndex {
     
     	/**
     	 * Indexes the specified Statement.This should be called from within a begin-commit-rollback block.
    -	 * 
    +	 *
     	 * @param statement
     	 * @throws IOException
     	 */
    @@ -89,9 +89,9 @@ public interface SearchIndex {
     
     	/**
     	 * Removes the specified Statement from the indexes.This should be called from within a begin-commit-rollback
    -	 * 
    +	 *
     	 * block.
    -	 * 
    +	 *
     	 * @param statement
     	 */
     	void removeStatement(Statement statement) throws IOException;
    @@ -100,7 +100,7 @@ public interface SearchIndex {
     	 * Add many statements at the same time, remove many statements at the same time.Ordering by resource has to be done
     	 * inside this method. The passed added/removed sets are disjunct, no statement can be in both. This should be
     	 * called from within a begin-commit-rollback block.
    -	 * 
    +	 *
     	 * @param added   all added statements, can have multiple subjects
     	 * @param removed all removed statements, can have multiple subjects
     	 * @throws IOException
    @@ -109,7 +109,7 @@ public interface SearchIndex {
     
     	/**
     	 * This should be called from within a begin-commit-rollback block.
    -	 * 
    +	 *
     	 * @param contexts
     	 * @throws IOException
     	 */
    @@ -119,7 +119,7 @@ public interface SearchIndex {
     	 * Add a complete Lucene Document based on these statements.Do not search for an existing document with the same
     	 * subject id. (assume the existing document was deleted). This should be called from within a begin-commit-rollback
     	 * block.
    -	 * 
    +	 *
     	 * @param subject
     	 * @param statements the statements that make up the resource
     	 * @throws IOException
    @@ -128,7 +128,7 @@ public interface SearchIndex {
     
     	/**
     	 * Clears the indexes.
    -	 * 
    +	 *
     	 * @throws java.io.IOException
     	 */
     	void clear() throws IOException;
    diff --git a/core/sail/lucene-api/src/main/java/org/eclipse/rdf4j/sail/lucene/SearchQueryInterpreter.java b/core/sail/lucene-api/src/main/java/org/eclipse/rdf4j/sail/lucene/SearchQueryInterpreter.java
    index 77b730960fc..e45fdadaa5c 100644
    --- a/core/sail/lucene-api/src/main/java/org/eclipse/rdf4j/sail/lucene/SearchQueryInterpreter.java
    +++ b/core/sail/lucene-api/src/main/java/org/eclipse/rdf4j/sail/lucene/SearchQueryInterpreter.java
    @@ -17,7 +17,7 @@ public interface SearchQueryInterpreter {
     
     	/**
     	 * Processes a TupleExpr into a set of SearchQueryEvaluators.
    -	 * 
    +	 *
     	 * @param tupleExpr the TupleExpr to process.
     	 * @param bindings  any bindings.
     	 * @param specs     the Collection to add any SearchQueryEvaluators to.
    diff --git a/core/sail/lucene-api/src/main/java/org/eclipse/rdf4j/sail/lucene/config/AbstractLuceneSailConfig.java b/core/sail/lucene-api/src/main/java/org/eclipse/rdf4j/sail/lucene/config/AbstractLuceneSailConfig.java
    index d3ab4c90998..ba9a3a6fdbc 100644
    --- a/core/sail/lucene-api/src/main/java/org/eclipse/rdf4j/sail/lucene/config/AbstractLuceneSailConfig.java
    +++ b/core/sail/lucene-api/src/main/java/org/eclipse/rdf4j/sail/lucene/config/AbstractLuceneSailConfig.java
    @@ -99,11 +99,11 @@ public Resource export(Model m) {
     	public void parse(Model graph, Resource implNode) throws SailConfigException {
     		super.parse(graph, implNode);
     
    -		Literal indexDirLit = Models.objectLiteral(graph.filter(implNode, INDEX_DIR, null))
    +		Literal indexDirLit = Models.objectLiteral(graph.getStatements(implNode, INDEX_DIR, null))
     				.orElseThrow(() -> new SailConfigException("no value found for " + INDEX_DIR));
     
     		setIndexDir(indexDirLit.getLabel());
    -		for (Statement stmt : graph.filter(implNode, null, null)) {
    +		for (Statement stmt : graph.getStatements(implNode, null, null)) {
     			if (stmt.getPredicate().getNamespace().equals(LuceneSailConfigSchema.NAMESPACE)) {
     				if (stmt.getObject() instanceof Literal) {
     					String key = stmt.getPredicate().getLocalName();
    diff --git a/core/sail/lucene-api/src/main/java/org/eclipse/rdf4j/sail/lucene/util/MapOfListMaps.java b/core/sail/lucene-api/src/main/java/org/eclipse/rdf4j/sail/lucene/util/MapOfListMaps.java
    index a75992af36f..37618a89af3 100644
    --- a/core/sail/lucene-api/src/main/java/org/eclipse/rdf4j/sail/lucene/util/MapOfListMaps.java
    +++ b/core/sail/lucene-api/src/main/java/org/eclipse/rdf4j/sail/lucene/util/MapOfListMaps.java
    @@ -17,7 +17,7 @@
     
     /**
      * @author andriy.nikolov
    - * 
    + *
      * @deprecated since 3.0. This feature is for internal use only: its existence, signature or behavior may change without
      *             warning from one release to the next.
      */
    @@ -28,7 +28,7 @@ public class MapOfListMaps {
     	private final Map>> data;
     
     	/**
    -	 * 
    +	 *
     	 */
     	public MapOfListMaps() {
     		data = new HashMap<>();
    @@ -38,8 +38,9 @@ public List get(Index1Type key1, Index2Type key2) {
     		Map> intermediateMap = data.get(key1);
     		if (intermediateMap != null) {
     			List tmp = intermediateMap.get(key2);
    -			if (tmp != null)
    +			if (tmp != null) {
     				return tmp;
    +			}
     		}
     		return Collections.emptyList();
     	}
    @@ -76,4 +77,4 @@ public void add(Index1Type key1, Index2Type key2, DataType value) {
     	public String toString() {
     		return data.toString();
     	}
    -}
    \ No newline at end of file
    +}
    diff --git a/core/sail/lucene-api/src/main/java/org/eclipse/rdf4j/sail/lucene/util/SearchIndexUtils.java b/core/sail/lucene-api/src/main/java/org/eclipse/rdf4j/sail/lucene/util/SearchIndexUtils.java
    index f103bbce5aa..3157e97a959 100644
    --- a/core/sail/lucene-api/src/main/java/org/eclipse/rdf4j/sail/lucene/util/SearchIndexUtils.java
    +++ b/core/sail/lucene-api/src/main/java/org/eclipse/rdf4j/sail/lucene/util/SearchIndexUtils.java
    @@ -17,7 +17,7 @@
     
     /**
      * This is utility class with tool useful for manipulation on the {@link SearchIndex}.
    - * 
    + *
      * @author jacek grzebyta
      * @version 2.3
      */
    diff --git a/core/sail/lucene-api/src/test/java/org/eclipse/rdf4j/sail/lucene/QuerySpecBuilderTest.java b/core/sail/lucene-api/src/test/java/org/eclipse/rdf4j/sail/lucene/QuerySpecBuilderTest.java
    index ab9ae981619..f3510c76327 100644
    --- a/core/sail/lucene-api/src/test/java/org/eclipse/rdf4j/sail/lucene/QuerySpecBuilderTest.java
    +++ b/core/sail/lucene-api/src/test/java/org/eclipse/rdf4j/sail/lucene/QuerySpecBuilderTest.java
    @@ -117,13 +117,16 @@ public void testMultipleQueriesInterpretation() throws Exception {
     				assertEquals("second lucene query", querySpec.getQueryString());
     				assertNull(querySpec.getSubject());
     				matched2 = true;
    -			} else
    +			} else {
     				fail("Found unexpected query spec: " + querySpec.toString());
    +			}
     		}
    -		if (!matched1)
    +		if (!matched1) {
     			fail("did not find query patter sub1");
    -		if (!matched2)
    +		}
    +		if (!matched2) {
     			fail("did not find query patter sub2");
    +		}
     	}
     
     	/**
    diff --git a/core/sail/lucene-spin/pom.xml b/core/sail/lucene-spin/pom.xml
    index 6481ee75b66..6adae223063 100644
    --- a/core/sail/lucene-spin/pom.xml
    +++ b/core/sail/lucene-spin/pom.xml
    @@ -4,7 +4,7 @@
     	
     		rdf4j-sail
     		org.eclipse.rdf4j
    -		3.1.5-SNAPSHOT
    +		3.2.2-SNAPSHOT
     	
     	rdf4j-lucene-spin
     	RDF4J Lucene Sail Spin
    diff --git a/core/sail/lucene-spin/src/main/java/org/eclipse/rdf4j/lucene/spin/LuceneSpinSail.java b/core/sail/lucene-spin/src/main/java/org/eclipse/rdf4j/lucene/spin/LuceneSpinSail.java
    index ea170d3044c..413beaaa1b7 100644
    --- a/core/sail/lucene-spin/src/main/java/org/eclipse/rdf4j/lucene/spin/LuceneSpinSail.java
    +++ b/core/sail/lucene-spin/src/main/java/org/eclipse/rdf4j/lucene/spin/LuceneSpinSail.java
    @@ -42,7 +42,7 @@
      * connection from baseSail by wrapped which modify SearchIndex.
      *
      * @author jacek grzebyta
    - * 
    + *
      * @deprecated since 3.0. The experimental LuceneSpinSail is scheduled to be removed by the next major release.
      */
     @Deprecated
    @@ -76,7 +76,7 @@ public Properties getParameters() {
     	 * By default parameters field is instantiated in constructor. Using this method replaces the existing field. If you
     	 * wish only add missing parameters use {@link #addAbsentParameters(java.util.Properties)}.
     	 * 

    - * + * * @param parameters */ public void setParameters(Properties parameters) { @@ -85,7 +85,7 @@ public void setParameters(Properties parameters) { /** * Add only absent parameters from argument. - * + * * @see Properties#putIfAbsent(java.lang.Object, java.lang.Object) * @param parameters */ @@ -99,9 +99,9 @@ public void addAbsentParameters(Properties parameters) { * Creates absolute path to Lucene Index. If the properties contains no absolute path to lucene index than it is * created here. The generic pattern of lisp-like pseudocode in that case is:
    * - * (Paths/get (absolute datadir) + (or (getProperty parameters LuceneSail/LUCENE_DIR_KEY) "index/")) - * - * + * (Paths/get (absolute datadir) + (or (getProperty parameters LuceneSail/LUCENE_DIR_KEY) "index/")) + *
    + * * @return */ private Path getAbsoluteLuceneIndexDir() { @@ -173,7 +173,7 @@ public NotifyingSailConnection getConnection() throws SailException { /** * Copy of {@link LuceneSail#mapStatement(org.eclipse.rdf4j.model.Statement) } - * + * * @param statement * @return */ diff --git a/core/sail/lucene-spin/src/main/java/org/eclipse/rdf4j/lucene/spin/LuceneSpinSailConnection.java b/core/sail/lucene-spin/src/main/java/org/eclipse/rdf4j/lucene/spin/LuceneSpinSailConnection.java index 7ca78ce177b..b8066d1d3c1 100644 --- a/core/sail/lucene-spin/src/main/java/org/eclipse/rdf4j/lucene/spin/LuceneSpinSailConnection.java +++ b/core/sail/lucene-spin/src/main/java/org/eclipse/rdf4j/lucene/spin/LuceneSpinSailConnection.java @@ -33,11 +33,11 @@ /** * This connection inherits Lucene index supporting methods from {@link LuceneSailConnection}. - * + * * @author sauermann * @author christian.huetter * @author jacek grzebyta - * + * * @deprecated since 3.0. The experimental LuceneSpinSail is scheduled to be removed by the next major release. */ @Deprecated @@ -75,8 +75,9 @@ public void statementAdded(Statement statement) { // we further only index statements where the Literal's datatype is // accepted Literal literal = (Literal) statement.getObject(); - if (luceneIndex.accept(literal)) + if (luceneIndex.accept(literal)) { buffer.add(statement); + } } } @@ -93,8 +94,9 @@ public void statementRemoved(Statement statement) { // we further only indexed statements where the Literal's datatype // is accepted Literal literal = (Literal) statement.getObject(); - if (luceneIndex.accept(literal)) + if (luceneIndex.accept(literal)) { buffer.remove(statement); + } } } }; diff --git a/core/sail/lucene-spin/src/main/java/org/eclipse/rdf4j/lucene/spin/config/package-info.java b/core/sail/lucene-spin/src/main/java/org/eclipse/rdf4j/lucene/spin/config/package-info.java index 7a764bdc7d1..05cd997de04 100644 --- a/core/sail/lucene-spin/src/main/java/org/eclipse/rdf4j/lucene/spin/config/package-info.java +++ b/core/sail/lucene-spin/src/main/java/org/eclipse/rdf4j/lucene/spin/config/package-info.java @@ -2,7 +2,7 @@ @Experimental /** * The Lucene SPIN Sail - configuration - * + * * @deprecated since 3.0. This prototype Sail implementation will be removed in a future major release of RDF4J. */ package org.eclipse.rdf4j.lucene.spin.config; diff --git a/core/sail/lucene-spin/src/main/java/org/eclipse/rdf4j/lucene/spin/package-info.java b/core/sail/lucene-spin/src/main/java/org/eclipse/rdf4j/lucene/spin/package-info.java index 2c3bfc8edae..efba9cc2e89 100644 --- a/core/sail/lucene-spin/src/main/java/org/eclipse/rdf4j/lucene/spin/package-info.java +++ b/core/sail/lucene-spin/src/main/java/org/eclipse/rdf4j/lucene/spin/package-info.java @@ -2,7 +2,7 @@ @Experimental /** * The Lucene SPIN Sail - * + * * @deprecated since 3.0. This prototype Sail implementation will be removed in a future major release of RDF4J. */ package org.eclipse.rdf4j.lucene.spin; diff --git a/core/sail/lucene-spin/src/main/java/org/eclipse/rdf4j/sail/lucene/fn/DistanceTupleFunction.java b/core/sail/lucene-spin/src/main/java/org/eclipse/rdf4j/sail/lucene/fn/DistanceTupleFunction.java index f24be6b211e..1b40b9e8663 100644 --- a/core/sail/lucene-spin/src/main/java/org/eclipse/rdf4j/sail/lucene/fn/DistanceTupleFunction.java +++ b/core/sail/lucene-spin/src/main/java/org/eclipse/rdf4j/sail/lucene/fn/DistanceTupleFunction.java @@ -47,7 +47,7 @@ *
  • distance is the distance to the shape if search:distance is present.
  • *
  • context is the context if search:context is present.
  • * - * + * * @deprecated since 3.0. The LuceneSpinSail is to removed in the next major release. */ @Deprecated diff --git a/core/sail/lucene-spin/src/main/java/org/eclipse/rdf4j/sail/lucene/fn/QueryTupleFunction.java b/core/sail/lucene-spin/src/main/java/org/eclipse/rdf4j/sail/lucene/fn/QueryTupleFunction.java index da4f806a813..bfe774910b2 100644 --- a/core/sail/lucene-spin/src/main/java/org/eclipse/rdf4j/sail/lucene/fn/QueryTupleFunction.java +++ b/core/sail/lucene-spin/src/main/java/org/eclipse/rdf4j/sail/lucene/fn/QueryTupleFunction.java @@ -47,7 +47,7 @@ *
  • score is included if the scorePredicate is search:score else omitted.
  • *
  • snippet is included if the snippetPredicate is search:snippet else omitted.
  • * - * + * * @deprecated since 3.0. The LucenSpinSail is to be removed in the next major release. */ @Deprecated diff --git a/core/sail/lucene-spin/src/test/java/org/eclipse/rdf4j/lucene/spin/AbstractLuceneSailSpinTest.java b/core/sail/lucene-spin/src/test/java/org/eclipse/rdf4j/lucene/spin/AbstractLuceneSailSpinTest.java index cdd32356d33..48d0efb4588 100644 --- a/core/sail/lucene-spin/src/test/java/org/eclipse/rdf4j/lucene/spin/AbstractLuceneSailSpinTest.java +++ b/core/sail/lucene-spin/src/test/java/org/eclipse/rdf4j/lucene/spin/AbstractLuceneSailSpinTest.java @@ -215,18 +215,18 @@ public void testDistanceFunction() throws Exception { * prefix t: * prefix kw: * - * select ?term_string ?sub ?score where { - * (?term_string search:allMaches search:score) search:search (?sub ?score) . - * ?sub a t:Data . - * { select ?term_string where - * { - * ?pred_map rdfs:label "keyWord" ; - * t:column ?pred . - * [] ?pred ?term . - * bind(str(?term) as ?term_string) . - * } + * select ?term_string ?sub ?score where { + * (?term_string search:allMaches search:score) search:search (?sub ?score) . + * ?sub a t:Data . + * { select ?term_string where + * { + * ?pred_map rdfs:label "keyWord" ; + * t:column ?pred . + * [] ?pred ?term . + * bind(str(?term) as ?term_string) . + * } * } - * } + * } * * * @throws Exception diff --git a/core/sail/lucene-spin/src/test/java/org/eclipse/rdf4j/lucene/spin/LuceneMemoryStoreTest.java b/core/sail/lucene-spin/src/test/java/org/eclipse/rdf4j/lucene/spin/LuceneMemoryStoreTest.java index cb56084793a..988ea3eccc7 100644 --- a/core/sail/lucene-spin/src/test/java/org/eclipse/rdf4j/lucene/spin/LuceneMemoryStoreTest.java +++ b/core/sail/lucene-spin/src/test/java/org/eclipse/rdf4j/lucene/spin/LuceneMemoryStoreTest.java @@ -33,7 +33,7 @@ /** * Run unit test from {@link AbstractLuceneSailSpinTest} using {@link MemoryStore}. - * + * * @author Jacek Grzebyta * @author Mark Hale */ diff --git a/core/sail/lucene-spin/src/test/java/org/eclipse/rdf4j/lucene/spin/LuceneNativeStoreTest.java b/core/sail/lucene-spin/src/test/java/org/eclipse/rdf4j/lucene/spin/LuceneNativeStoreTest.java index 295d31fcb20..9aba0e17a13 100644 --- a/core/sail/lucene-spin/src/test/java/org/eclipse/rdf4j/lucene/spin/LuceneNativeStoreTest.java +++ b/core/sail/lucene-spin/src/test/java/org/eclipse/rdf4j/lucene/spin/LuceneNativeStoreTest.java @@ -33,7 +33,7 @@ /** * Run unit test from {@link AbstractLuceneSailSpinTest} using {@link NativeStore}. - * + * * @author Jacek Grzebyta * @author Mark Hale */ diff --git a/core/sail/lucene-spin/src/test/java/org/eclipse/rdf4j/lucene/spin/LuceneSailTupleFunctionTest.java b/core/sail/lucene-spin/src/test/java/org/eclipse/rdf4j/lucene/spin/LuceneSailTupleFunctionTest.java index dce875b1009..21eed45ef07 100644 --- a/core/sail/lucene-spin/src/test/java/org/eclipse/rdf4j/lucene/spin/LuceneSailTupleFunctionTest.java +++ b/core/sail/lucene-spin/src/test/java/org/eclipse/rdf4j/lucene/spin/LuceneSailTupleFunctionTest.java @@ -259,7 +259,7 @@ public void test220Issue() throws Exception { * construct { * ?pred a . * ?pred ?label . - * ?pred ?score . + * ?pred ?score . * } where { * ?pred search:matches[ * search:query "ornare"; diff --git a/core/sail/lucene/pom.xml b/core/sail/lucene/pom.xml index 5edcd2a40a2..c93d8320dbb 100644 --- a/core/sail/lucene/pom.xml +++ b/core/sail/lucene/pom.xml @@ -4,7 +4,7 @@ org.eclipse.rdf4j rdf4j-sail - 3.1.5-SNAPSHOT + 3.2.2-SNAPSHOT rdf4j-sail-lucene RDF4J Lucene Sail Index diff --git a/core/sail/lucene/src/main/java/org/eclipse/rdf4j/sail/lucene/LuceneDocument.java b/core/sail/lucene/src/main/java/org/eclipse/rdf4j/sail/lucene/LuceneDocument.java index 0879792d1bf..98c4876610f 100644 --- a/core/sail/lucene/src/main/java/org/eclipse/rdf4j/sail/lucene/LuceneDocument.java +++ b/core/sail/lucene/src/main/java/org/eclipse/rdf4j/sail/lucene/LuceneDocument.java @@ -88,8 +88,9 @@ public Set getPropertyNames() { Set names = new HashSet<>(); for (IndexableField field : fields) { String name = field.name(); - if (SearchFields.isPropertyField(name)) + if (SearchFields.isPropertyField(name)) { names.add(name); + } } return names; } @@ -104,7 +105,7 @@ public void addProperty(String name) { * TEXT field and Lucene will take care of this. Additional advantage: Lucene may be able to handle the invididual * strings in a way that may affect e.g. phrase and proximity searches (concatenation basically means loss of * information). NOTE: The TEXT_FIELD_NAME has to be stored, see in LuceneSail - * + * * @see LuceneSail */ @Override diff --git a/core/sail/lucene/src/main/java/org/eclipse/rdf4j/sail/lucene/LuceneDocumentScore.java b/core/sail/lucene/src/main/java/org/eclipse/rdf4j/sail/lucene/LuceneDocumentScore.java index 36b13c062be..f1ff715a135 100644 --- a/core/sail/lucene/src/main/java/org/eclipse/rdf4j/sail/lucene/LuceneDocumentScore.java +++ b/core/sail/lucene/src/main/java/org/eclipse/rdf4j/sail/lucene/LuceneDocumentScore.java @@ -14,7 +14,6 @@ import org.apache.lucene.search.ScoreDoc; import org.apache.lucene.search.highlight.Highlighter; -import com.google.common.base.Function; import com.google.common.collect.Iterables; public class LuceneDocumentScore extends LuceneDocumentResult implements DocumentScore { diff --git a/core/sail/lucene/src/main/java/org/eclipse/rdf4j/sail/lucene/LuceneIndex.java b/core/sail/lucene/src/main/java/org/eclipse/rdf4j/sail/lucene/LuceneIndex.java index f10eb37bc54..7ec773d9419 100644 --- a/core/sail/lucene/src/main/java/org/eclipse/rdf4j/sail/lucene/LuceneIndex.java +++ b/core/sail/lucene/src/main/java/org/eclipse/rdf4j/sail/lucene/LuceneIndex.java @@ -92,7 +92,7 @@ /** * A LuceneIndex is a one-stop-shop abstraction of a Lucene index. It takes care of proper synchronization of * IndexReaders, IndexWriters and IndexSearchers in a way that is suitable for a LuceneSail. - * + * * @see LuceneSail */ public class LuceneIndex extends AbstractLuceneIndex { @@ -140,7 +140,7 @@ public LuceneIndex() { /** * Constructor for keeping backwards compatibility. - * + * * @param directory * @param analyzer */ @@ -150,7 +150,7 @@ public LuceneIndex(Directory directory, Analyzer analyzer) throws IOException { /** * Creates a new LuceneIndex. - * + * * @param directory The Directory in which an index can be found and/or in which index files are written. * @param analyzer The Analyzer that will be used for tokenizing strings to index and queries. * @param similarity The Similarity that will be used for scoring. @@ -499,7 +499,7 @@ private static void addDocuments(LeafReader reader, Term term, Collection getDocuments(Resource subject) throws IOExcep /** * Stores and indexes an ID in a Document. - * + * * @param id * @param document */ @@ -540,7 +540,7 @@ public static void addIDField(String id, Document document) { /** * Add the "context" value to the doc - * + * * @param context the context or null, if null-context * @param document the document */ @@ -552,7 +552,7 @@ public static void addContextField(String context, Document document) { /** * Stores and indexes the resource ID in a Document. - * + * * @param resourceId * @param document */ @@ -578,7 +578,7 @@ public static void addTextField(String text, Document document) { /** * invalidate readers, free them if possible (readers that are still open by a {@link LuceneQueryConnection} will * not be closed. Synchronized on oldmonitors because it manipulates them - * + * * @throws IOException */ private void invalidateReaders() throws IOException { @@ -629,14 +629,16 @@ private void logIndexStats() { String[] idArray; int count = 0; for (int i = 0; i < reader.maxDoc(); i++) { - if (isDeleted(reader, i)) + if (isDeleted(reader, i)) { continue; + } doc = readDocument(reader, i, null); totalFields += doc.getFields().size(); count++; idArray = doc.getValues("id"); - for (String id : idArray) + for (String id : idArray) { ids.add(id); + } } @@ -685,7 +687,7 @@ public synchronized void rollback() throws IOException { /** * Parse the passed query. To be removed, no longer used. - * + * * @param query string * @return the parsed query * @throws ParseException when the parsing brakes @@ -704,7 +706,7 @@ protected SearchQuery parseQuery(String query, IRI propertyURI) throws Malformed /** * Parse the passed query. - * + * * @param query string * @return the parsed query * @throws ParseException when the parsing brakes @@ -824,7 +826,7 @@ private SpatialOperation toSpatialOp(String relation) { /** * Returns the lucene hit with the given id of the respective lucene query - * + * * @param docId the id of the document to return * @param fieldsToLoad * @return the requested hit, or null if it fails @@ -871,7 +873,7 @@ public synchronized String getSnippet(String fieldName, String text, Highlighter /** * Evaluates the given query only for the given resource. - * + * * @param resource * @param query * @return top documents @@ -888,7 +890,7 @@ public synchronized TopDocs search(Resource resource, Query query) throws IOExce /** * Evaluates the given query and returns the results as a TopDocs instance. - * + * * @param query * @return top documents * @throws IOException @@ -906,14 +908,17 @@ public synchronized TopDocs search(Query query) throws IOException { private QueryParser getQueryParser(IRI propertyURI) { // check out which query parser to use, based on the given property URI if (propertyURI == null) - // if we have no property given, we create a default query parser - // which - // has the TEXT_FIELD_NAME as the default field + // if we have no property given, we create a default query parser + // which + // has the TEXT_FIELD_NAME as the default field + { return new QueryParser(SearchFields.TEXT_FIELD_NAME, this.queryAnalyzer); - else - // otherwise we create a query parser that has the given property as - // the default field + } else + // otherwise we create a query parser that has the given property as + // the default field + { return new QueryParser(SearchFields.getPropertyField(propertyURI), this.queryAnalyzer); + } } /** @@ -1008,7 +1013,7 @@ public synchronized void clearContexts(Resource... contexts) throws IOException } /** - * + * */ @Override public synchronized void clear() throws IOException { @@ -1018,8 +1023,9 @@ public synchronized void clear() throws IOException { // clear // the old IndexReaders/Searchers are not outdated invalidateReaders(); - if (indexWriter != null) + if (indexWriter != null) { indexWriter.close(); + } // crate new writer IndexWriterConfig indexWriterConfig = getIndexWriterConfig(); @@ -1036,7 +1042,7 @@ public synchronized void clear() throws IOException { /** * Method produces {@link IndexWriterConfig} using settings. - * + * * @return */ private IndexWriterConfig getIndexWriterConfig() { diff --git a/core/sail/lucene/src/main/java/org/eclipse/rdf4j/sail/lucene/LuceneIndexNIOFS.java b/core/sail/lucene/src/main/java/org/eclipse/rdf4j/sail/lucene/LuceneIndexNIOFS.java index 7b354daf817..c5283da6002 100644 --- a/core/sail/lucene/src/main/java/org/eclipse/rdf4j/sail/lucene/LuceneIndexNIOFS.java +++ b/core/sail/lucene/src/main/java/org/eclipse/rdf4j/sail/lucene/LuceneIndexNIOFS.java @@ -18,7 +18,7 @@ * LuceneIndex which uses a NIOFSDirectory instead of MMapDirectory to avoid the JVM crash (see * http:// * stackoverflow.com/questions/8224843/jvm-crashes-on-lucene-datainput- readvint). - * + * * @author andriy.nikolov */ public class LuceneIndexNIOFS extends LuceneIndex { @@ -27,7 +27,8 @@ public class LuceneIndexNIOFS extends LuceneIndex { protected Directory createDirectory(Properties parameters) throws IOException { if (parameters.containsKey(LuceneSail.LUCENE_DIR_KEY)) { return new NIOFSDirectory(Paths.get(parameters.getProperty(LuceneSail.LUCENE_DIR_KEY))); - } else + } else { return super.createDirectory(parameters); + } } -} \ No newline at end of file +} diff --git a/core/sail/lucene/src/main/java/org/eclipse/rdf4j/sail/lucene/ReaderMonitor.java b/core/sail/lucene/src/main/java/org/eclipse/rdf4j/sail/lucene/ReaderMonitor.java index a79dcc5333c..b3b76613f86 100644 --- a/core/sail/lucene/src/main/java/org/eclipse/rdf4j/sail/lucene/ReaderMonitor.java +++ b/core/sail/lucene/src/main/java/org/eclipse/rdf4j/sail/lucene/ReaderMonitor.java @@ -17,7 +17,7 @@ /** * ReaderMonitor holds IndexReader and IndexSearcher. When ReaderMonitor is closed it do not close IndexReader and * IndexSearcher as long as someone reads from them. Variable readingCount remember how many times it was read. - * + * * @author Tomasz Trela, DFKI Gmbh */ public class ReaderMonitor extends AbstractReaderMonitor { @@ -31,7 +31,7 @@ public class ReaderMonitor extends AbstractReaderMonitor { /** * If exception occur when create indexReader it will be thrown on getIndexReader or get IndexSearcher - * + * * @param index * @param directory Initializes IndexReader */ @@ -62,8 +62,9 @@ protected void handleClose() throws IOException { // //////////////////////////////Methods for controlled index access protected IndexSearcher getIndexSearcher() throws IOException { - if (indexSearcherCreateException != null) + if (indexSearcherCreateException != null) { throw indexSearcherCreateException; + } return indexSearcher; } diff --git a/core/sail/lucene/src/main/java/org/eclipse/rdf4j/sail/lucene/config/LuceneSailFactory.java b/core/sail/lucene/src/main/java/org/eclipse/rdf4j/sail/lucene/config/LuceneSailFactory.java index 04bd08fedf7..5556ae956e2 100644 --- a/core/sail/lucene/src/main/java/org/eclipse/rdf4j/sail/lucene/config/LuceneSailFactory.java +++ b/core/sail/lucene/src/main/java/org/eclipse/rdf4j/sail/lucene/config/LuceneSailFactory.java @@ -21,7 +21,7 @@ public class LuceneSailFactory implements SailFactory { /** * The type of repositories that are created by this factory. - * + * * @see SailFactory#getSailType() */ public static final String SAIL_TYPE = "openrdf:LuceneSail"; diff --git a/core/sail/lucene/src/test/java/org/eclipse/rdf4j/sail/lucene/AbstractGenericLuceneTest.java b/core/sail/lucene/src/test/java/org/eclipse/rdf4j/sail/lucene/AbstractGenericLuceneTest.java index 75b12a96971..41b83f39f45 100644 --- a/core/sail/lucene/src/test/java/org/eclipse/rdf4j/sail/lucene/AbstractGenericLuceneTest.java +++ b/core/sail/lucene/src/test/java/org/eclipse/rdf4j/sail/lucene/AbstractGenericLuceneTest.java @@ -613,7 +613,7 @@ public void testUnionQuery() throws RepositoryException, MalformedQueryException /** * Tests adding data to two contexts (graphs). - * + * * @throws Exception */ @Test @@ -724,7 +724,7 @@ public void testFuzzyQuery() throws MalformedQueryException, RepositoryException /** * Checks if reindexing does not corrupt the new index and if complex query still is evaluated properly. - * + * * @throws Exception */ @Test diff --git a/core/sail/lucene/src/test/java/org/eclipse/rdf4j/sail/lucene/LuceneIndexLocationTest.java b/core/sail/lucene/src/test/java/org/eclipse/rdf4j/sail/lucene/LuceneIndexLocationTest.java index cc2485bd70d..eda60163399 100644 --- a/core/sail/lucene/src/test/java/org/eclipse/rdf4j/sail/lucene/LuceneIndexLocationTest.java +++ b/core/sail/lucene/src/test/java/org/eclipse/rdf4j/sail/lucene/LuceneIndexLocationTest.java @@ -13,14 +13,18 @@ import org.eclipse.rdf4j.repository.sail.SailRepositoryConnection; import org.eclipse.rdf4j.sail.Sail; import org.eclipse.rdf4j.sail.memory.MemoryStore; -import org.junit.*; +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; import org.junit.rules.TemporaryFolder; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * This unit test reproduces issue #41 - * + * * @author Jacek Grzebyta */ public class LuceneIndexLocationTest { @@ -87,7 +91,7 @@ public void tearDown() throws IOException, RepositoryException { /** * Check Lucene index location - * + * * @throws Exception */ @Test diff --git a/core/sail/lucene/src/test/java/org/eclipse/rdf4j/sail/lucene/LuceneIndexTest.java b/core/sail/lucene/src/test/java/org/eclipse/rdf4j/sail/lucene/LuceneIndexTest.java index 8d7a0187e8c..b1d8e9c0939 100644 --- a/core/sail/lucene/src/test/java/org/eclipse/rdf4j/sail/lucene/LuceneIndexTest.java +++ b/core/sail/lucene/src/test/java/org/eclipse/rdf4j/sail/lucene/LuceneIndexTest.java @@ -211,7 +211,7 @@ public void testAddStatement() throws IOException, ParseException { /** * NB: this is a convenient but very slow way of getting termDocs. It is sufficient for testing purposes. - * + * * @throws IOException */ private static PostingsEnum termDocs(IndexReader reader, Term term) throws IOException { @@ -404,15 +404,17 @@ public void testRejectedDatatypes() { private void assertStatement(Statement statement) throws Exception { Document document = index.getDocument(statement.getSubject(), statement.getContext()); - if (document == null) + if (document == null) { fail("Missing document " + statement.getSubject()); + } assertStatement(statement, document); } private void assertNoStatement(Statement statement) throws Exception { Document document = index.getDocument(statement.getSubject(), statement.getContext()); - if (document == null) + if (document == null) { return; + } assertNoStatement(statement, document); } @@ -424,8 +426,9 @@ private void assertStatement(Statement statement, Document document) { IndexableField[] fields = document.getFields(SearchFields.getPropertyField(statement.getPredicate())); assertNotNull("field " + statement.getPredicate() + " not found in document " + document, fields); for (IndexableField f : fields) { - if (((Literal) statement.getObject()).getLabel().equals(f.stringValue())) + if (((Literal) statement.getObject()).getLabel().equals(f.stringValue())) { return; + } } fail("Statement not found in document " + statement); } @@ -436,11 +439,13 @@ private void assertStatement(Statement statement, Document document) { */ private void assertNoStatement(Statement statement, Document document) { IndexableField[] fields = document.getFields(SearchFields.getPropertyField(statement.getPredicate())); - if (fields == null) + if (fields == null) { return; + } for (IndexableField f : fields) { - if (((Literal) statement.getObject()).getLabel().equals(f.stringValue())) + if (((Literal) statement.getObject()).getLabel().equals(f.stringValue())) { fail("Statement should not be found in document " + statement); + } } } diff --git a/core/sail/lucene/src/test/java/org/eclipse/rdf4j/sail/lucene/examples/LuceneSailExample.java b/core/sail/lucene/src/test/java/org/eclipse/rdf4j/sail/lucene/examples/LuceneSailExample.java index 2f1435a2da8..5120e34eba2 100644 --- a/core/sail/lucene/src/test/java/org/eclipse/rdf4j/sail/lucene/examples/LuceneSailExample.java +++ b/core/sail/lucene/src/test/java/org/eclipse/rdf4j/sail/lucene/examples/LuceneSailExample.java @@ -29,14 +29,14 @@ /** * Example code showing how to use the LuceneSail - * + * * @author sauermann */ public class LuceneSailExample { /** * Create a lucene sail and use it - * + * * @param args */ public static void main(String[] args) throws Exception { diff --git a/core/sail/memory/pom.xml b/core/sail/memory/pom.xml index ea836375f13..e7bd00aaf55 100644 --- a/core/sail/memory/pom.xml +++ b/core/sail/memory/pom.xml @@ -4,7 +4,7 @@ org.eclipse.rdf4j rdf4j-sail - 3.1.5-SNAPSHOT + 3.2.2-SNAPSHOT rdf4j-sail-memory RDF4J: MemoryStore diff --git a/core/sail/memory/src/main/java/org/eclipse/rdf4j/sail/memory/FileIO.java b/core/sail/memory/src/main/java/org/eclipse/rdf4j/sail/memory/FileIO.java index 8617cd88291..b68582b3ee9 100644 --- a/core/sail/memory/src/main/java/org/eclipse/rdf4j/sail/memory/FileIO.java +++ b/core/sail/memory/src/main/java/org/eclipse/rdf4j/sail/memory/FileIO.java @@ -44,7 +44,7 @@ /** * Functionality to read and write MemoryStore to/from a file. - * + * * @author Arjohn Kampman */ class FileIO { diff --git a/core/sail/memory/src/main/java/org/eclipse/rdf4j/sail/memory/MemEvaluationStatistics.java b/core/sail/memory/src/main/java/org/eclipse/rdf4j/sail/memory/MemEvaluationStatistics.java index bcbb4d8c262..a9ff82de436 100644 --- a/core/sail/memory/src/main/java/org/eclipse/rdf4j/sail/memory/MemEvaluationStatistics.java +++ b/core/sail/memory/src/main/java/org/eclipse/rdf4j/sail/memory/MemEvaluationStatistics.java @@ -19,22 +19,25 @@ import org.eclipse.rdf4j.query.algebra.evaluation.impl.EvaluationStatistics; import org.eclipse.rdf4j.sail.memory.model.MemIRI; import org.eclipse.rdf4j.sail.memory.model.MemResource; +import org.eclipse.rdf4j.sail.memory.model.MemStatementList; import org.eclipse.rdf4j.sail.memory.model.MemValue; import org.eclipse.rdf4j.sail.memory.model.MemValueFactory; /** * Uses the MemoryStore's statement sizes to give cost estimates based on the size of the expected results. This process * could be improved with repository statistics about size and distribution of statements. - * + * * @author Arjohn Kampman * @author James Leigh */ class MemEvaluationStatistics extends EvaluationStatistics { private final MemValueFactory valueFactory; + private final MemStatementList memStatementList; - MemEvaluationStatistics(MemValueFactory valueFactory) { + MemEvaluationStatistics(MemValueFactory valueFactory, MemStatementList memStatementList) { this.valueFactory = valueFactory; + this.memStatementList = memStatementList; } @Override @@ -101,7 +104,7 @@ public double getCardinality(StatementPattern sp) { if (listSizes.isEmpty()) { // all wildcards - cardinality = Integer.MAX_VALUE; + cardinality = memStatementList.size(); } else { cardinality = (double) Collections.min(listSizes); diff --git a/core/sail/memory/src/main/java/org/eclipse/rdf4j/sail/memory/MemNamespaceStore.java b/core/sail/memory/src/main/java/org/eclipse/rdf4j/sail/memory/MemNamespaceStore.java index bdac939dafb..28124e07dbe 100644 --- a/core/sail/memory/src/main/java/org/eclipse/rdf4j/sail/memory/MemNamespaceStore.java +++ b/core/sail/memory/src/main/java/org/eclipse/rdf4j/sail/memory/MemNamespaceStore.java @@ -15,7 +15,7 @@ /** * An in-memory store for namespace prefix information. - * + * * @author Arjohn Kampman */ class MemNamespaceStore implements Iterable { diff --git a/core/sail/memory/src/main/java/org/eclipse/rdf4j/sail/memory/MemTripleIterator.java b/core/sail/memory/src/main/java/org/eclipse/rdf4j/sail/memory/MemTripleIterator.java new file mode 100644 index 00000000000..0c22c74fe46 --- /dev/null +++ b/core/sail/memory/src/main/java/org/eclipse/rdf4j/sail/memory/MemTripleIterator.java @@ -0,0 +1,134 @@ +/******************************************************************************* + * Copyright (c) 2020 Eclipse RDF4J contributors. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Distribution License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ +package org.eclipse.rdf4j.sail.memory; + +import org.eclipse.rdf4j.common.iteration.LookAheadIteration; +import org.eclipse.rdf4j.model.Triple; +import org.eclipse.rdf4j.sail.memory.model.MemIRI; +import org.eclipse.rdf4j.sail.memory.model.MemResource; +import org.eclipse.rdf4j.sail.memory.model.MemStatement; +import org.eclipse.rdf4j.sail.memory.model.MemStatementList; +import org.eclipse.rdf4j.sail.memory.model.MemTriple; +import org.eclipse.rdf4j.sail.memory.model.MemValue; + +/** + * An Iteration that can iterate over a list of {@link Triple} objects. + * + * @author Jeen Broekstra + */ +class MemTripleIterator extends LookAheadIteration { + + /*-----------* + * Variables * + *-----------*/ + + /** + * The lists of statements over which to iterate. + */ + private final MemStatementList statementList; + + /** + * The subject of statements to return, or null if any subject is OK. + */ + private final MemResource subject; + + /** + * The predicate of statements to return, or null if any predicate is OK. + */ + private final MemIRI predicate; + + /** + * The object of statements to return, or null if any object is OK. + */ + private final MemValue object; + + /** + * Indicates which snapshot should be iterated over. + */ + private final int snapshot; + + /** + * The index of the last statement that has been returned. + */ + private volatile int statementIdx; + + /*--------------* + * Constructors * + *--------------*/ + + /** + * Creates a new MemTripleIterator that will iterate over the triples contained in the supplied MemStatementList + * searching for triples that occur as either subject or object in those statements, and which match the specified + * pattern of subject, predicate, object. + * + * @param statementList the statements over which to iterate. + * @param subject subject of pattern. + * @param predicate predicate of pattern. + * @param object object of pattern. + */ + public MemTripleIterator(MemStatementList statementList, MemResource subject, MemIRI predicate, MemValue object, + int snapshot) { + this.statementList = statementList; + this.subject = subject; + this.predicate = predicate; + this.object = object; + this.snapshot = snapshot; + + this.statementIdx = -1; + } + + /*---------* + * Methods * + *---------*/ + + /** + * Searches through statementList, starting from index _nextStatementIdx + 1, for triples that match the + * constraints that have been set for this iterator. + */ + @Override + protected MemTriple getNextElement() { + statementIdx++; + + for (; statementIdx < statementList.size(); statementIdx++) { + MemStatement st = statementList.get(statementIdx); + if (isInSnapshot(st)) { + if (st.getSubject() instanceof MemTriple) { + MemTriple triple = (MemTriple) st.getSubject(); + if (matchesPattern(triple)) { + return triple; + } + } else if (st.getObject() instanceof MemTriple) { + MemTriple triple = (MemTriple) st.getObject(); + if (matchesPattern(triple)) { + return triple; + } + } + } + } + + // No more matching statements. + return null; + } + + private boolean matchesPattern(MemTriple triple) { + if (!(subject == null || subject.equals(triple.getSubject()))) { + return false; + } + if (!(predicate == null || predicate.equals(triple.getPredicate()))) { + return false; + } + if (!(object == null || object.equals(triple.getObject()))) { + return false; + } + return true; + } + + private boolean isInSnapshot(MemStatement st) { + return snapshot < 0 || st.isInSnapshot(snapshot); + } +} diff --git a/core/sail/memory/src/main/java/org/eclipse/rdf4j/sail/memory/MemorySailStore.java b/core/sail/memory/src/main/java/org/eclipse/rdf4j/sail/memory/MemorySailStore.java index 637ae3b223c..dd2896d0372 100644 --- a/core/sail/memory/src/main/java/org/eclipse/rdf4j/sail/memory/MemorySailStore.java +++ b/core/sail/memory/src/main/java/org/eclipse/rdf4j/sail/memory/MemorySailStore.java @@ -26,6 +26,7 @@ import org.eclipse.rdf4j.model.Namespace; import org.eclipse.rdf4j.model.Resource; import org.eclipse.rdf4j.model.Statement; +import org.eclipse.rdf4j.model.Triple; import org.eclipse.rdf4j.model.Value; import org.eclipse.rdf4j.model.ValueFactory; import org.eclipse.rdf4j.model.impl.LinkedHashModel; @@ -44,6 +45,7 @@ import org.eclipse.rdf4j.sail.memory.model.MemStatement; import org.eclipse.rdf4j.sail.memory.model.MemStatementIterator; import org.eclipse.rdf4j.sail.memory.model.MemStatementList; +import org.eclipse.rdf4j.sail.memory.model.MemTriple; import org.eclipse.rdf4j.sail.memory.model.MemValue; import org.eclipse.rdf4j.sail.memory.model.MemValueFactory; import org.slf4j.Logger; @@ -125,7 +127,7 @@ public void close() { @Override public EvaluationStatistics getEvaluationStatistics() { - return new MemEvaluationStatistics(valueFactory); + return new MemEvaluationStatistics(valueFactory, statements); } @Override @@ -232,6 +234,37 @@ private CloseableIteration createStatementIterator( return new MemStatementIterator<>(smallestList, memSubj, memPred, memObj, explicit, snapshot, memContexts); } + /** + * Creates a TripleIterator that contains the triples matching the specified pattern of subject, predicate, object, + * context. + */ + private CloseableIteration createTripleIterator(Resource subj, IRI pred, Value obj, + int snapshot) { + // Perform look-ups for value-equivalents of the specified values + + MemResource memSubj = valueFactory.getMemResource(subj); + + if (subj != null && memSubj == null) { + // non-existent subject + return new EmptyIteration<>(); + } + + MemIRI memPred = valueFactory.getMemURI(pred); + if (pred != null && memPred == null) { + // non-existent predicate + return new EmptyIteration<>(); + } + + MemValue memObj = valueFactory.getMemValue(obj); + if (obj != null && memObj == null) { + // non-existent object + return new EmptyIteration<>(); + } + + // TODO there is no separate index for Trples, so for now we iterate over all statements to find matches. + return new MemTripleIterator<>(statements, memSubj, memPred, memObj, snapshot); + } + /** * Removes statements from old snapshots from the main statement list and resets the snapshot to 1 for the rest of * the statements. @@ -511,13 +544,18 @@ public synchronized void deprecate(Statement statement) throws SailException { acquireExclusiveTransactionLock(); requireCleanup = true; if (statement instanceof MemStatement) { - ((MemStatement) statement).setTillSnapshot(nextSnapshot); + MemStatement toDeprecate = (MemStatement) statement; + if ((nextSnapshot < 0 || toDeprecate.isInSnapshot(nextSnapshot)) + && toDeprecate.isExplicit() == explicit) { + toDeprecate.setTillSnapshot(nextSnapshot); + } } else if (statement instanceof LinkedHashModel.ModelStatement && ((LinkedHashModel.ModelStatement) statement).getStatement() instanceof MemStatement) { // The Changeset uses a LinkedHashModel to store it's changes. It still keeps a reference to the // original statement that can be retrieved here. MemStatement toDeprecate = (MemStatement) ((LinkedHashModel.ModelStatement) statement).getStatement(); - if (toDeprecate.getTillSnapshot() > nextSnapshot && toDeprecate.isExplicit() == explicit) { + if ((nextSnapshot < 0 || toDeprecate.isInSnapshot(nextSnapshot)) + && toDeprecate.isExplicit() == explicit) { toDeprecate.setTillSnapshot(nextSnapshot); } } else { @@ -722,6 +760,37 @@ public CloseableIteration getStatements(Reso } } + @Override + public CloseableIteration getTriples(Resource subj, IRI pred, Value obj) + throws SailException { + CloseableIteration stIter1 = null; + CloseableIteration stIter2 = null; + boolean allGood = false; + Lock stLock = openStatementsReadLock(); + try { + stIter1 = createTripleIterator(subj, pred, obj, getCurrentSnapshot()); + stIter2 = new LockingIteration(stLock, stIter1); + allGood = true; + return stIter2; + } finally { + if (!allGood) { + try { + stLock.release(); + } finally { + try { + if (stIter2 != null) { + stIter2.close(); + } + } finally { + if (stIter1 != null) { + stIter1.close(); + } + } + } + } + } + } + private int getCurrentSnapshot() { if (snapshot >= 0) { return snapshot; @@ -745,5 +814,6 @@ private boolean isContextResource(MemResource memResource, int snapshot) throws return iter.hasNext(); } } + } } diff --git a/core/sail/memory/src/main/java/org/eclipse/rdf4j/sail/memory/MemoryStore.java b/core/sail/memory/src/main/java/org/eclipse/rdf4j/sail/memory/MemoryStore.java index 33f6f7b296a..2ecbfee569e 100644 --- a/core/sail/memory/src/main/java/org/eclipse/rdf4j/sail/memory/MemoryStore.java +++ b/core/sail/memory/src/main/java/org/eclipse/rdf4j/sail/memory/MemoryStore.java @@ -202,6 +202,7 @@ public synchronized EvaluationStrategyFactory getEvaluationStrategyFactory() { evalStratFactory = new StrictEvaluationStrategyFactory(getFederatedServiceResolver()); } evalStratFactory.setQuerySolutionCacheThreshold(getIterationCacheSyncThreshold()); + evalStratFactory.setTrackResultSize(isTrackResultSize()); return evalStratFactory; } diff --git a/core/sail/memory/src/main/java/org/eclipse/rdf4j/sail/memory/config/MemoryStoreConfig.java b/core/sail/memory/src/main/java/org/eclipse/rdf4j/sail/memory/config/MemoryStoreConfig.java index f714c1de04d..ac0e82943f8 100644 --- a/core/sail/memory/src/main/java/org/eclipse/rdf4j/sail/memory/config/MemoryStoreConfig.java +++ b/core/sail/memory/src/main/java/org/eclipse/rdf4j/sail/memory/config/MemoryStoreConfig.java @@ -81,7 +81,7 @@ public void parse(Model graph, Resource implNode) throws SailConfigException { try { - Models.objectLiteral(graph.filter(implNode, PERSIST, null)).ifPresent(persistValue -> { + Models.objectLiteral(graph.getStatements(implNode, PERSIST, null)).ifPresent(persistValue -> { try { setPersist((persistValue).booleanValue()); } catch (IllegalArgumentException e) { @@ -90,7 +90,7 @@ public void parse(Model graph, Resource implNode) throws SailConfigException { } }); - Models.objectLiteral(graph.filter(implNode, SYNC_DELAY, null)).ifPresent(syncDelayValue -> { + Models.objectLiteral(graph.getStatements(implNode, SYNC_DELAY, null)).ifPresent(syncDelayValue -> { try { setSyncDelay((syncDelayValue).longValue()); } catch (NumberFormatException e) { diff --git a/core/sail/memory/src/main/java/org/eclipse/rdf4j/sail/memory/config/MemoryStoreFactory.java b/core/sail/memory/src/main/java/org/eclipse/rdf4j/sail/memory/config/MemoryStoreFactory.java index 893444bae52..fc84d30ae3c 100644 --- a/core/sail/memory/src/main/java/org/eclipse/rdf4j/sail/memory/config/MemoryStoreFactory.java +++ b/core/sail/memory/src/main/java/org/eclipse/rdf4j/sail/memory/config/MemoryStoreFactory.java @@ -16,14 +16,14 @@ /** * A {@link SailFactory} that creates {@link MemoryStore}s based on RDF configuration data. - * + * * @author Arjohn Kampman */ public class MemoryStoreFactory implements SailFactory { /** * The type of repositories that are created by this factory. - * + * * @see SailFactory#getSailType() */ public static final String SAIL_TYPE = "openrdf:MemoryStore"; diff --git a/core/sail/memory/src/main/java/org/eclipse/rdf4j/sail/memory/config/MemoryStoreSchema.java b/core/sail/memory/src/main/java/org/eclipse/rdf4j/sail/memory/config/MemoryStoreSchema.java index 70aa35505fe..e4b38467810 100644 --- a/core/sail/memory/src/main/java/org/eclipse/rdf4j/sail/memory/config/MemoryStoreSchema.java +++ b/core/sail/memory/src/main/java/org/eclipse/rdf4j/sail/memory/config/MemoryStoreSchema.java @@ -15,7 +15,7 @@ /** * Defines constants for the MemoryStore schema which is used by {@link MemoryStoreFactory}s to initialize * {@link MemoryStore}s. - * + * * @author Arjohn Kampman */ public class MemoryStoreSchema { diff --git a/core/sail/memory/src/main/java/org/eclipse/rdf4j/sail/memory/model/BooleanMemLiteral.java b/core/sail/memory/src/main/java/org/eclipse/rdf4j/sail/memory/model/BooleanMemLiteral.java index 36a7e4a6ac7..cdefcb52247 100644 --- a/core/sail/memory/src/main/java/org/eclipse/rdf4j/sail/memory/model/BooleanMemLiteral.java +++ b/core/sail/memory/src/main/java/org/eclipse/rdf4j/sail/memory/model/BooleanMemLiteral.java @@ -11,7 +11,7 @@ /** * An extension of MemLiteral that stores a boolean value to avoid parsing. - * + * * @author David Huynh * @author Arjohn Kampman */ diff --git a/core/sail/memory/src/main/java/org/eclipse/rdf4j/sail/memory/model/CalendarMemLiteral.java b/core/sail/memory/src/main/java/org/eclipse/rdf4j/sail/memory/model/CalendarMemLiteral.java index ee955cbe4af..4693b366da3 100644 --- a/core/sail/memory/src/main/java/org/eclipse/rdf4j/sail/memory/model/CalendarMemLiteral.java +++ b/core/sail/memory/src/main/java/org/eclipse/rdf4j/sail/memory/model/CalendarMemLiteral.java @@ -16,7 +16,7 @@ /** * An extension of MemLiteral that stores a Calendar value to avoid parsing. - * + * * @author David Huynh * @author Arjohn Kampman */ diff --git a/core/sail/memory/src/main/java/org/eclipse/rdf4j/sail/memory/model/DecimalMemLiteral.java b/core/sail/memory/src/main/java/org/eclipse/rdf4j/sail/memory/model/DecimalMemLiteral.java index 3156f7af944..af6f064da10 100644 --- a/core/sail/memory/src/main/java/org/eclipse/rdf4j/sail/memory/model/DecimalMemLiteral.java +++ b/core/sail/memory/src/main/java/org/eclipse/rdf4j/sail/memory/model/DecimalMemLiteral.java @@ -15,7 +15,7 @@ /** * An extension of MemLiteral that stores a decimal value to avoid parsing. - * + * * @author Arjohn Kampman */ public class DecimalMemLiteral extends MemLiteral { diff --git a/core/sail/memory/src/main/java/org/eclipse/rdf4j/sail/memory/model/IntegerMemLiteral.java b/core/sail/memory/src/main/java/org/eclipse/rdf4j/sail/memory/model/IntegerMemLiteral.java index 7338e696919..8c30f125a96 100644 --- a/core/sail/memory/src/main/java/org/eclipse/rdf4j/sail/memory/model/IntegerMemLiteral.java +++ b/core/sail/memory/src/main/java/org/eclipse/rdf4j/sail/memory/model/IntegerMemLiteral.java @@ -15,7 +15,7 @@ /** * An extension of MemLiteral that stores an integer value to avoid parsing. - * + * * @author Arjohn Kampman */ public class IntegerMemLiteral extends MemLiteral { diff --git a/core/sail/memory/src/main/java/org/eclipse/rdf4j/sail/memory/model/MemBNode.java b/core/sail/memory/src/main/java/org/eclipse/rdf4j/sail/memory/model/MemBNode.java index fd2239462ba..e469d380779 100644 --- a/core/sail/memory/src/main/java/org/eclipse/rdf4j/sail/memory/model/MemBNode.java +++ b/core/sail/memory/src/main/java/org/eclipse/rdf4j/sail/memory/model/MemBNode.java @@ -46,7 +46,7 @@ public class MemBNode extends SimpleBNode implements MemResource { /** * Creates a new MemBNode for a bnode ID. - * + * * @param creator The object that is creating this MemBNode. * @param id bnode ID. */ diff --git a/core/sail/memory/src/main/java/org/eclipse/rdf4j/sail/memory/model/MemIRI.java b/core/sail/memory/src/main/java/org/eclipse/rdf4j/sail/memory/model/MemIRI.java index 7e58b3137f0..c090df97c09 100644 --- a/core/sail/memory/src/main/java/org/eclipse/rdf4j/sail/memory/model/MemIRI.java +++ b/core/sail/memory/src/main/java/org/eclipse/rdf4j/sail/memory/model/MemIRI.java @@ -67,7 +67,7 @@ public class MemIRI implements IRI, MemResource { /** * Creates a new MemURI for a URI. - * + * * @param creator The object that is creating this MemURI. * @param namespace namespace part of URI. * @param localName localname part of URI. @@ -190,7 +190,7 @@ public void cleanSnapshotsFromSubjectStatements(int currentSnapshot) { /** * Gets the list of statements for which this MemURI is the predicate. - * + * * @return a MemStatementList containing the statements. */ public MemStatementList getPredicateStatementList() { @@ -203,7 +203,7 @@ public MemStatementList getPredicateStatementList() { /** * Gets the number of Statements for which this MemURI is the predicate. - * + * * @return An integer larger than or equal to 0. */ public int getPredicateStatementCount() { @@ -239,7 +239,7 @@ public void removePredicateStatement(MemStatement st) { /** * Removes statements from old snapshots (those that have expired at or before the specified snapshot version) from * this MemValue's list of statements for which it is the predicate. - * + * * @param currentSnapshot The current snapshot version. */ public void cleanSnapshotsFromPredicateStatements(int currentSnapshot) { diff --git a/core/sail/memory/src/main/java/org/eclipse/rdf4j/sail/memory/model/MemLiteral.java b/core/sail/memory/src/main/java/org/eclipse/rdf4j/sail/memory/model/MemLiteral.java index 9417f50795c..191909cd6ca 100644 --- a/core/sail/memory/src/main/java/org/eclipse/rdf4j/sail/memory/model/MemLiteral.java +++ b/core/sail/memory/src/main/java/org/eclipse/rdf4j/sail/memory/model/MemLiteral.java @@ -13,7 +13,7 @@ /** * A MemoryStore-specific extension of Literal giving it node properties. - * + * * @author Arjohn Kampman */ public class MemLiteral extends SimpleLiteral implements MemValue { @@ -40,7 +40,7 @@ public class MemLiteral extends SimpleLiteral implements MemValue { /** * Creates a new Literal which will get the supplied label. - * + * * @param creator The object that is creating this MemLiteral. * @param label The label for this literal. */ @@ -51,7 +51,7 @@ public MemLiteral(Object creator, String label) { /** * Creates a new Literal which will get the supplied label and language code. - * + * * @param creator The object that is creating this MemLiteral. * @param label The label for this literal. * @param lang The language code of the supplied label. @@ -63,7 +63,7 @@ public MemLiteral(Object creator, String label, String lang) { /** * Creates a new Literal which will get the supplied label and datatype. - * + * * @param creator The object that is creating this MemLiteral. * @param label The label for this literal. * @param datatype The datatype of the supplied label. diff --git a/core/sail/memory/src/main/java/org/eclipse/rdf4j/sail/memory/model/MemResource.java b/core/sail/memory/src/main/java/org/eclipse/rdf4j/sail/memory/model/MemResource.java index 2cc24ccac04..9d28bbe1122 100644 --- a/core/sail/memory/src/main/java/org/eclipse/rdf4j/sail/memory/model/MemResource.java +++ b/core/sail/memory/src/main/java/org/eclipse/rdf4j/sail/memory/model/MemResource.java @@ -16,28 +16,28 @@ public interface MemResource extends MemValue, Resource { /** * Gets the list of statements for which this MemResource is the subject. - * + * * @return a MemStatementList containing the statements. */ public MemStatementList getSubjectStatementList(); /** * Gets the number of statements for which this MemResource is the subject. - * + * * @return An integer larger than or equal to 0. */ public int getSubjectStatementCount(); /** * Adds a statement to this MemResource's list of statements for which it is the subject. - * + * * @param st */ public void addSubjectStatement(MemStatement st); /** * Removes a statement from this MemResource's list of statements for which it is the subject. - * + * * @param st */ public void removeSubjectStatement(MemStatement st); @@ -45,35 +45,35 @@ public interface MemResource extends MemValue, Resource { /** * Removes statements from old snapshots (those that have expired at or before the specified snapshot version) from * this MemValue's list of statements for which it is the subject. - * + * * @param currentSnapshot The current snapshot version. */ public void cleanSnapshotsFromSubjectStatements(int currentSnapshot); /** * Gets the list of statements for which this MemResource represents the context. - * + * * @return a MemStatementList containing the statements. */ public MemStatementList getContextStatementList(); /** * Gets the number of statements for which this MemResource represents the context. - * + * * @return An integer larger than or equal to 0. */ public int getContextStatementCount(); /** * Adds a statement to this MemResource's list of statements for which it represents the context. - * + * * @param st */ public void addContextStatement(MemStatement st); /** * Removes a statement from this MemResource's list of statements for which it represents the context. - * + * * @param st */ public void removeContextStatement(MemStatement st); @@ -81,7 +81,7 @@ public interface MemResource extends MemValue, Resource { /** * Removes statements from old snapshots (those that have expired at or before the specified snapshot version) from * this MemValue's list of statements for which it is the context. - * + * * @param currentSnapshot The current snapshot version. */ public void cleanSnapshotsFromContextStatements(int currentSnapshot); diff --git a/core/sail/memory/src/main/java/org/eclipse/rdf4j/sail/memory/model/MemStatementIterator.java b/core/sail/memory/src/main/java/org/eclipse/rdf4j/sail/memory/model/MemStatementIterator.java index 4be34c9d0b3..41a9ca6a04d 100644 --- a/core/sail/memory/src/main/java/org/eclipse/rdf4j/sail/memory/model/MemStatementIterator.java +++ b/core/sail/memory/src/main/java/org/eclipse/rdf4j/sail/memory/model/MemStatementIterator.java @@ -70,7 +70,7 @@ public class MemStatementIterator extends LookAheadIteratio * Creates a new MemStatementIterator that will iterate over the statements contained in the supplied * MemStatementList searching for statements that match the specified pattern of subject, predicate, object and * context(s). - * + * * @param statementList the statements over which to iterate. * @param subject subject of pattern. * @param predicate predicate of pattern. diff --git a/core/sail/memory/src/main/java/org/eclipse/rdf4j/sail/memory/model/MemTriple.java b/core/sail/memory/src/main/java/org/eclipse/rdf4j/sail/memory/model/MemTriple.java new file mode 100644 index 00000000000..29c71a7130b --- /dev/null +++ b/core/sail/memory/src/main/java/org/eclipse/rdf4j/sail/memory/model/MemTriple.java @@ -0,0 +1,223 @@ +/******************************************************************************* + * Copyright (c) 2020 Eclipse RDF4J contributors. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Distribution License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ +package org.eclipse.rdf4j.sail.memory.model; + +import org.eclipse.rdf4j.model.IRI; +import org.eclipse.rdf4j.model.Resource; +import org.eclipse.rdf4j.model.Triple; +import org.eclipse.rdf4j.model.Value; + +import com.google.common.base.Objects; + +/** + * A MemoryStore-specific implementation of {@link Triple}. + * + * @author Jeen Broekstra + */ +public class MemTriple implements Triple, MemResource { + + private static final long serialVersionUID = -9085188980084028689L; + + transient private final Object creator; + + private final MemResource subject; + private final MemIRI predicate; + private final MemValue object; + + /** + * The list of statements for which this MemTriple is the subject. + */ + transient private volatile MemStatementList subjectStatements = null; + + /** + * The list of statements for which this MemTriple is the object. + */ + transient private volatile MemStatementList objectStatements = null; + + public MemTriple(Object creator, MemResource subject, MemIRI predicate, MemValue object) { + this.creator = creator; + this.subject = subject; + this.predicate = predicate; + this.object = object; + } + + @Override + public String stringValue() { + StringBuilder sb = new StringBuilder(256); + + sb.append("<<"); + sb.append(getSubject()); + sb.append(" "); + sb.append(getPredicate()); + sb.append(" "); + sb.append(getObject()); + sb.append(">>"); + + return sb.toString(); + } + + @Override + public String toString() { + return stringValue(); + } + + @Override + public Object getCreator() { + return creator; + } + + @Override + public boolean hasStatements() { + // TODO Auto-generated method stub + return false; + } + + @Override + public MemStatementList getObjectStatementList() { + if (objectStatements == null) { + return EMPTY_LIST; + } + return objectStatements; + } + + @Override + public int getObjectStatementCount() { + return getObjectStatementList().size(); + } + + @Override + public void addObjectStatement(MemStatement st) { + if (objectStatements == null) { + objectStatements = new MemStatementList(4); + } + objectStatements.add(st); + } + + @Override + public void removeObjectStatement(MemStatement st) { + objectStatements.remove(st); + + if (objectStatements.isEmpty()) { + objectStatements = null; + } + + } + + @Override + public void cleanSnapshotsFromObjectStatements(int currentSnapshot) { + if (objectStatements != null) { + objectStatements.cleanSnapshots(currentSnapshot); + + if (objectStatements.isEmpty()) { + objectStatements = null; + } + } + } + + @Override + public MemStatementList getSubjectStatementList() { + if (subjectStatements == null) { + return EMPTY_LIST; + } + return subjectStatements; + } + + @Override + public int getSubjectStatementCount() { + return getSubjectStatementList().size(); + } + + @Override + public void addSubjectStatement(MemStatement st) { + if (subjectStatements == null) { + subjectStatements = new MemStatementList(4); + } + subjectStatements.add(st); + } + + @Override + public void removeSubjectStatement(MemStatement st) { + subjectStatements.remove(st); + + if (subjectStatements.isEmpty()) { + subjectStatements = null; + } + } + + @Override + public void cleanSnapshotsFromSubjectStatements(int currentSnapshot) { + if (subjectStatements != null) { + subjectStatements.cleanSnapshots(currentSnapshot); + + if (subjectStatements.isEmpty()) { + subjectStatements = null; + } + } + } + + @Override + public MemStatementList getContextStatementList() { + return EMPTY_LIST; + } + + @Override + public int getContextStatementCount() { + return 0; + } + + @Override + public void addContextStatement(MemStatement st) { + throw new UnsupportedOperationException("RDF* triples can not be used as context identifier"); + } + + @Override + public void removeContextStatement(MemStatement st) { + // no-op + } + + @Override + public void cleanSnapshotsFromContextStatements(int currentSnapshot) { + // no-op + } + + @Override + public Resource getSubject() { + return subject; + } + + @Override + public IRI getPredicate() { + return predicate; + } + + @Override + public Value getObject() { + return object; + } + + @Override + public int hashCode() { + return Objects.hashCode(subject, predicate, object); + } + + @Override + public boolean equals(Object other) { + if (this == other) { + return true; + } + + if (other instanceof Triple) { + Triple that = (Triple) other; + return this.subject.equals(that.getSubject()) && this.predicate.equals(that.getPredicate()) + && this.object.equals(that.getObject()); + } + + return false; + } + +} diff --git a/core/sail/memory/src/main/java/org/eclipse/rdf4j/sail/memory/model/MemValue.java b/core/sail/memory/src/main/java/org/eclipse/rdf4j/sail/memory/model/MemValue.java index 8595bcd77cb..b1216426e78 100644 --- a/core/sail/memory/src/main/java/org/eclipse/rdf4j/sail/memory/model/MemValue.java +++ b/core/sail/memory/src/main/java/org/eclipse/rdf4j/sail/memory/model/MemValue.java @@ -38,21 +38,21 @@ public interface MemValue extends Value { /** * Checks whether this MemValue has any statements. A MemValue object has statements if there is at least one * statement where it is used as the subject, predicate, object or context value. - * + * * @return true if the MemValue has statements, false otherwise. */ public boolean hasStatements(); /** * Gets the list of statements for which this MemValue is the object. - * + * * @return A MemStatementList containing the statements. */ public MemStatementList getObjectStatementList(); /** * Gets the number of statements for which this MemValue is the object. - * + * * @return An integer larger than or equal to 0. */ public int getObjectStatementCount(); @@ -70,7 +70,7 @@ public interface MemValue extends Value { /** * Removes statements from old snapshots (those that have expired at or before the specified snapshot version) from * this MemValue's list of statements for which it is the object. - * + * * @param currentSnapshot The current snapshot version. */ public void cleanSnapshotsFromObjectStatements(int currentSnapshot); diff --git a/core/sail/memory/src/main/java/org/eclipse/rdf4j/sail/memory/model/MemValueFactory.java b/core/sail/memory/src/main/java/org/eclipse/rdf4j/sail/memory/model/MemValueFactory.java index 3d9d3a9cc38..5d59354faa6 100644 --- a/core/sail/memory/src/main/java/org/eclipse/rdf4j/sail/memory/model/MemValueFactory.java +++ b/core/sail/memory/src/main/java/org/eclipse/rdf4j/sail/memory/model/MemValueFactory.java @@ -17,6 +17,7 @@ import org.eclipse.rdf4j.model.IRI; import org.eclipse.rdf4j.model.Literal; import org.eclipse.rdf4j.model.Resource; +import org.eclipse.rdf4j.model.Triple; import org.eclipse.rdf4j.model.Value; import org.eclipse.rdf4j.model.datatypes.XMLDatatypeUtil; import org.eclipse.rdf4j.model.impl.AbstractValueFactory; @@ -27,7 +28,7 @@ /** * A factory for MemValue objects that keeps track of created objects to prevent the creation of duplicate objects, * minimizing memory usage as a result. - * + * * @author Arjohn Kampman * @author David Huynh */ @@ -43,6 +44,12 @@ public class MemValueFactory extends AbstractValueFactory { */ private final WeakObjectRegistry uriRegistry = new WeakObjectRegistry<>(); + /** + * Registry containing the set of MemTriple objects as used by a MemoryStore. This registry enables the reuse of + * objects, minimizing the number of objects in main memory. + */ + private final WeakObjectRegistry tripleRegistry = new WeakObjectRegistry<>(); + /** * Registry containing the set of MemBNode objects as used by a MemoryStore. This registry enables the reuse of * objects, minimizing the number of objects in main memory. @@ -75,7 +82,7 @@ public void clear() { /** * Returns a previously created MemValue that is equal to the supplied value, or null if the supplied value * is a new value or is equal to null. - * + * * @param value The MemValue equivalent of the supplied value, or null. * @return A previously created MemValue that is equal to value, or null if no such value exists * or if value is equal to null. @@ -100,6 +107,8 @@ public MemResource getMemResource(Resource resource) { return getMemURI((IRI) resource); } else if (resource instanceof BNode) { return getMemBNode((BNode) resource); + } else if (resource instanceof Triple) { + return getMemTriple((Triple) resource); } else if (resource == null) { return null; } else { @@ -153,7 +162,7 @@ private boolean isOwnMemValue(Value value) { *

    * Warning: This method is not synchronized. To iterate over the returned set in a thread-safe way, this * method should only be called while synchronizing on this object. - * + * * @return An unmodifiable Set of MemURI objects. */ public Set getMemURIs() { @@ -165,7 +174,7 @@ public Set getMemURIs() { *

    * Warning: This method is not synchronized. To iterate over the returned set in a thread-safe way, this * method should only be called while synchronizing on this object. - * + * * @return An unmodifiable Set of MemBNode objects. */ public Set getMemBNodes() { @@ -177,7 +186,7 @@ public Set getMemBNodes() { *

    * Warning: This method is not synchronized. To iterate over the returned set in a thread-safe way, this * method should only be called while synchronizing on this object. - * + * * @return An unmodifiable Set of MemURI objects. */ public Set getMemLiterals() { @@ -188,7 +197,7 @@ public Set getMemLiterals() { * Gets or creates a MemValue for the supplied Value. If the factory already contains a MemValue object that is * equivalent to the supplied value then this equivalent value will be returned. Otherwise a new MemValue will be * created, stored for future calls and then returned. - * + * * @param value A Resource or Literal. * @return The existing or created MemValue. */ @@ -210,6 +219,8 @@ public MemResource getOrCreateMemResource(Resource resource) { return getOrCreateMemURI((IRI) resource); } else if (resource instanceof BNode) { return getOrCreateMemBNode((BNode) resource); + } else if (resource instanceof Triple) { + return getOrCreateMemTriple((Triple) resource); } else { throw new IllegalArgumentException("resource is not a URI or BNode: " + resource); } @@ -382,4 +393,29 @@ private Literal getSharedLiteral(MemLiteral newLiteral) { return sharedLiteral; } + /** + * See {@link #getOrCreateMemValue(Value)} for description. + */ + private synchronized MemTriple getOrCreateMemTriple(Triple triple) { + MemTriple memTriple = getMemTriple(triple); + + if (memTriple == null) { + // Create a MemTriple and add it to the registry + memTriple = new MemTriple(this, getOrCreateMemResource(triple + .getSubject()), + getOrCreateMemURI(triple.getPredicate()), getOrCreateMemValue(triple.getObject())); + boolean wasNew = tripleRegistry.add(memTriple); + } + + return memTriple; + } + + private synchronized MemTriple getMemTriple(Triple triple) { + if (isOwnMemValue(triple)) { + return (MemTriple) triple; + } else { + return tripleRegistry.get(triple); + } + } + } diff --git a/core/sail/memory/src/main/java/org/eclipse/rdf4j/sail/memory/model/NumericMemLiteral.java b/core/sail/memory/src/main/java/org/eclipse/rdf4j/sail/memory/model/NumericMemLiteral.java index 7ddfc31ee3a..a1fae4bd968 100644 --- a/core/sail/memory/src/main/java/org/eclipse/rdf4j/sail/memory/model/NumericMemLiteral.java +++ b/core/sail/memory/src/main/java/org/eclipse/rdf4j/sail/memory/model/NumericMemLiteral.java @@ -13,7 +13,7 @@ /** * An extension of MemLiteral that stores a numeric value to avoid parsing. - * + * * @author David Huynh * @author Arjohn Kampman */ diff --git a/core/sail/memory/src/main/java/org/eclipse/rdf4j/sail/memory/model/WeakObjectRegistry.java b/core/sail/memory/src/main/java/org/eclipse/rdf4j/sail/memory/model/WeakObjectRegistry.java index 2de203c8748..a127ddb5a63 100644 --- a/core/sail/memory/src/main/java/org/eclipse/rdf4j/sail/memory/model/WeakObjectRegistry.java +++ b/core/sail/memory/src/main/java/org/eclipse/rdf4j/sail/memory/model/WeakObjectRegistry.java @@ -44,7 +44,7 @@ public WeakObjectRegistry() { /** * Constructs a new WeakObjectRegistry containing the elements in the specified collection. - * + * * @param c The collection whose elements are to be placed into this object registry. * @throws NullPointerException If the specified collection is null. */ @@ -59,7 +59,7 @@ public WeakObjectRegistry(Collection c) { /** * Retrieves the stored object that is equal to the supplied key object. - * + * * @param key The object that should be used as the search key for the operation. * @return A stored object that is equal to the supplied key, or null if no such object was found. */ diff --git a/core/sail/memory/src/main/java/org/eclipse/rdf4j/sail/memory/model/package-info.java b/core/sail/memory/src/main/java/org/eclipse/rdf4j/sail/memory/model/package-info.java index ae95b03e38d..abe28552b93 100644 --- a/core/sail/memory/src/main/java/org/eclipse/rdf4j/sail/memory/model/package-info.java +++ b/core/sail/memory/src/main/java/org/eclipse/rdf4j/sail/memory/model/package-info.java @@ -2,7 +2,7 @@ @InternalUseOnly /** * MemoryStore-specific implementations of the core RDF model objects. - * + * * @deprecated since 3.0. This feature is for internal use only: its existence, signature or behavior may change without * warning from one release to the next. */ diff --git a/core/sail/memory/src/main/java/org/eclipse/rdf4j/sail/memory/package-info.java b/core/sail/memory/src/main/java/org/eclipse/rdf4j/sail/memory/package-info.java index c7796b0b052..d498f8d3459 100644 --- a/core/sail/memory/src/main/java/org/eclipse/rdf4j/sail/memory/package-info.java +++ b/core/sail/memory/src/main/java/org/eclipse/rdf4j/sail/memory/package-info.java @@ -1,6 +1,6 @@ /** * An implementation of the RDF SAIL API that uses main memory for storage. - * + * * This implementation uses a bipartite graph as data structure. */ -package org.eclipse.rdf4j.sail.memory; \ No newline at end of file +package org.eclipse.rdf4j.sail.memory; diff --git a/core/sail/memory/src/test/java/org/eclipse/rdf4j/sail/memory/MemTripleSourceTest.java b/core/sail/memory/src/test/java/org/eclipse/rdf4j/sail/memory/MemTripleSourceTest.java index caa94cfc427..ebbf57a8a9f 100644 --- a/core/sail/memory/src/test/java/org/eclipse/rdf4j/sail/memory/MemTripleSourceTest.java +++ b/core/sail/memory/src/test/java/org/eclipse/rdf4j/sail/memory/MemTripleSourceTest.java @@ -42,7 +42,7 @@ /** * Unit Test for {@link TripleSource} - * + * * @author Peter Ansell */ public class MemTripleSourceTest { @@ -835,7 +835,7 @@ protected void loadTestData(String dataFile, Resource... contexts) /** * Helper method to avoid writing this constructor multiple times. It needs to be created after statements are added * and committed. - * + * * @return * @throws SailException */ diff --git a/core/sail/memory/src/test/java/org/eclipse/rdf4j/sail/memory/MemoryCascadeValueExceptionTest.java b/core/sail/memory/src/test/java/org/eclipse/rdf4j/sail/memory/MemoryCascadeValueExceptionTest.java index ce87d089f50..b7ab3636a97 100644 --- a/core/sail/memory/src/test/java/org/eclipse/rdf4j/sail/memory/MemoryCascadeValueExceptionTest.java +++ b/core/sail/memory/src/test/java/org/eclipse/rdf4j/sail/memory/MemoryCascadeValueExceptionTest.java @@ -10,7 +10,6 @@ import org.eclipse.rdf4j.repository.CascadeValueExceptionTest; import org.eclipse.rdf4j.repository.Repository; import org.eclipse.rdf4j.repository.sail.SailRepository; -import org.eclipse.rdf4j.sail.memory.MemoryStore; public class MemoryCascadeValueExceptionTest extends CascadeValueExceptionTest { diff --git a/core/sail/memory/src/test/java/org/eclipse/rdf4j/sail/memory/MemoryGraphQueryResultTest.java b/core/sail/memory/src/test/java/org/eclipse/rdf4j/sail/memory/MemoryGraphQueryResultTest.java index eccd7f8932a..4732f055a81 100644 --- a/core/sail/memory/src/test/java/org/eclipse/rdf4j/sail/memory/MemoryGraphQueryResultTest.java +++ b/core/sail/memory/src/test/java/org/eclipse/rdf4j/sail/memory/MemoryGraphQueryResultTest.java @@ -10,7 +10,6 @@ import org.eclipse.rdf4j.repository.GraphQueryResultTest; import org.eclipse.rdf4j.repository.Repository; import org.eclipse.rdf4j.repository.sail.SailRepository; -import org.eclipse.rdf4j.sail.memory.MemoryStore; public class MemoryGraphQueryResultTest extends GraphQueryResultTest { diff --git a/core/sail/memory/src/test/java/org/eclipse/rdf4j/sail/memory/MemoryRDFStarSupportTest.java b/core/sail/memory/src/test/java/org/eclipse/rdf4j/sail/memory/MemoryRDFStarSupportTest.java new file mode 100644 index 00000000000..17d3830075a --- /dev/null +++ b/core/sail/memory/src/test/java/org/eclipse/rdf4j/sail/memory/MemoryRDFStarSupportTest.java @@ -0,0 +1,25 @@ +/******************************************************************************* + * Copyright (c) 2020 Eclipse RDF4J contributors. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Distribution License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ +package org.eclipse.rdf4j.sail.memory; + +import org.eclipse.rdf4j.repository.RDFStarSupportTest; +import org.eclipse.rdf4j.repository.Repository; +import org.eclipse.rdf4j.repository.sail.SailRepository; + +/** + * @author jeen + * + */ +public class MemoryRDFStarSupportTest extends RDFStarSupportTest { + + @Override + protected Repository createRepository() { + return new SailRepository(new MemoryStore()); + } + +} diff --git a/core/sail/memory/src/test/java/org/eclipse/rdf4j/sail/memory/MemorySparqlAggregatesTest.java b/core/sail/memory/src/test/java/org/eclipse/rdf4j/sail/memory/MemorySparqlAggregatesTest.java index 42bb1a29d3f..4c9623fdfe6 100644 --- a/core/sail/memory/src/test/java/org/eclipse/rdf4j/sail/memory/MemorySparqlAggregatesTest.java +++ b/core/sail/memory/src/test/java/org/eclipse/rdf4j/sail/memory/MemorySparqlAggregatesTest.java @@ -10,7 +10,6 @@ import org.eclipse.rdf4j.repository.Repository; import org.eclipse.rdf4j.repository.SparqlAggregatesTest; import org.eclipse.rdf4j.repository.sail.SailRepository; -import org.eclipse.rdf4j.sail.memory.MemoryStore; import org.junit.BeforeClass; public class MemorySparqlAggregatesTest extends SparqlAggregatesTest { diff --git a/core/sail/memory/src/test/java/org/eclipse/rdf4j/sail/memory/MemorySparqlDatasetTest.java b/core/sail/memory/src/test/java/org/eclipse/rdf4j/sail/memory/MemorySparqlDatasetTest.java index 30deb436172..ba2721dc8ad 100644 --- a/core/sail/memory/src/test/java/org/eclipse/rdf4j/sail/memory/MemorySparqlDatasetTest.java +++ b/core/sail/memory/src/test/java/org/eclipse/rdf4j/sail/memory/MemorySparqlDatasetTest.java @@ -10,7 +10,6 @@ import org.eclipse.rdf4j.repository.Repository; import org.eclipse.rdf4j.repository.SparqlDatasetTest; import org.eclipse.rdf4j.repository.sail.SailRepository; -import org.eclipse.rdf4j.sail.memory.MemoryStore; public class MemorySparqlDatasetTest extends SparqlDatasetTest { diff --git a/core/sail/memory/src/test/java/org/eclipse/rdf4j/sail/memory/MemorySparqlOrderByTest.java b/core/sail/memory/src/test/java/org/eclipse/rdf4j/sail/memory/MemorySparqlOrderByTest.java index 19823f991ff..267dae85810 100644 --- a/core/sail/memory/src/test/java/org/eclipse/rdf4j/sail/memory/MemorySparqlOrderByTest.java +++ b/core/sail/memory/src/test/java/org/eclipse/rdf4j/sail/memory/MemorySparqlOrderByTest.java @@ -10,7 +10,6 @@ import org.eclipse.rdf4j.repository.Repository; import org.eclipse.rdf4j.repository.SparqlOrderByTest; import org.eclipse.rdf4j.repository.sail.SailRepository; -import org.eclipse.rdf4j.sail.memory.MemoryStore; public class MemorySparqlOrderByTest extends SparqlOrderByTest { diff --git a/core/sail/memory/src/test/java/org/eclipse/rdf4j/sail/memory/MemorySparqlRegexTest.java b/core/sail/memory/src/test/java/org/eclipse/rdf4j/sail/memory/MemorySparqlRegexTest.java index 9ea72e04193..bd2d42c5baf 100644 --- a/core/sail/memory/src/test/java/org/eclipse/rdf4j/sail/memory/MemorySparqlRegexTest.java +++ b/core/sail/memory/src/test/java/org/eclipse/rdf4j/sail/memory/MemorySparqlRegexTest.java @@ -10,7 +10,6 @@ import org.eclipse.rdf4j.repository.Repository; import org.eclipse.rdf4j.repository.SparqlRegexTest; import org.eclipse.rdf4j.repository.sail.SailRepository; -import org.eclipse.rdf4j.sail.memory.MemoryStore; public class MemorySparqlRegexTest extends SparqlRegexTest { diff --git a/core/sail/memory/src/test/java/org/eclipse/rdf4j/sail/memory/MemorySparqlSetBindingTest.java b/core/sail/memory/src/test/java/org/eclipse/rdf4j/sail/memory/MemorySparqlSetBindingTest.java index 6d7af0ef16a..f1ad5dac885 100644 --- a/core/sail/memory/src/test/java/org/eclipse/rdf4j/sail/memory/MemorySparqlSetBindingTest.java +++ b/core/sail/memory/src/test/java/org/eclipse/rdf4j/sail/memory/MemorySparqlSetBindingTest.java @@ -10,7 +10,6 @@ import org.eclipse.rdf4j.repository.Repository; import org.eclipse.rdf4j.repository.SparqlSetBindingTest; import org.eclipse.rdf4j.repository.sail.SailRepository; -import org.eclipse.rdf4j.sail.memory.MemoryStore; public class MemorySparqlSetBindingTest extends SparqlSetBindingTest { diff --git a/core/sail/memory/src/test/java/org/eclipse/rdf4j/sail/memory/MemoryStoreConnectionTest.java b/core/sail/memory/src/test/java/org/eclipse/rdf4j/sail/memory/MemoryStoreConnectionTest.java index e3e28099c95..bcdb9bc0c81 100644 --- a/core/sail/memory/src/test/java/org/eclipse/rdf4j/sail/memory/MemoryStoreConnectionTest.java +++ b/core/sail/memory/src/test/java/org/eclipse/rdf4j/sail/memory/MemoryStoreConnectionTest.java @@ -11,7 +11,6 @@ import org.eclipse.rdf4j.repository.Repository; import org.eclipse.rdf4j.repository.RepositoryConnectionTest; import org.eclipse.rdf4j.repository.sail.SailRepository; -import org.eclipse.rdf4j.sail.memory.MemoryStore; public class MemoryStoreConnectionTest extends RepositoryConnectionTest { diff --git a/core/sail/memory/src/test/java/org/eclipse/rdf4j/sail/memory/MemoryStoreRepositoryTest.java b/core/sail/memory/src/test/java/org/eclipse/rdf4j/sail/memory/MemoryStoreRepositoryTest.java index f168d287351..8e4816e654c 100644 --- a/core/sail/memory/src/test/java/org/eclipse/rdf4j/sail/memory/MemoryStoreRepositoryTest.java +++ b/core/sail/memory/src/test/java/org/eclipse/rdf4j/sail/memory/MemoryStoreRepositoryTest.java @@ -10,7 +10,6 @@ import org.eclipse.rdf4j.repository.Repository; import org.eclipse.rdf4j.repository.RepositoryTest; import org.eclipse.rdf4j.repository.sail.SailRepository; -import org.eclipse.rdf4j.sail.memory.MemoryStore; public class MemoryStoreRepositoryTest extends RepositoryTest { diff --git a/core/sail/memory/src/test/java/org/eclipse/rdf4j/sail/memory/MemoryTupleQueryResultTest.java b/core/sail/memory/src/test/java/org/eclipse/rdf4j/sail/memory/MemoryTupleQueryResultTest.java index 7f3e0bd7b74..153630db908 100644 --- a/core/sail/memory/src/test/java/org/eclipse/rdf4j/sail/memory/MemoryTupleQueryResultTest.java +++ b/core/sail/memory/src/test/java/org/eclipse/rdf4j/sail/memory/MemoryTupleQueryResultTest.java @@ -10,7 +10,6 @@ import org.eclipse.rdf4j.repository.Repository; import org.eclipse.rdf4j.repository.TupleQueryResultTest; import org.eclipse.rdf4j.repository.sail.SailRepository; -import org.eclipse.rdf4j.sail.memory.MemoryStore; public class MemoryTupleQueryResultTest extends TupleQueryResultTest { diff --git a/core/sail/memory/src/test/java/org/eclipse/rdf4j/sail/memory/QueryPlanRetrievalTest.java b/core/sail/memory/src/test/java/org/eclipse/rdf4j/sail/memory/QueryPlanRetrievalTest.java new file mode 100644 index 00000000000..b840923fd48 --- /dev/null +++ b/core/sail/memory/src/test/java/org/eclipse/rdf4j/sail/memory/QueryPlanRetrievalTest.java @@ -0,0 +1,691 @@ +/******************************************************************************* + * Copyright (c) 2020 Eclipse RDF4J contributors. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Distribution License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ + +package org.eclipse.rdf4j.sail.memory; + +import static org.hamcrest.CoreMatchers.containsString; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertThat; +import static org.junit.Assert.assertTrue; + +import java.io.IOException; +import java.nio.charset.StandardCharsets; + +import org.apache.commons.io.IOUtils; +import org.eclipse.rdf4j.IsolationLevels; +import org.eclipse.rdf4j.model.ValueFactory; +import org.eclipse.rdf4j.model.impl.SimpleValueFactory; +import org.eclipse.rdf4j.model.vocabulary.FOAF; +import org.eclipse.rdf4j.model.vocabulary.RDF; +import org.eclipse.rdf4j.model.vocabulary.RDFS; +import org.eclipse.rdf4j.query.Query; +import org.eclipse.rdf4j.query.TupleQuery; +import org.eclipse.rdf4j.query.explanation.Explanation; +import org.eclipse.rdf4j.query.explanation.GenericPlanNode; +import org.eclipse.rdf4j.repository.sail.SailRepository; +import org.eclipse.rdf4j.repository.sail.SailRepositoryConnection; +import org.eclipse.rdf4j.rio.RDFFormat; +import org.junit.Assert; +import org.junit.Ignore; +import org.junit.Test; + +public class QueryPlanRetrievalTest { + + public static final String MAIN_QUERY = String.join("\n", "", + "{", + " {", + " OPTIONAL {", + " ?d ?e ?f", + " }", + " } ", + " ?a a ?c, ?d. ", + " FILTER(?c != ?d) ", + " OPTIONAL{", + " ?d ?e ?f", + " } ", + "}"); + + public static final String TUPLE_QUERY = "SELECT ?a WHERE " + MAIN_QUERY; + public static final String ASK_QUERY = "ASK WHERE " + MAIN_QUERY; + public static final String CONSTRUCT_QUERY = "CONSTRUCT {?a a ?c, ?d} WHERE " + MAIN_QUERY; + + public static final String SUB_QUERY = "select ?a where {{select ?a where {?a a ?type}} {SELECT ?a WHERE " + + MAIN_QUERY + "}}"; + + public static final String UNION_QUERY = "select ?a where {?a a ?type. {?a ?b ?c, ?c2. {?c2 a ?type1}UNION{?c2 a ?type2}} UNION {?type ?d ?c}}"; + + ValueFactory vf = SimpleValueFactory.getInstance(); + + private void addData(SailRepository sailRepository) { + try (SailRepositoryConnection connection = sailRepository.getConnection()) { + connection.add(RDFS.RESOURCE, RDF.TYPE, RDFS.RESOURCE); + connection.add(RDF.PROPERTY, RDF.TYPE, RDFS.RESOURCE); + connection.add(RDF.TYPE, RDF.TYPE, RDF.PROPERTY); + connection.add(RDF.TYPE, RDF.TYPE, RDFS.RESOURCE); + connection.add(vf.createBNode("01"), FOAF.KNOWS, vf.createBNode("02")); + connection.add(vf.createBNode("03"), FOAF.KNOWS, vf.createBNode("04")); + connection.add(vf.createBNode("05"), FOAF.KNOWS, vf.createBNode("06")); + connection.add(vf.createBNode("07"), FOAF.KNOWS, vf.createBNode("08")); + connection.add(vf.createBNode("09"), FOAF.KNOWS, vf.createBNode("10")); + connection.add(vf.createBNode("11"), FOAF.KNOWS, vf.createBNode("12")); + connection.add(vf.createBNode("13"), FOAF.KNOWS, vf.createBNode("14")); + connection.add(vf.createBNode("15"), FOAF.KNOWS, vf.createBNode("16")); + } + } + + @Test + public void testTupleQuery() { + SailRepository sailRepository = new SailRepository(new MemoryStore()); + try (SailRepositoryConnection connection = sailRepository.getConnection()) { + Query query = connection.prepareTupleQuery(TUPLE_QUERY); + + String actual = query.explain(Explanation.Level.Unoptimized).toString(); + + String expected = "Projection\n" + + " ProjectionElemList\n" + + " ProjectionElem \"a\"\n" + + " Filter\n" + + " Compare (!=)\n" + + " Var (name=c)\n" + + " Var (name=d)\n" + + " LeftJoin\n" + + " Join\n" + + " Join\n" + + " LeftJoin (new scope)\n" + + " SingletonSet\n" + + " StatementPattern\n" + + " Var (name=d)\n" + + " Var (name=e)\n" + + " Var (name=f)\n" + + " StatementPattern\n" + + " Var (name=a)\n" + + " Var (name=_const_f5e5585a_uri, value=http://www.w3.org/1999/02/22-rdf-syntax-ns#type, anonymous)\n" + + + " Var (name=c)\n" + + " StatementPattern\n" + + " Var (name=a)\n" + + " Var (name=_const_f5e5585a_uri, value=http://www.w3.org/1999/02/22-rdf-syntax-ns#type, anonymous)\n" + + + " Var (name=d)\n" + + " StatementPattern\n" + + " Var (name=d)\n" + + " Var (name=e)\n" + + " Var (name=f)\n"; + + Assert.assertEquals(expected, actual); + + } + sailRepository.shutDown(); + } + + @Test + public void testTupleQueryOptimized() { + SailRepository sailRepository = new SailRepository(new MemoryStore()); + addData(sailRepository); + + try (SailRepositoryConnection connection = sailRepository.getConnection()) { + TupleQuery query = connection.prepareTupleQuery(TUPLE_QUERY); + String actual = query.explain(Explanation.Level.Optimized).toString(); + String expected = "Projection\n" + + " ProjectionElemList\n" + + " ProjectionElem \"a\"\n" + + " LeftJoin (LeftJoinIterator)\n" + + " Join (JoinIterator)\n" + + " StatementPattern (costEstimate=1, resultSizeEstimate=4)\n" + + " Var (name=a)\n" + + " Var (name=_const_f5e5585a_uri, value=http://www.w3.org/1999/02/22-rdf-syntax-ns#type, anonymous)\n" + + + " Var (name=d)\n" + + " Filter\n" + + " Compare (!=)\n" + + " Var (name=c)\n" + + " Var (name=d)\n" + + " Join\n" + + " StatementPattern (costEstimate=2, resultSizeEstimate=4)\n" + + " Var (name=a)\n" + + " Var (name=_const_f5e5585a_uri, value=http://www.w3.org/1999/02/22-rdf-syntax-ns#type, anonymous)\n" + + + " Var (name=c)\n" + + " LeftJoin (new scope) (costEstimate=5, resultSizeEstimate=12)\n" + + " SingletonSet\n" + + " StatementPattern (resultSizeEstimate=12)\n" + + " Var (name=d)\n" + + " Var (name=e)\n" + + " Var (name=f)\n" + + " StatementPattern (resultSizeEstimate=12)\n" + + " Var (name=d)\n" + + " Var (name=e)\n" + + " Var (name=f)\n"; + Assert.assertEquals(expected, actual); + + } + sailRepository.shutDown(); + + } + + @Test + @Ignore + public void testTupleQueryTimed() { + SailRepository sailRepository = new SailRepository(new MemoryStore()); + addData(sailRepository); + + try (SailRepositoryConnection connection = sailRepository.getConnection()) { + TupleQuery query = connection.prepareTupleQuery(TUPLE_QUERY); + + GenericPlanNode genericPlanNode = query.explain(Explanation.Level.Timed).toGenericPlanNode(); + + GenericPlanNode leftJoin = genericPlanNode.getPlans().get(1); + GenericPlanNode filterNode = genericPlanNode.getPlans().get(1).getPlans().get(0).getPlans().get(1); + + assertEquals("LeftJoin", leftJoin.getType()); + assertEquals("Filter", filterNode.getType()); + + assertTrue(filterNode.getSelfTimeActual() > leftJoin.getSelfTimeActual()); + assertTrue(filterNode.getSelfTimeActual() < leftJoin.getTotalTimeActual()); + + assertThat(genericPlanNode.toString(), containsString("selfTimeActual")); + assertThat(genericPlanNode.toString(), containsString("totalTimeActual")); + + } + sailRepository.shutDown(); + + } + + @Test + public void testTupleQueryExecuted() { + SailRepository sailRepository = new SailRepository(new MemoryStore()); + addData(sailRepository); + + try (SailRepositoryConnection connection = sailRepository.getConnection()) { + Query query = connection.prepareTupleQuery(TUPLE_QUERY); + + String actual = query.explain(Explanation.Level.Executed).toString(); + String expected = "Projection (resultSizeActual=2)\n" + + " ProjectionElemList\n" + + " ProjectionElem \"a\"\n" + + " LeftJoin (LeftJoinIterator) (resultSizeActual=2)\n" + + " Join (JoinIterator) (resultSizeActual=2)\n" + + " StatementPattern (costEstimate=1, resultSizeEstimate=4, resultSizeActual=4)\n" + + " Var (name=a)\n" + + " Var (name=_const_f5e5585a_uri, value=http://www.w3.org/1999/02/22-rdf-syntax-ns#type, anonymous)\n" + + + " Var (name=d)\n" + + " Filter (resultSizeActual=2)\n" + + " Compare (!=)\n" + + " Var (name=c)\n" + + " Var (name=d)\n" + + " Join (HashJoinIteration) (resultSizeActual=6)\n" + + " StatementPattern (costEstimate=2, resultSizeEstimate=4, resultSizeActual=6)\n" + + " Var (name=a)\n" + + " Var (name=_const_f5e5585a_uri, value=http://www.w3.org/1999/02/22-rdf-syntax-ns#type, anonymous)\n" + + + " Var (name=c)\n" + + " LeftJoin (new scope) (BadlyDesignedLeftJoinIterator) (costEstimate=5, resultSizeEstimate=12, resultSizeActual=4)\n" + + + " SingletonSet (resultSizeActual=4)\n" + + " StatementPattern (resultSizeEstimate=12, resultSizeActual=48)\n" + + " Var (name=d)\n" + + " Var (name=e)\n" + + " Var (name=f)\n" + + " StatementPattern (resultSizeEstimate=12, resultSizeActual=2)\n" + + " Var (name=d)\n" + + " Var (name=e)\n" + + " Var (name=f)\n"; + Assert.assertEquals(expected, actual); + + } + sailRepository.shutDown(); + + } + + @Test + public void testGenericPlanNode() { + SailRepository sailRepository = new SailRepository(new MemoryStore()); + addData(sailRepository); + + try (SailRepositoryConnection connection = sailRepository.getConnection()) { + Query query = connection.prepareTupleQuery(TUPLE_QUERY); + + String actual = query.explain(Explanation.Level.Executed).toGenericPlanNode().toString(); + String expected = "Projection (resultSizeActual=2)\n" + + " ProjectionElemList\n" + + " ProjectionElem \"a\"\n" + + " LeftJoin (LeftJoinIterator) (resultSizeActual=2)\n" + + " Join (JoinIterator) (resultSizeActual=2)\n" + + " StatementPattern (costEstimate=1, resultSizeEstimate=4, resultSizeActual=4)\n" + + " Var (name=a)\n" + + " Var (name=_const_f5e5585a_uri, value=http://www.w3.org/1999/02/22-rdf-syntax-ns#type, anonymous)\n" + + + " Var (name=d)\n" + + " Filter (resultSizeActual=2)\n" + + " Compare (!=)\n" + + " Var (name=c)\n" + + " Var (name=d)\n" + + " Join (HashJoinIteration) (resultSizeActual=6)\n" + + " StatementPattern (costEstimate=2, resultSizeEstimate=4, resultSizeActual=6)\n" + + " Var (name=a)\n" + + " Var (name=_const_f5e5585a_uri, value=http://www.w3.org/1999/02/22-rdf-syntax-ns#type, anonymous)\n" + + + " Var (name=c)\n" + + " LeftJoin (new scope) (BadlyDesignedLeftJoinIterator) (costEstimate=5, resultSizeEstimate=12, resultSizeActual=4)\n" + + + " SingletonSet (resultSizeActual=4)\n" + + " StatementPattern (resultSizeEstimate=12, resultSizeActual=48)\n" + + " Var (name=d)\n" + + " Var (name=e)\n" + + " Var (name=f)\n" + + " StatementPattern (resultSizeEstimate=12, resultSizeActual=2)\n" + + " Var (name=d)\n" + + " Var (name=e)\n" + + " Var (name=f)\n"; + Assert.assertEquals(expected, actual); + } + sailRepository.shutDown(); + + } + + @Test + public void testJsonPlanNode() { + SailRepository sailRepository = new SailRepository(new MemoryStore()); + addData(sailRepository); + + try (SailRepositoryConnection connection = sailRepository.getConnection()) { + Query query = connection.prepareTupleQuery(TUPLE_QUERY); + + String actual = query.explain(Explanation.Level.Executed).toJson(); + String expected = "{\n" + + " \"type\" : \"Projection\",\n" + + " \"resultSizeActual\" : 2,\n" + + " \"plans\" : [ {\n" + + " \"type\" : \"ProjectionElemList\",\n" + + " \"plans\" : [ {\n" + + " \"type\" : \"ProjectionElem \\\"a\\\"\"\n" + + " } ]\n" + + " }, {\n" + + " \"type\" : \"LeftJoin\",\n" + + " \"resultSizeActual\" : 2,\n" + + " \"algorithm\" : \"LeftJoinIterator\",\n" + + " \"plans\" : [ {\n" + + " \"type\" : \"Join\",\n" + + " \"resultSizeActual\" : 2,\n" + + " \"algorithm\" : \"JoinIterator\",\n" + + " \"plans\" : [ {\n" + + " \"type\" : \"StatementPattern\",\n" + + " \"costEstimate\" : 1.3333333333333333,\n" + + " \"resultSizeEstimate\" : 4.0,\n" + + " \"resultSizeActual\" : 4,\n" + + " \"plans\" : [ {\n" + + " \"type\" : \"Var (name=a)\"\n" + + " }, {\n" + + " \"type\" : \"Var (name=_const_f5e5585a_uri, value=http://www.w3.org/1999/02/22-rdf-syntax-ns#type, anonymous)\"\n" + + + " }, {\n" + + " \"type\" : \"Var (name=d)\"\n" + + " } ]\n" + + " }, {\n" + + " \"type\" : \"Filter\",\n" + + " \"resultSizeActual\" : 2,\n" + + " \"plans\" : [ {\n" + + " \"type\" : \"Compare (!=)\",\n" + + " \"plans\" : [ {\n" + + " \"type\" : \"Var (name=c)\"\n" + + " }, {\n" + + " \"type\" : \"Var (name=d)\"\n" + + " } ]\n" + + " }, {\n" + + " \"type\" : \"Join\",\n" + + " \"resultSizeActual\" : 6,\n" + + " \"algorithm\" : \"HashJoinIteration\",\n" + + " \"plans\" : [ {\n" + + " \"type\" : \"StatementPattern\",\n" + + " \"costEstimate\" : 2.0,\n" + + " \"resultSizeEstimate\" : 4.0,\n" + + " \"resultSizeActual\" : 6,\n" + + " \"plans\" : [ {\n" + + " \"type\" : \"Var (name=a)\"\n" + + " }, {\n" + + " \"type\" : \"Var (name=_const_f5e5585a_uri, value=http://www.w3.org/1999/02/22-rdf-syntax-ns#type, anonymous)\"\n" + + + " }, {\n" + + " \"type\" : \"Var (name=c)\"\n" + + " } ]\n" + + " }, {\n" + + " \"type\" : \"LeftJoin\",\n" + + " \"costEstimate\" : 5.241482788417793,\n" + + " \"resultSizeEstimate\" : 12.0,\n" + + " \"resultSizeActual\" : 4,\n" + + " \"newScope\" : true,\n" + + " \"algorithm\" : \"BadlyDesignedLeftJoinIterator\",\n" + + " \"plans\" : [ {\n" + + " \"type\" : \"SingletonSet\",\n" + + " \"resultSizeActual\" : 4\n" + + " }, {\n" + + " \"type\" : \"StatementPattern\",\n" + + " \"resultSizeEstimate\" : 12.0,\n" + + " \"resultSizeActual\" : 48,\n" + + " \"plans\" : [ {\n" + + " \"type\" : \"Var (name=d)\"\n" + + " }, {\n" + + " \"type\" : \"Var (name=e)\"\n" + + " }, {\n" + + " \"type\" : \"Var (name=f)\"\n" + + " } ]\n" + + " } ]\n" + + " } ]\n" + + " } ]\n" + + " } ]\n" + + " }, {\n" + + " \"type\" : \"StatementPattern\",\n" + + " \"resultSizeEstimate\" : 12.0,\n" + + " \"resultSizeActual\" : 2,\n" + + " \"plans\" : [ {\n" + + " \"type\" : \"Var (name=d)\"\n" + + " }, {\n" + + " \"type\" : \"Var (name=e)\"\n" + + " }, {\n" + + " \"type\" : \"Var (name=f)\"\n" + + " } ]\n" + + " } ]\n" + + " } ]\n" + + "}"; + Assert.assertEquals(expected, actual); + + } + sailRepository.shutDown(); + + } + + @Test + public void testAskQuery() { + SailRepository sailRepository = new SailRepository(new MemoryStore()); + addData(sailRepository); + + try (SailRepositoryConnection connection = sailRepository.getConnection()) { + Query query = connection.prepareBooleanQuery(ASK_QUERY); + + String actual = query.explain(Explanation.Level.Executed).toString(); + String expected = "Slice (limit=1) (resultSizeActual=1)\n" + + " LeftJoin (LeftJoinIterator) (resultSizeActual=1)\n" + + " Join (JoinIterator) (resultSizeActual=1)\n" + + " StatementPattern (costEstimate=1, resultSizeEstimate=4, resultSizeActual=3)\n" + + " Var (name=a)\n" + + " Var (name=_const_f5e5585a_uri, value=http://www.w3.org/1999/02/22-rdf-syntax-ns#type, anonymous)\n" + + + " Var (name=d)\n" + + " Filter (resultSizeActual=1)\n" + + " Compare (!=)\n" + + " Var (name=c)\n" + + " Var (name=d)\n" + + " Join (HashJoinIteration) (resultSizeActual=4)\n" + + " StatementPattern (costEstimate=2, resultSizeEstimate=4, resultSizeActual=4)\n" + + " Var (name=a)\n" + + " Var (name=_const_f5e5585a_uri, value=http://www.w3.org/1999/02/22-rdf-syntax-ns#type, anonymous)\n" + + + " Var (name=c)\n" + + " LeftJoin (new scope) (BadlyDesignedLeftJoinIterator) (costEstimate=5, resultSizeEstimate=12, resultSizeActual=3)\n" + + + " SingletonSet (resultSizeActual=3)\n" + + " StatementPattern (resultSizeEstimate=12, resultSizeActual=36)\n" + + " Var (name=d)\n" + + " Var (name=e)\n" + + " Var (name=f)\n" + + " StatementPattern (resultSizeEstimate=12, resultSizeActual=1)\n" + + " Var (name=d)\n" + + " Var (name=e)\n" + + " Var (name=f)\n"; + Assert.assertEquals(expected, actual); + + } + sailRepository.shutDown(); + + } + + @Test + public void testConstructQuery() { + SailRepository sailRepository = new SailRepository(new MemoryStore()); + addData(sailRepository); + + try (SailRepositoryConnection connection = sailRepository.getConnection()) { + Query query = connection.prepareGraphQuery(CONSTRUCT_QUERY); + + String actual = query.explain(Explanation.Level.Executed).toString(); + String expected = "Reduced (resultSizeActual=3)\n" + + " MultiProjection (resultSizeActual=4)\n" + + " ProjectionElemList\n" + + " ProjectionElem \"a\" AS \"subject\"\n" + + " ProjectionElem \"_const_f5e5585a_uri\" AS \"predicate\"\n" + + " ProjectionElem \"c\" AS \"object\"\n" + + " ProjectionElemList\n" + + " ProjectionElem \"a\" AS \"subject\"\n" + + " ProjectionElem \"_const_f5e5585a_uri\" AS \"predicate\"\n" + + " ProjectionElem \"d\" AS \"object\"\n" + + " Extension (resultSizeActual=2)\n" + + " ExtensionElem (_const_f5e5585a_uri)\n" + + " ValueConstant (value=http://www.w3.org/1999/02/22-rdf-syntax-ns#type)\n" + + " LeftJoin (LeftJoinIterator) (resultSizeActual=2)\n" + + " Join (JoinIterator) (resultSizeActual=2)\n" + + " StatementPattern (costEstimate=1, resultSizeEstimate=4, resultSizeActual=4)\n" + + " Var (name=a)\n" + + " Var (name=_const_f5e5585a_uri, value=http://www.w3.org/1999/02/22-rdf-syntax-ns#type, anonymous)\n" + + + " Var (name=d)\n" + + " Filter (resultSizeActual=2)\n" + + " Compare (!=)\n" + + " Var (name=c)\n" + + " Var (name=d)\n" + + " Join (HashJoinIteration) (resultSizeActual=6)\n" + + " StatementPattern (costEstimate=2, resultSizeEstimate=4, resultSizeActual=6)\n" + + + " Var (name=a)\n" + + " Var (name=_const_f5e5585a_uri, value=http://www.w3.org/1999/02/22-rdf-syntax-ns#type, anonymous)\n" + + + " Var (name=c)\n" + + " LeftJoin (new scope) (BadlyDesignedLeftJoinIterator) (costEstimate=5, resultSizeEstimate=12, resultSizeActual=4)\n" + + + " SingletonSet (resultSizeActual=4)\n" + + " StatementPattern (resultSizeEstimate=12, resultSizeActual=48)\n" + + " Var (name=d)\n" + + " Var (name=e)\n" + + " Var (name=f)\n" + + " StatementPattern (resultSizeEstimate=12, resultSizeActual=2)\n" + + " Var (name=d)\n" + + " Var (name=e)\n" + + " Var (name=f)\n"; + Assert.assertEquals(expected, actual); + + } + sailRepository.shutDown(); + + } + + @Ignore // slow test used for debugging + @Test + public void bigDataset() throws IOException { + SailRepository repository = new SailRepository(new MemoryStore()); + + try (SailRepositoryConnection connection = repository.getConnection()) { + connection.begin(IsolationLevels.NONE); + connection.add(QueryPlanRetrievalTest.class.getClassLoader() + .getResourceAsStream("benchmarkFiles/datagovbe-valid.ttl"), "", RDFFormat.TURTLE); + connection.commit(); + } + + String query1 = IOUtils.toString( + QueryPlanRetrievalTest.class.getClassLoader().getResourceAsStream("benchmarkFiles/query1.qr"), + StandardCharsets.UTF_8); + + try (SailRepositoryConnection connection = repository.getConnection()) { + String s = connection.prepareTupleQuery(query1).explain(Explanation.Level.Timed).toString(); + System.out.println(s); + } + + repository.shutDown(); + + } + + @Test + public void testSubQuery() { + SailRepository sailRepository = new SailRepository(new MemoryStore()); + addData(sailRepository); + + try (SailRepositoryConnection connection = sailRepository.getConnection()) { + Query query = connection.prepareTupleQuery(SUB_QUERY); + + String actual = query.explain(Explanation.Level.Executed).toString(); + String expected = "Projection (resultSizeActual=4)\n" + + " ProjectionElemList\n" + + " ProjectionElem \"a\"\n" + + " Join (HashJoinIteration) (resultSizeActual=4)\n" + + " Projection (new scope) (resultSizeActual=4)\n" + + " ProjectionElemList\n" + + " ProjectionElem \"a\"\n" + + " StatementPattern (resultSizeActual=4)\n" + + " Var (name=a)\n" + + " Var (name=_const_f5e5585a_uri, value=http://www.w3.org/1999/02/22-rdf-syntax-ns#type, anonymous)\n" + + + " Var (name=type)\n" + + " Projection (new scope) (resultSizeActual=2)\n" + + " ProjectionElemList\n" + + " ProjectionElem \"a\"\n" + + " LeftJoin (LeftJoinIterator) (resultSizeActual=2)\n" + + " Join (JoinIterator) (resultSizeActual=2)\n" + + " Filter (resultSizeActual=44)\n" + + " Compare (!=)\n" + + " Var (name=c)\n" + + " Var (name=d)\n" + + " Join (JoinIterator) (resultSizeActual=48)\n" + + " LeftJoin (new scope) (LeftJoinIterator) (resultSizeActual=12)\n" + + " SingletonSet (resultSizeActual=1)\n" + + " StatementPattern (resultSizeActual=12)\n" + + " Var (name=d)\n" + + " Var (name=e)\n" + + " Var (name=f)\n" + + " StatementPattern (resultSizeActual=48)\n" + + " Var (name=a)\n" + + " Var (name=_const_f5e5585a_uri, value=http://www.w3.org/1999/02/22-rdf-syntax-ns#type, anonymous)\n" + + + " Var (name=c)\n" + + " StatementPattern (resultSizeActual=2)\n" + + " Var (name=a)\n" + + " Var (name=_const_f5e5585a_uri, value=http://www.w3.org/1999/02/22-rdf-syntax-ns#type, anonymous)\n" + + + " Var (name=d)\n" + + " StatementPattern (resultSizeActual=2)\n" + + " Var (name=d)\n" + + " Var (name=e)\n" + + " Var (name=f)\n"; + Assert.assertEquals(expected, actual); + + } + + sailRepository.shutDown(); + + } + + @Test + public void testUnionQuery() { + SailRepository sailRepository = new SailRepository(new MemoryStore()); + addData(sailRepository); + + try (SailRepositoryConnection connection = sailRepository.getConnection()) { + Query query = connection.prepareTupleQuery(UNION_QUERY); + + String actual = query.explain(Explanation.Level.Executed).toString(); + String expected = "Projection (resultSizeActual=0)\n" + + " ProjectionElemList\n" + + " ProjectionElem \"a\"\n" + + " Join (HashJoinIteration) (resultSizeActual=0)\n" + + " StatementPattern (costEstimate=1, resultSizeEstimate=4, resultSizeActual=4)\n" + + " Var (name=a)\n" + + " Var (name=_const_f5e5585a_uri, value=http://www.w3.org/1999/02/22-rdf-syntax-ns#type, anonymous)\n" + + + " Var (name=type)\n" + + " Union (new scope) (resultSizeActual=24)\n" + + " Join (HashJoinIteration) (resultSizeActual=12)\n" + + " StatementPattern (costEstimate=2, resultSizeEstimate=12, resultSizeActual=12)\n" + + " Var (name=a)\n" + + " Var (name=b)\n" + + " Var (name=c2)\n" + + " Union (new scope) (resultSizeActual=96)\n" + + " Join (JoinIterator) (resultSizeActual=48)\n" + + " StatementPattern (new scope) (costEstimate=2, resultSizeEstimate=4, resultSizeActual=4)\n" + + + " Var (name=c2)\n" + + " Var (name=_const_f5e5585a_uri, value=http://www.w3.org/1999/02/22-rdf-syntax-ns#type, anonymous)\n" + + + " Var (name=type1)\n" + + " StatementPattern (costEstimate=2, resultSizeEstimate=12, resultSizeActual=48)\n" + + + " Var (name=a)\n" + + " Var (name=b)\n" + + " Var (name=c)\n" + + " Join (JoinIterator) (resultSizeActual=48)\n" + + " StatementPattern (new scope) (costEstimate=2, resultSizeEstimate=4, resultSizeActual=4)\n" + + + " Var (name=c2)\n" + + " Var (name=_const_f5e5585a_uri, value=http://www.w3.org/1999/02/22-rdf-syntax-ns#type, anonymous)\n" + + + " Var (name=type2)\n" + + " StatementPattern (costEstimate=2, resultSizeEstimate=12, resultSizeActual=48)\n" + + + " Var (name=a)\n" + + " Var (name=b)\n" + + " Var (name=c)\n" + + " StatementPattern (new scope) (costEstimate=5, resultSizeEstimate=12, resultSizeActual=12)\n" + + + " Var (name=type)\n" + + " Var (name=d)\n" + + " Var (name=c)\n"; + Assert.assertEquals(expected, actual); + + } + + sailRepository.shutDown(); + + } + + @Test + public void testTimeout() { + SailRepository sailRepository = new SailRepository(new MemoryStore()); + try (SailRepositoryConnection connection = sailRepository.getConnection()) { + connection.begin(); + for (int i = 0; i < 1000; i++) { + connection.add(vf.createBNode(i + ""), RDF.TYPE, vf.createBNode((i + 1) + "")); + connection.add(vf.createBNode(i + ""), RDF.TYPE, vf.createBNode((i - 1) + "")); + + connection.add(vf.createBNode(i + ""), RDF.TYPE, vf.createBNode((i + 2) + "")); + connection.add(vf.createBNode(i + ""), RDF.TYPE, vf.createBNode((i - 2) + "")); + } + connection.commit(); + } + + try (SailRepositoryConnection connection = sailRepository.getConnection()) { + Query query = connection.prepareTupleQuery(String.join("\n", "", + "select * where {", + " ?a (a|^a)* ?type. ", + " FILTER NOT EXISTS{?a (a|^a)* ?type} ", + " FILTER NOT EXISTS{?a (a|^a)* ?type} ", + " FILTER NOT EXISTS{?a (a|^a)* ?type} ", + " FILTER NOT EXISTS{?a (a|^a)* ?type}", + " FILTER NOT EXISTS{?a (a|^a)* ?type}", + " FILTER NOT EXISTS{?a (a|^a)* ?type}", + " FILTER NOT EXISTS{?a (a|^a)* ?type}", + " FILTER NOT EXISTS{?a (a|^a)* ?type}", + "}")); + + query.setMaxExecutionTime(1); + + String actual = query.explain(Explanation.Level.Timed).toString(); + Assert.assertThat(actual, containsString("Timed out")); + + } + sailRepository.shutDown(); + + } + +} diff --git a/core/sail/memory/src/test/java/org/eclipse/rdf4j/sail/memory/benchmark/MemoryBenchmark.java b/core/sail/memory/src/test/java/org/eclipse/rdf4j/sail/memory/benchmark/MemoryBenchmark.java index 99237367542..1d9b95e7a6d 100644 --- a/core/sail/memory/src/test/java/org/eclipse/rdf4j/sail/memory/benchmark/MemoryBenchmark.java +++ b/core/sail/memory/src/test/java/org/eclipse/rdf4j/sail/memory/benchmark/MemoryBenchmark.java @@ -8,7 +8,6 @@ import org.eclipse.rdf4j.IsolationLevels; import org.eclipse.rdf4j.common.iteration.CloseableIteration; -import org.eclipse.rdf4j.common.iteration.Iterations; import org.eclipse.rdf4j.model.IRI; import org.eclipse.rdf4j.model.Statement; import org.eclipse.rdf4j.model.ValueFactory; diff --git a/core/sail/memory/src/test/java/org/eclipse/rdf4j/sail/memory/model/MemTripleTest.java b/core/sail/memory/src/test/java/org/eclipse/rdf4j/sail/memory/model/MemTripleTest.java new file mode 100644 index 00000000000..59dd6ff278a --- /dev/null +++ b/core/sail/memory/src/test/java/org/eclipse/rdf4j/sail/memory/model/MemTripleTest.java @@ -0,0 +1,66 @@ +/******************************************************************************* + * Copyright (c) 2020 Eclipse RDF4J contributors. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Distribution License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ +package org.eclipse.rdf4j.sail.memory.model; + +import static org.assertj.core.api.Assertions.assertThat; + +import org.eclipse.rdf4j.model.IRI; +import org.eclipse.rdf4j.model.Triple; +import org.eclipse.rdf4j.model.impl.SimpleTriple; +import org.eclipse.rdf4j.model.impl.SimpleValueFactory; +import org.junit.Before; +import org.junit.Test; + +/** + * Unit tests for the memory-specific implementation of the {@link Triple} interface. + * + * @author Jeen Broekstra + * + */ +public class MemTripleTest { + + private MemTriple triple; + private MemIRI subject, predicate, object; + + private IRI s1, p1, o1; + + @Before + public void setUp() throws Exception { + + SimpleValueFactory svf = SimpleValueFactory.getInstance(); + + s1 = svf.createIRI("foo:s1"); + p1 = svf.createIRI("foo:p1"); + o1 = svf.createIRI("foo:o1"); + + subject = new MemIRI(this, s1.getNamespace(), s1.getLocalName()); + predicate = new MemIRI(this, p1.getNamespace(), p1.getLocalName()); + object = new MemIRI(this, o1.getNamespace(), o1.getLocalName()); + triple = new MemTriple(this, subject, predicate, object); + } + + @Test + public void testStringValue() { + assertThat(triple.stringValue()) + .startsWith("<<") + .contains(s1.stringValue()) + .contains(p1.stringValue()) + .contains(o1.stringValue()) + .endsWith(">>"); + } + + @Test + public void testEquals() { + SimpleTriple equalTriple = (SimpleTriple) SimpleValueFactory.getInstance().createTriple(s1, p1, o1); + assertThat(triple).isEqualTo(equalTriple); + + SimpleTriple unequalTriple = (SimpleTriple) SimpleValueFactory.getInstance().createTriple(s1, o1, p1); + assertThat(triple).isNotEqualTo(unequalTriple); + } + +} diff --git a/core/sail/model/pom.xml b/core/sail/model/pom.xml index e0b0ba230b1..2f36189bd3d 100644 --- a/core/sail/model/pom.xml +++ b/core/sail/model/pom.xml @@ -4,7 +4,7 @@ org.eclipse.rdf4j rdf4j-sail - 3.1.5-SNAPSHOT + 3.2.2-SNAPSHOT rdf4j-sail-model RDF4J: Sail Model diff --git a/core/sail/model/src/main/java/org/eclipse/rdf4j/sail/model/NonSerializables.java b/core/sail/model/src/main/java/org/eclipse/rdf4j/sail/model/NonSerializables.java index 42854007daf..a0d0aacbe99 100644 --- a/core/sail/model/src/main/java/org/eclipse/rdf4j/sail/model/NonSerializables.java +++ b/core/sail/model/src/main/java/org/eclipse/rdf4j/sail/model/NonSerializables.java @@ -18,7 +18,7 @@ /** * A registry to support (de)serialization of objects (over the lifetime of the VM). It uses weak references to allow * entries to be garbage-collected when no longer used. - * + * * @author Mark * @deprecated this feature is for internal use only: its existence, signature or behavior may change without warning * from one release to the next. @@ -29,7 +29,7 @@ public class NonSerializables { /** * Retrieve the object registered with the supplied key. - * + * * @param key the key. * @return the registered object, or null if no matching EvaluationStrategy can be found. */ @@ -39,7 +39,7 @@ public static final Object get(UUID key) { /** * Retrieves the registry key for the given object. - * + * * @param obj the object for which to retrieve the registry key. * @return the registry key with which the supplied object can be retrieved, or null if the supplied * object is not in the registry. @@ -64,7 +64,7 @@ public static final UUID getKey(Object obj) { /** * Add an object to the registry and returns the registry key. If the object is already present, the operation * simply returns the key with which it is currently registered. - * + * * @param obj the object to register * @return the key with which the object is registered. */ diff --git a/core/sail/model/src/main/java/org/eclipse/rdf4j/sail/model/SailModel.java b/core/sail/model/src/main/java/org/eclipse/rdf4j/sail/model/SailModel.java index 626d6907411..0cdb1521ef1 100644 --- a/core/sail/model/src/main/java/org/eclipse/rdf4j/sail/model/SailModel.java +++ b/core/sail/model/src/main/java/org/eclipse/rdf4j/sail/model/SailModel.java @@ -38,9 +38,9 @@ * Model implementation for a {@link org.eclipse.rdf4j.sail.SailConnection}. All * {@link org.eclipse.rdf4j.sail.SailException}s are wrapped in a {@link org.eclipse.rdf4j.model.util.ModelException}. * Not thread-safe. - * + * * @author Mark - * + * * @deprecated this feature is for internal use only: its existence, signature or behavior may change without warning * from one release to the next. */ @@ -129,8 +129,9 @@ public boolean contains(Resource subj, IRI pred, Value obj, Resource... contexts @Override public boolean add(Resource subj, IRI pred, Value obj, Resource... contexts) { - if (subj == null || pred == null || obj == null) + if (subj == null || pred == null || obj == null) { throw new UnsupportedOperationException("Incomplete statement"); + } boolean exists = contains(subj, pred, obj, contexts); if (!exists) { try { @@ -208,7 +209,7 @@ public Iterator iterator() { private Iterator iterator(Resource subj, IRI pred, Value obj, Resource... contexts) { try { Iteration iter = conn.getStatements(subj, pred, obj, includeInferred, contexts); - return new CloseableIterationIterator( + return new CloseableIterationIterator<>( new ExceptionConvertingIteration(iter) { private Statement last; diff --git a/core/sail/model/src/main/java/org/eclipse/rdf4j/sail/model/package-info.java b/core/sail/model/src/main/java/org/eclipse/rdf4j/sail/model/package-info.java index ec92ba29f14..4a7cb9dc890 100644 --- a/core/sail/model/src/main/java/org/eclipse/rdf4j/sail/model/package-info.java +++ b/core/sail/model/src/main/java/org/eclipse/rdf4j/sail/model/package-info.java @@ -1,7 +1,7 @@ @Deprecated @InternalUseOnly /** - * + * * @deprecated since 3.0. This package is for internal use only: its existence, signature or behavior may change without * warning from one release to the next. */ diff --git a/core/sail/model/src/test/java/org/eclipse/rdf4j/sail/model/SailModelNamespacesTest.java b/core/sail/model/src/test/java/org/eclipse/rdf4j/sail/model/SailModelNamespacesTest.java index 371914e6484..207ac5ad6e7 100644 --- a/core/sail/model/src/test/java/org/eclipse/rdf4j/sail/model/SailModelNamespacesTest.java +++ b/core/sail/model/src/test/java/org/eclipse/rdf4j/sail/model/SailModelNamespacesTest.java @@ -14,7 +14,6 @@ import org.eclipse.rdf4j.sail.SailConnection; import org.eclipse.rdf4j.sail.SailException; import org.eclipse.rdf4j.sail.memory.MemoryStore; -import org.eclipse.rdf4j.sail.model.SailModel; /** * @author Mark diff --git a/core/sail/nativerdf/pom.xml b/core/sail/nativerdf/pom.xml index bb4eb1aa5c1..b21edb5be02 100644 --- a/core/sail/nativerdf/pom.xml +++ b/core/sail/nativerdf/pom.xml @@ -4,7 +4,7 @@ org.eclipse.rdf4j rdf4j-sail - 3.1.5-SNAPSHOT + 3.2.2-SNAPSHOT rdf4j-sail-nativerdf RDF4J: NativeStore @@ -44,6 +44,10 @@ org.slf4j slf4j-api + + org.apache.commons + commons-collections4 + ${project.groupId} rdf4j-sail-testsuite diff --git a/core/sail/nativerdf/src/main/java/org/eclipse/rdf4j/sail/nativerdf/ConcurrentCache.java b/core/sail/nativerdf/src/main/java/org/eclipse/rdf4j/sail/nativerdf/ConcurrentCache.java index 1fa1acf4bf0..8f12653e75b 100644 --- a/core/sail/nativerdf/src/main/java/org/eclipse/rdf4j/sail/nativerdf/ConcurrentCache.java +++ b/core/sail/nativerdf/src/main/java/org/eclipse/rdf4j/sail/nativerdf/ConcurrentCache.java @@ -61,16 +61,18 @@ protected void cleanUp() { // This is not thread-safe, but the worst that can happen is that we may (rarely) get slightly longer // cleanup intervals or run cleanUp twice cleanupTick++; - if (cleanupTick <= CLEANUP_INTERVAL) + if (cleanupTick <= CLEANUP_INTERVAL) { return; + } cleanupTick %= CLEANUP_INTERVAL; synchronized (cache) { final int size = cache.size(); - if (size < capacity + CLEANUP_INTERVAL / 2) + if (size < capacity + CLEANUP_INTERVAL / 2) { return; + } Iterator iter = cache.keySet().iterator(); @@ -80,8 +82,9 @@ protected void cleanUp() { K key = iter.next(); - if (i % removeEachTh < 1) + if (i % removeEachTh < 1) { cache.computeIfPresent(key, (k, v) -> onEntryRemoval(k) ? null : v); + } } } } diff --git a/core/sail/nativerdf/src/main/java/org/eclipse/rdf4j/sail/nativerdf/ContextStore.java b/core/sail/nativerdf/src/main/java/org/eclipse/rdf4j/sail/nativerdf/ContextStore.java index 1445a663a0c..0f644684832 100644 --- a/core/sail/nativerdf/src/main/java/org/eclipse/rdf4j/sail/nativerdf/ContextStore.java +++ b/core/sail/nativerdf/src/main/java/org/eclipse/rdf4j/sail/nativerdf/ContextStore.java @@ -37,22 +37,22 @@ * An in-memory index for context information that uses a file for persistence. *

    * The context index file has an 8-byte header consisting of: - * + * *

      * 	byte 1-3         : the magic number marker
      *  byte 4           : the file format version
      *  byte 5-8         : the number of mapped contexts contained in the file, as an int.
      * 
    - * + * * Each context is encoded in the file as a record, as follows: - * + * *
      *   byte 1 - 8      : the number of statements in the content, as a long.
      *   byte 9          : boolean flag indicating the type of context identifier (1 = IRI, 0 = blank node)
      *   byte 10 - 11    : the length of the encoded context identifier
      *   byte 12 - A     : the UTF-8 encoded the encoded context identifer
      * 
    - * + * * @author Jeen Broekstra * */ @@ -117,7 +117,7 @@ class ContextStore implements Iterable { /** * Increase the size of the context. If the context was not yet known, it is created with a size of 1. - * + * * @param context the context identifier. */ void increment(Resource context) { @@ -127,7 +127,7 @@ void increment(Resource context) { /** * Decrease the size of the context by the given amount. If the size reaches zero, the context is removed. - * + * * @param context the context identifier. * @param amount the number by which to decrease the size */ diff --git a/core/sail/nativerdf/src/main/java/org/eclipse/rdf4j/sail/nativerdf/MemoryOverflowModel.java b/core/sail/nativerdf/src/main/java/org/eclipse/rdf4j/sail/nativerdf/MemoryOverflowModel.java index 935fea7b04c..0e007c04b9d 100644 --- a/core/sail/nativerdf/src/main/java/org/eclipse/rdf4j/sail/nativerdf/MemoryOverflowModel.java +++ b/core/sail/nativerdf/src/main/java/org/eclipse/rdf4j/sail/nativerdf/MemoryOverflowModel.java @@ -186,8 +186,9 @@ public synchronized void removeTermIteration(Iterator iter, Resource protected abstract SailStore createSailStore(File dataDir) throws IOException, SailException; synchronized Model getDelegate() { - if (disk == null) + if (disk == null) { return memory; + } return disk; } diff --git a/core/sail/nativerdf/src/main/java/org/eclipse/rdf4j/sail/nativerdf/NamespaceStore.java b/core/sail/nativerdf/src/main/java/org/eclipse/rdf4j/sail/nativerdf/NamespaceStore.java index ede05e2c09d..bf935e2c3ea 100644 --- a/core/sail/nativerdf/src/main/java/org/eclipse/rdf4j/sail/nativerdf/NamespaceStore.java +++ b/core/sail/nativerdf/src/main/java/org/eclipse/rdf4j/sail/nativerdf/NamespaceStore.java @@ -26,14 +26,14 @@ /** * An in-memory store for namespace prefix information that uses a file for persistence. Namespaces are encoded in the * file as records as follows: - * + * *
      *   byte 1 - 2     : the length of the encoded namespace name
      *   byte 3 - A     : the UTF-8 encoded namespace name
      *   byte A+1 - A+2 : the length of the encoded namespace prefix
      *   byte A+3 - end : the UTF-8 encoded namespace prefix
      * 
    - * + * * @author Arjohn Kampman */ class NamespaceStore implements Iterable { diff --git a/core/sail/nativerdf/src/main/java/org/eclipse/rdf4j/sail/nativerdf/NativeStore.java b/core/sail/nativerdf/src/main/java/org/eclipse/rdf4j/sail/nativerdf/NativeStore.java index 4e86c1a32ce..604cc939270 100644 --- a/core/sail/nativerdf/src/main/java/org/eclipse/rdf4j/sail/nativerdf/NativeStore.java +++ b/core/sail/nativerdf/src/main/java/org/eclipse/rdf4j/sail/nativerdf/NativeStore.java @@ -17,8 +17,6 @@ import org.eclipse.rdf4j.common.concurrent.locks.Lock; import org.eclipse.rdf4j.common.concurrent.locks.LockManager; import org.eclipse.rdf4j.common.io.MavenUtil; -import org.eclipse.rdf4j.model.Model; -import org.eclipse.rdf4j.model.ModelFactory; import org.eclipse.rdf4j.model.ValueFactory; import org.eclipse.rdf4j.query.algebra.evaluation.EvaluationStrategy; import org.eclipse.rdf4j.query.algebra.evaluation.EvaluationStrategyFactory; @@ -42,7 +40,7 @@ * The NativeStore is designed for datasets between 100,000 and 100 million triples. On most operating systems, if there * is sufficient physical memory, the NativeStore will act like the MemoryStore, because the read/write commands will be * cached by the OS. This technique allows the NativeStore to operate quite well for millions of triples. - * + * * @author Arjohn Kampman * @author jeen */ @@ -77,6 +75,9 @@ public class NativeStore extends AbstractNotifyingSail implements FederatedServi private SailStore store; + // used to decide if store is writable, is true if the store was writable during initialization + private boolean isWritable; + /** * Data directory lock. */ @@ -135,7 +136,7 @@ public NativeStore(File dataDir, String tripleIndexes) { /** * Sets the triple indexes for the native store, must be called before initialization. - * + * * @param tripleIndexes An index strings, e.g. spoc,posc. */ public void setTripleIndexes(String tripleIndexes) { @@ -187,6 +188,7 @@ public synchronized EvaluationStrategyFactory getEvaluationStrategyFactory() { evalStratFactory = new StrictEvaluationStrategyFactory(getFederatedServiceResolver()); } evalStratFactory.setQuerySolutionCacheThreshold(getIterationCacheSyncThreshold()); + evalStratFactory.setTrackResultSize(isTrackResultSize()); return evalStratFactory; } @@ -213,7 +215,7 @@ public synchronized FederatedServiceResolver getFederatedServiceResolver() { /** * Overrides the {@link FederatedServiceResolver} used by this instance, but the given resolver is not shutDown when * this instance is. - * + * * @param resolver The SERVICE resolver to set. */ @Override @@ -226,7 +228,7 @@ public synchronized void setFederatedServiceResolver(FederatedServiceResolver re /** * Initializes this NativeStore. - * + * * @exception SailException If this NativeStore could not be initialized using the parameters that have been set. */ @Override @@ -298,6 +300,8 @@ public SailSource getInferredSailSource() { throw new SailException(e); } + isWritable = getDataDir().canWrite(); + logger.debug("NativeStore initialized"); } @@ -320,7 +324,7 @@ protected void shutDownInternal() throws SailException { @Override public boolean isWritable() { - return getDataDir().canWrite(); + return isWritable; } @Override @@ -343,7 +347,7 @@ public ValueFactory getValueFactory() { * {@link IsolationLevels#NONE} isolation. Store is either exclusively in {@link IsolationLevels#NONE} isolation * with potentially zero or more transactions, or exclusively in higher isolation mode with potentially zero or more * transactions. - * + * * @param level indicating desired mode {@link IsolationLevels#NONE} or higher * @return Lock used to prevent Store from switching isolation modes * @throws SailException @@ -372,7 +376,7 @@ protected Lock getTransactionLock(IsolationLevel level) throws SailException { /** * Checks if any {@link IsolationLevels#NONE} isolation transactions are active. - * + * * @return true if at least one transaction has direct access to the indexes */ boolean isIsolationDisabled() { diff --git a/core/sail/nativerdf/src/main/java/org/eclipse/rdf4j/sail/nativerdf/RecordCache.java b/core/sail/nativerdf/src/main/java/org/eclipse/rdf4j/sail/nativerdf/RecordCache.java index 9fe044da700..066c587221a 100644 --- a/core/sail/nativerdf/src/main/java/org/eclipse/rdf4j/sail/nativerdf/RecordCache.java +++ b/core/sail/nativerdf/src/main/java/org/eclipse/rdf4j/sail/nativerdf/RecordCache.java @@ -15,7 +15,7 @@ /** * A cache for fixed size byte array records. This cache uses a temporary file to store the records. This file is * deleted upon calling {@link #discard()}. - * + * * @author Arjohn Kampman */ abstract class RecordCache { @@ -56,7 +56,7 @@ public final void setMaxRecords(long maxRecords) { /** * Gets the number of records currently stored in the cache, throwing an {@link IllegalStateException} if the cache * is no longer {@link #isValid() valid}. - * + * * @return * @throws IllegalStateException If the cache is not/no longer {@link #isValid() valid}. */ @@ -70,7 +70,7 @@ public final long getRecordCount() { /** * Stores a record in the cache. - * + * * @param data The record to store. */ public final void storeRecord(byte[] data) throws IOException { @@ -87,7 +87,7 @@ public final void storeRecord(byte[] data) throws IOException { /** * Stores the records from the supplied cache into this cache. - * + * * @param otherCache The cache to copy the records from. */ public final void storeRecords(RecordCache otherCache) throws IOException { @@ -116,7 +116,7 @@ public final void clear() throws IOException { /** * Gets all records that are stored in the cache, throwing an {@link IllegalStateException} if the cache is no * longer {@link #isValid() valid}. - * + * * @return An iterator over all records. * @throws IllegalStateException If the cache is not/no longer {@link #isValid() valid}. */ diff --git a/core/sail/nativerdf/src/main/java/org/eclipse/rdf4j/sail/nativerdf/SequentialRecordCache.java b/core/sail/nativerdf/src/main/java/org/eclipse/rdf4j/sail/nativerdf/SequentialRecordCache.java index d7e970c9c3c..707fddc9d5a 100644 --- a/core/sail/nativerdf/src/main/java/org/eclipse/rdf4j/sail/nativerdf/SequentialRecordCache.java +++ b/core/sail/nativerdf/src/main/java/org/eclipse/rdf4j/sail/nativerdf/SequentialRecordCache.java @@ -18,7 +18,7 @@ /** * A cache for fixed size byte array records. This cache uses a temporary file to store the records. This file is * deleted upon calling {@link #discard()}. - * + * * @author Arjohn Kampman */ final class SequentialRecordCache extends RecordCache { diff --git a/core/sail/nativerdf/src/main/java/org/eclipse/rdf4j/sail/nativerdf/SortedRecordCache.java b/core/sail/nativerdf/src/main/java/org/eclipse/rdf4j/sail/nativerdf/SortedRecordCache.java index 5dd292ba13a..9be9dee28ed 100644 --- a/core/sail/nativerdf/src/main/java/org/eclipse/rdf4j/sail/nativerdf/SortedRecordCache.java +++ b/core/sail/nativerdf/src/main/java/org/eclipse/rdf4j/sail/nativerdf/SortedRecordCache.java @@ -17,7 +17,7 @@ /** * A cache for fixed size byte array records. This cache uses a temporary file to store the records. This file is * deleted upon calling {@link #discard()}. - * + * * @author Arjohn Kampman */ @SuppressWarnings("deprecation") diff --git a/core/sail/nativerdf/src/main/java/org/eclipse/rdf4j/sail/nativerdf/TripleStore.java b/core/sail/nativerdf/src/main/java/org/eclipse/rdf4j/sail/nativerdf/TripleStore.java index 66292e76674..80056240cfa 100644 --- a/core/sail/nativerdf/src/main/java/org/eclipse/rdf4j/sail/nativerdf/TripleStore.java +++ b/core/sail/nativerdf/src/main/java/org/eclipse/rdf4j/sail/nativerdf/TripleStore.java @@ -38,7 +38,7 @@ * IDs. Each ID represent an RDF value that is stored in a {@link ValueStore}. The four IDs refer to the statement's * subject, predicate, object and context. The ID 0 is used to represent the "null" context and doesn't map to * an actual RDF value. - * + * * @author Arjohn Kampman */ @SuppressWarnings("deprecation") @@ -253,7 +253,7 @@ private Set getIndexSpecs() throws SailException { /** * Parses a comma/whitespace-separated list of index specifications. Index specifications are required to consists * of 4 characters: 's', 'p', 'o' and 'c'. - * + * * @param indexSpecStr A string like "spoc, pocs, cosp". * @return A Set containing the parsed index specifications. */ @@ -455,7 +455,7 @@ public RecordIterator getTriples(int subj, int pred, int obj, int context, boole /** * If an index exists by context - use it, otherwise return null. - * + * * @param readTransaction * @return All triples sorted by context or null if no context index exists * @throws IOException @@ -725,7 +725,7 @@ public boolean storeTriple(int subj, int pred, int obj, int context, boolean exp /** * Remove triples - * + * * @param subj The subject for the pattern, or -1 for a wildcard. * @param pred The predicate for the pattern, or -1 for a wildcard. * @param obj The object for the pattern, or -1 for a wildcard. @@ -745,7 +745,7 @@ public int removeTriples(int subj, int pred, int obj, int context) throws IOExce /** * Remove triples by context - * + * * @param subj The subject for the pattern, or -1 for a wildcard. * @param pred The predicate for the pattern, or -1 for a wildcard. * @param obj The object for the pattern, or -1 for a wildcard. @@ -764,7 +764,7 @@ public Map removeTriplesByContext(int subj, int pred, int obj, in /** * Remove triples - * + * * @param subj The subject for the pattern, or -1 for a wildcard. * @param pred The predicate for the pattern, or -1 for a wildcard. * @param obj The object for the pattern, or -1 for a wildcard. diff --git a/core/sail/nativerdf/src/main/java/org/eclipse/rdf4j/sail/nativerdf/TxnStatusFile.java b/core/sail/nativerdf/src/main/java/org/eclipse/rdf4j/sail/nativerdf/TxnStatusFile.java index 1eb6542e2d2..b5f81b6c5b3 100644 --- a/core/sail/nativerdf/src/main/java/org/eclipse/rdf4j/sail/nativerdf/TxnStatusFile.java +++ b/core/sail/nativerdf/src/main/java/org/eclipse/rdf4j/sail/nativerdf/TxnStatusFile.java @@ -23,7 +23,7 @@ public enum TxnStatus { /** * No active transaction. This occurs if no transaction has been started yet, or if all transactions have been - * committed or rolled back. + * committed or rolled back. An empty TxnStatus file also represents the NONE status. */ NONE(TxnStatus.NONE_BYTE), @@ -58,7 +58,9 @@ byte[] getOnDisk() { return onDisk; } - private static final byte NONE_BYTE = (byte) 0b00000001; + private static final byte NONE_BYTE = (byte) 0b00000000; + private static final byte OLD_NONE_BYTE = (byte) 0b00000001; + private static final byte ACTIVE_BYTE = (byte) 0b00000010; private static final byte COMMITTING_BYTE = (byte) 0b00000100; private static final byte ROLLING_BACK_BYTE = (byte) 0b00001000; @@ -82,10 +84,6 @@ byte[] getOnDisk() { public TxnStatusFile(File dataDir) throws IOException { File statusFile = new File(dataDir, FILE_NAME); nioFile = new NioFile(statusFile, "rwd"); - - if (nioFile.size() == 0) { - setTxnStatus(TxnStatus.NONE); - } } public void close() throws IOException { @@ -99,9 +97,11 @@ public void close() throws IOException { * @throws IOException If the transaction status could not be written to file. */ public void setTxnStatus(TxnStatus txnStatus) throws IOException { - byte[] bytes = txnStatus.onDisk; - nioFile.truncate(bytes.length); - nioFile.writeBytes(bytes, 0); + if (txnStatus == TxnStatus.NONE) { + nioFile.truncate(0); + } else { + nioFile.writeBytes(txnStatus.onDisk, 0); + } } /** @@ -120,6 +120,9 @@ public TxnStatus getTxnStatus() throws IOException { case TxnStatus.NONE_BYTE: status = TxnStatus.NONE; break; + case TxnStatus.OLD_NONE_BYTE: + status = TxnStatus.NONE; + break; case TxnStatus.ACTIVE_BYTE: status = TxnStatus.ACTIVE; break; diff --git a/core/sail/nativerdf/src/main/java/org/eclipse/rdf4j/sail/nativerdf/ValueStore.java b/core/sail/nativerdf/src/main/java/org/eclipse/rdf4j/sail/nativerdf/ValueStore.java index 08ee6a1e0f8..fb61bdadd9a 100644 --- a/core/sail/nativerdf/src/main/java/org/eclipse/rdf4j/sail/nativerdf/ValueStore.java +++ b/core/sail/nativerdf/src/main/java/org/eclipse/rdf4j/sail/nativerdf/ValueStore.java @@ -37,9 +37,9 @@ /** * File-based indexed storage and retrieval of RDF values. ValueStore maps RDF values to integer IDs and vice-versa. - * + * * @author Arjohn Kampman - * + * * @deprecated since 3.0. This feature is for internal use only: its existence, signature or behavior may change without * warning from one release to the next. */ @@ -172,7 +172,7 @@ public Lock getReadLock() throws InterruptedException { /** * Gets the value for the specified ID. - * + * * @param id A value ID. * @return The value for the ID, or null no such value could be found. * @exception IOException If an I/O error occurred. @@ -199,7 +199,7 @@ public NativeValue getValue(int id) throws IOException { /** * Gets the ID for the specified value. - * + * * @param value A value. * @return The ID for the specified value, or {@link NativeValue#UNKNOWN_ID} if no such ID could be found. * @exception IOException If an I/O error occurred. @@ -269,7 +269,7 @@ public int getID(Value value) throws IOException { /** * Stores the supplied value and returns the ID that has been assigned to it. In case the value was already present, * the value will not be stored again and the ID of the existing value is returned. - * + * * @param value The Value to store. * @return The ID that has been assigned to the value. * @exception IOException If an I/O error occurred. @@ -324,7 +324,7 @@ public int storeValue(Value value) throws IOException { /** * Removes all values from the ValueStore. - * + * * @exception IOException If an I/O error occurred. */ public void clear() throws IOException { @@ -351,7 +351,7 @@ public void clear() throws IOException { /** * Synchronizes any changes that are cached in memory to disk. - * + * * @exception IOException If an I/O error occurred. */ public void sync() throws IOException { @@ -360,7 +360,7 @@ public void sync() throws IOException { /** * Closes the ValueStore, releasing any file references, etc. Once closed, the ValueStore can no longer be used. - * + * * @exception IOException If an I/O error occurred. */ public void close() throws IOException { @@ -475,8 +475,9 @@ private byte[] literal2data(Literal literal, boolean create) throws IOException private byte[] literal2legacy(Literal literal) throws IOException { IRI dt = literal.getDatatype(); - if (XMLSchema.STRING.equals(dt) || RDF.LANGSTRING.equals(dt)) + if (XMLSchema.STRING.equals(dt) || RDF.LANGSTRING.equals(dt)) { return literal2data(literal.getLabel(), literal.getLanguage(), null, false); + } return literal2data(literal.getLabel(), literal.getLanguage(), dt, false); } @@ -653,7 +654,7 @@ public NativeLiteral createLiteral(String value, IRI datatype) { } /*----------------------------------------------------------------------* - * Methods for converting model objects to NativeStore-specific objects * + * Methods for converting model objects to NativeStore-specific objects * *----------------------------------------------------------------------*/ public NativeValue getNativeValue(Value value) { @@ -679,7 +680,7 @@ public NativeResource getNativeResource(Resource resource) { /** * Creates a NativeURI that is equal to the supplied URI. This method returns the supplied URI itself if it is * already a NativeURI that has been created by this ValueStore, which prevents unnecessary object creations. - * + * * @return A NativeURI for the specified URI. */ public NativeIRI getNativeURI(IRI uri) { @@ -693,7 +694,7 @@ public NativeIRI getNativeURI(IRI uri) { /** * Creates a NativeBNode that is equal to the supplied bnode. This method returns the supplied bnode itself if it is * already a NativeBNode that has been created by this ValueStore, which prevents unnecessary object creations. - * + * * @return A NativeBNode for the specified bnode. */ public NativeBNode getNativeBNode(BNode bnode) { @@ -708,7 +709,7 @@ public NativeBNode getNativeBNode(BNode bnode) { * Creates an NativeLiteral that is equal to the supplied literal. This method returns the supplied literal itself * if it is already a NativeLiteral that has been created by this ValueStore, which prevents unnecessary object * creations. - * + * * @return A NativeLiteral for the specified literal. */ public NativeLiteral getNativeLiteral(Literal l) { diff --git a/core/sail/nativerdf/src/main/java/org/eclipse/rdf4j/sail/nativerdf/ValueStoreRevision.java b/core/sail/nativerdf/src/main/java/org/eclipse/rdf4j/sail/nativerdf/ValueStoreRevision.java index 376e590aa9a..59d52a9abba 100644 --- a/core/sail/nativerdf/src/main/java/org/eclipse/rdf4j/sail/nativerdf/ValueStoreRevision.java +++ b/core/sail/nativerdf/src/main/java/org/eclipse/rdf4j/sail/nativerdf/ValueStoreRevision.java @@ -16,9 +16,9 @@ * A {@link ValueStore ValueStore} revision for {@link NativeValue NativeValue} objects. For a cached value ID of a * NativeValue to be valid, the revision object needs to be equal to the concerning ValueStore's revision object. The * ValueStore's revision object is changed whenever values are removed from it or IDs are changed. - * + * * @author Arjohn Kampman - * + * * @deprecated since 3.0. This feature is for internal use only: its existence, signature or behavior may change without * warning from one release to the next. */ diff --git a/core/sail/nativerdf/src/main/java/org/eclipse/rdf4j/sail/nativerdf/btree/AllocatedNodesList.java b/core/sail/nativerdf/src/main/java/org/eclipse/rdf4j/sail/nativerdf/btree/AllocatedNodesList.java index f33a8b7afbc..6e93eac747e 100644 --- a/core/sail/nativerdf/src/main/java/org/eclipse/rdf4j/sail/nativerdf/btree/AllocatedNodesList.java +++ b/core/sail/nativerdf/src/main/java/org/eclipse/rdf4j/sail/nativerdf/btree/AllocatedNodesList.java @@ -19,7 +19,7 @@ /** * List of allocated BTree nodes, persisted to a file on disk. - * + * * @author Arjohn Kampman */ class AllocatedNodesList implements Closeable { @@ -108,7 +108,7 @@ public synchronized void close() throws IOException { /** * Deletes the allocated nodes file. - * + * * @return true if the file was deleted. */ public synchronized boolean delete() throws IOException { @@ -127,7 +127,7 @@ public synchronized void close(boolean syncChanges) throws IOException { /** * Writes any changes that are cached in memory to disk. - * + * * @throws IOException */ public synchronized void sync() throws IOException { @@ -164,7 +164,7 @@ private void scheduleSync() throws IOException { /** * Clears the allocated nodes list. - * + * * @throws IOException If an I/O error occurred. */ public synchronized void clear() throws IOException { diff --git a/core/sail/nativerdf/src/main/java/org/eclipse/rdf4j/sail/nativerdf/btree/BTree.java b/core/sail/nativerdf/src/main/java/org/eclipse/rdf4j/sail/nativerdf/btree/BTree.java index 5f083f46a9b..95e84d76ded 100644 --- a/core/sail/nativerdf/src/main/java/org/eclipse/rdf4j/sail/nativerdf/btree/BTree.java +++ b/core/sail/nativerdf/src/main/java/org/eclipse/rdf4j/sail/nativerdf/btree/BTree.java @@ -35,7 +35,7 @@ * * The first reference was used to implement this class. *

    - * + * * @author Arjohn Kampman * @author Enrico Minack */ @@ -172,7 +172,7 @@ public class BTree implements Closeable { /** * Creates a new BTree that uses an instance of DefaultRecordComparator to compare values. - * + * * @param dataDir The directory for the BTree data. * @param filenamePrefix The prefix for all files used by this BTree. * @param blockSize The size (in bytes) of a file block for a single node. Ideally, the size specified is the @@ -187,7 +187,7 @@ public BTree(File dataDir, String filenamePrefix, int blockSize, int valueSize) /** * Creates a new BTree that uses an instance of DefaultRecordComparator to compare values. - * + * * @param dataDir The directory for the BTree data. * @param filenamePrefix The prefix for all files used by this BTree. * @param blockSize The size (in bytes) of a file block for a single node. Ideally, the size specified is the @@ -206,7 +206,7 @@ public BTree(File dataDir, String filenamePrefix, int blockSize, int valueSize, /** * Creates a new BTree that uses the supplied RecordComparator to compare the values that are or will be * stored in the B-Tree. - * + * * @param dataDir The directory for the BTree data. * @param filenamePrefix The prefix for all files used by this BTree. * @param blockSize The size (in bytes) of a file block for a single node. Ideally, the size specified is the @@ -224,7 +224,7 @@ public BTree(File dataDir, String filenamePrefix, int blockSize, int valueSize, /** * Creates a new BTree that uses the supplied RecordComparator to compare the values that are or will be * stored in the B-Tree. - * + * * @param dataDir The directory for the BTree data. * @param filenamePrefix The prefix for all files used by this BTree. * @param blockSize The size (in bytes) of a file block for a single node. Ideally, the size specified is the @@ -343,7 +343,7 @@ public File getFile() { /** * Closes the BTree and then deletes its data files. - * + * * @return true if the operation was successful. */ public boolean delete() throws IOException { @@ -371,7 +371,7 @@ public void close() throws IOException { /** * Closes any opened files and release any resources used by this B-Tree. Any pending changes are optionally * synchronized to disk before closing. Once the B-Tree has been closed, it can no longer be used. - * + * * @param syncChanges Flag indicating whether pending changes should be synchronized to disk. */ private void close(boolean syncChanges) throws IOException { @@ -399,7 +399,7 @@ private void close(boolean syncChanges) throws IOException { /** * Writes any changes that are cached in memory to disk. - * + * * @throws IOException */ public void sync() throws IOException { @@ -420,7 +420,7 @@ public void sync() throws IOException { /** * Gets the value that matches the specified key. - * + * * @param key A value that is equal to the value that should be retrieved, at least as far as the RecordComparator * of this BTree is concerned. * @return The value matching the key, or null if no such value could be found. @@ -502,7 +502,7 @@ public long getValueCountEstimate() throws IOException { /** * Gives an estimate of the number of values between minValue and maxValue. - * + * * @param minValue the lower bound of the range. * @param maxValue the upper bound of the range, * @return an estimate of the number of values in the specified range. @@ -693,7 +693,7 @@ private int height() throws IOException { /** * Inserts the supplied value into the B-Tree. In case an equal value is already present in the B-Tree this value is * overwritten with the new value and the old value is returned by this method. - * + * * @param value The value to insert into the B-Tree. * @return The old value that was replaced, if any. * @throws IOException If an I/O error occurred. @@ -821,7 +821,7 @@ private static class InsertResult { /** * Removes the value that matches the specified key from the B-Tree. - * + * * @param key A key that matches the value that should be removed from the B-Tree. * @return The value that was removed from the B-Tree, or null if no matching value was found. * @throws IOException If an I/O error occurred. @@ -867,7 +867,7 @@ public byte[] remove(byte[] key) throws IOException { /** * Removes the value that matches the specified key from the tree starting at the specified node and returns the * removed value. - * + * * @param key A key that matches the value that should be removed from the B-Tree. * @param node The root of the (sub) tree. * @return The value that was removed from the B-Tree, or null if no matching value was found. @@ -913,7 +913,7 @@ private byte[] removeFromTree(byte[] key, Node node) throws IOException { /** * Removes the largest value from the tree starting at the specified node and returns the removed value. - * + * * @param node The root of the (sub) tree. * @return The value that was removed from the B-Tree. * @throws IOException If an I/O error occurred. @@ -977,7 +977,7 @@ private void balanceChildNode(Node parentNode, Node childNode, int childIdx) thr /** * Removes all values from the B-Tree. - * + * * @throws IOException If an I/O error occurred. */ public void clear() throws IOException { @@ -1038,8 +1038,9 @@ void releaseNode(Node node) throws IOException { nioFile.truncate(nodeID2offset(maxNodeID) + nodeSize); } } - } else + } else { nodeCache.release(node, forceSync); + } } private void writeFileHeader() throws IOException { diff --git a/core/sail/nativerdf/src/main/java/org/eclipse/rdf4j/sail/nativerdf/btree/ConcurrentNodeCache.java b/core/sail/nativerdf/src/main/java/org/eclipse/rdf4j/sail/nativerdf/btree/ConcurrentNodeCache.java index ef3cdf97ed7..c6953160d34 100644 --- a/core/sail/nativerdf/src/main/java/org/eclipse/rdf4j/sail/nativerdf/btree/ConcurrentNodeCache.java +++ b/core/sail/nativerdf/src/main/java/org/eclipse/rdf4j/sail/nativerdf/btree/ConcurrentNodeCache.java @@ -30,7 +30,7 @@ class ConcurrentNodeCache extends ConcurrentCache { public ConcurrentNodeCache(Function reader) { super(0); // cleanUp, when actually run, will try to completely purge the cache (but retain currently used - // nodes) + // nodes) this.reader = reader; } @@ -57,15 +57,17 @@ public boolean discardEmptyUnused(int nodeId) { if (v.getUsageCount() == 0 && v.isEmpty() && v.isLeaf()) { writeNode.accept(v); return null; - } else + } else { return v; + } }); return nn == null; } public void release(Node node, boolean forceSync) { - if (forceSync) + if (forceSync) { writeNode.accept(node); + } cleanUp(); } @@ -73,11 +75,13 @@ public void release(Node node, boolean forceSync) { protected boolean onEntryRemoval(Integer key) { Node node = cache.get(key); - if (node == null) + if (node == null) { return true; + } - if (node.getUsageCount() > 0) + if (node.getUsageCount() > 0) { return false; + } writeNode.accept(node); diff --git a/core/sail/nativerdf/src/main/java/org/eclipse/rdf4j/sail/nativerdf/btree/DefaultRecordComparator.java b/core/sail/nativerdf/src/main/java/org/eclipse/rdf4j/sail/nativerdf/btree/DefaultRecordComparator.java index 801cef68aa7..2c476d7882e 100644 --- a/core/sail/nativerdf/src/main/java/org/eclipse/rdf4j/sail/nativerdf/btree/DefaultRecordComparator.java +++ b/core/sail/nativerdf/src/main/java/org/eclipse/rdf4j/sail/nativerdf/btree/DefaultRecordComparator.java @@ -9,7 +9,7 @@ /** * A RecordComparator that compares values with eachother by comparing all of their bytes. - * + * * @author Arjohn Kampman */ public class DefaultRecordComparator implements RecordComparator { diff --git a/core/sail/nativerdf/src/main/java/org/eclipse/rdf4j/sail/nativerdf/btree/Node.java b/core/sail/nativerdf/src/main/java/org/eclipse/rdf4j/sail/nativerdf/btree/Node.java index 78692a39d24..b6dfbcd54fe 100644 --- a/core/sail/nativerdf/src/main/java/org/eclipse/rdf4j/sail/nativerdf/btree/Node.java +++ b/core/sail/nativerdf/src/main/java/org/eclipse/rdf4j/sail/nativerdf/btree/Node.java @@ -41,7 +41,7 @@ class Node { /** * Creates a new Node object with the specified ID. - * + * * @param id The node's ID, must be larger than 0. * @throws IllegalArgumentException If the specified id is <= 0. */ @@ -80,8 +80,9 @@ public void release() throws IOException { int newUsage = usageCount.decrementAndGet(); assert newUsage >= 0 : "Releasing node while usage count is " + (newUsage + 1); - if (newUsage == 0) + if (newUsage == 0) { tree.releaseNode(this); + } } public int getUsageCount() { @@ -106,7 +107,7 @@ public int getNodeCount() { /** * Checks if this node has any values. - * + * * @return true if this node has no values, fals if it has. */ public boolean isEmpty() { @@ -135,7 +136,7 @@ public void setValue(int valueIdx, byte[] value) { /** * Removes the value that can be found at the specified valueIdx and the node ID directly to the right of it. - * + * * @param valueIdx A legal value index. * @return The value that was removed. * @see #removeValueLeft @@ -167,7 +168,7 @@ public byte[] removeValueRight(int valueIdx) { /** * Removes the value that can be found at the specified valueIdx and the node ID directly to the left of it. - * + * * @param valueIdx A legal value index. * @return The value that was removed. * @see #removeValueRight @@ -299,7 +300,7 @@ public void insertNodeIDValuePair(int nodeIdx, int nodeID, byte[] value) { * Splits the node, moving half of its values to the supplied new node, inserting the supplied value-nodeID pair and * returning the median value. The behaviour of this method when called on a node that isn't full is not specified * and can produce unexpected results! - * + * * @throws IOException */ public byte[] splitAndInsert(byte[] newValue, int newNodeID, int newValueIdx, Node newNode) throws IOException { diff --git a/core/sail/nativerdf/src/main/java/org/eclipse/rdf4j/sail/nativerdf/btree/NodeListener.java b/core/sail/nativerdf/src/main/java/org/eclipse/rdf4j/sail/nativerdf/btree/NodeListener.java index daf47a166b3..2c3b187018f 100644 --- a/core/sail/nativerdf/src/main/java/org/eclipse/rdf4j/sail/nativerdf/btree/NodeListener.java +++ b/core/sail/nativerdf/src/main/java/org/eclipse/rdf4j/sail/nativerdf/btree/NodeListener.java @@ -13,7 +13,7 @@ interface NodeListener { /** * Signals to registered node listeners that a value has been added to a node. - * + * * @param node The node which the value has been added to. * @param index The index where the value was inserted. * @return Indicates whether the node listener should be deregistered as a result of this event. @@ -22,7 +22,7 @@ interface NodeListener { /** * Signals to registered node listeners that a value has been removed from a node. - * + * * @param node The node which the value has been removed from. * @param index The index where the value was removed. * @return Indicates whether the node listener should be deregistered as a result of this event. @@ -35,7 +35,7 @@ interface NodeListener { /** * Signals to registered node listeners that a node has been split. - * + * * @param node The node which has been split. * @param newNode The newly allocated node containing the "right" half of the values. * @param medianIdx The index where the node has been split. The value at this index has been moved to the node's @@ -47,7 +47,7 @@ interface NodeListener { /** * Signals to registered node listeners that two nodes have been merged. All values from the source node have been * appended to the value of the target node. - * + * * @param sourceNode The node that donated its values to the target node. * @param targetNode The node in which the values have been merged. * @param mergeIdx The index of sourceNode's values in targetNode . diff --git a/core/sail/nativerdf/src/main/java/org/eclipse/rdf4j/sail/nativerdf/btree/RangeIterator.java b/core/sail/nativerdf/src/main/java/org/eclipse/rdf4j/sail/nativerdf/btree/RangeIterator.java index 414895bdf79..c616df36c57 100644 --- a/core/sail/nativerdf/src/main/java/org/eclipse/rdf4j/sail/nativerdf/btree/RangeIterator.java +++ b/core/sail/nativerdf/src/main/java/org/eclipse/rdf4j/sail/nativerdf/btree/RangeIterator.java @@ -16,7 +16,7 @@ class RangeIterator implements RecordIterator, NodeListener { /** - * + * */ private final BTree tree; diff --git a/core/sail/nativerdf/src/main/java/org/eclipse/rdf4j/sail/nativerdf/btree/RecordComparator.java b/core/sail/nativerdf/src/main/java/org/eclipse/rdf4j/sail/nativerdf/btree/RecordComparator.java index 58b7532f70d..cf02fe67bd1 100644 --- a/core/sail/nativerdf/src/main/java/org/eclipse/rdf4j/sail/nativerdf/btree/RecordComparator.java +++ b/core/sail/nativerdf/src/main/java/org/eclipse/rdf4j/sail/nativerdf/btree/RecordComparator.java @@ -15,7 +15,7 @@ public interface RecordComparator { /** * Compares the supplied key to the value of length length, starting at offset offset in * the supplied data array. - * + * * @param key A byte array representing the search key. * @param data A byte array containing the value to compare the key to. * @param offset The offset (0-based) of the value in data. diff --git a/core/sail/nativerdf/src/main/java/org/eclipse/rdf4j/sail/nativerdf/btree/RecordIterator.java b/core/sail/nativerdf/src/main/java/org/eclipse/rdf4j/sail/nativerdf/btree/RecordIterator.java index caf413ee3bc..662fb7bb917 100644 --- a/core/sail/nativerdf/src/main/java/org/eclipse/rdf4j/sail/nativerdf/btree/RecordIterator.java +++ b/core/sail/nativerdf/src/main/java/org/eclipse/rdf4j/sail/nativerdf/btree/RecordIterator.java @@ -12,7 +12,7 @@ /** * An iterator that iterates over records, for example those in a BTree. - * + * * @see BTree * @author Arjohn Kampman */ @@ -20,7 +20,7 @@ public interface RecordIterator extends Closeable { /** * Returns the next record in the BTree. - * + * * @return A record that is stored in the BTree, or null if all records have been returned. * @exception IOException In case an I/O error occurred. */ @@ -28,7 +28,7 @@ public interface RecordIterator extends Closeable { /** * Replaces the last record returned by {@link #next} with the specified record. - * + * * @exception IOException In case an I/O error occurred. */ public void set(byte[] record) throws IOException; @@ -36,7 +36,7 @@ public interface RecordIterator extends Closeable { /** * Closes the iterator, freeing any resources that it uses. Once closed, the iterator will not return any more * records. - * + * * @exception IOException In case an I/O error occurred. */ @Override diff --git a/core/sail/nativerdf/src/main/java/org/eclipse/rdf4j/sail/nativerdf/btree/package-info.java b/core/sail/nativerdf/src/main/java/org/eclipse/rdf4j/sail/nativerdf/btree/package-info.java index 4aff14c12b3..7d9c4ed116f 100644 --- a/core/sail/nativerdf/src/main/java/org/eclipse/rdf4j/sail/nativerdf/btree/package-info.java +++ b/core/sail/nativerdf/src/main/java/org/eclipse/rdf4j/sail/nativerdf/btree/package-info.java @@ -2,7 +2,7 @@ @InternalUseOnly /** * B-Tree on disk implementation. - * + * * @deprecated since 3.0. This package is for internal use only: its existence, signature or behavior may change without * warning from one release to the next. */ diff --git a/core/sail/nativerdf/src/main/java/org/eclipse/rdf4j/sail/nativerdf/config/NativeStoreConfig.java b/core/sail/nativerdf/src/main/java/org/eclipse/rdf4j/sail/nativerdf/config/NativeStoreConfig.java index 9ad7bcce656..221b2c7c4ed 100644 --- a/core/sail/nativerdf/src/main/java/org/eclipse/rdf4j/sail/nativerdf/config/NativeStoreConfig.java +++ b/core/sail/nativerdf/src/main/java/org/eclipse/rdf4j/sail/nativerdf/config/NativeStoreConfig.java @@ -149,9 +149,9 @@ public void parse(Model m, Resource implNode) throws SailConfigException { try { - Models.objectLiteral(m.filter(implNode, TRIPLE_INDEXES, null)) + Models.objectLiteral(m.getStatements(implNode, TRIPLE_INDEXES, null)) .ifPresent(lit -> setTripleIndexes(lit.getLabel())); - Models.objectLiteral(m.filter(implNode, FORCE_SYNC, null)).ifPresent(lit -> { + Models.objectLiteral(m.getStatements(implNode, FORCE_SYNC, null)).ifPresent(lit -> { try { setForceSync(lit.booleanValue()); } catch (IllegalArgumentException e) { @@ -160,7 +160,7 @@ public void parse(Model m, Resource implNode) throws SailConfigException { } }); - Models.objectLiteral(m.filter(implNode, VALUE_CACHE_SIZE, null)).ifPresent(lit -> { + Models.objectLiteral(m.getStatements(implNode, VALUE_CACHE_SIZE, null)).ifPresent(lit -> { try { setValueCacheSize(lit.intValue()); } catch (NumberFormatException e) { @@ -169,7 +169,7 @@ public void parse(Model m, Resource implNode) throws SailConfigException { } }); - Models.objectLiteral(m.filter(implNode, VALUE_ID_CACHE_SIZE, null)).ifPresent(lit -> { + Models.objectLiteral(m.getStatements(implNode, VALUE_ID_CACHE_SIZE, null)).ifPresent(lit -> { try { setValueIDCacheSize(lit.intValue()); } catch (NumberFormatException e) { @@ -178,7 +178,7 @@ public void parse(Model m, Resource implNode) throws SailConfigException { } }); - Models.objectLiteral(m.filter(implNode, NAMESPACE_CACHE_SIZE, null)).ifPresent(lit -> { + Models.objectLiteral(m.getStatements(implNode, NAMESPACE_CACHE_SIZE, null)).ifPresent(lit -> { try { setNamespaceCacheSize(lit.intValue()); } catch (NumberFormatException e) { @@ -187,7 +187,7 @@ public void parse(Model m, Resource implNode) throws SailConfigException { } }); - Models.objectLiteral(m.filter(implNode, NAMESPACE_ID_CACHE_SIZE, null)).ifPresent(lit -> { + Models.objectLiteral(m.getStatements(implNode, NAMESPACE_ID_CACHE_SIZE, null)).ifPresent(lit -> { try { setNamespaceIDCacheSize(lit.intValue()); } catch (NumberFormatException e) { diff --git a/core/sail/nativerdf/src/main/java/org/eclipse/rdf4j/sail/nativerdf/config/NativeStoreFactory.java b/core/sail/nativerdf/src/main/java/org/eclipse/rdf4j/sail/nativerdf/config/NativeStoreFactory.java index a76ed214f94..feb3364460e 100644 --- a/core/sail/nativerdf/src/main/java/org/eclipse/rdf4j/sail/nativerdf/config/NativeStoreFactory.java +++ b/core/sail/nativerdf/src/main/java/org/eclipse/rdf4j/sail/nativerdf/config/NativeStoreFactory.java @@ -16,14 +16,14 @@ /** * A {@link SailFactory} that creates {@link NativeStore}s based on RDF configuration data. - * + * * @author Arjohn Kampman */ public class NativeStoreFactory implements SailFactory { /** * The type of repositories that are created by this factory. - * + * * @see SailFactory#getSailType() */ public static final String SAIL_TYPE = "openrdf:NativeStore"; diff --git a/core/sail/nativerdf/src/main/java/org/eclipse/rdf4j/sail/nativerdf/config/NativeStoreSchema.java b/core/sail/nativerdf/src/main/java/org/eclipse/rdf4j/sail/nativerdf/config/NativeStoreSchema.java index 926887cedb7..fcea6032b6a 100644 --- a/core/sail/nativerdf/src/main/java/org/eclipse/rdf4j/sail/nativerdf/config/NativeStoreSchema.java +++ b/core/sail/nativerdf/src/main/java/org/eclipse/rdf4j/sail/nativerdf/config/NativeStoreSchema.java @@ -15,7 +15,7 @@ /** * Defines constants for the NativeStore schema which is used by {@link NativeStoreFactory}s to initialize * {@link NativeStore}s. - * + * * @author Arjohn Kampman */ public class NativeStoreSchema { diff --git a/core/sail/nativerdf/src/main/java/org/eclipse/rdf4j/sail/nativerdf/datastore/DataFile.java b/core/sail/nativerdf/src/main/java/org/eclipse/rdf4j/sail/nativerdf/datastore/DataFile.java index db2ac96d1b5..cfdcd2bd892 100644 --- a/core/sail/nativerdf/src/main/java/org/eclipse/rdf4j/sail/nativerdf/datastore/DataFile.java +++ b/core/sail/nativerdf/src/main/java/org/eclipse/rdf4j/sail/nativerdf/datastore/DataFile.java @@ -19,7 +19,7 @@ /** * Class supplying access to a data file. A data file stores data sequentially. Each entry starts with the entry's * length (4 bytes), followed by the data itself. File offsets are used to identify entries. - * + * * @author Arjohn Kampman */ public class DataFile implements Closeable { @@ -49,6 +49,12 @@ public class DataFile implements Closeable { private final boolean forceSync; + // cached file size, also reflects buffer usage + private volatile long nioFileSize; + + // 4KB write buffer that is flushed on sync, close and any read operations + private final ByteBuffer buffer = ByteBuffer.allocate(4 * 1024); + /*--------------* * Constructors * *--------------*/ @@ -89,6 +95,9 @@ public DataFile(File file, boolean forceSync) throws IOException { this.nioFile.close(); throw e; } + + this.nioFileSize = nioFile.size(); + } /*---------* @@ -101,80 +110,169 @@ public File getFile() { /** * Stores the specified data and returns the byte-offset at which it has been stored. - * + * * @param data The data to store, must not be null. * @return The byte-offset in the file at which the data was stored. */ public long storeData(byte[] data) throws IOException { assert data != null : "data must not be null"; - long offset = nioFile.size(); + long offset = nioFileSize; + + if (data.length + 4 > buffer.capacity()) { + // direct write because we are writing more data than the buffer can hold + + flush(); - // TODO: two writes could be more efficient since it prevent array copies - ByteBuffer buf = ByteBuffer.allocate(data.length + 4); - buf.putInt(data.length); - buf.put(data); - buf.rewind(); + // TODO: two writes could be more efficient since it prevent array copies + ByteBuffer buf = ByteBuffer.allocate(data.length + 4); + buf.putInt(data.length); + buf.put(data); + buf.rewind(); - nioFile.write(buf, offset); + nioFile.write(buf, offset); + + nioFileSize += buf.array().length; + + } else { + if (data.length + 4 > remainingBufferCapacity()) { + flush(); + } + + buffer.putInt(data.length); + buffer.put(data); + nioFileSize += data.length + 4; + } return offset; + + } + + synchronized private void flush() throws IOException { + int position = buffer.position(); + if (position == 0) { + return; + } + buffer.position(0); + + byte[] byteToWrite = new byte[position]; + buffer.get(byteToWrite, 0, position); + + nioFile.write(ByteBuffer.wrap(byteToWrite), nioFileSize - byteToWrite.length); + + buffer.position(0); + + } + + private int remainingBufferCapacity() { + return buffer.capacity() - buffer.position(); } + // This variable is used for predicting the number of bytes to read in getData(long offset). This helps us to only + // need to execute a single IO read instead of first one read to find the length and then one read to read the data. + int dataLengthApproximateAverage = 25; + /** * Gets the data that is stored at the specified offset. - * + * * @param offset An offset in the data file, must be larger than 0. * @return The data that was found on the specified offset. * @exception IOException If an I/O error occurred. */ public byte[] getData(long offset) throws IOException { assert offset > 0 : "offset must be larger than 0, is: " + offset; + flush(); - // TODO: maybe get more data in one go is more efficient? - int dataLength = nioFile.readInt(offset); - - byte[] data = new byte[dataLength]; + // Read in twice the average length because multiple small read operations take more time than one single larger + // operation even if that larger operation is unnecessarily large (within sensible limits). + byte[] data = new byte[(dataLengthApproximateAverage * 2) + 4]; ByteBuffer buf = ByteBuffer.wrap(data); - nioFile.read(buf, offset + 4L); + nioFile.read(buf, offset); + + int dataLength = (data[0] << 24) & 0xff000000 | + (data[1] << 16) & 0x00ff0000 | + (data[2] << 8) & 0x0000ff00 | + (data[3]) & 0x000000ff; + + // We have either managed to read enough data and can return the required subset of the data, or we have read + // too little so we need to execute another read to get the correct data. + if (dataLength <= data.length - 4) { + + // adjust the approximate average with 1 part actual length and 99 parts previous average up to a sensible + // max of 200 + dataLengthApproximateAverage = (int) (Math.min(200, + ((dataLengthApproximateAverage / 100.0) * 99) + (dataLength / 100.0))); + + return Arrays.copyOfRange(data, 4, dataLength + 4); + + } else { + + // adjust the approximate average, but favour the actual dataLength since dataLength predictions misses are + // costly + dataLengthApproximateAverage = Math.min(200, (dataLengthApproximateAverage + dataLength) / 2); + + // we didn't read enough data so we need to execute a new read + data = new byte[dataLength]; + buf = ByteBuffer.wrap(data); + nioFile.read(buf, offset + 4L); + + return data; + } - return data; } /** * Discards all stored data. - * + * * @throws IOException If an I/O error occurred. */ public void clear() throws IOException { nioFile.truncate(HEADER_LENGTH); + nioFileSize = HEADER_LENGTH; + buffer.clear(); } /** * Syncs any unstored data to the hash file. */ public void sync() throws IOException { + flush(); + if (forceSync) { nioFile.force(false); } } + public void sync(boolean force) throws IOException { + flush(); + + nioFile.force(force); + } + /** * Closes the data file, releasing any file locks that it might have. - * + * * @throws IOException */ @Override public void close() throws IOException { + flush(); + nioFile.close(); } /** * Gets an iterator that can be used to iterate over all stored data. - * + * * @return a DataIterator. */ public DataIterator iterator() { + try { + flush(); + } catch (IOException e) { + throw new RuntimeException(e); + } + return new DataIterator(); } @@ -186,7 +284,7 @@ public class DataIterator { private long position = HEADER_LENGTH; public boolean hasNext() throws IOException { - return position < nioFile.size(); + return position < nioFileSize; } public byte[] next() throws IOException { diff --git a/core/sail/nativerdf/src/main/java/org/eclipse/rdf4j/sail/nativerdf/datastore/DataStore.java b/core/sail/nativerdf/src/main/java/org/eclipse/rdf4j/sail/nativerdf/datastore/DataStore.java index 6ef126ef901..1409b09fcee 100644 --- a/core/sail/nativerdf/src/main/java/org/eclipse/rdf4j/sail/nativerdf/datastore/DataStore.java +++ b/core/sail/nativerdf/src/main/java/org/eclipse/rdf4j/sail/nativerdf/datastore/DataStore.java @@ -32,11 +32,6 @@ public class DataStore implements Closeable { private final HashFile hashFile; - /** - * The checksum to use for calculating data hashes. - */ - private final CRC32 crc32 = new CRC32(); - /*--------------* * Constructors * *--------------*/ @@ -194,12 +189,9 @@ public void close() throws IOException { * @return A hash code for the supplied data. */ private int getDataHash(byte[] data) { - synchronized (crc32) { - crc32.update(data); - int crc = (int) crc32.getValue(); - crc32.reset(); - return crc; - } + CRC32 crc32 = new CRC32(); + crc32.update(data); + return (int) crc32.getValue(); } /*--------------------* diff --git a/core/sail/nativerdf/src/main/java/org/eclipse/rdf4j/sail/nativerdf/datastore/HashFile.java b/core/sail/nativerdf/src/main/java/org/eclipse/rdf4j/sail/nativerdf/datastore/HashFile.java index 2a7fd527d39..8aedb7fc5e3 100644 --- a/core/sail/nativerdf/src/main/java/org/eclipse/rdf4j/sail/nativerdf/datastore/HashFile.java +++ b/core/sail/nativerdf/src/main/java/org/eclipse/rdf4j/sail/nativerdf/datastore/HashFile.java @@ -14,13 +14,14 @@ import java.nio.ByteBuffer; import java.nio.channels.FileChannel; import java.util.Arrays; +import java.util.BitSet; import java.util.concurrent.locks.ReentrantReadWriteLock; import org.eclipse.rdf4j.common.io.NioFile; /** * Class supplying access to a hash file. - * + * * @author Arjohn Kampman */ public class HashFile implements Closeable { @@ -49,8 +50,6 @@ public class HashFile implements Closeable { */ private static final long HEADER_LENGTH = 16; - private static final int INIT_BUCKET_COUNT = 64; - private static final int INIT_BUCKET_SIZE = 8; /*-----------* @@ -71,11 +70,16 @@ public class HashFile implements Closeable { private volatile int itemCount; // Load factor (fixed, for now) - private final float loadFactor = 0.75f; + private final float loadFactor; // recordSize = ITEM_SIZE * bucketSize + 4 private final int recordSize; + // first prime > 5MB + private final BitSet poorMansBloomFilter; + + boolean loadedHashFileFromDisk = false; + /** * A read/write lock that is used to prevent structural changes to the hash file while readers are active in order * to prevent concurrency issues. @@ -91,14 +95,21 @@ public HashFile(File file) throws IOException { } public HashFile(File file, boolean forceSync) throws IOException { + this(file, forceSync, 512); // 512 is default initial size + } + + public HashFile(File file, boolean forceSync, int initialSize) throws IOException { this.nioFile = new NioFile(file); this.forceSync = forceSync; + loadFactor = 0.75f; try { if (nioFile.size() == 0L) { // Empty file, insert bucket count, bucket size // and item count at the start of the file - bucketCount = INIT_BUCKET_COUNT; + + // the bucket count handles sizes not divisible by INIT_BUCKET_SIZE + bucketCount = (int) Math.ceil(initialSize * 1.0 / INIT_BUCKET_SIZE); bucketSize = INIT_BUCKET_SIZE; itemCount = 0; recordSize = ITEM_SIZE * bucketSize + 4; @@ -135,6 +146,19 @@ public HashFile(File file, boolean forceSync) throws IOException { } recordSize = ITEM_SIZE * bucketSize + 4; + loadedHashFileFromDisk = itemCount > 0; + } + + if (!loadedHashFileFromDisk) { + // 41943049 is ~5MB, and a prime + if (initialSize > 41943049) { + // initialSize < Integer.MAX_VALUE and Integer.MAX_VALUE = ~250 MB + poorMansBloomFilter = new BitSet(initialSize); + } else { + poorMansBloomFilter = new BitSet(41943049); + } + } else { + poorMansBloomFilter = null; } } catch (IOException e) { this.nioFile.close(); @@ -158,7 +182,15 @@ public int getItemCount() { * Gets an iterator that iterates over the IDs with hash codes that match the specified hash code. */ public IDIterator getIDIterator(int hash) throws IOException { - return new IDIterator(hash); + if (!loadedHashFileFromDisk && !poorMansBloomFilter.get(getBloomFilterIndex(hash))) { + return emptyIDIterator; + } else { + return new IDIterator(hash); + } + } + + private int getBloomFilterIndex(int hash) { + return Math.abs(hash) % poorMansBloomFilter.size(); } /** @@ -166,6 +198,9 @@ public IDIterator getIDIterator(int hash) throws IOException { */ public void storeID(int hash, int id) throws IOException { structureLock.readLock().lock(); + if (!loadedHashFileFromDisk) { + poorMansBloomFilter.set(getBloomFilterIndex(hash), true); + } try { // Calculate bucket offset for initial bucket long bucketOffset = getBucketOffset(hash); @@ -185,10 +220,9 @@ public void storeID(int hash, int id) throws IOException { } private void storeID(long bucketOffset, int hash, int id) throws IOException { - boolean idStored = false; ByteBuffer bucket = ByteBuffer.allocate(recordSize); - while (!idStored) { + while (true) { nioFile.read(bucket, bucketOffset); // Find first empty slot in bucket @@ -196,11 +230,14 @@ private void storeID(long bucketOffset, int hash, int id) throws IOException { if (slotID >= 0) { // Empty slot found, store dataOffset in it - bucket.putInt(ITEM_SIZE * slotID, hash); - bucket.putInt(ITEM_SIZE * slotID + 4, id); - bucket.rewind(); - nioFile.write(bucket, bucketOffset); - idStored = true; + + ByteBuffer diff = ByteBuffer.allocate(8); + diff.putInt(hash); + diff.putInt(id); + diff.rewind(); + + nioFile.write(diff, bucketOffset + ITEM_SIZE * slotID); + break; } else { // No empty slot found, check if bucket has an overflow bucket int overflowID = bucket.getInt(ITEM_SIZE * bucketSize); @@ -224,6 +261,7 @@ private void storeID(long bucketOffset, int hash, int id) throws IOException { public void clear() throws IOException { structureLock.writeLock().lock(); + poorMansBloomFilter.clear(); try { // Truncate the file to remove any overflow buffers nioFile.truncate(HEADER_LENGTH + (long) bucketCount * recordSize); @@ -254,6 +292,11 @@ public void sync() throws IOException { } } + public void sync(boolean force) throws IOException { + sync(); + nioFile.force(force); + } + @Override public void close() throws IOException { nioFile.close(); @@ -454,6 +497,18 @@ private void increaseHashTable() throws IOException { * Inner class IDIterator * *------------------------*/ + private final IDIterator emptyIDIterator = new IDIterator() { + @Override + public void close() { + + } + + @Override + public int next() throws IOException { + return -1; + } + }; + public class IDIterator { private final int queryHash; @@ -479,6 +534,10 @@ private IDIterator(int hash) throws IOException { } } + IDIterator() { + queryHash = 0; + } + public void close() { bucketBuffer = null; structureLock.readLock().unlock(); @@ -515,5 +574,6 @@ public int next() throws IOException { return -1; } + } // End inner class IDIterator } // End class HashFile diff --git a/core/sail/nativerdf/src/main/java/org/eclipse/rdf4j/sail/nativerdf/datastore/IDFile.java b/core/sail/nativerdf/src/main/java/org/eclipse/rdf4j/sail/nativerdf/datastore/IDFile.java index 1550e1ae5b4..962636846f1 100644 --- a/core/sail/nativerdf/src/main/java/org/eclipse/rdf4j/sail/nativerdf/datastore/IDFile.java +++ b/core/sail/nativerdf/src/main/java/org/eclipse/rdf4j/sail/nativerdf/datastore/IDFile.java @@ -10,15 +10,22 @@ import java.io.Closeable; import java.io.File; import java.io.IOException; +import java.math.RoundingMode; import java.util.Arrays; +import java.util.Map; +import org.apache.commons.collections4.map.ReferenceMap; import org.eclipse.rdf4j.common.io.NioFile; +import com.google.common.math.LongMath; + /** * Class supplying access to an ID file. An ID file maps IDs (integers >= 1) to file pointers (long integers). There * is a direct correlation between IDs and the position at which the file pointers are stored; the file pointer for ID X * is stored at position 8*X. - * + * + * This class supports parallel reads but not parallel writes. + * * @author Arjohn Kampman */ public class IDFile implements Closeable { @@ -54,12 +61,30 @@ public class IDFile implements Closeable { private final boolean forceSync; + // ReferenceMap keeps a soft reference to the cache line (Long[]) which means that it will be GCed if we run low on + // memory. This is not synchronized and we choose to synchronize in the code instead of synchronizing the whole map + // because this allows us to synchronize multiple operations together. + private final Map cache = new ReferenceMap<>(); + + // We choose a cacheLineSize of 4KB since this is a typical file system block size. + private final int blockSize = 4 * 1024; // 4KB + private final int cacheLineSize = (int) (blockSize / ITEM_SIZE); + private final int cacheLineShift = LongMath.log2(cacheLineSize, RoundingMode.UNNECESSARY); + + // keeping a reference of the last created cache line here should stop GC from removing it + private int gcReducingCacheIndex; + private Long[] gcReducingCache; + + // cached file size + private volatile long nioFileSize; + /*--------------* * Constructors * *--------------*/ public IDFile(File file) throws IOException { this(file, false); + nioFileSize = nioFile.size(); } public IDFile(File file, boolean forceSync) throws IOException { @@ -93,6 +118,9 @@ public IDFile(File file, boolean forceSync) throws IOException { this.nioFile.close(); throw e; } + + nioFileSize = nioFile.size(); + } /*---------* @@ -105,52 +133,111 @@ public final File getFile() { /** * Gets the largest ID that is stored in this ID file. - * + * * @return The largest ID, or 0 if the file does not contain any data. * @throws IOException If an I/O error occurs. */ public int getMaxID() throws IOException { - return (int) (nioFile.size() / ITEM_SIZE) - 1; + return (int) (nioFileSize / ITEM_SIZE) - 1; } /** * Stores the offset of a new data entry, returning the ID under which is stored. */ public int storeOffset(long offset) throws IOException { - long fileSize = nioFile.size(); + long fileSize = nioFileSize; nioFile.writeLong(offset, fileSize); + nioFileSize += ITEM_SIZE; return (int) (fileSize / ITEM_SIZE); } /** * Sets or updates the stored offset for the specified ID. - * + * * @param id The ID to set the offset for, must be larger than 0. * @param offset The (new) offset for the specified ID. */ public void setOffset(int id, long offset) throws IOException { assert id > 0 : "id must be larger than 0, is: " + id; + nioFile.writeLong(offset, ITEM_SIZE * id); + + // We need to update the cache after writing to file (not before) so that if anyone refreshes the cache it will + // include the write above. + // The scenario is as follows: + // 1. there is nothing in the cache, everything is fine + // 2. the relevant cache line is from before the writeLong operation above, in which case we update it + // 3. the relevant cache line is from right after the write in which case updating it doesnt matter + + int cacheLookupIndex = id >> cacheLineShift; + int cacheLineLookupIndex = id % cacheLineSize; + + Long[] cacheLine = getCacheLine(cacheLookupIndex); + + if (cacheLine != null) { + cacheLine[cacheLineLookupIndex] = offset; + } + } /** * Gets the offset of the data entry with the specified ID. - * + * * @param id The ID to get the offset for, must be larger than 0. * @return The offset for the ID. */ public long getOffset(int id) throws IOException { assert id > 0 : "id must be larger than 0, is: " + id; + + // the index used to lookup the cache line + int cacheLookupIndex = id >> cacheLineShift; + + // the index used to lookup the actual value inside the cache line + int cacheLineLookupIndex = id % cacheLineSize; + + // the cache line which is of size cacheLineSize + Long[] cacheLine = getCacheLine(cacheLookupIndex); + + if (cacheLine != null) { + return cacheLine[cacheLineLookupIndex]; + } + + // We only cache complete lines of size cacheLineSize. This means that the last line in the file will almost + // never be cached. This simplifies the code since we don't have to deal with partial lines. + if (getMaxID() > cacheLineSize && id < getMaxID() - cacheLineSize) { + + // doing one big read is considerably faster than doing a single read per id + byte[] bytes = nioFile.readBytes(ITEM_SIZE * (cacheLookupIndex << cacheLineShift), + (int) (ITEM_SIZE * cacheLineSize)); + + cacheLine = convertBytesToLongs(bytes); + + synchronized (this) { + // we try not to overwrite an existing cache line + if (!cache.containsKey(cacheLineLookupIndex)) { + cache.put(cacheLookupIndex, cacheLine); + } + gcReducingCache = cacheLine; + gcReducingCacheIndex = cacheLookupIndex; + } + + return cacheLine[cacheLineLookupIndex]; + + } + + // we did not find a cached value and we did not create a new cache line return nioFile.readLong(ITEM_SIZE * id); } /** * Discards all stored data. - * + * * @throws IOException If an I/O error occurred. */ public void clear() throws IOException { nioFile.truncate(HEADER_LENGTH); + nioFileSize = nioFile.size(); + clearCache(); } /** @@ -162,13 +249,50 @@ public void sync() throws IOException { } } + public void sync(boolean force) throws IOException { + nioFile.force(false); + } + /** * Closes the ID file, releasing any file locks that it might have. - * + * * @throws IOException */ @Override public void close() throws IOException { nioFile.close(); } + + synchronized private Long[] getCacheLine(int cacheLookupIndex) { + if (cacheLookupIndex == gcReducingCacheIndex) { + return gcReducingCache; + } else { + return cache.get(cacheLookupIndex); + } + } + + private Long[] convertBytesToLongs(byte[] bytes) { + Long[] cacheLine; + cacheLine = new Long[cacheLineSize]; + for (int i = 0; i < bytes.length; i += ITEM_SIZE) { + long l = ((long) (bytes[i + 0] & 0xff) << 56) + | ((long) bytes[i + 1] & 0xff) << 48 + | ((long) bytes[i + 2] & 0xff) << 40 + | ((long) bytes[i + 3] & 0xff) << 32 + | ((long) bytes[i + 4] & 0xff) << 24 + | ((long) bytes[i + 5] & 0xff) << 16 + | ((long) bytes[i + 6] & 0xff) << 8 + | ((long) bytes[i + 7] & 0xff); + + cacheLine[(int) (i / ITEM_SIZE)] = l; + } + return cacheLine; + } + + synchronized public void clearCache() { + cache.clear(); + gcReducingCacheIndex = -1; + gcReducingCache = null; + } + } diff --git a/core/sail/nativerdf/src/main/java/org/eclipse/rdf4j/sail/nativerdf/datastore/package-info.java b/core/sail/nativerdf/src/main/java/org/eclipse/rdf4j/sail/nativerdf/datastore/package-info.java index bed9a7be183..968874188cd 100644 --- a/core/sail/nativerdf/src/main/java/org/eclipse/rdf4j/sail/nativerdf/datastore/package-info.java +++ b/core/sail/nativerdf/src/main/java/org/eclipse/rdf4j/sail/nativerdf/datastore/package-info.java @@ -2,7 +2,7 @@ @InternalUseOnly /** * File and data storage functionality. - * + * * @deprecated Since 3.0. This package is for internal use only: its existence, signature or behavior may change without * warning from one release to the next. */ diff --git a/core/sail/nativerdf/src/main/java/org/eclipse/rdf4j/sail/nativerdf/model/NativeValue.java b/core/sail/nativerdf/src/main/java/org/eclipse/rdf4j/sail/nativerdf/model/NativeValue.java index ae9a322a43e..23d061c962b 100644 --- a/core/sail/nativerdf/src/main/java/org/eclipse/rdf4j/sail/nativerdf/model/NativeValue.java +++ b/core/sail/nativerdf/src/main/java/org/eclipse/rdf4j/sail/nativerdf/model/NativeValue.java @@ -21,7 +21,7 @@ public interface NativeValue extends Value { /** * Gets the ID that is used in the native store for this Value. - * + * * @return The value's ID, or {@link #UNKNOWN_ID} if not yet set. */ public int getInternalID(); diff --git a/core/sail/nativerdf/src/main/java/org/eclipse/rdf4j/sail/nativerdf/model/package-info.java b/core/sail/nativerdf/src/main/java/org/eclipse/rdf4j/sail/nativerdf/model/package-info.java index 684ffe18f56..531893cd3e8 100644 --- a/core/sail/nativerdf/src/main/java/org/eclipse/rdf4j/sail/nativerdf/model/package-info.java +++ b/core/sail/nativerdf/src/main/java/org/eclipse/rdf4j/sail/nativerdf/model/package-info.java @@ -2,7 +2,7 @@ @InternalUseOnly /** * Native implementations of the RDF Model interfaces. - * + * * @deprecated since 3.0. This package is for internal use only: its existence, signature or behavior may change without * warning from one release to the next. */ diff --git a/core/sail/nativerdf/src/test/java/org/eclipse/rdf4j/sail/nativerdf/ContextStoreTest.java b/core/sail/nativerdf/src/test/java/org/eclipse/rdf4j/sail/nativerdf/ContextStoreTest.java index 02f70bd29c0..53f18efeefb 100644 --- a/core/sail/nativerdf/src/test/java/org/eclipse/rdf4j/sail/nativerdf/ContextStoreTest.java +++ b/core/sail/nativerdf/src/test/java/org/eclipse/rdf4j/sail/nativerdf/ContextStoreTest.java @@ -17,7 +17,6 @@ import org.eclipse.rdf4j.model.Resource; import org.eclipse.rdf4j.model.ValueFactory; import org.eclipse.rdf4j.model.impl.SimpleValueFactory; -import org.eclipse.rdf4j.sail.SailException; import org.junit.Before; import org.junit.Test; @@ -25,7 +24,7 @@ /** * Unit tests for {@link ContextStore} - * + * * @author Jeen Broekstra * */ diff --git a/core/sail/nativerdf/src/test/java/org/eclipse/rdf4j/sail/nativerdf/LimitedSizeNativeStoreConnectionTest.java b/core/sail/nativerdf/src/test/java/org/eclipse/rdf4j/sail/nativerdf/LimitedSizeNativeStoreConnectionTest.java index 80c351207c3..3f7a4477659 100644 --- a/core/sail/nativerdf/src/test/java/org/eclipse/rdf4j/sail/nativerdf/LimitedSizeNativeStoreConnectionTest.java +++ b/core/sail/nativerdf/src/test/java/org/eclipse/rdf4j/sail/nativerdf/LimitedSizeNativeStoreConnectionTest.java @@ -7,7 +7,10 @@ *******************************************************************************/ package org.eclipse.rdf4j.sail.nativerdf; -import static org.junit.Assert.*; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertTrue; import java.io.File; import java.io.IOException; diff --git a/core/sail/nativerdf/src/test/java/org/eclipse/rdf4j/sail/nativerdf/LongMultithreadedTransactions.java b/core/sail/nativerdf/src/test/java/org/eclipse/rdf4j/sail/nativerdf/LongMultithreadedTransactions.java index bc508d9acbb..50466a9eca3 100644 --- a/core/sail/nativerdf/src/test/java/org/eclipse/rdf4j/sail/nativerdf/LongMultithreadedTransactions.java +++ b/core/sail/nativerdf/src/test/java/org/eclipse/rdf4j/sail/nativerdf/LongMultithreadedTransactions.java @@ -18,6 +18,7 @@ import org.eclipse.rdf4j.sail.SailConnection; import org.junit.After; import org.junit.Before; +import org.junit.Ignore; import org.junit.Test; public class LongMultithreadedTransactions { @@ -43,6 +44,7 @@ NotifyingSail getBaseSail() { } @Test + @Ignore public void test() { ValueFactory vf = SimpleValueFactory.getInstance(); @@ -73,6 +75,7 @@ public void test() { } @Test + @Ignore public void test1() { ValueFactory vf = SimpleValueFactory.getInstance(); diff --git a/core/sail/nativerdf/src/test/java/org/eclipse/rdf4j/sail/nativerdf/NativeCascadeValueExceptionTest.java b/core/sail/nativerdf/src/test/java/org/eclipse/rdf4j/sail/nativerdf/NativeCascadeValueExceptionTest.java index 90f61ba02ef..2832e55cf60 100644 --- a/core/sail/nativerdf/src/test/java/org/eclipse/rdf4j/sail/nativerdf/NativeCascadeValueExceptionTest.java +++ b/core/sail/nativerdf/src/test/java/org/eclipse/rdf4j/sail/nativerdf/NativeCascadeValueExceptionTest.java @@ -14,7 +14,6 @@ import org.eclipse.rdf4j.repository.CascadeValueExceptionTest; import org.eclipse.rdf4j.repository.Repository; import org.eclipse.rdf4j.repository.sail.SailRepository; -import org.eclipse.rdf4j.sail.nativerdf.NativeStore; public class NativeCascadeValueExceptionTest extends CascadeValueExceptionTest { diff --git a/core/sail/nativerdf/src/test/java/org/eclipse/rdf4j/sail/nativerdf/NativeGraphQueryResultTest.java b/core/sail/nativerdf/src/test/java/org/eclipse/rdf4j/sail/nativerdf/NativeGraphQueryResultTest.java index b92ac8d84d6..21e448f6861 100644 --- a/core/sail/nativerdf/src/test/java/org/eclipse/rdf4j/sail/nativerdf/NativeGraphQueryResultTest.java +++ b/core/sail/nativerdf/src/test/java/org/eclipse/rdf4j/sail/nativerdf/NativeGraphQueryResultTest.java @@ -14,7 +14,6 @@ import org.eclipse.rdf4j.repository.GraphQueryResultTest; import org.eclipse.rdf4j.repository.Repository; import org.eclipse.rdf4j.repository.sail.SailRepository; -import org.eclipse.rdf4j.sail.nativerdf.NativeStore; public class NativeGraphQueryResultTest extends GraphQueryResultTest { diff --git a/core/sail/nativerdf/src/test/java/org/eclipse/rdf4j/sail/nativerdf/NativeSparqlOrderByTest.java b/core/sail/nativerdf/src/test/java/org/eclipse/rdf4j/sail/nativerdf/NativeSparqlOrderByTest.java index 60f00d59316..eae9c0cbb6a 100644 --- a/core/sail/nativerdf/src/test/java/org/eclipse/rdf4j/sail/nativerdf/NativeSparqlOrderByTest.java +++ b/core/sail/nativerdf/src/test/java/org/eclipse/rdf4j/sail/nativerdf/NativeSparqlOrderByTest.java @@ -14,7 +14,6 @@ import org.eclipse.rdf4j.repository.Repository; import org.eclipse.rdf4j.repository.SparqlOrderByTest; import org.eclipse.rdf4j.repository.sail.SailRepository; -import org.eclipse.rdf4j.sail.nativerdf.NativeStore; public class NativeSparqlOrderByTest extends SparqlOrderByTest { diff --git a/core/sail/nativerdf/src/test/java/org/eclipse/rdf4j/sail/nativerdf/NativeSparqlRegexTest.java b/core/sail/nativerdf/src/test/java/org/eclipse/rdf4j/sail/nativerdf/NativeSparqlRegexTest.java index 68c52ba6bf5..0db531cb220 100644 --- a/core/sail/nativerdf/src/test/java/org/eclipse/rdf4j/sail/nativerdf/NativeSparqlRegexTest.java +++ b/core/sail/nativerdf/src/test/java/org/eclipse/rdf4j/sail/nativerdf/NativeSparqlRegexTest.java @@ -14,7 +14,6 @@ import org.eclipse.rdf4j.repository.Repository; import org.eclipse.rdf4j.repository.SparqlRegexTest; import org.eclipse.rdf4j.repository.sail.SailRepository; -import org.eclipse.rdf4j.sail.nativerdf.NativeStore; public class NativeSparqlRegexTest extends SparqlRegexTest { diff --git a/core/sail/nativerdf/src/test/java/org/eclipse/rdf4j/sail/nativerdf/NativeStoreConsistencyTest.java b/core/sail/nativerdf/src/test/java/org/eclipse/rdf4j/sail/nativerdf/NativeStoreConsistencyTest.java index 39d00d651e9..0d151ab62bb 100644 --- a/core/sail/nativerdf/src/test/java/org/eclipse/rdf4j/sail/nativerdf/NativeStoreConsistencyTest.java +++ b/core/sail/nativerdf/src/test/java/org/eclipse/rdf4j/sail/nativerdf/NativeStoreConsistencyTest.java @@ -37,7 +37,7 @@ /** * Integration tests for checking Native Store index consistency. - * + * * @author Jeen Broekstra */ public class NativeStoreConsistencyTest { @@ -109,7 +109,7 @@ protected void addStatement(Resource subj, IRI pred, Value obj, Resource ctxt) { // Step 4: check the repository size with SPOC only new File(dataDir, "triples.prop").delete(); // delete triples.prop to - // update index usage + // update index usage repo = new SailRepository(new NativeStore(dataDir, "spoc")); repo.initialize(); conn = repo.getConnection(); @@ -120,7 +120,7 @@ protected void addStatement(Resource subj, IRI pred, Value obj, Resource ctxt) { // Step 5: check the repository size with PSOC only new File(dataDir, "triples.prop").delete(); // delete triples.prop to - // update index usage + // update index usage repo = new SailRepository(new NativeStore(dataDir, "psoc")); repo.initialize(); conn = repo.getConnection(); diff --git a/core/sail/nativerdf/src/test/java/org/eclipse/rdf4j/sail/nativerdf/NativeStoreRepositoryTest.java b/core/sail/nativerdf/src/test/java/org/eclipse/rdf4j/sail/nativerdf/NativeStoreRepositoryTest.java index bb33d5c69b3..57ea6a6f6c3 100644 --- a/core/sail/nativerdf/src/test/java/org/eclipse/rdf4j/sail/nativerdf/NativeStoreRepositoryTest.java +++ b/core/sail/nativerdf/src/test/java/org/eclipse/rdf4j/sail/nativerdf/NativeStoreRepositoryTest.java @@ -14,7 +14,6 @@ import org.eclipse.rdf4j.repository.Repository; import org.eclipse.rdf4j.repository.RepositoryTest; import org.eclipse.rdf4j.repository.sail.SailRepository; -import org.eclipse.rdf4j.sail.nativerdf.NativeStore; public class NativeStoreRepositoryTest extends RepositoryTest { diff --git a/core/sail/nativerdf/src/test/java/org/eclipse/rdf4j/sail/nativerdf/NativeTupleQueryResultTest.java b/core/sail/nativerdf/src/test/java/org/eclipse/rdf4j/sail/nativerdf/NativeTupleQueryResultTest.java index b5a97f460cb..8022023f908 100644 --- a/core/sail/nativerdf/src/test/java/org/eclipse/rdf4j/sail/nativerdf/NativeTupleQueryResultTest.java +++ b/core/sail/nativerdf/src/test/java/org/eclipse/rdf4j/sail/nativerdf/NativeTupleQueryResultTest.java @@ -14,7 +14,6 @@ import org.eclipse.rdf4j.repository.Repository; import org.eclipse.rdf4j.repository.TupleQueryResultTest; import org.eclipse.rdf4j.repository.sail.SailRepository; -import org.eclipse.rdf4j.sail.nativerdf.NativeStore; public class NativeTupleQueryResultTest extends TupleQueryResultTest { diff --git a/core/sail/nativerdf/src/test/java/org/eclipse/rdf4j/sail/nativerdf/TestNativeStoreMemoryOverflow.java b/core/sail/nativerdf/src/test/java/org/eclipse/rdf4j/sail/nativerdf/TestNativeStoreMemoryOverflow.java index 5be9a127bf6..0ae8351c134 100644 --- a/core/sail/nativerdf/src/test/java/org/eclipse/rdf4j/sail/nativerdf/TestNativeStoreMemoryOverflow.java +++ b/core/sail/nativerdf/src/test/java/org/eclipse/rdf4j/sail/nativerdf/TestNativeStoreMemoryOverflow.java @@ -23,7 +23,6 @@ import org.eclipse.rdf4j.repository.Repository; import org.eclipse.rdf4j.repository.RepositoryConnection; import org.eclipse.rdf4j.repository.sail.SailRepository; -import org.eclipse.rdf4j.sail.nativerdf.NativeStore; import org.junit.After; import org.junit.Before; import org.junit.Test; diff --git a/core/sail/nativerdf/src/test/java/org/eclipse/rdf4j/sail/nativerdf/TestNativeStoreUpgrade.java b/core/sail/nativerdf/src/test/java/org/eclipse/rdf4j/sail/nativerdf/TestNativeStoreUpgrade.java index 8cb320e2fe7..0939e5b3892 100644 --- a/core/sail/nativerdf/src/test/java/org/eclipse/rdf4j/sail/nativerdf/TestNativeStoreUpgrade.java +++ b/core/sail/nativerdf/src/test/java/org/eclipse/rdf4j/sail/nativerdf/TestNativeStoreUpgrade.java @@ -129,4 +129,4 @@ public void extractZipResource(String resource, File dir) throws IOException { } } -} \ No newline at end of file +} diff --git a/core/sail/nativerdf/src/test/java/org/eclipse/rdf4j/sail/nativerdf/benchmark/DataFileBenchmark.java b/core/sail/nativerdf/src/test/java/org/eclipse/rdf4j/sail/nativerdf/benchmark/DataFileBenchmark.java new file mode 100644 index 00000000000..56ed0250851 --- /dev/null +++ b/core/sail/nativerdf/src/test/java/org/eclipse/rdf4j/sail/nativerdf/benchmark/DataFileBenchmark.java @@ -0,0 +1,132 @@ +/******************************************************************************* + * Copyright (c) 2020 Eclipse RDF4J contributors. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Distribution License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ + +package org.eclipse.rdf4j.sail.nativerdf.benchmark; + +import java.io.File; +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.Random; +import java.util.concurrent.TimeUnit; + +import org.apache.commons.io.FileUtils; +import org.assertj.core.util.Files; +import org.eclipse.rdf4j.sail.nativerdf.datastore.DataFile; +import org.openjdk.jmh.annotations.Benchmark; +import org.openjdk.jmh.annotations.BenchmarkMode; +import org.openjdk.jmh.annotations.Fork; +import org.openjdk.jmh.annotations.Level; +import org.openjdk.jmh.annotations.Measurement; +import org.openjdk.jmh.annotations.Mode; +import org.openjdk.jmh.annotations.OutputTimeUnit; +import org.openjdk.jmh.annotations.Scope; +import org.openjdk.jmh.annotations.Setup; +import org.openjdk.jmh.annotations.State; +import org.openjdk.jmh.annotations.TearDown; +import org.openjdk.jmh.annotations.Warmup; + +/** + * @author HÃ¥vard Ottestad + */ +@State(Scope.Benchmark) +@Warmup(iterations = 20) +@BenchmarkMode({ Mode.AverageTime }) +@Fork(value = 1, jvmArgs = { "-Xms256M", "-Xmx256M", "-XX:+UseG1GC" }) +//@Fork(value = 1, jvmArgs = {"-Xms256M", "-Xmx256M", "-XX:+UseG1GC""-XX:+UnlockCommercialFeatures", "-XX:StartFlightRecording=delay=60s,duration=120s,filename=recording.jfr,settings=profile", "-XX:FlightRecorderOptions=samplethreads=true,stackdepth=1024", "-XX:+UnlockDiagnosticVMOptions", "-XX:+DebugNonSafepoints"}) +@Measurement(iterations = 10) +@OutputTimeUnit(TimeUnit.MILLISECONDS) +public class DataFileBenchmark { + + // May be interesting to test without OS disk cache. For OSX use: watch --interval=0.1 sudo purge + + public static final int RANDOM_SEED = 524826405; + private static final int COUNT = 500_000; + private static List offsets; + private File tempFolder; + private DataFile dataFile; + + final static private byte[] BYTES = "fewjf3u28hq98fhref8j2908rhfuhfjnjvfbv2u9r82ufh4908fhuheui2hjdfh9284ru9h34unfre892hf08r48nu2frfh9034" + .getBytes(StandardCharsets.UTF_8); + + @Setup(Level.Trial) + public void beforeClass() throws IOException { + + tempFolder = Files.newTemporaryFolder(); + + File file = File.createTempFile("hashfile", "hash", tempFolder); + + dataFile = new DataFile(file); + Random random = new Random(RANDOM_SEED); + + offsets = new ArrayList<>(); + + for (int i = 0; i < COUNT; i++) { + int length = random.nextInt(BYTES.length); + long offset = dataFile.storeData(Arrays.copyOf(BYTES, length)); + offsets.add(offset); + } + + dataFile.sync(true); + + System.gc(); + + } + + @TearDown(Level.Trial) + public void afterClass() throws IOException { + + try { + dataFile.close(); + } finally { + FileUtils.deleteDirectory(tempFolder); + } + + } + + @Benchmark + public long read() throws IOException { + ArrayList offsetsShuffled = new ArrayList<>(offsets); + + Collections.shuffle(offsetsShuffled, new Random(RANDOM_SEED)); + + int sum = 0; + + for (Long offset : offsetsShuffled) { + sum += dataFile.getData(offset).length; + } + + return sum; + } + + @Benchmark + public long write() throws IOException { + File file = File.createTempFile("hashfile", "hash", tempFolder); + + try (DataFile dataFile = new DataFile(file)) { + Random random = new Random(RANDOM_SEED); + + int sum = 0; + + for (int i = 0; i < COUNT / 4; i++) { + int length = random.nextInt(BYTES.length); + sum += dataFile.storeData(Arrays.copyOf(BYTES, length)); + } + + return sum; + + } finally { + file.delete(); + } + + } + +} diff --git a/core/sail/nativerdf/src/test/java/org/eclipse/rdf4j/sail/nativerdf/benchmark/HashFileBenchmark.java b/core/sail/nativerdf/src/test/java/org/eclipse/rdf4j/sail/nativerdf/benchmark/HashFileBenchmark.java new file mode 100644 index 00000000000..678306c2d59 --- /dev/null +++ b/core/sail/nativerdf/src/test/java/org/eclipse/rdf4j/sail/nativerdf/benchmark/HashFileBenchmark.java @@ -0,0 +1,215 @@ +/******************************************************************************* + * Copyright (c) 2020 Eclipse RDF4J contributors. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Distribution License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ + +package org.eclipse.rdf4j.sail.nativerdf.benchmark; + +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Random; +import java.util.concurrent.TimeUnit; + +import org.apache.commons.io.FileUtils; +import org.assertj.core.util.Files; +import org.eclipse.rdf4j.sail.nativerdf.datastore.HashFile; +import org.openjdk.jmh.annotations.Benchmark; +import org.openjdk.jmh.annotations.BenchmarkMode; +import org.openjdk.jmh.annotations.Fork; +import org.openjdk.jmh.annotations.Level; +import org.openjdk.jmh.annotations.Measurement; +import org.openjdk.jmh.annotations.Mode; +import org.openjdk.jmh.annotations.OutputTimeUnit; +import org.openjdk.jmh.annotations.Scope; +import org.openjdk.jmh.annotations.Setup; +import org.openjdk.jmh.annotations.State; +import org.openjdk.jmh.annotations.TearDown; +import org.openjdk.jmh.annotations.Warmup; + +/** + * @author HÃ¥vard Ottestad + */ +@State(Scope.Benchmark) +@Warmup(iterations = 20) +@BenchmarkMode({ Mode.AverageTime }) +@Fork(value = 1, jvmArgs = { "-Xms256M", "-Xmx256M", "-XX:+UseG1GC" }) +//@Fork(value = 1, jvmArgs = {"-Xms256M", "-Xmx256M", "-XX:+UseG1GC", "-XX:+UnlockCommercialFeatures", "-XX:StartFlightRecording=delay=60s,duration=120s,filename=recording.jfr,settings=profile", "-XX:FlightRecorderOptions=samplethreads=true,stackdepth=1024", "-XX:+UnlockDiagnosticVMOptions", "-XX:+DebugNonSafepoints"}) +@Measurement(iterations = 10) +@OutputTimeUnit(TimeUnit.MILLISECONDS) +public class HashFileBenchmark { + + // May be interesting to test without OS disk cache. For OSX use: watch --interval=0.1 sudo purge + + public static final int RANDOM_SEED = 524826405; + private static final int COUNT = 1_000_000; + private static List hashes; + private File tempFolder; + private HashFile hashFile; + + @Setup(Level.Trial) + public void beforeClass() throws IOException { + + tempFolder = Files.newTemporaryFolder(); + + File file = File.createTempFile("hashfile", "hash", tempFolder); + + hashFile = new HashFile(file, false, (int) (COUNT / .75f) + 1); + Random random = new Random(RANDOM_SEED); + + hashes = new ArrayList<>(); + + for (int i = 0; i < COUNT; i++) { + int hash = random.nextInt(); + hashes.add(hash); + hashFile.storeID(hash, i); + } + + hashFile.sync(true); + + System.gc(); + + } + + @TearDown(Level.Trial) + public void afterClass() throws IOException { + + try { + hashFile.close(); + } finally { + FileUtils.deleteDirectory(tempFolder); + } + + } + + @Benchmark + public long readNoMissesReadOneTenth() throws IOException { + long count = 0; + + ArrayList integers = new ArrayList<>(hashes); + + Collections.shuffle(integers, new Random(RANDOM_SEED)); + + for (int i = 0; i < integers.size(); i += 10) { + + HashFile.IDIterator idIterator = hashFile.getIDIterator(integers.get(i)); + + while (true) { + int next = idIterator.next(); + if (next >= 0) { + count++; + } else { + break; + } + } + + idIterator.close(); + + } + + return count; + } + + @Benchmark + public long readNoMisses() throws IOException { + long count = 0; + + ArrayList shuffledHashes = new ArrayList<>(hashes); + + Collections.shuffle(shuffledHashes, new Random(RANDOM_SEED)); + + for (Integer integer : shuffledHashes) { + + HashFile.IDIterator idIterator = hashFile.getIDIterator(integer); + + while (true) { + int next = idIterator.next(); + if (next >= 0) { + count++; + } else { + break; + } + } + + idIterator.close(); + + } + + return count; + } + + @Benchmark + public long readHighMissCount() throws IOException { + + Random random = new Random(RANDOM_SEED + 21483); + + long count = 0; + for (int i = 0; i < COUNT; i++) { + HashFile.IDIterator idIterator = hashFile.getIDIterator(random.nextInt()); + + while (true) { + int next = idIterator.next(); + if (next >= 0) { + count++; + } else { + break; + } + } + + idIterator.close(); + + } + + return count; + + } + + @Benchmark() + public int fillHashfileKnownSize() throws IOException { + int testSize = COUNT / 10; + + File file = File.createTempFile("hashfile", "hash", tempFolder); + + try (HashFile hashFile = new HashFile(file, false, (int) (testSize / .75f) + 1)) { + + Random random = new Random(RANDOM_SEED); + + for (int i = 0; i < testSize; i++) { + int hash = random.nextInt(); + hashFile.storeID(hash, i); + } + + return hashFile.getItemCount(); + } finally { + file.delete(); + } + + } + + @Benchmark() + public int fillHashfileUnknownSize() throws IOException { + int testSize = COUNT / 10; + + File file = File.createTempFile("hashfile", "hash", tempFolder); + + try (HashFile hashFile = new HashFile(file, false)) { + Random random = new Random(RANDOM_SEED); + + for (int i = 0; i < testSize; i++) { + int hash = random.nextInt(); + hashFile.storeID(hash, i); + } + + return hashFile.getItemCount(); + } finally { + file.delete(); + } + + } + +} diff --git a/core/sail/nativerdf/src/test/java/org/eclipse/rdf4j/sail/nativerdf/benchmark/IDFileBenchmark.java b/core/sail/nativerdf/src/test/java/org/eclipse/rdf4j/sail/nativerdf/benchmark/IDFileBenchmark.java new file mode 100644 index 00000000000..d870a2570ed --- /dev/null +++ b/core/sail/nativerdf/src/test/java/org/eclipse/rdf4j/sail/nativerdf/benchmark/IDFileBenchmark.java @@ -0,0 +1,141 @@ +/******************************************************************************* + * Copyright (c) 2020 Eclipse RDF4J contributors. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Distribution License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ + +package org.eclipse.rdf4j.sail.nativerdf.benchmark; + +import java.io.File; +import java.io.IOException; +import java.util.Random; +import java.util.concurrent.TimeUnit; + +import org.apache.commons.io.FileUtils; +import org.assertj.core.util.Files; +import org.eclipse.rdf4j.sail.nativerdf.datastore.IDFile; +import org.openjdk.jmh.annotations.Benchmark; +import org.openjdk.jmh.annotations.BenchmarkMode; +import org.openjdk.jmh.annotations.Fork; +import org.openjdk.jmh.annotations.Level; +import org.openjdk.jmh.annotations.Measurement; +import org.openjdk.jmh.annotations.Mode; +import org.openjdk.jmh.annotations.OutputTimeUnit; +import org.openjdk.jmh.annotations.Scope; +import org.openjdk.jmh.annotations.Setup; +import org.openjdk.jmh.annotations.State; +import org.openjdk.jmh.annotations.TearDown; +import org.openjdk.jmh.annotations.Warmup; + +/** + * @author HÃ¥vard Ottestad + */ +@State(Scope.Benchmark) +@Warmup(iterations = 20) +@BenchmarkMode({ Mode.AverageTime }) +@Fork(value = 1, jvmArgs = { "-Xms256M", "-Xmx256M", "-XX:+UseG1GC" }) +//@Fork(value = 1, jvmArgs = {"-Xms256M", "-Xmx256M", "-XX:+UseG1GC", "-XX:+UnlockCommercialFeatures", "-XX:StartFlightRecording=delay=60s,duration=120s,filename=recording.jfr,settings=profile", "-XX:FlightRecorderOptions=samplethreads=true,stackdepth=1024", "-XX:+UnlockDiagnosticVMOptions", "-XX:+DebugNonSafepoints"}) +@Measurement(iterations = 10) +@OutputTimeUnit(TimeUnit.MILLISECONDS) +public class IDFileBenchmark { + + // May be interesting to test without OS disk cache. For OSX use: watch --interval=0.1 sudo purge + + public static final int RANDOM_SEED = 524826405; + private static final int COUNT = 1_000_000; + private File tempFolder; + private IDFile idFile; + + @Setup(Level.Trial) + public void beforeClass() throws IOException { + + tempFolder = Files.newTemporaryFolder(); + + File file = File.createTempFile("idfile", "id", tempFolder); + + idFile = new IDFile(file); + + for (int i = 0; i < COUNT * 8; i++) { + idFile.storeOffset(i); + } + + idFile.sync(true); + + System.gc(); + + } + + @TearDown(Level.Trial) + public void afterClass() throws IOException { + + try { + idFile.close(); + } finally { + FileUtils.deleteDirectory(tempFolder); + } + + } + + @Benchmark + public long addAndRead() throws IOException { + + File file = File.createTempFile("idfile", "id", tempFolder); + + int writeCount = COUNT / 10; + + IDFile idFile = new IDFile(file); + + for (int i = 0; i < writeCount * 8; i++) { + idFile.storeOffset(i); + } + + idFile.clearCache(); + + Random random = new Random(RANDOM_SEED); + + long sum = 0; + for (int i = 0; i < writeCount; i++) { + sum += idFile.getOffset(random.nextInt(writeCount)); + } + + idFile.close(); + + boolean delete = file.delete(); + + return sum; + + } + + @Benchmark + public long read() throws IOException { + + idFile.clearCache(); + + Random random = new Random(RANDOM_SEED); + + long sum = 0; + for (int i = 0; i < COUNT; i++) { + sum += idFile.getOffset(random.nextInt(COUNT)); + } + + return sum; + + } + + @Benchmark + public long readFromCache() throws IOException { + + Random random = new Random(RANDOM_SEED); + + long sum = 0; + for (int i = 0; i < COUNT; i++) { + sum += idFile.getOffset(random.nextInt(COUNT)); + } + + return sum; + + } + +} diff --git a/core/sail/nativerdf/src/test/java/org/eclipse/rdf4j/sail/nativerdf/benchmark/Main.java b/core/sail/nativerdf/src/test/java/org/eclipse/rdf4j/sail/nativerdf/benchmark/Main.java new file mode 100644 index 00000000000..fa6929f6d0f --- /dev/null +++ b/core/sail/nativerdf/src/test/java/org/eclipse/rdf4j/sail/nativerdf/benchmark/Main.java @@ -0,0 +1,32 @@ +/******************************************************************************* + * Copyright (c) 2020 Eclipse RDF4J contributors. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Distribution License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ + +package org.eclipse.rdf4j.sail.nativerdf.benchmark; + +import org.openjdk.jmh.runner.Runner; +import org.openjdk.jmh.runner.RunnerException; +import org.openjdk.jmh.runner.options.Options; +import org.openjdk.jmh.runner.options.OptionsBuilder; + +/** + * @author HÃ¥vard Ottestad + */ + +public class Main { + + public static void main(String[] args) throws RunnerException { + Options opt = new OptionsBuilder() + .include("") +// .include("DataFileBenchmark.write$") +// .forks(0) + .build(); + + new Runner(opt).run(); + } + +} diff --git a/core/sail/nativerdf/src/test/java/org/eclipse/rdf4j/sail/nativerdf/benchmark/QueryBenchmark.java b/core/sail/nativerdf/src/test/java/org/eclipse/rdf4j/sail/nativerdf/benchmark/QueryBenchmark.java index 92144cc5ff6..3b4e099d667 100644 --- a/core/sail/nativerdf/src/test/java/org/eclipse/rdf4j/sail/nativerdf/benchmark/QueryBenchmark.java +++ b/core/sail/nativerdf/src/test/java/org/eclipse/rdf4j/sail/nativerdf/benchmark/QueryBenchmark.java @@ -23,7 +23,6 @@ import org.eclipse.rdf4j.model.Resource; import org.eclipse.rdf4j.model.Statement; import org.eclipse.rdf4j.model.vocabulary.RDF; -import org.eclipse.rdf4j.query.BindingSet; import org.eclipse.rdf4j.repository.sail.SailRepository; import org.eclipse.rdf4j.repository.sail.SailRepositoryConnection; import org.eclipse.rdf4j.rio.RDFFormat; @@ -59,12 +58,16 @@ public class QueryBenchmark { private static final String query1; private static final String query2; private static final String query3; + private static final String query4; + private static final String query5; static { try { query1 = IOUtils.toString(getResourceAsStream("benchmarkFiles/query1.qr"), StandardCharsets.UTF_8); query2 = IOUtils.toString(getResourceAsStream("benchmarkFiles/query2.qr"), StandardCharsets.UTF_8); query3 = IOUtils.toString(getResourceAsStream("benchmarkFiles/query3.qr"), StandardCharsets.UTF_8); + query4 = IOUtils.toString(getResourceAsStream("benchmarkFiles/query4.qr"), StandardCharsets.UTF_8); + query5 = IOUtils.toString(getResourceAsStream("benchmarkFiles/query5.qr"), StandardCharsets.UTF_8); } catch (IOException e) { throw new RuntimeException(e); } @@ -107,12 +110,38 @@ public void afterClass() throws IOException { } @Benchmark - public List groupByQuery() { + public long groupByQuery() { try (SailRepositoryConnection connection = repository.getConnection()) { - return Iterations.asList(connection + return connection .prepareTupleQuery(query1) - .evaluate()); + .evaluate() + .stream() + .count(); + } + } + + @Benchmark + public long complexQuery() { + + try (SailRepositoryConnection connection = repository.getConnection()) { + return connection + .prepareTupleQuery(query4) + .evaluate() + .stream() + .count(); + } + } + + @Benchmark + public long distinctPredicatesQuery() { + + try (SailRepositoryConnection connection = repository.getConnection()) { + return connection + .prepareTupleQuery(query5) + .evaluate() + .stream() + .count(); } } diff --git a/core/sail/nativerdf/src/test/java/org/eclipse/rdf4j/sail/nativerdf/benchmark/TransactionsPerSecondBenchmark.java b/core/sail/nativerdf/src/test/java/org/eclipse/rdf4j/sail/nativerdf/benchmark/TransactionsPerSecondBenchmark.java index 5210d28fbe1..d421286ea10 100644 --- a/core/sail/nativerdf/src/test/java/org/eclipse/rdf4j/sail/nativerdf/benchmark/TransactionsPerSecondBenchmark.java +++ b/core/sail/nativerdf/src/test/java/org/eclipse/rdf4j/sail/nativerdf/benchmark/TransactionsPerSecondBenchmark.java @@ -11,10 +11,10 @@ import java.io.File; import java.io.IOException; import java.util.concurrent.TimeUnit; -import java.util.stream.IntStream; import org.apache.commons.io.FileUtils; import org.assertj.core.util.Files; +import org.eclipse.rdf4j.IsolationLevels; import org.eclipse.rdf4j.model.vocabulary.RDFS; import org.eclipse.rdf4j.repository.sail.SailRepository; import org.eclipse.rdf4j.repository.sail.SailRepositoryConnection; @@ -26,7 +26,6 @@ import org.openjdk.jmh.annotations.Measurement; import org.openjdk.jmh.annotations.Mode; import org.openjdk.jmh.annotations.OutputTimeUnit; -import org.openjdk.jmh.annotations.Param; import org.openjdk.jmh.annotations.Scope; import org.openjdk.jmh.annotations.Setup; import org.openjdk.jmh.annotations.State; @@ -38,33 +37,43 @@ */ @State(Scope.Benchmark) @Warmup(iterations = 20) -@BenchmarkMode({ Mode.AverageTime }) -@Fork(value = 1, jvmArgs = { "-Xms8G", "-Xmx8G", "-Xmn4G", "-XX:+UseSerialGC" }) -//@Fork(value = 1, jvmArgs = {"-Xms8G", "-Xmx8G", "-Xmn4G", "-XX:+UseSerialGC", "-XX:+UnlockCommercialFeatures", "-XX:StartFlightRecording=delay=60s,duration=120s,filename=recording.jfr,settings=profile", "-XX:FlightRecorderOptions=samplethreads=true,stackdepth=1024", "-XX:+UnlockDiagnosticVMOptions", "-XX:+DebugNonSafepoints"}) +@BenchmarkMode({ Mode.Throughput }) +@Fork(value = 1, jvmArgs = { "-Xms8G", "-Xmx8G", "-XX:+UseG1GC" }) +//@Fork(value = 1, jvmArgs = {"-Xms8G", "-Xmx8G", "-XX:+UseG1GC", "-XX:+UnlockCommercialFeatures", "-XX:StartFlightRecording=delay=60s,duration=120s,filename=recording.jfr,settings=profile", "-XX:FlightRecorderOptions=samplethreads=true,stackdepth=1024", "-XX:+UnlockDiagnosticVMOptions", "-XX:+DebugNonSafepoints"}) @Measurement(iterations = 10) -@OutputTimeUnit(TimeUnit.MILLISECONDS) +@OutputTimeUnit(TimeUnit.SECONDS) public class TransactionsPerSecondBenchmark { private SailRepository repository; private File file; - @Param({ "100", "1000", "10000" }) - public String numberOfTransactions; - - @Setup(Level.Invocation) - public void beforeClass() throws IOException, InterruptedException { + SailRepositoryConnection connection; + int i; + @Setup(Level.Iteration) + public void beforeClass() { + if (connection != null) { + connection.close(); + connection = null; + } + i = 0; file = Files.newTemporaryFolder(); - repository = new SailRepository(new NativeStore(file, "spoc,ospc,psoc")); + NativeStore sail = new NativeStore(file, "spoc,ospc,psoc"); + sail.setForceSync(false); + repository = new SailRepository(sail); + connection = repository.getConnection(); System.gc(); } - @TearDown(Level.Invocation) + @TearDown(Level.Iteration) public void afterClass() throws IOException { - + if (connection != null) { + connection.close(); + connection = null; + } repository.shutDown(); FileUtils.deleteDirectory(file); @@ -72,15 +81,51 @@ public void afterClass() throws IOException { @Benchmark public void transactions() { + connection.begin(); + connection.add(RDFS.RESOURCE, RDFS.LABEL, connection.getValueFactory().createLiteral(i++)); + connection.commit(); + } - try (SailRepositoryConnection connection = repository.getConnection()) { - IntStream.range(0, Integer.parseInt(numberOfTransactions)).forEach(i -> { - connection.begin(); - connection.add(RDFS.RESOURCE, RDFS.LABEL, connection.getValueFactory().createLiteral(i)); - connection.commit(); - }); + @Benchmark + public void transactionsLevelNone() { + connection.begin(IsolationLevels.NONE); + connection.add(RDFS.RESOURCE, RDFS.LABEL, connection.getValueFactory().createLiteral(i++)); + connection.commit(); + } + + @Benchmark + public void mediumTransactionsLevelNone() { + connection.begin(IsolationLevels.NONE); + for (int k = 0; k < 10; k++) { + connection.add(RDFS.RESOURCE, RDFS.LABEL, connection.getValueFactory().createLiteral(i++ + "_" + k)); } + connection.commit(); + } + @Benchmark + public void largerTransaction() { + connection.begin(); + for (int k = 0; k < 10000; k++) { + connection.add(RDFS.RESOURCE, RDFS.LABEL, connection.getValueFactory().createLiteral(i++ + "_" + k)); + } + connection.commit(); } + @Benchmark + public void largerTransactionLevelNone() { + connection.begin(IsolationLevels.NONE); + for (int k = 0; k < 10000; k++) { + connection.add(RDFS.RESOURCE, RDFS.LABEL, connection.getValueFactory().createLiteral(i++ + "_" + k)); + } + connection.commit(); + } + + @Benchmark + public void veryLargerTransactionLevelNone() { + connection.begin(IsolationLevels.NONE); + for (int k = 0; k < 1000000; k++) { + connection.add(RDFS.RESOURCE, RDFS.LABEL, connection.getValueFactory().createLiteral(i++ + "_" + k)); + } + connection.commit(); + } } diff --git a/core/sail/nativerdf/src/test/java/org/eclipse/rdf4j/sail/nativerdf/benchmark/TransactionsPerSecondForceSyncBenchmark.java b/core/sail/nativerdf/src/test/java/org/eclipse/rdf4j/sail/nativerdf/benchmark/TransactionsPerSecondForceSyncBenchmark.java new file mode 100644 index 00000000000..0909ed5ae31 --- /dev/null +++ b/core/sail/nativerdf/src/test/java/org/eclipse/rdf4j/sail/nativerdf/benchmark/TransactionsPerSecondForceSyncBenchmark.java @@ -0,0 +1,131 @@ +/******************************************************************************* + * Copyright (c) 2020 Eclipse RDF4J contributors. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Distribution License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/org/documents/edl-v10.php. + *******************************************************************************/ + +package org.eclipse.rdf4j.sail.nativerdf.benchmark; + +import java.io.File; +import java.io.IOException; +import java.util.concurrent.TimeUnit; + +import org.apache.commons.io.FileUtils; +import org.assertj.core.util.Files; +import org.eclipse.rdf4j.IsolationLevels; +import org.eclipse.rdf4j.model.vocabulary.RDFS; +import org.eclipse.rdf4j.repository.sail.SailRepository; +import org.eclipse.rdf4j.repository.sail.SailRepositoryConnection; +import org.eclipse.rdf4j.sail.nativerdf.NativeStore; +import org.openjdk.jmh.annotations.Benchmark; +import org.openjdk.jmh.annotations.BenchmarkMode; +import org.openjdk.jmh.annotations.Fork; +import org.openjdk.jmh.annotations.Level; +import org.openjdk.jmh.annotations.Measurement; +import org.openjdk.jmh.annotations.Mode; +import org.openjdk.jmh.annotations.OutputTimeUnit; +import org.openjdk.jmh.annotations.Scope; +import org.openjdk.jmh.annotations.Setup; +import org.openjdk.jmh.annotations.State; +import org.openjdk.jmh.annotations.TearDown; +import org.openjdk.jmh.annotations.Warmup; + +/** + * @author HÃ¥vard Ottestad + */ +@State(Scope.Benchmark) +@Warmup(iterations = 20) +@BenchmarkMode({ Mode.Throughput }) +@Fork(value = 1, jvmArgs = { "-Xms8G", "-Xmx8G", "-XX:+UseG1GC" }) +//@Fork(value = 1, jvmArgs = {"-Xms8G", "-Xmx8G", "-XX:+UseG1GC", "-XX:+UnlockCommercialFeatures", "-XX:StartFlightRecording=delay=60s,duration=120s,filename=recording.jfr,settings=profile", "-XX:FlightRecorderOptions=samplethreads=true,stackdepth=1024", "-XX:+UnlockDiagnosticVMOptions", "-XX:+DebugNonSafepoints"}) +@Measurement(iterations = 10) +@OutputTimeUnit(TimeUnit.SECONDS) +public class TransactionsPerSecondForceSyncBenchmark { + + private SailRepository repository; + private File file; + + SailRepositoryConnection connection; + int i; + + @Setup(Level.Iteration) + public void beforeClass() { + if (connection != null) { + connection.close(); + connection = null; + } + i = 0; + file = Files.newTemporaryFolder(); + + NativeStore sail = new NativeStore(file, "spoc,ospc,psoc"); + sail.setForceSync(true); + repository = new SailRepository(sail); + connection = repository.getConnection(); + + System.gc(); + + } + + @TearDown(Level.Iteration) + public void afterClass() throws IOException { + if (connection != null) { + connection.close(); + connection = null; + } + repository.shutDown(); + FileUtils.deleteDirectory(file); + + } + + @Benchmark + public void transactions() { + connection.begin(); + connection.add(RDFS.RESOURCE, RDFS.LABEL, connection.getValueFactory().createLiteral(i++)); + connection.commit(); + } + + @Benchmark + public void transactionsLevelNone() { + connection.begin(IsolationLevels.NONE); + connection.add(RDFS.RESOURCE, RDFS.LABEL, connection.getValueFactory().createLiteral(i++)); + connection.commit(); + } + + @Benchmark + public void mediumTransactionsLevelNone() { + connection.begin(IsolationLevels.NONE); + for (int k = 0; k < 10; k++) { + connection.add(RDFS.RESOURCE, RDFS.LABEL, connection.getValueFactory().createLiteral(i++ + "_" + k)); + } + connection.commit(); + } + + @Benchmark + public void largerTransaction() { + connection.begin(); + for (int k = 0; k < 10000; k++) { + connection.add(RDFS.RESOURCE, RDFS.LABEL, connection.getValueFactory().createLiteral(i++ + "_" + k)); + } + connection.commit(); + } + + @Benchmark + public void largerTransactionLevelNone() { + connection.begin(IsolationLevels.NONE); + for (int k = 0; k < 10000; k++) { + connection.add(RDFS.RESOURCE, RDFS.LABEL, connection.getValueFactory().createLiteral(i++ + "_" + k)); + } + connection.commit(); + } + + @Benchmark + public void veryLargerTransactionLevelNone() { + connection.begin(IsolationLevels.NONE); + for (int k = 0; k < 1000000; k++) { + connection.add(RDFS.RESOURCE, RDFS.LABEL, connection.getValueFactory().createLiteral(i++ + "_" + k)); + } + connection.commit(); + } +} diff --git a/core/sail/nativerdf/src/test/java/org/eclipse/rdf4j/sail/nativerdf/btree/BTreeTest.java b/core/sail/nativerdf/src/test/java/org/eclipse/rdf4j/sail/nativerdf/btree/BTreeTest.java index a2b90ffc639..d60a3771cf5 100644 --- a/core/sail/nativerdf/src/test/java/org/eclipse/rdf4j/sail/nativerdf/btree/BTreeTest.java +++ b/core/sail/nativerdf/src/test/java/org/eclipse/rdf4j/sail/nativerdf/btree/BTreeTest.java @@ -26,9 +26,9 @@ public class BTreeTest { * Constants * *-----------*/ - private static List TEST_VALUES = new ArrayList(256); + private static List TEST_VALUES = new ArrayList<>(256); - private static List RANDOMIZED_TEST_VALUES = new ArrayList(256); + private static List RANDOMIZED_TEST_VALUES = new ArrayList<>(256); static { for (int i = 0; i < 256; i++) { diff --git a/core/sail/nativerdf/src/test/java/org/eclipse/rdf4j/sail/nativerdf/datastore/DataStorePerfTest.java b/core/sail/nativerdf/src/test/java/org/eclipse/rdf4j/sail/nativerdf/datastore/DataStorePerfTest.java index 8e531c78feb..b18f0549633 100644 --- a/core/sail/nativerdf/src/test/java/org/eclipse/rdf4j/sail/nativerdf/datastore/DataStorePerfTest.java +++ b/core/sail/nativerdf/src/test/java/org/eclipse/rdf4j/sail/nativerdf/datastore/DataStorePerfTest.java @@ -14,7 +14,7 @@ import org.eclipse.rdf4j.common.io.FileUtil; /** - * + * */ public class DataStorePerfTest { diff --git a/core/sail/nativerdf/src/test/resources/benchmarkFiles/query4.qr b/core/sail/nativerdf/src/test/resources/benchmarkFiles/query4.qr new file mode 100644 index 00000000000..e5578d1d05a --- /dev/null +++ b/core/sail/nativerdf/src/test/resources/benchmarkFiles/query4.qr @@ -0,0 +1,22 @@ +PREFIX ex: +PREFIX owl: +PREFIX rdf: +PREFIX rdfs: +PREFIX sh: +PREFIX xsd: +PREFIX dcat: +PREFIX dc: +PREFIX skos: +PREFIX foaf: +PREFIX dct: + +SELECT ?type1 ?type2 ?language ?mbox where { + ?b dcat:dataset ?a. + ?b a ?type1. + + ?a a ?type2. + ?a dct:identifier ?identifier. + ?a dct:language ?language. + ?a dct:publisher [foaf:mbox ?mbox] . +} + diff --git a/core/sail/nativerdf/src/test/resources/benchmarkFiles/query5.qr b/core/sail/nativerdf/src/test/resources/benchmarkFiles/query5.qr new file mode 100644 index 00000000000..b1941383256 --- /dev/null +++ b/core/sail/nativerdf/src/test/resources/benchmarkFiles/query5.qr @@ -0,0 +1,18 @@ +PREFIX ex: +PREFIX owl: +PREFIX rdf: +PREFIX rdfs: +PREFIX sh: +PREFIX xsd: +PREFIX dcat: +PREFIX dc: +PREFIX skos: +PREFIX foaf: +PREFIX dct: + +SELECT DISTINCT ?pred WHERE { + ?subj ?pred ?obj. + + +} + diff --git a/core/sail/pom.xml b/core/sail/pom.xml index af4ffda10d3..dbc4a602ab7 100644 --- a/core/sail/pom.xml +++ b/core/sail/pom.xml @@ -4,7 +4,7 @@ org.eclipse.rdf4j rdf4j-core - 3.1.5-SNAPSHOT + 3.2.2-SNAPSHOT rdf4j-sail pom diff --git a/core/sail/sail-spin/pom.xml b/core/sail/sail-spin/pom.xml index bb828a16f3a..69e4d43cd4a 100644 --- a/core/sail/sail-spin/pom.xml +++ b/core/sail/sail-spin/pom.xml @@ -4,7 +4,7 @@ org.eclipse.rdf4j rdf4j-sail - 3.1.5-SNAPSHOT + 3.2.2-SNAPSHOT rdf4j-sail-spin RDF4J: SPIN SAIL diff --git a/core/sail/sail-spin/src/main/java/org/eclipse/rdf4j/sail/SailConnectionQuery.java b/core/sail/sail-spin/src/main/java/org/eclipse/rdf4j/sail/SailConnectionQuery.java index 2e638d662f7..95d4b0f360a 100644 --- a/core/sail/sail-spin/src/main/java/org/eclipse/rdf4j/sail/SailConnectionQuery.java +++ b/core/sail/sail-spin/src/main/java/org/eclipse/rdf4j/sail/SailConnectionQuery.java @@ -7,6 +7,8 @@ *******************************************************************************/ package org.eclipse.rdf4j.sail; +import org.eclipse.rdf4j.query.algebra.TupleExpr; +import org.eclipse.rdf4j.query.explanation.Explanation; import org.eclipse.rdf4j.query.impl.AbstractParserQuery; import org.eclipse.rdf4j.query.parser.ParsedQuery; @@ -25,4 +27,18 @@ protected SailConnectionQuery(ParsedQuery parsedQuery, SailConnection con) { protected SailConnection getSailConnection() { return con; } + + @Override + public Explanation explain(Explanation.Level level) { + + int timeout = DEFAULT_EXPLANATION_EXECUTION_TIMEOUT; + if (getMaxExecutionTime() > 0) { + timeout = getMaxExecutionTime(); + } + + TupleExpr tupleExpr = getParsedQuery().getTupleExpr(); + + return con.explain(level, tupleExpr, getActiveDataset(), getBindings(), getIncludeInferred(), timeout); + + } } diff --git a/core/sail/sail-spin/src/main/java/org/eclipse/rdf4j/sail/spin/SpinSailConnection.java b/core/sail/sail-spin/src/main/java/org/eclipse/rdf4j/sail/spin/SpinSailConnection.java index 280621f5397..cfe65f28ecd 100644 --- a/core/sail/sail-spin/src/main/java/org/eclipse/rdf4j/sail/spin/SpinSailConnection.java +++ b/core/sail/sail-spin/src/main/java/org/eclipse/rdf4j/sail/spin/SpinSailConnection.java @@ -29,7 +29,7 @@ import org.eclipse.rdf4j.model.Resource; import org.eclipse.rdf4j.model.Statement; import org.eclipse.rdf4j.model.ValueFactory; -import org.eclipse.rdf4j.model.impl.LinkedHashModel; +import org.eclipse.rdf4j.model.impl.DynamicModelFactory; import org.eclipse.rdf4j.model.impl.SimpleValueFactory; import org.eclipse.rdf4j.model.vocabulary.RDF; import org.eclipse.rdf4j.model.vocabulary.RDFS; @@ -356,13 +356,12 @@ private Set getSuperclasses(Resource cls) @Override protected Model createModel() { - return new LinkedHashModel(); + return new DynamicModelFactory().createEmptyModel(); } private final static List schemaSp; private final static List schemaSpin; private final static List schemaSplSpin; - private final static List schemaSpinFull; private final static List schemaSpinFullFC; static { @@ -370,7 +369,6 @@ protected Model createModel() { schemaSp = getStatementsAsList("/schema/sp.ttl", RDFFormat.TURTLE); schemaSpin = getStatementsAsList("/schema/spin.ttl", RDFFormat.TURTLE); schemaSplSpin = getStatementsAsList("/schema/spl.spin.ttl", RDFFormat.TURTLE); - schemaSpinFull = getStatementsAsList("/schema/spin-full.ttl", RDFFormat.TURTLE); schemaSpinFullFC = getStatementsAsList("/schema/spin-full-forwardchained.ttl", RDFFormat.TURTLE); } catch (IOException e) { throw new RuntimeException(e); diff --git a/core/sail/sail-spin/src/main/java/org/eclipse/rdf4j/sail/spin/config/SpinSailConfig.java b/core/sail/sail-spin/src/main/java/org/eclipse/rdf4j/sail/spin/config/SpinSailConfig.java index 7b53a072b79..d80cb25083c 100644 --- a/core/sail/sail-spin/src/main/java/org/eclipse/rdf4j/sail/spin/config/SpinSailConfig.java +++ b/core/sail/sail-spin/src/main/java/org/eclipse/rdf4j/sail/spin/config/SpinSailConfig.java @@ -61,9 +61,9 @@ public void parse(Model m, Resource implNode) throws SailConfigException { super.parse(m, implNode); try { - Models.objectLiteral(m.filter(implNode, SpinSailSchema.AXIOM_CLOSURE_NEEDED, null)) + Models.objectLiteral(m.getStatements(implNode, SpinSailSchema.AXIOM_CLOSURE_NEEDED, null)) .ifPresent(lit -> setAxiomClosureNeeded(lit.booleanValue())); - Models.objectLiteral(m.filter(implNode, SpinSailSchema.VALIDATE_CONSTRAINTS, null)) + Models.objectLiteral(m.getStatements(implNode, SpinSailSchema.VALIDATE_CONSTRAINTS, null)) .ifPresent(lit -> setValidateConstraints(lit.booleanValue())); } catch (ModelException e) { throw new SailConfigException(e.getMessage(), e); diff --git a/core/sail/sail-spin/src/main/java/org/eclipse/rdf4j/sail/spin/config/SpinSailSchema.java b/core/sail/sail-spin/src/main/java/org/eclipse/rdf4j/sail/spin/config/SpinSailSchema.java index e1fb6a62fdb..3f0a22cfee5 100644 --- a/core/sail/sail-spin/src/main/java/org/eclipse/rdf4j/sail/spin/config/SpinSailSchema.java +++ b/core/sail/sail-spin/src/main/java/org/eclipse/rdf4j/sail/spin/config/SpinSailSchema.java @@ -33,5 +33,7 @@ private static final IRI create(String localName) { } private SpinSailSchema() { - }; + } + + ; } diff --git a/core/sail/sail-spin/src/test/java/org/eclipse/rdf4j/sail/spin/SpinMemoryRepositoryConnectionTest.java b/core/sail/sail-spin/src/test/java/org/eclipse/rdf4j/sail/spin/SpinMemoryRepositoryConnectionTest.java index 5cf16501d90..edb09d8e7ce 100644 --- a/core/sail/sail-spin/src/test/java/org/eclipse/rdf4j/sail/spin/SpinMemoryRepositoryConnectionTest.java +++ b/core/sail/sail-spin/src/test/java/org/eclipse/rdf4j/sail/spin/SpinMemoryRepositoryConnectionTest.java @@ -17,7 +17,6 @@ import org.eclipse.rdf4j.repository.sail.SailRepository; import org.eclipse.rdf4j.sail.SailException; import org.eclipse.rdf4j.sail.memory.MemoryStore; -import org.eclipse.rdf4j.sail.spin.SpinSail; import org.junit.Ignore; @Ignore("#58 - disabled spin compliance tests due to being slow and unstable. Manually execute when modifying SPIN functionality") @@ -33,4 +32,4 @@ protected Repository createRepository() return new SailRepository(new SpinSail(new MemoryStore())); } -} \ No newline at end of file +} diff --git a/core/sail/sail-spin/src/test/java/org/eclipse/rdf4j/sail/spin/SpinRDFSMemoryRepositoryConnectionTest.java b/core/sail/sail-spin/src/test/java/org/eclipse/rdf4j/sail/spin/SpinRDFSMemoryRepositoryConnectionTest.java index 37318ac4602..d9247dfa22a 100644 --- a/core/sail/sail-spin/src/test/java/org/eclipse/rdf4j/sail/spin/SpinRDFSMemoryRepositoryConnectionTest.java +++ b/core/sail/sail-spin/src/test/java/org/eclipse/rdf4j/sail/spin/SpinRDFSMemoryRepositoryConnectionTest.java @@ -19,7 +19,6 @@ import org.eclipse.rdf4j.sail.inferencer.fc.DedupingInferencer; import org.eclipse.rdf4j.sail.inferencer.fc.SchemaCachingRDFSInferencer; import org.eclipse.rdf4j.sail.memory.MemoryStore; -import org.eclipse.rdf4j.sail.spin.SpinSail; import org.junit.Ignore; @Ignore("#58 - disabled spin compliance tests due to being slow and unstable. Manually execute when modifying SPIN functionality") @@ -35,4 +34,4 @@ protected Repository createRepository() return new SailRepository( new SpinSail(new SchemaCachingRDFSInferencer(new DedupingInferencer(new MemoryStore()), false))); } -} \ No newline at end of file +} diff --git a/core/sail/sail-spin/src/test/java/org/eclipse/rdf4j/sail/spin/SpinSailTest.java b/core/sail/sail-spin/src/test/java/org/eclipse/rdf4j/sail/spin/SpinSailTest.java index 404a4ea10fc..ad243b43e24 100644 --- a/core/sail/sail-spin/src/test/java/org/eclipse/rdf4j/sail/spin/SpinSailTest.java +++ b/core/sail/sail-spin/src/test/java/org/eclipse/rdf4j/sail/spin/SpinSailTest.java @@ -17,7 +17,6 @@ import java.util.concurrent.Callable; import java.util.stream.Stream; -import org.eclipse.rdf4j.common.iteration.Iterations; import org.eclipse.rdf4j.model.IRI; import org.eclipse.rdf4j.model.Statement; import org.eclipse.rdf4j.model.ValueFactory; diff --git a/core/sail/sail-spin/src/test/java/org/eclipse/rdf4j/sail/spin/benchmarks/BasicBenchmarks.java b/core/sail/sail-spin/src/test/java/org/eclipse/rdf4j/sail/spin/benchmarks/BasicBenchmarks.java index 11f714e78d8..001bb7f8e4d 100644 --- a/core/sail/sail-spin/src/test/java/org/eclipse/rdf4j/sail/spin/benchmarks/BasicBenchmarks.java +++ b/core/sail/sail-spin/src/test/java/org/eclipse/rdf4j/sail/spin/benchmarks/BasicBenchmarks.java @@ -48,14 +48,14 @@ * @author HÃ¥vard Ottestad */ @State(Scope.Benchmark) -@Warmup(iterations = 20) +@Warmup(iterations = 5) @BenchmarkMode({ Mode.AverageTime }) @Fork(value = 1, jvmArgs = { "-Xms8G", "-Xmx8G", "-Xmn4G", "-XX:+UseSerialGC" }) //@Fork(value = 1, jvmArgs = { "-Xms8G", "-Xmx8G", "-Xmn4G", "-XX:+UseSerialGC", "-XX:+UnlockCommercialFeatures", // "-XX:StartFlightRecording=delay=5s,duration=30s,filename=recording.jfr,settings=profile", // "-XX:FlightRecorderOptions=samplethreads=true,stackdepth=1024", "-XX:+UnlockDiagnosticVMOptions", // "-XX:+DebugNonSafepoints" }) -@Measurement(iterations = 10) +@Measurement(iterations = 5) @OutputTimeUnit(TimeUnit.MILLISECONDS) public class BasicBenchmarks { diff --git a/core/sail/shacl/pom.xml b/core/sail/shacl/pom.xml index fc82a66bd23..b75174ae90c 100644 --- a/core/sail/shacl/pom.xml +++ b/core/sail/shacl/pom.xml @@ -4,7 +4,7 @@ org.eclipse.rdf4j rdf4j-sail - 3.1.5-SNAPSHOT + 3.2.2-SNAPSHOT rdf4j-shacl RDF4J: SHACL diff --git a/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/AST/AndPropertyShape.java b/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/AST/AndPropertyShape.java index 779313e8c02..101a9e20539 100644 --- a/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/AST/AndPropertyShape.java +++ b/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/AST/AndPropertyShape.java @@ -18,6 +18,7 @@ import org.eclipse.rdf4j.sail.SailConnection; import org.eclipse.rdf4j.sail.shacl.ConnectionsGroup; import org.eclipse.rdf4j.sail.shacl.SourceConstraintComponent; +import org.eclipse.rdf4j.sail.shacl.Stats; import org.eclipse.rdf4j.sail.shacl.planNodes.AggregateIteratorTypeOverride; import org.eclipse.rdf4j.sail.shacl.planNodes.EnrichWithShape; import org.eclipse.rdf4j.sail.shacl.planNodes.IteratorData; @@ -120,14 +121,14 @@ static private PlanNode unionAll(List planNodes) { } @Override - public boolean requiresEvaluation(SailConnection addedStatements, SailConnection removedStatements) { + public boolean requiresEvaluation(SailConnection addedStatements, SailConnection removedStatements, Stats stats) { if (deactivated) { return false; } - return super.requiresEvaluation(addedStatements, removedStatements) || and.stream() + return super.requiresEvaluation(addedStatements, removedStatements, stats) || and.stream() .flatMap(Collection::stream) - .map(p -> p.requiresEvaluation(addedStatements, removedStatements)) + .map(p -> p.requiresEvaluation(addedStatements, removedStatements, stats)) .reduce((a, b) -> a || b) .orElse(false); } diff --git a/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/AST/ClassPropertyShape.java b/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/AST/ClassPropertyShape.java index cd0a1d9a08d..f1b00fd5841 100644 --- a/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/AST/ClassPropertyShape.java +++ b/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/AST/ClassPropertyShape.java @@ -19,6 +19,7 @@ import org.eclipse.rdf4j.sail.SailConnection; import org.eclipse.rdf4j.sail.shacl.ConnectionsGroup; import org.eclipse.rdf4j.sail.shacl.SourceConstraintComponent; +import org.eclipse.rdf4j.sail.shacl.Stats; import org.eclipse.rdf4j.sail.shacl.planNodes.BufferedPlanNode; import org.eclipse.rdf4j.sail.shacl.planNodes.BulkedExternalInnerJoin; import org.eclipse.rdf4j.sail.shacl.planNodes.BulkedExternalLeftOuterJoin; @@ -365,13 +366,17 @@ private PlanNode getNegatedPlan(ConnectionsGroup connectionsGroup, PlanNodeProvi } @Override - public boolean requiresEvaluation(SailConnection addedStatements, SailConnection removedStatements) { + public boolean requiresEvaluation(SailConnection addedStatements, SailConnection removedStatements, Stats stats) { if (deactivated) { return false; } + if (stats.isEmpty()) { + return super.requiresEvaluation(addedStatements, removedStatements, stats); + } + return removedStatements.hasStatement(null, RDF.TYPE, classResource, true) - || super.requiresEvaluation(addedStatements, removedStatements); + || super.requiresEvaluation(addedStatements, removedStatements, stats); } @Override diff --git a/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/AST/NodeKindPropertyShape.java b/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/AST/NodeKindPropertyShape.java index 3291e06c4f6..db9a08d3c4d 100644 --- a/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/AST/NodeKindPropertyShape.java +++ b/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/AST/NodeKindPropertyShape.java @@ -46,7 +46,8 @@ public enum NodeKind { Literal(SHACL.LITERAL), BlankNodeOrIRI(SHACL.BLANK_NODE_OR_IRI), BlankNodeOrLiteral(SHACL.BLANK_NODE_OR_LITERAL), - IRIOrLiteral(SHACL.IRI_OR_LITERAL),; + IRIOrLiteral(SHACL.IRI_OR_LITERAL), + ; IRI iri; diff --git a/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/AST/NodeShape.java b/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/AST/NodeShape.java index 889b93cb24e..8616c8aef18 100644 --- a/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/AST/NodeShape.java +++ b/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/AST/NodeShape.java @@ -15,7 +15,6 @@ import java.util.stream.Collectors; import java.util.stream.Stream; -import org.eclipse.rdf4j.common.iteration.Iterations; import org.eclipse.rdf4j.model.Resource; import org.eclipse.rdf4j.model.Statement; import org.eclipse.rdf4j.model.vocabulary.RDF; @@ -25,6 +24,7 @@ import org.eclipse.rdf4j.sail.shacl.ConnectionsGroup; import org.eclipse.rdf4j.sail.shacl.RdfsSubClassOfReasoner; import org.eclipse.rdf4j.sail.shacl.ShaclSail; +import org.eclipse.rdf4j.sail.shacl.Stats; import org.eclipse.rdf4j.sail.shacl.planNodes.BufferedSplitter; import org.eclipse.rdf4j.sail.shacl.planNodes.PlanNode; import org.eclipse.rdf4j.sail.shacl.planNodes.PlanNodeProvider; @@ -131,15 +131,16 @@ private Stream convertToPlan(List propertyShapes, SailConnection addedStatements, SailConnection removedStatements) { + Stats stats = connectionsGroup.getStats(); return propertyShapes .stream() - .filter(propertyShape -> propertyShape.requiresEvaluation(addedStatements, removedStatements)) + .filter(propertyShape -> propertyShape.requiresEvaluation(addedStatements, removedStatements, stats)) .map(propertyShape -> propertyShape.getPlan(connectionsGroup, printPlans, overrideTargetNodeBufferedSplitter, false, false)); } @Override - public boolean requiresEvaluation(SailConnection addedStatements, SailConnection removedStatements) { + public boolean requiresEvaluation(SailConnection addedStatements, SailConnection removedStatements, Stats stats) { return true; } diff --git a/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/AST/NotPropertyShape.java b/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/AST/NotPropertyShape.java index d4c0897ee48..c411ba5bec0 100644 --- a/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/AST/NotPropertyShape.java +++ b/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/AST/NotPropertyShape.java @@ -17,6 +17,7 @@ import org.eclipse.rdf4j.sail.SailConnection; import org.eclipse.rdf4j.sail.shacl.ConnectionsGroup; import org.eclipse.rdf4j.sail.shacl.SourceConstraintComponent; +import org.eclipse.rdf4j.sail.shacl.Stats; import org.eclipse.rdf4j.sail.shacl.planNodes.BufferedPlanNode; import org.eclipse.rdf4j.sail.shacl.planNodes.EnrichWithShape; import org.eclipse.rdf4j.sail.shacl.planNodes.InnerJoin; @@ -112,7 +113,7 @@ static private PlanNode unionAll(List planNodes) { } @Override - public boolean requiresEvaluation(SailConnection addedStatements, SailConnection removedStatements) { + public boolean requiresEvaluation(SailConnection addedStatements, SailConnection removedStatements, Stats stats) { if (deactivated) { return false; } diff --git a/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/AST/OrPropertyShape.java b/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/AST/OrPropertyShape.java index 33038e0c273..1170d01e260 100644 --- a/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/AST/OrPropertyShape.java +++ b/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/AST/OrPropertyShape.java @@ -18,6 +18,7 @@ import org.eclipse.rdf4j.sail.SailConnection; import org.eclipse.rdf4j.sail.shacl.ConnectionsGroup; import org.eclipse.rdf4j.sail.shacl.SourceConstraintComponent; +import org.eclipse.rdf4j.sail.shacl.Stats; import org.eclipse.rdf4j.sail.shacl.planNodes.AggregateIteratorTypeOverride; import org.eclipse.rdf4j.sail.shacl.planNodes.BufferedPlanNode; import org.eclipse.rdf4j.sail.shacl.planNodes.BufferedSplitter; @@ -213,14 +214,14 @@ private PlanNode unionAll(List planNodes) { } @Override - public boolean requiresEvaluation(SailConnection addedStatements, SailConnection removedStatements) { + public boolean requiresEvaluation(SailConnection addedStatements, SailConnection removedStatements, Stats stats) { if (deactivated) { return false; } - return super.requiresEvaluation(addedStatements, removedStatements) || or.stream() + return super.requiresEvaluation(addedStatements, removedStatements, stats) || or.stream() .flatMap(Collection::stream) - .map(p -> p.requiresEvaluation(addedStatements, removedStatements)) + .map(p -> p.requiresEvaluation(addedStatements, removedStatements, stats)) .reduce((a, b) -> a || b) .orElse(false); } diff --git a/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/AST/PathPropertyShape.java b/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/AST/PathPropertyShape.java index d2597c3c49d..ce0cbb69219 100644 --- a/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/AST/PathPropertyShape.java +++ b/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/AST/PathPropertyShape.java @@ -16,7 +16,6 @@ import java.util.Set; import java.util.stream.Stream; -import org.eclipse.rdf4j.common.iteration.Iterations; import org.eclipse.rdf4j.model.IRI; import org.eclipse.rdf4j.model.Resource; import org.eclipse.rdf4j.model.Statement; @@ -26,6 +25,7 @@ import org.eclipse.rdf4j.sail.SailConnection; import org.eclipse.rdf4j.sail.shacl.ConnectionsGroup; import org.eclipse.rdf4j.sail.shacl.ShaclSailConnection; +import org.eclipse.rdf4j.sail.shacl.Stats; import org.eclipse.rdf4j.sail.shacl.planNodes.PlanNode; import org.eclipse.rdf4j.sail.shacl.planNodes.PlanNodeProvider; import org.eclipse.rdf4j.sail.shacl.planNodes.Select; @@ -147,17 +147,17 @@ public boolean hasOwnPath() { } @Override - public boolean requiresEvaluation(SailConnection addedStatements, SailConnection removedStatements) { + public boolean requiresEvaluation(SailConnection addedStatements, SailConnection removedStatements, Stats stats) { if (deactivated) { return false; } if (path == null) { - return super.requiresEvaluation(addedStatements, removedStatements); + return super.requiresEvaluation(addedStatements, removedStatements, stats); } - return super.requiresEvaluation(addedStatements, removedStatements) - || path.requiresEvaluation(addedStatements, removedStatements); + return super.requiresEvaluation(addedStatements, removedStatements, stats) + || path.requiresEvaluation(addedStatements, removedStatements, stats); } public Path getPath() { diff --git a/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/AST/PropertyShape.java b/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/AST/PropertyShape.java index 899dc03cf3a..2aa9795d06c 100644 --- a/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/AST/PropertyShape.java +++ b/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/AST/PropertyShape.java @@ -16,7 +16,6 @@ import java.util.stream.Collectors; import java.util.stream.Stream; -import org.eclipse.rdf4j.common.iteration.Iterations; import org.eclipse.rdf4j.model.Resource; import org.eclipse.rdf4j.model.Statement; import org.eclipse.rdf4j.model.Value; @@ -34,6 +33,7 @@ import org.eclipse.rdf4j.sail.memory.MemoryStoreConnection; import org.eclipse.rdf4j.sail.shacl.ConnectionsGroup; import org.eclipse.rdf4j.sail.shacl.SourceConstraintComponent; +import org.eclipse.rdf4j.sail.shacl.Stats; import org.eclipse.rdf4j.sail.shacl.planNodes.PlanNode; import org.eclipse.rdf4j.sail.shacl.planNodes.PlanNodeProvider; @@ -82,12 +82,12 @@ public List getPaths() { } @Override - public boolean requiresEvaluation(SailConnection addedStatements, SailConnection removedStatements) { + public boolean requiresEvaluation(SailConnection addedStatements, SailConnection removedStatements, Stats stats) { if (deactivated) { return false; } - return nodeShape.requiresEvaluation(addedStatements, removedStatements); + return nodeShape.requiresEvaluation(addedStatements, removedStatements, stats); } public String getPlanAsGraphvizDot(PlanNode planNode, ConnectionsGroup connectionsGroup) { @@ -177,7 +177,7 @@ static List getPropertyShapesInner(SailRepositoryConnection c ShaclProperties shaclProperties = new ShaclProperties(propertyShapeId, connection); - if (shaclProperties.minCount != null) { + if (shaclProperties.minCount != null && shaclProperties.minCount > 0) { propertyShapes.add(new MinCountPropertyShape(propertyShapeId, connection, nodeShape, shaclProperties.deactivated, parent, shaclProperties.path, shaclProperties.minCount)); } diff --git a/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/AST/RequiresEvalutation.java b/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/AST/RequiresEvalutation.java index eb52c31d597..d9757efe761 100644 --- a/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/AST/RequiresEvalutation.java +++ b/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/AST/RequiresEvalutation.java @@ -9,12 +9,13 @@ package org.eclipse.rdf4j.sail.shacl.AST; import org.eclipse.rdf4j.sail.SailConnection; +import org.eclipse.rdf4j.sail.shacl.Stats; /** * @author HÃ¥vard Ottestad */ public interface RequiresEvalutation { - boolean requiresEvaluation(SailConnection addedStatements, SailConnection removedStatements); + boolean requiresEvaluation(SailConnection addedStatements, SailConnection removedStatements, Stats stats); } diff --git a/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/AST/ShaclProperties.java b/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/AST/ShaclProperties.java index 332fde4cd4a..13e77286f91 100644 --- a/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/AST/ShaclProperties.java +++ b/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/AST/ShaclProperties.java @@ -7,7 +7,6 @@ import java.util.TreeSet; import java.util.stream.Stream; -import org.eclipse.rdf4j.common.iteration.Iterations; import org.eclipse.rdf4j.model.IRI; import org.eclipse.rdf4j.model.Literal; import org.eclipse.rdf4j.model.Resource; diff --git a/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/AST/SimplePath.java b/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/AST/SimplePath.java index 77686783171..d0c7a0bd0e7 100644 --- a/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/AST/SimplePath.java +++ b/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/AST/SimplePath.java @@ -13,6 +13,7 @@ import org.eclipse.rdf4j.model.IRI; import org.eclipse.rdf4j.sail.SailConnection; import org.eclipse.rdf4j.sail.shacl.RdfsSubClassOfReasoner; +import org.eclipse.rdf4j.sail.shacl.Stats; /** * The AST (Abstract Syntax Tree) node that represents a simple path for exactly one predicate. Currently there is no @@ -31,7 +32,11 @@ public class SimplePath extends Path { } @Override - public boolean requiresEvaluation(SailConnection addedStatements, SailConnection removedStatements) { + public boolean requiresEvaluation(SailConnection addedStatements, SailConnection removedStatements, Stats stats) { + + if (stats.isEmpty()) { + return false; + } return addedStatements.hasStatement(null, path, null, false) || removedStatements.hasStatement(null, path, null, false); diff --git a/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/AST/TargetClass.java b/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/AST/TargetClass.java index fddc446f263..55997bc1a90 100644 --- a/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/AST/TargetClass.java +++ b/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/AST/TargetClass.java @@ -20,6 +20,7 @@ import org.eclipse.rdf4j.sail.SailConnection; import org.eclipse.rdf4j.sail.shacl.ConnectionsGroup; import org.eclipse.rdf4j.sail.shacl.RdfsSubClassOfReasoner; +import org.eclipse.rdf4j.sail.shacl.Stats; import org.eclipse.rdf4j.sail.shacl.planNodes.ExternalTypeFilterNode; import org.eclipse.rdf4j.sail.shacl.planNodes.PlanNode; import org.eclipse.rdf4j.sail.shacl.planNodes.PlanNodeProvider; @@ -92,7 +93,7 @@ public PlanNode getPlanRemovedStatements(ConnectionsGroup connectionsGroup, } @Override - public boolean requiresEvaluation(SailConnection addedStatements, SailConnection removedStatements) { + public boolean requiresEvaluation(SailConnection addedStatements, SailConnection removedStatements, Stats stats) { return targetClass.stream() .map(target -> addedStatements.hasStatement(null, RDF.TYPE, target, false)) .reduce((a, b) -> a || b) diff --git a/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/AST/TargetNode.java b/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/AST/TargetNode.java index e40e13fc22a..0927fe18a43 100644 --- a/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/AST/TargetNode.java +++ b/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/AST/TargetNode.java @@ -20,6 +20,7 @@ import org.eclipse.rdf4j.sail.SailConnection; import org.eclipse.rdf4j.sail.shacl.ConnectionsGroup; import org.eclipse.rdf4j.sail.shacl.RdfsSubClassOfReasoner; +import org.eclipse.rdf4j.sail.shacl.Stats; import org.eclipse.rdf4j.sail.shacl.planNodes.PlanNode; import org.eclipse.rdf4j.sail.shacl.planNodes.PlanNodeProvider; import org.eclipse.rdf4j.sail.shacl.planNodes.Select; @@ -71,7 +72,7 @@ public PlanNode getPlanRemovedStatements(ConnectionsGroup connectionsGroup, } @Override - public boolean requiresEvaluation(SailConnection addedStatements, SailConnection removedStatements) { + public boolean requiresEvaluation(SailConnection addedStatements, SailConnection removedStatements, Stats stats) { return true; } diff --git a/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/AST/TargetObjectsOf.java b/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/AST/TargetObjectsOf.java index c9f04236cad..7e06abbad1c 100644 --- a/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/AST/TargetObjectsOf.java +++ b/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/AST/TargetObjectsOf.java @@ -18,6 +18,7 @@ import org.eclipse.rdf4j.sail.SailConnection; import org.eclipse.rdf4j.sail.shacl.ConnectionsGroup; import org.eclipse.rdf4j.sail.shacl.RdfsSubClassOfReasoner; +import org.eclipse.rdf4j.sail.shacl.Stats; import org.eclipse.rdf4j.sail.shacl.planNodes.ExternalFilterByPredicate; import org.eclipse.rdf4j.sail.shacl.planNodes.PlanNode; import org.eclipse.rdf4j.sail.shacl.planNodes.PlanNodeProvider; @@ -95,7 +96,10 @@ public PlanNode getPlanRemovedStatements(ConnectionsGroup connectionsGroup, } @Override - public boolean requiresEvaluation(SailConnection addedStatements, SailConnection removedStatements) { + public boolean requiresEvaluation(SailConnection addedStatements, SailConnection removedStatements, Stats stats) { + if (stats.isEmpty()) { + return false; + } return targetObjectsOf.stream() .map(target -> addedStatements.hasStatement(null, target, null, false)) .reduce((a, b) -> a || b) diff --git a/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/AST/TargetSubjectsOf.java b/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/AST/TargetSubjectsOf.java index b203b079c75..2d1974a9374 100644 --- a/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/AST/TargetSubjectsOf.java +++ b/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/AST/TargetSubjectsOf.java @@ -18,6 +18,7 @@ import org.eclipse.rdf4j.sail.SailConnection; import org.eclipse.rdf4j.sail.shacl.ConnectionsGroup; import org.eclipse.rdf4j.sail.shacl.RdfsSubClassOfReasoner; +import org.eclipse.rdf4j.sail.shacl.Stats; import org.eclipse.rdf4j.sail.shacl.planNodes.ExternalFilterByPredicate; import org.eclipse.rdf4j.sail.shacl.planNodes.PlanNode; import org.eclipse.rdf4j.sail.shacl.planNodes.PlanNodeProvider; @@ -91,7 +92,10 @@ public PlanNode getPlanRemovedStatements(ConnectionsGroup connection, } @Override - public boolean requiresEvaluation(SailConnection addedStatements, SailConnection removedStatements) { + public boolean requiresEvaluation(SailConnection addedStatements, SailConnection removedStatements, Stats stats) { + if (stats.isEmpty()) { + return false; + } return targetSubjectsOf.stream() .map(target -> addedStatements.hasStatement(null, target, null, false)) .reduce((a, b) -> a || b) diff --git a/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/CloseablePeakableIteration.java b/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/CloseablePeakableIteration.java index 6d054c3ecb8..91af5a7d533 100644 --- a/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/CloseablePeakableIteration.java +++ b/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/CloseablePeakableIteration.java @@ -12,7 +12,7 @@ import org.eclipse.rdf4j.common.iteration.CloseableIteration; /** - * + * * * @deprecated since 3.0. This feature is for internal use only: its existence, signature or behavior may change without * warning from one release to the next. diff --git a/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/NoShapesLoadedException.java b/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/NoShapesLoadedException.java deleted file mode 100644 index 75fc40c24ae..00000000000 --- a/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/NoShapesLoadedException.java +++ /dev/null @@ -1,27 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2018 Eclipse RDF4J contributors. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Distribution License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/org/documents/edl-v10.php. - *******************************************************************************/ - -package org.eclipse.rdf4j.sail.shacl; - -import org.eclipse.rdf4j.model.vocabulary.RDF4J; - -/** - * @deprecated since 3.0. This feature is for internal use only: its existence, signature or behavior may change without - * warning from one release to the next. - */ -@Deprecated -// FIXME should extend SailException -public class NoShapesLoadedException extends RuntimeException { - - private static final long serialVersionUID = 1L; - - public NoShapesLoadedException() { - super("Load shapes by adding them to named graph <" + RDF4J.SHACL_SHAPE_GRAPH - + "> in the first transaction after initialization!"); - } -} diff --git a/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/RdfsSubClassOfReasoner.java b/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/RdfsSubClassOfReasoner.java index 41f122b39ec..1427b6a1b9b 100644 --- a/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/RdfsSubClassOfReasoner.java +++ b/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/RdfsSubClassOfReasoner.java @@ -19,7 +19,6 @@ import java.util.stream.Stream; import org.eclipse.rdf4j.common.annotation.InternalUseOnly; -import org.eclipse.rdf4j.common.iteration.Iterations; import org.eclipse.rdf4j.model.Resource; import org.eclipse.rdf4j.model.Statement; import org.eclipse.rdf4j.model.impl.SimpleValueFactory; diff --git a/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/ShaclSail.java b/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/ShaclSail.java index 94bfdb0d6c0..8e4f9a7b4d8 100644 --- a/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/ShaclSail.java +++ b/core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/ShaclSail.java @@ -50,6 +50,7 @@ import org.slf4j.LoggerFactory; //@formatter:off + /** * A {@link Sail} implementation that adds support for the Shapes Constraint Language (SHACL). *

    @@ -131,7 +132,7 @@ * connection.add(invalidSampleData, "", RDFFormat.TURTLE); * try { * connection.commit(); - * } catch (RepositoryException exception) { + * } catch (RepositoryException exception) { * Throwable cause = exception.getCause(); * if (cause instanceof ShaclSailValidationException) { * ValidationReport validationReport = ((ShaclSailValidationException) cause).getValidationReport(); @@ -139,11 +140,11 @@ * // use validationReport or validationReportModel to understand validation violations * * Rio.write(validationReportModel, System.out, RDFFormat.TURTLE); - * } + * } * throw exception; - * } - * } - * } + * } + * } + * } * } *