Разобрать необходимую пропускную способность из FCC-указателя в SPARQL/SPIN?

Мне нужно проанализировать довольно загадочный указатель эмиссии FCC, используя SPARQL/SPIN, из составной строковой кодировки в значения, которые я легко могу аргументировать. Первая задача - получить "требуемую пропускную способность" из обозначения. Вот примеры того, как выглядят обозначения выбросов (доступно как xsd:string значения) и соответствующие требуемые полосы пропускания, вручную интерпретировал мой маленький старый я:

  • 16K00F3E 16,00 кГц или 16 000,0 Гц
  • 3K00J3E 3,00 кГц или 3000,0 Гц
  • 1K10F1B 1,10 кГц или 1100,0 Гц
  • 100H00A1A 100,00 Гц
  • 10M0G2D 10,0 МГц или 10 000 000,00 Гц

В конечном итоге я хочу добраться до xsd:double значения в Гц, но в настоящее время я застрял на первом шаге, получая подстроку необходимой полосы пропускания из всей строки указателя излучения.

Регулярное выражение^[0-9]+[A-Z][0-9]+ делает трюк для этого первого шага. Например, это регулярное выражение применяется к указателю выбросов 10M0G2D Матчи 10M0,

Требуемая подстрока полосы пропускания, которую я хочу, на практике, переменной длины. У него есть набор цифр, буква (см. Ниже), а затем еще один набор цифр. Буква отмечает десятичную точку и определяет множитель:

  • H - Если значение меньше 1000 Гц (множитель равен 1,0)
  • K - от 1 кГц до значений менее 1000 кГц (множитель 1000,0)
  • M - 1 МГц до значений менее 1000 МГц (множитель 1 000 000,0)
  • G - 1 ГГц или выше (множитель 1 000 000 000,0)

Затем следует еще одна буква, которая выходит за пределы необходимой пропускной способности.

Итак, мой вопрос, в SPARQL/SPIN, как мне получить подстроку требуемой полосы пропускания, как определено в приведенном выше регулярном выражении, проанализированную из строки указателя излучения? Я хочу связать эту подстроку с переменной SPARQL, скажем, ?encodedRequiredBandwidth, Единственное использование регулярного выражения, которое я вижу в SPARQL/SPIN, это xsd:boolean REGEX (simple literal text, simple literal pattern), Это здорово, но я хочу, чтобы подстрока соответствовала регулярному выражению, а не флаг, указывающий, что он где-то там.

Любые идеи о том, как получить мою необходимую подстроку пропускной способности?

Любые идеи о том, как до конца разбора добраться до xsd:double Значение Гц, которое я могу легко переосмыслить (например, сравнение величин)?

Благодарю.

2 ответа

Я нашел способ обойти это, основываясь на том факте, что последние три символа указателя излучения стабильны, имеют фиксированную ширину. Таким образом, я могу использовать комбинацию строковых функций для анализа необходимой пропускной способности. Следующий простой запрос иллюстрирует использование строковых функций:

SELECT DISTINCT *
WHERE
{
  BIND("100H00F1B"^^xsd:string AS ?emissionDesignator) .
  BIND(strlen(?emissionDesignator) AS ?edLength) .
  BIND(substr(?emissionDesignator, ?edLength - 2, 3) AS ?useCodes) .
  BIND(strbefore(?emissionDesignator, ?useCodes) AS ?encodedBandwidth) .
}

Так что теперь моя закодированная подстрока полосы пропускания заканчивается int ?encodedBandwidth,

введите описание изображения здесь

Шаг первый, но мой ответ зависит от особенностей формата, фиксированной ширины последних 3 символов строки. Теперь мне нужно выяснить, как разобрать частоту в xsd:double значение в Гц. Я напишу снова, когда / если я выясню это, если это будет полезно для кого-то еще.

Теперь у меня также есть уродливый код SPARQL, чтобы завершить преобразование пропускной способности в xsd:double, Это основано на предположении, что указатель частоты встречается в первых 6 символах кодированной полосы пропускания. Стандарт ограничивает все поле пропускной способности 4 символами, включая обозначение. Тем не менее, я видел примеры, расширенные до 6 символов (например, 100H00 показанный выше, который также может быть соответствующим образом закодирован как 100H)

Вот автономный пример кода SPARQL:

SELECT DISTINCT *
WHERE
{
  BIND("5M75C3F"^^xsd:string AS ?emissionDesignator) .
  BIND(strlen(?emissionDesignator) AS ?edLength) .
  BIND(substr(?emissionDesignator, ?edLength - 2, 3) AS ?useCodes) .
  BIND(strbefore(?emissionDesignator, ?useCodes) AS ?encodedBandwidth) .

  # case of indicator in character position 1
  {
      BIND(substr(?encodedBandwidth, 1, 1) AS ?indicator) .
      FILTER ((?indicator = "H") || (?indicator = "K") || (?indicator = "M") || (?indicator = "G")) .
  }
  UNION
  # case of indicator in character position 2
  {
      BIND(substr(?encodedBandwidth, 2, 1) AS ?indicator) .
      FILTER ((?indicator = "H") || (?indicator = "K") || (?indicator = "M") || (?indicator = "G")) .
  }
    UNION
  # case of indicator in character position 3
  {
      BIND(substr(?encodedBandwidth, 3, 1) AS ?indicator) .
      FILTER ((?indicator = "H") || (?indicator = "K") || (?indicator = "M") || (?indicator = "G")) .
  }
  UNION
  # case of indicator in character position 4
  {
      BIND(substr(?encodedBandwidth, 4, 1) AS ?indicator) .
      FILTER ((?indicator = "H") || (?indicator = "K") || (?indicator = "M") || (?indicator = "G")) .
  }
  UNION
  # case of indicator in character position 5
  {
      BIND(substr(?encodedBandwidth, 5, 1) AS ?indicator) .
      FILTER ((?indicator = "H") || (?indicator = "K") || (?indicator = "M") || (?indicator = "G")) .
  }
  UNION
  # case of indicator in character position 6
  {
      BIND(substr(?encodedBandwidth, 6, 1) AS ?indicator) .
      FILTER ((?indicator = "H") || (?indicator = "K") || (?indicator = "M") || (?indicator = "G")) .
  }
  VALUES (?freqIndicator ?multiplier) {
         ("H"^^xsd:string 1.0e0)
         ("K"^^xsd:string 1.0e3)
         ("M"^^xsd:string 1.0e6)
         ("G"^^xsd:string 1.0e9)
  } .
  FILTER (?indicator = ?freqIndicator) .
  BIND (xsd:double(replace(?encodedBandwidth, ?freqIndicator, ".")) AS ?bandwidthDecimalPart) .
  BIND ((?bandwidthDecimalPart * ?multiplier) AS ?bandwidthDouble ) . 
}

Выше приведен результат, показанный ниже... с удвоенным значением полосы пропускания в ?bandwidthDouble как Гц, что делает последующее рассуждение удобным. Теперь перейдем к обработке остальной части обозначения выбросов. В конечном счете, этот код будет в конечном итоге в конструкторах SPIN для автоматического перевода при создании экземпляра.

введите описание изображения здесь

Другие вопросы по тегам