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

问题描述 投票:0回答:1

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

csv groovy titan gremlin
1个回答
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 magic将CSV文件的一行分解为顶点,而是将行拆分为列列表。然后我们将getOrCreate称为“fromVertex”,将“toVertex”称为我们需要的列(我假设您的数据是如何构造的,所以希望您能够理解我能够忽略此代码中的某些列)。如果您的CSV文件非常复杂,您可能需要考虑从groovycsv获得一些帮助,这是一个非常好的解析库,可以帮助您简化代码。

请注意,此代码(和博客文章)基于TinkerPop 2.x和Titan 0.5.x的代码。显然,如果需要,必须针对TinkerPop 3.x调整“addVertex”的Gremlin语法。

© www.soinside.com 2019 - 2024. All rights reserved.