Ask HN: I'm trying to represent an entire building as a graph
This entire graph would have to represent every entity in the building, including the control nodes. It's an IoT graph, where a node may represent the light switch, connected to a particular desk(also a node). This graph should also show directions from one entity to another.
For now, I have a photoshop pipeline which generates a simplified graph from a color coded image, using NetworkX. This is a temporary replacement for when the actual BIM comes along. But the graph remains.
Are there any libraries out there that would help me or should I just roll my own system?
I'm not sure I would like to add Neo4J to the stack. Storing everything to Postgres seems to work fine. It's the in memory representation that I have problems with.
29 comments
[ 3.1 ms ] story [ 78.1 ms ] threadhttps://github.com/eBay/beam
https://github.com/gchq/Gaffer
It depends on what is really needed there. If is interactive or not and how complex. To draw a very complex building, something that will not place nodes and move lines around by itself (Autocad, etc) could be easily the weapon of choice here.
Being text based it is easily manipulable and readily scalable to many nodes. It also supports subgraphs.
I am surprised at being downvoted when suggesting what is quantifiably the most mature tool in the space.
PDF is a presentation format, and has nothing to do with graphs in the sense of data structures. The fact that the original question references photoshop shows that the person asking is not approaching the problem from a formal standpoint. This is asking for trouble.
Frankly, I am not sure a graph is the right data structure for this problem. It is more likely that a general purpose database would fulfil current and future requirements more effectively. Graphs could be generated from that trivially as representations.
I agree in the database focus
If you want a simple in memory graph modelling library then check out Apache Tinkerpop. Its great.
Best open source graph database is ArrangoDB they have master to master cluster. Fastest and best technology for graphs have commercial TigerDB, but you must pay >300k annually.
Networkx is great but loading full model - but for what you doing should be enough. :)
For instance JanusGraph [2] has support for a lot of different backends, built by the old team behind TitanDB.
[0] https://dgraph.io
[1] http://karras.rutgers.edu/hexastore.pdf
[2] https://janusgraph.org
Why are you trying to model the building as a graph? What are the use cases? What operations do you want this data structure to be able to perform efficiently?
It might turn out that a single graph (or any graph) is not the most effective way of modelling an approximation of the real system.
How many nodes and edges will your graphs typically have? python & networkx work okay for bashing out prototype code and may be good enough for MVP or even a large number of releases if your data size is small and the operations you perform on the graph are linear in the graph size (e.g. connectivity checks, traversals)
I've also seen C/C++ codebases get pretty far by rolling their own domain specific graph data structures-- eg define your own node and edge struct types, give each node and edge pointers to the edges/nodes they connect to, hack domain specific fields as necessary onto the structs. Then just implement each graph algorithm as you need it. This may end up in an unmaintainable mess after a few years, but I've seen this work well enough so that the product based on this is worth enough money that there's enough cash to hire software engineers to come clean things up!
Another thing to think about: are your graphs dynamic or static? If they are large and static, there's lots in common between graphs and sparse matrices. You can encode your graphs in memory in CSR or CSC like sparse matrix formats-- no objects, just giant arrays full of indices. This isn't a good idea if your want to dynamically add or remove nodes and edges, but it is memory efficient.
This is usually the start of my argument in favour of representing data in a relational form. Any one graph is a projection of the domain. It privileges certain reads and writes over others. You inevitably find queries and updates that don't fit the graph's original shape and then suddenly it's a giant PITA to work with.
If I build a project management system, I might have a graph that runs [Project] -> [Workers] -> [Timesheets]. If I want to calculate the sum of time on a particular project that's fairly efficient. But if I want to get the sum of time for a particular worker, I will need to traverse every project looking for them.
In a relation form I'd have [Projects] n..n [Workers], [Workers] 1..n [Timesheets] and [Projects] 1..n [Timesheets]. When I need to sum in a project, I join on that. When I need to sum on a worker, I join on that. Neither is privileged over the other.
For persistence, I use Neo4j to represent hundreds of dynamic graph ontologies, and I use the hosted version on graphenedb, which has worked just fine for my purposes.
For some views, I just use NetworkX to generate interactive d3.js pages from data I have queried from the graph, or python/flask with py2neo to generate json for d3 visualizations. Some others use cytoscape for visualization, but I find that a bit dramatic for most purposes.
Depending on how you would like to represent it, I can also recomment Webprotege and WebVOWL, since the graph you are creating is also in effect an ontology.
Previous: https://hn.algolia.com/?query=GraphBLAS&sort=byPopularity&pr...
So is the in-memory representation! Have you thought about using lazy structures? The graph can be conceptually infinite in size but your program only loads the pieces being used as they are needed and offloads old ones that are not.
Why were not graphs embraced by other domains? Plan and elevations by definition are constrained view points. (Hint: for the same reason the highly available and highly consistent flavors of graph databases require paid licenses :)
Graphs make for difficult decomposable 'unit' assemblies. Plans and elevations are 'standard units'. (Again: it may help to think of as plans and elevations as tables and reverse indexes, respectively.)
Note requirements such as e.g. "show directions from one entity to another" are also present for documenting the electrical systems, or HVAC, in a building.
A modular system for representing graphs of arbitrary scale is the minimal and trivial 'one node per modular unit'. The alternative is throwing huge amounts of processing power to allow arbitrary views into a graph at any scale.
IoT, as an 'integrated component' of building systems, will find a very happy place on plans and elevations.
http://treenotation.org/sandbox/build/#grammar%0A%20nodeType...
http://www.texample.net/tikz/examples/pressurized-water-reac...
I'm doing something quite similar at the moment