发布新帖

検索

文章
· 六月 2, 2024 阅读大约需 6 分钟

Predicción de diagnósticos con Vector Search y Machine Learning

La idea

Ya estamos en 2024, la version IRIS 2024.1 acaba de salir y todos estamos hablando de ello aquí. Ya tenemos muchos tutoriales sobre búsqueda vectorial y aplicaciones de chats de inteligencia artificial. Hoy quiero proponer algo diferente. Quiero presentar una idea y explorar todos sus límites, y a lo largo del texto plantearé algunas preguntas sobre la capacidad de las herramientas utilizadas, para que luego podamos comprender no solo los resultados de las nuevas funcionalidades, sino también cómo la máquina las procesa.

La idea es simple: transformar anamnesias psicológicas de pacientes en vectoresy utilizarlos como base para el aprendizaje automático.
De esta manera, podemos construir una máquina capaz de discernir si un paciente tiene un diagnóstico a partir de su anamnesia.

Para comenzar, probaremos con ejemplos de anamnesias de pacientes autistas y no autistas y crearemos una base de datos de vectores para entrenarla a distinguir a los pacientes con trastorno del espectro autista de aquellos que no lo tienen. 

Para ello necesitaremos:

- Una base de datos de anamnesias de pacientes con y sin el trastorno (hay algunos casos disponibles en internet, incluso podemos generarlos nosotros mismos con la ayuda de Google Gemini IA)
-Un modelo de incorporación en Python para transformar las anamnesias en vectores;
- InterSystems Machine Learning.

El objetivo acá no és substituir un terapeuta o psicólogo, pero discutir el poder y los límites de las herramientas InterSystems. Y si lo hacemos bién, esa aplicación puede tornarse un acesorio para esos profesionales.

 

Paso a paso

1- Transformar el texto en vectores

Primero tenemos que aprender cómo hacer la transformación de texto crudo para vectores. 
Siguiendo el tutorial de la documentación InterSystems, debemos elegir a un modulo Python que tenga un buén modelo para el tipo de texto que vamos a transformar. 

Además de la sugerencia de la documentación, quiero añadir la sugestión de usar la función Word2Vec de la librería Gensim, como en el codigo abajo.
Dejo también dos sítios que la explican cómo maestro: Text Vectorization Using Python: Word2Vec y Word2Vec — Skip-Gram (ese último és más por curiosidad, lo vi muy interesante).

# importar las librerias
import gensim
from gensim.models import Word2Vec, KeyedVectors
import pandas as pd 

# una función para tratar el texto
import re
def remove_prepositions(text):
    prepositions = ['his', 'he', 'she', 'her', 'hers','it','about', 'above', 'across', 'after', 'against', 'along', 'among', 'around', 'at', 'before', 'behind', 'below', 'beneath', 'beside', 'between', 'beyond', 'but', 'by', 'concerning', 'considering', 'despite', 'down', 'during', 'except', 'for', 'from', 'in', 'inside', 'into', 'like', 'near', 'of', 'off', 'on', 'onto', 'out', 'outside', 'over', 'past', 'regarding', 'round', 'since', 'through', 'throughout', 'till', 'to', 'toward', 'under', 'underneath', 'until', 'up', 'upon', 'with', 'within', 'without']
    pattern = r'\b(' + '|'.join(prepositions) + r')\b\s*'
    text = re.sub(pattern, '', text, flags=re.IGNORECASE)
    return text

# transformar el texto en un pandas dataframe
with open('./texts/tea-adult.txt', 'r') as f:
    f = remove_prepositions(f.read())
    lines = f.split('\n')

data = pd.DataFrame(list(zip(lines))) 
data.columns = ['anamnesis']

anamnesis_new=data.anamnesis.apply(gensim.utils.simple_preprocess)

# parametros de lo modelo
model=gensim.models.Word2Vec(window=5, min_count=2, workers=4, sg=0)

# entrenar el modelo
model.build_vocab(anamnesis_new, progress_per=1000)
model.train(anamnesis_new, total_examples=model.corpus_count, epochs=model.epochs)

# salvar el modelo entrenado
model.save("./anamnesis.model")

 Yo elegí tratar el texto en ese caso usando una simple función que encontré en una rápida busqueda, porque si retiramos preposiciones y otras palabras que no tienen relación con asuntos específicos, resulta una mejor actuación y rendimiento de la máquina. Eso es porque así el texto es menor.

Acá dejo mis premeras preguntas: 

  • ¿Es mejor preprocesar el texto eliminando preposiciones y otras palabras irrelevantes antes de transformarlo en vectores?
  • una máquina no tiene el concepto de semántica. Así que esa maniobra asume que no hay pérdidas de significado para la computadora. ¿Esa suposición es engañosa?

 

Crear la base de datos con los vectores en IRIS

No quiero ocupar mucho de tu tiempo acá porque la documentación InterSystems ya explicó esa parte muy bien. 

En resumen, tenemos que crear una tabla con una columna para los embeddings, y un UID que hace referencia a lo texto original. Ahí, adicionamos cada incorporación texto-vector y su UID en la tabla:

INSERT INTO Sample.Embeddings (Embedding, UID) 
   VALUES (TO_VECTOR(?,double), ?)

 

Si eliges usar el Word2Vec, la lista de incorporaciónes (embeddings) puede ser extraída de lo modelo salvado en "./anamnesis.model" en el ejemplo arriba.

Una otra pregunta: que has usado para hacer las incorporaciónes de texto en vector? Por qué la eligiste? 

Usar el InterSystems IRIS ML para entrenar la tabla

Ahora que tenemos la tabla con los vectores, podemos agregar una columna que dice si la incorporación vino de una anamnesia de autista o no. 
Siguiendo otra vez la buenisima documentación InterSystems en ese asunto, creamos un modelo de predicción desde esa tabla.

CREATE MODEL AnamnesiaAutistaModel PREDICTING (es_autista) FROM AnamnesiaAutista

Lo entrenamos

TRAIN MODEL AnamnesiaAutistaModel

Y lo validamos con algunas anamnesias que aún no usamos.

VALIDATE MODEL AnamnesiaAutistaModelo From AnamnesiaTeste

 

Por fin, podemos hacer la predicción en nuevos datos..

SELECT *, PREDICT(AnamnesiaAutistaModel) FROM NuevasAnamnesias

 

Análisis matematica de la solución

Solución 1: Usando InterSystems IntegratedML para hacer todo lo descrito arriba, aplicámos un modelo de bosque randomico para decidir positivo o negativo para un teste de autismo, con base en el conocimiento que pasámos para la computadora. Obvio que con un psicologo en el projeto podemos añadir, además de las anamnesias, una lista de síntomas de autismo y enseñar aún más la máquina para tener resultados mejores. 
Así, la computadora hace una decisión con base en números que representan medidas de relación entre palabras. Si esa relación es semejante a de los datos usados en la tabla usada para entrenar la máquina, ella decide que el diagnostico es positivo.
Creo que eso funciona mejor si ponemos pesos en esas medidas según la relación con la palabra autismo. Podemos lograr eso combinando la herramienta con la búsqueda vectorial antes de efectivar la decisión de la máquina. Siguiendo el ejemplo con Gensim:

similarity = model.wv.similarity(w1='autism',w2='sociability')

Entonces si l computadora decide por sí, pero esa semejanza es baja, la decisión queda no.

Solución 2: Otra opcíon era solo hacer una búsqueda vectorial en nuestra tabla de incorporaciónes. Ahí tendríamos usado una semejanza de coseno o producto punto y llegar a una semejanza suficiente (algo cómo un p valor 0.05) que nos dice si és un caso de autismo o no. 

Así que tenemos las dos preguntas finales:

  • Para un modelo de aprendizaje de máquina, el benefício en usar un vector en el lugar de un texto es obvio en términos de actuación y rendimiento, porque esatmos usando números, que es más próximo de la lenguaje de máquina, entonces saltamos algunos pasos que lá máquina tendría que hacer. ¿Pero el resultado es bueno por igual?
  • Si los resultados en las dos soluciones es próximo, ¿la busqueda vectorial puede ser usada cómo base para aprendizaje de máquina y predicción? ¿En qué casos es más adecuado utilizar un enfoque u otro?

 

El futuro

Una base de datos com o esa también puede ser usada para pesquisas y encontrar nuevas similitudes en todo tipo de diangóstico.  Si añadimos detalles acerca del estilo de vida de los pacientes además de sintomas, la máquina puede ser capaz de hacer un análisis pragmático y traer nuevas hipótesis para pesquisas que pueden confirmar si la computadora he interpretado bién las relaciones entre los comportamientos y los diagnósticos. 

讨论 (0)1
登录或注册以继续
文章
· 六月 2, 2024 阅读大约需 6 分钟

Predicción de diagnósticos con búsqueda vectorial y aprendizaje de máquina

La idea

Ya estamos en 2024, la versión IRIS 2024.1 acaba de salir y todos estamos hablando de ello aquí. Ya tenemos muchos tutoriales sobre búsqueda vectorial y aplicaciones de chats de inteligencia artificial. Hoy quiero proponer algo diferente. Quiero presentar una idea y explorar todos sus límites, y a lo largo del texto plantearé algunas preguntas sobre la capacidad de las herramientas utilizadas, para que luego podamos comprender no solo los resultados de las nuevas funcionalidades, sino también cómo la máquina las procesa.

La idea es simple: transformar las anamnesias psicológicas de los pacientes en vectores y utilizarlos como base para el aprendizaje automático. De esta manera, podemos construir una máquina capaz de discernir si un paciente tiene un diagnóstico a partir de su anamnesia.

Para comenzar, probaremos con ejemplos de anamnesias de pacientes autistas y no autistas y crearemos una base de datos de vectores para entrenarla a distinguir a los pacientes con trastorno del espectro autista de aquellos que no lo tienen. 

Para ello, necesitaremos::

  •  Una base de datos de anamnesias de pacientes con y sin el trastorno (hay algunos casos disponibles en internet, incluso podemos generarlos con la ayuda de Google Gemini IA);
  •  Un modelo de incorporación en Python para transformar las anamnesias en vectores;
  •  InterSystems Machine Learning.

El objetivo acá no és substituir un terapeuta o psicólogo, pero discutir el poder y los límites de las herramientas InterSystems. Y si lo hacemos bién, esa aplicación puede tornarse un acesorio para esos profesionales. 

 

Paso a paso

1- Transformar el texto en vectores

Primero tenemos que aprender cómo hacer la transformación de texto crudo para vectores. 
Siguiendo el tutorial de la documentación InterSystems, debemos elegir a un modulo Python que tenga un buén modelo para el tipo de texto que vamos a transformar. 

Además de la sugerencia de la documentación, quiero añadir la sugestión de usar la función Word2Vec de la librería Gensim, como en el codigo abajo.
Dejo también dos sítios que la explican cómo maestro: Text Vectorization Using Python: Word2Vec y Word2Vec — Skip-Gram (ese último és más por curiosidad, lo vi muy interesante).

# importar las librerias
import gensim
from gensim.models import Word2Vec, KeyedVectors
import pandas as pd 

# una función para tratar el texto
import re
def remove_prepositions(text):
    prepositions = ['his', 'he', 'she', 'her', 'hers','it','about', 'above', 'across', 'after', 'against', 'along', 'among', 'around', 'at', 'before', 'behind', 'below', 'beneath', 'beside', 'between', 'beyond', 'but', 'by', 'concerning', 'considering', 'despite', 'down', 'during', 'except', 'for', 'from', 'in', 'inside', 'into', 'like', 'near', 'of', 'off', 'on', 'onto', 'out', 'outside', 'over', 'past', 'regarding', 'round', 'since', 'through', 'throughout', 'till', 'to', 'toward', 'under', 'underneath', 'until', 'up', 'upon', 'with', 'within', 'without']
    pattern = r'\b(' + '|'.join(prepositions) + r')\b\s*'
    text = re.sub(pattern, '', text, flags=re.IGNORECASE)
    return text

# transformar el texto en un pandas dataframe
with open('./texts/tea-adult.txt', 'r') as f:
    f = remove_prepositions(f.read())
    lines = f.split('\n')

data = pd.DataFrame(list(zip(lines))) 
data.columns = ['anamnesis']

anamnesis_new=data.anamnesis.apply(gensim.utils.simple_preprocess)

# parametros del modelo
model=gensim.models.Word2Vec(window=5, min_count=2, workers=4, sg=0)

# entrenar el modelo
model.build_vocab(anamnesis_new, progress_per=1000)
model.train(anamnesis_new, total_examples=model.corpus_count, epochs=model.epochs)

# salvar el modelo entrenado
model.save("./anamnesis.model")

Yo elegí tratar el texto en ese caso usando una simple función que encontré en una rápida busqueda, porque si retiramos preposiciones y otras palabras que no tienen relación con asuntos específicos, resulta una mejor actuación y rendimiento de la máquina. Eso es porque así el texto es menor.

Acá dejo mis primeras preguntas: 

  • ¿Es mejor preprocesar el texto eliminando preposiciones y otras palabras irrelevantes antes de transformarlo en vectores?
  • Una máquina no tiene el concepto de semántica. Así que esa maniobra asume que no hay pérdidas de significado para la computadora. ¿Esa suposición es engañosa? 

 

2- Crear la base de datos con los vectores en IRIS

No quiero ocupar mucho de tu tiempo acá porque la documentación InterSystems ya explicó esa parte muy bien. 

En resumen, tenemos que crear una tabla con una columna para los embeddings, y un UID que hace referencia a lo texto original. Ahí, adicionamos cada incorporación texto-vector y su UID en la tabla:

INSERT INTO Sample.Embeddings (Embedding, UID) 
   VALUES (TO_VECTOR(?,double), ?)

Si eliges usar el Word2Vec, la lista de incorporaciónes (embeddings) puede ser extraída de lo modelo salvado en "./anamnesis.model" en el ejemplo arriba.

Queda una otra pregunta: ¿qué has usado para hacer las incorporaciónes de texto en vector? ¿Por qué la eligiste? 

 

3- Usar el InterSystems IRIS ML para entrenar la tabla

Ahora que tenemos la tabla con los vectores, podemos agregar una columna que dice si la incorporación vino de una anamnesia de autista o no. 
Siguiendo otra vez la buenisima documentación InterSystems en ese asunto, creamos un modelo de predicción a partir de esa tabla.

CREATE MODEL AnamnesiaAutistaModel PREDICTING (es_autista) FROM AnamnesiaAutista


Lo entrenamos

TRAIN MODEL AnamnesiaAutistaModel


Y lo validamos con algunas anamnesias que aún no usamos.

VALIDATE MODEL AnamnesiaAutistaModelo From AnamnesiaTeste

Por fin, podemos hacer la predicción en nuevos datos.

SELECT *, PREDICT(AnamnesiaAutistaModel) FROM NuevasAnamnesias

 

Análisis matematica de la solución

Solución 1: Utilizando InterSystems IntegratedML para implementar todo lo descrito anteriormente, aplicamos un modelo de bosque aleatorio para clasificar como positivo o negativo un caso de autismo, basándonos en el conocimiento que proporcionamos a la computadora. Es evidente que, con la colaboración de un psicólogo en el proyecto, podemos agregar, además de las anamnesias, una lista de síntomas de autismo y entrenar aún más a la máquina para obtener mejores resultados.
De esta manera, la computadora toma una decisión basándose en números que representan medidas de relación entre palabras. Si estas relaciones son similares a las de los datos utilizados en la tabla para entrenar la máquina, esta decide que el diagnóstico es positivo.

Considero que esto funcionaría mejor si asignamos pesos a estas medidas en función de su relación con la palabra "autismo". Una forma sencilla de lograrlo es combinar la herramienta con la búsqueda vectorial antes de que la máquina tome la decisión final. Siguiendo el ejemplo con Gensim:

similarity = model.wv.similarity(w1='autism',w2='sociability')


En ese caso, si la computadora decide por positivo, pero la semejanza es baja, la decisión final será negativa."

 

Solución 2: Otra opcíon era realizar solo una búsqueda vectorial en nuestra tabla de incorporaciónes. En este caso, hubiéramos utilizado una similitud de coseno o producto punto para obtener un valor de similitud suficiente (por ejemplo, un valor p de 0.05) que nos indicaría si se trata de un caso de autismo o no. 

Por lo tanto, surgen las siguientes dos preguntas finales:

  • Para un modelo de aprendizaje automático, la ventaja de usar un vector en lugar de un texto es evidente en términos de rendimiento, ya que estamos manejando números, que son más cercanos al lenguaje de las máquinas que las palabras. Esto nos permite omitir algunos pasos que la máquina tendría que realizar. Sin embargo, ¿la calidad del resultado es la misma?
  • Si los resultados de ambas soluciones son similares, ¿se puede utilizar la búsqueda vectorial como base para el aprendizaje automático y la predicción? ¿En qué casos sería más apropiado utilizar un enfoque o otro?

 

El futuro de esta propuesta

Una base de datos de este tipo también podría utilizarse para investigaciones y descubrir nuevas similitudes en todo tipo de diagnósticos. Si se añaden detalles sobre el estilo de vida de los pacientes, además de los síntomas, la máquina podría realizar un análisis pragmático y generar nuevas hipótesis para investigaciones que podrían confirmar si la computadora ha interpretado correctamente las relaciones entre los comportamientos y los diagnósticos.

讨论 (0)1
登录或注册以继续
公告
· 六月 2, 2024

InterSystems Open Exchange Applications Digest, May 2024

Hello and welcome to the May 2024 Open Exchange Newsletter.
General Stats:
23 new apps in May
762 downloads in May
958 applications all time
34,853 downloads all time
2,692 developers joined
New Applications
IRIS AI Studio
By Ikram Shah
iris-VectorLab
By Muhammad Waseem
Hackupc24_inter
By Jonathan Rodríguez Barja
DNA-similarity-and-classify
By davi massaru teixeira muta
iris-angular-template
By Elijah Tamarchenko
iris-medicopilot
By Henry Hamon Pereira
BG-AppealAI
By Katsiaryna Shaustruk
iris-image-vector-search
By shan yue
HackUPC24_Klìnic
By Tanguy Vansnick
iris-health-coach
By Zacchaeus Chok
companies-search
By Lucas Fernandes
potatoes_patatas
By BATIKAN BORA ORMANCI
ImageSearchVideo
By Rebecca Deng
Demo-Pandas-Analytics
By Evgeniy Potapov
Job Advertisement Generator
By Shiwan Zhang
hackupc
By Mohamed Amir Braham
AutoML Churn Predict Showroom
By YURI MARX PEREIRA GOMES
yaspe
By Murray Oldfield
WALL-M
By Somesh Mehra
document_vector_search_unifiai
By Pramod Misra
InterSystems HealthShare Health Connect Cloud
By Raj Singh
InterSystems FHIR Transformation Service
By Raj Singh
InterSystems FHIR Server
By Raj Singh
New Releases
Intersystems-Monitoring by Theo Stolker
v1.0.9
  • ProductionMonitorService now reports about all Productions in each namespace, not just the first one
  • HeaderMonitorService now runs every 10 seconds
  • Improved Readme
IRIS apiPub by Claudio Devecchi
v1.1.71
Fixed bugs in cached data
Perftools IO Test Suite by Pran Mukherjee
v1.2.0
Updated outputs, added StdDev fields, removed IOPS and ResponseTime fields
iris-pkcs7-util by Guillaume Rongier
v1.0.7
  • Add cls implementation
    • Thanks Stephane Devin
iris-analytics-template by Evgeny Shvarov
v1.1.2
Enable IRIS BI at start
Most downloaded
WebTerminal
By Nikita Savchenko
DeepSeeWeb
By Anton Gnibeda
MDX2JSON
By Eduard Lebedyuk
ssl-client
By Evgeny Shvarov
iris-cron-task
By Evgeny Shvarov
EnsembleWorkflow
By Eduard Lebedyuk
workflowUI-ngx
By Sergey Sarkisyan
Intersystems-Monitoring
By Theo Stolker
Test Coverage Tool
By Timothy Leavitt
May, 2024Month at a GlanceInterSystems Open Exchange
讨论 (0)1
登录或注册以继续
文章
· 六月 1, 2024 阅读大约需 3 分钟

How to set up columnar storage in classes

Columnar storage is one of the newer offers provided by InterSystems IRIS. Unlike traditional row-based storage, it optimizes query processing by storing data in columns rather than rows, enabling faster access and retrieval of relevant information.

A couple of articles have been written on when it should be used to give a system the biggest boost, how to create tables like that using SQL

CREATE TABLE table (column1 type1, column2 type2, column3 type3) WITH STORAGETYPE = COLUMNAR  -- ex 1
CREATE TABLE table (column1 type1, column2 type2, column3 type3 WITH STORAGETYPE = COLUMNAR)  -- ex 2

and even the performance tests.

As we all know, InterSystems IRIS is a multi-model DBMS and it gives seamless access to the same data using relational and object access. So the former is covered in other articles, but what about the latter?

It is good to know that the columnar storage layout can also be defined in classes, and there are several ways to do it.

1. If you wish to define the storage for all properties as columnar (example 1 at the top) just add a following parameter to your class:

Parameter STORAGEDEFAULT = "columnar" 

And if we take an example above, we'll get the following class:

Class Post.Address Extends %Persistent [Final]
{
Parameter STORAGEDEFAULT = "columnar";
Parameter USEEXTENTSET=1;
Property City As %String(MAXLEN = 12);
Property ZIP As %String(MAXLEN = 9);
Property Country As %String(MAXLEN = 12);
}

Parameter STORAGEDEFAULT = "columnar" tells the system that all the data has to be stored in the columnar form (meaning each column will have its own global).

Parameter USEEXTENTSET = 1 tells the system to generate more efficient, hashed globals with shorter names.

You can declare any table as columnar. However, tables that use columnar as the default storage layout must specify either the Final class keyword or the NoExtent class keyword, with any immediate subclasses defined explicitly as Final. Otherwise you will get an error during compilation.

2. You can also define only some properties as stored by columns (example 2 at the top). To do this you need to specify the parameter STORAGEDEFAULT = "columnar" for a property.

Class Post.Address Extends %Persistent
{
Parameter STORAGEDEFAULT = "row";
Parameter USEEXTENTSET=1;
Property City As %String(MAXLEN = 12);
Property ZIP As %String(MAXLEN = 9);
Property Country As %String(MAXLEN = 12, STORAGEDEFAULT = "columnar");
}

This way Cities and ZIPs will be stored as usual in a global ^Post.AddressD and Countries will be stored in separate global as a column.

In the case of this example, this would be a much better approach, because if we have a database of different cities in different countries, the number of countries is limited while the number of cities not so much. Besides, there aren't many cases where you would need to do analytics queries on cities unlike on coutries.

I hope this helps you understand how to work with columnar storage in classes. There are quite a few limitations which you need to keep in mind so please read more on the subject here.

讨论 (0)1
登录或注册以继续
文章
· 六月 1, 2024 阅读大约需 3 分钟

Cómo configurar el almacenamiento en columnas en clases

​El almacenamiento en columnas es una de las nuevas ofertas de InterSystems IRIS. A diferencia del almacenamiento tradicional basado en filas, optimiza el procesamiento de consultas al almacenar datos en columnas en lugar de filas, lo que permite un acceso y una recuperación más rápidos de información relevante.

Se han escrito un par de artículos sobre cuándo se debe utilizar para darle el mayor impulso a un sistema, y cómo crear tablas así usando SQL.

CREATE TABLE tabla (columna1 tipo1, columna2 tipo2, columna3 tipo3) WITH STORAGETYPE = COLUMNAR -- ex 1
CREATE TABLE tabla (columna1 tipo1, columna2 tipo2, columna3 tipo3 WITH STORAGETYPE = COLUMNAR) -- ex 2

e incluso las pruebas de rendimiento.

Como todos sabemos, InterSystems IRIS es un DBMS multimodelo y brinda acceso perfecto a los mismos datos mediante acceso relacional y de objetos. Lo primero se trata en otros artículos, pero ¿qué pasa con lo segundo?

Es bueno saber que el diseño de almacenamiento en columnas también se puede definir en clases y hay varias formas de hacerlo.

1. Si desea definir el almacenamiento de todas las propiedades como en columnas (ejemplo 1 en la parte superior), simplemente agregue el siguiente parámetro a su clase:

Parameter STORAGEDEFAULT = "columnar" 

Y si tomamos un ejemplo anterior, obtendremos la siguiente clase:

Class Post.Address Extends %Persistent [Final]
{
Parameter STORAGEDEFAULT = "columnar";
Parameter USEEXTENTSET=1;
Property City As %String(MAXLEN = 12);
Property ZIP As %String(MAXLEN = 9);
Property Country As %String(MAXLEN = 12);
}

El parámetro STORAGEDEFAULT = "columnar" le dice al sistema que todos los datos deben almacenarse en forma de columnas (lo que significa que cada columna tendrá su propio global).

El parámetro USEEXTENTSET = 1 le indica al sistema que genere globales hash más eficientes con nombres más cortos.

Puede declarar cualquier tabla como de columnas. Sin embargo, las tablas que utilizan columnas como diseño de almacenamiento predeterminado deben especificar la palabra clave de clase Final o la palabra clave de clase NoExtent , con cualquier subclase inmediata definida explícitamente como Final. De lo contrario, obtendrá un error durante la compilación.

2. También puede definir solo algunas propiedades almacenadas por columnas (ejemplo 2 en la parte superior). Para hacer esto, debe especificar el parámetro STORAGEDEFAULT = "columnar" para una propiedad.

Class Post.Address Extends %Persistent
{
Parameter STORAGEDEFAULT = "row";
Parameter USEEXTENTSET=1;
Property City As %String(MAXLEN = 12);
Property ZIP As %String(MAXLEN = 9);
Property Country As %String(MAXLEN = 12, STORAGEDEFAULT = "columnar");
}

De esta manera, las ciudades y los códigos postales se almacenarán como de costumbre en una ^Post.AddressD global y los países se almacenarán en una columna global separada.

En el caso de este ejemplo, este sería un enfoque mucho mejor, porque si tenemos una base de datos de diferentes ciudades en diferentes países, la cantidad de países es limitada, mientras que la cantidad de ciudades no lo es tanto. Además, no hay muchos casos en los que sea necesario realizar consultas analíticas en ciudades, a diferencia de los países.

Espero que esto te ayude a comprender cómo trabajar con el almacenamiento en columnas en las clases. Hay bastantes limitaciones que debes tener en cuenta, así que lee más sobre el tema aquí.

讨论 (0)1
登录或注册以继续