我在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()......它必须只给我姓名和年龄
答案 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语法。