【问题标题】:How to execute SPARQL Query (Call a service) Over extracted subgraph?如何在提取的子图上执行 SPARQL 查询(调用服务)?
【发布时间】:2023-03-14 16:35:01
【问题描述】:

我有一个包含多种关系类型的 RDF 图(具有相同前缀和不同前缀的关系)。我需要通过图表调用服务,但过滤掉一些关系。

示例:

@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>.
@prefix myPref: <http://www.myPref.com/>.
@prefix otherPref: <http://www.otherPref.com/>.

myPref:1
    myPref:label "1" ;
    myPref:solid myPref:2 ;
    myPref:dotted myPref:4 ;
    otherPref:dashed myPref:3 ;
    otherPref:dashed2 myPref:3 .

myPref:2
    myPref:label "2" ;
    myPref:solid myPref:3 .

myPref:3
    myPref:label "3" .

myPref:4
    myPref:label "4" ;
    myPref:dotted myPref:3 .

我想在仅包含实线和点状关系的提取子图上运行服务调用(在这种特殊情况下,运行一个计算 1 到 3 之间最短路径的服务,我想排除那些直接链接) .

我像这样运行服务(在整个图表上):

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>.
PREFIX myPref: <http://www.myPref.com/>.
PREFIX otherPref: <http://www.otherPref.com/>.
PREFIX gas: <http://www.bigdata.com/rdf/gas#>

SELECT ?sp ?out {
  SERVICE gas:service {
     gas:program gas:gasClass "com.bigdata.rdf.graph.analytics.SSSP" .
     gas:program gas:in myPref:1 .
     gas:program gas:target myPref:3 . 
     gas:program gas:out ?out . 
     gas:program gas:out1 ?sp . 
  }
}

如何提取仅包含我想要的链接(虚线和实线)的子图并在提取的子图上运行服务调用?

【问题讨论】:

  • 不幸的是,SPARQL 不提供任何查询构造图的功能。我遇到过可以让一些查询非常变得容易的地方。不过,一些端点确实有支持它的扩展。我认为 dotNetRDF 可能支持它。 (也许 RobV 可以加入...)
  • 感谢@JoshuaTaylor,所以我想这是不可能的,或者至少是微不足道的。很遗憾,因为它似乎是一项基本功能(我想说)。
  • 可能有几个方面:在很多情况下,实际上没有必要;如果端点支持更新,您可以创建一个新的命名图并在其中构建,然后针对它启动第二个查询(这几乎是您所要求的,但分两个步骤);这可能是一项非常昂贵的操作,因此即使直接支持,端点也可能会禁用它。

标签: sparql rdf subgraph


【解决方案1】:

遗憾的是,SPARQL 不提供任何查询构造图的功能。我遇到过可以使一些查询变得非常容易的地方。不过,一些端点确实有支持它的扩展。我认为 dotNetRDF 可能支持它。可能有几个方面:在许多情况下,实际上没有必要;如果端点支持更新,您可以创建一个新的命名图并在其中构建,然后针对它启动第二个查询(这几乎是您所要求的,但分两个步骤);这可能是一项非常昂贵的操作,因此即使直接支持,端点也可能会禁用它。

不过,第一个注意事项是,它通常有时是不必要的,但这里可能就是这种情况。

我需要通过图表调用服务,但过滤掉一些关系。

在这种情况下,您可以通过使用属性路径来查询您想要的子图。您可以要求仅由实线和虚线边缘构建的路径,例如:

?s  myPref:solid|myPref:dotted ?t

如果你想要它们的任意路径,你可以重复它:

?s  (myPref:solid|myPref:dotted)+ ?t

如果您在源和目标之间有唯一的路径,那么您可以使用标准的“计算路径拆分方式”技术来计算路径的长度:

select (count(?t) as ?length) {
  ?s  (myPref:solid|myPref:dotted)* ?t
  ?t  (myPref:solid|myPref:dotted)* ?u
}
group by ?s ?t

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-02
    相关资源
    最近更新 更多