Когда вам приходится иметь дело со сложными ситуациями, я предлагаю: сначала попробуйте исследовательские тесты; Давайте посмотрим на примере:
предположим, что ваш исходный файл данных: ./table/table.csv
, который содержит:
main index;web site;title, to translate
1;"ciao.ronda.com";"this is the first"
2;"miao.ronda.it";"this is the second"
3;"bao.ronda.uk";"this is the third"
шаг 1: исследовательский тестовый запрос qstar.sparql
:
SELECT *
FROM <file:table.csv#delimiter=%3B;>
WHERE {}
LIMIT 100
пример ланчера:
#!/bin/bash -
table=./data/table.csv
query=./data/qstar.sparql
./bin/tarql --test --delimiter \; --header-row --verbose ${query} ${table}
результат:
$ ./launcher0.sh
--------------------------------------------------------
| main_index | web_site | title,_to_translate |
========================================================
| "1" | "ciao.ronda.com" | "this is the first" |
| "2" | "miao.ronda.it" | "this is the second" |
| "3" | "bao.ronda.uk" | "this is the third" |
--------------------------------------------------------
Итак, теперь мы знаем, что третий столбец имя переменной, вычисляемый с этими параметрами, выглядит следующим образом: title,_to_translate
Шаг 2: проверьте, поддерживается ли синтаксис оператора BIND с именем переменной доходов ( title,_to_translate
в нашем примере)
здесь нам нужен пример запроса на основе BIND
, чтобы понять проблему; предположим, что это запрос, в котором мы пытаемся использовать поле с именем: ?title,_to_translate
SELECT ?homepage ?uri ?title_with_language_tag
WHERE {
BIND (?web_site AS ?homepage)
BIND (URI(CONCAT('http://website.com/ns#', ?main_index)) AS ?uri)
BIND (STRLANG(?title,_to_translate, 'en') AS ?title_with_language_tag)
}
результат:
$ ./launcher0.sh
com.hp.hpl.jena.query.QueryParseException: Lexical error at line 5, column 27. Encountered: "t" (116), after : "_"
at org.deri.tarql.TarqlParser.parse(TarqlParser.java:113)
Короче говоря, этот запрос содержит лексическую ошибку, которая не поддерживается ena.query.QueryParser
В таких случаях, вместо того, чтобы продолжать бороться с языком, я предпочитаю использовать небольшой обходной путь.
шаг 3: решение с небольшим обходным путем
давайте воспользуемся вариантом -H --no-header-row CSV file has no header row; use variable names ?a, ?b, ...
и насладимся простым решением; все, что нам нужно сделать, это удалить первую строку заголовка из содержимого нашего исходного файла данных (это простая задача, которую вы можете передать в процесс или сделать так, как вы предпочитаете) для удобства тестирования я скопировал данные без первого столбца в ./data/table0-noheader.csv
.
теперь один и тот же запрос стал проще для парсера; ./data/query0.sparql
:
SELECT ?homepage ?uri ?title_with_language_tag
WHERE {
BIND (?a AS ?homepage)
BIND (URI(CONCAT('http://website.com/ns#', ?b)) AS ?uri)
BIND (STRLANG(?c, 'en') AS ?title_with_language_tag)
}
пусковая установка-noheader.sh:
!/bin/bash -
table=./data/table0-noheader.csv
query=./data/query0.sparql
./bin/tarql --test --no-header-row --delimiter \; --header-row --verbose ${query} ${table}
результат:
$ ./launcher-noheader.sh
-------------------------------------------------------------------------------
| homepage | uri | title_with_language_tag |
===============================================================================
| "1" | <http://website.com/ns#ciao.ronda.com> | "this is the first"@en |
| "2" | <http://website.com/ns#miao.ronda.it> | "this is the second"@en |
| "3" | <http://website.com/ns#bao.ronda.uk> | "this is the third"@en |
-------------------------------------------------------------------------------
Примечание
справочные документы: Строка заголовка, разделители, кавычки и кодировка символов в файлах CSV/TSV указывает все возможные способы и комбинации чтобы выразить варианты: это хорошая ценность для чтения.
другой полезной ссылкой может быть: Возможные имена для переменных в SPARQL 1.1. Язык запросов
person
Franco Rondini
schedule
31.10.2016
BIND (?web_site AS ?homepage)
. Это работает для вас? - person UninformedUser   schedule 30.10.2016;
, строкой для преобразования в переменную будет столбец3 и что-то в столбец3. В результате получится column3,_and_something_to_column3 по строкеreplace
. Я не знаю, может лиVar.alloc
из Apache Jena разобрать эту строку. Однако вы должны получить исключение, если это не сработает. - person UninformedUser   schedule 30.10.2016