digraph "Associations" {
  rankdir="BT"
  node [ratio="auto" shape=record margin=0; href="javascript:Action.selectClass(&quot;\N&quot;);"];

  // Class: A
  "A" [shape=plaintext margin=0 label=<<table border="1" cellspacing="0" cellborder="0" cellpadding="10"><tr><td>    A    </td></tr></table>>,
   tooltip="class A
Example code illustrating various&#13;kinds of associations&#13;"];

  // Class: B
  "B" [shape=plaintext margin=0 label=<<table border="1" cellspacing="0" cellborder="0" cellpadding="10"><tr><td>    B    </td></tr></table>>,
   tooltip="class B
Class with inline association having role name&#13;"];

  // Class: C
  "C" [shape=plaintext margin=0 label=<<table border="1" cellspacing="0" cellborder="0" cellpadding="10"><tr><td>    C    </td></tr></table>>,
   tooltip="class C
Class with reflexive association&#13;"];

  // Class: D
  "D" [shape=plaintext margin=0 label=<<table border="1" cellspacing="0" cellborder="0" cellpadding="10"><tr><td>    D    </td></tr></table>>,
   tooltip="class D
Reference to a class defined elsewhere&#13;"];

  // All associations
  "A" -> "C" [dir="forward", arrowhead="open", taillabel="0..1 ", headlabel="* ", tooltip="A 0..1  -> *  C

A C may have an A. It can have none or just 1. 

An A has some Cs. It can have none, and there is no upper bound defined.

" headtooltip="A 0..1  -> *  C

A C may have an A. It can have none or just 1. 

An A has some Cs. It can have none, and there is no upper bound defined.

" tailtooltip="A 0..1  -> *  C

A C may have an A. It can have none or just 1. 

An A has some Cs. It can have none, and there is no upper bound defined.

" URL="javascript:Action.selectAssociation('A,C,* ,0..1 ')" ];
  "B" -> "A" [dir="none", taillabel="1 ", headlabel="* endTwo", tooltip="B 1  -- * endTwo A

An A called endTwo has A B. It must always have exactly, one, and can never have none. And there is an upper bound of at most one B.

A B has some As called endTwo. It can have none, and there is no upper bound defined.

When an A is created, its B must be assigned.
When an A is deleted, its B is not deleted and its list of As is decreased.
When a B is deleted, its As are not deleted. They are assigned to another B.
" headtooltip="B 1  -- * endTwo A

An A called endTwo has A B. It must always have exactly, one, and can never have none. And there is an upper bound of at most one B.

A B has some As called endTwo. It can have none, and there is no upper bound defined.

When an A is created, its B must be assigned.
When an A is deleted, its B is not deleted and its list of As is decreased.
When a B is deleted, its As are not deleted. They are assigned to another B.
" tailtooltip="B 1  -- * endTwo A

An A called endTwo has A B. It must always have exactly, one, and can never have none. And there is an upper bound of at most one B.

A B has some As called endTwo. It can have none, and there is no upper bound defined.

When an A is created, its B must be assigned.
When an A is deleted, its B is not deleted and its list of As is decreased.
When a B is deleted, its As are not deleted. They are assigned to another B.
" URL="javascript:Action.selectAssociation('B,A,* endTwo,1 ')" ];
  "C" -> "C" [dir="none", taillabel="0..1 ", headlabel="* ", tooltip="C 0..1  -- *  C

A C may have a C. It can have none or just 1. 

A C has some Cs. It can have none, and there is no upper bound defined.

" headtooltip="C 0..1  -- *  C

A C may have a C. It can have none or just 1. 

A C has some Cs. It can have none, and there is no upper bound defined.

" tailtooltip="C 0..1  -- *  C

A C may have a C. It can have none or just 1. 

A C has some Cs. It can have none, and there is no upper bound defined.

" URL="javascript:Action.selectAssociation('C,C,* ,0..1 ')" ]; 
  "C" -> "D" [dir="none", taillabel="1 ", headlabel="0..1 ", tooltip="C 1  -- 0..1  D

A D has A C. It must always have exactly, one, and can never have none. And there is an upper bound of at most one C.

A C may have a D. It can have none or just 1. 

" headtooltip="C 1  -- 0..1  D

A D has A C. It must always have exactly, one, and can never have none. And there is an upper bound of at most one C.

A C may have a D. It can have none or just 1. 

" tailtooltip="C 1  -- 0..1  D

A D has A C. It must always have exactly, one, and can never have none. And there is an upper bound of at most one C.

A C may have a D. It can have none or just 1. 

" URL="javascript:Action.selectAssociation('C,D,0..1 ,1 ')" ];
