SPARQL查询以从给定的根目录步行路径

时间:2018-12-11 20:47:23

标签: sparql rdf semantic-web

什么SPARQL语法允许指定根节点,同时消耗从该节点到给定限制的关系路径。

例如

<div id=‘mainPanel’> <span id=‘ChartLabel’> <div class=’highchairs-container’ id=‘highchairs-0’> <svg> <g class=‘highcharts-grid’></g> <g class=‘highcharts-grid’></g> <g class=‘highcharts-axis’></g> <g class=‘highcharts-axis’></g> <g class=‘highcharts-series-group’></g> <g class=‘highcharts-button’></g> <text class=‘highcharts-title’> <tspan>Deale: Przypisania</tspan> </text> <g class=‘highcharts-legend’></g> <g class=‘highcharts-axis-labels highchairs-taxis-labels’></g> <g class=‘highcharts-grid axis-labels highcharts-yaxis-labels’></g> <g class=‘highcharts-tooltip’></g> </svg> </div> </span> </div> 是人体部位的解剖图。

Graph1

k_anatomy:K403 a k:Anatomy ; rdfs:label "Finger" ; k_anatomy:has_parent k_anatomy:K393 . k_anatomy:K393 a k:Anatomy ; rdfs:label "Hand" ; k_anatomy:has_parent k_anatomy:K370 . k_anatomy:K370 a k:Anatomy ; rdfs:label "Free Upper Limb" ; k_anatomy:has_parent k_anatomy:K359 . k_anatomy:K359 a k:Anatomy ; rdfs:label "Upper Limb" ; k_anatomy:has_parent k_anatomy:K358 . k_anatomy:K358 a k:Anatomy ; rdfs:label "Limb" ; k_anatomy:has_parent k_anatomy:K2 . k_anatomy:K2 a k:Anatomy ; rdfs:label "Body_by_region" ; k_anatomy:has_parent k_anatomy:K1 . k_anatomy:K1 a k:Anatomy ; rdfs:label "Body" ; k_anatomy:has_parent k_anatomy:K0 . root (rdfs:标签为“手指”)

问题

给定IRI = k_anatomy:K403和关系k_anatomy:K403的SPARQL查询将构成以下结果:

k_anatomy:has_parent

1 个答案:

答案 0 :(得分:1)

无需为此指定根节点。此查询:

SELECT ?BodyPart ?PartOf
WHERE { 
    ?S rdfs:label ?BodyPart;
       k_anatomy:has_parent [ rdfs:label ?PartOf ]. 
} 

可以解决问题。

我只是在本地RDF4J控制台上运行了它。输出:

Evaluating SPARQL query...
+-------------------------------------+-------------------------------------+
| BodyPart                            | PartOf                              |
+-------------------------------------+-------------------------------------+
| "Finger"                            | "Hand"                              |
| "Hand"                              | "Free Upper Limb"                   |
| "Free Upper Limb"                   | "Upper Limb"                        |
| "Upper Limb"                        | "Limb"                              |
| "Limb"                              | "Body_by_region"                    |
| "Body_by_region"                    | "Body"                              |
+-------------------------------------+-------------------------------------+
6 result(s) (36 ms)

一个警告:这里的解决方案顺序是任意的,它恰好与您的预期结果吻合,因为在这种情况下,RDF4J引擎只是将结果按原始文件中出现的顺序倒退-但是不能保证每次都会发生这种情况,当然也不能跨三重存储实现。

更新,如果您的商店包含的数据不仅仅是您提供的输入文件,那么要获得所需的结果,您将需要一个稍微复杂一些的查询。具体来说,您将需要使用所谓的“ property path”表达式。这允许您指定要从某个点开始的任意长度的路径。像这样:

SELECT ?BodyPart ?PartOf
WHERE { 
     k_anatomy:K393 k_anatomy:has_parent* ?S .
     ?S rdfs:label ?BodyPart;
        k_anatomy:has_parent [ rdfs:label ?PartOf ].  
} 

您仍然希望身体部分与父母同在(因此查询的最后一部分与原始查询相同),但是现在我们通过属性路径添加了一个额外的约束,以说?S的值必须通过长度为零或更大的路径通过K393关系链接到has_parent

结果:

Evaluating SPARQL query...
+-------------------------------------+-------------------------------------+
| BodyPart                            | PartOf                              |
+-------------------------------------+-------------------------------------+
| "Hand"                              | "Free Upper Limb"                   |
| "Free Upper Limb"                   | "Upper Limb"                        |
| "Upper Limb"                        | "Limb"                              |
| "Limb"                              | "Body_by_region"                    |
| "Body_by_region"                    | "Body"                              |
+-------------------------------------+-------------------------------------+
5 result(s) (6 ms)

如您所见,它没有按预期结果列出“手指”-尽管当然只有在has_parent关系不形成循环的情况下,它才能正常工作。