我的数据分别表示从:a
到:v
和k
的两条路径如下:
@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
有两条路径。我的代码无法区分它们,它将其计算为一个。请帮我按照长度单独打印两条路径。
答案 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。