2015-07-19 2 views
2

Я использую этот пост, чтобы родители или потомство одного узла RDF: SPARQL query to get all parent of a nodeSPARQL, чтобы получить все родитель всех узлов

Это прекрасно работает на моем виртуозном сервере. К сожалению, не удалось найти общедоступную конечную точку, содержащую данные с аналогичной структурой.

prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> 
prefix bto: <http://purl.obolibrary.org/obo/> 
select (group_concat(distinct ?midlab ; separator = "|") AS ?lineage) 
where 
{ 
    bto:BTO_0000207 rdfs:subClassOf* ?mid . 
    ?mid rdfs:subClassOf* ?class . 
    ?mid rdfs:label ?midlab . 
} 
group by ?lineage 
order by (count(?mid) as ?ordercount) 

давая

+---------------------------------------------------------+ 
|       lineage       | 
+---------------------------------------------------------+ 
| bone|cartilage|connective tissue|tibia|tibial cartilage | 
+---------------------------------------------------------+ 

Тогда я подумал, если я мог бы получить линию для всех узлов путем изменения выбора для

select ?s (group_concat(distinct ?midlab ; separator = "|") AS ?lineage) 

и первая строка в заявлении, куда

?s rdfs:subClassOf* ?mid . 

Те, у кого больше опыта SPARQL, чем я, вероятно, не удивятся, что тайм-аут запроса.

Это разумный подход? Я что-то неправильно делаю синтаксически?

Я подозреваю, что отчетливая ключевое слово или положение группы являются узкие места, потому что это только занимает второе или два:

prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> 
prefix bto: <http://purl.obolibrary.org/obo/> 
select ?s ?midlab 
where 
{ 
    ?s rdfs:subClassOf* ?mid . 
    ?mid rdfs:subClassOf* ?class . 
    ?mid rdfs:label ?midlab . 
    ?s <http://www.geneontology.org/formats/oboInOwl#hasOBONamespace> "BrendaTissueOBO"^^<http://www.w3.org/2001/XMLSchema#string> . 
} 

ответ

2

Ваш первый запрос не является законным. Вы можете проверить на sparql.org's query validator. В то время как вы можете заказать по счету (? Mid), вы не можете привязать значение к переменной и заказать им в том же предложении. Это даст вам:

select (group_concat(distinct ?midlab ; separator = "|") AS ?lineage) 
where 
{ 
    bto:BTO_0000207 rdfs:subClassOf* ?mid . 
    ?mid rdfs:subClassOf* ?class . 
    ?mid rdfs:label ?midlab . 
} 
group by ?lineage 
order by count(?mid) 

Теперь это правовой, но это не делает столь много смысла. group_concat требует, чтобы у вас было несколько групп, и что вы будете делать конкатенацию для значений внутри каждой группы. В отсутствие группы по условию вы получаете неявную группу, поэтому group_concat без группы в порядке. Но у вас есть группа ? Lineage, которая не имеет большого смысла, потому что ? Lineage уже имеет только одно значение для каждой группы (так как это уже совокупность). Лучше было бы группа от?, как в следующем. Это кажется более правильным, и может не быть тайм-аут:

select ?s (group_concat(distinct ?midlab ; separator = "|") AS ?lineage) 
where 
{ 
    ?s rdfs:subClassOf* ?mid . 
    ?mid rdfs:subClassOf* ?class . 
    ?mid rdfs:label ?midlab . 
} 
group by ?s 
order by count(?mid) 
+0

Это выглядит очень многообещающим. Я добавил предложение from и изменил порядок на «(count (? Mid) как« midcount ») и получил разумный результат. –

+2

@MarkMiller 'порядок (... как ...)' ** не является законным **. Virtuoso может принять его (он принимает несколько нестандартных синтаксисов), но это не законный SPARQL. Если вам когда-либо понадобится запустить ваш запрос с другой конечной точкой, очень вероятно, что он ** не будет работать **. Вы можете 'select (count (mid) как? Midcount) {...} order by? Midcount', и вы можете' select ... {...} упорядочить по счету (? Mid) ', но вы можете 't 'select ... {...} упорядочить по (count (? mid) как? midcount)'. Форма связывания переменных '(... as ...)' не является законной по порядку ... .... (Однако * * законно в 'group by.) –

+0

Я очень ценю ваши отзывы и извиняюсь за то, что вы не учились более внимательно. Я также использую Jena ad для оценки MarkLogic, поэтому лучшие практики важны для меня. «порядок по счету (?mid) «поднял» Virtuoso 37000 Ошибка SP030: компилятор SPARQL, строка 12: синтаксическая ошибка в '(' before '? mid' "Просто вставляя ее в круглые скобки без AS, она работает и передает validatior. –