Package: grand-graph
Graph toolkit interoperability and scalability for PythonInstallationpipinstallgrand-graphExample use-casesWrite NetworkX commands to analyze true-serverless graph databases using DynamoDB*Query a host graph in SQL for subgraph isomorphisms with DotMotifWrite iGraph code to construct a graph, and then play with it in NetworkitAttach node and edge attributes to Networkit or IGraph graphs*Neptune is not true-serverless.Why it's a big dealGrandis a Rosetta Stone of graph technologies. AGrandgraph has a "Backend," which handles the implementation-details of talking to data on disk (or in the cloud), and an "Dialect", which is your preferred way of talking to a graph.For example, here's how you make a graph that is persisted in DynamoDB (the "Backend") but that you can talk to as though it's anetworkx.DiGraph(the "Dialect"):importgrandG=grand.Graph(backend=grand.DynamoDBBackend())G.nx.add_node("Jordan",type="Person")G.nx.add_node("DotMotif",type="Project")G.nx.add_edge("Jordan","DotMotif",type="Created")assertlen(G.nx.edges())==1assertlen(G.nx.nodes())==2It doesn't stop there. If you like the way IGraph handles anonymous node insertion (ugh) but you want to handle the graph using regular NetworkX syntax, use aIGraphDialectand then switch to aNetworkXDialecthalfway through:importgrandG=grand.Graph()# Start in igraph:G.igraph.add_vertices(5)# A little bit of networkit:G.networkit.addNode()# And switch to networkx:assertlen(G.nx.nodes())==6# And back to igraph!assertlen(G.igraph.vs)==6You should be able to use the "dialect" objects the same way you'd use a real graph from the constituent libraries. For example, here is a NetworkX algorithm running on NetworkX graphs alongside Grand graphs:importnetworkxasnxnx.algorithms.isomorphism.GraphMatcher(networkxGraph,grandGraph.nx)Here is an example of using Networkit, a highly performant graph library, and attaching node/edge attributes, which are not supported by the library by default:importgrandfromgrand.backends.networkitimportNetworkitBackendG=grand.Graph(backend=NetworkitBackend())G.nx.add_node("Jordan",type="Person")G.nx.add_node("Grand",type="Software")G.nx.add_edge("Jordan","Grand",weight=1)print(G.nx.edges(data=True))# contains attributes, even though graph is stored in networkitCurrent Support✅ = Fully Implemented🤔 = In Progress🔴 = UnsupportedDialectDescription & NotesStatusIGraphDialectPython-IGraph interface✅NetworkXDialectNetworkX-like interface✅NetworkitDialectNetworkit-like interface✅BackendDescription & NotesStatusDataFrameBackendStored in pandas-like tables✅DynamoDBBackendEdge/node tables in DynamoDB✅GremlinBackendFor Gremlin datastores✅IGraphBackendAn IGraph graph, in memory✅NetworkitBackendA Networkit graph, in memory✅NetworkXBackendA NetworkX graph, in memory✅SQLBackendTwo SQL-queryable tables✅You can read more about usage and learn about backends and dialects inthe wiki.CitingIf this tool is helpful to your research, please consider citing it with:# https://doi.org/10.1038/s41598-021-91025-5@article{Matelsky_Motifs_2021,title={{DotMotif: an open-source tool for connectome subgraph isomorphism search and graph queries}},volume={11},ISSN={2045-2322},url={http://dx.doi.org/10.1038/s41598-021-91025-5},DOI={10.1038/s41598-021-91025-5},number={1},journal={Scientific Reports},publisher={Springer Science and Business Media LLC},author={Matelsky, Jordan K. and Reilly, Elizabeth P. and Johnson, Erik C. and Stiso, Jennifer and Bassett, Danielle S. and Wester, Brock A. and Gray-Roncal, William},year={2021},month={Jun}}Made with 💙 at