online - neo4j sandbox
Modelado de Metadatos sobre un Cálculo Matemático en Neo4j (2)
Este es un caso de uso muy interesante y para mí se acerca mucho a lo que llamamos Motores de reglas.
Publiqué un caso de uso al respecto en el blog neo4j: https://neo4j.com/blog/uncommon-use-cases-graph-databases/
Por supuesto, existen múltiples formas de lograr lo que desea y compartiré una de las formas que tengo en mente.
Trataría los cálculos como una lista ordenada de Operations
cuyas naturalezas diferentes están definidas por su etiqueta. Por ejemplo, tendría un nodo de Operation
que tiene una Addition
etiqueta Addition
y su siguiente operación puede ser un Nodo de Operation
con una etiqueta Substraction
.
Un modelo simple podría representarse así:
Sus nodos de Operation
harían referencia al valor entrante que están usando.
En una situación más compleja, le gustaría representar un grupo de operaciones que puede definir una agrupación matemática entre paréntesis, de nuevo un modelo se puede hacer así:
Las posibilidades son casi infinitas.
Tenga en cuenta que en ciencias de la computación, esta técnica también se conoce como el patrón de especificación: https://www.martinfowler.com/apsupp/spec.pdf
Soy nuevo en el foro y recién estoy comenzando con Neo4J. Disculpas por mi larga pregunta y la información de fondo, pero creo que ayuda a explicar lo que trato de hacer.
A menudo trabajo en proyectos de Business Intelligence y Data Warehouse para empresas. Cuando creamos los requisitos de inteligencia empresarial, generalmente necesitamos crear una lista de las métricas empresariales que nos interesen (como ingresos de ventas, proporción de beneficios, gastos totales) y documentar cómo estas métricas empresariales se calculan usando atributos de datos de nuestros sistemas subyacentes. Normalmente documentamos la mayor parte de este trabajo en Excel en forma de hojas de cálculo de requisitos de datos. Creamos una lista de métricas de negocios y luego una pila de columnas con una descripción, atributos de datos de origen, cálculos, etc. Lo que trato de hacer (como un proyecto paralelo personal) es desarrollar una aplicación que podamos usar para documentar este tipo de información de metadatos en su lugar. He leído algunos de los libros y artículos en línea de Neo4j y creo que Neo4j se adapta bien a este caso de uso y en este momento estoy tratando de documentar un modelo básico de datos para ayudarme a comenzar.
Al principio, se me ocurrió algo bastante directo, como se muestra en la imagen de la izquierda a continuación, comenzando desde el punto en que:
Ingresos de ventas = Precio por unidad * Count_Units_Sold
Sin embargo, rápidamente me di cuenta de que el cálculo en sí es muy importante para mí y que, en un momento posterior, podría querer capturar más información al respecto, como agregar diferentes versiones de un cálculo o agregar notas para describirlo mejor. Modifiqué el modelo para hacer que el "cálculo mismo" fuera un nodo separado según la imagen de la izquierda de arriba.
Sin embargo, cuando empiezo a buscar métricas más complejas, todavía no estoy seguro de cuál es la mejor forma de representar los detalles del cálculo. Si tomo el siguiente ejemplo, lo modelaría de la siguiente manera.
Salario = monto_salario + monto_devengado - monto del impuesto
Ahora bien, esto representa claramente los atributos de datos (3 o ellos) que se usan en el cálculo, pero no sé cómo representar el cálculo en sí. Por ejemplo, para definir que el cálculo se hace sumando primero Salary_Amount a Overtime_Amount y luego restando Tax_Amount. Cuando tengo un cálculo más complejo que involucra división y multiplicación que debe realizarse en un orden particular, esto se volverá aún más complejo. Básicamente, quiero poder inferir del modelo que el cálculo es el siguiente:
Salario = monto_salario + monto_devengado - monto del impuesto
Opuesto a:
Salario = Cantidad_salario * Monto del impuesto / Cantidad de horas extras
O:
Salario = Monto del impuesto * Monto de horas extras - Cantidad del salario
Estoy buscando una forma de definir el Nodo de Cálculo mediante el cual puedo aplicar un orden a la forma en que se usan los atributos de datos. Puede ser que almacene el cálculo como una cadena de texto en la propiedad del cálculo, pero no puedo evitar pensar que esto podría causarme dolor en el futuro y limitar mi capacidad de obtener información de utilidad del gráfico cuando sea múltiple. los atributos de datos se usan en diferentes cálculos.
Nota: Vi esta pregunta en el foro que es similar a un tema pero no recibí muchas respuestas, por lo tanto, aunque mi pregunta es similar, creo que proporcionar más información de antecedentes podría aportar más información.
Muchas gracias, Michael
Estoy editando esta pregunta después de revisar las respuestas de @ChristopheWillemsen y @ stdob--.
En primer lugar, muchas gracias a ambos colaboradores. Las respuestas y el material de referencia fueron realmente útiles y ambos cubrieron mis requisitos. Inicialmente, me había inclinado hacia el uso de la notación polaca inversa según la respuesta de @ stdob, porque ofrecía una forma ordenada de manejar operaciones agrupadas (por ejemplo, paréntesis en mis fórmulas matemáticas). Sin embargo, después de tratar de modelar mis datos de ambas maneras, descubrí que tenía requisitos adicionales que no cubrí en mi primera publicación, que es capturar expresiones lógicas como "Si, Dónde, Tener". Básicamente, quiero poder capturar reglas de transformación de tipo ETL que van más allá de expresiones matemáticas puras y creo que la solución de @ChristopheWillemsen lo apoyará.
Así es como he modelado mis fórmulas básicas usando este enfoque:
Sin embargo, también tengo una lógica más compleja que quiero modelar. Estas son reglas de tipo ETL que normalmente se capturarían como pseudocódigo o en forma de SQL al definir los requisitos comerciales para un depósito de datos o proyecto de BI. A continuación se muestra un ejemplo en el que estoy definiendo la lógica de cómo un ETL podría calcular la métrica del recuento de nuevas reclamaciones para una compañía de seguros.
Así es como he modelado esto extendiéndome a la solución que @ChristopheWillemsen proporcionó en la primera respuesta a continuación.
¿Podría echar un vistazo a esto y ver si esta es una forma apropiada de modelar esto? Desde el punto de vista de los requisitos, querré poder:
- Reconstruir la lógica para poder presentarla a los usuarios finales
- Responda preguntas tales como las métricas para las que se necesita este atributo.
- Llevar a cabo qué pasa si el análisis (por ejemplo, si un valor de atributo cambia cuál es el impacto en las métricas que utilizan este atributo.
¿Esto parece un enfoque apropiado para modelar este tipo de información? ¿Alguna sugerencia o mejora sería bienvenida?
La primera opción es escribir la expresión en Notación polaca inversa y almacenarla en un árbol ordenado:
Salary_Amount * Tax_Amount / Overtime_Amount
=>
Salary_Amount Tax_Amount * Overtime_Amount /
La segunda opción que viene a la mente es mantener la fórmula en forma de texto y enviar la fórmula y el valor de los parámetros en cualquier lenguaje de scripting para ejecutar. Por ejemplo, en JavaScript eval
.
También recomiendo leer este artículo: las hojas de cálculo también son gráficos
Upd .: La idea de cómo usar el cifrado y la apoc-biblioteca para calcular fórmulas:
WITH "{Salary_Amount} * {Tax_Amount} / {Overtime_Amount}" as Formula
CALL apoc.cypher.run("return " + Formula + " as value", {
Salary_Amount: 1000,
Tax_Amount: 0.49,
Overtime_Amount: 100
}) yield value as result
RETURN result.value