【问题标题】:Creating unique relationship property in a FOREACH in neo4j在 Neo4j 的 FOREACH 中创建唯一的关系属性
【发布时间】:2014-11-26 13:15:58
【问题描述】:

我正在尝试在 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 中的所有节点并创建巴黎之间的关系,从而产生相同信息的多个副本。

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

【问题讨论】:

  • range(10) 是一个无效的函数调用,您从哪里获得 {score_list} 以及其中有什么?
  • range (0,10) 实际上是它在代码中的使用方式。以上仅为演示,如有混淆请见谅。 {score_list} 是一个用大括号表示的参数。

标签: foreach neo4j py2neo


【解决方案1】:

最简单的方法是将要导入的数据导出到 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}]})

【讨论】:

  • 这是非常好的建议。但是,有一件事是您建议如何创建“语句”数据结构?我的数据在我的 python 程序中作为列表返回。为了实现您的 UNWIND 技巧,数据是否必须像上面那样采用字典格式?谢谢。
  • 不是很懂python,但是应该有办法从嵌套的数据结构中创建json。如果你有一个带有单个键 data 的字典,其值是字典数组,你应该没问题。
  • 其实很简单,看我上面的更新答案
  • 太棒了!谢谢!这将使代码看起来更好。
猜你喜欢
  • 1970-01-01
  • 2013-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多