Trying to get the Force Direct Graph from Vega examples to work in Cabana

Hi, I'm trying to get the Force Direct Graph example to work in Kibana, but I get "node not found: 27955" From what I can see the node is present in the node-data.

Spec:

{
  "$schema": "https://vega.github.io/schema/vega/v5.json",
  "description": "A node-link diagram with force-directed layout, depicting character co-occurrence in the novel Les Misérables.",
  "width": 700,
  "height": 500,
  "padding": 0,
  "autosize": {
    "type": "none",
    "contains": "padding"
  },
  "signals": [
    {
      "name": "cx",
      "update": "width / 2"
    },
    {
      "name": "cy",
      "update": "height / 2"
    },
    {
      "name": "nodeRadius",
      "value": 8,
      "bind": {
        "input": "range",
        "min": 1,
        "max": 50,
        "step": 1
      }
    },
    {
      "name": "nodeCharge",
      "value": -30,
      "bind": {
        "input": "range",
        "min": -100,
        "max": 10,
        "step": 1
      }
    },
    {
      "name": "linkDistance",
      "value": 30,
      "bind": {
        "input": "range",
        "min": 5,
        "max": 100,
        "step": 1
      }
    },
    {
      "name": "static",
      "value": true,
      "bind": {
        "input": "checkbox"
      }
    },
    {
      "description": "State variable for active node fix status.",
      "name": "fix",
      "value": false,
      "on": [
        {
          "events": "symbol:mouseout[!event.buttons], window:mouseup",
          "update": "false"
        },
        {
          "events": "symbol:mouseover",
          "update": "fix || true"
        },
        {
          "events": "[symbol:mousedown, window:mouseup] > window:mousemove!",
          "update": "xy()",
          "force": true
        }
      ]
    },
    {
      "description": "Graph node most recently interacted with.",
      "name": "node",
      "value": null,
      "on": [
        {
          "events": "symbol:mouseover",
          "update": "fix === true ? item() : node"
        }
      ]
    },
    {
      "description": "Flag to restart Force simulation upon data changes.",
      "name": "restart",
      "value": false,
      "on": [
        {
          "events": {
            "signal": "fix"
          },
          "update": "fix && fix.length"
        }
      ]
    }
  ],
  "data": [
    {
      "name": "node-data",
      "format": {
        "property": "hits.hits"
      },
      "transform": [
        {
          "type": "project",
          "fields": [
            "_source.name",
            "_source.group",
            "_source.id"
          ],
          "as": [
            "name",
            "group",
            "index"
          ]
        }
      ],
      "url": {
        "index": "fdg_nodes_*",
        "body": {
          "size": 10000,
          "query": {
            "bool": {
              "must": [],
              "filter": [
                {
                  "match_all": {}
                }
              ],
              "should": [],
              "must_not": []
            }
          }
        }
      },
      "values": {
        "took": 0,
        "timed_out": false,
        "_shards": {
          "total": 3,
          "successful": 3,
          "skipped": 0,
          "failed": 0
        },
        "hits": {
          "total": 2,
          "max_score": 0,
          "hits": [
            {
              "_index": "fdg_nodes_app",
              "_type": "_doc",
              "_id": "0np8IYIBk44miwp_8K6y",
              "_score": 0,
              "_source": {
                "name": "Application",
                "id": 28673,
                "group": "ArchiMate:ApplicationComponent"
              }
            },
            {
              "_index": "fdg_nodes_wp",
              "_type": "_doc",
              "_id": "03p8IYIBk44miwp_9K4f",
              "_score": 0,
              "_source": {
                "name": "Project",
                "id": 27955,
                "group": "ArchiMate:IMWorkpackage"
              }
            }
          ]
        }
      }
    },
    {
      "name": "link-data",
      "format": {
        "property": "hits.hits"
      },
      "transform": [
        {
          "type": "project",
          "fields": [
            "_source.source",
            "_source.target"
          ],
          "as": [
            "source",
            "target"
          ]
        },
        {
          "type": "filter",
          "expr": "warn(datum)"
        }
      ],
      "url": {
        "index": "fdg_rels*",
        "body": {
          "size": 10000
        }
      },
      "values": {
        "took": 0,
        "timed_out": false,
        "_shards": {
          "total": 2,
          "successful": 2,
          "skipped": 0,
          "failed": 0
        },
        "hits": {
          "total": 1,
          "max_score": 1,
          "hits": [
            {
              "_index": "fdg_rels_wp_app",
              "_type": "_doc",
              "_id": "1Hp8IYIBk44miwp_-a5Q",
              "_score": 1,
              "_source": {
                "source": 27955,
                "target": 28673
              }
            }
          ]
        }
      }
    }
  ],
  "scales": [
    {
      "name": "color",
      "type": "ordinal",
      "domain": {
        "data": "node-data",
        "field": "group"
      },
      "range": {
        "scheme": "category20c"
      }
    }
  ],
  "marks": [
    {
      "name": "nodes",
      "type": "symbol",
      "zindex": 1,
      "from": {
        "data": "node-data"
      },
      "on": [
        {
          "trigger": "fix",
          "modify": "node",
          "values": "fix === true ? {fx: node.x, fy: node.y} : {fx: fix[0], fy: fix[1]}"
        },
        {
          "trigger": "!fix",
          "modify": "node",
          "values": "{fx: null, fy: null}"
        }
      ],
      "encode": {
        "enter": {
          "fill": {
            "scale": "color",
            "field": "group"
          },
          "stroke": {
            "value": "white"
          }
        },
        "update": {
          "size": {
            "signal": "2 * nodeRadius * nodeRadius"
          },
          "cursor": {
            "value": "pointer"
          }
        }
      },
      "transform": [
        {
          "type": "force",
          "iterations": 300,
          "restart": {
            "signal": "restart"
          },
          "static": {
            "signal": "static"
          },
          "signal": "force",
          "forces": [
            {
              "force": "center",
              "x": {
                "signal": "cx"
              },
              "y": {
                "signal": "cy"
              }
            },
            {
              "force": "collide",
              "radius": {
                "signal": "nodeRadius"
              }
            },
            {
              "force": "nbody",
              "strength": {
                "signal": "nodeCharge"
              }
            },
            {
              "force": "link",
              "links": "link-data",
              "distance": {
                "signal": "linkDistance"
              }
            }
          ]
        }
      ]
    },
    {
      "type": "path",
      "from": {
        "data": "link-data"
      },
      "interactive": false,
      "encode": {
        "update": {
          "stroke": {
            "value": "#ccc"
          },
          "strokeWidth": {
            "value": 0.5
          }
        }
      },
      "transform": [
        {
          "type": "linkpath",
          "require": {
            "signal": "force"
          },
          "shape": "line",
          "sourceX": "datum.source.x",
          "sourceY": "datum.source.y",
          "targetX": "datum.target.x",
          "targetY": "datum.target.y"
        }
      ]
    }
  ],
  "config": {
    "range": {
      "category": {
        "scheme": "elastic"
      }
    },
    "arc": {
      "fill": "#54B399"
    },
    "area": {
      "fill": "#54B399"
    },
    "line": {
      "stroke": "#54B399"
    },
    "path": {
      "stroke": "#54B399"
    },
    "rect": {
      "fill": "#54B399"
    },
    "rule": {
      "stroke": "#54B399"
    },
    "shape": {
      "stroke": "#54B399"
    },
    "symbol": {
      "fill": "#54B399"
    },
    "trail": {
      "fill": "#54B399"
    },
    "title": {
      "color": "#343741"
    },
    "style": {
      "guide-label": {
        "fill": "#69707d"
      },
      "guide-title": {
        "fill": "#343741"
      },
      "group-title": {
        "fill": "#343741"
      },
      "group-subtitle": {
        "fill": "#343741"
      }
    },
    "axis": {
      "tickColor": "#eef0f3",
      "domainColor": "#eef0f3",
      "gridColor": "#eef0f3"
    },
    "background": "transparent"
  }
}

Not verified but I think the index numbers need to start with 0. I changed your numbers numbers to 0, 1 and it worked.

What I've done before is made a new field using identifier transform and then subtracted 1 to start with 0. This then makes you do another transform to translate that field to the link data to ensure it's all lined up. Unfortunately I don't think you can use the ID's you are trying.

{"type": "identifier", "as": "index"},
{"type": "formula", "as": "index", "expr": "datum['index'] - 1"},

Thanks for the quick response!

1 Like

This topic was automatically closed 28 days after the last reply. New replies are no longer allowed.