rdf4j icon indicating copy to clipboard operation
rdf4j copied to clipboard

Construct query creating RDFstar statements in memory store does not work anymore with RDF4J 4.1

Open jetztgradnet opened this issue 1 year ago • 0 comments

Current Behavior

Running a CONSTRUCT query in a memory store fails to create RDFstar statements with RDF4J 4.1 with the following error:

java.lang.IllegalArgumentException: Node is not a child node: Var (name=s)

The example query:

PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX person: <http://example.com/person/>
PREFIX org: <http://example.com/org/>
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
CONSTRUCT {
  ?s ?p ?o.
  << ?s ?p ?o >> <http://example.com/certainty> ?cert.
  << ?s ?p ?o >> <http://example.com/certaintyDeviation> ?certDiv.
  << person:alice foaf:knows person:bob >> <http://example.com/observedBy> person:mike.
}
WHERE {
  {
    SELECT ?s ?p ?o ?cert ?certDiv WHERE {
      VALUES (?s ?p ?o ?cert ?certDiv) {
        (person:alice foaf:knows person:bob "1.0"^^xsd:decimal 0 )
        (person:alice foaf:knows person:carol "0.3"^^xsd:decimal "0.1"^^xsd:decimal)
        (person:carol foaf:knows person:mike "0.7"^^xsd:decimal "0.2"^^xsd:decimal)
        (person:mike foaf:knows person:carol "0.1"^^xsd:decimal UNDEF)
        (person:bob foaf:knows person:carol "0.8"^^xsd:decimal UNDEF)
        (person:alice foaf:knows person:mike "0.6"^^xsd:decimal "0.1"^^xsd:decimal)
        (person:alice foaf:member org:W3C UNDEF UNDEF)
        (person:mike foaf:member org:W3C UNDEF UNDEF)
        (person:alice rdf:type foaf:Person UNDEF UNDEF)
        (person:carol rdf:type foaf:Person UNDEF UNDEF)
        (person:mike rdf:type foaf:Person UNDEF UNDEF)
        (person:bob rdf:type foaf:Person UNDEF UNDEF)
        (org:W3C rdf:type foaf:Organization UNDEF UNDEF)
        (person:alice rdfs:label "Alice" UNDEF UNDEF)
        (person:alice foaf:birthday "1990-01-01" UNDEF UNDEF)
        (person:bob rdfs:label "Bob" UNDEF UNDEF)
        (person:carol rdfs:label "Carol" UNDEF UNDEF)
        (person:mike rdfs:label "Mike" UNDEF UNDEF)
      }
    }
  }
}

This worked previously with RDF4J 4.0. Removing the 3 lines creating RDFstar statements in the CONSTRUCT clause also makes it work with 4.1, but it doesn't accept the RDFstar patterns, not even the "static" one (last one in the example above) without any variables. This query works fine with current versions of GraphDB (9.x and 10) and Stardog.

Parsing the query fails with this stacktrace:

java.lang.IllegalArgumentException: Node is not a child node: Var (name=s)

	at org.eclipse.rdf4j.query.algebra.AbstractQueryModelNode.replaceChildNode(AbstractQueryModelNode.java:93)
	at org.eclipse.rdf4j.query.algebra.Var.replaceWith(Var.java:126)
	at org.eclipse.rdf4j.query.algebra.evaluation.impl.ArrayBindingBasedQueryEvaluationContext$1.meet(ArrayBindingBasedQueryEvaluationContext.java:267)
	at org.eclipse.rdf4j.query.algebra.Var.visit(Var.java:97)
	at org.eclipse.rdf4j.query.algebra.ValueExprTripleRef.visitChildren(ValueExprTripleRef.java:50)
	at org.eclipse.rdf4j.query.algebra.helpers.AbstractSimpleQueryModelVisitor.meetUnsupported(AbstractSimpleQueryModelVisitor.java:539)
	at org.eclipse.rdf4j.query.algebra.helpers.AbstractSimpleQueryModelVisitor.meetOther(AbstractSimpleQueryModelVisitor.java:534)
	at org.eclipse.rdf4j.query.algebra.ValueExprTripleRef.visit(ValueExprTripleRef.java:85)
	at org.eclipse.rdf4j.query.algebra.ExtensionElem.visitChildren(ExtensionElem.java:64)
	at org.eclipse.rdf4j.query.algebra.helpers.AbstractSimpleQueryModelVisitor.meet(AbstractSimpleQueryModelVisitor.java:237)
	at org.eclipse.rdf4j.query.algebra.evaluation.impl.ArrayBindingBasedQueryEvaluationContext$1.meet(ArrayBindingBasedQueryEvaluationContext.java:308)
	at org.eclipse.rdf4j.query.algebra.ExtensionElem.visit(ExtensionElem.java:59)
	at org.eclipse.rdf4j.query.algebra.Extension.visitChildren(Extension.java:101)
	at org.eclipse.rdf4j.query.algebra.evaluation.impl.ArrayBindingBasedQueryEvaluationContext$1.meetUnaryTupleOperator(ArrayBindingBasedQueryEvaluationContext.java:284)
	at org.eclipse.rdf4j.query.algebra.helpers.AbstractSimpleQueryModelVisitor.meet(AbstractSimpleQueryModelVisitor.java:232)
	at org.eclipse.rdf4j.query.algebra.Extension.visit(Extension.java:94)
	at org.eclipse.rdf4j.query.algebra.UnaryTupleOperator.visitChildren(UnaryTupleOperator.java:82)
	at org.eclipse.rdf4j.query.algebra.MultiProjection.visitChildren(MultiProjection.java:113)
	at org.eclipse.rdf4j.query.algebra.evaluation.impl.ArrayBindingBasedQueryEvaluationContext$1.meetUnaryTupleOperator(ArrayBindingBasedQueryEvaluationContext.java:284)
	at org.eclipse.rdf4j.query.algebra.helpers.AbstractSimpleQueryModelVisitor.meet(AbstractSimpleQueryModelVisitor.java:383)
	at org.eclipse.rdf4j.query.algebra.evaluation.impl.ArrayBindingBasedQueryEvaluationContext$1.meet(ArrayBindingBasedQueryEvaluationContext.java:293)
	at org.eclipse.rdf4j.query.algebra.MultiProjection.visit(MultiProjection.java:104)
	at org.eclipse.rdf4j.query.algebra.UnaryTupleOperator.visitChildren(UnaryTupleOperator.java:82)
	at org.eclipse.rdf4j.query.algebra.evaluation.impl.ArrayBindingBasedQueryEvaluationContext$1.meetUnaryTupleOperator(ArrayBindingBasedQueryEvaluationContext.java:284)
	at org.eclipse.rdf4j.query.algebra.helpers.AbstractSimpleQueryModelVisitor.meet(AbstractSimpleQueryModelVisitor.java:434)
	at org.eclipse.rdf4j.query.algebra.Reduced.visit(Reduced.java:32)
	at org.eclipse.rdf4j.query.algebra.UnaryTupleOperator.visitChildren(UnaryTupleOperator.java:82)
	at org.eclipse.rdf4j.query.algebra.helpers.AbstractSimpleQueryModelVisitor.meet(AbstractSimpleQueryModelVisitor.java:429)
	at org.eclipse.rdf4j.query.algebra.QueryRoot.visit(QueryRoot.java:48)
	at org.eclipse.rdf4j.query.algebra.evaluation.impl.ArrayBindingBasedQueryEvaluationContext.findAllVariablesUsedInQuery(ArrayBindingBasedQueryEvaluationContext.java:321)
	at org.eclipse.rdf4j.query.algebra.evaluation.impl.StrictEvaluationStrategy.precompile(StrictEvaluationStrategy.java:322)
	at org.eclipse.rdf4j.sail.base.SailSourceConnection.evaluateInternal(SailSourceConnection.java:250)
	at org.eclipse.rdf4j.sail.helpers.AbstractSailConnection.evaluate(AbstractSailConnection.java:314)
	at org.eclipse.rdf4j.repository.sail.SailGraphQuery.evaluate(SailGraphQuery.java:61)
	at com.metaphacts.repository.MemoryStoreRDFStarTest.testMemoryStore_RDFstar(MemoryStoreRDFStarTest.java:61)
...

Expected Behavior

Being able to create RDFstar statements in a CONSTRUCT query.

Steps To Reproduce

  1. Set up a project with RDF4J 4.1
  2. run this unit test:
package com.metaphacts.repository;

import static org.junit.Assert.fail;

import org.eclipse.rdf4j.model.Statement;
import org.eclipse.rdf4j.query.GraphQuery;
import org.eclipse.rdf4j.query.GraphQueryResult;
import org.eclipse.rdf4j.repository.Repository;
import org.eclipse.rdf4j.repository.RepositoryConnection;
import org.eclipse.rdf4j.repository.sail.SailRepository;
import org.eclipse.rdf4j.sail.memory.MemoryStore;
import org.junit.Test;

public class MemoryStoreRDFStarTest {
    @Test
    public void testMemoryStore_RDFstar() throws Exception {
        // @formatter:off
        final String queryString = "PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>\n"
                + "PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>\n"
                + "PREFIX person: <http://example.com/person/>\n"
                + "PREFIX org: <http://example.com/org/>\n"
                + "PREFIX foaf: <http://xmlns.com/foaf/0.1/>\n"
                + "PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>\n"
                + "CONSTRUCT {\n"
                + "  ?s ?p ?o.\n"
                + "  << ?s ?p ?o >> <http://example.com/certainty> ?cert.\n"
                + "  << ?s ?p ?o >> <http://example.com/certaintyDeviation> ?certDiv.\n"
                + "  << person:alice foaf:knows person:bob >> <http://example.com/observedBy> person:mike.\n"
                + "}\n"
                + "WHERE {\n"
                + "  {\n"
                + "    SELECT ?s ?p ?o ?cert ?certDiv WHERE {\n"
                + "      VALUES (?s ?p ?o ?cert ?certDiv) {\n"
                + "        (person:alice foaf:knows person:bob \"1.0\"^^xsd:decimal 0 )\n"
                + "        (person:alice foaf:knows person:carol \"0.3\"^^xsd:decimal \"0.1\"^^xsd:decimal)\n"
                + "        (person:carol foaf:knows person:mike \"0.7\"^^xsd:decimal \"0.2\"^^xsd:decimal)\n"
                + "        (person:mike foaf:knows person:carol \"0.1\"^^xsd:decimal UNDEF)\n"
                + "        (person:bob foaf:knows person:carol \"0.8\"^^xsd:decimal UNDEF)\n"
                + "        (person:alice foaf:knows person:mike \"0.6\"^^xsd:decimal \"0.1\"^^xsd:decimal)\n"
                + "        (person:alice foaf:member org:W3C UNDEF UNDEF)\n"
                + "        (person:mike foaf:member org:W3C UNDEF UNDEF)\n"
                + "        (person:alice rdf:type foaf:Person UNDEF UNDEF)\n"
                + "        (person:carol rdf:type foaf:Person UNDEF UNDEF)\n"
                + "        (person:mike rdf:type foaf:Person UNDEF UNDEF)\n"
                + "        (person:bob rdf:type foaf:Person UNDEF UNDEF)\n"
                + "        (org:W3C rdf:type foaf:Organization UNDEF UNDEF)\n"
                + "        (person:alice rdfs:label \"Alice\" UNDEF UNDEF)\n"
                + "        (person:alice foaf:birthday \"1990-01-01\" UNDEF UNDEF)\n"
                + "        (person:bob rdfs:label \"Bob\" UNDEF UNDEF)\n"
                + "        (person:carol rdfs:label \"Carol\" UNDEF UNDEF)\n"
                + "        (person:mike rdfs:label \"Mike\" UNDEF UNDEF)\n"
                + "      }\n"
                + "    }\n"
                + "  }\n"
                + "}";
        // @formatter:on

        Repository repo = new SailRepository(new MemoryStore());
        try (RepositoryConnection con = repo.getConnection()) {
            GraphQuery graphQuery = con.prepareGraphQuery(queryString);
            try (GraphQueryResult result = graphQuery.evaluate()) {
                while (result.hasNext()) { // iterate over the result
                    Statement stmt = result.next();
                    System.out.println(stmt);
                }
            }
        }
        catch (IllegalArgumentException e) {
            e.printStackTrace();
            fail("Should not get an IllegalArgumentException!");
        }
    }
}

Version

4.1.0

Are you interested in contributing a solution yourself?

No response

Anything else?

No response

jetztgradnet avatar Aug 09 '22 12:08 jetztgradnet