从文件加载时,如果我这样做:
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
答案 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。