gremlin查询以使用所选列加载csv文件

时间:2017-02-06 06:04:17

标签: csv groovy titan gremlin

我在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文件有name,age,Id,则标记列。我想仅在名称和年龄列上应用getOrCreate方法,并将它们添加到顶点。 如果我给g.V()。count()......它必须只给我姓名和年龄

1 个答案:

答案 0 :(得分:3)

您提供的示例与Powers of Ten博客文章中关于批量加载的示例类似。该博客文章对CSV加载概念进行了一些过度简化,以表达简单的Groovy脚本是加载小图形的最佳方式。逻辑也与wikivote数据紧密相关,wikivote数据是仅具有用户标识符的边缘列表。

如果您有一组更复杂的加载逻辑或包含比您要加载的列数更多的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的代码。显然,如果需要的话,必须针对TinkerPop 3.x调整“addVertex”的Gremlin语法。