2017-02-08 7 views
0

Мне нужно найти длину пути между любыми двумя узлами графа Dbpedia, если между ними существует какая-либо связь. В этот момент мне известны только начальные и конечные узлы, а связанные пути свойств неизвестны. Таким образом, я пытаюсь написать SPARQL запрос типа:Найти длину пути между двумя узлами сети граф Dbpedia, не зная путь базового свойства

PREFIX dbo:<http://dbpedia.org/ontology/> 
PREFIX dbp:<http://dbpedia.org/property/> 

select dbp:Video dbo:VideoGame (count(?mid) as ?length) 
where { 
    dbp:Video (<>|!<>)* ?mid . 
    ?mid (<>|!<>)+ dbo:VideoGame . 
} 
group by dbp:Video dbo:VideoGame 

Здесь я хочу найти длину пути между Видео и видеоигру. Но он дает ошибку, например:

syntax error at 'dbo:VideoGame' before '}'

Может кто-нибудь помочь написать правильный?

ответ

2

Ошибка сообщения может быть неправильной. Одна из проблем, которую я вижу, заключается в том, что вы не можете выбирать константы, а только переменные. Вы можете попробовать некоторые операторы связывания, чтобы превратить их в переменные:

PREFIX dbo:<http://dbpedia.org/ontology/> 
PREFIX dbp:<http://dbpedia.org/property/> 

select ?vid ?vidGame (count(?mid) as ?length) 
where { 
    BIND(dbp:Video AS ?vid) 
    BIND(dbo:VideoGame AS ?vidGame) 
    ?vid (<>|!<>)* ?mid . 
    ?mid (<>|!<>)+ ?vidGame . 
} 
group by ?vid ?vidGame 
+0

Теперь он дает другую ошибку: ** Виртуоз TN 42000 Ошибка ...: Превышен 1000000000 байт в транзитивной временную память. используйте t_distinct, t_max или больше параметров T_MAX_memory, чтобы ограничить поиск или увеличить пул ** –

+0

Когда я пытаюсь запустить этот запрос с https://dbpedia.org/sparql, он дает ошибку: ** Virtuoso 37000 Error SP031 : SPARQL-компилятор: список возвращаемых значений содержит '*', но шаблон не содержит переменных **. Может ли кто-нибудь помочь? –

+0

Вы можете попробовать использовать LIMIT для предотвращения превышения байта. Что касается ошибки Virtuoso, вы можете проверить ее у поставщика. – scotthenninger