Я пытаюсь извлечь всех родителей каждого данного GO Id (узла), используя EBI-RDF sparql конечная точка , я был основан на этом двух похожих вопросов для формулирования запроса, вот два примера, иллюстрирующих проблему:
Пример 1 ( Ссылка на структуру ):
biological_process (GO:0008150)
|__ metabolic process (GO:0008152)
|__ methylation (GO:0032259)
В этом примере, используя следующий запрос:
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX owl: <http://www.w3.org/2002/07/owl#>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
PREFIX dc: <http://purl.org/dc/elements/1.1/>
PREFIX dcterms: <http://purl.org/dc/terms/>
PREFIX dbpedia2: <http://dbpedia.org/property/>
PREFIX dbpedia: <http://dbpedia.org/>
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX skos: <http://www.w3.org/2004/02/skos/core#>
PREFIX obo: <http://purl.obolibrary.org/obo/>
SELECT (count(?mid) as ?depth)
(group_concat(distinct ?midId ; separator = " / ") AS ?treePath)
FROM <http://rdf.ebi.ac.uk/dataset/go>
WHERE {
obo:GO_0032259 rdfs:subClassOf* ?mid .
?mid rdfs:subClassOf* ?class .
?mid <http://www.geneontology.org/formats/oboInOwl#id> ?midId.
}
GROUP BY ?treePath
ORDER BY ?depth
Я получил желаемые результаты без проблем:
c | treePath
--|-------------------------------------
6 | GO:0008150 / GO:0008152 / GO:0032259
Но когда термин существует в нескольких ветвях (например, GO:0007267
), как и в случае ниже, предыдущий подход не работал:
Пример 2 ( Ссылка на структуру )
biological_process (GO:0008150)
|__ cellular_process (GO:0009987)
| |__ cell communication (GO:0007154)
| |__ cell-cell signaling (GO:0007267)
|
|__ signaling (GO:0023052)
|__ cell-cell signaling (GO:0007267)
Результат:
c | treePath
--|---------------------------------------------------------------
15| GO:0007154 / GO:0007267 / GO:0008150 / GO:0009987 / GO:0023052
Я хотел получить следующее:
GO:0008150 / GO:0009987 / GO:0007154 / GO:0007267
GO:0008150 / GO:0023052 / GO:0007267
Я понял, что под капотом я вычисляю глубинукаждый уровень и использование его для построения пути, это прекрасно работает, когда у нас есть элемент, принадлежащий только одной ветви.
SELECT (count(?mid) as ?depth) ?midId
FROM <http://rdf.ebi.ac.uk/dataset/go>
WHERE {
obo:GO_0032259 rdfs:subClassOf* ?mid .
?mid rdfs:subClassOf* ?class .
?mid <http://www.geneontology.org/formats/oboInOwl#id> ?midId.
}
GROUP BY ?midId
ORDER BY ?depth
Результат:
depth | midId
------|------------
1 | GO:0008150
2 | GO:0008152
3 | GO:0032259
Во втором примере все пропущено, и я не понял, почему, во всяком случае, я уверен, что частью проблемы являются термины, которые имеют одинаковую глубину / уровень, но я не знаю, как можноЯ решаю это.
depth | midId
------|------------
2 | GO:0008150
2 | GO:0009987
2 | GO:0023052
3 | GO:0007154
6 | GO:0007267