SlideShare a Scribd company logo
Gephi Toolkit Tutorial
The Gephi Toolkit project package essential modules (Graph, Layout,
Filters, IO...) in a standard Java library, which any Java project can use
for getting things done.

The toolkit is just a single JAR that anyone could reuse in a Java program.
This tutorial aims to introduce the project, show possibilities and start
write some code.

    Get Gephi Toolkit

The content of this tutorial, and more, can be found in the toolkit-demos archive.




Last updated October 16th, 2011
Introduction
Gephi toolkit is a way to reuse Gephi features with scripts. It has the richness of Gephi features and the
flexibility of a library.


Gephi is designed in a modular way:

 • Splitted into different modules

 • For instance, a module for the graph structure,
   a module for layout, a module for filter, ...

 • Business modules are separated from UI modules

 • Core modules can be extracted, no extra dependency




  The toolkit wraps core modules, without user interaces in a single JAR library. There is no additionnal
  code in Gephi to allow this. The desktop application and the tookit relies exactly on the same modules.
Use-cases
Toolkit possible use-case:


* Create a layout program    Receive a GEXF file, layout it, and return the resulting GEXF file.

* Complete chain             From an imput graph file (DOT, GML, GEXF, ...) to the resulting PDF.

* Java applet                Use Gephi modules to store, filter,layout and build a new visualization applet
                             on top of it.

* Servlet                    Create graph snippets images (PNG) automatically in a servlet.
Find Toolkit Documentation

 Toolkit Portal on Gephi Wiki

 Toolkit Javadoc

 References

 Toolkit-demos, download sources
Create Project
A project needs to be created for using the toolkit features. Creating a new project also creates a workspace.
Workspaces are the container for all data.

A project can have several workspaces, independent from each other. The workspace is often asked by modules,
so you need to create one at startup.


   //Init a project - and therefore a workspace
   ProjectController pc = Lookup.getDefault().lookup(ProjectController.class);
   pc.newProject();
   Workspace workspace = pc.getCurrentWorkspace();




     What is Lookup ?
     Lookup is a very useful way to retrieve services and find instances in a modular application like Gephi. Controllers are
     singletons and can be found by looking into the general Lookup: Lookup.getDefault(). So Lookup is just a container, where
     modules put objects in it. Other modules get these objects from their class name.
Import Graph File
Importing data from files supported by Gephi.The import is done in two steps. First, all data are put in a
Container, which is separated from the main data structure. The second steps is “processing”, when data in
the container are appended to the graph structure and attributes.

The API also allows to import data from Reader and InputStream.


   //Import file
   ImportController importController = Lookup.getDefault().lookup(ImportController.class);
   Container container;
   try {
     File file = new File(getClass().getResource(“/org/gephi/toolkit/demos/resources/test.gexf”).toURI());
     container = importController.importFile(file);
     container.getLoader().setEdgeDefault(EdgeDefault.DIRECTED); //Force DIRECTED
     container.setAllowAutoNode(false); //Don’t create missing nodes
   } catch (Exception ex) {
     ex.printStackTrace();
     return;
   }

   //Append imported data to GraphAPI
   importController.process(container, new DefaultProcessor(), workspace);
Manipulate Graph API (1/2)
The Graph API’s role is to store and serve the graph structure. Let’s see how to create a graph programatically.


   //Get a graph model - it exists because we have a workspace
   GraphModel graphModel = Lookup.getDefault().lookup(GraphController.class).getModel();

   //Create two nodes
   Node n0 = graphModel.factory().newNode(“n0”);
   n0.getNodeData().setLabel(“Node 0”);
   Node n1 = graphModel.factory().newNode(“n1”);
   n1.getNodeData().setLabel(“Node 1”);

   //Create an edge - directed and weight 1
   Edge e1 = graphModel.factory().newEdge(n1, n0, 1f, true);

   //Append as a Directed Graph
   DirectedGraph directedGraph = graphModel.getDirectedGraph();
   directedGraph.addNode(n0);
   directedGraph.addNode(n1);
   directedGraph.addEdge(e1);
Manipulate Graph API (2/2)
Quick overview of Graph API’s possibilities.


   //Count nodes and edges
   System.out.println(“Nodes: “+directedGraph.getNodeCount()+” Edges: “+directedGraph.getEdgeCount());

   //Iterate over nodes
   for(Node n : directedGraph.getNodes()) {
     Node[] neighbors = directedGraph.getNeighbors(n).toArray();
     System.out.println(n.getNodeData().getLabel()+” has “+neighbors.length+” neighbors”);
   }

   //Find node by id
   Node node2 = directedGraph.getNode(“n2”);

   //Modify the graph while reading
   //Due to locking, you need to use toArray() on Iterable to be able to modify the graph in a read loop
   for(Node n : directedGraph.getNodes().toArray()) {
     directedGraph.removeNode(n);
   }
Import from RDBMS
The database format must be “Edge List”, basically a table for nodes and a table for edges. To be found by the
importer, you need to have following columns: ID and LABEL for nodes and SOURCE, TARGET and WEIGHT for
edges. Any other column will be imported as attributes.


   //Import database
   ImportController importController = Lookup.getDefault().lookup(ImportController.class);
   EdgeListDatabaseImpl db = new EdgeListDatabaseImpl();
   db.setDBName(“test”);
   db.setHost(“localhost”);
   db.setUsername(“root”);
   db.setPasswd(“”);
   db.setSQLDriver(new MySQLDriver());
   //db.setSQLDriver(new PostgreSQLDriver());
   //db.setSQLDriver(new SQLServerDriver());
   db.setPort(3306);
   db.setNodeQuery(“SELECT nodes.id AS id, nodes.label AS label, nodes.url FROM nodes”);
   db.setEdgeQuery(“SELECT edges.source AS source, edges.target AS target, edges.name AS label, edges.
   weight AS weight FROM edges”);
   Container container = importController.importDatabase(db, new ImporterEdgeList());

   //Append imported data to GraphAPI
   importController.process(container, new DefaultProcessor(), workspace);
Layout - Manual
Layouts are iterative algorithms that change nodes’ position at each pass. Each layout algorithm needs to get
a graph model to be able to query the network. Parameters can be set directly to the layout.

Use ForceAtlas, FruchtermanReingold or LabelAdjust algorithm in a similar way.




   //Get graph model of current workspace
   GraphModel graphModel = Lookup.getDefault().lookup(GraphController.class).getModel();

   //Run YifanHuLayout for 100 passes - The layout always takes the current visible view
   YifanHuLayout layout = new YifanHuLayout(null, new StepDisplacement(1f));
   layout.setGraphModel(graphModel);
   layout.resetPropertiesValues();
   layout.setOptimalDistance(200f);

   layout.initAlgo();
   for (int i = 0; i < 100 && layout.canAlgo(); i++) {
     layout.goAlgo();
   }
Layout - Auto
With AutoLayout class, you can set a layout duration, and an execution ratio for several layouts. For instance
you set 0.8 for a Yifan Hu algorithm and 0.2 for Label Adjust. If execution time is 100 seconds, the first algorithm
runs for 80 seconds and the second for 20 seconds. It also allows to change property values dynamically, at a
certain ratio or interpolated if values are numerical.


   //Layout for 1 minute
   AutoLayout autoLayout = new AutoLayout(1, TimeUnit.MINUTES);
   autoLayout.setGraphModel(graphModel);
   YifanHuLayout firstLayout = new YifanHuLayout(null, new StepDisplacement(1f));
   ForceAtlasLayout secondLayout = new ForceAtlasLayout(null);

   AutoLayout.DynamicProperty adjustBySizeProperty = AutoLayout.createDynamicProperty(“Adjust by
   Sizes”, Boolean.TRUE, 0.1f);//True after 10% of layout time
   AutoLayout.DynamicProperty repulsionProperty = AutoLayout.createDynamicProperty(“Repulsion
   strength”, new Double(500.), 0f);//500 for the complete period

   autoLayout.addLayout(firstLayout, 0.5f);
   autoLayout.addLayout(secondLayout, 0.5f, new AutoLayout.DynamicProperty[]{adjustBySizeProperty,
   repulsionProperty});

   autoLayout.execute();
Statistics and metrics
How to execute a metric algorithm and get the result for each node. The algorithm write values in a column it
creates. It is also possible to get the statistics report, as in Gephi.



   //Get graph model and attribute model of current workspace
   GraphModel graphModel = Lookup.getDefault().lookup(GraphController.class).getModel();
   AttributeModel attributeModel = Lookup.getDefault().lookup(AttributeController.class).getModel();

   //Get Centrality
   GraphDistance distance = new GraphDistance();
   distance.setDirected(true);
   distance.execute(graphModel, attributeModel);

   //Get Centrality column created
   AttributeColumn col = attributeModel.getNodeTable().getColumn(GraphDistance.BETWEENNESS);

   //Iterate over values
   for (Node n : graph.getNodes()) {
     Double centrality = (Double)n.getNodeData().getAttributes().getValue(col.getIndex());
   }
Ranking - Color
Ranking can be used with any numerical column, including the degree. A transformer is applied to change
the color, the size, the label color or the label size of the node or the edge. An interpolator can be set to the
transformer to modify the interpolation. The ranking scales the data between 0 and 1.



   //Rank color by Degree
   RankingController rankingController = Lookup.getDefault().lookup(RankingController.class);
   Ranking degreeRanking = rankingController.getRankingModel().getRanking(Ranking.NODE_ELEMENT,
   Ranking.DEGREE_RANKING);
   AbstractColorTransformer colorTransformer = (AbstractColorTransformer) rankingController.getModel().
   getTransformer(Ranking.NODE_ELEMENT, Transformer.RENDERABLE_COLOR);

   colorTransformer.setColors(new Color[]{new Color(0xFEF0D9), new Color(0xB30000)});
   rankingController.transform(colorTransformer);
Ranking - Size
The result of the centrality algorithm is used here for the ranking. The metric is written in an AttributeColumn,
which is used to create the NodeRanking object.

The ranking is always applied in the current workspace.


   //Get Centrality
   GraphDistance distance = new GraphDistance();
   distance.setDirected(true);
   distance.execute(graphModel, attributeModel);

   //Rank size by centrality
   RankingController rc = Lookup.getDefault().lookup(RankingController.class);
   AttributeColumn col = attributeModel.getNodeTable().getColumn(GraphDistance.BETWEENNESS);

   Ranking centralityRanking = rc.getRankingModel().getRanking(Ranking.NODE_ELEMENT, col.getId());
   AbstractSizeTransformer sizeTransformer = (AbstractSizeTransformer) rankingController.getModel().
   getTransformer(Ranking.NODE_ELEMENT, Transformer.RENDERABLE_SIZE);
   sizeTransformer.setMinSize(3);
   sizeTransformer.setMaxSize(20);
   rankingController.transform(sizeTransformer);
Partition
Partition works with attribute column that have a set of different values. It colors nodes or edges with the
same value. The Modularity algorithm in Gephi is a community-detection algorithm which writes for each node
to which community it belongs. The partition object allows to retrieve all values and the array of nodes for
each of it.


   //Run modularity algorithm - community detection
   Modularity modularity = new Modularity();
   modularity.execute(graphModel, attributeModel);

   //Partition with ‘modularity_class’, just created by Modularity algorithm
   AttributeColumn modColumn = attributeModel.getNodeTable().getColumn(Modularity.MODULARITY_CLASS);
   Partition p = partitionController.buildPartition(modColumn, graph);

   System.out.println(p.getPartsCount() + “ partitions found”);

   NodeColorTransformer nodeColorTransformer = new NodeColorTransformer();
   nodeColorTransformer.randomizeColors(p);
   partitionController.transform(p, nodeColorTransformer);
Filter (1/4)
Shows how to create an execute a filter query. When a filter query is executed, it creates a new graph view,
which is a copy of the graph structure that went through the filter pipeline. Several filters can be chained by
setting sub-queries. A query is a tree where the root is the last executed filter.



   //Filter, remove degree < 10
   FilterController filterController = Lookup.getDefault().lookup(FilterController.class);
   DegreeRangeFilter degreeFilter = new DegreeRangeFilter();
   degreeFilter.setRange(new Range(10, Integer.MAX_VALUE));        //Remove nodes with degree < 10
   Query query = filterController.createQuery(degreeFilter);
   GraphView view = filterController.filter(query);
   graphModel.setVisibleView(view); //Set the filter result as the visible view



The graph from the graph view can be obtained from the GraphModel by calling:

   Graph graph = graphModel.getGraph(view);

or, if the view has been set as the visible view like above:

   Graph graph = graphModel.getGraphVisible(view);
Filter (2/4)
The filter here is a PartitionFilter, which is built from a Partition created from a column named ‘source’.




   //Filter, keep partition ‘Blogarama’. Build partition with ‘source’ column in the data
   PartitionController pc = Lookup.getDefault().lookup(PartitionController.class);
   Partition p = pc.buildPartition(attributeModel.getNodeTable().getColumn(“source”), graph);

   NodePartitionFilter partitionFilter = new NodePartitionFilter(p);
   partitionFilter.unselectAll();
   partitionFilter.addPart(p.getPartFromValue(“Blogarama”));

   Query query = filterController.createQuery(partitionFilter);
   GraphView view = filterController.filter(query);
   graphModel.setVisibleView(view); //Set the filter result as the visible view
Filter (3/4)
How to use the Ego filter. The depth can a number or Integer.MAX_VALUE for the connected component.




  //Ego filter
  EgoFilter egoFilter = new EgoFilter();
  egoFilter.setPattern(“obamablog.com”); //Regex accepted
  egoFilter.setDepth(1);
  Query queryEgo = filterController.createQuery(egoFilter);
  GraphView viewEgo = filterController.filter(queryEgo);
  graphModel.setVisibleView(viewEgo); //Set the filter result as the visible view
Filter (4/4)
It is possible to use Intersection and Union operators to create queries. Simply add other queries as sub-queries
of the operator.



   //Combine two filters with AND - Set query1 and query2 as sub-query of AND
   IntersectionOperator intersectionOperator = new IntersectionOperator();
   Query andQuery = filterController.createQuery(intersectionOperator);
   filterController.setSubQuery(andQuery, query1);
   filterController.setSubQuery(andQuery, query2);
   GraphView view = filterController.filter(andQuery);
   graphModel.setVisibleView(view); //Set the filter result as the visible view
Preview
Preview is the last step before export and allows display customization and aesthetics refinements. It works
with the current workspace. The example below shows how to change edge coloring mode, edge thickness and
label font size.

   //Preview
   PreviewModel model = Lookup.getDefault().lookup(PreviewController.class).getModel();
   model.getProperties().putValue(PreviewProperty.SHOW_NODE_LABELS, Boolean.TRUE);

   model.getProperties().putValue(PreviewProperty.EDGE_COLOR, new EdgeColor(Color.GRAY));
   model.getProperties().putValue(PreviewProperty.EDGE_THICKNESS, new Float(0.1f));
   model.getProperties().putValue(PreviewProperty.NODE_LABEL_FONT, model.getProperties().
   getFontValue(PreviewProperty.NODE_LABEL_FONT).deriveFont(8));
Export Graph File
Exports the current workspace to a file. For a simple export just call the exportFile() method with the right file
extension. For customizing the exporter, query it from the export controller and change settings.



   //Export full graph
   ExportController ec = Lookup.getDefault().lookup(ExportController.class);
   try {
     ec.exportFile(new File(“test-full.gexf”));
   } catch (IOException ex) {
     ex.printStackTrace();
     return;
   }

   //Export only visible graph
   GraphExporter exporter = (GraphExporter) ec.getExporter(“gexf”);        //Get GEXF exporter
   exporter.setExportVisible(true); //Only exports the visible (filtered) graph
   try {
     ec.exportFile(new File(“test-visible.gexf”), exporter);
   } catch (IOException ex) {
     ex.printStackTrace();
     return;
   }
Export PDF/SVG
The PDF, SVG and PNG exporters work with the settings made in Preview. As with all exporters, it is possible to
write the result in a Writer or OutputStream. In the example below the PDFExporter is found and configured.



   //Simple PDF export to a file
   ExportController ec = Lookup.getDefault().lookup(ExportController.class);
   try {
     ec.exportFile(new File(“simple.pdf”));
   } catch (IOException ex) {
     ex.printStackTrace();
     return;
   }

   //PDF Exporter config and export to Byte array
   PDFExporter pdfExporter = (PDFExporter) ec.getExporter(“pdf”);
   pdfExporter.setPageSize(PageSize.A0);
   ByteArrayOutputStream baos = new ByteArrayOutputStream();
   ec.exportStream(baos, pdfExporter);
   byte[] pdf = baos.toByteArray();
Conclusion
Share your ideas and find more help on the Gephi forum, the community is eager to help you get things done!

Please also consider the gephi-toolkit is a young project and remains imperfect. We hope this project helps all
developers to use network visualization and analytics in their project and build great systems.

We are looking for your help, join the network and become a contributor!

More Related Content

What's hot

『メタバースを活用した参加型教育』地域創生プラットフォーム
『メタバースを活用した参加型教育』地域創生プラットフォーム『メタバースを活用した参加型教育』地域創生プラットフォーム
『メタバースを活用した参加型教育』地域創生プラットフォーム
デジタル田園都市国家構想 応援団
 
なるほどわかった!App Service on Linux
なるほどわかった!App Service on Linuxなるほどわかった!App Service on Linux
なるほどわかった!App Service on Linux
Yasuaki Matsuda
 
Git 101: Git and GitHub for Beginners
Git 101: Git and GitHub for Beginners Git 101: Git and GitHub for Beginners
Git 101: Git and GitHub for Beginners
HubSpot
 
오픈소스GIS 개론 과정 - OpenLayers 기초
오픈소스GIS 개론 과정 - OpenLayers 기초오픈소스GIS 개론 과정 - OpenLayers 기초
오픈소스GIS 개론 과정 - OpenLayers 기초
HaNJiN Lee
 
PythonとQGISで簡単処理
PythonとQGISで簡単処理PythonとQGISで簡単処理
PythonとQGISで簡単処理
Kazutaka ishizaki
 
DataGridを自前実装する話
DataGridを自前実装する話DataGridを自前実装する話
DataGridを自前実装する話
terurou
 
QGIS를 활용한 공간분석 입문 ver.1.0
QGIS를 활용한 공간분석 입문 ver.1.0QGIS를 활용한 공간분석 입문 ver.1.0
QGIS를 활용한 공간분석 입문 ver.1.0
Byeong-Hyeok Yu
 
GeoPackageを使ってみた(おざき様)
GeoPackageを使ってみた(おざき様)GeoPackageを使ってみた(おざき様)
GeoPackageを使ってみた(おざき様)
OSgeo Japan
 
PyQGIS와 PyQt를 이용한 QGIS 기능 확장
PyQGIS와 PyQt를 이용한 QGIS 기능 확장PyQGIS와 PyQt를 이용한 QGIS 기능 확장
PyQGIS와 PyQt를 이용한 QGIS 기능 확장
MinPa Lee
 
Nodejs presentation
Nodejs presentationNodejs presentation
Nodejs presentation
Arvind Devaraj
 
第22回オープンデータトーク 地理データ形式のこれから
第22回オープンデータトーク 地理データ形式のこれから第22回オープンデータトーク 地理データ形式のこれから
第22回オープンデータトーク 地理データ形式のこれから
IWASAKI NOBUSUKE
 
Introduction git
Introduction gitIntroduction git
Introduction git
Dian Sigit Prastowo
 
点群を使いこなせ! 可視化なんて当たり前、xRと点群を組み合わせたUnityの世界 【Interact , Stipple】
点群を使いこなせ! 可視化なんて当たり前、xRと点群を組み合わせたUnityの世界 【Interact , Stipple】点群を使いこなせ! 可視化なんて当たり前、xRと点群を組み合わせたUnityの世界 【Interact , Stipple】
点群を使いこなせ! 可視化なんて当たり前、xRと点群を組み合わせたUnityの世界 【Interact , Stipple】
Unity Technologies Japan K.K.
 
LX 공간정보아카데미 PostGIS 강의자료
LX 공간정보아카데미 PostGIS 강의자료LX 공간정보아카데미 PostGIS 강의자료
LX 공간정보아카데미 PostGIS 강의자료
JungHwan Yun
 
PostGIS - National Education Center for GIS: Open Source GIS
PostGIS - National Education Center for GIS: Open Source GIS PostGIS - National Education Center for GIS: Open Source GIS
PostGIS - National Education Center for GIS: Open Source GIS
MinPa Lee
 
Foss4G Japan 2021 シェープファイルの真の後継規格 FlatGeobufの普及啓蒙活動
Foss4G Japan 2021 シェープファイルの真の後継規格 FlatGeobufの普及啓蒙活動Foss4G Japan 2021 シェープファイルの真の後継規格 FlatGeobufの普及啓蒙活動
Foss4G Japan 2021 シェープファイルの真の後継規格 FlatGeobufの普及啓蒙活動
Kanahiro Iguchi
 
Proj4를 이용한 좌표계 변환
Proj4를 이용한 좌표계 변환Proj4를 이용한 좌표계 변환
Proj4를 이용한 좌표계 변환BJ Jang
 
QGIS를 활용한 공간분석 입문(1일 6시간)
QGIS를 활용한 공간분석 입문(1일 6시간)QGIS를 활용한 공간분석 입문(1일 6시간)
QGIS를 활용한 공간분석 입문(1일 6시간)
Byeong-Hyeok Yu
 
Open dronemapハンズオン
Open dronemapハンズオンOpen dronemapハンズオン
Open dronemapハンズオン
Mizutani Takayuki
 
GitHub Presentation
GitHub PresentationGitHub Presentation
GitHub Presentation
BrianSchilder
 

What's hot (20)

『メタバースを活用した参加型教育』地域創生プラットフォーム
『メタバースを活用した参加型教育』地域創生プラットフォーム『メタバースを活用した参加型教育』地域創生プラットフォーム
『メタバースを活用した参加型教育』地域創生プラットフォーム
 
なるほどわかった!App Service on Linux
なるほどわかった!App Service on Linuxなるほどわかった!App Service on Linux
なるほどわかった!App Service on Linux
 
Git 101: Git and GitHub for Beginners
Git 101: Git and GitHub for Beginners Git 101: Git and GitHub for Beginners
Git 101: Git and GitHub for Beginners
 
오픈소스GIS 개론 과정 - OpenLayers 기초
오픈소스GIS 개론 과정 - OpenLayers 기초오픈소스GIS 개론 과정 - OpenLayers 기초
오픈소스GIS 개론 과정 - OpenLayers 기초
 
PythonとQGISで簡単処理
PythonとQGISで簡単処理PythonとQGISで簡単処理
PythonとQGISで簡単処理
 
DataGridを自前実装する話
DataGridを自前実装する話DataGridを自前実装する話
DataGridを自前実装する話
 
QGIS를 활용한 공간분석 입문 ver.1.0
QGIS를 활용한 공간분석 입문 ver.1.0QGIS를 활용한 공간분석 입문 ver.1.0
QGIS를 활용한 공간분석 입문 ver.1.0
 
GeoPackageを使ってみた(おざき様)
GeoPackageを使ってみた(おざき様)GeoPackageを使ってみた(おざき様)
GeoPackageを使ってみた(おざき様)
 
PyQGIS와 PyQt를 이용한 QGIS 기능 확장
PyQGIS와 PyQt를 이용한 QGIS 기능 확장PyQGIS와 PyQt를 이용한 QGIS 기능 확장
PyQGIS와 PyQt를 이용한 QGIS 기능 확장
 
Nodejs presentation
Nodejs presentationNodejs presentation
Nodejs presentation
 
第22回オープンデータトーク 地理データ形式のこれから
第22回オープンデータトーク 地理データ形式のこれから第22回オープンデータトーク 地理データ形式のこれから
第22回オープンデータトーク 地理データ形式のこれから
 
Introduction git
Introduction gitIntroduction git
Introduction git
 
点群を使いこなせ! 可視化なんて当たり前、xRと点群を組み合わせたUnityの世界 【Interact , Stipple】
点群を使いこなせ! 可視化なんて当たり前、xRと点群を組み合わせたUnityの世界 【Interact , Stipple】点群を使いこなせ! 可視化なんて当たり前、xRと点群を組み合わせたUnityの世界 【Interact , Stipple】
点群を使いこなせ! 可視化なんて当たり前、xRと点群を組み合わせたUnityの世界 【Interact , Stipple】
 
LX 공간정보아카데미 PostGIS 강의자료
LX 공간정보아카데미 PostGIS 강의자료LX 공간정보아카데미 PostGIS 강의자료
LX 공간정보아카데미 PostGIS 강의자료
 
PostGIS - National Education Center for GIS: Open Source GIS
PostGIS - National Education Center for GIS: Open Source GIS PostGIS - National Education Center for GIS: Open Source GIS
PostGIS - National Education Center for GIS: Open Source GIS
 
Foss4G Japan 2021 シェープファイルの真の後継規格 FlatGeobufの普及啓蒙活動
Foss4G Japan 2021 シェープファイルの真の後継規格 FlatGeobufの普及啓蒙活動Foss4G Japan 2021 シェープファイルの真の後継規格 FlatGeobufの普及啓蒙活動
Foss4G Japan 2021 シェープファイルの真の後継規格 FlatGeobufの普及啓蒙活動
 
Proj4를 이용한 좌표계 변환
Proj4를 이용한 좌표계 변환Proj4를 이용한 좌표계 변환
Proj4를 이용한 좌표계 변환
 
QGIS를 활용한 공간분석 입문(1일 6시간)
QGIS를 활용한 공간분석 입문(1일 6시간)QGIS를 활용한 공간분석 입문(1일 6시간)
QGIS를 활용한 공간분석 입문(1일 6시간)
 
Open dronemapハンズオン
Open dronemapハンズオンOpen dronemapハンズオン
Open dronemapハンズオン
 
GitHub Presentation
GitHub PresentationGitHub Presentation
GitHub Presentation
 

Similar to Gephi Toolkit Tutorial

Java design patterns
Java design patternsJava design patterns
Java design patterns
Shawn Brito
 
Sharper Better Faster Dagger ‡ - Droidcon SF
Sharper Better Faster Dagger ‡ - Droidcon SFSharper Better Faster Dagger ‡ - Droidcon SF
Sharper Better Faster Dagger ‡ - Droidcon SF
Pierre-Yves Ricau
 
Pyramid Framework
Pyramid FrameworkPyramid Framework
Pyramid Framework
Anatoly Bubenkov
 
Adding a modern twist to legacy web applications
Adding a modern twist to legacy web applicationsAdding a modern twist to legacy web applications
Adding a modern twist to legacy web applications
Jeff Durta
 
WebNet Conference 2012 - Designing complex applications using html5 and knock...
WebNet Conference 2012 - Designing complex applications using html5 and knock...WebNet Conference 2012 - Designing complex applications using html5 and knock...
WebNet Conference 2012 - Designing complex applications using html5 and knock...
Fabio Franzini
 
2. Design patterns. part #2
2. Design patterns. part #22. Design patterns. part #2
2. Design patterns. part #2
Leonid Maslov
 
Introduction to Griffon
Introduction to GriffonIntroduction to Griffon
Introduction to Griffon
James Williams
 
Jetpack, with new features in 2021 GDG Georgetown IO Extended
Jetpack, with new features in 2021 GDG Georgetown IO ExtendedJetpack, with new features in 2021 GDG Georgetown IO Extended
Jetpack, with new features in 2021 GDG Georgetown IO Extended
Toru Wonyoung Choi
 
Griffon Presentation
Griffon PresentationGriffon Presentation
Griffon Presentation
Kelly Robinson
 
JavaScript Growing Up
JavaScript Growing UpJavaScript Growing Up
JavaScript Growing Up
David Padbury
 
Porting legacy apps to Griffon
Porting legacy apps to GriffonPorting legacy apps to Griffon
Porting legacy apps to Griffon
James Williams
 
UNO based ODF Toolkit API
UNO based ODF Toolkit APIUNO based ODF Toolkit API
UNO based ODF Toolkit API
Alexandro Colorado
 
Ae31225230
Ae31225230Ae31225230
Ae31225230
IJERA Editor
 
Design patterns
Design patternsDesign patterns
Design patterns
Anas Alpure
 
using Mithril.js + postgREST to build and consume API's
using Mithril.js + postgREST to build and consume API'susing Mithril.js + postgREST to build and consume API's
using Mithril.js + postgREST to build and consume API's
Antônio Roberto Silva
 
Adding a modern twist to legacy web applications
Adding a modern twist to legacy web applicationsAdding a modern twist to legacy web applications
Adding a modern twist to legacy web applications
Jeff Durta
 
Gephi Plugin Developer Workshop
Gephi Plugin Developer WorkshopGephi Plugin Developer Workshop
Gephi Plugin Developer Workshop
Gephi Consortium
 
Javascript Design Patterns
Javascript Design PatternsJavascript Design Patterns
Javascript Design Patterns
Subramanyan Murali
 
把鐵路開進視窗裡
把鐵路開進視窗裡把鐵路開進視窗裡
把鐵路開進視窗裡
Wei Jen Lu
 
Design Patterns - Part 2 of 2
Design Patterns - Part 2 of 2Design Patterns - Part 2 of 2
Design Patterns - Part 2 of 2
Savio Sebastian
 

Similar to Gephi Toolkit Tutorial (20)

Java design patterns
Java design patternsJava design patterns
Java design patterns
 
Sharper Better Faster Dagger ‡ - Droidcon SF
Sharper Better Faster Dagger ‡ - Droidcon SFSharper Better Faster Dagger ‡ - Droidcon SF
Sharper Better Faster Dagger ‡ - Droidcon SF
 
Pyramid Framework
Pyramid FrameworkPyramid Framework
Pyramid Framework
 
Adding a modern twist to legacy web applications
Adding a modern twist to legacy web applicationsAdding a modern twist to legacy web applications
Adding a modern twist to legacy web applications
 
WebNet Conference 2012 - Designing complex applications using html5 and knock...
WebNet Conference 2012 - Designing complex applications using html5 and knock...WebNet Conference 2012 - Designing complex applications using html5 and knock...
WebNet Conference 2012 - Designing complex applications using html5 and knock...
 
2. Design patterns. part #2
2. Design patterns. part #22. Design patterns. part #2
2. Design patterns. part #2
 
Introduction to Griffon
Introduction to GriffonIntroduction to Griffon
Introduction to Griffon
 
Jetpack, with new features in 2021 GDG Georgetown IO Extended
Jetpack, with new features in 2021 GDG Georgetown IO ExtendedJetpack, with new features in 2021 GDG Georgetown IO Extended
Jetpack, with new features in 2021 GDG Georgetown IO Extended
 
Griffon Presentation
Griffon PresentationGriffon Presentation
Griffon Presentation
 
JavaScript Growing Up
JavaScript Growing UpJavaScript Growing Up
JavaScript Growing Up
 
Porting legacy apps to Griffon
Porting legacy apps to GriffonPorting legacy apps to Griffon
Porting legacy apps to Griffon
 
UNO based ODF Toolkit API
UNO based ODF Toolkit APIUNO based ODF Toolkit API
UNO based ODF Toolkit API
 
Ae31225230
Ae31225230Ae31225230
Ae31225230
 
Design patterns
Design patternsDesign patterns
Design patterns
 
using Mithril.js + postgREST to build and consume API's
using Mithril.js + postgREST to build and consume API'susing Mithril.js + postgREST to build and consume API's
using Mithril.js + postgREST to build and consume API's
 
Adding a modern twist to legacy web applications
Adding a modern twist to legacy web applicationsAdding a modern twist to legacy web applications
Adding a modern twist to legacy web applications
 
Gephi Plugin Developer Workshop
Gephi Plugin Developer WorkshopGephi Plugin Developer Workshop
Gephi Plugin Developer Workshop
 
Javascript Design Patterns
Javascript Design PatternsJavascript Design Patterns
Javascript Design Patterns
 
把鐵路開進視窗裡
把鐵路開進視窗裡把鐵路開進視窗裡
把鐵路開進視窗裡
 
Design Patterns - Part 2 of 2
Design Patterns - Part 2 of 2Design Patterns - Part 2 of 2
Design Patterns - Part 2 of 2
 

Recently uploaded

GNSS spoofing via SDR (Criptored Talks 2024)
GNSS spoofing via SDR (Criptored Talks 2024)GNSS spoofing via SDR (Criptored Talks 2024)
GNSS spoofing via SDR (Criptored Talks 2024)
Javier Junquera
 
WeTestAthens: Postman's AI & Automation Techniques
WeTestAthens: Postman's AI & Automation TechniquesWeTestAthens: Postman's AI & Automation Techniques
WeTestAthens: Postman's AI & Automation Techniques
Postman
 
“Temporal Event Neural Networks: A More Efficient Alternative to the Transfor...
“Temporal Event Neural Networks: A More Efficient Alternative to the Transfor...“Temporal Event Neural Networks: A More Efficient Alternative to the Transfor...
“Temporal Event Neural Networks: A More Efficient Alternative to the Transfor...
Edge AI and Vision Alliance
 
Deep Dive: AI-Powered Marketing to Get More Leads and Customers with HyperGro...
Deep Dive: AI-Powered Marketing to Get More Leads and Customers with HyperGro...Deep Dive: AI-Powered Marketing to Get More Leads and Customers with HyperGro...
Deep Dive: AI-Powered Marketing to Get More Leads and Customers with HyperGro...
saastr
 
Programming Foundation Models with DSPy - Meetup Slides
Programming Foundation Models with DSPy - Meetup SlidesProgramming Foundation Models with DSPy - Meetup Slides
Programming Foundation Models with DSPy - Meetup Slides
Zilliz
 
Skybuffer AI: Advanced Conversational and Generative AI Solution on SAP Busin...
Skybuffer AI: Advanced Conversational and Generative AI Solution on SAP Busin...Skybuffer AI: Advanced Conversational and Generative AI Solution on SAP Busin...
Skybuffer AI: Advanced Conversational and Generative AI Solution on SAP Busin...
Tatiana Kojar
 
Digital Banking in the Cloud: How Citizens Bank Unlocked Their Mainframe
Digital Banking in the Cloud: How Citizens Bank Unlocked Their MainframeDigital Banking in the Cloud: How Citizens Bank Unlocked Their Mainframe
Digital Banking in the Cloud: How Citizens Bank Unlocked Their Mainframe
Precisely
 
Azure API Management to expose backend services securely
Azure API Management to expose backend services securelyAzure API Management to expose backend services securely
Azure API Management to expose backend services securely
Dinusha Kumarasiri
 
HCL Notes and Domino License Cost Reduction in the World of DLAU
HCL Notes and Domino License Cost Reduction in the World of DLAUHCL Notes and Domino License Cost Reduction in the World of DLAU
HCL Notes and Domino License Cost Reduction in the World of DLAU
panagenda
 
5th LF Energy Power Grid Model Meet-up Slides
5th LF Energy Power Grid Model Meet-up Slides5th LF Energy Power Grid Model Meet-up Slides
5th LF Energy Power Grid Model Meet-up Slides
DanBrown980551
 
FREE A4 Cyber Security Awareness Posters-Social Engineering part 3
FREE A4 Cyber Security Awareness  Posters-Social Engineering part 3FREE A4 Cyber Security Awareness  Posters-Social Engineering part 3
FREE A4 Cyber Security Awareness Posters-Social Engineering part 3
Data Hops
 
How to Interpret Trends in the Kalyan Rajdhani Mix Chart.pdf
How to Interpret Trends in the Kalyan Rajdhani Mix Chart.pdfHow to Interpret Trends in the Kalyan Rajdhani Mix Chart.pdf
How to Interpret Trends in the Kalyan Rajdhani Mix Chart.pdf
Chart Kalyan
 
Overcoming the PLG Trap: Lessons from Canva's Head of Sales & Head of EMEA Da...
Overcoming the PLG Trap: Lessons from Canva's Head of Sales & Head of EMEA Da...Overcoming the PLG Trap: Lessons from Canva's Head of Sales & Head of EMEA Da...
Overcoming the PLG Trap: Lessons from Canva's Head of Sales & Head of EMEA Da...
saastr
 
Fueling AI with Great Data with Airbyte Webinar
Fueling AI with Great Data with Airbyte WebinarFueling AI with Great Data with Airbyte Webinar
Fueling AI with Great Data with Airbyte Webinar
Zilliz
 
Monitoring and Managing Anomaly Detection on OpenShift.pdf
Monitoring and Managing Anomaly Detection on OpenShift.pdfMonitoring and Managing Anomaly Detection on OpenShift.pdf
Monitoring and Managing Anomaly Detection on OpenShift.pdf
Tosin Akinosho
 
Let's Integrate MuleSoft RPA, COMPOSER, APM with AWS IDP along with Slack
Let's Integrate MuleSoft RPA, COMPOSER, APM with AWS IDP along with SlackLet's Integrate MuleSoft RPA, COMPOSER, APM with AWS IDP along with Slack
Let's Integrate MuleSoft RPA, COMPOSER, APM with AWS IDP along with Slack
shyamraj55
 
leewayhertz.com-AI in predictive maintenance Use cases technologies benefits ...
leewayhertz.com-AI in predictive maintenance Use cases technologies benefits ...leewayhertz.com-AI in predictive maintenance Use cases technologies benefits ...
leewayhertz.com-AI in predictive maintenance Use cases technologies benefits ...
alexjohnson7307
 
Driving Business Innovation: Latest Generative AI Advancements & Success Story
Driving Business Innovation: Latest Generative AI Advancements & Success StoryDriving Business Innovation: Latest Generative AI Advancements & Success Story
Driving Business Innovation: Latest Generative AI Advancements & Success Story
Safe Software
 
Choosing The Best AWS Service For Your Website + API.pptx
Choosing The Best AWS Service For Your Website + API.pptxChoosing The Best AWS Service For Your Website + API.pptx
Choosing The Best AWS Service For Your Website + API.pptx
Brandon Minnick, MBA
 
June Patch Tuesday
June Patch TuesdayJune Patch Tuesday
June Patch Tuesday
Ivanti
 

Recently uploaded (20)

GNSS spoofing via SDR (Criptored Talks 2024)
GNSS spoofing via SDR (Criptored Talks 2024)GNSS spoofing via SDR (Criptored Talks 2024)
GNSS spoofing via SDR (Criptored Talks 2024)
 
WeTestAthens: Postman's AI & Automation Techniques
WeTestAthens: Postman's AI & Automation TechniquesWeTestAthens: Postman's AI & Automation Techniques
WeTestAthens: Postman's AI & Automation Techniques
 
“Temporal Event Neural Networks: A More Efficient Alternative to the Transfor...
“Temporal Event Neural Networks: A More Efficient Alternative to the Transfor...“Temporal Event Neural Networks: A More Efficient Alternative to the Transfor...
“Temporal Event Neural Networks: A More Efficient Alternative to the Transfor...
 
Deep Dive: AI-Powered Marketing to Get More Leads and Customers with HyperGro...
Deep Dive: AI-Powered Marketing to Get More Leads and Customers with HyperGro...Deep Dive: AI-Powered Marketing to Get More Leads and Customers with HyperGro...
Deep Dive: AI-Powered Marketing to Get More Leads and Customers with HyperGro...
 
Programming Foundation Models with DSPy - Meetup Slides
Programming Foundation Models with DSPy - Meetup SlidesProgramming Foundation Models with DSPy - Meetup Slides
Programming Foundation Models with DSPy - Meetup Slides
 
Skybuffer AI: Advanced Conversational and Generative AI Solution on SAP Busin...
Skybuffer AI: Advanced Conversational and Generative AI Solution on SAP Busin...Skybuffer AI: Advanced Conversational and Generative AI Solution on SAP Busin...
Skybuffer AI: Advanced Conversational and Generative AI Solution on SAP Busin...
 
Digital Banking in the Cloud: How Citizens Bank Unlocked Their Mainframe
Digital Banking in the Cloud: How Citizens Bank Unlocked Their MainframeDigital Banking in the Cloud: How Citizens Bank Unlocked Their Mainframe
Digital Banking in the Cloud: How Citizens Bank Unlocked Their Mainframe
 
Azure API Management to expose backend services securely
Azure API Management to expose backend services securelyAzure API Management to expose backend services securely
Azure API Management to expose backend services securely
 
HCL Notes and Domino License Cost Reduction in the World of DLAU
HCL Notes and Domino License Cost Reduction in the World of DLAUHCL Notes and Domino License Cost Reduction in the World of DLAU
HCL Notes and Domino License Cost Reduction in the World of DLAU
 
5th LF Energy Power Grid Model Meet-up Slides
5th LF Energy Power Grid Model Meet-up Slides5th LF Energy Power Grid Model Meet-up Slides
5th LF Energy Power Grid Model Meet-up Slides
 
FREE A4 Cyber Security Awareness Posters-Social Engineering part 3
FREE A4 Cyber Security Awareness  Posters-Social Engineering part 3FREE A4 Cyber Security Awareness  Posters-Social Engineering part 3
FREE A4 Cyber Security Awareness Posters-Social Engineering part 3
 
How to Interpret Trends in the Kalyan Rajdhani Mix Chart.pdf
How to Interpret Trends in the Kalyan Rajdhani Mix Chart.pdfHow to Interpret Trends in the Kalyan Rajdhani Mix Chart.pdf
How to Interpret Trends in the Kalyan Rajdhani Mix Chart.pdf
 
Overcoming the PLG Trap: Lessons from Canva's Head of Sales & Head of EMEA Da...
Overcoming the PLG Trap: Lessons from Canva's Head of Sales & Head of EMEA Da...Overcoming the PLG Trap: Lessons from Canva's Head of Sales & Head of EMEA Da...
Overcoming the PLG Trap: Lessons from Canva's Head of Sales & Head of EMEA Da...
 
Fueling AI with Great Data with Airbyte Webinar
Fueling AI with Great Data with Airbyte WebinarFueling AI with Great Data with Airbyte Webinar
Fueling AI with Great Data with Airbyte Webinar
 
Monitoring and Managing Anomaly Detection on OpenShift.pdf
Monitoring and Managing Anomaly Detection on OpenShift.pdfMonitoring and Managing Anomaly Detection on OpenShift.pdf
Monitoring and Managing Anomaly Detection on OpenShift.pdf
 
Let's Integrate MuleSoft RPA, COMPOSER, APM with AWS IDP along with Slack
Let's Integrate MuleSoft RPA, COMPOSER, APM with AWS IDP along with SlackLet's Integrate MuleSoft RPA, COMPOSER, APM with AWS IDP along with Slack
Let's Integrate MuleSoft RPA, COMPOSER, APM with AWS IDP along with Slack
 
leewayhertz.com-AI in predictive maintenance Use cases technologies benefits ...
leewayhertz.com-AI in predictive maintenance Use cases technologies benefits ...leewayhertz.com-AI in predictive maintenance Use cases technologies benefits ...
leewayhertz.com-AI in predictive maintenance Use cases technologies benefits ...
 
Driving Business Innovation: Latest Generative AI Advancements & Success Story
Driving Business Innovation: Latest Generative AI Advancements & Success StoryDriving Business Innovation: Latest Generative AI Advancements & Success Story
Driving Business Innovation: Latest Generative AI Advancements & Success Story
 
Choosing The Best AWS Service For Your Website + API.pptx
Choosing The Best AWS Service For Your Website + API.pptxChoosing The Best AWS Service For Your Website + API.pptx
Choosing The Best AWS Service For Your Website + API.pptx
 
June Patch Tuesday
June Patch TuesdayJune Patch Tuesday
June Patch Tuesday
 

Gephi Toolkit Tutorial

  • 1. Gephi Toolkit Tutorial The Gephi Toolkit project package essential modules (Graph, Layout, Filters, IO...) in a standard Java library, which any Java project can use for getting things done. The toolkit is just a single JAR that anyone could reuse in a Java program. This tutorial aims to introduce the project, show possibilities and start write some code. Get Gephi Toolkit The content of this tutorial, and more, can be found in the toolkit-demos archive. Last updated October 16th, 2011
  • 2. Introduction Gephi toolkit is a way to reuse Gephi features with scripts. It has the richness of Gephi features and the flexibility of a library. Gephi is designed in a modular way: • Splitted into different modules • For instance, a module for the graph structure, a module for layout, a module for filter, ... • Business modules are separated from UI modules • Core modules can be extracted, no extra dependency The toolkit wraps core modules, without user interaces in a single JAR library. There is no additionnal code in Gephi to allow this. The desktop application and the tookit relies exactly on the same modules.
  • 3. Use-cases Toolkit possible use-case: * Create a layout program Receive a GEXF file, layout it, and return the resulting GEXF file. * Complete chain From an imput graph file (DOT, GML, GEXF, ...) to the resulting PDF. * Java applet Use Gephi modules to store, filter,layout and build a new visualization applet on top of it. * Servlet Create graph snippets images (PNG) automatically in a servlet.
  • 4. Find Toolkit Documentation Toolkit Portal on Gephi Wiki Toolkit Javadoc References Toolkit-demos, download sources
  • 5. Create Project A project needs to be created for using the toolkit features. Creating a new project also creates a workspace. Workspaces are the container for all data. A project can have several workspaces, independent from each other. The workspace is often asked by modules, so you need to create one at startup. //Init a project - and therefore a workspace ProjectController pc = Lookup.getDefault().lookup(ProjectController.class); pc.newProject(); Workspace workspace = pc.getCurrentWorkspace(); What is Lookup ? Lookup is a very useful way to retrieve services and find instances in a modular application like Gephi. Controllers are singletons and can be found by looking into the general Lookup: Lookup.getDefault(). So Lookup is just a container, where modules put objects in it. Other modules get these objects from their class name.
  • 6. Import Graph File Importing data from files supported by Gephi.The import is done in two steps. First, all data are put in a Container, which is separated from the main data structure. The second steps is “processing”, when data in the container are appended to the graph structure and attributes. The API also allows to import data from Reader and InputStream. //Import file ImportController importController = Lookup.getDefault().lookup(ImportController.class); Container container; try { File file = new File(getClass().getResource(“/org/gephi/toolkit/demos/resources/test.gexf”).toURI()); container = importController.importFile(file); container.getLoader().setEdgeDefault(EdgeDefault.DIRECTED); //Force DIRECTED container.setAllowAutoNode(false); //Don’t create missing nodes } catch (Exception ex) { ex.printStackTrace(); return; } //Append imported data to GraphAPI importController.process(container, new DefaultProcessor(), workspace);
  • 7. Manipulate Graph API (1/2) The Graph API’s role is to store and serve the graph structure. Let’s see how to create a graph programatically. //Get a graph model - it exists because we have a workspace GraphModel graphModel = Lookup.getDefault().lookup(GraphController.class).getModel(); //Create two nodes Node n0 = graphModel.factory().newNode(“n0”); n0.getNodeData().setLabel(“Node 0”); Node n1 = graphModel.factory().newNode(“n1”); n1.getNodeData().setLabel(“Node 1”); //Create an edge - directed and weight 1 Edge e1 = graphModel.factory().newEdge(n1, n0, 1f, true); //Append as a Directed Graph DirectedGraph directedGraph = graphModel.getDirectedGraph(); directedGraph.addNode(n0); directedGraph.addNode(n1); directedGraph.addEdge(e1);
  • 8. Manipulate Graph API (2/2) Quick overview of Graph API’s possibilities. //Count nodes and edges System.out.println(“Nodes: “+directedGraph.getNodeCount()+” Edges: “+directedGraph.getEdgeCount()); //Iterate over nodes for(Node n : directedGraph.getNodes()) { Node[] neighbors = directedGraph.getNeighbors(n).toArray(); System.out.println(n.getNodeData().getLabel()+” has “+neighbors.length+” neighbors”); } //Find node by id Node node2 = directedGraph.getNode(“n2”); //Modify the graph while reading //Due to locking, you need to use toArray() on Iterable to be able to modify the graph in a read loop for(Node n : directedGraph.getNodes().toArray()) { directedGraph.removeNode(n); }
  • 9. Import from RDBMS The database format must be “Edge List”, basically a table for nodes and a table for edges. To be found by the importer, you need to have following columns: ID and LABEL for nodes and SOURCE, TARGET and WEIGHT for edges. Any other column will be imported as attributes. //Import database ImportController importController = Lookup.getDefault().lookup(ImportController.class); EdgeListDatabaseImpl db = new EdgeListDatabaseImpl(); db.setDBName(“test”); db.setHost(“localhost”); db.setUsername(“root”); db.setPasswd(“”); db.setSQLDriver(new MySQLDriver()); //db.setSQLDriver(new PostgreSQLDriver()); //db.setSQLDriver(new SQLServerDriver()); db.setPort(3306); db.setNodeQuery(“SELECT nodes.id AS id, nodes.label AS label, nodes.url FROM nodes”); db.setEdgeQuery(“SELECT edges.source AS source, edges.target AS target, edges.name AS label, edges. weight AS weight FROM edges”); Container container = importController.importDatabase(db, new ImporterEdgeList()); //Append imported data to GraphAPI importController.process(container, new DefaultProcessor(), workspace);
  • 10. Layout - Manual Layouts are iterative algorithms that change nodes’ position at each pass. Each layout algorithm needs to get a graph model to be able to query the network. Parameters can be set directly to the layout. Use ForceAtlas, FruchtermanReingold or LabelAdjust algorithm in a similar way. //Get graph model of current workspace GraphModel graphModel = Lookup.getDefault().lookup(GraphController.class).getModel(); //Run YifanHuLayout for 100 passes - The layout always takes the current visible view YifanHuLayout layout = new YifanHuLayout(null, new StepDisplacement(1f)); layout.setGraphModel(graphModel); layout.resetPropertiesValues(); layout.setOptimalDistance(200f); layout.initAlgo(); for (int i = 0; i < 100 && layout.canAlgo(); i++) { layout.goAlgo(); }
  • 11. Layout - Auto With AutoLayout class, you can set a layout duration, and an execution ratio for several layouts. For instance you set 0.8 for a Yifan Hu algorithm and 0.2 for Label Adjust. If execution time is 100 seconds, the first algorithm runs for 80 seconds and the second for 20 seconds. It also allows to change property values dynamically, at a certain ratio or interpolated if values are numerical. //Layout for 1 minute AutoLayout autoLayout = new AutoLayout(1, TimeUnit.MINUTES); autoLayout.setGraphModel(graphModel); YifanHuLayout firstLayout = new YifanHuLayout(null, new StepDisplacement(1f)); ForceAtlasLayout secondLayout = new ForceAtlasLayout(null); AutoLayout.DynamicProperty adjustBySizeProperty = AutoLayout.createDynamicProperty(“Adjust by Sizes”, Boolean.TRUE, 0.1f);//True after 10% of layout time AutoLayout.DynamicProperty repulsionProperty = AutoLayout.createDynamicProperty(“Repulsion strength”, new Double(500.), 0f);//500 for the complete period autoLayout.addLayout(firstLayout, 0.5f); autoLayout.addLayout(secondLayout, 0.5f, new AutoLayout.DynamicProperty[]{adjustBySizeProperty, repulsionProperty}); autoLayout.execute();
  • 12. Statistics and metrics How to execute a metric algorithm and get the result for each node. The algorithm write values in a column it creates. It is also possible to get the statistics report, as in Gephi. //Get graph model and attribute model of current workspace GraphModel graphModel = Lookup.getDefault().lookup(GraphController.class).getModel(); AttributeModel attributeModel = Lookup.getDefault().lookup(AttributeController.class).getModel(); //Get Centrality GraphDistance distance = new GraphDistance(); distance.setDirected(true); distance.execute(graphModel, attributeModel); //Get Centrality column created AttributeColumn col = attributeModel.getNodeTable().getColumn(GraphDistance.BETWEENNESS); //Iterate over values for (Node n : graph.getNodes()) { Double centrality = (Double)n.getNodeData().getAttributes().getValue(col.getIndex()); }
  • 13. Ranking - Color Ranking can be used with any numerical column, including the degree. A transformer is applied to change the color, the size, the label color or the label size of the node or the edge. An interpolator can be set to the transformer to modify the interpolation. The ranking scales the data between 0 and 1. //Rank color by Degree RankingController rankingController = Lookup.getDefault().lookup(RankingController.class); Ranking degreeRanking = rankingController.getRankingModel().getRanking(Ranking.NODE_ELEMENT, Ranking.DEGREE_RANKING); AbstractColorTransformer colorTransformer = (AbstractColorTransformer) rankingController.getModel(). getTransformer(Ranking.NODE_ELEMENT, Transformer.RENDERABLE_COLOR); colorTransformer.setColors(new Color[]{new Color(0xFEF0D9), new Color(0xB30000)}); rankingController.transform(colorTransformer);
  • 14. Ranking - Size The result of the centrality algorithm is used here for the ranking. The metric is written in an AttributeColumn, which is used to create the NodeRanking object. The ranking is always applied in the current workspace. //Get Centrality GraphDistance distance = new GraphDistance(); distance.setDirected(true); distance.execute(graphModel, attributeModel); //Rank size by centrality RankingController rc = Lookup.getDefault().lookup(RankingController.class); AttributeColumn col = attributeModel.getNodeTable().getColumn(GraphDistance.BETWEENNESS); Ranking centralityRanking = rc.getRankingModel().getRanking(Ranking.NODE_ELEMENT, col.getId()); AbstractSizeTransformer sizeTransformer = (AbstractSizeTransformer) rankingController.getModel(). getTransformer(Ranking.NODE_ELEMENT, Transformer.RENDERABLE_SIZE); sizeTransformer.setMinSize(3); sizeTransformer.setMaxSize(20); rankingController.transform(sizeTransformer);
  • 15. Partition Partition works with attribute column that have a set of different values. It colors nodes or edges with the same value. The Modularity algorithm in Gephi is a community-detection algorithm which writes for each node to which community it belongs. The partition object allows to retrieve all values and the array of nodes for each of it. //Run modularity algorithm - community detection Modularity modularity = new Modularity(); modularity.execute(graphModel, attributeModel); //Partition with ‘modularity_class’, just created by Modularity algorithm AttributeColumn modColumn = attributeModel.getNodeTable().getColumn(Modularity.MODULARITY_CLASS); Partition p = partitionController.buildPartition(modColumn, graph); System.out.println(p.getPartsCount() + “ partitions found”); NodeColorTransformer nodeColorTransformer = new NodeColorTransformer(); nodeColorTransformer.randomizeColors(p); partitionController.transform(p, nodeColorTransformer);
  • 16. Filter (1/4) Shows how to create an execute a filter query. When a filter query is executed, it creates a new graph view, which is a copy of the graph structure that went through the filter pipeline. Several filters can be chained by setting sub-queries. A query is a tree where the root is the last executed filter. //Filter, remove degree < 10 FilterController filterController = Lookup.getDefault().lookup(FilterController.class); DegreeRangeFilter degreeFilter = new DegreeRangeFilter(); degreeFilter.setRange(new Range(10, Integer.MAX_VALUE)); //Remove nodes with degree < 10 Query query = filterController.createQuery(degreeFilter); GraphView view = filterController.filter(query); graphModel.setVisibleView(view); //Set the filter result as the visible view The graph from the graph view can be obtained from the GraphModel by calling: Graph graph = graphModel.getGraph(view); or, if the view has been set as the visible view like above: Graph graph = graphModel.getGraphVisible(view);
  • 17. Filter (2/4) The filter here is a PartitionFilter, which is built from a Partition created from a column named ‘source’. //Filter, keep partition ‘Blogarama’. Build partition with ‘source’ column in the data PartitionController pc = Lookup.getDefault().lookup(PartitionController.class); Partition p = pc.buildPartition(attributeModel.getNodeTable().getColumn(“source”), graph); NodePartitionFilter partitionFilter = new NodePartitionFilter(p); partitionFilter.unselectAll(); partitionFilter.addPart(p.getPartFromValue(“Blogarama”)); Query query = filterController.createQuery(partitionFilter); GraphView view = filterController.filter(query); graphModel.setVisibleView(view); //Set the filter result as the visible view
  • 18. Filter (3/4) How to use the Ego filter. The depth can a number or Integer.MAX_VALUE for the connected component. //Ego filter EgoFilter egoFilter = new EgoFilter(); egoFilter.setPattern(“obamablog.com”); //Regex accepted egoFilter.setDepth(1); Query queryEgo = filterController.createQuery(egoFilter); GraphView viewEgo = filterController.filter(queryEgo); graphModel.setVisibleView(viewEgo); //Set the filter result as the visible view
  • 19. Filter (4/4) It is possible to use Intersection and Union operators to create queries. Simply add other queries as sub-queries of the operator. //Combine two filters with AND - Set query1 and query2 as sub-query of AND IntersectionOperator intersectionOperator = new IntersectionOperator(); Query andQuery = filterController.createQuery(intersectionOperator); filterController.setSubQuery(andQuery, query1); filterController.setSubQuery(andQuery, query2); GraphView view = filterController.filter(andQuery); graphModel.setVisibleView(view); //Set the filter result as the visible view
  • 20. Preview Preview is the last step before export and allows display customization and aesthetics refinements. It works with the current workspace. The example below shows how to change edge coloring mode, edge thickness and label font size. //Preview PreviewModel model = Lookup.getDefault().lookup(PreviewController.class).getModel(); model.getProperties().putValue(PreviewProperty.SHOW_NODE_LABELS, Boolean.TRUE); model.getProperties().putValue(PreviewProperty.EDGE_COLOR, new EdgeColor(Color.GRAY)); model.getProperties().putValue(PreviewProperty.EDGE_THICKNESS, new Float(0.1f)); model.getProperties().putValue(PreviewProperty.NODE_LABEL_FONT, model.getProperties(). getFontValue(PreviewProperty.NODE_LABEL_FONT).deriveFont(8));
  • 21. Export Graph File Exports the current workspace to a file. For a simple export just call the exportFile() method with the right file extension. For customizing the exporter, query it from the export controller and change settings. //Export full graph ExportController ec = Lookup.getDefault().lookup(ExportController.class); try { ec.exportFile(new File(“test-full.gexf”)); } catch (IOException ex) { ex.printStackTrace(); return; } //Export only visible graph GraphExporter exporter = (GraphExporter) ec.getExporter(“gexf”); //Get GEXF exporter exporter.setExportVisible(true); //Only exports the visible (filtered) graph try { ec.exportFile(new File(“test-visible.gexf”), exporter); } catch (IOException ex) { ex.printStackTrace(); return; }
  • 22. Export PDF/SVG The PDF, SVG and PNG exporters work with the settings made in Preview. As with all exporters, it is possible to write the result in a Writer or OutputStream. In the example below the PDFExporter is found and configured. //Simple PDF export to a file ExportController ec = Lookup.getDefault().lookup(ExportController.class); try { ec.exportFile(new File(“simple.pdf”)); } catch (IOException ex) { ex.printStackTrace(); return; } //PDF Exporter config and export to Byte array PDFExporter pdfExporter = (PDFExporter) ec.getExporter(“pdf”); pdfExporter.setPageSize(PageSize.A0); ByteArrayOutputStream baos = new ByteArrayOutputStream(); ec.exportStream(baos, pdfExporter); byte[] pdf = baos.toByteArray();
  • 23. Conclusion Share your ideas and find more help on the Gephi forum, the community is eager to help you get things done! Please also consider the gephi-toolkit is a young project and remains imperfect. We hope this project helps all developers to use network visualization and analytics in their project and build great systems. We are looking for your help, join the network and become a contributor!