Извлечение данных из таблицы (MarkLogic)

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

Например, с помощью следующего запроса Optics

import module namespace op = "http://marklogic.com/optic" at "/MarkLogic/optic.xqy";
import module namespace ofn = "http://marklogic.com/optic/expression/fn" at "/MarkLogic/optic/optic-fn.xqy";


let $people := op:from-sparql('SELECT * WHERE {?person </id> "000". ?person </path> ?animal}', "sparql")
                => op:select(( op:as('personStr',ofn:string(op:col('person'))), op:as('animalStr',ofn:string(op:col('animal'))) ))


return(
$people => op:result()
)

Я получу таблицу, которая выглядит как

personStr      |    animalStr
-------------------------------
/people/000         /animal/001
/people/000         /animal/002

В этой таблице будет содержаться URI, указывающий на различные документы, которые я надеюсь извлечь (например, animalStr) и выполнить некоторую фильтрацию с помощью cts:search(fn:doc(uri_list), ....)

===Обновление с текущим подходом===

let $people := op:from-sparql('SELECT * WHERE {?person </id> "000". ?person </path> ?animal}', "sparql")
                => op:select(( op:as('personStr',ofn:string(op:col('person'))), op:as('animalStr',ofn:string(op:col('animal'))) ))

let $animal := op:from-lexicons(
  map:entry("animal",cts:uri-reference()),
  "lexicon")
  =>op:where(
     cts:path-geospatial-query("animal_data/location",
    cts:circle(5500, cts:point(-55.854526273011, -151.93342455372309)),
    "type=long-lat-point")
  )

return(
$animal  => op:join-inner(
    $people,
    op:on(
      "animal","animalStr"
    )
  )
  => op:select(("personStr", "animalStr"))
  => op:result()
)

Основываясь на этом подходе, можно увидеть, что мне всегда требуется извлекать всех животных в определенном месте, прежде чем выполнять внутреннее соединение, чтобы получить мои результаты. Однако в идеале я хотел бы применить геопространственный запрос непосредственно к результатам, полученным из запроса SPARQL.

Каков ваш актуальный вопрос? Вы хотите знать, является ли ваш текущий подход правильным?

Wagner Michael 30.07.2019 12:26

Я готов принять другие альтернативные подходы к этому, если они есть. Я обновил свой вопрос, пытаясь объяснить, чего я на самом деле пытаюсь достичь. Но в целом я хотел бы отфильтровать оптический запрос sparql напрямую, используя геопространственные запросы, чтобы получить всех животных в определенном геопространственном пространстве, используя cts:circle напрямую. @Вагнер Майкл

WhiteSolstice 31.07.2019 04:01
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
110
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Optic может ограничить запрос SPARQL тройками, спроецированными из документов, которые соответствуют динамическому запросу, включая те документы, которые соответствуют запросам геопространственных cts.

Общая схема такова:

op.fromSparql(...SPARQL query...)
  .where(...cts query...)

Хотя построитель указывает cts.query после запроса SPARQL, механизм не выполняет эти шаги последовательно. Вместо этого механизм игнорирует все триплеты из документов, которые не соответствуют cts.query.

Ограничивающий cts.query работает так же для строк и значений словаря.

На самом деле, предоставление ограничивающего cts.query с предложением where() является лучшей практикой для повышения эффективности поиска. Это особенно верно для троек, потому что тройки по определению требуют интенсивного соединения.

Возможно ли, что этот шаблон может удовлетворить требование?

Надеясь, что это поможет,

Спасибо вроде работает. Но я хотел бы спросить, относится ли это ко всем другим вариантам, таким как op:from-view? Кроме того, как это будет работать, если я свяжу cts query с op:where после выполнения операции op:join-inner с другими таблицами/результатами? @ehennum

WhiteSolstice 01.08.2019 15:01

Да, ограничивающий cts:query работает со всеми методами доступа, включая op:from-view(), op:from-lexicons() и op:from-triples(). Если операция where() указывает ограничивающий cts:query после соединения, запрос применяется к обеим сторонам соединения. То есть только значения из документов, соответствующих запросу, вносят вклад в обе стороны соединения.

ehennum 01.08.2019 17:29

Я вижу, я хотел бы уточнить, чтобы использовать op:from-view(), нам нужно будет проецировать документы в view с SQL-подобными таблицами, позволяющими запрашивать данные с помощью SQL, поэтому, когда мы запускаем cts queries с op:where, мы отфильтровываем documents, а не сам view . Следовательно, документы, не соответствующие требованиям cts query, не будут отображаться в представлении. Это также относится к op:from-sparql, поскольку он будет фильтровать как тройные документы, так и документы, которые проецируют тройки, используя извлечение на основе шаблона. @ehennum

WhiteSolstice 02.08.2019 04:00

Да, @WhiteSolstice, верно. TDE проецирует строки или тройки из документа в индексы, когда документ вставляется или переиндексируется. Ограничивающий cts:query сопоставляет документы так же, как и cts:search(). Где cts:search() извлекает совпадающие документы из леса или кэша, а методы доступа Optic from-view(), from-triples(), from-lexicons(), from-sparql() и from-sql() извлекают значения для соответствующих документов из индексов.

ehennum 02.08.2019 18:02

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