Как получить все skos: член данного класса (древовидное представление) - PullRequest
0 голосов
/ 15 мая 2019

Я имею дело с данными из этой конечной точки SPARQL: http://vocab.getty.edu/sparql. Мне нужны некоторые сведения о том, как извлечь все элементы skos: фасета, поддерживающие представление иерархического дерева. Для каждого концепта / суб-концепта у меня также были бы относительные метки, отфильтрованные по языкам @en, @de, @it, @fr.

  1. Я начал извлекать «основную» иерархию, основанную на фасете и связанных skos: member
SELECT DISTINCT ?facet ?concept ?concept_2  
?concept_3 ?concept_4 
?concept_5 
?concept_6 
WHERE {{?facet dc:identifier "300264086"} UNION {
              OPTIONAL {?facet dc:identifier "300264086";
                            skos:member ?concept.}} UNION {
              OPTIONAL {?facet dc:identifier "300264086";
                            skos:member/skos:member ?concept_2}} UNION {
            OPTIONAL{ ?facet dc:identifier "300264086";
                            skos:member/ skos:member ?concept_2. 
                                ?concept_2 skos:member ?concept_3}} UNION {
                    OPTIONAL{?facet dc:identifier "300264086";
                            skos:member/skos:member/skos:member ?concept_3. 
                                ?concept_3 skos:member ?concept_4}} UNION {
                    OPTIONAL{?facet dc:identifier "300264086";
                            skos:member/skos:member/skos:member/skos:member ?concept_4.
                                ?concept_4 skos:member ?concept_5}} UNION {
                    OPTIONAL{?facet dc:identifier "300264086";
                            skos:member/skos:member/skos:member/skos:member/skos:member ?concept_5.
                                ?concept_5 skos:member ?concept_6}}

       }
  1. Затем я сделал шаг вперед, извлекая также субконцепты с метками, отфильтрованными по языкам @en, @de, @it, @fr.
SELECT DISTINCT ?facet ?facet_label_en
        ?concept ?concept_label_en ?concept_label_de ?concept_label_it ?concept_label_fr
        ?concept_2 ?concept_2_label_en ?concept_2_label_de ?concept_2_label_it ?concept_2_label_fr
        ?concept_2a ?concept_2a ?concept_2a_label_en ?concept_2a_label_de ?concept_2a_label_it ?concept_2a_label_fr
        ?concept_2b ?concept_2b ?concept_2b_label_en ?concept_2b_label_de ?concept_2b_label_it ?concept_2b_label_fr
        ?concept_3 ?concept_3_label_en
        ?concept_4 ?concept_4_label_en
        ?concept_5 ?concept_5_label_en
        ?concept_6 ?concept_6_label_en

WHERE {{?facet dc:identifier "300264086".
              OPTIONAL {{ ?facet xl:prefLabel ?facet_labelEN.?facet_labelEN gvp:term ?facet_label_en.} FILTER langMatches(lang(?facet_label_en), "en").}} 

          UNION {
              OPTIONAL {?facet  dc:identifier "300264086";
                                skos:member ?concept. 
                                OPTIONAL {{ ?concept xl:prefLabel ?concept_labelEN.?concept_labelEN gvp:term ?concept_label_en.} FILTER langMatches(lang(?concept_label_en), "en").}
                                OPTIONAL {{ ?concept xl:prefLabel ?concept_labelDE.?concept_labelDE gvp:term ?concept_label_de.} FILTER langMatches(lang(?concept_label_de), "de").}
                                OPTIONAL {{ ?concept xl:prefLabel ?concept_labelIT.?concept_labelIT gvp:term ?concept_label_it.} FILTER langMatches(lang(?concept_label_it), "it").}
                                OPTIONAL {{ ?concept xl:prefLabel ?concept_labelFR.?concept_labelFR gvp:term ?concept_label_fr.} FILTER langMatches(lang(?concept_label_fr), "fr").}}} 

          UNION {
              OPTIONAL {?facet  dc:identifier "300264086";
                                skos:member/skos:member ?concept_2.
                                OPTIONAL {{ ?concept_2 xl:prefLabel ?concept_2_labelEN.?concept_2_labelEN gvp:term ?concept_2_label_en.} FILTER langMatches(lang(?concept_2_label_en), "en").}
                                OPTIONAL {{ ?concept_2 xl:prefLabel ?concept_2_labelDE.?concept_2_labelDE gvp:term ?concept_2_label_de.} FILTER langMatches(lang(?concept_2_label_de), "de").}
                                OPTIONAL {{ ?concept_2 xl:prefLabel ?concept_2_labelIT.?concept_2_labelIT gvp:term ?concept_2_label_it.} FILTER langMatches(lang(?concept_2_label_it), "it").}
                                OPTIONAL {{ ?concept_2 xl:prefLabel ?concept_2_labelFR.?concept_2_labelFR gvp:term ?concept_2_label_fr.} FILTER langMatches(lang(?concept_2_label_fr), "fr").}

                                OPTIONAL {?concept_2 skos:member ?concept_2a.
                                    OPTIONAL {{ ?concept_2a xl:prefLabel ?concept_2a_labelEN.?concept_2a_labelEN gvp:term ?concept_2a_label_en.} FILTER langMatches(lang(?concept_2a_label_en), "en").}
                                    OPTIONAL {{ ?concept_2a xl:prefLabel ?concept_2a_labelDE.?concept_2a_labelDE gvp:term ?concept_2a_label_de.} FILTER langMatches(lang(?concept_2a_label_de), "de").}
                                    OPTIONAL {{ ?concept_2a xl:prefLabel ?concept_2a_labelIT.?concept_2a_labelIT gvp:term ?concept_2a_label_it.} FILTER langMatches(lang(?concept_2a_label_it), "it").}
                                    OPTIONAL {{ ?concept_2a xl:prefLabel ?concept_2a_labelFR.?concept_2a_labelFR gvp:term ?concept_2a_label_fr.} FILTER langMatches(lang(?concept_2a_label_fr), "fr").}
                                OPTIONAL {?concept_2a skos:member ?concept_2b.
                                    OPTIONAL {{ ?concept_2b xl:prefLabel ?concept_2b_labelEN.?concept_2b_labelEN gvp:term ?concept_2b_label_en.} FILTER langMatches(lang(?concept_2b_label_en), "en").}
                                    OPTIONAL {{ ?concept_2b xl:prefLabel ?concept_2b_labelDE.?concept_2b_labelDE gvp:term ?concept_2b_label_de.} FILTER langMatches(lang(?concept_2b_label_de), "de").}
                                    OPTIONAL {{ ?concept_2b xl:prefLabel ?concept_2b_labelIT.?concept_2b_labelIT gvp:term ?concept_2b_label_it.} FILTER langMatches(lang(?concept_2b_label_it), "it").}
                                    OPTIONAL {{ ?concept_2b xl:prefLabel ?concept_2b_labelFR.?concept_2b_labelFR gvp:term ?concept_2b_label_fr.} FILTER langMatches(lang(?concept_2b_label_fr), "fr").}
                                OPTIONAL {?concept_2b skos:member ?concept_2c.
                                OPTIONAL {?concept_2c skos:member ?concept_2d}}}}

                                }} 
          UNION {
              OPTIONAL{ ?facet  dc:identifier "300264086";
                                skos:member/ skos:member ?concept_2. 
                                ?concept_2 skos:member ?concept_3.
                                OPTIONAL {{ ?concept_3 xl:prefLabel ?concept_3_labelEN.?concept_3_labelEN gvp:term ?concept_3_label_en.} FILTER langMatches(lang(?concept_3_label_en), "en").}}} 
          UNION {
              OPTIONAL{?facet   dc:identifier "300264086";
                                skos:member/skos:member/skos:member ?concept_3. 
                                ?concept_3 skos:member ?concept_4.
                                OPTIONAL {{ ?concept_4 xl:prefLabel ?concept_4_labelEN.?concept_4_labelEN gvp:term ?concept_4_label_en.} FILTER langMatches(lang(?concept_4_label_en), "en").}}} 
          UNION {
              OPTIONAL{?facet   dc:identifier "300264086";
                                skos:member/skos:member/skos:member/skos:member ?concept_4.
                                ?concept_4 skos:member ?concept_5.
                                OPTIONAL {{ ?concept_5 xl:prefLabel ?concept_5_labelEN.?concept_5_labelEN gvp:term ?concept_5_label_en.} FILTER langMatches(lang(?concept_5_label_en), "en").}}} 
          UNION {
              OPTIONAL{?facet   dc:identifier "300264086";
                                skos:member/skos:member/skos:member/skos:member/skos:member ?concept_5.
                                ?concept_5 skos:member ?concept_6.
                                OPTIONAL {{ ?concept_6 xl:prefLabel ?concept_6_labelEN.?concept_6_labelEN gvp:term ?concept_6_label_en.} FILTER langMatches(lang(?concept_6_label_en), "en").}}}

       }

Тем не менее, добавление дополнительных под-концепций после 2b (например, 2c / 2d / 3 / 3a / 3b ...) конечной точки SPARQL будет блокировать (я не знаю, является ли это термином corect) запрос (Страница недостижима).

Есть предложения о том, как улучшить / оптимизировать / переписать запрос SPARQL?

Спасибо!

1 Ответ

0 голосов
/ 16 мая 2019

Другой подход заключается в использовании нескольких вложенных блоков OPTIONAL вместо UNION. Таким образом, путь к узлу в дереве является частью решения. Как указал @ASKW, это будет работать только для фиксированной глубины над skos: member (или любым другим переходным свойством).

например. предложите использовать что-то вроде следующего:

SELECT DISTINCT ?facet ?facet_label_en ?hop1 ?hop2 ?hop3 ?hop4 ?hop5 ?hop6
            ?concept ?concept_label_en ?concept_label_de ?concept_label_it ?concept_label_fr
    WHERE {
        ?facet dc:identifier "300264086"
        OPTIONAL {{ ?facet xl:prefLabel ?facet_labelEN.?facet_labelEN gvp:term ?facet_label_en.} FILTER langMatches(lang(?facet_label_en), "en").}
        OPTIONAL {{ ?facet skos:member ?hop1.} union {?facet skos:member ?hop1.
                      OPTIONAL { {?hop1 skos:member ?hop2.} union {?hop1 skos:member ?hop2
                        OPTIONAL { {?hop2 skos:member ?hop3} union {?hop2 skos:member ?hop3
                            OPTIONAL { {?hop3 skos:member ?hop4} union {?hop3 skos:member ?hop4
                                OPTIONAL { {?hop4 skos:member ?hop5} union {?hop4 skos:member ?hop5
                                    OPTIONAL { ?hop5 skos:member ?hop6 }
                        }}
                    }}
                }}
            }}
        }}
        bind (COALESCE(?hop6, ?hop5, ?hop4, ?hop3, ?hop2, ?hop1) as ?concept)
        OPTIONAL {{ ?concept xl:prefLabel ?concept_labelEN.?concept_labelEN gvp:term ?concept_label_en.} FILTER langMatches(lang(?concept_label_en), "en").}
        OPTIONAL {{ ?concept xl:prefLabel ?concept_labelDE.?concept_labelDE gvp:term ?concept_label_de.} FILTER langMatches(lang(?concept_label_de), "de").}
        OPTIONAL {{ ?concept xl:prefLabel ?concept_labelIT.?concept_labelIT gvp:term ?concept_label_it.} FILTER langMatches(lang(?concept_label_it), "it").}
        OPTIONAL {{ ?concept xl:prefLabel ?concept_labelFR.?concept_labelFR gvp:term ?concept_label_fr.} FILTER langMatches(lang(?concept_label_fr), "fr").}

}

Обратите внимание на использование UNION в каждом вложенном OPTIONAL, его целью является включение в результат также промежуточных узлов.

НТН

...