Сайфер: найти путь с помощью Scala AnormCypher?

В AnormCypher doc приведен пример получения данных с помощью Stream API: http://anormcypher.org/

"Первый способ получить доступ к результатам запроса возврата - использовать Stream API.

Когда вы вызываете apply() для любого оператора Cypher, вы получите ленивый поток экземпляров CypherRow, где каждая строка может рассматриваться как словарь:

 // Create Cypher query
 val allCountries = Cypher("start n=node(*) where n.type = 'Country' return n.code as code, n.name as name")

 // Transform the resulting Stream[CypherRow] to a List[(String,String)]
 val countries = allCountries.apply().map(row => 
   row[String]("code") -> row[String]("name")
 ).toList

Я пытаюсь использовать тот же подход, чтобы получить путь с помощью следующего запроса Cypher:

MATCH p = (n {id: 'n5'})-[*]-(m) RETURN p;

Тем не менее, при запуске этого кода:

Cypher("MATCH p = (n {id: 'n5'})-[*]-(m) RETURN p;")().map {row  =>
  println(row[Option[org.anormcypher.NeoRelationship]]("p"))
}

Я получаю исключение (см. Ниже). Как получить информацию о пути от CypherRow в этом случае?

 Exception in thread "main" java.lang.RuntimeException: TypeDoesNotMatch(Unexpected type while building a relationship)
    at org.anormcypher.MayErr$$anonfun$get$1.apply(Utils.scala:21)
    at org.anormcypher.MayErr$$anonfun$get$1.apply(Utils.scala:21)
    at scala.util.Either.fold(Either.scala:97)
    at org.anormcypher.MayErr.get(Utils.scala:21)
    at org.anormcypher.CypherRow$class.apply(AnormCypher.scala:303)
    at org.anormcypher.CypherResultRow.apply(AnormCypher.scala:309)
    at bigdata.test.n4j.Simple$$anonfun$main$1.apply(Simple.scala:31)
    at bigdata.test.n4j.Simple$$anonfun$main$1.apply(Simple.scala:29)
    at scala.collection.immutable.Stream.map(Stream.scala:376)
    at bigdata.test.n4j.Simple$.main(Simple.scala:29)

1 ответ

Решение

Пути в Cypher были изменены с 2.0, поэтому вы не можете легко работать с ними напрямую, поскольку они не являются коллекциями. Вероятно, в AnormCypher должен быть новый тип Path, но сейчас вы можете использовать пути вместе с relationships() или же nodes(),

Например, вы можете сделать это, чтобы извлечь отношения:

Cypher("MATCH p = (n {id: 'n5'})-[*]-(m) RETURN relationships(p);")().map {row  =>
  println(row[Seq[NeoRelationship]]("relationships(p)"))
}
Другие вопросы по тегам