give this one a go :)
SELECT ?x ?predicate ?y ?via ?dist ?path WHERE
{
{ SELECT * WHERE { ?x rdf:type <http://bio2rdf.org/ns/obo#term> . ?x
?predicate ?y . filter( isURI(?y) ) . ?y rdf:type
<http://bio2rdf.org/ns/obo#term> } }
OPTION ( TRANSITIVE, T_DISTINCT, T_NO_CYCLES, t_in(?x), t_out(?y),
t_min(1), t_max(4), t_step('path_id') as ?path, t_step(?x) as ?via,
t_step('step_no') AS ?dist )
. FILTER ( ?x = <http://bio2rdf.org/fma:27890> )
}
changed it a bit:
initial select you can see easily, just builds a set of all terms with
links to other terms, then options to T_DISTINCT, and removed (let the
optimizer pick what's best) - also changed the filter to hit fma:27890
which I know links to 15 other terms thus should give a decent results set.
this little query shows us all the things with the most links:
SELECT DISTINCT ?x count(?y) as ?c WHERE { ?x rdf:type
<http://bio2rdf.org/ns/obo#term> . ?x ?predicate ?y . filter( isURI(?y)
) . ?y rdf:type <http://bio2rdf.org/ns/obo#term> } group by ?x order by
desc(?c) limit 100
good for testing t_in start points :)
do hope that helps,
regards,
Nathan
Peter Ansell wrote:
> How do I find arbitrary paths out from one URI to all other URI's it is
> linked to without specifying the predicate? I can make the following query
> work, but if I don't specify the predicate the query fails
>
> The following works, which is very nice, but I would like to have both the
> predicate and the object as unknowns.
>
> SELECT ?x ?y ?via ?dist ?path WHERE
> {
> { SELECT * WHERE { ?x <http://bio2rdf.org/ns/obo#is_a> ?y } }
> OPTION ( TRANSITIVE, T_NO_CYCLES, t_in(?x), t_out(?y), t_min(1), t_max(6),
> t_step('path_id') as ?path, t_step(?x) as ?via, t_step('step_no') AS
> ?dist, T_DIRECTION 1 )
> . FILTER ( ?x =
> <http://bio2rdf.org/po:0009045> && isURI(?y))
> }
>
> The following fails, even though I put in the filter to make sure that all
> possible ?y values would be URI's
>
> SELECT ?x ?predicate ?y ?via ?dist ?path WHERE
> {
> { SELECT * WHERE { ?x ?predicate ?y } }
> OPTION ( TRANSITIVE, T_NO_CYCLES, t_in(?x), t_out(?y), t_min(1), t_max(6),
> t_step('path_id') as ?path, t_step(?x) as ?via, t_step('step_no') AS
> ?dist, T_DIRECTION 1 )
> . FILTER ( ?x =
> <http://bio2rdf.org/po:0009045> && isURI(?y))
> }
>
> Thanks,
>
> Peter
>
>
> ----- Original Message ----
>> From: Nathan <[email protected]>
>> Cc: Virtuoso Users List <[email protected]>
>> Sent: Wed, 3 February, 2010 9:23:10 AM
>> Subject: Re: [Virtuoso-users] Get all paths between two URIs with
>> transitivity..
>>
>> Nathan wrote:
>>> Hi,
>>>
>>> Please see: http://bit.ly/9Gli76
>>>
>>> it always seems to show the T_SHORTEST_ONLY (shortest path) between two
>>> nodes; any way to see all paths?
>>>
>>> SELECT ?x ?y ?via ?dist WHERE
>>> {
>>> { SELECT * WHERE { ?x skos:broader ?y } }
>>> OPTION ( TRANSITIVE, t_distinct, t_in(?x), t_out(?y), t_max(10),
>>> t_step(?x) as ?via, t_step('step_no') AS ?dist ) .
>>> FILTER ( ?x =
>>> && ?y =
>>> )
>>> }
>>>
>> I'm getting good at doing this.. figured it out; T_DISTINCT was limiting
>> the results, thus I removed it, added in T_NO_CYCLES and then forced the
>> direct to be the right way using T_DIRECTION 1, (which speeded up the
>> query massively & stopped it running out of memory) - new query is as
>> follows:
>>
>> SELECT ?x ?y ?via ?dist ?path WHERE
>> {
>> { SELECT * WHERE { ?x skos:broader ?y } }
>> OPTION ( TRANSITIVE, T_NO_CYCLES, t_in(?x), t_out(?y), t_max(6),
>> t_step('path_id') as ?path, t_step(?x) as ?via, t_step('step_no') AS
>> ?dist, T_DIRECTION 1 )
>> . FILTER ( ?x =
>> && ?y =
>> )
>> }
>>
>> also has additional max steps / distance of 6 and path identifier added
>> in so we can analyse each specific route.
>>
>> loving virtuoso! - still trying to get to the following end; so if you
>> know a quicker way, do let me know.
>>
>> ps: docs on transitivity here:
>> http://docs.openlinksw.com/virtuoso/transitivityinsQL.html
>>
>> nathan
>>
>>> whilst an "issue" this is only an interim query en-route to what I'm
>>> trying to do; in reality what I want to do is find all paths between
>>> multiple nodes and a route node which i specify (all paths between
>>> ?category in(x,y,z) and Category:Main_topic_classifications) then find
>>> the intersections with the shortest route; ie that if you follow the
>>> skos:broader of the cat tree up you'll find that Category:Semantic_Web
>>> and Category:HTML intersect at Category:World_Wide_Web so that one can
>>> infer that when something has these two categories it is in the broader
>>> topic of World_Wide_Web.
>>>
>>> If the aforementioned isn't an easy hit then just how to find all paths
>>> will do the trick and I can UNION up some results and filter to get what
>>> I want.
>>>
>>> Many Regards,
>>>
>>> Nathan
>>>
>>> ------------------------------------------------------------------------------
>>> The Planet: dedicated and managed hosting, cloud storage, colocation
>>> Stay online with enterprise data centers and the best network in the
>>> business
>>> Choose flexible plans and management services without long-term contracts
>>> Personal 24x7 support from experience hosting pros just a phone call away.
>>> http://p.sf.net/sfu/theplanet-com
>>> _______________________________________________
>>> Virtuoso-users mailing list
>>> [email protected]
>>> https://lists.sourceforge.net/lists/listinfo/virtuoso-users
>>>
>>>
>>
>> ------------------------------------------------------------------------------
>> The Planet: dedicated and managed hosting, cloud storage, colocation
>> Stay online with enterprise data centers and the best network in the business
>> Choose flexible plans and management services without long-term contracts
>> Personal 24x7 support from experience hosting pros just a phone call away.
>> http://p.sf.net/sfu/theplanet-com
>> _______________________________________________
>> Virtuoso-users mailing list
>> [email protected]
>> https://lists.sourceforge.net/lists/listinfo/virtuoso-users
>
>
>
>
> __________________________________________________________________________________
> Yahoo!7: Catch-up on your favourite Channel 7 TV shows easily, legally, and
> for free at PLUS7. www.tv.yahoo.com.au/plus7
>
>
>