запрос gremlin для загрузки файла CSV с выбранным столбцом

Я использую следующий скрипт в gremlin для создания графика с помощью файла csv:

graph = TinkerGraph.open()
graph.createIndex('userId', Vertex.class) //(1)
g = graph.traversal()
getOrCreate = { id ->
 g.V().has('userId', id).tryNext().orElseGet{ g.addV('userId', id).next() }
}
 new File('wiki-Vote.txt').eachLine 
 { 
 if (!it.startsWith("#")){ 
 l->p=it.split(',').collect(getOrCreate) //(2)**
 (fromVertex, toVertex) = (s[0],s[1])
   fromVertex.addEdge('votesFor', toVertex) } }

как мы видим в этом запросе, см. строку

l>p=it.split(',').collect(getOrCreate)

в этой строке строки файла CSV разделяются на основе разделителя "", затем вызывается функция метода getOrCreate для применения индексации к собранным вершинам.

если я дам g.V (). count (), он подсчитывает все значения во всех столбцах. но мне нужно добавить только выбранные столбцы в вершину.

что мне нужно: я хочу применить метод getOrCreate только к выбранным столбцам вместо применения ко всем столбцам

например: если CSV-файл имеет имя, возраст, идентификатор, помечает столбцы. Я хочу применить метод getOrCreate только к столбцам имени и возраста и добавить их в вершину. если я дам g.V (). count () ... он должен дать мне только имя и возраст


person Arundhathi D    schedule 06.02.2017    source источник
comment
Ваш код будет намного более читабельным с лучшим отступом и лучшими именами переменных (не используйте односимвольные имена переменных)   -  person glenn jackman    schedule 06.02.2017


Ответы (1)


Приведенный вами пример выглядит как пример из Степень десяти сообщение в блоге о массовой загрузке. Сообщение в блоге представляет собой небольшое упрощение концепции загрузки CSV, чтобы передать мысль о том, что простой скрипт Groovy - лучший способ загружать небольшие графы. Логика также довольно жестко привязана к данным вики-сообщения, которые представляют собой крайний список, состоящий только из идентификаторов пользователей.

Если у вас есть более сложный набор логики для загрузки или CSV-файл, который содержит больше столбцов, чем вы хотите загрузить, тогда вам нужно будет расширить отправную точку, представленную в сообщении блога. Как вы это делаете, зависит от структуры вашего CSV-файла. Предположим, что это по-прежнему просто список ребер, как и данные wikivote, но у вас просто больше столбцов для пары вершин ребер в списке ребер:

getOrCreate = { id,name,age ->
  def p = g.V('userId', id)
  if (p.hasNext()) ? p.next() : g.addVertex([userId:id, userName:name, userAge:age])
}

new File('wiki-Vote.txt').eachLine {
  if (!it.startsWith("#")){
    def row = it.split('\t')
    def fromVertex = getOrCreate(row[0],row[1],row[3])
    def toVertex = getOrCreate(row[5],row[6],row[8])
    fromVertex.addEdge('votesFor', toVertex)
  }
}

g.commit()

Поэтому вместо волшебства Groovy для разложения строки файла CSV на вершины мы просто разбиваем строку на список столбцов. Затем мы вызываем getOrCreate для «fromVertex» и «toVertex» только с теми столбцами, которые нам нужны (я сделал предположения о том, как структурированы ваши данные, поэтому, надеюсь, вы понимаете, что я смог игнорировать определенные столбцы в этом коде ). Если ваш CSV-файл значительно сложен, вы можете подумать о том, чтобы получить некоторую помощь от groovycsv, который действительно хорошая библиотека синтаксического анализа и может немного упростить ваш код.

Обратите внимание, что этот код (и сообщение в блоге) были основаны на коде для TinkerPop 2.x и Titan 0.5.x. Очевидно, что синтаксис Gremlin для addVertex придется скорректировать для TinkerPop 3.x, если вам это нужно.

person stephen mallette    schedule 06.02.2017