Я хочу получить подграф данного узла с заданной глубиной k level
, как показано на следующем изображении для k = 2.
если я перейду к 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, который может работать с любой базой данных для данного узла.
С уважением Киран
@AKSW: Спасибо за ответ. Просто чтобы понять контекст, если бы я сделал то же самое на Neo4J, используя их запрос Cypher, запрос был бы таким простым. MATCH (c:City)-[1..5:r]-(n) WHERE c.name= "Paris" RETURN c, n, r
Я не вижу, как написать что-то подобное в SPARQL
Верно. Но SPARQL — это не Cypher, не Gremlin и не GraphQL. SPARQL предназначен для RDF, остальные — это языки обхода графов. Все они имеют общие черты, но все они также различны. Есть даже некоторые преобразователи, например. от SPARQL до Gremlin.
Просто чтобы дать вам приблизительное представление: `... где {?город ?p1 ?o1 НЕОБЯЗАТЕЛЬНО {?o1 ?p2 ?o2 НЕОБЯЗАТЕЛЬНО {?o2 ?p3 ?o3} } }`
На самом деле это довольно просто:
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.
}
}
}
}
}
Оператор построения вернет график всех исходящих ссылок из рассматриваемого города, и каждый раз, когда вы возвращаете нуль, эта тройка просто не будет построена.
затем используйте переменные вместо свойств в позиции предиката. И, конечно же, вам нужны вложенные предложения
OPTIONAL
из-за ведущих узлов и литералов, у которых нет исходящих ребер. Ясно, что глубина 5 уже может означать большую часть всего графа. А как насчет входящих ребер, когда у вас есть свойства, используемые в другом направлении? Например, в DBpedia отношениеstarring
идет от фильма к актеру.