Not quite!

You've raise an issue with afs/iri4ld - my personal project for IRI parsing.

Which isn't jsonld-java (https://github.com/jsonld-java/jsonld-java/) nor is it used by jsonld-java.

afs/iri4ld that aims to be standard's compliant but faster and easier to maintain than jena-iri (because it has less functionality than jena-iri). And it does get this case right.

    Andy

PS It has a companion project xsd4ld - doing XSD datatypes.


On 04/03/2020 23:39, Erich Bremer wrote:
Andy - done.

On Wed, Mar 4, 2020 at 12:25 PM Andy Seaborne <a...@apache.org> wrote:

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