我试图在 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 之间的关系,从而产生相同信息的多个副本。
是否有一种符号可以一次指示一个节点?如果您认为有比上述更好的方法,请与我分享。谢谢!
最佳答案
最简单的方法是将要导入的数据导出到 csv 文件中,然后使用 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 创建参数? A:使用python json模块
import json
json.dumps({'data':[{'name1':'Jack', 'name2':'Sara', 'points':0.3},{'name1':'Jack', 'name2':'Sam', 'points':0.4}]})
关于foreach - 在 neo4j 的 FOREACH 中创建唯一的关系属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27150249/