8 added 1341 characters in body
source | link

Update: From comments: "Ideally a user just supplies a list of relationships (with possible labels)..."

elist = {{"rush hour" -> "traffic jam",  "empty"}, 
 {"bad weather" -> "accident", "canyon"}, 
 {"accident" -> "traffic jam", "sweatshirt"}, 
 {"bad weather" -> "traffic jam", "pump"}, 
 {"accident" -> "sirens", "nominative"}};

You can use GraphComputation`LayeredGraphPlotLegacy or GraphComputation`GraphPlotLegacy (if you have access to versions before v12 you can use LayeredGraphPlot and GraphPlot, respectively):

GraphComputation`LayeredGraphPlotLegacy[elist,  
 DirectedEdges -> True, EdgeLabeling -> True, VertexLabeling -> True, 
 ImageSize -> 500, BaseStyle -> 15, PlotStyle -> Black]

enter image description here

GraphComputation`GraphPlotLegacy[elist,  
 DirectedEdges -> True, EdgeLabeling -> True, VertexLabeling -> True, 
 ImageSize -> 500, BaseStyle -> 15, PlotStyle -> Black,
 Method -> "LayeredDigraphDrawing"] 

same picture

To render vertices as disks add the option

VertexRenderingFunction -> ({White, EdgeForm[Black], Disk[#, .3], Black, Text[#2, #1]} &) 

to get

enter image description here

Update: From comments: "Ideally a user just supplies a list of relationships (with possible labels)..."

elist = {{"rush hour" -> "traffic jam",  "empty"}, 
 {"bad weather" -> "accident", "canyon"}, 
 {"accident" -> "traffic jam", "sweatshirt"}, 
 {"bad weather" -> "traffic jam", "pump"}, 
 {"accident" -> "sirens", "nominative"}};

You can use GraphComputation`LayeredGraphPlotLegacy or GraphComputation`GraphPlotLegacy (if you have access to versions before v12 you can use LayeredGraphPlot and GraphPlot, respectively):

GraphComputation`LayeredGraphPlotLegacy[elist,  
 DirectedEdges -> True, EdgeLabeling -> True, VertexLabeling -> True, 
 ImageSize -> 500, BaseStyle -> 15, PlotStyle -> Black]

enter image description here

GraphComputation`GraphPlotLegacy[elist,  
 DirectedEdges -> True, EdgeLabeling -> True, VertexLabeling -> True, 
 ImageSize -> 500, BaseStyle -> 15, PlotStyle -> Black,
 Method -> "LayeredDigraphDrawing"] 

same picture

To render vertices as disks add the option

VertexRenderingFunction -> ({White, EdgeForm[Black], Disk[#, .3], Black, Text[#2, #1]} &) 

to get

enter image description here

7 added 25 characters in body
source | link
vertices = {"rush hour", "bad weather", "accident", "traffic jam", "sirens"};

edges = DirectedEdge @@@ {"rush hour" -> "traffic jam", "bad weather" -> "accident", 
      "accident" -> "traffic jam", "bad weather" -> "traffic jam", 
      "accident" -> "sirens"};

edgelabels = RandomWord["Noun", Length @ edges];

Graph[edges, 
 PlotTheme -> "IndexLabeled", 
 VertexSize -> Large, 
 EdgeLabels -> Thread[edges -> edgelabels]]

enter image description here

Use additional options to embellish the picture:

elabeling = AssociationThread[edges, edgelabels];
coords
eSF = Drop[Join@@Array[{ #2,(3-#)}&, Arrowheads[{2{.04,3 .75}], {4}]

Graph[vertices    {.05, edges.45, 
 Graphics VertexLabelStyle@ ->Text[Framed[Style[elabeling 14@ #2, 14],
 ImageSize     FrameStyle -> LargeNone, 
  GraphStyleBackground -> "IndexLabeled"White]]}}], 
 VertexSize -> .4, Last @ GraphElementData["Arrow"][##]} &;

coords EdgeShapeFunction= ->Drop[Join ({Arrowheads[{@@ Array[{.04 #2, .75(3 - #)}&, {.052, .453}], {4}]
    Graphics @ Text[Framed[Style[elabeling@#2
Graph[vertices, 14]edges,
   
 VertexLabelStyle -> 14,  
 FrameStyleImageSize -> NoneLarge,  
 BackgroundGraphStyle -> White]]}}]"IndexLabeled", 
  VertexSize -> .4, Last 
 @EdgeShapeFunction GraphElementData["Arrow"][##]}-> &)eSF, 
 VertexCoordinates -> coords]

enter image description here

We can also construct the graphics primitives from scratch:

radius = Offset @  Max[(1.2/2) 
    Rasterize[Style[#, 14, "Graphics"], "RasterSize"][[1]] & /@ vertices];

Graphics[{{Arrowheads[{{.02, .75}, {.05, .45, 
        Graphics @Text[Framed[Style[elabeling @ #, 14], FrameStyle -> None, 
           Background -> White], {0, 0}, {0, .25}]}}], 
     Arrow[List @@ # /. Thread[vertices -> coords]]} & /@ edges, 
  FaceForm[White], EdgeForm[Gray], Disk[#, radius] & /@ coords, 
  MapThread[Text, {Style[#, 16] & /@ vertices, coords}]}, 
 ImageSize -> 800, PlotRangePadding -> Scaled[.2]]

enter image description here

vertices = {"rush hour", "bad weather", "accident", "traffic jam", "sirens"};

edges = DirectedEdge @@@ {"rush hour" -> "traffic jam", "bad weather" -> "accident", 
      "accident" -> "traffic jam", "bad weather" -> "traffic jam", 
      "accident" -> "sirens"};

edgelabels = RandomWord["Noun", Length @ edges];

Graph[edges, 
 PlotTheme -> "IndexLabeled", 
 VertexSize -> Large, 
 EdgeLabels -> Thread[edges -> edgelabels]]

enter image description here

Use additional options to embellish the picture:

elabeling = AssociationThread[edges, edgelabels];
coords = Drop[Join@@Array[{ #2,(3-#)}&, {2,3}], {4}]

Graph[vertices, edges, 
  VertexLabelStyle -> 14, 
 ImageSize -> Large, 
  GraphStyle -> "IndexLabeled", 
 VertexSize -> .4, 
 EdgeShapeFunction -> ({Arrowheads[{{.04, .75}, {.05, .45, 
    Graphics @ Text[Framed[Style[elabeling@#2, 14],
       FrameStyle -> None,  Background -> White]]}}], 
     Last @ GraphElementData["Arrow"][##]} &), 
 VertexCoordinates -> coords]

enter image description here

We can also construct the graphics primitives from scratch:

radius = Offset @  Max[(1.2/2) 
    Rasterize[Style[#, 14, "Graphics"], "RasterSize"][[1]] & /@ vertices];

Graphics[{{Arrowheads[{{.02, .75}, {.05, .45, 
        Graphics @Text[Framed[Style[elabeling @ #, 14], FrameStyle -> None, 
           Background -> White], {0, 0}, {0, .25}]}}], 
     Arrow[List @@ # /. Thread[vertices -> coords]]} & /@ edges, 
  FaceForm[White], EdgeForm[Gray], Disk[#, radius] & /@ coords, 
  MapThread[Text, {Style[#, 16] & /@ vertices, coords}]}, 
 ImageSize -> 800, PlotRangePadding -> Scaled[.2]]

enter image description here

vertices = {"rush hour", "bad weather", "accident", "traffic jam", "sirens"};

edges = DirectedEdge @@@ {"rush hour" -> "traffic jam", "bad weather" -> "accident", 
      "accident" -> "traffic jam", "bad weather" -> "traffic jam", 
      "accident" -> "sirens"};

edgelabels = RandomWord["Noun", Length @ edges];

Graph[edges, 
 PlotTheme -> "IndexLabeled", 
 VertexSize -> Large, 
 EdgeLabels -> Thread[edges -> edgelabels]]

enter image description here

Use additional options to embellish the picture:

elabeling = AssociationThread[edges, edgelabels];

eSF = {Arrowheads[{{.04, .75}, 
    {.05, .45, Graphics @ Text[Framed[Style[elabeling @ #2, 14],
      FrameStyle -> None,  Background -> White]]}}], 
    Last @ GraphElementData["Arrow"][##]} &;

coords = Drop[Join @@ Array[{ #2, (3 - #)}&, {2, 3}], {4}]

Graph[vertices, edges,  
 VertexLabelStyle -> 14,  
 ImageSize -> Large,  
 GraphStyle -> "IndexLabeled", 
 VertexSize -> .4,  
 EdgeShapeFunction -> eSF, 
 VertexCoordinates -> coords]

enter image description here

We can also construct the graphics primitives from scratch:

radius = Offset @  Max[(1.2/2) 
    Rasterize[Style[#, 14, "Graphics"], "RasterSize"][[1]] & /@ vertices];

Graphics[{{Arrowheads[{{.02, .75}, {.05, .45, 
        Graphics @Text[Framed[Style[elabeling @ #, 14], FrameStyle -> None, 
           Background -> White], {0, 0}, {0, .25}]}}], 
     Arrow[List @@ # /. Thread[vertices -> coords]]} & /@ edges, 
  FaceForm[White], EdgeForm[Gray], Disk[#, radius] & /@ coords, 
  MapThread[Text, {Style[#, 16] & /@ vertices, coords}]}, 
 ImageSize -> 800, PlotRangePadding -> Scaled[.2]]

enter image description here

6 deleted 263 characters in body
source | link
vertices = {"rush hour", "bad weather", "accident", "traffic jam", "sirens"};

edges = DirectedEdge @@@ {"rush hour" -> "traffic jam", "bad weather" -> "accident", 
      "accident" -> "traffic jam", "bad weather" -> "traffic jam", 
      "accident" -> "sirens"};

edgelabels = RandomWord["Noun", Length @ edges];

Graph[edges, 
 PlotTheme -> "IndexLabeled", 
 VertexSize -> Large, 
 EdgeLabels -> Thread[edges -> edgelabels]]

enter image description here

Use additional options to embellish the picture:

elabeling = AssociationThread[edges, edgelabels];
coords = Drop[Join@@Array[{ #2,(3-#)}&, {2,3}], {4}]

Graph[vertices, edges, 
 VertexLabelStyle -> 14, 
 ImageSize -> Large, 
 GraphStyle -> "IndexLabeled", 
 VertexSize -> .4, 
 EdgeShapeFunction -> ({Arrowheads[{{.04, .75}, {.05, .45, 
    Graphics @ Text[Framed[Style[elabeling@#2, 14],
      FrameStyle -> None,  Background -> White]]}}], 
     Last @ GraphElementData["Arrow"][##]} &), 
 VertexCoordinates -> (ScalingTransform[{2, 1}]@
    RotationTransform[-Pi/2][GraphEmbedding[Graph@edges, 
     {"MultipartiteEmbedding", "VertexPartition" -> {3, 2}}]])]coords]

enter image description hereenter image description here

ConstructingWe can also construct the graphics primitives from scratch:

edgelabels = RandomWord["Noun", Length @ edges];

elabeling = AssociationThread[edges, edgelabels];

radius = Offset @  Max[(1.2/2) 
    Rasterize[Style[#, 14, "Graphics"], "RasterSize"][[1]] & /@ vertices];

coords = Drop[Join @@ Array[{ #2, (3 - #)} &, {2, 3}], {4}];

Graphics[{{Arrowheads[{{.02, .75}, {.05, .45, 
        Graphics @Text[Framed[Style[elabeling @ #, 14], FrameStyle -> None, 
           Background -> White], {0, 0}, {0, .25}]}}], 
     Arrow[List @@ # /. Thread[vertices -> coords]]} & /@ edges, 
  FaceForm[White], EdgeForm[Gray], Disk[#, radius] & /@ coords, 
  MapThread[Text, {Style[#, 16] & /@ vertices, coords}]}, 
 ImageSize -> 800, PlotRangePadding -> Scaled[.2]]

enter image description here

vertices = {"rush hour", "bad weather", "accident", "traffic jam", "sirens"};

edges = DirectedEdge @@@ {"rush hour" -> "traffic jam", "bad weather" -> "accident", 
      "accident" -> "traffic jam", "bad weather" -> "traffic jam", 
      "accident" -> "sirens"};

edgelabels = RandomWord["Noun", Length @ edges];

Graph[edges, 
 PlotTheme -> "IndexLabeled", 
 VertexSize -> Large, 
 EdgeLabels -> Thread[edges -> edgelabels]]

enter image description here

Use additional options to embellish the picture:

elabeling = AssociationThread[edges, edgelabels];

Graph[vertices, edges, 
 VertexLabelStyle -> 14, 
 ImageSize -> Large, 
 GraphStyle -> "IndexLabeled", 
 VertexSize -> .4, 
 EdgeShapeFunction -> ({Arrowheads[{{.04, .75}, {.05, .45, 
    Graphics @ Text[Framed[Style[elabeling@#2, 14],
      FrameStyle -> None,  Background -> White]]}}], 
     Last @ GraphElementData["Arrow"][##]} &), 
 VertexCoordinates -> (ScalingTransform[{2, 1}]@
    RotationTransform[-Pi/2][GraphEmbedding[Graph@edges, 
     {"MultipartiteEmbedding", "VertexPartition" -> {3, 2}}]])]

enter image description here

Constructing the graphics primitives from scratch:

edgelabels = RandomWord["Noun", Length @ edges];

elabeling = AssociationThread[edges, edgelabels];

radius = Offset @  Max[(1.2/2) 
    Rasterize[Style[#, 14, "Graphics"], "RasterSize"][[1]] & /@ vertices];

coords = Drop[Join @@ Array[{ #2, (3 - #)} &, {2, 3}], {4}];

Graphics[{{Arrowheads[{{.02, .75}, {.05, .45, 
        Graphics @Text[Framed[Style[elabeling @ #, 14], FrameStyle -> None, 
           Background -> White], {0, 0}, {0, .25}]}}], 
     Arrow[List @@ # /. Thread[vertices -> coords]]} & /@ edges, 
  FaceForm[White], EdgeForm[Gray], Disk[#, radius] & /@ coords, 
  MapThread[Text, {Style[#, 16] & /@ vertices, coords}]}, 
 ImageSize -> 800, PlotRangePadding -> Scaled[.2]]

enter image description here

vertices = {"rush hour", "bad weather", "accident", "traffic jam", "sirens"};

edges = DirectedEdge @@@ {"rush hour" -> "traffic jam", "bad weather" -> "accident", 
      "accident" -> "traffic jam", "bad weather" -> "traffic jam", 
      "accident" -> "sirens"};

edgelabels = RandomWord["Noun", Length @ edges];

Graph[edges, 
 PlotTheme -> "IndexLabeled", 
 VertexSize -> Large, 
 EdgeLabels -> Thread[edges -> edgelabels]]

enter image description here

Use additional options to embellish the picture:

elabeling = AssociationThread[edges, edgelabels];
coords = Drop[Join@@Array[{ #2,(3-#)}&, {2,3}], {4}]

Graph[vertices, edges, 
 VertexLabelStyle -> 14, 
 ImageSize -> Large, 
 GraphStyle -> "IndexLabeled", 
 VertexSize -> .4, 
 EdgeShapeFunction -> ({Arrowheads[{{.04, .75}, {.05, .45, 
    Graphics @ Text[Framed[Style[elabeling@#2, 14],
      FrameStyle -> None,  Background -> White]]}}], 
     Last @ GraphElementData["Arrow"][##]} &), 
 VertexCoordinates -> coords]

enter image description here

We can also construct the graphics primitives from scratch:

radius = Offset @  Max[(1.2/2) 
    Rasterize[Style[#, 14, "Graphics"], "RasterSize"][[1]] & /@ vertices];

Graphics[{{Arrowheads[{{.02, .75}, {.05, .45, 
        Graphics @Text[Framed[Style[elabeling @ #, 14], FrameStyle -> None, 
           Background -> White], {0, 0}, {0, .25}]}}], 
     Arrow[List @@ # /. Thread[vertices -> coords]]} & /@ edges, 
  FaceForm[White], EdgeForm[Gray], Disk[#, radius] & /@ coords, 
  MapThread[Text, {Style[#, 16] & /@ vertices, coords}]}, 
 ImageSize -> 800, PlotRangePadding -> Scaled[.2]]

enter image description here

5 added 899 characters in body
source | link
4 deleted 37 characters in body
source | link
3 added 3 characters in body
source | link
2 added 1144 characters in body
source | link
1
source | link