使用sparql查询在rdf图中打印多个路径

时间:2017-03-17 05:34:55

标签: sparql rdf

我的数据分别表示从:a:vk的两条路径如下:

@prefix : <http://m/questions/19587520/sparql-path-between-two-instance/> .

:a :z :d.    
:d :p :e .      
:e :g :f .    
:f :l :g .    
:g :m :h .    
:h :p :k .    
:k :p :c .    
:c :p :v . 

:a :p :x.    
:x :q :y.    
:y :z :c.    
:a :l :g .    
:g :m :h .    
:h :p :k .

我尝试过的SPARQL查询

     String querygraph=
 "PREFIX : <http://m/questions/19587520/sparql-path-between-two-instance/>" +

                 "SELECT ?start  ?end (count(?mid) as ?length)" +
                 "WHERE {" +
                   " values (?start ?end) { (:a :c) " +
                 " } " +
                    " ?start (: |!:)+ ?mid . " +
                  " ?mid (: | !:)* ?end . " +
                 " } " +
                 " group by ?start ?end " +
                   " ORDER BY ASC(?length)";


     String querygraph1=
             "PREFIX : <http://monika/questions/19587520/sparql-path-between-two-instance/>" +

         "select  (count(?m) as ?length) " +
                  "WHERE {" +
                  " values (?s ?d) { (:a :c) " +
                     " } " +
                  "?s  (:|!:)+ ?m ."+
                  " ?m (: | !:)* ?d . " +


                "}" ;

在此我需要打印并计算路径长度,但问题是从:a:c有两条路径。我的代码无法区分它们,它将其计算为一个。请帮我按照长度单独打印两条路径。

1 个答案:

答案 0 :(得分:1)

在使用SPARQL的一般情况下,这是不可能的。但是,如果您知道需要访问的某个中间节点,则可以将此部分添加为三重模式的一部分。

另一个可能有用的选项是将两个路径放在不同的命名图中:

@prefix : <http://m/questions/19587520/sparql-path-between-two-instance/> .
GRAPH :path1 {
  :a :z :d.    
  :d :p :e .      
  :e :g :f .    
  :f :l :g .    
  :g :m :h .    
  :h :p :k .    
  :k :p :c .    
  :c :p :v . 
}
GRAPH :path2 {
  :a :p :x.    
  :x :q :y.    
  :y :z :c.    
  :a :l :g .    
  :g :m :h .    
  :h :p :k .
}

然后,您可以将第一个图表的查询表达为:

PREFIX : <http://m/questions/19587520/sparql-path-between-two-instance/>

SELECT DISTINCT ?midI ?p ?midJ
FROM :path1
where {
  VALUES (?begin ?end) { (:a :k) }
  ?begin !:* ?midI .
  ?midI ?p ?midJ .
  ?midJ !:* ?end .
}

这样可以避免两条路径相互交叉。但是,SPARQL中的属性路径不能保证最短路径(或所有路径),只有有一条路径。你也可以计算长度。这里有一个与此问题相关的stackoverflow有用的问题,我建议您查看:Finding all steps in property path