【问题标题】:create relationships between nodes in parallel并行创建节点之间的关系
【发布时间】:2013-08-08 18:28:12
【问题描述】:

使用 cypher 和 neo4j 2.0。

给定两组节点 ID(长度相等)和一组权重,我想在相应节点之间创建关系并将权重设置为属性。例如,如果我有以下三个列表:

node list 1: (101, 201, 301)  
node list 2: (102, 202, 302)
weights:     (0.1, 0.6, 0.25)

我想创建以下表示

 101 - knows {w : .1}  - 102
 201 - knows {w : .6}  - 202
 301 - knows {w : .25} - 302

但不是,例如,101 - knows - 302

我可以通过迭代我的参数然后创建单独的查询来做到这一点。 有没有办法批量运行它,将我的 lsits 作为参数传递并询问 cypher 按顺序匹配节点和属性?


我一度认为以下列方式使用参数会起作用,但它会创建关系的所有排列(如预期的那样)并作为 整个 权重列表作为属性分配给 每个关系。

{
    "query": 
       "START a1=node({starts}), a2=node({ends}) 
        CREATE UNIQUE a1-[r:knows {w : {weights}}]-a2 
        RETURN type(r), r.w, a1.name, a2.name",

    "params": {
        "starts"  : [101, 201, 301],
        "ends"    : [102, 202, 302],
        "weights" : [0.1, 0.6, 0.25]
    }
}

【问题讨论】:

    标签: cypher neo4j


    【解决方案1】:

    您的列表在现实生活中有多大? 我可能会一次发送三份。

    否则你应该能够使用集合和 foreach 来做你想做的事:

    START a1=node({starts}), a2=node({ends}) 
    FOREACH(w in filter(w in weights : head(w)=id(a1) AND head(tail(w))=id(a2)) :
      CREATE UNIQUE a1-[r:knows {w : last(w)}]-a2 
    )
    
    "params": {
            "starts"  : [101, 201, 301],
            "ends"    : [102, 202, 302],
            "weights" : [[101,102,0.1], [201,202,0.6], [301,302,0.25]]
    }
    

    【讨论】:

    • 迈克尔,谢谢你的回复。我的列表可以小到 1K,大到 50K。如果我理解正确,迭代我的查询而不是在一个查询中迭代是最有效的?
    • 是的,尤其是使用查询缓存的参数,并且可以一次发送多个查询(在一个事务中)(例如,通过 batch-rest-api、2.0 或 java 中的新事务端点-嵌入在一个 TX 中)。
    • 同样使用您的方法,您首先创建列表的交叉产品,然后必须再次对其进行过滤。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-23
    相关资源
    最近更新 更多