Получение значений записи из Neo4j Scala - PullRequest
0 голосов
/ 03 мая 2018

Я получил некоторые результаты запроса от Neo4j в виде массива [AnyRef]. Каждый элемент массива выглядит так:

Record<{group_name: "Amig@s & Friends", event_name: "Dia de Los muertos   Day of the dead", venue_name: "Dvorak Park (Pilsen)", distance: 2615.3793888968457}>

Вопрос в том, как я могу извлечь имя группы, имя события, имя места и расстояние в качестве полей, чтобы записать их в файл csv или создать кадр данных в Spark? Есть ли какой-нибудь метод для извлечения значений записей?

Вот мой код для запроса логики:

  def execNeo4jSearchQuery(neo4jSession: Session, data: Array[String]) = {
   val query1 = "MATCH (m:Member)-[mtg_r:MT_TO_MEMBER]->(mt:MemberTopics)-[mtt_r:MT_TO_TOPIC]->(t:Topic), (t1:Topic)-[tt_r:GT_TO_TOPIC]->(gt:GroupTopics)-[tg_r:GT_TO_GROUP]->(g:Group)-[h_r:HAS]->(e:Event)-[a_r:AT]->(v:Venue) WHERE mt.topic_id = gt.topic_id AND distance(point({ longitude: " + data(2) +  ", latitude: " + data(1) + "}),point({ longitude: v.lon, latitude: v.lat })) < 4000 AND mt.member_id = " + data(0) + " RETURN distinct g.group_name " +
      "as group_name, e.event_name as event_name, v.venue_name as venue_name, distance(point({ longitude: " + data(2) +  ", latitude: " + data(1) + "}),point({ longitude: v.lon, latitude: v.lat })) as distance"

    val results = neo4jSession.run(query1).list()
    val resultsArray = results
       .toArray()
       .map(_.toString)
       .foreach(println)
  }

1 Ответ

0 голосов
/ 03 мая 2018

Session.run возвращает StatementResult, позволяющее перебирать записи Record, поэтому они могут быть преобразованы по вашему желанию. Итак, вот несколько примеров.

Для записи в файл CSV:

// the fields to retrieve
val fieldsToRetrieve = Seq("group_name", "event_name", "venue_name")

// shortcut to produce a line in the CSV
def recordToCsv(rec: Record): String =
  fieldsToRetrieve.map(rec.get(_).asString()).mkString(",")

// execute the query and write into CSV
val queryResult = neo4jSession.run("[query]")

val writer = new PrintWriter("myFile.csv")
while(queryResult.hasNext) {
  val csvLine = recordToCsv(queryResult.next)
  writer.println(csvLine)
}
// don't forget to close the writer

Чтобы создать Spark DataFrame:

private val session: SparkSession = ...

import session.implicits._
import scala.collection.JavaConverters._ // necessary to convert Neo4j's list of Records

// the fields to retrieve
val fieldsToRetrieve = Seq("group_name", "event_name", "venue_name")

// shortcut to produce a sequence of values representing a row in a dataframe
def toRow(record: Record): Seq[String] =
  fieldsToRetrieve.map(record.get(_).asString())

// execute the query and push the results into a Spark dataframe
val df = neo4jSession.run("[query]").list().asScala
                     .map(toRow).toDF()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...