使用带标题的neo4j加载csv:如何在合并中使用地图?

时间:2014-09-18 13:50:43

标签: csv neo4j

从文件加载时,如果我这样做:

 LOAD CSV WITH HEADERS FROM 'file:/Users/csv.dat' AS row RETURN row;

我找回了每一行的地图,例如:

+----------------------------------------------------------------------+
| row                                                                  |
+----------------------------------------------------------------------+
| {id -> "1", prop1 -> "foo1", prop2 -> "foo2"} |
| {id -> "2", prop1 -> "goo1", prop2 -> "goo2"} |
+----------------------------------------------------------------------+

现在有一种方法可以在MERGE中使用这些地图,所以我不必拼出所有属性,即:

LOAD CSV WITH HEADERS FROM 'file:/Users/csv.dat' AS row
MERGE (n:node {row} ) 
RETURN n;

显然neo4j不喜欢那种语法,但那就是我想要做的事情;然后我可以创建一个通用查询来构造不同类型的节点。

谢谢, M Hodges

2 个答案:

答案 0 :(得分:1)

我认为你需要明确你的节点属性,如下所示:

LOAD CSV WITH HEADERS FROM 'file:/Users/csv.dat' AS row
MERGE (n:node {prop1: row.prop1, prop2: row.prop2} ) 
RETURN n;

您还可以使用数组索引,即引用row[1]而不是row.prop1,以便您可以在CSV文件中讨论列。

但我不认为您可以进行通用查询,因为为了LOAD某些CSV,您必须提前知道有关格式的某些事情。我不确定是否可以使用CSV"元数据"从任何文件创建任意一组节点。

答案 1 :(得分:0)

感谢Frobber,我认为你是对的。所以我所做的就是编写一个实用程序来运行查询。我的应用程序有许多类型的实体从不同的文件加载。任务运行器打开每个csv文件,读取标题行,并构造一个属性字符串,然后将其插入查询,如下所示:

var query =  "LOAD CSV WITH HEADERS FROM 'file:{filename}' AS line ";
    query += "MERGE (n:node {properties}) RETURN n";
var sep='', keys = headerline.split(',');
var props = '{';
   for( var i=0; i<keys.length; i++){  props += sep + keys[i] + ':line.' + keys[i];   sep = ','; }  
props += '}';
query = query.replace(/\{properties\}/, props);
query = query.replace(/\{filename\}/, '/Users/me/csv.dat');

笨拙地重建像这样的地图,但是c&#39; est la vie。

相关问题