Как выполнить запрос SPARQL (вызов службы) по извлеченному подграфу?

У меня есть граф 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 . 
  }
}

Как я могу извлечь подграф, содержащий только те ссылки, которые мне нужны (пунктирные и сплошные), и запустить сервисный вызов для извлеченного подграфа?


person antorqs    schedule 25.04.2016    source источник
comment
К сожалению, SPARQL не предоставляет никаких функций для запроса построенного графа. Я сталкивался с местами, где это могло бы сделать некоторые запросы очень простыми. Однако некоторые конечные точки имеют расширения для его поддержки. Я думаю, что dotNetRDF может его поддерживать. (Может быть, РобВ вмешается...)   -  person Joshua Taylor    schedule 25.04.2016
comment
Спасибо @JoshuaTaylor, так что я думаю, что это невозможно или, по крайней мере, тривиально. Это позор, потому что это кажется базовой функциональностью (я бы сказал).   -  person antorqs    schedule 26.04.2016
comment
Вероятно, есть несколько аспектов: во многих случаях это на самом деле не нужно; если конечная точка поддерживает обновления, вы можете создать новый именованный граф и построить его, а затем запустить второй запрос к нему (что в значительной степени то, о чем вы просите, но в два этапа); это может быть очень дорогостоящей операцией, поэтому конечные точки все равно могут отключить ее, даже если она напрямую поддерживается.   -  person Joshua Taylor    schedule 26.04.2016


Ответы (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
person Joshua Taylor    schedule 26.04.2016