Last active
February 3, 2026 20:26
-
-
Save dacr/3a5348c0f6e8326d3955bec7d1de49b9 to your computer and use it in GitHub Desktop.
neo4j cypher queries - supported storable data types / published by https://github.com/dacr/code-examples-manager #f7116c87-b923-401a-9d9a-dde815befd86/17658df7fcea9c81cb1c99f2e46d4beaf6151d00
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| // summary : neo4j cypher queries - supported storable data types | |
| // keywords : scala, neo4j, cypher, @testable | |
| // publish : gist | |
| // authors : David Crosson | |
| // license : Apache License Version 2.0 (https://www.apache.org/licenses/LICENSE-2.0.txt) | |
| // id : f7116c87-b923-401a-9d9a-dde815befd86 | |
| // created-on : 2024-06-20T08:29:22+02:00 | |
| // managed-by : https://github.com/dacr/code-examples-manager | |
| // run-with : scala-cli $file | |
| // --------------------- | |
| //> using scala "3.4.2" | |
| //> using dep "org.neo4j.test:neo4j-harness:5.20.0" | |
| //> using dep "org.neo4j.driver:neo4j-java-driver:5.21.0" | |
| // --------------------- | |
| import org.neo4j.driver.{AuthTokens, GraphDatabase, Result, Value} | |
| import scala.util.Using | |
| import scala.util.chaining.* | |
| import scala.jdk.CollectionConverters.* | |
| val fixture = | |
| """ | |
| |CREATE (:CoreType {name: 'INTEGER', example: 42}) // INTEGER IS Long 64bits | |
| |CREATE (:CoreType {name: 'FLOAT', example: 1.7976931348623157E308}) // FLOAT IS Double !! | |
| |CREATE (:CoreType {name: 'BOOLEAN', example: true}) | |
| |CREATE (:CoreType {name: 'STRING', example: 'hello'}) | |
| |CREATE (:CoreType {name: 'LIST', example: [1,2,3]}) | |
| |//CREATE (:CoreType {name: 'ByteArray', example: }) // NOT SUPPORTED IN CYPHER STANDARD | |
| |//CREATE (:CoreType {name: 'MAP', example: {age:42, name:"joe"}}) // NOT SUPPORTED & USELESS => GRAPH DB | |
| | | |
| |CREATE (:TemporalType {name: 'DATE', example: date('2024-06-20')}) | |
| |CREATE (:TemporalType {name: 'LOCAL TIME', example: time('10:02:32.192')}) | |
| |CREATE (:TemporalType {name: 'LOCAL DATETIME', example: datetime('2024-06-20T08:50:06')}) | |
| |CREATE (:TemporalType {name: 'ZONED DATETIME', example: datetime('2024-06-20T08:50:06+02:00')}) | |
| |CREATE (:TemporalType {name: 'ZONED TIME', example: time('10:02:32.192Z')}) | |
| |CREATE (:TemporalType {name: 'DURATION', example: duration('P14DT16H12M')}) | |
| | | |
| |CREATE (:SpatialType {name: 'POINT (2D Cartesian)', example: point({x: 2.3, y: 4.5}), srid: 7203}) | |
| |CREATE (:SpatialType {name: 'POINT (2D WGS-84)', example: point({latitude: 48.866667, longitude: 2.333333}) , srid: 4326}) | |
| |CREATE (:SpatialType {name: 'POINT (3D Cartesian)', example: point({x: 2.3, y: 4.5, z: 8.1}), srid: 9157}) | |
| |CREATE (:SpatialType {name: 'POINT (3D WGS-84)', example: point({latitude: 48.866667, longitude: 2.333333, height: 35.0}), srid: 4979}) | |
| |""".stripMargin | |
| val builder = | |
| org.neo4j.harness.Neo4jBuilders | |
| .newInProcessBuilder() | |
| .withFixture(fixture) | |
| Using(builder.build()) { embedded => | |
| Using(GraphDatabase.driver(embedded.boltURI(), AuthTokens.none())) { driver => | |
| Using(driver.session()) { session => | |
| // ------------------------------------------------ | |
| val byteArray = "Hello world".getBytes | |
| val createResponse = session.run("CREATE (:CoreType {name: 'ByteArray', example: $value})", Map( "value"-> byteArray ).asJava) | |
| // ------------------------------------------------ | |
| val readQuery = "MATCH (n {name: $name}) RETURN n.example as value" | |
| def get(name: String): Value = { | |
| val response: Result = session.run(readQuery, Map("name" -> name).asJava) | |
| val value: Value = response.single().get("value") | |
| value | |
| } | |
| def info(name: String, comment: Option[String] = None): Unit = { | |
| val value = get(name) | |
| println(s"---------------------") | |
| println(s"name:$name - type=${value.`type`().name()} - ${comment.getOrElse("")}") | |
| println(s"java class : ${value.getClass.getCanonicalName}") | |
| value.`type`().name() match | |
| case "BOOLEAN" => println(s"value:${value.asBoolean()}") | |
| case "LIST OF ANY?" => println(s"value:${value.asList().asScala.mkString(",")}") | |
| case "FLOAT" => println(s"value:${value.asDouble()}") | |
| case "INTEGER" => println(s"value:${value.asLong()}") | |
| case "STRING" => println(s"value:${value.asString()}") | |
| case "DATE" => println(s"value:${value.asLocalDate()}") | |
| case "DATE_TIME" => println(s"value:${value.asZonedDateTime()}") | |
| case "TIME" => println(s"value:${value.asOffsetTime()}") | |
| case "DURATION" => println(s"value:${value.asIsoDuration()}") | |
| case "POINT" => println(s"value:${value.asPoint()}") | |
| case "BYTES" => println(s"value:${value.asByteArray().mkString("-")}") | |
| case value => println(s"NOT YET SUPPORTED ${value.getClass.getCanonicalName}") | |
| } | |
| info("INTEGER", Some("is a Long value in fact (8 bytes)")) | |
| info("FLOAT", Some("is a Double value in fact (8 bytes)")) | |
| info("BOOLEAN") | |
| info("STRING") | |
| info("LIST") | |
| info("DATE") | |
| info("LOCAL TIME") | |
| info("LOCAL DATETIME") | |
| info("ZONED TIME") | |
| info("ZONED DATETIME") | |
| info("DURATION") | |
| info("POINT (2D Cartesian)") | |
| info("POINT (3D Cartesian)") | |
| info("POINT (2D WGS-84)") | |
| info("POINT (3D WGS-84)", Some("use height and not altitude")) | |
| info("ByteArray", Some("for small objects, not part of CYPHER standard")) | |
| // ------------------------------------------------ | |
| println("*****************************************************************") | |
| println("Constructed types cannot be stored as properties (with the exception of homogenous lists).") | |
| println("https://neo4j.com/docs/cypher-manual/current/values-and-types/property-structural-constructed/#constructed-types") | |
| println("*****************************************************************") | |
| }.tap(r => println(r)) | |
| }.tap(r => println(r)) | |
| }.tap(r => println(r)) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment