rdf4j
rdf4j copied to clipboard
TriG* parser fails for annotation syntax (java.lang.NullPointerException)
Current Behavior
Consider following usecase:
public static void main(final String[] args) throws Exception {
String source = """
PREFIX : <http://example/>
:s :p :o {| :rp "val1" |} .
""";
Model model1 = Rio.parse(new StringReader(source), RDFFormat.TURTLESTAR);
Model model2 = Rio.parse(new StringReader(source), RDFFormat.TRIGSTAR);
}
The Turtle* parser passes but TriG* parser fails with following stack trace:
Exception in thread "main" java.lang.NullPointerException: statement may not be null
at java.base/java.util.Objects.requireNonNull(Objects.java:233)
at org.eclipse.rdf4j.model.util.Values.triple(Values.java:692)
at org.eclipse.rdf4j.rio.turtle.TurtleParser.parseAnnotation(TurtleParser.java:1403)
at org.eclipse.rdf4j.rio.turtle.TurtleParser.parseObjectList(TurtleParser.java:376)
at org.eclipse.rdf4j.rio.turtle.TurtleParser.parsePredicateObjectList(TurtleParser.java:346)
at org.eclipse.rdf4j.rio.trig.TriGParser.parseGraph(TriGParser.java:189)
at org.eclipse.rdf4j.rio.trig.TriGParser.parseStatement(TriGParser.java:112)
at org.eclipse.rdf4j.rio.turtle.TurtleParser.parse(TurtleParser.java:162)
at org.eclipse.rdf4j.rio.Rio.parse(Rio.java:409)
at org.eclipse.rdf4j.rio.Rio.parse(Rio.java:374)
at org.eclipse.rdf4j.rio.Rio.parse(Rio.java:322)
at datagraph.rdf4j.RDFStarTest.main(RDFStarTest.java:22)
Expected Behavior
TriG* parser should parse the annotion syntax correctly.
Steps To Reproduce
- latest RDF4J (4.0.0 M2) on OpenJDK 17
- run example code (see above)
- see error
Version
4.0.0-M2
Are you interested in contributing a solution yourself?
Perhaps?
Anything else?
No response
Seems like a problem in your statement only, can you please check once again if this is the string that you actually used and got the error?
Sorry, I have only this use case. Given Turtle is a subset of TriG and Turtle parser passes but TriG parser fails then this must be a bug.
Also see https://w3c.github.io/rdf-star/cg-spec/editors_draft.html#trig-star-grammar production rule for annotations (30t): annotation ::= '{|' predicateObjectList '|}'.
https://w3c.github.io/rdf-star/tests/trig/syntax/manifest.html#trig-star-ann-1
I am not able to reproduce the same error. I used your source string only.
I am getting the error on model1 line: [main] ERROR org.eclipse.rdf4j.rio.helpers.ParseErrorLogger - [Rio fatal] Expected '.', found '{' (3, -1)
I tried putting a '.' in the first line as this:
String source = """
PREFIX : <http://example/> .
:s :p :o {| :rp "val1" |} .
""";
This throws the error on model1 line: [main] ERROR org.eclipse.rdf4j.rio.helpers.ParseErrorLogger - [Rio fatal] Illegal subject value: ""^^http://www.w3.org/2001/XMLSchema#integer (1, -1)
public static void main(final String[] args) throws Exception {
String source = """
@prefix : <http://example/> .
:G {:s :p :o {| :r :z |} }
""";
Model model2 = Rio.parse(new StringReader(source), RDFFormat.TRIGSTAR);
}
Well, this should work, but fails with
Exception in thread "main" java.lang.NullPointerException: statement may not be null at java.base/java.util.Objects.requireNonNull(Objects.java:233) at org.eclipse.rdf4j.model.util.Values.triple(Values.java:692) at org.eclipse.rdf4j.rio.turtle.TurtleParser.parseAnnotation(TurtleParser.java:1403) at org.eclipse.rdf4j.rio.turtle.TurtleParser.parseObjectList(TurtleParser.java:376) at org.eclipse.rdf4j.rio.turtle.TurtleParser.parsePredicateObjectList(TurtleParser.java:346) at org.eclipse.rdf4j.rio.trig.TriGParser.parseTriples(TriGParser.java:233) at org.eclipse.rdf4j.rio.trig.TriGParser.parseGraph(TriGParser.java:160) at org.eclipse.rdf4j.rio.trig.TriGParser.parseStatement(TriGParser.java:112) at org.eclipse.rdf4j.rio.turtle.TurtleParser.parse(TurtleParser.java:162) at org.eclipse.rdf4j.rio.Rio.parse(Rio.java:409) at org.eclipse.rdf4j.rio.Rio.parse(Rio.java:374) at org.eclipse.rdf4j.rio.Rio.parse(Rio.java:322) at linda.datagraph.rdf4j.JsonLDTest.main(JsonLDTest.java:27)
Can you please provide your pom.xml, i think i don't have the correct one needed to reproduce this error.
TriG* parser passes for this syntax.
public static void main(final String[] args) throws Exception {
String source = "@prefix : <http://example/> .\n <<:s :p :o>> :rp \"val1\" .";
Model model1 = Rio.parse(new StringReader(source), RDFFormat.TURTLESTAR);
Model model2 = Rio.parse(new StringReader(source), RDFFormat.TRIGSTAR);
}
Hello, i just tried it out with:
<dependency>
<groupId>org.eclipse.rdf4j</groupId>
<artifactId>rdf4j-bom</artifactId>
<version>4.0.1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
Still fails:
Exception in thread "main" java.lang.NullPointerException: statement may not be null at java.base/java.util.Objects.requireNonNull(Objects.java:233) at org.eclipse.rdf4j.model.util.Values.triple(Values.java:728) at org.eclipse.rdf4j.rio.turtle.TurtleParser.parseAnnotation(TurtleParser.java:1407) at org.eclipse.rdf4j.rio.turtle.TurtleParser.parseObjectList(TurtleParser.java:375) at org.eclipse.rdf4j.rio.turtle.TurtleParser.parsePredicateObjectList(TurtleParser.java:345) at org.eclipse.rdf4j.rio.trig.TriGParser.parseTriples(TriGParser.java:233) at org.eclipse.rdf4j.rio.trig.TriGParser.parseGraph(TriGParser.java:160) at org.eclipse.rdf4j.rio.trig.TriGParser.parseStatement(TriGParser.java:112) at org.eclipse.rdf4j.rio.turtle.TurtleParser.parse(TurtleParser.java:162) at org.eclipse.rdf4j.rio.Rio.parse(Rio.java:482) at org.eclipse.rdf4j.rio.Rio.parse(Rio.java:447) at org.eclipse.rdf4j.rio.Rio.parse(Rio.java:371) at linda.datagraph.rdf4j.TrigStarTest.main(TrigStarTest.java:22)
Here is the code:
import org.eclipse.rdf4j.model.Model; import org.eclipse.rdf4j.rio.RDFFormat; import org.eclipse.rdf4j.rio.Rio;
import java.io.StringReader;
public class TrigStarTest {
public static void main(final String[] args) throws Exception
{
String source = """
@prefix : <http://example/> .
:G {:s :p :o {| :r :z |} }
""";
Model model2 = Rio.parse(new StringReader(source), RDFFormat.TRIGSTAR);
}
}
Encountered this issue yesterday using 4.2.2,
Caused by: java.lang.NullPointerException: statement may not be null at java.base/java.util.Objects.requireNonNull(Objects.java:246) at org.eclipse.rdf4j.model.util.Values.triple(Values.java:731) at org.eclipse.rdf4j.rio.turtle.TurtleParser.parseAnnotation(TurtleParser.java:1410) at org.eclipse.rdf4j.rio.turtle.TurtleParser.parseObjectList(TurtleParser.java:378) at org.eclipse.rdf4j.rio.turtle.TurtleParser.parsePredicateObjectList(TurtleParser.java:348) at org.eclipse.rdf4j.rio.trig.TriGParser.parseGraph(TriGParser.java:192) at org.eclipse.rdf4j.rio.trig.TriGParser.parseStatement(TriGParser.java:115) at org.eclipse.rdf4j.rio.turtle.TurtleParser.parse(TurtleParser.java:165) at org.eclipse.rdf4j.rio.turtle.TurtleParser.parse(TurtleParser.java:128)
I don't have example input as the source file is quite large, but it doesn't containing any named graphs.
Reproduced the issue with
import java.io.StringReader;
import org.eclipse.rdf4j.rio.RDFFormat;
import org.eclipse.rdf4j.rio.RDFParser;
import org.eclipse.rdf4j.rio.Rio;
public class TestParser {
public static void main(String[] arg) throws Exception {
RDFParser parser = Rio.createParser(RDFFormat.TRIGSTAR);
parser.parse(new StringReader("<x:foobar> <x:name> \"foobar\" {| <x:source> <https://somewhere> |}."));
}
}
I think the fix is easy, trigparser should not override reportStatement(). Also, parseTriples() could be made DRY-er by having an isEndOfStatement() and overriding that rather than repeat the entire method.