如何在提取的子图上执行SPARQL查询(调用服务)?

如何在提取的子图上执行SPARQL查询(调用服务)?,sparql,rdf,subgraph,Sparql,Rdf,Subgraph,我有一个RDF图,它有几种类型的关系(有相同前缀的关系,也有不同前缀的关系)。我需要通过图调用服务,但过滤掉一些关系 例如: @前缀rdf:。 @前缀myPref:。 @前缀otherPref:。 myPref:1 myPref:标签“1”; myPref:实心myPref:2; myPref:虚线myPref:4; otherPref:虚线myPref:3; otherPref:dashed2 myPref:3。 myPref:2 myPref:标签“2”; myPref:solid myP

我有一个RDF图,它有几种类型的关系(有相同前缀的关系,也有不同前缀的关系)。我需要通过图调用服务,但过滤掉一些关系

例如:

@前缀rdf:。
@前缀myPref:。
@前缀otherPref:。
myPref:1
myPref:标签“1”;
myPref:实心myPref:2;
myPref:虚线myPref:4;
otherPref:虚线myPref:3;
otherPref:dashed2 myPref:3。
myPref:2
myPref:标签“2”;
myPref:solid myPref:3。
myPref:3
myPref:标签“3”。
myPref:4
myPref:标签“4”;
myPref:虚线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 . 
  }
}
前缀rdf:。
前缀myPref:。
前缀otherPref:。
前缀气体:
选择“sp”输出{
厂用气:厂用气{
gas:ProgramGas:gasClass“com.bigdata.rdf.graph.analytics.SSSP”。
gas:myPref中的程序gas:1。
气体:程序气体:目标myPref:3。
气体:程序气体:输出?输出。
气体:程序气体:输出1?sp。
}
}

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

不幸的是,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

不幸的是,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

不幸的是,SPARQL不提供任何查询构造图的功能。我遇到过一些地方,在那里它可以使一些查询变得非常容易。不过,有些端点确实有支持它的扩展。我认为dotNetRDF可能会支持它。(也许RobV可以插话…)谢谢@JoshuaTaylor,所以我想这是不可能的,或者至少是微不足道的。这是一个遗憾,因为它似乎是一个基本的功能(我会说);如果端点支持更新,您可以创建一个新的命名图并构造到其中,然后对其启动第二个查询(这与您要求的差不多,但分两步进行);这可能是一个非常昂贵的操作,因此端点可能会禁用它,即使直接支持它。遗憾的是,SPARQL不提供任何查询构造图的功能。我遇到过一些地方,在那里它可以使一些查询变得非常容易。不过,有些端点确实有支持它的扩展。我认为dotNetRDF可能会支持它。(也许RobV可以插话…)谢谢@JoshuaTaylor,所以我想这是不可能的,或者至少是微不足道的。这是一个遗憾,因为它似乎是一个基本的功能(我会说);如果端点支持更新,您可以创建一个新的命名图并构造到其中,然后对其启动第二个查询(这与您要求的差不多,但分两步进行);这可能是一个非常昂贵的操作,因此端点可能会禁用它,即使直接支持它。