在neo4j中的FOREACH中创建唯一的关系属性

时间:2014-11-26 13:15:59

标签: foreach neo4j py2neo

我正在尝试在python中完成一些非常简单的事情,但在Neo4j中并非如此。 我很感激任何评论和建议,以改善程序!

在Python脚本中,我试图为每对两个节点创建一个关系及其属性。从数据分析(不是csv文件),我最终得到一个包含三列的数据框如下:

name1    name2    points
===========================
Jack     Sara     0.3
Jack     Sam      0.4
Jack     Jill     0.2
Mike     Jack     0.4
Mike     Sara     0.5    
...

从这一点来说,我想为人们创建所有节点:Jack,Sara,Sam,Mike等,以及他们与房产名称点的关系。

首先,我尝试匹配所有节点,然后使用“FOREACH”一次更新一个关系属性。

tx = graph.cypher.begin()
qs2 = "MATCH (p1:person {name:"Jack"}), (p2:person) 
       WHERE p2.name IN ["Sara","Jill","Mike"] 
       FOREACH (r IN range(10) | 
         CREATE (p1)-[:OWES TO {score:{score_list}[r]}]->(p2))"

以上陈述不会返回我的预期。它不是将一个节点与另一个节点匹配,而是调用p2中的所有节点并在paris之间创建关系,从而生成相同信息的多个副本。

是否有表示一次指定一个节点?如果您认为有比上述更好的方法,请与我分享。谢谢!

1 个答案:

答案 0 :(得分:3)

最简单的方法是将要导入的数据导出到csv文件中,然后在cypher中使用LOAD CSV命令。

LOAD CSV WITH HEADERS FROM <url> AS csvLine
MATCH (p1:Person {name:csvLine.name1}), (p2:Person {name:csvLine.name2})
CREATE (p1)-[:OWES_TO {score:csvLine.points}]->(p2)

如果您无法使用该方法,则可以使用transactional http endpoint使用参数化的Cypher语句。该参数是包含数据结构数组的单个元素映射。在http级别,请求正文如下所示:

{
   "statements": [
       {
           "parameters": {
               "data": [
                   {
                       "name1": "Jack", "name2": "Sara", "points": 0.3 
                   }, 
                   {
                       "name1": "Jack", "name2": "Sam", "points": 0.4
                   }, 
                   {
                       "name1": "Jack", "name2": "Jill", "points": 0.2
                   }  // ...
               ]
           }, 
           "statement": "UNWIND {data} AS row     
                         MATCH (p1:Person {name:row.name1}), (p2:Person {name:row.name2})
                         CREATE (p1)-[:OWES_TO {row.points}]->(p2)"
       }
   ]
}

关于以下评论的更新

问:如何从pyhton创建参数? 答:使用python json模块

import json
json.dumps({'data':[{'name1':'Jack', 'name2':'Sara', 'points':0.3},{'name1':'Jack', 'name2':'Sam', 'points':0.4}]})