Запрос SPARQL для получения подграфа узлов на уровне n

Я хочу получить подграф данного узла с заданной глубиной k level, как показано на следующем изображении для k = 2.

Запрос SPARQL для получения подграфа узлов на уровне n

если я перейду к https://dbpedia.org/sparql и выберу ?city, я хочу получить все детали графа города, скажем, 5 уровней. Я ищу общий запрос, которому не нужно знать график для получения данных, как показано ниже.

CONSTRUCT {
  ?city a ?plebs .
  ?mayor foaf:gender ?gender.
  ?city dbo:country ?ctr .
  ?city dbo:populationTotal ?pop.
  ?city dbo:leaderParty ?party .
  ?city rdfs:label ?cityName .
  ?party dbo:ideology ?ideology 
} WHERE {
   ?plebs rdfs:subClassOf dbo:Settlement.
   ?city a ?plebs .
   ?city (dbp:mayor | dbo:mayor | dbp:leader |dbo:leader | dbo:leaderName) ?mayor .
   ?mayor foaf:gender ?gender.
   ?city dbo:populationTotal ?pop .
   ?city rdfs:label ?cityName .
   ?city dbo:country ?ctr .
   ?city dbo:leaderParty ?party .
   ?party dbo:ideology ?ideology .
   FILTER(str(?gender) = "female")
  }
ORDER BY DESC(?pop) 

Может кто-нибудь помочь мне с общим запросом SPARQL, который может работать с любой базой данных для данного узла.

С уважением Киран

затем используйте переменные вместо свойств в позиции предиката. И, конечно же, вам нужны вложенные предложения OPTIONAL из-за ведущих узлов и литералов, у которых нет исходящих ребер. Ясно, что глубина 5 уже может означать большую часть всего графа. А как насчет входящих ребер, когда у вас есть свойства, используемые в другом направлении? Например, в DBpedia отношение starring идет от фильма к актеру.

UninformedUser 30.05.2019 21:17

@AKSW: Спасибо за ответ. Просто чтобы понять контекст, если бы я сделал то же самое на Neo4J, используя их запрос Cypher, запрос был бы таким простым. MATCH (c:City)-[1..5:r]-(n) WHERE c.name= "Paris" RETURN c, n, r Я не вижу, как написать что-то подобное в SPARQL

Kiran 31.05.2019 04:31

Верно. Но SPARQL — это не Cypher, не Gremlin и не GraphQL. SPARQL предназначен для RDF, остальные — это языки обхода графов. Все они имеют общие черты, но все они также различны. Есть даже некоторые преобразователи, например. от SPARQL до Gremlin.

UninformedUser 31.05.2019 07:22

Просто чтобы дать вам приблизительное представление: `... где {?город ?p1 ?o1 НЕОБЯЗАТЕЛЬНО {?o1 ?p2 ?o2 НЕОБЯЗАТЕЛЬНО {?o2 ?p3 ?o3} } }`

UninformedUser 31.05.2019 07:24
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
4
466
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

На самом деле это довольно просто:

construct {

?s ?p ?o.
?o ?op ?oo.
?oo ?oop ?ooo.
?ooo ?ooop ?oooo.
?oooo ?oooop ?ooooo.
}
where {
bind(city:_London as ?s)
?s ?p ?o.
optional {
   ?o ?op ?oo.
   optional {
      ?oo ?oop ?ooo.
       optional {
          ?ooo ?ooop ?oooo.
          optional {
              ?oooo ?oooop ?ooooo.
           }
        }
     }
  }
}

Оператор построения вернет график всех исходящих ссылок из рассматриваемого города, и каждый раз, когда вы возвращаете нуль, эта тройка просто не будет построена.

Другие вопросы по теме