pgr_degree – Propuesto

pgr_degree - Para cada vértice de un grafo no dirigido, devuelve el número de aristas incidentes en el vértice.

Advertencia

Funciones propuestas para la próxima versión mayor.

  • No están oficialmente en la versión actual.

  • Es probable que oficialmente formen parte del próximo lanzamiento:

    • Las funciones hacen uso de ENTEROS y FLOTANTES

    • Probablemente el nombre no cambie. (Pero todavía puede)

    • Es posible que la firma no cambie. (Pero todavía puede)

    • Probablemente la funcionalidad no cambie. (Pero todavía puede)

    • Se han hecho pruebas con pgTap. Pero tal vez se necesiten más.

    • Es posible que la documentación necesite un refinamiento.

Disponibilidad

  • Versión 3.4.0

    • Nueva función propuesta

Descripción

Calcula el grado de los vértices de un grafo no dirigido

Firmas

pgr_degree(SQL de aristas , SQL de vértices, [dryrun])
REGRESA CONJUNTO DE (node, degree)
O CONJUNTO VACÍO
Ejemplo:

Extraer la información del vértice

pgr_degree puede utilizar la salida de pgr_extractVertices o puede tener pgr_extractVertices incrustado en la llamada. Para redes de tamaño decente, lo mejor es preparar la tabla de vértices de antemano y utilizar esa tabla de vértices para las llamadas pgr_degree.

DROP TABLE IF EXISTS tmp_edges_vertices_pgr;
NOTICE:  table "tmp_edges_vertices_pgr" does not exist, skipping
DROP TABLE
CREATE TEMP TABLE tmp_edges_vertices_pgr AS
SELECT id, in_edges, out_edges
    FROM pgr_extractVertices('SELECT id, geom FROM edges');
SELECT 17
SELECT * FROM pgr_degree(
  $$SELECT id FROM edges$$,
  $$SELECT id, in_edges, out_edges
    FROM tmp_edges_vertices_pgr$$);
 node | degree
------+--------
    1 |      1
    2 |      1
    3 |      2
    4 |      1
    5 |      1
    6 |      3
    7 |      4
    8 |      3
    9 |      1
   10 |      3
   11 |      4
   12 |      3
   13 |      1
   14 |      1
   15 |      2
   16 |      3
   17 |      2
(17 rows)

Parámetros

Parámetro

Tipo

Descripción

SQL de aristas

TEXT

SQL de aristas como se describe a continuación

SQL de vértices

TEXT

Vertex SQL como se describe abajo

Parámetros opcionales

Parámetro

Tipo

x Defecto

Descripción

dryrun

BOOLEAN

false

  • Cuando verdadero, no procesar y recibir un AVISO de la consulta resultante.

Consultas Internas

SQL aristas

Columna

Tipo

Descripción

id

BIGINT

Identificador de la arista.

SQL de vértices

Columna

Tipo

Descripción

id

BIGINT

Identificador del primer vértice de la arista.

in_edges

BIGINT[]

Arreglo de identificadores de las aristas que tienen el vértice id como primer punto final.

  • Si falta, out_edges debe existir.

out_edges

BIGINT[]

Arreglo de identificadores de las aristas que tienen el vértice id como segundo punto final.

  • Si falta, in_edges debe existir.

Columnas de resultados

Columna

Tipo

Descripción

node

BIGINT

Identificador de vértice

degree

BIGINT

Número de aristas incidentes al vértice id

Ejemplos Adicionales

Grado de un subgrafo

SELECT * FROM pgr_degree(
  $$SELECT id FROM edges WHERE id < 17$$,
  $$SELECT id, in_edges, out_edges
    FROM pgr_extractVertices('SELECT id, geom FROM edges')$$);
 node | degree
------+--------
    1 |      1
    2 |      0
    3 |      2
    4 |      0
    5 |      1
    6 |      3
    7 |      4
    8 |      3
    9 |      1
   10 |      3
   11 |      4
   12 |      3
   13 |      0
   14 |      0
   15 |      2
   16 |      3
   17 |      2
(17 rows)

Ejecución de prueba

Para obtener la consulta generada que se usa para obtener la información de vértices, utilizar dryrun := true.

Los resultados se pueden usar como código base para realizar un refinamiento basado en las necesidades de desarrollo de back-end.

SELECT * FROM pgr_degree(
  $$SELECT id FROM edges WHERE id < 17$$,
  $$SELECT id, in_edges, out_edges
    FROM pgr_extractVertices('SELECT id, geom FROM edges')$$,
  dryrun => true);
NOTICE:
    WITH

    -- a sub set of edges of the graph goes here
    g_edges AS (
      SELECT id FROM edges WHERE id < 17
    ),

    -- sub set of vertices of the graph goes here
    all_vertices AS (
      SELECT id, in_edges, out_edges
    FROM pgr_extractVertices('SELECT id, geom FROM edges')
    ),

    g_vertices AS (
      SELECT id,
        unnest(
          coalesce(in_edges::BIGINT[], '{}'::BIGINT[])
          ||
          coalesce(out_edges::BIGINT[], '{}'::BIGINT[])) AS eid
      FROM all_vertices
    ),

    totals AS (
      SELECT v.id, count(*)
      FROM g_vertices AS v
      JOIN g_edges AS e ON (e.id = eid) GROUP BY v.id
    )

    SELECT id::BIGINT, coalesce(count, 0)::BIGINT FROM all_vertices LEFT JOIN totals USING (id)
    ;
 node | degree
------+--------
(0 rows)

Grado a partir de una tabla existente

Si se tiene una tabla de vértices ya construida usando pgr_extractVertices y se quiere el grado de todo el grafo en lugar de un subconjunto, se puede trabajar con las columnas in_edges y out_edges directamente.

Callejones sin salida

Para obtener los callejones sin salida:

SELECT id FROM vertices
WHERE array_length(in_edges || out_edges, 1) = 1;
 id
----
  1
  5
  9
 13
 14
  2
  4
(7 rows)

Esa información es correcta, por ejemplo, cuando el punto muerto está en el límite del gráfico importado.

Visualmente el nodo \(4\) parece ser el inicio/final de 3 aristas, pero no lo es.

¿Es correcto?

  • Hay un bordillo tan pequeño:

    • ¿Eso no permite a un vehículo utilizar esa intersección visual?

    • ¿Es la aplicación para peatones y por lo tanto el peatón puede caminar fácilmente en una acera pequeña?

    • ¿Es la aplicación para la electricidad y las líneas eléctricas que se puede extender fácilmente en la parte superior de la acera pequeña?

  • ¿Hay un gran acantilado y desde la vista de las águilas parece que el callejón sin salida está cerca del segmento?

Cuando hay muchos callejones sin salida, para acelerar, se pueden utilizar las funciones de Contraction - Familia de funciones para dividir el problema.

Bordes lineales

Para obtener las aristas lineales:

SELECT id FROM vertices
WHERE array_length(in_edges || out_edges, 1) = 2;
 id
----
  3
 15
 17
(3 rows)

Esta información es correcta, por ejemplo, cuando la aplicación tiene en cuenta los topes o las señales de stop.

Cuando hay muchas aristas lineales, para acelerar, se pueden utilizar las funciones Contraction - Familia de funciones para dividir el problema.

Ver también

Índices y tablas