Skip to content

Commit 2ed0cca

Browse files
Initial commit of a utility to load a Structurizr workspace into a Neo4j database.
1 parent 8d57511 commit 2ed0cca

File tree

5 files changed

+80
-1
lines changed

5 files changed

+80
-1
lines changed

settings.gradle

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,4 +7,5 @@ include 'structurizr-core'
77
include 'structurizr-dsl'
88
include 'structurizr-export'
99
include 'structurizr-import'
10-
include 'structurizr-inspection'
10+
include 'structurizr-inspection'
11+
include 'structurizr-neo4j'

structurizr-neo4j/README.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
# structurizr-neo4j
2+
3+
[![Maven Central](https://img.shields.io/maven-central/v/com.structurizr/structurizr-neo4j.svg?label=Maven%20Central)](https://search.maven.org/artifact/com.structurizr/structurizr-neo4j)
4+
5+
This library provides utilities to import a Structurizr workspace into Neo4j.

structurizr-neo4j/build.gradle

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
dependencies {
2+
3+
api project(':structurizr-core')
4+
implementation 'org.neo4j.driver:neo4j-java-driver:5.23.0'
5+
6+
testImplementation project(':structurizr-client')
7+
testImplementation 'org.junit.jupiter:junit-jupiter:5.9.2'
8+
9+
}
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package com.structurizr.neo4j;
2+
3+
import com.structurizr.Workspace;
4+
import com.structurizr.model.Element;
5+
import com.structurizr.model.Relationship;
6+
import com.structurizr.util.StringUtils;
7+
import org.neo4j.driver.Driver;
8+
import org.neo4j.driver.SessionConfig;
9+
10+
public class SimpleLoader {
11+
12+
public void load(Workspace workspace, Driver driver, String database) {
13+
try (var session = driver.session(SessionConfig.builder().withDatabase(database).build())) {
14+
for (Element element : workspace.getModel().getElements()) {
15+
session.run(String.format(
16+
"CREATE ( :Element { id: '%s', name: \"%s\", type: \"%s\" })",
17+
element.getId(), element.getName(), element.getClass().getSimpleName().toLowerCase()
18+
));
19+
}
20+
21+
session.run("CREATE INDEX element_index FOR (n:Element) ON (n.id)");
22+
23+
for (Relationship relationship : workspace.getModel().getRelationships()) {
24+
session.run(String.format(
25+
"""
26+
MATCH ( from:Element { id: '%s' } ), ( to:Element { id: '%s' } )
27+
CREATE (from)-[:HAS_RELATIONSHIP_WITH {role: '%s'}]->(to)""",
28+
relationship.getSource().getId(),
29+
relationship.getDestination().getId(),
30+
!StringUtils.isNullOrEmpty(relationship.getDescription()) ? relationship.getDescription() : "uses"
31+
));
32+
}
33+
}
34+
}
35+
36+
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package com.structurizr;
2+
3+
import com.structurizr.neo4j.SimpleLoader;
4+
import com.structurizr.util.WorkspaceUtils;
5+
import org.neo4j.driver.AuthTokens;
6+
import org.neo4j.driver.Driver;
7+
import org.neo4j.driver.GraphDatabase;
8+
import org.neo4j.driver.Result;
9+
10+
import java.io.File;
11+
12+
public class Example {
13+
14+
public static void main(String[] args) throws Exception {
15+
Workspace workspace = WorkspaceUtils.loadWorkspaceFromJson(new File("workspace.json"));
16+
17+
try (Driver driver = GraphDatabase.driver("bolt://localhost:7687", AuthTokens.basic("neo4j", "password"))) {
18+
try (var session = driver.session()) {
19+
session.run("DROP DATABASE structurizr IF EXISTS");
20+
Result result = session.run("CREATE DATABASE structurizr");
21+
System.out.println(result.consume());
22+
}
23+
24+
new SimpleLoader().load(workspace, driver, "structurizr");
25+
}
26+
}
27+
28+
}

0 commit comments

Comments
 (0)