0

我正在尝试从现有的 7 级缩放创建一个 5 级缩放的 geohash 图。我尝试了以下代码:

 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

但是在密码中它似乎不是真的,我得到一个例外:

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

用英语的话,我想要:如果开始节点和结束节点共享相同的 geohash 子字符串,则创建一个具有指向它的关系的节点:

内部关系

否则创建两个节点:

相互关系

注意我正在从事的项目是 CYPHER FOR APACHE SPARK

4

1 回答 1

0

我通过以下步骤解决了我的问题:

1)从现有的图表中创建一个级别为 5 的图表:

//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)从上一个图中复制远节点:

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)

最后:

3)通过从第一个复制关系并将它们影响到远程节点来创建远程 level5 图

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 5 级

于 2018-09-30T17:18:38.590 回答