[TYPO3-semantic] Serialisation of Query for DAM - JSON-LD

Jochen Rau jochen.rau at typoplanet.de
Thu Aug 25 08:55:41 CEST 2011


Hi Fabien.

I have taken some of the criterias shown in the linked image and translated them into a SPARQL query:

--- 8< ---------------- (SPARQL Begin)
PREFIX rdf: <http://xmlns.com/foaf/0.1/>
PREFIX sp: <http://spinrdf.org/sp#>
PREFIX dc: <http://purl.org/dc/elements/1.1/>
PREFIX dam: <http://typo3.org/ontology/dam/>
PREFIX ex: <http://example.org/>

SELECT *
WHERE {
	?resource rdf:type dam:Image .
	FILTER NOT EXISTS { ?resource dc:creator ex:John_Doe }
	?resource dc:title ?title . FILTER regex(?title, "foo")
	{ ?resource dam:category ex:FirstCategory }
	UNION
	{ ?resource dam:category ex:SecondCategory }
	UNION
	{ ?resource dam:category ex:ThirdCategory }
	?resource dam:fileSize ?size . FILTER (?size < 100)
}
--- 8< ---------------- (SPARQL Begin)

The query translates into RDF using the SPIN vocabulary (see http://spinrdf.org/sp.html#sp-Optional, http://spinservices.org/spinrdfconverter.html):

--- 8< ---------------- (Turtle Begin)
@prefix dc:      <http://purl.org/dc/elements/1.1/> .
@prefix ex:      <http://example.org/> .
@prefix rdfs:    <http://www.w3.org/2000/01/rdf-schema#> .
@prefix sp:      <http://spinrdf.org/sp#> .
@prefix spin:    <http://spinrdf.org/sp#> .
@prefix dam:     <http://typo3.org/ontology/dam/> .
@prefix xsd:     <http://www.w3.org/2001/XMLSchema#> .
@prefix owl:     <http://www.w3.org/2002/07/owl#> .
@prefix rdf:     <http://xmlns.com/foaf/0.1/> .

[]    a       sp:Select ;
      sp:where ([ sp:object dam:Image ;
                  sp:predicate rdf:type ;
                  sp:subject spin:_resource
                ] [ a       sp:Filter ;
                  sp:expression
                          [ a       sp:notExists ;
                            sp:elements ([ sp:object ex:John_Doe ;
                                        sp:predicate dc:creator ;
                                        sp:subject spin:_resource
                                      ])
                          ]
                ] [ sp:object spin:_title ;
                  sp:predicate dc:title ;
                  sp:subject spin:_resource
                ] [ a       sp:Filter ;
                  sp:expression
                          [ a       sp:regex ;
                            sp:arg1 spin:_title ;
                            sp:arg2 "foo"
                          ]
                ] [ a       sp:Union ;
                  sp:elements (([ sp:object ex:FirstCategory ;
                                sp:predicate dam:category ;
                                sp:subject spin:_resource
                              ]) ([ sp:object ex:SecondCategory ;
                                sp:predicate dam:category ;
                                sp:subject spin:_resource
                              ]) ([ sp:object ex:ThirdCategory ;
                                sp:predicate dam:category ;
                                sp:subject spin:_resource
                              ]))
                ] [ sp:object spin:_size ;
                  sp:predicate dam:fileSize ;
                  sp:subject spin:_resource
                ] [ a       sp:Filter ;
                  sp:expression
                          [ a       sp:lt ;
                            sp:arg1 spin:_size ;
                            sp:arg2 100
                          ]
                ]) .
--- 8< ---------------- (Turtle End)

A (simplified) translation of the WHERE part into JSON-LD (http://json-ld.org/) would be:

--- 8< ---------------- (JSON-LD Begin)
[{
    "sp:object": "dam:Image",
    "sp:predicate": "rdf:type",
    "sp:subject": "spin:_resource"
}, {
    "rdf:type": "sp:Filter",
    "sp:expression": {
        "rdf:type": "sp:notExists",
        "sp:elements": [{
            "sp:object": "ex:John_Doe",
            "sp:predicate": "dc:creator",
            "sp:subject": "spin:_resource"
        }]
    }
}, {
    "sp:object": "spin:_title",
    "sp:predicate": "dc:title",
    "sp:subject": "spin:_resource"
}, {
    "rdf:type": "sp:Filter",
    "sp:expression": {
        "rdf:type": "sp:regex",
        "sp:arg1": "spin:_title",
        "sp:arg2": "foo"
    }
}, {
    "rdf:type": "sp:Union",
    "sp:elements": [
        [{
            "sp:object": "ex:FirstCategory",
            "sp:predicate": "dam:category",
            "sp:subject": "spin:_resource"
        }],
        [{
            "sp:object": "ex:SecondCategory",
            "sp:predicate": "dam:category",
            "sp:subject": "spin:_resource"
        }],
        [{
            "sp:object": "ex:ThirdCategory",
            "sp:predicate": "dam:category",
            "sp:subject": "spin:_resource"
        }]
    ]
}]
--- 8< ---------------- (JSON-LD End)

This seems to be very complex. But there are some adavantages:
- We can easily transform the triple pattern back to a SPARQL query (reusable and future-proof).
- It is based on W3C standards (Recommendation/Member Submission).
- We can use all the tools available for RDF/SPARQL to check syntax or to serialize data.

Hope that helps. Let me know if you need additional information.

Jochen

-- 
Every nit picked is a bug fixed


More information about the TYPO3-team-semantic mailing list