Имя столбца с пробелами в tarql

Я использую tarql (https://github.com/tarql/tarql) — использует синтаксис sparql — для преобразовать данные CSV в тройки RDF.

У меня есть имя столбца "веб-сайт". Как я могу привязать переменную с помощью функции BIND? Я пробовал много способов, но не нашел решения:

BIND (?web site AS ?homepage)
BIND (?"web site" AS ?homepage)
BIND (?'web site' AS ?homepage)
BIND (?web\ site AS ?homepage)

Все приводит к ошибке синтаксического анализа.


person H.W.    schedule 30.10.2016    source источник
comment
Согласно github. com/tarql/tarql/blob/master/src/main/java/org/deri/tarql/ должно быть подчеркивание, то есть BIND (?web_site AS ?homepage) . Это работает для вас?   -  person UninformedUser    schedule 30.10.2016
comment
Да, и я могу избежать ','?   -  person H.W.    schedule 30.10.2016
comment
Что ты имеешь в виду? Запятая в названии столбца? Если вы посмотрите исходный код (github.com/tarql/tarql/blob/master/src/main/java/org/deri/tarql/), пробел, дефис и вопросительный знак будут заменены символ подчеркивания, все остальные зависят от того, может ли Apache Jena анализировать строку. Но есть еще запись FIXME, т.е. некоторые символы могут быть запрещены.   -  person UninformedUser    schedule 30.10.2016
comment
Да, я имею в виду заголовок, например: столбец 1; столбец 2; столбец 3 и что-то для столбца 3; столбец 4.   -  person H.W.    schedule 30.10.2016
comment
Учитывая, что разделителем является ;, строкой для преобразования в переменную будет столбец3 и что-то в столбец3. В результате получится column3,_and_something_to_column3 по строке replace. Я не знаю, может ли Var.alloc из Apache Jena разобрать эту строку. Однако вы должны получить исключение, если это не сработает.   -  person UninformedUser    schedule 30.10.2016


Ответы (1)


Когда вам приходится иметь дело со сложными ситуациями, я предлагаю: сначала попробуйте исследовательские тесты; Давайте посмотрим на примере:

предположим, что ваш исходный файл данных: ./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  |
-------------------------------------------------------------------------------

Примечание

  1. справочные документы: Строка заголовка, разделители, кавычки и кодировка символов в файлах CSV/TSV указывает все возможные способы и комбинации чтобы выразить варианты: это хорошая ценность для чтения.

  2. другой полезной ссылкой может быть: Возможные имена для переменных в SPARQL 1.1. Язык запросов

person Franco Rondini    schedule 31.10.2016