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

瘦欲@ 提交于 2019-12-23 18:44:38

问题


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


回答1:


I think what you are looking for is property path

SELECT ?s ?p ?o
WHERE 
{
   ?s HAS+ ?o .
   FILTER ( ?s = <ID_6> )
}



回答2:


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.



来源:https://stackoverflow.com/questions/33241812/sparql-query-to-get-all-triples-related-to-a-specific-subject

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!