Agrupación de sindicatos en gráficos bipartitos?

8

Estoy tratando de encontrar una buena (y rápida) solución al siguiente problema:

Tengo dos modelos con los que estoy trabajando, llamémosles jugadores y equipos. Un jugador puede estar en varios equipos y un equipo puede tener varios jugadores). Estoy trabajando en la creación de un elemento de interfaz de usuario en un formulario que permita a un usuario seleccionar varios equipos (casillas de verificación). A medida que el usuario selecciona (o deselecciona) equipos, me gustaría mostrar los equipos agrupados por jugadores.

Entonces, por ejemplo:

  1. Si los equipos seleccionados no tienen jugadores que se crucen, cada equipo tendrá su propia sección.

  2. Si el usuario selecciona dos equipos y tienen los mismos jugadores, habría una sección que contiene los nombres de los dos equipos y todos los jugadores.

  3. Si TEAM_A tiene jugadores [1, 2, 4, 5] y TEAM_B tiene jugadores [1, 3, 5, 6]. Habría las siguientes secciones: SECTION_X = [TEAM_A, TEAM_B, 1, 5], SECTION_Y = [TEAM_A, 2, 3], SECTION _Z = [TEAM_B, 3, 5]

Espero que sea claro. Esencialmente, quiero encontrar los equipos que los jugadores tienen en común y agrupar por eso. Estaba pensando que tal vez hay una manera de hacer esto navegando en un gráfico bipartito. Sin embargo, no estoy seguro de cómo y podría estar pensando demasiado. Esperaba hacer esto creando algún tipo de estructura de datos en el servidor y usándolo en el cliente. ¡Me encantaría escuchar tus sugerencias y agradezco cualquier ayuda que puedas dar!

Ian
fuente
¿Está seguro de que no puede codificar esa lógica utilizando una relación de muchos a muchos entre sus modelos? Con suerte, cuando comience a escribir su código del lado del servidor, su marco favorito le permitirá declarar modelos con algunos campos. Por lo tanto, podrá indicar que el modelo Teamdebe tener un campo llamado playersque requiera una relación de muchos a muchos con su otro modelo Player. Esto le permite recuperar qué jugadores están en cada equipo y qué equipos están asociados a cada jugador.
Robert Smith el
¿Has elegido alguna tecnología en particular? Esto podría hacerse con Neo4J y Cypher.
sheldonkreger

Respuestas:

2

¿Has oído hablar del gráfico de intersección ? Puedes intentar dibujar jugadores como puntos, conexiones (compañeros de equipo) como bordes y equipos como manchas de colores transparentes en la parte superior.

En cuanto a su pregunta original, no puedo entender su objetivo. Creo que su formulación no está bien definida / incompleta. Suponga que tiene los equipos A [1,2] B [2,3] y C [1,3]. ¿Qué quieres mostrar? ¿Desea enumerar las partes del diagrama de Venn? Creo que para más de 3 series esto puede volverse más engorroso que el gráfico bipartito en sí mismo = listado simple de composiciones de equipo.

Valentas
fuente
1

Almacene los bordes (relaciones) en su servidor:

(TeamID, playerID)

Cuando desee encontrar elementos comunes, simplemente filtre todos los bordes donde:

TeamID="TeamA" or TeamID="TeamB"

(Podría usar índices para acelerar, etc.)

Luego, agrupe por ID de jugador y verifique cuántos elementos hay en cada grupo. Los grupos con dos elementos pertenecen a ambos equipos y son compartidos.

Juan Leni
fuente