There are many graph query languages that let us retrieve data from the graph, such as SPARQL, Cypher, and Gremlin. Some of them are declarative languages, and that means we only need to focus on what data we want out of the graph (not how to go get it).
Here is an example of the Cypher language:
MATCH (band:Band)-[:WROTE]->(song:Song {name: 'The Scientist'})
RETURN band.name
// Query the author of 'The Scientist'
The syntax we write has basically the same structure as the subgraph we want. However, it may get complicated when the graph has more loops and branches. Ideograph makes it easier to describe complex graphs by drawing the representation of the subgraph through interactions.
The data source for this tool is undisclosed, but you can watch the video to see how it works.
Ideograph provides a way to map multiple subgraphs at once,
which is equivalent to the sizeof
function in
Cypher. You can find an example at 2:20 of the video.
Besides the basic graph structure editing, Ideograph
supports the logic compositions (and, or, not) of multiple
constraint clauses. All these structures and logical
constraints are stored in an AST-like JSON. The backend
(Kotlin) receives this JSON and retrieves subgraphs from
databases. In our case, the graph data was stored in
MongoDB. With the Quine McCluskey algorithm and
Kotlin Coroutines, our backend server could solve complex
logic with concurrency. You can find more details
in my graduate thesis.