rdf4j icon indicating copy to clipboard operation
rdf4j copied to clipboard

TriG* parser fails for annotation syntax (java.lang.NullPointerException)

Open mhedenus opened this issue 3 years ago • 8 comments

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

  1. latest RDF4J (4.0.0 M2) on OpenJDK 17
  2. run example code (see above)
  3. see error

Version

4.0.0-M2

Are you interested in contributing a solution yourself?

Perhaps?

Anything else?

No response

mhedenus avatar Feb 04 '22 09:02 mhedenus

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?

The-Nightwing avatar May 01 '22 08:05 The-Nightwing

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 '|}'.

mhedenus avatar May 01 '22 09:05 mhedenus

https://w3c.github.io/rdf-star/tests/trig/syntax/manifest.html#trig-star-ann-1

mhedenus avatar May 01 '22 09:05 mhedenus

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)

The-Nightwing avatar May 02 '22 19:05 The-Nightwing

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)

mhedenus avatar May 05 '22 10:05 mhedenus

Can you please provide your pom.xml, i think i don't have the correct one needed to reproduce this error.

The-Nightwing avatar May 13 '22 09:05 The-Nightwing

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);
}

vidhi448 avatar May 13 '22 18:05 vidhi448

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);
}

}

mhedenus avatar May 27 '22 08:05 mhedenus

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.

pulquero avatar Jan 25 '23 22:01 pulquero

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> |}."));
	}
}

pulquero avatar Jan 26 '23 13:01 pulquero

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.

pulquero avatar Jan 26 '23 13:01 pulquero