У меня есть набор данных, который лучше всего представить в виде графика. Он состоит из узлов 6 или 7 разных «типов» с направленными ребрами (зависимости друг от друга, гарантированно не имеющие циклических зависимостей). Набор данных по сути является шаблоном многоуровневой конфигурации, и пользователь должен иметь возможность выбирать биты и фрагменты конфигурации из разных уровней, которые необходимы, и чтобы зависимые биты вводились автоматически.
Общая потребность в пользовательском интерфейсе состоит в том, чтобы пользователь мог выбрать или отменить выбор элементов из блоков множественного выбора (по одному такому блоку для каждого типа узла), и чтобы "зависимые" элементы в других полях становились выбранными или не выбранными как необходимо. Мне нужно иметь возможность вытащить набор данных с сервера, позволить пользователю выбрать нужные биты (с обработкой зависимостей, выполняемой в javascript на стороне клиента для отзывчивости), а затем отправить результат обратно, когда они будут завершены.
Набор данных является достаточно большим и сложным, поэтому его фактическое отображение в виде графика может быть слишком сложным и запутанным для пользователя. Необходимы только базовые операции обхода графа, поскольку все, что требуется, - это каскадный выбор зависимостей. (Например, пользователь, отменивший выбор узла, приведет к тому, что зависимости узлов станут невыбранными, если не будет другого выбранного узла, который все еще зависит от них. Пользователь, выбравший узел, приведет к тому, что все зависимости этого узла станут выбранными.) A простого поиска по глубине или ширине сначала по направленным ребрам от начального узла будет достаточно, чтобы посетить все затронутые узлы. Если я могу следовать по краям в любом направлении, бонус. (Если нет, я могу легко сгенерировать перевернутый граф и использовать его при необходимости.)
Я копался здесь и нашел ссылки на ряд библиотек визуализации графов JavaScript, но большинство этих дискуссий, по-видимому, интерпретируют «график» как «диаграмму», и у меня нет необходимости в диаграммах здесь. Мои раскопки привели меня к этому списку: Рафаэль, Протовис, Флэр, Д3, ДжисВис, Дракула и Префуз. Из этого списка кажется, что jsVis или Dracula могут иметь базовые графовые конструкции, которые мне нужны, если я просто игнорирую сторону визуализации, но мне не ясно из документации, так ли это. Я должен исключить несколько других, потому что я не могу ввести какие-либо флэш-зависимости. К сожалению, у меня нет времени на прототипирование вещей с таким количеством библиотек. (Я буду больше копаться в jsVis и Дракуле, но здесь не будет удобного ввода.)
Если кто-то имеет опыт работы с чем-то из этого списка и считает, что его часть графика может использоваться независимо от части визуализации, это, безусловно, удовлетворит мои потребности. Если бы была какая-то другая библиотека, которую я мог бы использовать, которая отвечала бы моим потребностям, это тоже было бы здорово. Одно последнее требование в отношении лицензирования: библиотека должна быть «бесплатной» без использования авторского лева - в идеале Apache v2.0, BSD, MIT или что-то в этом роде.