Search code examples
sparqlrdftriples

RDF triples to a table


I have a triple store with RDF triples and I want to export the data to a table where columns represent the predicates. For example, if I have the following triples

:s1 :p1 "v11"
:s1 :p2 "v12"
:s2 :p2 "v22"
:s2 :p3 "v23"

I want it to be as follows

----|  p1    | p2  | p3
s1  |  v11   | v12 | (null)
s2  | (null) | v22 | v23

This might seems a little odd, as in most cases we need to export the other way but here I want to feed this data into a data mining software.


Solution

  • USE OPTIONAL

    If you know the predicates in advance, you can wrap each predicate in OPTIONAL to get all predicates in the same row for all subjects - even if some are missing. Here is an example:

    SELECT ?name ?birth ?death
    WHERE {
    ?person foaf:name ?name .
    ?person dbo:birthPlace :Berlin .
    OPTIONAL { ?person dbo:birthDate ?birth . }
    OPTIONAL { ?person dbo:deathDate ?death .}
    }
    ORDER BY ?name
    LIMIT 1000
    

    I keep my original answer for reference:

    Use UNION (creates separate rows for each predicate)

    If you know the predicates in advance, you can use UNION to get all predicates for all subjects - even if some are missing. Here is an example:

    SELECT ?name ?birth ?field
    WHERE {
    ?person foaf:name ?name .
    ?person dbo:birthPlace :Berlin .
    {
    ?person dbo:birthDate ?birth .
    } UNION {
    ?person dbo:field ?field .
    }}
    ORDER BY ?name
    LIMIT 100