イベント管理に適用されるソーシャル グラフ
イベント管理の世界では、参加者間の関係を知ることは重要ではありません。 付属品の詳細: それは思い出に残る経験を整理するための鍵です。彼は誰ですか 誰の友達?元パートナーのどのペアがテーブルで離れるべきでしょうか?どの同僚 一緒に座りたいですか?
In イベントをプレイする、
これらの質問には、 完全なソーシャルグラフ それを超えて形作られる
52種類の人間関係 10 のカテゴリにグループ化され、それぞれに数値的な重みが付けられます
それはから来る -1.0 (敵) 1.0 (家族の絆が強くなる)。
このグラフは、インテリジェントな座席、検出などの高度な機能を強化します。
競合と招待の提案。
この記事でわかること
- 52 の関係タイプを 10 の重み付けされたカテゴリに分類
- 9 レベルの関係強度システム (RelationshipStrength)
- 双方向性と逆型の自動計算
- ステータスのワークフロー: PENDING、ACCEPTED、REJECTED
- インテリジェントなグループ化のためのコミュニティ検出
- テーブルでの衝突を回避するための競合検出
- ソーシャルグラフに基づいたインテリジェントな座席
- 自動招待状の提案
- D3.js によるインタラクティブな視覚化
10 カテゴリーの 52 の関係タイプ
システムの中心は列挙型です TipoRelazione、定義する値オブジェクト
2 人のユーザー間のあらゆるリンク。それぞれのタイプには、 重さ (体重)どうですか?
は重要性を示し、 表示名 ユーザーインターフェイス用。
カテゴリーは、核家族から組織関係、人間関係まで多岐にわたります。
ネガティブな。
TIPO PESO NOME VISUALIZZAZIONE
----------------------------------------------------
GENITORE 1.00 Genitore
FIGLIO 1.00 Figlio/a
CONIUGE 1.00 Coniuge
PARTNER 0.95 Partner
GEMELLO 0.95 Gemello/a
FRATELLO 0.90 Fratello
SORELLA 0.90 Sorella
TIPO PESO NOME VISUALIZZAZIONE
----------------------------------------------------
NONNO 0.85 Nonno
NONNA 0.85 Nonna
NIPOTE_DI_NONNI 0.85 Nipote (di nonni)
ZIO 0.70 Zio
ZIA 0.70 Zia
NIPOTE_DI_ZII 0.70 Nipote (di zii)
CUGINO_PRIMO 0.60 Cugino/a di Primo Grado
CUGINO_SECONDO 0.40 Cugino/a di Secondo Grado
CUGINO_TERZO 0.30 Cugino/a di Terzo Grado
TIPO PESO NOME VISUALIZZAZIONE
----------------------------------------------------
SUOCERO 0.70 Suocero
SUOCERA 0.70 Suocera
GENERO 0.75 Genero
NUORA 0.75 Nuora
COGNATO 0.60 Cognato
COGNATA 0.60 Cognata
TIPO PESO NOME VISUALIZZAZIONE
----------------------------------------------------
PADRINO 0.65 Padrino
MADRINA 0.65 Madrina
FIGLIOCCIO 0.65 Figlioccio/a
PATRIGNO 0.60 Patrigno
MATRIGNA 0.60 Matrigna
FIGLIASTRO 0.55 Figliastro
FIGLIASTRA 0.55 Figliastra
FRATELLASTRO 0.55 Fratellastro
SORELLASTRA 0.55 Sorellastra
TIPO PESO NOME VISUALIZZAZIONE
----------------------------------------------------
GENITORE_ADOTTIVO 0.95 Genitore Adottivo
FIGLIO_ADOTTIVO 0.95 Figlio/a Adottivo/a
FRATELLO_ADOTTIVO 0.80 Fratello/Sorella Adottivo/a
FRATELLO_CONSANGUINEO 0.70 Fratello Consanguineo
SORELLA_CONSANGUINEA 0.70 Sorella Consanguinea
BISNONNO 0.65 Bisnonno/a
PRONIPOTE 0.65 Pronipote
PROZIO 0.50 Prozio/a
TIPO PESO NOME VISUALIZZAZIONE
----------------------------------------------------
MIGLIORE_AMICO 0.85 Migliore Amico/a
AMICO_STRETTO 0.80 Amico/a Stretto/a
AMICO 0.50 Amico/a
COMPAGNO_CLASSE 0.40 Compagno/a di Classe
CONOSCENTE 0.30 Conoscente
COLLEGA 0.30 Collega
VICINO 0.25 Vicino/a
TIPO PESO NOME VISUALIZZAZIONE
----------------------------------------------------
DIRIGENTE 0.60 Dirigente
RESPONSABILE 0.50 Responsabile
DIPENDENTE 0.40 Dipendente
COLLABORATORE 0.35 Collaboratore
CONSULENTE 0.35 Consulente
STAGISTA 0.30 Stagista
TIPO PESO NOME VISUALIZZAZIONE
----------------------------------------------------
PRESIDENTE 0.70 Presidente
VICEPRESIDENTE 0.65 Vicepresidente
SEGRETARIO 0.60 Segretario
TESORIERE 0.60 Tesoriere
MEMBRO_DIRETTIVO 0.55 Membro del Direttivo
CONSIGLIERE 0.50 Consigliere
ASSOCIATO 0.40 Associato/Socio
VOLONTARIO 0.35 Volontario
TIPO PESO NOME VISUALIZZAZIONE
----------------------------------------------------
NEMICO -1.00 Nemico/a
RIVALE -0.50 Rivale
EX_CONIUGE -0.30 Ex Coniuge
EX_PARTNER -0.20 Ex Partner
SCONOSCIUTO 0.00 Sconosciuto/a
この粒度により、システムは結合の種類だけでなく、
その激しさも。あ MIGLIORE_AMICO (0.85) の重さはほぼ同じです。
FRATELLO (0.90)、一方 CONOSCENTE (0.30) は大きな影響を与えます
アルゴリズムによる判断では劣ります。
関係の重みと強さ
各関係には数値的な重みがあります。 -1.0 e 1.0。
システムは、この連続値を離散スケールに変換します。 9レベル
強さ 列挙型経由 RelationshipStrength、インターフェイスによって使用されます
ユーザーは、グラフのエッジの色と太さのインジケーターを表示します。
LIVELLO RANGE PESO DESCRIZIONE
-----------------------------------------------------
VERY_STRONG >= 0.80 Molto Forte
STRONG >= 0.60 Forte
MODERATE >= 0.40 Moderata
WEAK >= 0.20 Debole
VERY_WEAK > 0.00 Molto Debole
NEUTRAL == 0.00 Neutrale
SLIGHTLY_NEGATIVE >= -0.30 Leggermente Negativa
NEGATIVE >= -0.60 Negativa
VERY_NEGATIVE < -0.60 Molto Negativa
方法 getStrength() 列挙型の TipoRelazione 変換を実行します
自動。例えば、 CONIUGE (重み 1.0) を返します VERY_STRONG、
その間 NEMICO (重み -1.0) を返します VERY_NEGATIVE。このマッピング
視覚化の基本となるのはアーチです VERY_STRONG 私は
太い線と暖色で表現され、円弧は NEGATIVE 私は
赤の破線。
重量は、ユーザーが次の方法で手動で調整することもできます。
regolaPeso(double nuovoPeso)。たとえば、主催者は料金を下げたいと考えるかもしれません。
2人の親戚の仲が良くない場合の家族関係の負担、または
特に親しい同僚の負担を増やす。
UserRelationship エンティティ
集約ルート RelazioneUtente グラフ内の単一の関係を表します
社会的。各インスタンスは、タイプ、重み、および状態を使用して 2 人のユーザーを接続します。テーブル
relazioni_utenti ユーザー ID、タイプ、および
クエリのパフォーマンスを確保するために重みを考慮します。
RelazioneUtente (Aggregate Root)
├── id Long (auto-generated)
├── utenteId1 Long (FK → users)
├── utenteId2 Long (FK → users)
├── tipoRelazione TipoRelazione (enum)
├── peso Double (-1.0 a 1.0)
├── bidirezionale Boolean (auto-calcolato)
├── tipoRelazioneInversa TipoRelazione (auto-calcolato)
├── stato StatoRelazione (PENDING/ACCEPTED/REJECTED)
├── richiestaInviataDaUtenteId Long (chi ha inviato la richiesta)
├── richiestaInviataIl Instant (timestamp invio)
├── rispostaDataIl Instant (timestamp risposta)
├── note String (max 500 caratteri)
├── creatoIl Instant (audit)
├── aggiornatoIl Instant (audit)
└── versione Long (optimistic locking)
VINCOLI:
├── UniqueConstraint(utenteId1, utenteId2) → no duplicati
├── utenteId1 ≠ utenteId2 → no self-relation
└── peso ∈ [-1.0, 1.0] → range validato
作成はファクトリーメソッドで行われます RelazioneUtente.crea()、どのくらい有効ですか
データ、関係タイプから重みを自動的に計算し、双方向性を決定します
初期状態を次のように設定します PENDING.
自動双方向性
すべての関係が対称的であるわけではありません。システムは、関係があるかどうかを自動的に判断します。
双方向かどうか、そうでない場合はその逆の型は何か。この計算が行われます
のコンストラクター内で RelazioneUtente 2 つのプライベート メソッドを介して。
対称的な関係
一部の関係は両方向で同一に成立します。 友人 ボブの場合、ボブは自動的にアリスと同じ友達になります 種類と重さ。
SIMMETRICHE (bidirezionale = true, tipo inverso = stesso tipo):
Familiari: CONIUGE, PARTNER, GEMELLO, FRATELLO, SORELLA,
FRATELLASTRO, SORELLASTRA, FRATELLO_CONSANGUINEO,
SORELLA_CONSANGUINEA, FRATELLO_ADOTTIVO,
CUGINO_PRIMO, CUGINO_SECONDO, CUGINO_TERZO,
COGNATO, COGNATA
Sociali: AMICO, AMICO_STRETTO, MIGLIORE_AMICO,
CONOSCENTE, COLLEGA, VICINO, COMPAGNO_CLASSE
Negativi: RIVALE, NEMICO, SCONOSCIUTO
逆型との方向関係
他の関係には固有の方向性があります。 genitore の ボブ、じゃあボブだよ 息子 アリスによって。システムが自動で計算してくれる 逆タイプはグラフを両方向にナビゲートします。
TIPO DIRETTO → TIPO INVERSO
--------------------------------------------
GENITORE → FIGLIO
FIGLIO → GENITORE
NONNO / NONNA → NIPOTE_DI_NONNI
ZIO / ZIA → NIPOTE_DI_ZII
SUOCERO / SUOCERA → GENERO (o NUORA)
PADRINO / MADRINA → FIGLIOCCIO
PATRIGNO → FIGLIASTRO
MATRIGNA → FIGLIASTRA
GENITORE_ADOTTIVO → FIGLIO_ADOTTIVO
FIGLIO_ADOTTIVO → GENITORE_ADOTTIVO
BISNONNO → PRONIPOTE
PRONIPOTE → BISNONNO
このメカニズムは、システムが必要な場合に、グラフ ナビゲーションにとって非常に重要です。
ユーザーのすべての子供を見つけるには、単に関係を探す必要はありません。
tipoRelazione = GENITORE そしてユーザーは utenteId1、しかしまた
どこでの関係 tipoRelazione = FIGLIO そしてユーザーは utenteId2.
関係ステータス: 二国間ワークフロー
それぞれの関係は、要求と同様の二国間確認ワークフローを経ます。 ソーシャルネットワーク上の友情。これにより、両当事者が次の内容に同意することが保証されます。 関係がグラフ内でアクティブになる前にリンクを作成します。
┌─────────────────────────────────┐
│ │
▼ │
[CREAZIONE] → PENDING ──── accetta() ──→ ACCEPTED │
│ │
└──── rifiuta() ──→ REJECTED ─────┘
│
└── resetRichiesta()
(reinvia come PENDING)
REGOLE:
├── Solo il DESTINATARIO può accettare o rifiutare
├── Solo le richieste PENDING possono cambiare stato
├── Le richieste REJECTED possono essere reinviate
└── Le relazioni ACCEPTED sono visibili nel grafo
- 保留中 (確認待ち): それぞれの新しい関係の初期状態。要求者は要求を送信しましたが、受信者はまだ応答していません。この関係はまだグラフには表示されておらず、アルゴリズムには影響しません。
- 受け入れられました (承認済み): 関係はアクティブであり、両方のユーザーに表示されます。これは、グラフの視覚化、招待の提案、競合の検出、コミュニティの検出に使用されます。
- 拒否されました (拒否): リクエストは受信者によって拒否されました。この関係は追跡のためにデータベースに残りますが、アクティブではありません。申請者は今後、次の方法で新しいリクエストを送信できます。
resetRichiesta().
申請者/受取人の区別
フィールド richiestaInviataDaUtenteId 誰がリクエストを送信したかを追跡します。
受信者は自動的にペアのもう一方のユーザーになります。受取人のみ
リクエストを受け入れるか拒否することができます - この制約はで検証されます
方法 validaDestinatario() 間違ったユーザーが試行すると例外がスローされます
答えるために。
ドメイン サービス: GestoreConlegamentiDomainService
複数のエンティティが関与するビジネス ロジックはドメインによって調整されます
サービス GestoreCollegamentiDomainService。このサービスは作成を処理します
重複検証とステータスによるリンク フィルタリングを伴うリクエストの数。
creaRichiestaCollegamento(richiedenteId, destinatarioId, tipo):
1. VALIDAZIONE: richiedenteId ≠ destinatarioId
→ "Non puoi creare collegamento con te stesso"
2. RICERCA DUPLICATI: cerca relazione esistente (in entrambe le direzioni)
3. SE ESISTE:
├── PENDING → ERRORE "Richiesta già inviata e in attesa"
├── ACCEPTED → ERRORE "Collegamento già esistente"
└── REJECTED → RESET: reinvia come nuova PENDING
(aggiorna tipo, richiedente, timestamp)
4. SE NON ESISTE:
└── CREA: nuova RelazioneUtente con stato PENDING
このサービスには、リンクをフィルタリングするためのメソッドも用意されています。 getCollegamentiAccettati()
関係のみを返します ACCEPTED、 その間 getRichiesteRicevutePending()
e getRichiesteInviatePending() 受信リクエストと送信リクエストを区別します。
カウンティング contaRichiesteRicevutePending() パワー通知バッジ
ユーザーインターフェイスで。
コミュニティの検出
ソーシャル グラフの最も強力な機能の 1 つは識別です。 自動 コミュニティ — 密につながった人々のグループ 彼らの間で。で イベントをプレイする、 これは、家族、友人グループ、およびグループを自動的に識別することにつながります。 仕事の同僚。
GRAFO DEGLI INVITATI (60 persone)
│
├── CLUSTER 1: Famiglia Sposo (12 persone)
│ ├── Genitori (peso 1.0)
│ ├── Fratelli e cognati (peso 0.6-0.9)
│ ├── Nonni (peso 0.85)
│ └── Zii e cugini (peso 0.3-0.7)
│
├── CLUSTER 2: Famiglia Sposa (14 persone)
│ ├── Genitori (peso 1.0)
│ ├── Sorelle e cognati (peso 0.6-0.9)
│ └── Parenti estesi (peso 0.3-0.7)
│
├── CLUSTER 3: Amici Università (8 persone)
│ ├── Amici stretti (peso 0.8)
│ ├── Compagni di classe (peso 0.4)
│ └── Collegamento inter-cluster: 2 persone
│ collegano Cluster 3 ↔ Cluster 4
│
├── CLUSTER 4: Colleghi Lavoro Sposo (10 persone)
│ ├── Dirigente (peso 0.6)
│ ├── Responsabile (peso 0.5)
│ └── Colleghi (peso 0.3)
│
├── CLUSTER 5: Amiche Sposa (8 persone)
│ └── Migliori amiche (peso 0.85)
│
└── CLUSTER 6: Vicini e Conoscenti (8 persone)
└── Vicini (peso 0.25) + Conoscenti (peso 0.3)
アルゴリズムは接続密度とエッジの重みを分析して決定します。
グループ間の自然な境界。 enum のヘルパー メソッド TipoRelazione 彼らは促進します
分類: isFamilyRelation(), isSocialRelation(),
isOrganizationalRelation() e isCoreFamily() 確認できるようにします
それぞれの絆の性質をすぐに理解できます。
参照表 TipoRelazioneDB タイプを 8 つのカテゴリに分類します
正式: FAMIGLIA_STRETTA, FAMIGLIA_ALLARGATA, ACQUISITI,
SPIRITUALI, SOCIALI, PROFESSIONALI,
ORGANIZZATIVI e NEGATIVI。各タイプには多言語翻訳があります
(イタリア語と英語) およびインターフェイス ドロップダウンの表示順序。
競合の検出
競合検出は計画にとって重要な機能です イベント。主催者がグループを招待すると、システムが自動的に分析します それらの間の関係を調べて、否定的な関係にあるカップルを特定します。
ENDPOINT: GET /api/v1/relationships/conflicts?userIds=1,2,3,4,5
INPUT: Lista di ID utenti (partecipanti all'evento)
OUTPUT: Lista di ConflictAlert con severità
ALGORITMO:
1. Recupera tutte le relazioni dell'organizzatore
2. Filtra: solo relazioni tra utenti nella lista
3. Filtra: solo relazioni con peso < 0 (negative)
4. Per ogni conflitto, calcola la SEVERITA':
SEVERITA' RANGE PESO ESEMPIO
──────────────────────────────────────────
HIGH peso <= -0.70 NEMICO (-1.0)
MEDIUM peso <= -0.30 RIVALE (-0.5)
LOW peso < 0.00 EX_PARTNER (-0.2)
RESPONSE:
ConflictAlert {
userId1, userId2,
user1Name, user2Name,
relationshipType,
weight,
severity (HIGH | MEDIUM | LOW)
}
主催者は、アラートに基づいて異なる色で表示されたアラートのリストを受け取ります。
重大度: 赤 HIGH (敵などの深刻な紛争)、オレンジ色
MEDIUM (RIVAL や EX_SPOUSE などの中程度の競合)、黄色 LOW
(EX_PARTNER のような軽度の競合)。これにより、情報に基づいた意思決定が可能になります。
席の配置。
使用例: インテリジェントな座席
ソーシャル グラフの最も具体的な使用例は、レイアウトの最適化です。 結婚式、企業ディナー、その他のイベント中のテーブルで、指定された座席でご利用いただけます。 このシステムは、コミュニティ検出と競合検出を組み合わせて、処理を提案します。 最適です。
OBIETTIVI DELL'ALGORITMO:
├── MASSIMIZZARE: relazioni positive allo stesso tavolo
├── MINIMIZZARE: conflitti allo stesso tavolo
├── RISPETTARE: capacità massima per tavolo (8-10 persone)
└── PRESERVARE: nuclei familiari e gruppi di amici
ESEMPIO OUTPUT (8 tavoli da 8 persone):
TAVOLO 1 - "Famiglia Sposo (genitori)"
├── Sposo, Genitori Sposo, Fratello + Cognata
├── Nonni paterni
└── Score medio relazioni: 0.87 (VERY_STRONG)
TAVOLO 2 - "Famiglia Sposa (genitori)"
├── Sposa, Genitori Sposa, Sorella + Cognato
├── Nonni materni
└── Score medio relazioni: 0.85 (VERY_STRONG)
TAVOLO 5 - "Amici Università"
├── 8 amici con peso medio 0.65
└── Score medio relazioni: 0.65 (STRONG)
⚠ CONFLITTO EVITATO:
Marco (EX_CONIUGE, peso -0.3) e Laura
→ Assegnati a tavoli diversi (Tavolo 4 vs Tavolo 6)
→ Distanza fisica: 3 tavoli di separazione
アルゴリズムは段階的に進みます。まず、コミュニティ検出によって識別されたクラスターを割り当てます。 を基本単位として、個人を移動させて分布を調整し、 全体のスコアを確認し、最後に、検出された競合が同じままになっていないことを確認します。 エリア。主催者はいつでも提案を上書きでき、システムが再計算します。 リアルタイムのスコア。
招待状の提案
ソーシャル グラフでは、i とのつながりに基づいて新しいゲストを提案することもできます。
すでに参加者が確定している。エンドポイント GET /api/v1/relationships/suggestions
ソーシャル ネットワークを分析し、既存のグループと最も関係のある人々を特定します。
ENDPOINT: GET /api/v1/relationships/suggestions
?participantIds=1,2,3,4&minConnections=2&limit=10
ALGORITMO:
1. Per ogni partecipante confermato:
└── Recupera tutti i collegamenti ACCEPTED
2. Costruisci mappa candidati:
└── candidatoId → [lista connessioni con partecipanti]
└── ESCLUDI: già partecipanti
└── ESCLUDI: relazioni negative (peso < 0)
3. Per ogni candidato, calcola SCORE:
├── commonConnections = numero connessioni con partecipanti
├── avgWeight = peso medio delle connessioni
└── score = (commonConnections/5 * 0.40) + (avgWeight * 0.60)
^^^^^^^^^^^^^^^^^^^^
normalizzato a [0,1]
4. FILTRA: commonConnections >= minConnections
5. ORDINA: per score decrescente
6. LIMITA: a N risultati
ESEMPIO SUGGERIMENTO:
"Invita anche Marco Rossi"
├── Conosce 3 partecipanti (peso medio: 0.72)
├── Score: (0.6 * 0.40) + (0.72 * 0.60) = 0.672
└── Motivo: "Conosce 3 partecipanti (peso medio: 0.72)"
スコア計算式は 2 つの要素のバランスを取ります。 40% スコアの 共通接続の数 (最大 5 に正規化) に基づきますが、 60% それは関係の平均的な強さによって決まります。これはつまり、 親しい友人が 2 人いる人 (体重 0.80) がより高いスコアを獲得すること そのうちの 1 人には 3 人の単純な知人がいます (重み 0.30)。
D3.jsによる可視化
関係グラフはインターフェイスに視覚的に表示されます
イベントをプレイする
視覚化を通じて 強制的な D3.jsに基づいています。エンドポイント
GET /api/v1/relationships/graph ノード + エッジの形式でデータを返します
図書館から期待されています。
GraphDataResponse {
"nodes": [
{
"id": "1",
"name": "Federico Calò (Tu)",
"degree": 12, // numero di connessioni
"cluster": null // community (futuro)
},
{
"id": "2",
"name": "Marco Rossi",
"degree": 5,
"cluster": null
}
],
"links": [
{
"source": "1",
"target": "2",
"weight": 0.80, // forza del legame
"type": "AMICO_STRETTO"
},
{
"source": "1",
"target": "3",
"weight": -0.50,
"type": "RIVALE"
}
]
}
Il GetRelationshipGraphQueryHandler 接続から開始してグラフを構築します
現在のユーザーによって受け入れられました。各ノードについて、 程度 (度)、
つまり、接続の数で、ビジュアライゼーション内のノードのサイズが決まります。
現在のユーザーは、表示名のサフィックス「(You)」で強調表示されます。
D3.js ビジュアライゼーションでは、グラフのプロパティがビジュアルにマッピングされます。
- ノードサイズ: 度に比例 - ユーザーの接続が増えるほど、ノードが大きく表示されます
- 結び目の色: 所属するクラスターに基づいて — 同じコミュニティには同じ色
- アーチの厚さ: 重みに比例 - 強い関係は太い円弧を持ち、弱い関係は細い円弧を持ちます
- 弓の色: 緑色は肯定的な関係、赤色の破線は否定的な関係を示します
- ノード間の距離: 体重に反比例 - 強い絆を持つ人々は引き寄せられます
- インタラクティブなツールチップ: 円弧の上にマウスを置くと、関係のタイプと重みが表示されます
国際化
リレーションシップ システムは完全なローカリゼーションをサポートします。テーブル
stati_relazione の状態の説明を提供します。 7ヶ国語
(IT、EN、FR、ES、DE、SV、PT)、表 tipi_relazione 名前を提供します
イタリア語と英語に翻訳されました。方法 getDescrizioneLocalizzata(lingua)
ユーザーの言語に基づいて正しい文字列を返します。
STATO IT EN FR
─────────────────────────────────────────────────────────
PENDING In attesa di Waiting for En attente de
conferma confirmation confirmation
ACCEPTED Accettata Accepted Acceptée
REJECTED Rifiutata Rejected Refusée
外部ゲストのディレクトリ
登録ユーザー間のグラフに加え、 イベントをプレイする
間の関係も管理します 外部ゲスト — 持っていない人
プラットフォーム上にあるものの主催者が招待したいアカウント。実体
RelazioneInvitatiEsterni これらの接続を簡略化したセットでモデル化します。
10種類の関係性。
TipoRelazioneTraInvitati:
├── CONIUGE (famiglia)
├── PARTNER (famiglia)
├── GENITORE (famiglia)
├── FIGLIO (famiglia)
├── FRATELLO (famiglia)
├── PARENTE (famiglia)
├── AMICO (sociale)
├── COLLEGA (sociale)
├── CONOSCENTE (sociale)
└── ALTRO
Helper methods:
├── isFamiglia() → true per CONIUGE/PARTNER/GENITORE/FIGLIO/FRATELLO/PARENTE
└── isVicino() → true per tutti i familiari + AMICO
エンティティは以下を保証します 正規の順序 二人のゲストの間で
(invitato_id_1 < invitato_id_2) 異なる方向での重複を避けるため。
両方のゲストが同じユーザーのアドレス帳に属している必要があり、検証済みです
ファクトリーメソッドでは crea().
CQRS アーキテクチャと REST API
リレーションシップ システム全体は、CQRS (コマンド クエリ責任分離) パターンに従います。 コマンドは状態を変更します (リクエストの作成、受け入れ、拒否)。一方、クエリは 副作用 (グラフ、競合、提案) なしでデータを読み取ります。
RelationshipGraphController
│
├── GET /api/v1/relationships/graph
│ └── Restituisce il grafo completo dell'utente
│ Response: GraphDataResponse { nodes[], links[] }
│
├── GET /api/v1/relationships/conflicts?userIds=1,2,3
│ └── Rileva conflitti tra gli utenti specificati
│ Response: ConflictAlertResponse[] {
│ userId1, userId2, user1Name, user2Name,
│ relationshipType, weight, severity
│ }
│
└── GET /api/v1/relationships/suggestions
?participantIds=1,2,3&minConnections=2&limit=10
└── Suggerisce invitati basandosi sulle connessioni
Response: InvitationSuggestionResponse[] {
userId, userName, profileImageUrl,
commonConnections, averageConnectionWeight,
score, reason
}
パフォーマンスを最適化するために、すべてのクエリは読み取り専用トランザクションで実行されます。
認証は JWT 経由で処理され、各エンドポイントが ID を検証します。
現在のユーザーの SecurityUtils.getCurrentUserIdOrThrow().
イベントにソーシャル グラフを使用する理由
よく組織されたイベントと記憶に残るイベントの違いは、関係の詳細にあります。 ソーシャルグラフの イベントをプレイする 関係データを具体的な決定に変換します: 人々をどこに座らせるか、誰を招待するか、 防止すべき競合。 52 の関係タイプ、9 つの強度レベルとアルゴリズム コミュニティ検出、システムは主催者にネットワークの完全なビューを提供します ゲストのソーシャル – すべてインタラクティブなインターフェイスベースを通じて D3.js では、単純なドラッグ アンド ドロップでグラフを探索できるようになります。
次の記事では、ドキュメントと添付ファイルの管理システムを調査し、分析します。 Play The Event がイベントに関連する契約、許可、請求書、その他のファイルを整理する方法 バージョン管理と詳細な共有を備えています。







