AnormCypher: как получить полный путь для данного узла?

Для графа, состоящего из двух групп узлов:

n1 -> n2 -> n3 -> n4

а также

n5 -> n6 -> n7

Создано с помощью команд:

CREATE (n1 {id: 'n1'}) - [: rel] -> (n2 {id: 'n2'}) - [: rel] -> (n3 {id: 'n3'}) - [: rel] -> (n4 {id: 'n4'})

CREATE (n5 {id: 'n5'}) - [: rel] -> (n6 {id: 'n6'}) - [: rel] -> (n7 {id: 'n7'})

Для обоих запросов:

MATCH p = (n {id: 'n1'}) - [*] - (m) ВОЗВРАТИТЬ узлы (p) как узлы;

MATCH p = (n {id: 'n1'}) - [*] - (m) ВОЗВРАЩАТЬ отношения (p) as rels;

AnormCypher ( http://anormcypher.org/) возвращает информацию, относящуюся только к узлам n1 и n2, а веб-консоль Neo4J возвращает полный путь.

Как получить все узлы и отношения для полного пути в AnormCypher?

Программа, которая демонстрирует это (в конце этого сообщения) выводит:

ListBuffer(NeoNode(32,Map(id -> n1)), NeoNode(33,Map(id -> n2)))
Node: id=32 props=Map(id -> n1)
--Props keys:
----key: id val: n1
Node: id=33 props=Map(id -> n2)
--Props keys:
----key: id val: n2
ListBuffer(NeoRelationship(27,Map(),32,33))
Rel: id=27 start=32 end=33 props=Map()

Код:

object Simple {
   def main(args: Array[String]): Unit = {

Cypher("MATCH p = (n {id: 'n1'})-[*]-(m) RETURN nodes(p) as nodes;")().map { row =>

  println(row[Seq[org.anormcypher.NeoNode]]("nodes"))
  val nodes = row[Seq[org.anormcypher.NeoNode]]("nodes")

  nodes.map(n => {
    val props = n.props
    println("Node: id="+n.id+" props="+props)
    println("--Props keys: ")
    val x = props.keys
    props.keys.map( k=> println("----key: "+k+" val: "+props(k)))
    })
}

Cypher("MATCH p = (n {id: 'n1'})-[*]-(m) RETURN relationships(p) as rels ;")().map { row =>

  println(row[Seq[NeoRelationship]]("rels"))
  val rels = row[Seq[NeoRelationship]]("rels")
  rels.map(r => {
    val x = r.props
    println("Rel: id="+r.id+" start="+r.start+" end="+r.end+" props="+r.props)
  })
}

 }
}

1 ответ

Решение

Проблема ваша map Функция создает ленивый поток, и вы не выполняете итерации по остальному потоку. Если вы добавите .toList или же .last до конца вашего .map, форсируя итерацию по всему потоку, вы должны получить более длинный путь.

Например:

Cypher("MATCH p = (n {id: 'n1'})-[*]-(m) RETURN nodes(p) as nodes;")().map { row =>
  println(row[Seq[org.anormcypher.NeoNode]]("nodes"))
  val nodes = row[Seq[org.anormcypher.NeoNode]]("nodes")

  nodes.map(n => {
    val props = n.props
    println("Node: id="+n.id+" props="+props)
    println("--Props keys: ")
    val x = props.keys
    props.keys.map( k=> println("----key: "+k+" val: "+props(k)))
    })
}.toList

В качестве альтернативы, вы можете просто использовать .foreach вместо .map, который делает это для вас.

Обновление: вот пример, который не имеет возвращаемого типа:

Cypher("MATCH p = (n {id: 'n1'})-[*]-(m) RETURN nodes(p) as nodes;")().foreach { row =>
  println(row[Seq[org.anormcypher.NeoNode]]("nodes"))
  val nodes = row[Seq[org.anormcypher.NeoNode]]("nodes")

  nodes.map(n => {
    val props = n.props
    println("Node: id="+n.id+" props="+props)
    println("--Props keys: ")
    val x = props.keys
    props.keys.map( k=> println("----key: "+k+" val: "+props(k)))
    })
}
Другие вопросы по тегам