{"id":36427371,"url":"https://github.com/fanavarro/graphlib","last_synced_at":"2026-01-11T18:04:07.148Z","repository":{"id":52998905,"uuid":"231583185","full_name":"fanavarro/graphlib","owner":"fanavarro","description":"Java library for graph algorithms","archived":false,"fork":false,"pushed_at":"2025-07-12T02:15:08.000Z","size":225,"stargazers_count":4,"open_issues_count":1,"forks_count":0,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-10-25T01:41:39.434Z","etag":null,"topics":["algorithm-library","graph","java-library"],"latest_commit_sha":null,"homepage":null,"language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/fanavarro.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2020-01-03T12:24:44.000Z","updated_at":"2024-06-02T13:24:37.000Z","dependencies_parsed_at":"2023-01-23T01:16:31.994Z","dependency_job_id":null,"html_url":"https://github.com/fanavarro/graphlib","commit_stats":null,"previous_names":[],"tags_count":5,"template":false,"template_full_name":null,"purl":"pkg:github/fanavarro/graphlib","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fanavarro%2Fgraphlib","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fanavarro%2Fgraphlib/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fanavarro%2Fgraphlib/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fanavarro%2Fgraphlib/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/fanavarro","download_url":"https://codeload.github.com/fanavarro/graphlib/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fanavarro%2Fgraphlib/sbom","scorecard":{"id":391998,"data":{"date":"2025-08-11","repo":{"name":"github.com/fanavarro/graphlib","commit":"c23af172a8d57386f8870fac4206aa79d9ae0717"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":1.5,"checks":[{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Code-Review","score":0,"reason":"Found 0/28 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Token-Permissions","score":-1,"reason":"No tokens found","details":null,"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Pinned-Dependencies","score":-1,"reason":"no dependencies found","details":null,"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"Dangerous-Workflow","score":-1,"reason":"no workflows found","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: MIT License: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Signed-Releases","score":0,"reason":"Project has not signed or included provenance with any releases.","details":["Warn: release artifact v0.0.5 not signed: https://api.github.com/repos/fanavarro/graphlib/releases/84920475","Warn: release artifact v0.0.4 not signed: https://api.github.com/repos/fanavarro/graphlib/releases/84920148","Warn: release artifact v0.0.3 not signed: https://api.github.com/repos/fanavarro/graphlib/releases/41223368","Warn: release artifact v0.0.2 not signed: https://api.github.com/repos/fanavarro/graphlib/releases/34863580","Warn: release artifact v0.0.1 not signed: https://api.github.com/repos/fanavarro/graphlib/releases/24894815","Warn: release artifact v0.0.5 does not have provenance: https://api.github.com/repos/fanavarro/graphlib/releases/84920475","Warn: release artifact v0.0.4 does not have provenance: https://api.github.com/repos/fanavarro/graphlib/releases/84920148","Warn: release artifact v0.0.3 does not have provenance: https://api.github.com/repos/fanavarro/graphlib/releases/41223368","Warn: release artifact v0.0.2 does not have provenance: https://api.github.com/repos/fanavarro/graphlib/releases/34863580","Warn: release artifact v0.0.1 does not have provenance: https://api.github.com/repos/fanavarro/graphlib/releases/24894815"],"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'master'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"Vulnerabilities","score":0,"reason":"11 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: GHSA-h46c-h94j-95f3","Warn: Project is vulnerable to: GHSA-wf8f-6423-gfxg","Warn: Project is vulnerable to: GHSA-5mg8-w23w-74h3","Warn: Project is vulnerable to: GHSA-7g45-4rm6-3mm3","Warn: Project is vulnerable to: GHSA-mvr2-9pj6-7w5j","Warn: Project is vulnerable to: GHSA-6phf-73q6-gh87","Warn: Project is vulnerable to: GHSA-p66x-2cv9-qq3v","Warn: Project is vulnerable to: GHSA-wxr5-93ph-8wr9","Warn: Project is vulnerable to: GHSA-j288-q9x7-2f5v","Warn: Project is vulnerable to: GHSA-3vqj-43w4-2q58","Warn: Project is vulnerable to: GHSA-4jq9-2xhw-jpx7"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 2 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}}]},"last_synced_at":"2025-08-18T18:04:13.974Z","repository_id":52998905,"created_at":"2025-08-18T18:04:13.974Z","updated_at":"2025-08-18T18:04:13.974Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28317269,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-11T14:58:17.114Z","status":"ssl_error","status_checked_at":"2026-01-11T14:55:53.580Z","response_time":60,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["algorithm-library","graph","java-library"],"created_at":"2026-01-11T18:04:06.524Z","updated_at":"2026-01-11T18:04:07.142Z","avatar_url":"https://github.com/fanavarro.png","language":"Java","readme":"[![Build Status](https://travis-ci.com/fanavarro/graphlib.svg?branch=master)](https://travis-ci.com/fanavarro/graphlib) [![codecov](https://codecov.io/gh/fanavarro/graphlib/branch/master/graph/badge.svg)](https://codecov.io/gh/fanavarro/graphlib) [![Quality Gate Status](https://sonarcloud.io/api/project_badges/measure?project=fanavarro_graphlib\u0026metric=alert_status)](https://sonarcloud.io/dashboard?id=fanavarro_graphlib) [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n\n# graphlib\nJava library for graph management.\n\n## Graph representation\nThis library provides interfaces and abstract classes representing graphs, together with algorithms that can be applied to those graphs.\n\n Normally,  graphs are defined in such way that two nodes are connected by one edge only. Nonetheless, the graph model used by this library permits that two nodes to be linked by more than one edge, which is common in fields like ontologies.\n\nThe library relies on the Graph interface, which is parametrized with N (type of the nodes), and E (type of the edges), and declares graph methods, such as getNodes, getAdjacentNodes, or getIncomingNodes. Moreover, an AbstractGraph implementing most part of Graph interface is provided. By extending this abstract class, you only will have to implement the methods getNodes and getAdjacentNodesByEdgeMap. \n\n\nThe idea of this library is to help developers to define custom graphs by extending the AbstractGraph class. We also provide a simple map-based implementation (SimpleGraphImpl class), which could be an example of use case where the graph backend is a java map.\n\n## Algorithms\nThe library defines the following interfaces for algorithm usage:\n\n* **Algorithm** declares the method *apply*, which receives an *AlgorithmInput* and returns an *AlgorithmOutput*.\n* **AlgorithmInput** represents the input for an algorithm. The input will contain, at least, the graph in which the algorithm will be applied.\n* **AlgorithmOutput** represents the output of an algorithm.\n\nThe available algorithms are described next.\n\n### Shortest path algorithm\nThe shortest path algorithm (ShortestPathAlgorithm class) computes the shortest path between two nodes.\n\n#### Input\nThe following parameters could be specified in ShortestPathInput class:\n\n* **graph**: the graph in which the algorithm will be applied.\n* **sourceNode**: the starting node.\n* **targetNode**: the ending node.\n* **maxDepth**: the maximum allowed distance.\n\n#### Output\nThe algorithm returns an object with the following fields:\n\n* **input**: the input that generated this output.\n* **path**: the path from *sourceNode* to *targetNode* found.\n\n\n### Least common node\nThe least common node algorithm (LeastCommonNodeAlgorithm class) computes the node or nodes that are transitively linked to a given set of nodes, minimizing the distance.\n\n#### Input\nThe following parameters could be specified in LeastCommonNodeInput class:\n\n* **graph**: the graph in which the algorithm will be applied.\n* **nodes**: the nodes from which the common least node will be calculated.\n* **reverse**: a boolean parameter indicating the direction in which edges will be traverse. If reverse is true, the least common ancestor will be searched by exploring the incoming nodes of the *nodes*. If reverse is false, outcoming nodes of *nodes* will be used for traversal.\n\n\n#### Output\nThe algorithm returns a LeastCommonNodeOutput object with the following fields:\n\n* **input**: the input that generated this output.\n* **leastCommonNodes**: the node or nodes which are the least common nodes of *nodes*.\n\n\n### Subtree algorithm\nThe subtree algorithm (SubtreeAlgorithm class) extracts a tree containing a given set of nodes.\n\n#### Input\nThe following parameters could be specified in SubtreeInput class:\n\n* **graph**: the graph in which the algorithm will be applied.\n* **nodesToBeContained**: the nodes that should be present in the resulting tree.\n\n\n#### Output\nThe algorithm returns a SubtreeOutput object with the following fields:\n\n* **input**: the input that generated this output.\n* **trees**: a set of trees that contain the nodes specified in *nodesToBeContained*.\n\n\n\n### Islands algorithm\nThe islands algorithm (IslandsAlgorithm class) extracts a set of islands from the given graph.\n\n#### Input\nThe following parameters can be specified in IslandsInput class:\n\n* **graph**: the graph in which the algorithm will be applied.\n* **ignoreEdgeDirection**: boolean indicating if the islands should be computed by ignoring the direction of the edges or not. If true, islands will be build from a seed node by obtaining incoming and adjacent nodes. If false, only adjacent nodes will be used for building the islands.\n\n#### Output\nThe algorithm returns an IslandOutput object with the following fields:\n\n* **input**: the input that generated this output.\n* **islands**: a set of graphs, which are islands of the original graph passed in the input.\n\n## Simple example\nIn this section, we are going to create a simple graph called FakeGraph, used for testing, in which we could apply the available algorithms. Both nodes and edges of this graph will be text strings. Nodes are denoted by letters from \"A\" to \"J\", while edges are denoted by numbers from \"1\" to \"12\". The next figure shows the FakeGraph. As you can see, it is a cyclic, directed graph, and it contains two or three islands, depending if we consider computing islands ignoring the direction of the edges or not, respectively. Moreover, two nodes could be connected by more than one edge.\n\n![](./assets/FakeGraph.png)\n\nThe first step is to create a class by extending AbstractGraph, indicating that both nodes and edges are strings. Then, we have to implement the methods *getAdjacentNodesByEdgeMap* and *getNodes* as follows:\n\n* **getNodes** returns a set of all nodes in the graph. In this case, we should return the set (\"A\", \"B\", \"C\", \"D\", \"E\", \"F\", \"J\", \"H\", \"I\", \"J\").\n\n* **getAdjacentNodesByEdgeMap** receives a node, and it returns a map whose keys are edges, and whose values are sets of nodes adjacent to the one passed as parameter through the corresponding edge. In this case, we are going to implement this function by simply hardcoding the desired behaviour. For example, if the node passed as parameter is \"B\", we should return a map indicating that the adjacent nodes are \"C\" through the edge \"2\", and \"D\" through the edge \"3\": {\"2\" =\u003e Set(\"C\"); \"3\" =\u003e Set(\"D\")}. In the case of the node \"E\", we should indicate that its adjacent nodes are \"C\" through the edge \"7\", and \"F\" through the edges \"5\" and \"6\": {\"7\" =\u003e Set(\"C\"); \"5\" =\u003e Set(\"F\"); \"6\" =\u003e Set(\"F\")}.\n\nFinally, the implementation of this graph is as follows:\n\n```java\npackage com.github.fanavarro.graphlib;\n\nimport java.util.Arrays;\nimport java.util.HashMap;\nimport java.util.HashSet;\nimport java.util.Map;\nimport java.util.Set;\n\nimport com.github.fanavarro.graphlib.AbstractGraph;\n\n/**\n * The Class FakeGraph.\n */\npublic class FakeGraph extends AbstractGraph\u003cString, String\u003e {\n\n\t/**\n\t *\n\t */\n\tprivate static final long serialVersionUID = -4996387857511308304L;\n\n\t/*\n\t * (non-Javadoc)\n\t * \n\t * @see\n\t * es.um.dis.graphlib.AbstractGraph#getAdjacentNodesWithEdges(java.lang.\n\t * Object)\n\t */\n\t@Override\n\tpublic Map\u003cString, Set\u003cString\u003e\u003e getAdjacentNodesByEdgeMap(String node) {\n\t\tMap\u003cString, Set\u003cString\u003e\u003e adjacentNodes = new HashMap\u003cString, Set\u003cString\u003e\u003e();\n\t\tif (\"A\".equals(node)) {\n\t\t\tadjacentNodes.put(\"1\", new HashSet\u003cString\u003e(Arrays.asList(\"B\")));\n\t\t} else if (\"B\".equals(node)) {\n\t\t\tadjacentNodes.put(\"2\", new HashSet\u003cString\u003e(Arrays.asList(\"C\")));\n\t\t\tadjacentNodes.put(\"3\", new HashSet\u003cString\u003e(Arrays.asList(\"D\")));\n\t\t} else if (\"C\".equals(node)) {\n\t\t\tadjacentNodes.put(\"8\", new HashSet\u003cString\u003e(Arrays.asList(\"B\")));\n\t\t} else if (\"D\".equals(node)) {\n\t\t\tadjacentNodes.put(\"4\", new HashSet\u003cString\u003e(Arrays.asList(\"E\")));\n\t\t} else if (\"E\".equals(node)) {\n\t\t\tadjacentNodes.put(\"5\", new HashSet\u003cString\u003e(Arrays.asList(\"F\")));\n\t\t\tadjacentNodes.put(\"6\", new HashSet\u003cString\u003e(Arrays.asList(\"F\")));\n\t\t\tadjacentNodes.put(\"7\", new HashSet\u003cString\u003e(Arrays.asList(\"C\")));\n\t\t} else if (\"F\".equals(node)) {\n\t\t\t// no edges\n\t\t} else if (\"G\".equals(node)) {\n\t\t\tadjacentNodes.put(\"9\", new HashSet\u003cString\u003e(Arrays.asList(\"I\")));\n\t\t\tadjacentNodes.put(\"10\", new HashSet\u003cString\u003e(Arrays.asList(\"J\")));\n\t\t} else if (\"H\".equals(node)) {\n\t\t\tadjacentNodes.put(\"11\", new HashSet\u003cString\u003e(Arrays.asList(\"I\")));\n\t\t\tadjacentNodes.put(\"12\", new HashSet\u003cString\u003e(Arrays.asList(\"J\")));\n\t\t} else if (\"I\".equals(node)) {\n\t\t\t// no edges\n\t\t} else if (\"J\".equals(node)) {\n\t\t\t// no edges\n\t\t}\n\t\treturn adjacentNodes;\n\t}\n\n\t/*\n\t * (non-Javadoc)\n\t * \n\t * @see es.um.dis.graphlib.AbstractGraph#getNodes()\n\t */\n\t@Override\n\tpublic Set\u003cString\u003e getNodes() {\n\t\treturn new HashSet\u003cString\u003e(Arrays.asList(\"A\", \"B\", \"C\", \"D\", \"E\", \"F\", \"G\", \"H\", \"I\", \"J\"));\n\t}\n}\n\n```\n\nAt this point, we can apply algorithms to the graph. As example, below is shown a test case for the least common node algorithm, which computes the least common node of \"A\" and \"C\" in the FakeGraph, which results in node \"B\":\n\n```java\n@Test\npublic void leastCommonNodeTest1() {\n\t/* Create the graph */\n\tFakeGraph graph = new FakeGraph();\n\n\t/* Create the algorithm to apply */\n\tLeastCommonNodeAlgorithm\u003cString, String\u003e algorithm = new LeastCommonNodeAlgorithm\u003cString, String\u003e();\n\n\t/* Create the input for the algorithm */\n\tLeastCommonNodeInput\u003cString, String\u003e input = new LeastCommonNodeInput\u003cString, String\u003e();\n\tinput.setGraph(graph);\n\tinput.setNodes(new HashSet\u003cString\u003e(Arrays.asList(\"A\", \"C\")));\n\n\t/* Apply the algorithm */\n\tLeastCommonNodeOutput\u003cString, String\u003e output = (LeastCommonNodeOutput\u003cString, String\u003e) graph\n\t\t\t.applyAlgorithm(algorithm, input);\n\n\t/* Check output */\n\tassertNotNull(output);\n\tassertNotNull(output.getLeastCommonNodes());\n\tassertEquals(1, output.getLeastCommonNodes().size());\n\tassertTrue(output.getLeastCommonNodes().contains(\"B\"));\n}\n```\n\nFor more examples, please check the [test cases](./src/test/java/com/github/fanavarro/graphlib/algorithms) provided for each algorithm.\n\n## Serialization\nThe library also provides methods for graph serialization. Currently only JGF format is supported.\n\n### JSON Graph Format (JGF)\nJSON Graph Format ([JGF](https://jsongraphformat.info/)) is a JSON-based serialization for graphs. This library implements the conversion between our graph model into LPG format. For example, the following code, taken from the test cases, writes our FakeGraph in JGF format in the variable *serialization*:\n\n```java\n@Test\npublic void testSerialize() {\n\tGraph \u003cString, String\u003e graph = new FakeGraph();\n\tJGFSerializer\u003cString, String\u003e serializer = new JGFSerializer\u003c\u003e();\n\tassertNotNull(serializer.getMapper());\n\t\n\tString serialization = serializer.serialize(graph, \"Fake Graph\");\n\tassertNotNull(serialization);\n\tassertTrue(!serialization.isEmpty());\n\n\tJSONObject jsonInput = new JSONObject(serialization);\n\tJSONSerializerValidator.validateJGF(jsonInput);\n}\n```\n\nFinally, the variable *serialization* contains the FakeGraph expressed in JGF:\n\n```JSON\n{\n  \"graph\" : {\n    \"label\" : \"Fake Graph\",\n    \"directed\" : true,\n    \"nodes\" : [ {\n      \"id\" : \"A\",\n      \"label\" : \"A\"\n    }, {\n      \"id\" : \"B\",\n      \"label\" : \"B\"\n    }, {\n      \"id\" : \"C\",\n      \"label\" : \"C\"\n    }, {\n      \"id\" : \"D\",\n      \"label\" : \"D\"\n    }, {\n      \"id\" : \"E\",\n      \"label\" : \"E\"\n    }, {\n      \"id\" : \"F\",\n      \"label\" : \"F\"\n    }, {\n      \"id\" : \"G\",\n      \"label\" : \"G\"\n    }, {\n      \"id\" : \"H\",\n      \"label\" : \"H\"\n    }, {\n      \"id\" : \"I\",\n      \"label\" : \"I\"\n    }, {\n      \"id\" : \"J\",\n      \"label\" : \"J\"\n    } ],\n    \"edges\" : [ {\n      \"source\" : \"A\",\n      \"target\" : \"B\",\n      \"relation\" : \"1\",\n      \"label\" : \"1\"\n    }, {\n      \"source\" : \"B\",\n      \"target\" : \"C\",\n      \"relation\" : \"2\",\n      \"label\" : \"2\"\n    }, {\n      \"source\" : \"B\",\n      \"target\" : \"D\",\n      \"relation\" : \"3\",\n      \"label\" : \"3\"\n    }, {\n      \"source\" : \"C\",\n      \"target\" : \"B\",\n      \"relation\" : \"8\",\n      \"label\" : \"8\"\n    }, {\n      \"source\" : \"D\",\n      \"target\" : \"E\",\n      \"relation\" : \"4\",\n      \"label\" : \"4\"\n    }, {\n      \"source\" : \"E\",\n      \"target\" : \"F\",\n      \"relation\" : \"5\",\n      \"label\" : \"5\"\n    }, {\n      \"source\" : \"E\",\n      \"target\" : \"F\",\n      \"relation\" : \"6\",\n      \"label\" : \"6\"\n    }, {\n      \"source\" : \"E\",\n      \"target\" : \"C\",\n      \"relation\" : \"7\",\n      \"label\" : \"7\"\n    }, {\n      \"source\" : \"G\",\n      \"target\" : \"I\",\n      \"relation\" : \"9\",\n      \"label\" : \"9\"\n    }, {\n      \"source\" : \"G\",\n      \"target\" : \"J\",\n      \"relation\" : \"10\",\n      \"label\" : \"10\"\n    }, {\n      \"source\" : \"H\",\n      \"target\" : \"I\",\n      \"relation\" : \"11\",\n      \"label\" : \"11\"\n    }, {\n      \"source\" : \"H\",\n      \"target\" : \"J\",\n      \"relation\" : \"12\",\n      \"label\" : \"12\"\n    } ]\n  }\n}\n```\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffanavarro%2Fgraphlib","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffanavarro%2Fgraphlib","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffanavarro%2Fgraphlib/lists"}