Где я могу найти список логических операторов для BaseX?

Я использую официальную документацию: http://docs.basex.org/wiki/Commands#String_Syntax, и мне не удалось найти список логических операторов. Я хочу иметь возможность запрашивать text contains 'A' or 'B'.

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

Вот с чем я работаю... Я понял, как сделать "или", но я еще не понял, как передавать переменные для разных целей.

let $items := ('Creditcard', 'Money order')
for $item score $s in doc('xmark')//item
  [payment contains text "$items" using stemming using case sensitive]
order by $s descending
return <item ranking= '{ $s }'>{ $item/payment/text() }</item>

-Редактировать-

Теперь посмотрим на этот код, основанный на существующем ответе:

let $items := ('Creditcard', 'Money order')
for $item in descendant::*:$item | descendant-or-self::*[text() contains text "$item"] | .//item//payment[descendant-or-self::node()/@*:lang = "bnt"][descendant-or-self::node()/@*:lang = "afr"][descendant-or-self::node()/@*:lang = "eng"][descendant-or-self::node()/@*:lang = "chi"]
return <payment>{ .//item//payment/text() }</payment>
       <buyer_name>{ .//item//buyer/text() }</buyer_name>

-Редактировать-

Еще одна попытка:

let $list := doc('xmark')
return for $p in $list/payments/item/payment-method[text() = 'Creditcard']
return $p//text()

Возвращает 0 результатов. Просто пытаюсь получить «Кредитную карту», ​​значение «способ оплаты» из текста. По сути, я не смог найти последовательных или успешных примеров.

-Редактировать-

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

через http://basex.org/products/live-demo/

документ('тест'):=

<item>
<item_number>1171270</item_number>
<seller_info>
<seller_company_id>6356</seller_company_id>
<seller_rating>C31</seller_rating>
<seller_rating>T150 hr.</seller_rating>
</seller_info>
<product_info>
<unit>2022</unit>
<sinfo>55 cases</sinfo>
<sinfo>Yu-gi-oh trading card pack</sinfo>
<sinfo>.45kg per unit</sinfo>
<sinfo>24.7500kg shipment</sinfo>
</product_info>
<product_info>
<unit>9291</unit>
<sinfo>7 units</sinfo>
<sinfo>Naruto, Classic, action figure</sinfo>
<sinfo>1.8kg per unit</sinfo>
<sinfo>12.6kg shipment</sinfo>
</product_info>
</item>

0: напишите свой собственный запрос... :=

let $doc := doc('test') 
for $v in $doc//item
where contains($v//seller_rating,'C31')
return $v//product_info/sinfo

Возвращает:

Error:
Stopped at line 3, column 39: [XPTY0004] Single item expected, (element seller_rating { ... }, element seller_rating { ... }) found.

Не могу сказать, что не ожидал столкнуться с такой проблемой. К сожалению, я не форматировал XML-документ, и он весь ужасно отформатирован, вот так, что является одной из причин, по которой я пытаюсь получить к нему доступ (чтобы реструктурировать его). Следующий вопрос: "как настроить таргетинг на значения с одинаковым узлом в XQuery"?


person Wolfpack'08    schedule 15.09.2012    source источник
comment
[payment contains text 'Creditcard' using stemming using case sensitive or payment contains text 'Money order' using stemming using case sensitive] работает для или, но это очень многословно. Кроме того, это ограничивает мои возвращаемые значения. Я хотел бы иметь возможность вернуть набор Creditcard в качестве одной переменной и Money order в качестве другой.   -  person Wolfpack'08    schedule 15.09.2012
comment
Может быть правда, что XQuery применяется?   -  person Wolfpack'08    schedule 15.09.2012
comment
да, этот вопрос полностью связан с XQuery, я постараюсь дать вам ответ в ближайшее время :)   -  person michael    schedule 15.09.2012
comment
@Michael У вас есть какие-нибудь идеи о том, как я могу использовать xquery через HTML или JavaScript? Я пытаюсь получить отформатированный список результатов запроса на основе массива целевых элементов, содержащих текст. Я не хочу использовать ROR, PHP, Node или что-то в этом роде. Я бы просто хотел использовать HTML.   -  person Wolfpack'08    schedule 15.09.2012
comment
Я имею в виду, что если бы я мог использовать Javascript, я мог бы создать цикл while в CSV с моим массивом, используя этот метод: stackoverflow.com/questions/6861180/, и я мог бы передать переменные в позиции $items в сценарии, который я написал в своем примере, верно?   -  person Wolfpack'08    schedule 15.09.2012
comment
Wolfpack, вы можете взглянуть на RestXQ (docs.basex.org/wiki/RESTXQ), это позволяет вам использовать XQuery в качестве языка на стороне сервера, который выводит HTML (или XML, если уж на то пошло) в браузер.   -  person michael    schedule 15.09.2012
comment
@ Майкл, я думал об этом. На самом деле я не очень хорошо знаком с HTTP-запросами, поэтому я не уверен, будет ли ссылка, о которой я упоминал выше, извлекать CSV-файл с сервера или пытаться получить CSV-файл с компьютера пользователя.... Я надеюсь, что это будет разумно и будет искать его на сервере. Я пытаюсь понять, как перебирать CSV через EOF в JavaScript, и пока мне не повезло с этим. Я уверен, что когда-нибудь столкнусь с этим, хотя...   -  person Wolfpack'08    schedule 16.09.2012


Ответы (1)


имхо, это больше всего похоже на ваш вопрос:

let $results := 
( (: Prepare a sequence of results for each $keyword in $keywords :)
let $keywords := ('Money order', 'Creditcard', 'Personal Check')
for $keyword in $keywords
  (: see http://docs.basex.org/wiki/Full-Text#Scoring for information regarding
  scores :)
  for $item score $s in doc('xmark')//item[
    payment contains text {$keyword} all words using stemming using case sensitive
  ]
  order by $s descending
  return <item ranking= '{ $s }'>{ $item/payment/text() }</item>
)
(: now sort and group these results, grouping is done to eliminate duplicate payment
methods that have been matched by two or more keywords :)
for $result in $results
  group by $val := $result/text()
  order by $result[1]/@ranking descending
return $result[1]

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

let $keywords := ('Cash', 'Personal Check')
for $keyword in $keywords 
return <keyword name="{$keyword}">
{
for $result in //item/payment
  group by $payment-method := $result/text()
  order by count($result) descending
return element {"item"} {
    attribute {"count"} {count($result)},
    $payment-method
  }[. contains text {$keyword} phrase]
}</keyword>

Я надеюсь, что это поможет и ответит на ваш вопрос, если вы не можете попросить о дополнительной помощи :)

person michael    schedule 15.09.2012
comment
Если бы я хотел установить $keywords в файл значений, разделенных \n, используя JavaScript и XQuery..., смогли бы вы адаптировать сценарий для этой цели? Скоро я опубликую все свои усилия в теле вопроса. - person Wolfpack'08; 16.09.2012
comment
На самом деле мне удалось обнаружить, что в BaseX есть страница, посвященная событиям HTTP! Плотно, да? :D docs.basex.org/wiki/HTTP_Module - person Wolfpack'08; 16.09.2012
comment
Точно, но лучше было немного почитать о RestXQ (-> docs.basex.org/wiki/ RESTXQ), который позволяет использовать функции из нашего HTTP-модуля :) - person michael; 16.09.2012
comment
небольшое дополнение к моему комментарию: модуль HTTP позволяет отправлять запросы на URL-адреса изнутри XQuery (например, получать RSS-канал). RestXQ, напротив, позволяет вам писать функции XQuery, которые выводят свои результаты в веб-браузер, подобно написанию веб-приложений на PHP. (надеюсь, это помогло) - person michael; 16.09.2012
comment
О чувак. Спасибо. Ты жжешь. Если я придумаю что-нибудь ***, я опубликую это. - person Wolfpack'08; 16.09.2012
comment
codepad.org/Yzn90mRf; codepad.org/TssJhGOe. Несколько целей, результат с несколькими столбцами. - person Wolfpack'08; 17.09.2012
comment
Я думаю, что просто поставлю вам галочку за объяснение того, как вводить несколько значений, и перенесу «как выводить несколько значений» в отдельный вопрос. - person Wolfpack'08; 17.09.2012
comment
Привет, Wolfpack, я немного разъяснил свои примеры, см. здесь: gist.github.com/360afe2284ea89cf1f15 (извините Я не мог редактировать на кодовой панели) Это уже охватывает более сложные темы XQuery (группировка, зацикливание на циклах), я предлагаю вам взглянуть на stylusstudio.com/xquery_primer.html для ознакомления :) - person michael; 17.09.2012
comment
Да, я задал новый вопрос, потому что чувствую, что этот был недостаточно ясен, но по-своему послужил цели. Я наткнулся на эту статью: databasejournal.com/sqletc/article.php/3865201/. К сожалению, ему 2 года, поэтому я не могу быть уверен в его точности. # 9 говорит, что функция выбора - это сбой. - person Wolfpack'08; 18.09.2012
comment
Я тоже прошел этот урок. Я читаю его снова, но я не верю, что он на самом деле охватывает такой запрос. Несколько целей, несколько гнезд, несколько результатов. - person Wolfpack'08; 18.09.2012
comment
На самом деле, я потратил около часа на обучение, о котором вы упомянули, и я думаю, что это намного приблизило меня к цели. Вот пример запроса, который я рассматриваю сейчас: let $doc := . for $v in $doc//payment, $a in $doc//person/name where contains text ($a, 'Greg') and $v/buyer/@id = $a/../@id return $v/payment/amount... Я пока не уверен, что он сработает, конечно. :) Я собираюсь попробовать это с помощью Saxon, но я не понял, как назвать сценарий (sample.xquery, в списке документов). - person Wolfpack'08; 18.09.2012
comment
Не стесняйтесь использовать свой запрос с BaseX, это тоже может быть легко :) - person michael; 18.09.2012
comment
На самом деле, это создает проблему. :/ Я попытался выполнить свой запрос в BaseX.... Угадайте, что? ЭТО НЕ УДАЛОСЬ! смешной. Он работает со Stylus Studio, но мне не разрешено возвращать более 64 000 результатов, так что ошибки на мне. Я пытаюсь работать с Саксоном. Я не знаю, как сохранить многоразовый скрипт для Saxon с параметрами, но думаю, что уже в пути. - person Wolfpack'08; 18.09.2012