java.net.URI is not perfect and it is also a mixture of RFC2396, RFC3896 and some pragmatics.

Jena's own jena-iri gets it right.

  // NB The argument order can catch you out.
  IRI iri = IRIResolver.resolve("picture.jpg", "http://mysite.net"; );
  System.out.println(iri);

but jsonld-java uses java.net.URI.

Erich - please could you raise an issue with jsonld-java?

    Andy

Or https://github.com/afs/iri4ld

On 04/03/2020 16:57, Erich Bremer wrote:
Thanks for the reference Martynas!  According to the section referenced,
the following two URLs are equivalent.

       http://example.com
       http://example.com/

I can modify my own code to do the check and fix it for myself, but I
would think URI.resolve should treat them as equivalents and not
mindlessly concatenate them.  How the jsonld-java people or the Jena
community, which uses jsonld-java, will have to make the call on how
to handle it.  - Erich


On Wed, Mar 4, 2020 at 11:24 AM Martynas Jusevičius <marty...@atomgraph.com>
wrote:

URI.resolve() will not assume anything.

Base URI normally ends with a /. Don’t know if this is the best reference,
but close:
https://tools.ietf.org/html/rfc3986#section-6.2.3

You need to check the URI RFC and its resolution algorithm.

On Wed, 4 Mar 2020 at 16.57, Erich Bremer <er...@ebremer.com> wrote:

This also works:

         URI uri = new URI("http://mysite.net";);
         System.out.println(uri.resolve("/picture.jpg"));

but if no trailing "/" and no leading "/" on path will yield the
concatenated http://mysite.netpicture.jpg which then gets tossed and a
blank node is formed.

Should URI.resolve assume a "/" if no trailing nor leading "/" is
present?
- Erich

On Wed, Mar 4, 2020 at 10:52 AM Erich Bremer <er...@ebremer.com> wrote:

The program works if I specify the base with a trailing slash as "
http://mysite.net/";
I ran through the code and the problem appears to be here:



https://github.com/jsonld-java/jsonld-java/blob/66012db2f53b009cedeae50c83b5594b9dd05e11/core/src/main/java/com/github/jsonldjava/utils/JsonLdUrl.java#L283

In the short code segment here, you can see:
         URI uri = new URI("http://mysite.net";);
         System.out.println(uri.resolve("picture.jpg"));

Output:
http://mysite.netpicture.jpg


On Wed, Mar 4, 2020 at 10:05 AM Erich Bremer <er...@ebremer.com>
wrote:

Same thing:
Source JSONLD
{
     "@context": [
         "http://schema.org";
     ],
     "@graph": [
         {
             "@type": "CreativeWork",
             "@id": "picture.jpg"
         },
         {
             "@id": "./",
             "@type": "DataSet"
         }
     ]
}
AFTER loading
============================================================
Base : http://mysite.net
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for
further details.
[ {
   "@type" : [ "http://schema.org/CreativeWork"; ]
}, {
   "@id" : "http://mysite.net";,
   "@type" : [ "http://schema.org/DataSet"; ]
} ]


CODE ====================================
package com.mycompany.tesjsonld;

import com.github.jsonldjava.core.JsonLdOptions;
import com.github.jsonldjava.core.JsonLdProcessor;
import com.github.jsonldjava.utils.JsonUtils;
import java.io.ByteArrayInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.Charset;

/**
  *
  * @author erich
  */
public class tryme {

     public static void main(String[] args) throws
FileNotFoundException,
IOException {
         String json = "{\n" +
             "    \"@context\": [\n" +
             "        \"http://schema.org\"\n"; +
             "    ],\n" +
             "    \"@graph\": [\n" +
             "        {\n" +
             "            \"@type\": \"CreativeWork\",\n" +
             "            \"@id\": \"picture.jpg\"\n" +
             "        },\n" +
             "        {\n" +
             "            \"@id\": \"./\",\n" +
             "            \"@type\": \"DataSet\"\n" +
             "        }\n" +
             "    ]\n" +
             "}";

         System.out.println(json);



System.out.println("============================================================");
         InputStream inputStream = new
ByteArrayInputStream(json.getBytes(Charset.forName("UTF-8")));
         Object jsonObject = JsonUtils.fromInputStream(inputStream);
         JsonLdOptions options = new JsonLdOptions("http://mysite.net
");
         System.out.println("Base : "+options.getBase());
         //Object compact = JsonLdProcessor.compact(jsonObject, null,
options);
         Object compact = JsonLdProcessor.expand(jsonObject, options);
         System.out.println(JsonUtils.toPrettyString(compact));
     }
}

On Wed, Mar 4, 2020 at 9:44 AM Erich Bremer <er...@ebremer.com>
wrote:

I will try with the other library to check.

On Wed, Mar 4, 2020 at 4:29 AM Rob Vesse <rve...@dotnetrdf.org>
wrote:

This may be an upstream bug or it could be a bug in how we configure
the underlying parser

Jena's JSON-LD support is based upon the
https://github.com/jsonld-java/jsonld-java library so you could try
and reproduce your test case just using their library directly which
would
determine if it is their bug or our bug

Rob

On 04/03/2020, 00:11, "Erich Bremer" <er...@ebremer.com> wrote:

     I'm trying to use a "@id": "./" in a jsonld file and in another
triple
     "@id": "picture.jpg".  The "./" will be correctly changed to the
base URL,
     but the "@id": "picture.jpg" just gets dropped and a blank node
is
     created.  Below is the code segment that I used to generate this
output:
     {
         "@context": [
             "http://schema.org";
         ],
         "@graph": [
             {
                 "@type": "CreativeWork",
                 "@id": "picture.jpg"
             },
             {
                 "@id": "./",
                 "@type": "DataSet"
             }
         ]
     }
     _:Bd42dbcf4e4ffb76e199766bf5e4c1e4b <
     http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <
     http://schema.org/CreativeWork> .
     <http://mydomain.com> <
http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <
     http://schema.org/DataSet> .

     If I use https://json-ld.org/playground/ on the same jsonld, I
get:

     <https://json-ld.org/playground/> <
     http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <
http://schema.org/DataSet>
     .
     <https://json-ld.org/playground/picture.jpg> <
     http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <
     http://schema.org/CreativeWork> .

     which is what I expected.  Am I missing something here?  - Erich

         String json = "{\n" +
     "    \"@context\": [\n" +
     "        \"http://schema.org\"\n"; +
     "    ],\n" +
     "    \"@graph\": [\n" +
     "        {\n" +
     "            \"@type\": \"CreativeWork\",\n" +
     "            \"@id\": \"picture.jpg\"\n" +
     "        },\n" +
     "        {\n" +
     "            \"@id\": \"./\",\n" +
     "            \"@type\": \"DataSet\"\n" +
     "        }\n" +
     "    ]\n" +
     "}";
         System.out.println(json);
         Model m = ModelFactory.createDefaultModel();
         InputStream inputStream = new
     ByteArrayInputStream(json.getBytes(Charset.forName("UTF-8")));
         RDFParser.create()
             .base("http://mydomain.com";)
             .source(inputStream)
             .lang(RDFLanguages.JSONLD)
             .parse(m);
         RDFDataMgr.write(System.out, m, RDFFormat.NQUADS) ;









Reply via email to