S M Shamimul Hasan
S M Shamimul Hasan

Reputation: 6684

SPARQL Subquery Graph Name

I have following SPARQL query that contains a sub-select. The data contains multiple graphs and I want to know what graph the values for ?b and ?m come from:

select ?b, ?m, ?g1
where {

 {
    select ?o1, ?o2, ?e 
     where{
      graph ?g{
       ?s <http://ndssl.bi.vt.edu/chicago/vocab/dendrogram_infector_pid> ?o1.
       ?s <http://ndssl.bi.vt.edu/chicago/vocab/dendrogram_infectee_pid> ?o2.
       ?s <http://ndssl.bi.vt.edu/chicago/vocab/dendrogram_iteration> '0'^^xsd:decimal.
       ?s <http://ndssl.bi.vt.edu/chicago/vocab/dendrogram_exposureday> ?e.
       ?s1 <http://ndssl.bi.vt.edu/chicago/vocab/contactnetwork_pid1> ?o1.
       ?s1 <http://ndssl.bi.vt.edu/chicago/vocab/contactnetwork_pid2> ?o2.
       ?s1 <http://ndssl.bi.vt.edu/chicago/vocab/contactnetwork_acttype1> '5'^^xsd:decimal.
       ?s1 <http://ndssl.bi.vt.edu/chicago/vocab/contactnetwork_acttype2> '5'^^xsd:decimal
    }
   }ORDER BY ASC(?e) LIMIT 1 
}

{

graph ?g1 {
?b <http://ndssl.bi.vt.edu/chicago/vocab/getInfectedBy> ?o1.
?m <http://ndssl.bi.vt.edu/chicago/vocab/getInfectedBy>* ?b.
   }

}

}

The second graph pattern contains a transitive property path and the query provides following correct result:

 b                                                        m                                                        g1 
 -----------------------------------------------------    -----------------------------------------------------    ------------------------------------------------------- 
 <http://ndssl.bi.vt.edu/chicago/person/pid#446734805>    <http://ndssl.bi.vt.edu/chicago/person/pid#446753456>    <http://ndssl.bi.vt.edu/chicago/dendrogram/replicate1/> 

However, I want to see the intermediate nodes and count the path length from transitive relationship. If I remove graph ?g1 from the query, then it shows the intermediate node information like following:

 b                                                      m
 ---------------------------------------------------    --------------------------------------------------- 
 http://ndssl.bi.vt.edu/chicago/person/pid#446718746    http://ndssl.bi.vt.edu/chicago/person/pid#446718746 
 http://ndssl.bi.vt.edu/chicago/person/pid#446734805    http://ndssl.bi.vt.edu/chicago/person/pid#446734805 
 http://ndssl.bi.vt.edu/chicago/person/pid#446734805    http://ndssl.bi.vt.edu/chicago/person/pid#446753456 

The Purpose of the query is to figure out graph name for matching ?b and ?m. Hence, I want to use graph ?g1. Is it possible to show intermediate nodes by retaining the graph keyword? I am using Virtuoso.

Upvotes: 0

Views: 1047

Answers (1)

scotthenninger
scotthenninger

Reputation: 4001

Since you're not using g the first GRAPH statement is not necessary. Note also that the second GRAPH statement only uses ?o1, so the following query do what you want it to. You may also want to check SPARQL syntax in your select clause.

PREFIX ndssl: <http://ndssl.bi.vt.edu/chicago/vocab/>
SELECT ?b ?m ?g1
WHERE {
  {
    SELECT ?o1
    WHERE {
       ?s   ndssl:dendrogram_infector_pid  ?o1               .
       ?s   ndssl:dendrogram_infectee_pid  ?o2               .
       ?s   ndssl:dendrogram_iteration     '0'^^xsd:decimal  .
       ?s   ndssl:dendrogram_exposureday   ?e                .
       ?s1  ndssl:contactnetwork_pid1      ?o1               .
       ?s1  ndssl:contactnetwork_pid2      ?o2               .
       ?s1  ndssl:contactnetwork_acttype1  '5'^^xsd:decimal  .
       ?s1  ndssl:contactnetwork_acttype2  '5'^^xsd:decimal
    } ORDER BY ASC(?e) LIMIT 1 
  }
  GRAPH ?g1 {
    ?b  ndssl:getInfectedBy   ?o1  .
    ?m  ndssl:getInfectedBy*  ?b   .
  }
}

In the endpoint provided there isn't a match for ?b or ?m, regardless of whether a GRAPH statement is used or not.

Upvotes: 1

Related Questions