如何在提取的子图上执行 SPARQL 查询(调用服务)?
How to execute SPARQL Query (Call a service) Over extracted subgraph?
我有一个包含多种关系类型的 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 可能支持它。大概有几个方面:在很多情况下,其实没有必要;如果端点支持更新,您可以创建一个新的命名图并将其构造到其中,然后针对它启动第二个查询(这几乎是您所要求的,但分两步进行);这可能是一个非常昂贵的操作,所以端点可能无论如何都会禁用它,即使它是直接支持的。
不过,第一个注意事项通常是不必要的,看来这里可能就是这种情况。
I need to call a service over the graph but filtering out some relations.
在这种情况下,我认为您可以使用 属性 路径查询所需的子图。您可以请求仅由实线和虚线边缘构建的路径,例如:
?s myPref:solid|myPref:dotted ?t
如果你想要它们的任意路径,你可以重复:
?s (myPref:solid|myPref:dotted)+ ?t
如果您在源和目的地之间有唯一的路径,那么您可以使用标准 "count the ways of splitting the path" 技术计算出路径的长度:
select (count(?t) as ?length) {
?s (myPref:solid|myPref:dotted)* ?t
?t (myPref:solid|myPref:dotted)* ?u
}
group by ?s ?t
我有一个包含多种关系类型的 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 可能支持它。大概有几个方面:在很多情况下,其实没有必要;如果端点支持更新,您可以创建一个新的命名图并将其构造到其中,然后针对它启动第二个查询(这几乎是您所要求的,但分两步进行);这可能是一个非常昂贵的操作,所以端点可能无论如何都会禁用它,即使它是直接支持的。
不过,第一个注意事项通常是不必要的,看来这里可能就是这种情况。
I need to call a service over the graph but filtering out some relations.
在这种情况下,我认为您可以使用 属性 路径查询所需的子图。您可以请求仅由实线和虚线边缘构建的路径,例如:
?s myPref:solid|myPref:dotted ?t
如果你想要它们的任意路径,你可以重复:
?s (myPref:solid|myPref:dotted)+ ?t
如果您在源和目的地之间有唯一的路径,那么您可以使用标准 "count the ways of splitting the path" 技术计算出路径的长度:
select (count(?t) as ?length) {
?s (myPref:solid|myPref:dotted)* ?t
?t (myPref:solid|myPref:dotted)* ?u
}
group by ?s ?t