我正在尝试在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之间创建关系,从而生成相同信息的多个副本。
是否有表示一次指定一个节点?如果您认为有比上述更好的方法,请与我分享。谢谢!
答案 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)"
}
]
}
import json
json.dumps({'data':[{'name1':'Jack', 'name2':'Sara', 'points':0.3},{'name1':'Jack', 'name2':'Sam', 'points':0.4}]})