Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Weird behvior with framing and native language mappings #360

Open
DavideRossi opened this issue Aug 16, 2024 · 0 comments
Open

Weird behvior with framing and native language mappings #360

DavideRossi opened this issue Aug 16, 2024 · 0 comments

Comments

@DavideRossi
Copy link

DavideRossi commented Aug 16, 2024

Describe the bug
I'm failing to perform round-trip conversions JSON-LD/RDF with WOT Thing Descriptions.
The pipeline should be: JSON-LD -> N-Quads -> expanded JSON-LD -> framed JSON-LD.
The conversion works with other libraries, you can even perform the pipeline using online tools like the LSON-LD Playground (for JSON-LD to N-Quads and Framing) and RDF Distiller (for N-Quads to JSON-LD).
I've been able to restrict the problem by using the following toy TD with a simplified context:

{
    "@context": {
        "td": "https://www.w3.org/2019/wot/td#",
        "jsonschema": "https://www.w3.org/2019/wot/json-schema#",
        "xsd": "http://www.w3.org/2001/XMLSchema#",
        "id": "@id",
        "properties": {
            "@id": "td:hasPropertyAffordance",
            "@type": "@id",
            "@container": "@index",
            "@index": "name",
            "@context": {
                "td": "https://www.w3.org/2019/wot/td#",
                "jsonschema": "https://www.w3.org/2019/wot/json-schema#",
                "type": {
                    "@id": "@type"
                },
                "readOnly": {
                    "@id": "jsonschema:readOnly"
                },
                "boolean": "jsonschema:BooleanSchema",
                "string": "jsonschema:StringSchema",
                "properties": {
                    "@id": "jsonschema:properties",
                    "@container": "@index",
                    "@index": "name",
                    "@context": {
                        "properties": {
                            "@id": "jsonschema:properties",
                            "@container": "@index",
                            "@index": "propertyName"
                        }
                    }
                },
                "propertyName": {
                    "@id": "jsonschema:propertyName"
                },
                "unit": {
                    "@id": "schema:unitCode",
                    "@type": "@vocab"
                }
            }
        },
        "Thing": {
            "@id": "td:Thing"
        },
        "name": {
            "@id": "td:name"
        },
        "title": {
            "@id": "td:title",
            "@language": "en"
        }
    },
    "id": "urn:uuid:0804d572-cce8-422a-bb7c-4412fcd56f06",
    "@type": "Thing",
    "title": "MyThing Title",
    "name": "MyThing Name",
    "properties": {
        "status": {
            "type": "string",
            "readOnly": false
        },
        "isOn": {
            "type": "boolean"
        }
    }
}

The conversion using the JSON-LD playground and Titanium lead to the same result:

<urn:uuid:0804d572-cce8-422a-bb7c-4412fcd56f06> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <https://www.w3.org/2019/wot/td#Thing> .
<urn:uuid:0804d572-cce8-422a-bb7c-4412fcd56f06> <https://www.w3.org/2019/wot/td#hasPropertyAffordance> _:b0 .
<urn:uuid:0804d572-cce8-422a-bb7c-4412fcd56f06> <https://www.w3.org/2019/wot/td#hasPropertyAffordance> _:b1 .
<urn:uuid:0804d572-cce8-422a-bb7c-4412fcd56f06> <https://www.w3.org/2019/wot/td#name> "MyThing Name" .
<urn:uuid:0804d572-cce8-422a-bb7c-4412fcd56f06> <https://www.w3.org/2019/wot/td#title> "MyThing Title"@en .
_:b0 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <https://www.w3.org/2019/wot/json-schema#BooleanSchema> .
_:b0 <https://www.w3.org/2019/wot/td#name> "isOn" .
_:b1 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <https://www.w3.org/2019/wot/json-schema#StringSchema> .
_:b1 <https://www.w3.org/2019/wot/json-schema#readOnly> "false"^^<http://www.w3.org/2001/XMLSchema#boolean> .
_:b1 <https://www.w3.org/2019/wot/td#name> "status" .

The conversion to N-Quads lead to a basically equal results using Titanium and RDF Distiller (the difference being that RDF Distiller also performs a compaction). Here is Titanium's version:

[
    {
        "@id": "_:b0",
        "@type": [
            "https://www.w3.org/2019/wot/json-schema#StringSchema"
        ],
        "https://www.w3.org/2019/wot/json-schema#readOnly": [
            {
                "@value": false
            }
        ],
        "https://www.w3.org/2019/wot/td#name": [
            {
                "@value": "status"
            }
        ]
    },
    {
        "@id": "_:b1",
        "@type": [
            "https://www.w3.org/2019/wot/json-schema#BooleanSchema"
        ],
        "https://www.w3.org/2019/wot/td#name": [
            {
                "@value": "isOn"
            }
        ]
    },
    {
        "@id": "urn:uuid:0804d572-cce8-422a-bb7c-4412fcd56f06",
        "@type": [
            "https://www.w3.org/2019/wot/td#Thing"
        ],
        "https://www.w3.org/2019/wot/td#hasPropertyAffordance": [
            {
                "@id": "_:b0"
            },
            {
                "@id": "_:b1"
            }
        ],
        "https://www.w3.org/2019/wot/td#name": [
            {
                "@value": "MyThing Name"
            }
        ],
        "https://www.w3.org/2019/wot/td#title": [
            {
                "@value": "MyThing Title",
                "@type": "http://www.w3.org/1999/02/22-rdf-syntax-ns#langString"
            }
        ]
    }
]

When I try to frame the results with the very same @context contained in the original JSON-LD (with the addition of "@type": "Thing") things fall apart.
JSON-LD Playground returns this document (@context omitted):

  "id": "urn:uuid:0804d572-cce8-422a-bb7c-4412fcd56f06",
  "@type": "Thing",
  "properties": {
    "isOn": {
      "type": "boolean"
    },
    "status": {
      "type": "string",
      "readOnly": false
    }
  },
  "name": "MyThing Name",
  "title": "MyThing Title"
}

The conversion is online here.
Titanium, instead, returns:

{
    "id": "urn:uuid:0804d572-cce8-422a-bb7c-4412fcd56f06",
    "@type": "Thing",
    "properties": {
        "status": {
            "type": "jsonschema:StringSchema",
            "readOnly": false
        },
        "isOn": {
            "type": "jsonschema:BooleanSchema"
        }
    },
    "name": "MyThing Name",
    "td:title": {
        "@value": "MyThing Title",
        "@type": "http://www.w3.org/1999/02/22-rdf-syntax-ns#langString"
      }
    }
}

The only difference w.r.t. the options used in the various conversions is that for N-Quards to JSON-LD I had to set setUseNativeTypes to true in RDF Distiller otherwise the resulting JSON-LD cannot be framed correctly.
If I use the same option in Titanium things get even messier. But I think this is another problem. The relevant problem now is the final framing. I can make it work correctly with JSON-LD playground and I found no way for doing that with Titanium (of course I tried with various options, but no success).

To Reproduce
See above

Expected behavior
Same behavior as jsonld.js

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants