Sparql - query to get all triples related to a specific subject

10,003

Solution 1

There is a way to do this, but whether it is "simple" is somewhat subjective.

Property paths allow you to query paths of unknown length. However, you can only specify such arbitrary-length property paths on specific property names (so not on property variables).

A way around this is to use a negation, like so:

:P3 (:overrides|!:overrides)+ ?child 

This will gives you back all "children" connected via paths of length 1 or longer where the connecting property is either :overrides or NOT :overrides (which is, of course, true for every property).

However, using property paths, you can only match these properties to get their values back, you can't get actually get the property names themselves back. So we will need to make our query a bit more extensive and just query for everything connected to both our original subject (:P3) as well as to all possible "child" subjects (?child).

The full query then becomes:

CONSTRUCT {
   :P3 ?prop ?val .
   ?child ?childProp ?childPropVal . 
   ?someSubj ?incomingChildProp ?child .
}
WHERE {
     :P3 ?prop ?val ;
         (:overrides|!:overrides)+ ?child . 
     ?child ?childProp ?childPropVal.
     ?someSubj ?incomingChildProp ?child. 
}

The reason this works is that we match and return both incoming and outgoing properties for every child along the way: so for a child connected to :P3 via a path of length 2, we get the first component of the path back because :P3 ?prop ?val matches it, and the last part because ?someSubj ?incomingChildProp ?child matches it. For a path of length 3, the middle part of the path will be matched because it was already retrieved by ?child ?childProp ?childPropVal when the path was still at length 2.

Solution 2

I think what you are looking for is property path

SELECT ?s ?p ?o
WHERE 
{
   ?s HAS+ ?o .
   FILTER ( ?s = <ID_6> )
}
Share:
10,003
Lost as usual
Author by

Lost as usual

Updated on June 05, 2022

Comments

  • Lost as usual
    Lost as usual about 2 years

    I want all the triples in the graph from a specific subject / node.

    I can get all the triples...

    SELECT $s $p $o WHERE { $s $p $o }
    

    ... not really helpful

    I can get all the directly connect triples...

    SELECT $s $p $o WHERE { 
       $s _some_predicate_ _some_object_specifier .
       $s $p $o }
    

    What I want is to start at $s (selected by predicate and object) and then get something like $s $p* $o

    Thoughts?

    Graph

    So I'd like to start at ID_6 and get all node below that including the nodes 1 and 2. I also need the predicates because not all the predicates will be HAS

    So more specifically using the graph below I want all the triples below object "P2" I need the subject, predicate and object for each of the 1xx and 2xx nodes... I can recursively query each node to get the data but I'm hoping there is a simple (ish) query to get all the data in a single query...

    More Details

    • Jeen Broekstra
      Jeen Broekstra over 8 years
      "Something like $s $p* $o" is not very clear in terms of what you want, precisely. Can you give a concrete example: some example RDF graph, and what you'd like to be able to query from that RDF graph? As-is, the question is rather too broad and vague to answer.