diff --git a/docker-compose.yml b/docker-compose.yml index 15c6a627cd65a98f5a3eb7bf51a2258c09655af4..239166099b752302ebe063d0055a5500fbcb0d09 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -8,6 +8,11 @@ services: - "7687:7687" volumes: - ./neo4j/plugins:/plugins + - ./neo4j/entrypoint:/var/lib/neo4j/data/graph.db + + # Todo: Add command to seed the database while the container is starting + # Important: The Files of the Volume are stored in /data/graph.db + environment: NEO4J_AUTH: none NEO4J_dbms_security_procedures_unrestricted: algo.* diff --git a/neo4j/entrypoint/entrypoint.sh b/neo4j/entrypoint/entrypoint.sh new file mode 100755 index 0000000000000000000000000000000000000000..dc7fa141c67ffa7d0b2b545082548a27330511b6 --- /dev/null +++ b/neo4j/entrypoint/entrypoint.sh @@ -0,0 +1,11 @@ +#!/usr/bin/env bash + +echo "Start waiting for Database to be ready ..." + +end="$((SECONDS+60))" +while true; do + nc -w 2 localhost 7687 && break + [[ "${SECONDS}" -ge "${end}" ]] && exit 1 + sleep 1 +done +cypher-shell --fail-fast --debug --format verbose < /data/graph.db/neo4j-entrypoint.cql diff --git a/neo4j/entrypoint/neo4j-entrypoint.cql b/neo4j/entrypoint/neo4j-entrypoint.cql new file mode 100755 index 0000000000000000000000000000000000000000..05bea71a8b95f0c32849a7e216fcbf75028a6ef4 --- /dev/null +++ b/neo4j/entrypoint/neo4j-entrypoint.cql @@ -0,0 +1,42 @@ +:param db_skeleton => "SELECT arguments.uid as argument, arguments.is_supportive as support, arguments.conclusion_uid as conclusion_statement, arguments.argument_uid as conclusion_argument, premises.statement_uid as premise, arguments.issue_uid as issue, statements.is_position FROM arguments JOIN premises ON arguments.premisegroup_uid = premises.premisegroup_uid LEFT JOIN statements ON statements.uid = arguments.conclusion_uid"; +:param db_uri => "jdbc:postgresql://db/discussion?user=postgres&password=FooBar"; + +CREATE INDEX ON :Statement(id); +CREATE INDEX ON :Argument(id); +CREATE INDEX ON :Issue(id); + +CALL apoc.load.jdbc($db_uri, $db_skeleton) +YIELD row +WITH DISTINCT row["issue"] AS issues, row +MERGE (:Issue{id:issues}) +MERGE (:Argument{id: row["argument"], support: row["support"]}) +MERGE (:Statement{id: row["premise"]}) +WITH row +WHERE exists(row["is_position"]) and row["is_position"] +MERGE (:Statement:Position{id: row["conclusion_statement"]}) +WITH row +WHERE exists(row["conclusion_statement"]) and (not exists(row["is_position"]) or not row["is_position"]) +MERGE (:Statement{id: row["conclusion_statement"]}); + +CALL apoc.load.jdbc($db_uri, $db_skeleton) +YIELD row +MATCH (sp:Statement:Position{id: row["conclusion_statement"]}), (i:Issue{id: row["issue"]}) +WHERE exists(row["is_position"]) and row["is_position"] +MERGE (sp)-[:REGARDING]->(i); + +CALL apoc.load.jdbc($db_uri, $db_skeleton) +YIELD row +MATCH (s:Statement{id: row.premise}), (a:Argument{id: row.argument}) +MERGE (s)-[:PREMISE_OF]->(a); + +CALL apoc.load.jdbc($db_uri, $db_skeleton) +YIELD row +MATCH (a:Argument{id: row.argument}), (c:Statement{id: row.conclusion_statement}) +WHERE EXISTS(row.conclusion_statement) +MERGE (a)-[:CONCLUDES]->(c); + +CALL apoc.load.jdbc($db_uri, $db_skeleton) +YIELD row +MATCH (a:Argument{id: row.argument}), (c:Argument{id: row.conclusion_argument}) +WHERE NOT EXISTS(row.conclusion_statement) +MERGE (a)-[:CONCLUDES]->(c); \ No newline at end of file