1
0
mirror of https://github.com/adambard/learnxinyminutes-docs.git synced 2025-08-30 01:50:25 +02:00

unify header style

This commit is contained in:
Boris Verkhovskiy
2024-04-26 02:13:48 -07:00
parent 1924d58159
commit 5fb4c54268
5 changed files with 194 additions and 239 deletions

View File

@@ -1,4 +1,4 @@
name: Node.js CI name: CI
on: on:
push: push:
@@ -15,4 +15,4 @@ jobs:
with: with:
ruby-version: '3.2' ruby-version: '3.2'
- run: gem install mdl - run: gem install mdl
- run: mdl . --ignore-front-matter -r MD011,MD023,MD027,MD028,MD037,MD038,MD039,MD047 - run: mdl . --ignore-front-matter -r MD003,MD011,MD023,MD027,MD028,MD035,MD037,MD038,MD039,MD047

View File

@@ -1116,8 +1116,7 @@ proc main() {
} // end main() } // end main()
``` ```
Who is this tutorial for? ## Who is this tutorial for?
-------------------------
This tutorial is for people who want to learn the ropes of chapel without This tutorial is for people who want to learn the ropes of chapel without
having to hear about what fiber mixture the ropes are, or how they were having to hear about what fiber mixture the ropes are, or how they were
@@ -1132,28 +1131,27 @@ to see if more topics have been added or more tutorials created.
### What this tutorial is lacking: ### What this tutorial is lacking:
* Exposition of the [standard modules](https://chapel-lang.org/docs/latest/modules/standard.html) * Exposition of the [standard modules](https://chapel-lang.org/docs/latest/modules/standard.html)
* Multiple Locales (distributed memory system) * Multiple Locales (distributed memory system)
* Records * Records
* Parallel iterators * Parallel iterators
Your input, questions, and discoveries are important to the developers! ## Your input, questions, and discoveries are important to the developers!
-----------------------------------------------------------------------
The Chapel language is still in active development, so there are The Chapel language is still in active development, so there are
occasional hiccups with performance and language features. The more information occasional hiccups with performance and language features. The more information
you give the Chapel development team about issues you encounter or features you you give the Chapel development team about issues you encounter or features you
would like to see, the better the language becomes. would like to see, the better the language becomes.
There are several ways to interact with the developers: There are several ways to interact with the developers:
+ [Gitter chat](https://gitter.im/chapel-lang/chapel)
+ [sourceforge email lists](https://sourceforge.net/p/chapel/mailman) * [Gitter chat](https://gitter.im/chapel-lang/chapel)
* [sourceforge email lists](https://sourceforge.net/p/chapel/mailman)
If you're really interested in the development of the compiler or contributing If you're really interested in the development of the compiler or contributing
to the project, [check out the master GitHub repository](https://github.com/chapel-lang/chapel). to the project, [check out the master GitHub repository](https://github.com/chapel-lang/chapel).
It is under the [Apache 2.0 License](http://www.apache.org/licenses/LICENSE-2.0). It is under the [Apache 2.0 License](http://www.apache.org/licenses/LICENSE-2.0).
Installing the Compiler ## Installing the Compiler
-----------------------
[The Official Chapel documentation details how to download and compile the Chapel compiler.](https://chapel-lang.org/docs/usingchapel/QUICKSTART.html) [The Official Chapel documentation details how to download and compile the Chapel compiler.](https://chapel-lang.org/docs/usingchapel/QUICKSTART.html)
@@ -1161,23 +1159,22 @@ Chapel can be built and installed on your average 'nix machine (and cygwin).
[Download the latest release version](https://github.com/chapel-lang/chapel/releases/) [Download the latest release version](https://github.com/chapel-lang/chapel/releases/)
and it's as easy as and it's as easy as
1. `tar -xvf chapel-<VERSION>.tar.gz` 1. `tar -xvf chapel-<VERSION>.tar.gz`
2. `cd chapel-<VERSION>` 2. `cd chapel-<VERSION>`
3. `source util/setchplenv.bash # or .sh or .csh or .fish` 3. `source util/setchplenv.bash # or .sh or .csh or .fish`
4. `make` 4. `make`
5. `make check # optional` 5. `make check # optional`
You will need to `source util/setchplenv.EXT` from within the Chapel directory You will need to `source util/setchplenv.EXT` from within the Chapel directory
(`$CHPL_HOME`) every time your terminal starts so it's suggested that you drop (`$CHPL_HOME`) every time your terminal starts so it's suggested that you drop
that command in a script that will get executed on startup (like .bashrc). that command in a script that will get executed on startup (like .bashrc).
Chapel is easily installed with Brew for macOS Chapel is easily installed on macOS with Homebrew
1. `brew update` 1. `brew update`
2. `brew install chapel` 2. `brew install chapel`
Compiling Code ## Compiling Code
--------------
Builds like other compilers: Builds like other compilers:
@@ -1185,10 +1182,10 @@ Builds like other compilers:
Notable arguments: Notable arguments:
* `--fast`: enables a number of optimizations and disables array bounds * `--fast`: enables a number of optimizations and disables array bounds
checks. Should only enable when application is stable. checks. Should only enable when application is stable.
* `--set <Symbol Name>=<Value>`: set config param `<Symbol Name>` to `<Value>` * `--set <Symbol Name>=<Value>`: set config param `<Symbol Name>` to `<Value>`
at compile-time. at compile-time.
* `--main-module <Module Name>`: use the main() procedure found in the module * `--main-module <Module Name>`: use the main() procedure found in the module
`<Module Name>` as the executable's main. `<Module Name>` as the executable's main.
* `--module-dir <Directory>`: includes `<Directory>` in the module search path. * `--module-dir <Directory>`: includes `<Directory>` in the module search path.

View File

@@ -11,10 +11,9 @@ lang: es-es
Puede leer todo sobre Chapel en [el sitio web oficial de Chapel de Cray](https://chapel-lang.org). Puede leer todo sobre Chapel en [el sitio web oficial de Chapel de Cray](https://chapel-lang.org).
En resumen, Chapel es un lenguaje de programación paralela, código abierto, de alta productividad En resumen, Chapel es un lenguaje de programación paralela, código abierto, de alta productividad
desarrolladp en Cray Inc. y está diseñado para ejecutarse en PC multi-nucleos, desarrolladp en Cray Inc. y está diseñado para ejecutarse en PC multi-nucleos,
así como en supercomputadoras multi-kilocore. así como en supercomputadoras multi-kilocore.
Puede encontrar más información y asistencia al final de este documento. Puede encontrar más información y asistencia al final de este documento.
```chapel ```chapel
@@ -39,7 +38,7 @@ stdout.writeln("Esto va a la salida estándar, al igual que lo hace writeln()");
stderr.writeln("Esto va al error estándar"); stderr.writeln("Esto va al error estándar");
// Las variables no tienen que escribirse explícitamente // Las variables no tienen que escribirse explícitamente
// mientras el compilador pueda determinar el tipo que contendrá. // mientras el compilador pueda determinar el tipo que contendrá.
// 10 es un entero, asi que myVar es explícitamente un entero // 10 es un entero, asi que myVar es explícitamente un entero
@@ -86,7 +85,7 @@ var white: RGBColor = (255, 255, 255);
// establecerla en tiempo de ejecución. // establecerla en tiempo de ejecución.
const almostPi: real = 22.0/7.0; const almostPi: real = 22.0/7.0;
// Un parámetro es una constante cuyo valor debe conocerse estáticamente // Un parámetro es una constante cuyo valor debe conocerse estáticamente
// en tiempo de compilación. // en tiempo de compilación.
param compileTimeConst: int = 16; param compileTimeConst: int = 16;
@@ -103,8 +102,8 @@ writeln(varCmdLineArg, ", ", constCmdLineArg, ", ", paramCmdLineArg);
// Referencias // Referencias
// ref funciona de manera muy similar a una referencia en C ++. En Chapel, // ref funciona de manera muy similar a una referencia en C ++. En Chapel,
// no se puede hacer una referencia como alias a una variable distinta // no se puede hacer una referencia como alias a una variable distinta
// de la variable con la que se inicializa. // de la variable con la que se inicializa.
// Aquí, refToActual se refiere a actual. // Aquí, refToActual se refiere a actual.
@@ -152,7 +151,7 @@ a *= thatInt; // Multiplicación-igual (a = a * thatInt;)
b &&= thatBool; // Lógico e igual (b = b && thatBool;) b &&= thatBool; // Lógico e igual (b = b && thatBool;)
a <<= 3; // Desplazamiento a la izquierda igual (a = a << 10;) a <<= 3; // Desplazamiento a la izquierda igual (a = a << 10;)
// A diferencia de otros lenguajes de familia C, no hay operadores de // A diferencia de otros lenguajes de familia C, no hay operadores de
// pre / post-incremento / decremento, tales como: // pre / post-incremento / decremento, tales como:
// //
// ++j, --j, j++, j-- // ++j, --j, j++, j--
@@ -185,7 +184,7 @@ diffTup(1) = -1;
var (tupInt, tupReal, tupCplx) = diffTup; var (tupInt, tupReal, tupCplx) = diffTup;
writeln(diffTup == (tupInt, tupReal, tupCplx)); writeln(diffTup == (tupInt, tupReal, tupCplx));
// También son útiles para imprimit una lista de variables, // También son útiles para imprimit una lista de variables,
// como es común en la depuración. // como es común en la depuración.
writeln((a,b,thisInt,thatInt,thisBool,thatBool)); writeln((a,b,thisInt,thatInt,thisBool,thatBool));
@@ -223,7 +222,7 @@ if a % 3 == 0 {
var maximum = if thisInt < thatInt then thatInt else thisInt; var maximum = if thisInt < thatInt then thatInt else thisInt;
// las declaraciones select son muy parecidas a las declaraciones switch // las declaraciones select son muy parecidas a las declaraciones switch
// en otros idiomas. Sin embargo, las declaraciones select no caen // en otros idiomas. Sin embargo, las declaraciones select no caen
// en cascada como en C o Java. // en cascada como en C o Java.
var inputOption = "anOption"; var inputOption = "anOption";
select inputOption { select inputOption {
@@ -253,7 +252,7 @@ do {
} while (j <= 10000); } while (j <= 10000);
writeln(jSum); writeln(jSum);
// Los bucles for son muy parecidos a los de Python porque iteran en un rango. // Los bucles for son muy parecidos a los de Python porque iteran en un rango.
// Los rangos (como la expresión 1..10 a continuación) son un objeto de primera clase // Los rangos (como la expresión 1..10 a continuación) son un objeto de primera clase
// en Chapel, y como tal pueden almacenarse en variables. // en Chapel, y como tal pueden almacenarse en variables.
for i in 1..10 do write(i, ", "); for i in 1..10 do write(i, ", ");
@@ -275,8 +274,8 @@ for x in 1..10 {
// Rangos y Dominios // Rangos y Dominios
// Los bucles y matrices utilizan rangos y dominios para definir un conjunto de índices // Los bucles y matrices utilizan rangos y dominios para definir un conjunto de índices
// que se pueden iterar. Los rangos son índices enteros unidimensionales, mientras // que se pueden iterar. Los rangos son índices enteros unidimensionales, mientras
// que los dominios pueden ser multidimensionales y representan índices // que los dominios pueden ser multidimensionales y representan índices
// de diferentes tipos. // de diferentes tipos.
// Son tipos ciudadanos de primera clase y pueden asignarse a variables. // Son tipos ciudadanos de primera clase y pueden asignarse a variables.
@@ -296,7 +295,7 @@ var reverse2to10by2 = 2..10 by -2; // 10, 8, 6, 4, 2
var trapRange = 10..1 by -1; // No te dejes engañar, esto sigue siendo un rango vacío var trapRange = 10..1 by -1; // No te dejes engañar, esto sigue siendo un rango vacío
writeln("Size of range ", trapRange, " = ", trapRange.length); writeln("Size of range ", trapRange, " = ", trapRange.length);
// Note: range(boundedType= ...) and range(stridable= ...) solo son necesarios // Note: range(boundedType= ...) and range(stridable= ...) solo son necesarios
// si escribimos explícitamente la variable. // si escribimos explícitamente la variable.
// El punto final de un rango se puede determinar utilizando el operador de conteo (#). // El punto final de un rango se puede determinar utilizando el operador de conteo (#).
@@ -316,7 +315,7 @@ for i in rangeCountBy {
write(i, if i == rangeCountBy.last then "\n" else ", "); write(i, if i == rangeCountBy.last then "\n" else ", ");
} }
// Los dominios rectangulares se definen usando la misma sintaxis de rango, // Los dominios rectangulares se definen usando la misma sintaxis de rango,
// pero se requiere que estén delimitados (a diferencia de los rangos). // pero se requiere que estén delimitados (a diferencia de los rangos).
var domain1to10: domain(1) = {1..10}; // 1D domain from 1..10; var domain1to10: domain(1) = {1..10}; // 1D domain from 1..10;
var twoDimensions: domain(2) = {-2..2,0..2}; // 2D domain over product of ranges var twoDimensions: domain(2) = {-2..2,0..2}; // 2D domain over product of ranges
@@ -352,7 +351,7 @@ writeln(stringSet.sorted());
// Los dominios asociativos también pueden tener una sintaxis literal // Los dominios asociativos también pueden tener una sintaxis literal
var intSet = {1, 2, 4, 5, 100}; var intSet = {1, 2, 4, 5, 100};
// Tanto los rangos como los dominios se pueden dividir para producir un rango // Tanto los rangos como los dominios se pueden dividir para producir un rango
// o dominio con la intersección de los índices. // o dominio con la intersección de los índices.
var rangeA = 1.. ; // range from 1 to infinity var rangeA = 1.. ; // range from 1 to infinity
var rangeB = ..5; // range from negative infinity to 5 var rangeB = ..5; // range from negative infinity to 5
@@ -377,7 +376,7 @@ for i in 1..10 do
writeln(intArray); writeln(intArray);
// No podemos acceder a intArray[0] porque existe fuera del conjunto de índices, // No podemos acceder a intArray[0] porque existe fuera del conjunto de índices,
// {1..10}, que definimos al principio. // {1..10}, que definimos al principio.
// intArray [11] es ilegal por la misma razón. // intArray [11] es ilegal por la misma razón.
var realDomain: domain(2) = {1..5,1..7}; var realDomain: domain(2) = {1..5,1..7};
var realArray: [realDomain] real; var realArray: [realDomain] real;
@@ -431,12 +430,12 @@ writeln((thisArray, thatArray));
thatArray[4..5] = thisArray[1..2]; thatArray[4..5] = thisArray[1..2];
writeln((thisArray, thatArray)); writeln((thisArray, thatArray));
// Las operaciones también se pueden promover para trabajar en arreglos. // Las operaciones también se pueden promover para trabajar en arreglos.
// 'thisPlusThat' también es una matriz. // 'thisPlusThat' también es una matriz.
var thisPlusThat = thisArray + thatArray; var thisPlusThat = thisArray + thatArray;
writeln(thisPlusThat); writeln(thisPlusThat);
// Continuando, las matrices y los bucles también pueden ser expresiones, donde // Continuando, las matrices y los bucles también pueden ser expresiones, donde
// la expresión del cuerpo del bucle es el resultado de cada iteración. // la expresión del cuerpo del bucle es el resultado de cada iteración.
var arrayFromLoop = for i in 1..10 do i; var arrayFromLoop = for i in 1..10 do i;
writeln(arrayFromLoop); writeln(arrayFromLoop);
@@ -494,11 +493,11 @@ writeln(defaultsProc(x=11));
writeln(defaultsProc(x=12, y=5.432)); writeln(defaultsProc(x=12, y=5.432));
writeln(defaultsProc(y=9.876, x=13)); writeln(defaultsProc(y=9.876, x=13));
// El operador ? se llama operador de consulta y se usa para tomar valores // El operador ? se llama operador de consulta y se usa para tomar valores
// indeterminados como tuplas o tamaños de matriz y tipos genéricos. // indeterminados como tuplas o tamaños de matriz y tipos genéricos.
// Por ejemplo, tomar matrices como parámetros. // Por ejemplo, tomar matrices como parámetros.
// El operador de consulta se utiliza para determinar el dominio de A. // El operador de consulta se utiliza para determinar el dominio de A.
// Esto es útil para definir el tipo de retorno, aunque no es obligatorio. // Esto es útil para definir el tipo de retorno, aunque no es obligatorio.
proc invertArray(A: [?D] int): [D] int{ proc invertArray(A: [?D] int): [D] int{
for a in A do a = -a; for a in A do a = -a;
@@ -523,9 +522,9 @@ genericProc(1.2, 2.3);
genericProc(1.0+2.0i, 3.0+4.0i); genericProc(1.0+2.0i, 3.0+4.0i);
// También podemos imponer una forma de polimorfismo con la cláusula where // También podemos imponer una forma de polimorfismo con la cláusula where
// Esto permite que el compilador decida qué función usar. // Esto permite que el compilador decida qué función usar.
// Nota: Eso significa que toda la información debe conocerse en tiempo de compilación. // Nota: Eso significa que toda la información debe conocerse en tiempo de compilación.
// El modificador param en el argumento se usa para imponer esta restricción. // El modificador param en el argumento se usa para imponer esta restricción.
proc whereProc(param N : int): void proc whereProc(param N : int): void
where (N > 0) { where (N > 0) {
@@ -541,7 +540,7 @@ whereProc(10);
whereProc(-1); whereProc(-1);
// whereProc(0) daría lugar a un error del compilador porque no hay funciones // whereProc(0) daría lugar a un error del compilador porque no hay funciones
// que satisfagan la condición de la cláusula where. // que satisfagan la condición de la cláusula where.
// Podríamos haber definido un whereProc sin una cláusula where que // Podríamos haber definido un whereProc sin una cláusula where que
// hubiera servido como captura para todos los demás casos (de los cuales solo hay uno). // hubiera servido como captura para todos los demás casos (de los cuales solo hay uno).
@@ -583,9 +582,9 @@ writeln("Afuera antes: ", (inVar, outVar, inoutVar, refVar));
intentsProc(inVar, outVar, inoutVar, refVar); intentsProc(inVar, outVar, inoutVar, refVar);
writeln("Afuera después: ", (inVar, outVar, inoutVar, refVar)); writeln("Afuera después: ", (inVar, outVar, inoutVar, refVar));
// Del mismo modo, podemos definir intentos en el tipo de retorno. // Del mismo modo, podemos definir intentos en el tipo de retorno.
// refElement devuelve una referencia a un elemento de la matriz. Esto tiene más sentido // refElement devuelve una referencia a un elemento de la matriz. Esto tiene más sentido
// práctico para los métodos de clase donde las referencias a elementos en una estructura // práctico para los métodos de clase donde las referencias a elementos en una estructura
// de datos se devuelven a través de un método o iterador. // de datos se devuelven a través de un método o iterador.
proc refElement(array : [?D] ?T, idx) ref : T { proc refElement(array : [?D] ?T, idx) ref : T {
return array[idx]; return array[idx];
@@ -638,12 +637,12 @@ writeln(1 * 2); // Utiliza el operador predeterminado *.
// Iteradores // Iteradores
// Los iteradores son hermanas del procedimiento, y casi todo lo relacionado // Los iteradores son hermanas del procedimiento, y casi todo lo relacionado
// con los procedimientos también se aplica a los iteradores. Sin embargo, en lugar de // con los procedimientos también se aplica a los iteradores. Sin embargo, en lugar de
// devolver un solo valor, los iteradores pueden generar múltiples valores en un bucle. // devolver un solo valor, los iteradores pueden generar múltiples valores en un bucle.
// Esto es útil cuando se necesita un conjunto u orden complicado de iteraciones, // Esto es útil cuando se necesita un conjunto u orden complicado de iteraciones,
// ya que permite que el código que define las iteraciones // ya que permite que el código que define las iteraciones
// se separe del cuerpo del bucle. // se separe del cuerpo del bucle.
iter oddsThenEvens(N: int): int { iter oddsThenEvens(N: int): int {
for i in 1..N by 2 do for i in 1..N by 2 do
@@ -668,13 +667,13 @@ for i in absolutelyNothing(10) {
writeln("Woa there! absolutelyNothing yielded ", i); writeln("Woa there! absolutelyNothing yielded ", i);
} }
// Podemos comprimir dos o más iteradores (que tienen el mismo número de iteraciones) // Podemos comprimir dos o más iteradores (que tienen el mismo número de iteraciones)
// usando zip () para crear un solo iterador comprimido, donde cada iteración // usando zip () para crear un solo iterador comprimido, donde cada iteración
// del iterador comprimido produce una tupla de un valor de cada iterador. // del iterador comprimido produce una tupla de un valor de cada iterador.
for (positive, negative) in zip(1..5, -5..-1) do for (positive, negative) in zip(1..5, -5..-1) do
writeln((positive, negative)); writeln((positive, negative));
// La iteración de la cremallera es bastante importante en la asignación de matrices, // La iteración de la cremallera es bastante importante en la asignación de matrices,
// segmentos de matrices y expresiones de matriz / bucle. // segmentos de matrices y expresiones de matriz / bucle.
var fromThatArray : [1..#5] int = [1,2,3,4,5]; var fromThatArray : [1..#5] int = [1,2,3,4,5];
var toThisArray : [100..#5] int; var toThisArray : [100..#5] int;
@@ -696,7 +695,7 @@ for (i, j) in zip(toThisArray.domain, -100..#5) {
writeln(toThisArray); writeln(toThisArray);
/* /*
Esto es muy importante para entender por qué esta declaración Esto es muy importante para entender por qué esta declaración
exhibe un error de tiempo de ejecución. exhibe un error de tiempo de ejecución.
*/ */
@@ -718,16 +717,16 @@ class MyClass {
var memberInt : int; var memberInt : int;
var memberBool : bool = true; var memberBool : bool = true;
// Inicializador definido explícitamente. // Inicializador definido explícitamente.
// También obtenemos el inicializador generado por el compilador, con un argumento por campo. // También obtenemos el inicializador generado por el compilador, con un argumento por campo.
// Tenga en cuenta que pronto no habrá un inicializador generado por el compilador // Tenga en cuenta que pronto no habrá un inicializador generado por el compilador
// cuando definamos los inicializadores explícitamente. // cuando definamos los inicializadores explícitamente.
proc init(val : real) { proc init(val : real) {
this.memberInt = ceil(val): int; this.memberInt = ceil(val): int;
} }
// Desinicializador explícitamente definido. // Desinicializador explícitamente definido.
// Si no escribiéramos uno, obtendríamos el desinicializador generado por el compilador, // Si no escribiéramos uno, obtendríamos el desinicializador generado por el compilador,
// que tiene un cuerpo vacío. // que tiene un cuerpo vacío.
proc deinit() { proc deinit() {
writeln("MyClass deinitializer called ", (this.memberInt, this.memberBool)); writeln("MyClass deinitializer called ", (this.memberInt, this.memberBool));
@@ -751,7 +750,7 @@ class MyClass {
} }
} // termina MyClass } // termina MyClass
// Llame al inicializador generado por el compilador, // Llame al inicializador generado por el compilador,
// utilizando el valor predeterminado para memberBool. // utilizando el valor predeterminado para memberBool.
var myObject = new MyClass(10); var myObject = new MyClass(10);
myObject = new MyClass(memberInt = 10); // Equivalente myObject = new MyClass(memberInt = 10); // Equivalente
@@ -801,8 +800,8 @@ class GenericClass {
// Copiar constructor. // Copiar constructor.
// Nota: Todavía tenemos que poner el tipo como argumento, pero podemos usar // Nota: Todavía tenemos que poner el tipo como argumento, pero podemos usar
// el operador de consulta (?) como predeterminado para el tipo del otro objeto. // el operador de consulta (?) como predeterminado para el tipo del otro objeto.
// Además, podemos aprovechar esto para permitir a nuestro constructor de copias // Además, podemos aprovechar esto para permitir a nuestro constructor de copias
// copiar clases de diferentes tipos y emitir sobre la marcha. // copiar clases de diferentes tipos y emitir sobre la marcha.
proc GenericClass(other : GenericClass(?otherType), proc GenericClass(other : GenericClass(?otherType),
type classType = otherType) { type classType = otherType) {
@@ -818,7 +817,7 @@ class GenericClass {
return this.classArray[i]; return this.classArray[i];
} }
// Definir un iterador implícito para que la clase produzca // Definir un iterador implícito para que la clase produzca
// valores de la matriz a un bucle // valores de la matriz a un bucle
// i.e. for i in objVar do ... // i.e. for i in objVar do ...
iter these() ref : classType { iter these() ref : classType {
@@ -827,12 +826,12 @@ class GenericClass {
} }
} // end GenericClass } // end GenericClass
// Podemos asignar a la matriz de miembros del objeto usando la notación de // Podemos asignar a la matriz de miembros del objeto usando la notación de
// corchete que definimos. // corchete que definimos.
var realList = new GenericClass(real, 10); var realList = new GenericClass(real, 10);
for i in realList.classDomain do realList[i] = i + 1.0; for i in realList.classDomain do realList[i] = i + 1.0;
// Podemos iterar sobre los valores en nuestra lista con el iterador // Podemos iterar sobre los valores en nuestra lista con el iterador
// que definimos. // que definimos.
for value in realList do write(value, ", "); for value in realList do write(value, ", ");
writeln(); writeln();
@@ -852,7 +851,7 @@ writeln();
// Los módulos son la forma en que Chapel administra los espacios de nombres. // Los módulos son la forma en que Chapel administra los espacios de nombres.
// Los archivos que contienen estos módulos no necesitan ser nombrados después // Los archivos que contienen estos módulos no necesitan ser nombrados después
// de los módulos (como en Java), pero los archivos implícitamente nombran módulos. // de los módulos (como en Java), pero los archivos implícitamente nombran módulos.
// Por ejemplo, este archivo nombra implícitamente el módulo learnChapelInYMinutes // Por ejemplo, este archivo nombra implícitamente el módulo learnChapelInYMinutes
module OurModule { module OurModule {
@@ -888,7 +887,7 @@ module OurModule {
// Como OurModule usa Time, nosotros también usamos Time. // Como OurModule usa Time, nosotros también usamos Time.
use OurModule; use OurModule;
// En este punto no hemos usado ChildModule o SiblingModule, por lo que sus símbolos // En este punto no hemos usado ChildModule o SiblingModule, por lo que sus símbolos
// (es decir, foo) no están disponibles para nosotros. Sin embargo, los nombres de // (es decir, foo) no están disponibles para nosotros. Sin embargo, los nombres de
// los módulos están disponibles y podemos llamar explícitamente a foo () a través de ellos. // los módulos están disponibles y podemos llamar explícitamente a foo () a través de ellos.
SiblingModule.foo(); SiblingModule.foo();
@@ -901,7 +900,7 @@ foo();
// Paralelismo // Paralelismo
// En otros idiomas, el paralelismo generalmente se realiza con librerias complicadas // En otros idiomas, el paralelismo generalmente se realiza con librerias complicadas
// y extrañas jerarquías de estructura de clases. // y extrañas jerarquías de estructura de clases.
// Chapel lo tiene directamente en el idioma. // Chapel lo tiene directamente en el idioma.
// Podemos declarar un procedimiento principal, pero todo el código anterior // Podemos declarar un procedimiento principal, pero todo el código anterior
@@ -909,7 +908,7 @@ foo();
proc main() { proc main() {
// Una declaración de inicio hará girar el cuerpo de esa declaración en una nueva tarea. // Una declaración de inicio hará girar el cuerpo de esa declaración en una nueva tarea.
// Una declaración de sincronización garantizará que el progreso de la tarea principal // Una declaración de sincronización garantizará que el progreso de la tarea principal
// no avance hasta que los hijos hayan sincronizado nuevamente. // no avance hasta que los hijos hayan sincronizado nuevamente.
sync { sync {
@@ -927,15 +926,15 @@ proc main() {
} }
// Una declaración de cobegin girará cada declaración del cuerpo en una nueva tarea. // Una declaración de cobegin girará cada declaración del cuerpo en una nueva tarea.
// Observe aquí que las impresiones de cada declaración pueden ocurrir en // Observe aquí que las impresiones de cada declaración pueden ocurrir en
// cualquier orden. // cualquier orden.
cobegin { cobegin {
printFibb(20); // nueva tarea printFibb(20); // nueva tarea
printFibb(10); // nueva tarea printFibb(10); // nueva tarea
printFibb(5); // nueva tarea printFibb(5); // nueva tarea
{ {
// Este es un cuerpo de declaración anidado y, por lo tanto, es una // Este es un cuerpo de declaración anidado y, por lo tanto, es una
// declaración única para la declaración principal, ejecutada // declaración única para la declaración principal, ejecutada
// por una sola tarea. // por una sola tarea.
writeln("esto se "); writeln("esto se ");
writeln("ejecuta"); writeln("ejecuta");
@@ -943,29 +942,29 @@ proc main() {
} }
} }
// Un bucle coforall creará una nueva tarea para CADA iteración. // Un bucle coforall creará una nueva tarea para CADA iteración.
// Nuevamente vemos que las impresiones suceden en cualquier orden. // Nuevamente vemos que las impresiones suceden en cualquier orden.
// NOTA: ¡coforall debe usarse solo para crear tareas! // NOTA: ¡coforall debe usarse solo para crear tareas!
// ¡Usarlo para iterar sobre una estructura es una muy mala idea! // ¡Usarlo para iterar sobre una estructura es una muy mala idea!
var num_tasks = 10; // Number of tasks we want var num_tasks = 10; // Number of tasks we want
coforall taskID in 1..#num_tasks { coforall taskID in 1..#num_tasks {
writeln("Hola de tarea# ", taskID); writeln("Hola de tarea# ", taskID);
} }
// los bucles forall son otro bucle paralelo, pero solo crean un número // los bucles forall son otro bucle paralelo, pero solo crean un número
// menor de tareas, específicamente --dataParTasksPerLocale = número de tareas. // menor de tareas, específicamente --dataParTasksPerLocale = número de tareas.
forall i in 1..100 { forall i in 1..100 {
write(i, ", "); write(i, ", ");
} }
writeln(); writeln();
// Aquí vemos que hay secciones que están en orden, seguidas de una sección // Aquí vemos que hay secciones que están en orden, seguidas de una sección
// que no seguiría (por ejemplo, 1, 2, 3, 7, 8, 9, 4, 5, 6,). // que no seguiría (por ejemplo, 1, 2, 3, 7, 8, 9, 4, 5, 6,).
// Esto se debe a que cada tarea está asumiendo un fragmento del rango 1..10 // Esto se debe a que cada tarea está asumiendo un fragmento del rango 1..10
// (1..3, 4..6 o 7..9) haciendo ese fragmento en serie, pero cada tarea ocurre en paralelo. // (1..3, 4..6 o 7..9) haciendo ese fragmento en serie, pero cada tarea ocurre en paralelo.
// Sus resultados pueden depender de su máquina y configuración // Sus resultados pueden depender de su máquina y configuración
// Para los bucles forall y coforall, la ejecución de la tarea principal // Para los bucles forall y coforall, la ejecución de la tarea principal
// no continuará hasta que todos los hijos se sincronicen. // no continuará hasta que todos los hijos se sincronicen.
// los bucles forall son particularmente útiles para la iteración paralela sobre matrices. // los bucles forall son particularmente útiles para la iteración paralela sobre matrices.
@@ -1002,7 +1001,7 @@ proc main() {
// Las variables atómicas, comunes a muchos idiomas, son aquellas cuyas operaciones // Las variables atómicas, comunes a muchos idiomas, son aquellas cuyas operaciones
// ocurren sin interrupciones. Por lo tanto, varios subprocesos pueden modificar // ocurren sin interrupciones. Por lo tanto, varios subprocesos pueden modificar
// las variables atómicas y pueden saber que sus valores son seguros. // las variables atómicas y pueden saber que sus valores son seguros.
// Las variables atómicas de la capilla pueden ser de tipo bool, int, uint y real. // Las variables atómicas de la capilla pueden ser de tipo bool, int, uint y real.
var uranium: atomic int; var uranium: atomic int;
uranium.write(238); // escribir atómicamente una variable uranium.write(238); // escribir atómicamente una variable
@@ -1041,7 +1040,7 @@ proc main() {
} }
// las variables de sincronización tienen dos estados: vacío y lleno. // las variables de sincronización tienen dos estados: vacío y lleno.
// Si lee una variable vacía o escribe una variable completa, // Si lee una variable vacía o escribe una variable completa,
// se espera hasta que la variable esté llena o vacía nuevamente. // se espera hasta que la variable esté llena o vacía nuevamente.
var someSyncVar$: sync int; // varName$ Es una convención, no una ley. var someSyncVar$: sync int; // varName$ Es una convención, no una ley.
sync { sync {
@@ -1058,7 +1057,7 @@ proc main() {
} }
} }
// las variales individuales solo se pueden escribir una vez. // las variales individuales solo se pueden escribir una vez.
// Una lectura en un solo no escrito da como resultado una espera, // Una lectura en un solo no escrito da como resultado una espera,
// pero cuando la variable tiene un valor, puede leerse indefinidamente. // pero cuando la variable tiene un valor, puede leerse indefinidamente.
var someSingleVar$: single int; // varName$ Es una convención, no una ley. var someSingleVar$: single int; // varName$ Es una convención, no una ley.
@@ -1078,7 +1077,7 @@ proc main() {
} }
} }
// Aquí hay un ejemplo usando atómica y una variable de sincronización // Aquí hay un ejemplo usando atómica y una variable de sincronización
// para crear un mutex de cuenta regresiva // para crear un mutex de cuenta regresiva
// (también conocido como multiplexor). // (también conocido como multiplexor).
var count: atomic int; // nuestro mostrador var count: atomic int; // nuestro mostrador
@@ -1133,8 +1132,7 @@ proc main() {
} // end main() } // end main()
``` ```
¿Para quién es este tutorial? ## ¿Para quién es este tutorial?
-------------------------
Este tutorial es para personas que desean aprender las cuerdas de chapel sin tener Este tutorial es para personas que desean aprender las cuerdas de chapel sin tener
que escuchar sobre qué mezcla de fibras son las cuerdas, o cómo fueron trenzadas, que escuchar sobre qué mezcla de fibras son las cuerdas, o cómo fueron trenzadas,
@@ -1148,61 +1146,58 @@ para ver si se han agregado más temas o se han creado más tutoriales.
### Lo que le falta a este tutorial: ### Lo que le falta a este tutorial:
* Exposición de los [módulos estándar](https://chapel-lang.org/docs/latest/modules/standard.html) * Exposición de los [módulos estándar](https://chapel-lang.org/docs/latest/modules/standard.html)
* Múltiples configuraciones regionales (sistema de memoria distribuida) * Múltiples configuraciones regionales (sistema de memoria distribuida)
* Registros * Registros
* Iteradores paralelos * Iteradores paralelos
¡Sus comentarios, preguntas y descubrimientos son importantes para los desarrolladores! ## ¡Sus comentarios, preguntas y descubrimientos son importantes para los desarrolladores!
-----------------------------------------------------------------------
El lenguaje Chapel todavía está en desarrollo activo, por lo que El lenguaje Chapel todavía está en desarrollo activo, por lo que
ocasionalmente hay problemas con el rendimiento y ocasionalmente hay problemas con el rendimiento y
las características del lenguaje. las características del lenguaje.
Cuanta más información brinde al equipo de desarrollo de Chapel Cuanta más información brinde al equipo de desarrollo de Chapel
sobre los problemas que encuentre o las características que le gustaría ver, sobre los problemas que encuentre o las características que le gustaría ver,
mejor será el lenguaje. mejor será el lenguaje.
Hay varias formas de interactuar con los desarrolladores: Hay varias formas de interactuar con los desarrolladores:
+ [Chat de Gitter](https://gitter.im/chapel-lang/chapel)
+ [lista de emails de Sourceforge](https://sourceforge.net/p/chapel/mailman) * [Chat de Gitter](https://gitter.im/chapel-lang/chapel)
* [lista de emails de Sourceforge](https://sourceforge.net/p/chapel/mailman)
Si está realmente interesado en el desarrollo del compilador o en contribuir al proyecto, Si está realmente interesado en el desarrollo del compilador o en contribuir al proyecto,
[consulte el repositorio maestro de GitHub](https://github.com/chapel-lang/chapel). [consulte el repositorio maestro de GitHub](https://github.com/chapel-lang/chapel).
Está bajo el [La licencia Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0). Está bajo el [La licencia Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0).
Instalar el compilador ## Instalar el compilador
-----------------------
[La documentación oficial de Chapel detalla cómo descargar y compilar el compilador de Chapel.](https://chapel-lang.org/docs/usingchapel/QUICKSTART.html) [La documentación oficial de Chapel detalla cómo descargar y compilar el compilador de Chapel.](https://chapel-lang.org/docs/usingchapel/QUICKSTART.html)
Chapel se puede construir e instalar en su máquina promedio 'nix (y cygwin). Chapel se puede construir e instalar en su máquina promedio 'nix (y cygwin).
[Descargue la última versión de lanzamiento](https://github.com/chapel-lang/chapel/releases/) [Descargue la última versión de lanzamiento](https://github.com/chapel-lang/chapel/releases/)
y es tan fácil como y es tan fácil como
1. `tar -xvf chapel-<VERSION>.tar.gz` 1. `tar -xvf chapel-<VERSION>.tar.gz`
2. `cd chapel-<VERSION>` 2. `cd chapel-<VERSION>`
3. `source util/setchplenv.bash # or .sh or .csh or .fish` 3. `source util/setchplenv.bash # or .sh or .csh or .fish`
4. `make` 4. `make`
5. `make check # optional` 5. `make check # optional`
You will need to `source util/setchplenv.EXT` from within the Chapel directory You will need to `source util/setchplenv.EXT` from within the Chapel directory
(`$CHPL_HOME`) every time your terminal starts so it's suggested that you drop (`$CHPL_HOME`) every time your terminal starts so it's suggested that you drop
that command in a script that will get executed on startup (like .bashrc). that command in a script that will get executed on startup (like .bashrc).
Necesitará `source util/setchplenv.EXT` desde el directorio de Chapel (`$CHPL_HOME`) Necesitará `source util/setchplenv.EXT` desde el directorio de Chapel (`$CHPL_HOME`)
cada vez que se inicie su terminal, por lo que se sugiere que suelte ese comando cada vez que se inicie su terminal, por lo que se sugiere que suelte ese comando
en un script que se ejecutará al inicio (como .bashrc). en un script que se ejecutará al inicio (como .bashrc).
Chapel se instala fácilmente con Brew para OS X Chapel se instala fácilmente con Brew para OS X
1. `brew update` 1. `brew update`
2. `brew install chapel` 2. `brew install chapel`
Compilando Código ## Compilando Código
--------------
Construye como otros compiladores: Construye como otros compiladores:
@@ -1210,10 +1205,10 @@ Construye como otros compiladores:
Argumentos notables: Argumentos notables:
* `--fast`: habilita varias optimizaciones y deshabilita las comprobaciones * `--fast`: habilita varias optimizaciones y deshabilita las comprobaciones
de los límites de la matriz Solo debe habilitarse cuando la aplicación es estable. de los límites de la matriz Solo debe habilitarse cuando la aplicación es estable.
* `--set <Nombre del Symbolo>=<Valor>`: establece el param de configuracion * `--set <Nombre del Symbolo>=<Valor>`: establece el param de configuracion
`<Nombre del Symbolo>` a `<Valor>`en tiempo de compilación. `<Nombre del Symbolo>` a `<Valor>`en tiempo de compilación.
* `--main-module <Nombre del módulo>`: use el procedimiento main() que se encuentra en el módulo * `--main-module <Nombre del módulo>`: use el procedimiento main() que se encuentra en el módulo
    `<Nombre del módulo>` como principal del ejecutable. `<Nombre del módulo>` como principal del ejecutable.
* `--module-dir <Directorio>`: incluye `<Directorio>` en la ruta de búsqueda del módulo. * `--module-dir <Directorio>`: incluye `<Directorio>` en la ruta de búsqueda del módulo.

View File

@@ -6,14 +6,11 @@ contributors:
lang: pt-br lang: pt-br
--- ---
O Cypher é a linguagem de consulta do Neo4j para manipular gráficos facilmente. Ela reutiliza a sintaxe do SQL e a mistura com o tipo de ascii-art para representar gráficos. Este tutorial pressupõe que você já conheça conceitos de gráficos como nós e relacionamentos. O Cypher é a linguagem de consulta do Neo4j para manipular gráficos facilmente. Ela reutiliza a sintaxe do SQL e a mistura com o tipo de ascii-art para representar gráficos. Este tutorial pressupõe que você já conheça conceitos de gráficos como nós e relacionamentos.
[Leia mais aqui.](https://neo4j.com/developer/cypher-query-language/) [Leia mais aqui.](https://neo4j.com/developer/cypher-query-language/)
## Nós
Nós
---
**Representa um registro em um gráfico.** **Representa um registro em um gráfico.**
@@ -34,21 +31,19 @@ Um nó pode ter algumas *propriedades*, aqui **name** e **age**. Começa com min
Os tipos permitidos nas propriedades: Os tipos permitidos nas propriedades:
- Numeric - Numeric
- Boolean - Boolean
- String - String
- Lista de tipos primitivos anteriores - Lista de tipos primitivos anteriores
*Aviso: não há propriedade datetime no Cypher! Você pode usar String com um padrão específico ou um Numeric a partir de uma data específica.* *Aviso: não há propriedade datetime no Cypher! Você pode usar String com um padrão específico ou um Numeric a partir de uma data específica.*
`p.name` `p.name`
Você pode acessar uma propriedade com o estilo de ponto. Você pode acessar uma propriedade com o estilo de ponto.
## Relacionamentos (ou Arestas)
Relacionamentos (ou Arestas) **Conecta dois nós.**
---
**Conecta dois nós**
`[:KNOWS]` `[:KNOWS]`
É um *relacionamento* com o *label* **KNOWS**. É um *label* como um rótulo do nó. Começa com maiúsculas e usa UPPER_SNAKE_CASE. É um *relacionamento* com o *label* **KNOWS**. É um *label* como um rótulo do nó. Começa com maiúsculas e usa UPPER_SNAKE_CASE.
@@ -62,9 +57,7 @@ O mesmo *relacionamento*, com *propriedades* (como *nó*), aqui **since**.
`[k:KNOWS*..4]` `[k:KNOWS*..4]`
É uma informação estrutural para usar em um *path* (visto posteriormente). Aqui, **\*..4** diz, “Corresponda o padrão, com a relação **k** que é repetida de 1 a 4 vezes. É uma informação estrutural para usar em um *path* (visto posteriormente). Aqui, **\*..4** diz, “Corresponda o padrão, com a relação **k** que é repetida de 1 a 4 vezes.
## Paths
Paths
---
**A maneira de misturar nós e relacionamentos.** **A maneira de misturar nós e relacionamentos.**
@@ -80,9 +73,9 @@ Você pode encadear vários relacionamentos. Este path descreve o amigo de um am
`(a:Person)-[:MANAGES]->(b:Person)-[:MANAGES]->(c:Person)` `(a:Person)-[:MANAGES]->(b:Person)-[:MANAGES]->(c:Person)`
Uma encadeamento também pode ser direcionada. Este path descreve que **a** é o chefe de **b** e o grande chefe de **c**. Uma encadeamento também pode ser direcionada. Este path descreve que **a** é o chefe de **b** e o grande chefe de **c**.
Padrões frequentemente usados (do Neo4j doc) : Padrões frequentemente usados (do Neo4j doc):
``` ```cypher
// Amigo de um amigo // Amigo de um amigo
(user)-[:KNOWS]-(friend)-[:KNOWS]-(foaf) (user)-[:KNOWS]-(friend)-[:KNOWS]-(foaf)
@@ -96,13 +89,11 @@ path = shortestPath( (user)-[:KNOWS*..5]-(other) )
(root)<-[:PARENT*]-(leaf:Category)-[:ITEM]->(data:Product) (root)<-[:PARENT*]-(leaf:Category)-[:ITEM]->(data:Product)
``` ```
## Crie consultas
Crie consultas
---
Crie um novo nó Crie um novo nó
``` ```cypher
CREATE (a:Person {name:"Théo Gauchoux"}) CREATE (a:Person {name:"Théo Gauchoux"})
RETURN a RETURN a
``` ```
@@ -111,52 +102,51 @@ RETURN a
Crie um novo relacionamento (com 2 novos nós) Crie um novo relacionamento (com 2 novos nós)
``` ```cypher
CREATE (a:Person)-[k:KNOWS]-(b:Person) CREATE (a:Person)-[k:KNOWS]-(b:Person)
RETURN a,k,b RETURN a,k,b
``` ```
Consultas que casam ## Consultas que casam
---
Casam todos os nós Casam todos os nós
``` ```cypher
MATCH (n) MATCH (n)
RETURN n RETURN n
``` ```
Casam nós por label Casam nós por label
``` ```cypher
MATCH (a:Person) MATCH (a:Person)
RETURN a RETURN a
``` ```
Casam nós por label e propriedade Casam nós por label e propriedade
``` ```cypher
MATCH (a:Person {name:"Théo Gauchoux"}) MATCH (a:Person {name:"Théo Gauchoux"})
RETURN a RETURN a
``` ```
Casam nós de acordo com os relacionamentos (não direcionados) Casam nós de acordo com os relacionamentos (não direcionados)
``` ```cypher
MATCH (a)-[:KNOWS]-(b) MATCH (a)-[:KNOWS]-(b)
RETURN a,b RETURN a,b
``` ```
Casam nós de acordo com os relacionamentos (direcionados) Casam nós de acordo com os relacionamentos (direcionados)
``` ```cypher
MATCH (a)-[:MANAGES]->(b) MATCH (a)-[:MANAGES]->(b)
RETURN a,b RETURN a,b
``` ```
Casam nós com um cláusula `WHERE` Casam nós com um cláusula `WHERE`
``` ```cypher
MATCH (p:Person {name:"Théo Gauchoux"})-[s:LIVES_IN]->(city:City) MATCH (p:Person {name:"Théo Gauchoux"})-[s:LIVES_IN]->(city:City)
WHERE s.since = 2015 WHERE s.since = 2015
RETURN p,state RETURN p,state
@@ -164,19 +154,17 @@ RETURN p,state
Você pode usa a cláusula `MATCH WHERE` com a cláusula `CREATE` Você pode usa a cláusula `MATCH WHERE` com a cláusula `CREATE`
``` ```cypher
MATCH (a), (b) MATCH (a), (b)
WHERE a.name = "Jacquie" AND b.name = "Michel" WHERE a.name = "Jacquie" AND b.name = "Michel"
CREATE (a)-[:KNOWS]-(b) CREATE (a)-[:KNOWS]-(b)
``` ```
## Atualizar consultas
Atualizar consultas
---
Atualizar uma propriedade específica de um nó Atualizar uma propriedade específica de um nó
``` ```cypher
MATCH (p:Person) MATCH (p:Person)
WHERE p.name = "Théo Gauchoux" WHERE p.name = "Théo Gauchoux"
SET p.age = 23 SET p.age = 23
@@ -184,7 +172,7 @@ SET p.age = 23
Substituir todas as propriedades de um nó Substituir todas as propriedades de um nó
``` ```cypher
MATCH (p:Person) MATCH (p:Person)
WHERE p.name = "Théo Gauchoux" WHERE p.name = "Théo Gauchoux"
SET p = {name: "Michel", age: 23} SET p = {name: "Michel", age: 23}
@@ -192,7 +180,7 @@ SET p = {name: "Michel", age: 23}
Adicionar nova propriedade a um nó Adicionar nova propriedade a um nó
``` ```cypher
MATCH (p:Person) MATCH (p:Person)
WHERE p.name = "Théo Gauchoux" WHERE p.name = "Théo Gauchoux"
SET p + = {studies: "IT Engineering"} SET p + = {studies: "IT Engineering"}
@@ -200,19 +188,17 @@ SET p + = {studies: "IT Engineering"}
Adicione um label a um nó Adicione um label a um nó
``` ```cypher
MATCH (p:Person) MATCH (p:Person)
WHERE p.name = "Théo Gauchoux" WHERE p.name = "Théo Gauchoux"
SET p:Internship SET p:Internship
``` ```
## Excluir consultas
Excluir consultas
---
Excluir um nó específico (os relacionamentos vinculados devem ser excluídos antes) Excluir um nó específico (os relacionamentos vinculados devem ser excluídos antes)
``` ```cypher
MATCH (p:Person)-[relationship]-() MATCH (p:Person)-[relationship]-()
WHERE p.name = "Théo Gauchoux" WHERE p.name = "Théo Gauchoux"
DELETE relationship, p DELETE relationship, p
@@ -220,7 +206,7 @@ DELETE relationship, p
Remover uma propriedade em um nó específico Remover uma propriedade em um nó específico
``` ```cypher
MATCH (p:Person) MATCH (p:Person)
WHERE p.name = "Théo Gauchoux" WHERE p.name = "Théo Gauchoux"
REMOVE p.age REMOVE p.age
@@ -230,7 +216,7 @@ REMOVE p.age
Remover um label de um nó específico Remover um label de um nó específico
``` ```cypher
MATCH (p:Person) MATCH (p:Person)
WHERE p.name = "Théo Gauchoux" WHERE p.name = "Théo Gauchoux"
DELETE p:Person DELETE p:Person
@@ -238,7 +224,7 @@ DELETE p:Person
Excluir o banco de dados inteiro Excluir o banco de dados inteiro
``` ```cypher
MATCH (n) MATCH (n)
OPTIONAL MATCH (n)-[r]-() OPTIONAL MATCH (n)-[r]-()
DELETE n, r DELETE n, r
@@ -246,9 +232,7 @@ DELETE n, r
*Sério, é o `rm -rf /` do Cypher !* *Sério, é o `rm -rf /` do Cypher !*
## Outras cláusulas úteis
Outras cláusulas úteis
---
`PROFILE` `PROFILE`
Antes de uma consulta, mostre o plano de execução dela. Antes de uma consulta, mostre o plano de execução dela.
@@ -259,9 +243,7 @@ Contar entidades (nós ou relacionamentos) que casam com **e**.
`LIMIT x` `LIMIT x`
Limite o resultado aos primeiros x resultados. Limite o resultado aos primeiros x resultados.
## Dicas Especiais
Dicas Especiais
---
- Há apenas comentários de uma linha no Cypher, com barras duplas : // Comentários - Há apenas comentários de uma linha no Cypher, com barras duplas : // Comentários
- Você pode executar um script Cypher armazenado em um arquivo **.cql** diretamente no Neo4j (é uma importação). No entanto, você não pode ter várias instruções neste arquivo (separadas por **;**). - Você pode executar um script Cypher armazenado em um arquivo **.cql** diretamente no Neo4j (é uma importação). No entanto, você não pode ter várias instruções neste arquivo (separadas por **;**).

View File

@@ -13,11 +13,9 @@ Cypher - це мова запитів Neo4j для спрощення робот
[Деталі тут](https://neo4j.com/developer/cypher-query-language/) [Деталі тут](https://neo4j.com/developer/cypher-query-language/)
## Вершини
Вершини #### Відображує запис у графі
---
**Відображує запис у графі.**
`()` `()`
Таким чином у запиті позначається пуста *вершина*. Використовується зазвичай для того, щоб позначити, що вона є, проте це не так вже й важливо для запиту. Таким чином у запиті позначається пуста *вершина*. Використовується зазвичай для того, щоб позначити, що вона є, проте це не так вже й важливо для запиту.
@@ -36,27 +34,24 @@ Cypher - це мова запитів Neo4j для спрощення робот
Наступні типи дозволяється використовувати у властивостях: Наступні типи дозволяється використовувати у властивостях:
- Чиселиний - Чиселиний
- Булевий - Булевий
- Рядок - Рядок
- Списки попередніх примітивних типів - Списки попередніх примітивних типів
*Увага! В Cypher не існує типу, що відображає час. Замість нього можна використовувати рядок із визначеним шаблоном або чисельне відображення певної дати.* *Увага! В Cypher не існує типу, що відображає час. Замість нього можна використовувати рядок із визначеним шаблоном або чисельне відображення певної дати.*
`p.name` `p.name`
За допомогою крапки можна звернутись до властивості вершини. За допомогою крапки можна звернутись до властивості вершини.
## Зв'язки (або ребра)
Зв'язки (або ребра) #### Сполучають дві вершини
---
**Сполучають дві вершини**
`[:KNOWS]` `[:KNOWS]`
Це *зв'язок* з *ярликом* **KNOWS**. Це такий же самий *ярлик* як і у вершини. Починається з великої літери та використовує ВЕРХНІЙ\_РЕГІСТР\_ІЗ\_ЗМІЇНОЮ\_НОТАЦІЄЮ. Це *зв'язок* з *ярликом* **KNOWS**. Це такий же самий *ярлик* як і у вершини. Починається з великої літери та використовує ВЕРХНІЙ\_РЕГІСТР\_ІЗ\_ЗМІЇНОЮ\_НОТАЦІЄЮ.
`[k:KNOWS]` `[k:KNOWS]`
Це той же самий *зв'язок*, до якого можна звертатись через змінну **k**. Можна подалі використовувати у запиті, хоч це і не обов'язково. Це той же самий *зв'язок*, до якого можна звертатись через змінну **k**. Можна подалі використовувати у запиті, хоч це і не обов'язково.
`[k:KNOWS {since:2017}]` `[k:KNOWS {since:2017}]`
Той же *зв'язок*, але вже із *властивостями* (як у *вершини*), в данному випадку властивість - це **since**. Той же *зв'язок*, але вже із *властивостями* (як у *вершини*), в данному випадку властивість - це **since**.
@@ -64,11 +59,8 @@ Cypher - це мова запитів Neo4j для спрощення робот
`[k:KNOWS*..4]` `[k:KNOWS*..4]`
Це структурна інформація, яку використовують *шляхи*, які розглянуті нижче. В данному випадку, **\*..4** говорить: "Сумістити шаблон із зв'язком **k**, що повторюватиметься від одного до чотирьох разів." Це структурна інформація, яку використовують *шляхи*, які розглянуті нижче. В данному випадку, **\*..4** говорить: "Сумістити шаблон із зв'язком **k**, що повторюватиметься від одного до чотирьох разів."
## Шляхи
Шляхи #### Спосіб поєднувати вершини та зв'язки.
---
**Спосіб поєднувати вершини та зв'язки.**
`(a:Person)-[:KNOWS]-(b:Person)` `(a:Person)-[:KNOWS]-(b:Person)`
Шлях описує, що вершини **a** та **b** знають (knows) один одного. Шлях описує, що вершини **a** та **b** знають (knows) один одного.
@@ -84,8 +76,8 @@ Cypher - це мова запитів Neo4j для спрощення робот
Шаблони, які часто використовуються (з документації Neo4j): Шаблони, які часто використовуються (з документації Neo4j):
``` ```cypher
// Друг-мого-друга // Друг-мого-друга
(user)-[:KNOWS]-(friend)-[:KNOWS]-(foaf) (user)-[:KNOWS]-(friend)-[:KNOWS]-(foaf)
// Найкоротший шлях // Найкоротший шлях
@@ -98,13 +90,11 @@ path = shortestPath( (user)-[:KNOWS*..5]-(other) )
(root)<-[:PARENT*]-(leaf:Category)-[:ITEM]->(data:Product) (root)<-[:PARENT*]-(leaf:Category)-[:ITEM]->(data:Product)
``` ```
## Запити на створення
Запити на створення
---
Створити нову вершину: Створити нову вершину:
``` ```cypher
CREATE (a:Person {name:"Théo Gauchoux"}) CREATE (a:Person {name:"Théo Gauchoux"})
RETURN a RETURN a
``` ```
@@ -113,52 +103,51 @@ RETURN a
Створити новий зв'язок (із двома вершинами): Створити новий зв'язок (із двома вершинами):
``` ```cypher
CREATE (a:Person)-[k:KNOWS]-(b:Person) CREATE (a:Person)-[k:KNOWS]-(b:Person)
RETURN a,k,b RETURN a,k,b
``` ```
Запити на знаходження ## Запити на знаходження
---
Знайти всі вершини: Знайти всі вершини:
``` ```cypher
MATCH (n) MATCH (n)
RETURN n RETURN n
``` ```
Знайти вершини за ярликом: Знайти вершини за ярликом:
``` ```cypher
MATCH (a:Person) MATCH (a:Person)
RETURN a RETURN a
``` ```
Знайти вершини за ярликом та властивістю: Знайти вершини за ярликом та властивістю:
``` ```cypher
MATCH (a:Person {name:"Théo Gauchoux"}) MATCH (a:Person {name:"Théo Gauchoux"})
RETURN a RETURN a
``` ```
Знайти вершини відповідно до зв'язків (ненаправлених): Знайти вершини відповідно до зв'язків (ненаправлених):
``` ```cypher
MATCH (a)-[:KNOWS]-(b) MATCH (a)-[:KNOWS]-(b)
RETURN a,b RETURN a,b
``` ```
Знайти вершини відповідно до зв'язків (направлених): Знайти вершини відповідно до зв'язків (направлених):
``` ```cypher
MATCH (a)-[:MANAGES]->(b) MATCH (a)-[:MANAGES]->(b)
RETURN a,b RETURN a,b
``` ```
Знайти вершини за допомогою `WHERE`: Знайти вершини за допомогою `WHERE`:
``` ```cypher
MATCH (p:Person {name:"Théo Gauchoux"})-[s:LIVES_IN]->(city:City) MATCH (p:Person {name:"Théo Gauchoux"})-[s:LIVES_IN]->(city:City)
WHERE s.since = 2015 WHERE s.since = 2015
RETURN p,state RETURN p,state
@@ -166,19 +155,17 @@ RETURN p,state
Можна використовувати вираз `MATCH WHERE` разом із операцією `CREATE`: Можна використовувати вираз `MATCH WHERE` разом із операцією `CREATE`:
``` ```cypher
MATCH (a), (b) MATCH (a), (b)
WHERE a.name = "Jacquie" AND b.name = "Michel" WHERE a.name = "Jacquie" AND b.name = "Michel"
CREATE (a)-[:KNOWS]-(b) CREATE (a)-[:KNOWS]-(b)
``` ```
## Запити на оновлення
Запити на оновлення
---
Оновити окрему властивість вершини: Оновити окрему властивість вершини:
``` ```cypher
MATCH (p:Person) MATCH (p:Person)
WHERE p.name = "Théo Gauchoux" WHERE p.name = "Théo Gauchoux"
SET p.age = 23 SET p.age = 23
@@ -186,7 +173,7 @@ SET p.age = 23
Оновити всі властивості вершини: Оновити всі властивості вершини:
``` ```cypher
MATCH (p:Person) MATCH (p:Person)
WHERE p.name = "Théo Gauchoux" WHERE p.name = "Théo Gauchoux"
SET p = {name: "Michel", age: 23} SET p = {name: "Michel", age: 23}
@@ -194,7 +181,7 @@ SET p = {name: "Michel", age: 23}
Додати нову властивіcть до вершини: Додати нову властивіcть до вершини:
``` ```cypher
MATCH (p:Person) MATCH (p:Person)
WHERE p.name = "Théo Gauchoux" WHERE p.name = "Théo Gauchoux"
SET p + = {studies: "IT Engineering"} SET p + = {studies: "IT Engineering"}
@@ -202,19 +189,17 @@ SET p + = {studies: "IT Engineering"}
Повісити ярлик на вершину: Повісити ярлик на вершину:
``` ```cypher
MATCH (p:Person) MATCH (p:Person)
WHERE p.name = "Théo Gauchoux" WHERE p.name = "Théo Gauchoux"
SET p:Internship SET p:Internship
``` ```
## Запити на видалення
Запити на видалення
---
Видалити окрему вершину (пов'язані ребра повинні бути видалені перед цим): Видалити окрему вершину (пов'язані ребра повинні бути видалені перед цим):
``` ```cypher
MATCH (p:Person)-[relationship]-() MATCH (p:Person)-[relationship]-()
WHERE p.name = "Théo Gauchoux" WHERE p.name = "Théo Gauchoux"
DELETE relationship, p DELETE relationship, p
@@ -222,7 +207,7 @@ DELETE relationship, p
Видалити властивість певної вершини: Видалити властивість певної вершини:
``` ```cypher
MATCH (p:Person) MATCH (p:Person)
WHERE p.name = "Théo Gauchoux" WHERE p.name = "Théo Gauchoux"
REMOVE p.age REMOVE p.age
@@ -230,17 +215,17 @@ REMOVE p.age
*Зверніть увагу, що ключове слово `REMOVE` це не те саме, що й `DELETE`!* *Зверніть увагу, що ключове слово `REMOVE` це не те саме, що й `DELETE`!*
Видалити ярлик певної вершини: Видалити ярлик певної вершини:
``` ```cypher
MATCH (p:Person) MATCH (p:Person)
WHERE p.name = "Théo Gauchoux" WHERE p.name = "Théo Gauchoux"
DELETE p:Person DELETE p:Person
``` ```
Видалити всю базу даних: Видалити всю базу даних:
``` ```cypher
MATCH (n) MATCH (n)
OPTIONAL MATCH (n)-[r]-() OPTIONAL MATCH (n)-[r]-()
DELETE n, r DELETE n, r
@@ -248,9 +233,7 @@ DELETE n, r
*Так, це `rm -rf /` на мові Cypher !* *Так, це `rm -rf /` на мові Cypher !*
## Інші корисні запити
Інші корисні запити
---
`PROFILE` `PROFILE`
Перед виконанням, показати план виконання запитів. Перед виконанням, показати план виконання запитів.
@@ -261,11 +244,9 @@ DELETE n, r
`LIMIT x` `LIMIT x`
Обмежити результат до x перших результатів. Обмежити результат до x перших результатів.
## Особливі підказки
Особливі підказки - У мові Cypher існують лише однорядкові коментарі, що позначаються двійним слешем : `// Коментар`
---
- У мові Cypher існують лише однорядкові коментарі, що позначаються двійним слешем : // Коментар
- Можна виконати скрипт Cypher, збережений у файлі **.cql** прямо в Neo4j (прямо як імпорт). Проте, не можна мати мати кілька виразів в цьому файлі (розділених **;**). - Можна виконати скрипт Cypher, збережений у файлі **.cql** прямо в Neo4j (прямо як імпорт). Проте, не можна мати мати кілька виразів в цьому файлі (розділених **;**).
- Використовуйте командний рядок Neo4j для написання запитів Cypher, це легко і швидко. - Використовуйте командний рядок Neo4j для написання запитів Cypher, це легко і швидко.
- Cypher планує бути стандартною мовою запитів для всіх графових баз даних (більш відома як **OpenCypher**). - Cypher планує бути стандартною мовою запитів для всіх графових баз даних (більш відома як **OpenCypher**).