Agrupamento de união em gráficos bipartidos?

8

Estou tentando descobrir uma solução boa (e rápida) para o seguinte problema:

Eu tenho dois modelos com os quais estou trabalhando, vamos chamá-los de jogadores e equipes. Um jogador pode estar em várias equipes e uma equipe pode ter vários jogadores). Estou trabalhando na criação de um elemento de interface do usuário em um formulário que permita ao usuário selecionar várias equipes (caixas de seleção). Como o usuário está selecionando (ou desmarcando) equipes, eu gostaria de exibir as equipes agrupadas pelos jogadores.

Então, para exemplos:

  1. Se as equipes selecionadas não tiverem jogadores que se cruzem, cada equipe terá sua própria seção.

  2. Se o usuário selecionar duas equipes e eles tiverem os mesmos jogadores, haveria uma seção contendo os nomes das duas equipes e de todos os jogadores.

  3. Se TEAM_A tiver jogadores [1, 2, 4, 5] e TEAM_B tiver jogadores [1, 3, 5, 6]. Existem as seguintes seções: SECTION_X = [TEAM_A, TEAM_B, 1, 5], SECTION_Y = [TEAM_A, 2, 3], SEÇÃO _Z = [TEAM_B, 3, 5]

Espero que esteja claro. Essencialmente, quero encontrar as equipes que os jogadores têm em comum e agrupar por isso. Eu estava pensando que talvez haja uma maneira de fazer isso navegando em um gráfico bipartido? Não tenho muita certeza de como e eu posso estar pensando demais. Eu esperava fazer isso criando algum tipo de estrutura de dados no servidor e usando-o no cliente. Gostaria muito de ouvir suas sugestões e agradeço qualquer ajuda que você possa dar!

Ian
fonte
Você tem certeza de que não pode codificar essa lógica usando um relacionamento muitos para muitos entre seus modelos. Felizmente, quando você começar a escrever seu código do servidor, sua estrutura favorita permitirá que você declare modelos com alguns campos. Portanto, você poderá instruir que o modelo Teamdeve ter um campo chamado playersque exija um relacionamento muitos-para-muitos com seu outro modelo Player. Isso permite recuperar quais jogadores estão em cada equipe e quais equipes estão associadas a cada jogador.
Robert Smith
Você escolheu alguma tecnologia em particular? Isso pode ser feito com o Neo4J e o Cypher.
sheldonkreger

Respostas:

2

Você já ouviu falar sobre o gráfico de interseção ? Você pode tentar desenhar jogadores como pontos, conexões (companheiros de equipe) como arestas e equipes como manchas coloridas transparentes na parte superior.

Quanto à sua pergunta original, não consigo entender seu objetivo. Eu acho que sua formulação não está bem definida / incompleta. Suponha que você tenha as equipes A [1,2] B [2,3] e C [1,3]. O que você deseja exibir? Deseja listar as partes do diagrama de Venn? Eu acho que por mais de três séries isso pode se tornar mais complicado do que o próprio gráfico bipartido = lista simples de composições de equipes.

Valentas
fonte
1

Armazene as bordas (relações) no seu servidor:

(TeamID, playerID)

Quando você deseja encontrar elementos comuns, basta filtrar todas as arestas onde:

TeamID="TeamA" or TeamID="TeamB"

(Você pode usar índices para acelerar, etc)

Agrupe por playerID e verifique quantos itens há em cada grupo. Os grupos com dois itens pertencem a ambas as equipes e são compartilhados.

Juan Leni
fonte