Geohash Roll up Graph (level 5) from (level7) with Cypher?

89 Views Asked by At

I am trying to create a geohash graph with level 5 of zoom from an existing one with level 7. i tried this code :

 FROM GRAPH mergedGraph
 MATCH (from)-[via]->(to)
 CASE WHEN substring(from.geohash,0,5)=substring(to.geohash,0,5)
 THEN
 CONSTRUCT
 CREATE (h:HashNode{geohash:substring(from.geohash,0,5)})-[COPY OF via]->(h)
 ELSE
 CONSTRUCT create (:HashNode{geohash:substring(from.geohash,0,5)})-[COPY OF via]->(:HashNode{geohash:substring(to.geohash,0,5)})
 END
 RETURN GRAPH

however it dosen't seem true in cypher ,i get an exception :

Caused by: org.opencypher.v9_0.util.SyntaxException: Invalid input 'S': expected 'l/L' (line 4, column 4 (offset: 57))

In english words i want : if the start node and the end node share the same geohash substring then create one node with the relationship that point back to it:

intra relationship

else create two nodes :

inter relationship

NB: The project i am working at is CYPHER FOR APACHE SPARK

1

There are 1 best solutions below

0
On BEST ANSWER

I solved my problem with this steps:

1) Create a graph with Level 5 from the existing one :

//Creation Geohash Graph with level 5 from the initial graph (level 7)
   val Level5 = session.cypher("""
                      | FROM GRAPH mergeGraph
                      | MATCH (from)-[via]->(to)
                      | CONSTRUCT
                      |  CREATE (:HashNode{geohash:substring(from.geohash,0,5)})-[COPY OF via]->(:HashNode{geohash:substring(to.geohash,0,5)})
                      | RETURN GRAPH
                      """.stripMargin).graph

2) Copy distant nodes from the previous graph :

session.cypher ("""
 | CATALOG CREATE GRAPH nodes2 {
 | FROM GRAPH session.Level5
 | MATCH (n)
 | WITH DISTINCT n.geohash AS geohash
 |CONSTRUCT
 | CREATE (h:HashNode{geohash:geohash})
 |RETURN GRAPH
  }""".stripMargin)

finally:

3) Create the distant level5 graph by copying relationships from the first one and affecting them to the distant nodes

val level5= session.cypher("""
                               FROM GRAPH Level5
                              |  MATCH (from)-[via]->(to)
                              |  FROM GRAPH nodes2
                              |  MATCH (n), (m)
                              |  WHERE from.geohash=n.geohash AND to.geohash = m.geohash
                               construct
                              |    CREATE (n)-[COPY OF via]->(m)
                              |  RETURN GRAPH
                           """.stripMargin).graph

Geohash Level 5