Это изображение моего проекта OpenRefine. Мне нужно извлечь все экземпляры URI skos:CloseMacth из столбца RDF/XML в отдельный столбец в OpenRefine.
Это мой код RDF/XML:
<rdf:RDF xmlns:skos = "http://www.w3.org/2004/02/skos/core#" xmlns:rdf = "http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:rdfs = "http://www.w3.org/1999/02/22-rdf-schema#" xmlns:cs = "http://purl.org/vocab/changeset/schema#" xmlns:skosxl = "http://www.w3.org/2008/05/skos-xl#">
<rdf:Description rdf:about = "http://id.loc.gov/authorities/subjects/sh85145648">
<rdf:type rdf:resource = "http://www.w3.org/2004/02/skos/core#Concept"/>
<skos:prefLabel xml:lang = "en">Water-supply</skos:prefLabel>
<skosxl:altLabel>
<rdf:Description>
<rdf:type rdf:resource = "http://www.w3.org/2008/05/skos-xl#Label"/>
<skosxl:literalForm xml:lang = "en">Availability, Water</skosxl:literalForm>
</rdf:Description>
</skosxl:altLabel>
<skosxl:altLabel>
<rdf:Description>
<rdf:type rdf:resource = "http://www.w3.org/2008/05/skos-xl#Label"/>
<skosxl:literalForm xml:lang = "en">Water availability</skosxl:literalForm>
</rdf:Description>
</skosxl:altLabel>
<skosxl:altLabel>
<rdf:Description>
<rdf:type rdf:resource = "http://www.w3.org/2008/05/skos-xl#Label"/>
<skosxl:literalForm xml:lang = "en">Water resources</skosxl:literalForm>
</rdf:Description>
</skosxl:altLabel>
<skos:closeMatch rdf:resource = "http://www.yso.fi/onto/yso/p9967"/>
<skos:closeMatch rdf:resource = "http://id.worldcat.org/fast/1172350"/>
<skos:closeMatch rdf:resource = "http://www.wikidata.org/entity/Q1061108"/>
<skos:closeMatch rdf:resource = "http://id.worldcat.org/fast/1172350"/>
<skos:closeMatch rdf:resource = "http://www.wikidata.org/entity/Q1061108"/>
<skos:closeMatch rdf:resource = "http://www.yso.fi/onto/yso/p9967"/>
<skos:changeNote>
<cs:ChangeSet>
<cs:subjectOfChange rdf:resource = "http://id.loc.gov/authorities/subjects/sh85145648"/>
<cs:creatorName rdf:resource = "http://id.loc.gov/vocabulary/organizations/dlc"/>
<cs:createdDate rdf:datatype = "http://www.w3.org/2001/XMLSchema#dateTime">1986-02-11T00:00:00</cs:createdDate>
<cs:changeReason rdf:datatype = "http://www.w3.org/2001/XMLSchema#string">new</cs:changeReason>
</cs:ChangeSet>
</skos:changeNote>
<skos:changeNote>
<cs:ChangeSet>
<cs:subjectOfChange rdf:resource = "http://id.loc.gov/authorities/subjects/sh85145648"/>
<cs:creatorName rdf:resource = "http://id.loc.gov/vocabulary/organizations/dlc"/>
<cs:createdDate rdf:datatype = "http://www.w3.org/2001/XMLSchema#dateTime">2016-11-17T07:36:37</cs:createdDate>
<cs:changeReason rdf:datatype = "http://www.w3.org/2001/XMLSchema#string">revised</cs:changeReason>
</cs:ChangeSet>
</skos:changeNote>
</rdf:Description>
</rdf:RDF>
Я попробовал этот код value.parseHtml().select('skos|closematch')
, чтобы добавить столбец на основе столбца RDF/XML, но он не работает.
Каков ваш желаемый результат? Я просто скопировал ваш код в буфер обмена OR и выбрал rdf:Description
в качестве первого элемента XML. Я предполагаю, что код в вашем вопросе - это всего лишь короткий пример, и на самом деле у вас есть несколько rdf:Description
внутри элемента rdf:RDF
(т.е.). Таким образом, вы получаете запись для каждого rdf:Description
.
Это то, что я получаю на панели «Настройка параметров синтаксического анализа»…
И это то, что я получаю, когда я создаю проект и переключаюсь в режим строки.
Является ли третий столбец тем, что вы подразумеваете под этим (?):
все экземпляры skos:CloseMacth URI из столбца RDF/XML в отдельный столбец в OpenRefine.
Если нет, пожалуйста, уточните редактирование вашего вопроса.
Ваш код довольно близок. Вы изучали отображение столбца предварительного просмотра, чтобы помочь вам?
Ваш код возвращает массив из шести элементов XML. Вещи, которые вам не хватает:
forEach()
htmlAttr()
join()
В целом это будет выглядеть так: forEach(value.parseHtml().select('skos|closeMatch'), element, element.htmlAttr('rdf:resource')).join('|')
На самом деле я построил это изнутри, начав с одного элемента:
value.parseHtml().select('skos|closeMatch')[0]
, чтобы увидеть, как это выглядит, а затем добавить .htmlAttr('rdf:resource')
, прежде чем обернуть все это forEach(...).join('|')
(очевидно, вы можете выбрать любой разделитель, который вы считаете наиболее полезным)
Обновление: у ваших данных есть дубликаты, поэтому вы можете добавить .uniques()
, например:
forEach(value.parseHtml().select('skos|closeMatch'), element, element.htmlAttr('rdf:resource')).uniques().join('|')
Очень хороший ответ! Небольшой вопрос: откуда вы знаете, что вместо skos:closeMatch
двоеточие должно быть заменено на |
, а 'rdf:resource' может пройти как есть? Я искал это, не мог найти.
Я не уверен, что имена атрибутов поддерживают пространство имен. Литеральная строка была первым, что я попробовал, и это сработало, поэтому я не стал искать альтернативы.
Спасибо за ответ на мой вопрос. но этот RDF/XML не весь мой проект. На самом деле, у меня есть столбец в моем проекте openRefine, который содержит код rdf/xml (я вставил изображение в вопрос), и мне нужно извлечь экземпляры skos:closeMatch в другой столбец в этом проекте. Третий столбец, который у вас есть, это то, что я хочу, но не в новом проекте.