Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Network clustering nodes which have a common property #1147

Open
JJn9 opened this issue Oct 28, 2020 · 6 comments
Open

Network clustering nodes which have a common property #1147

JJn9 opened this issue Oct 28, 2020 · 6 comments
Labels
enhancement New feature or request

Comments

@JJn9
Copy link

JJn9 commented Oct 28, 2020

Hello, I'm trying to create a cluster of nodes based on a node property.
The documentation mentions :
var options = { joinCondition:function(nodeOptions) { return nodeOptions.cid === 1; } }

In this case only nodes with cid == 1 will be in the same cluster, I was wondering if it was possible to cluster all nodes based on their cid value within a single joinCondition or do I have to create a function for each cid possible values ?

@Thomaash Thomaash added the question Further information is requested label Oct 28, 2020
@Thomaash
Copy link
Member

Hi @AlexandreLedru,

network.cluster(…) creates a cluster. If you need to create multiple clusters, you have to call it for each one of them. The property nodeOptions.cid is actually not understood by Vis Network at all, you can use nodeOptions.cluster.name or Math.random() for that matter. Is there any particular reason why you don't want to call the method multiple times?

@JJn9
Copy link
Author

JJn9 commented Oct 28, 2020

Hi @Thomaash ,

First, thanks for your answer, I'm actually developing a network map which has to represent stacks and its devices (switch, firewall, etc...) on stack click, I want it to be dynamic so when a new stack is added to the network I don't have to develop a joinCondition based on it's devices' stack_id, I'm currently working with Hasura/GraphQL to use real-time subscriptions to a database that contains all my network informations.
Ideally I would like the Vis.js network to "listen" each devices' stack_id field and automatically cluster them all based on this id without having to hardcode
nodeOptions.stack_id === 2
for example, I don't know if something like this is possible...

@Thomaash Thomaash added enhancement New feature or request and removed question Further information is requested labels Oct 28, 2020
@Thomaash
Copy link
Member

This isn't possible at the moment, network.cluster(…) is a one shot thing.

@JJn9
Copy link
Author

JJn9 commented Oct 28, 2020

Ok, thanks ! :)

@th3cr0w
Copy link

th3cr0w commented Feb 19, 2021

I had similar scenario, maybe a bit simpler to execute:

network structure taken from DB, switches, wireless access points, firewalls ...
Design idea was to have switch and all access points supported by it represented as cluster. Network of 100 switches and 1000 access points is too busy if everything is visible at once.

I had only 2 groups to look for so it might not help in your case but this is how it is working in my use case:

var switches = nodes.getIds({
  filter: function (item) {
    return (item.group == "switch");
  },
});

function clusterWAPs (switchid){
  network.clusterByConnection(switchid,{
    joinCondition: function(parentNodeOptions, childNodeOptions){
      return (childNodeOptions.group === "wap" || parentNodeOptions.group === "wap");
    },
...

}

switches.forEach((switchid, i) => {
  clusterWAPs(switchid);
});

get list of things to iterate over (that your cluster must have) and do clustering based on:
nodeOptions.stack_id === iteration_item.stack_id

@scenaristeur
Copy link

scenaristeur commented Mar 28, 2021

Hi! perharps could help, here is my solution to build many clusters on https://scenaristeur.github.io/ipgs/
first a config_cid that list all my cids :

let cid_config = {
  // Standard
  1: { id: "help", label: "Help / Aide"},
  2: { id: "examples", label: "Examples", shape: 'star', color: '#7FD1B9'},
  //Vis
  5: { id: "networks", label: "Networks"},
  6: { id: "history", label: "Navigation History"},
  //Solid
  20: { id: "storage", label: "Storage"},
  21: { id: "profile", label: "User Profile"},
  22: { id: "friends", label: "Solid Friends"},
  //Data
  30: { id: "sources", label: "Data Sources"},
  // Types
  40: { id: "type", label: "Types"},
  41: { id: "literal", label: "Literals"},
  42: { id: "resource", label: "Resources"},
  43: { id: "actors", label: "Persons or Actors / Agents"},
}

then i get an array of all cids used in the network

with var cids = [...new Set(network.nodes.map(item => item.cid))].filter(Boolean);

filter(Boolean) is here to remove "undefined" when node has no cid (https://stackoverflow.com/questions/281264/remove-empty-elements-from-an-array-in-javascript)

Then i can apply clustering for each cid found even if it is not in the cid_config

cids.forEach((cid) => {
   network.cluster({
     joinCondition: function (childOptions) {
       return childOptions.cid == cid;
     },
     clusterNodeProperties: {
       id: cid_config[cid] && cid_config[cid].id ? cid_config[cid].id : cid,
       borderWidth: 3,
       shape: cid_config[cid] && cid_config[cid].shape ? cid_config[cid].shape : "box",
       color: cid_config[cid] && cid_config[cid].color ? cid_config[cid].color : "#ECC046",
       label: cid_config[cid] &&cid_config[cid].label ? cid_config[cid].label : "no name group"
     },
   });
 });

I hope it can help as much as vis js helps me in my projects

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement New feature or request
Projects
None yet
Development

No branches or pull requests

4 participants