1

我正在传递一个 Cypher 查询 a List<Map<String, Object>>,我用它来创建一系列基于Map<String, Object>.

我现在希望能够按照它们展开的顺序将这些节点链接在一起。

当前密码/java代码:

public static void doMergeAndLink(List<Map<String, Object>> nodeProperties)
{
    try (Session session = driver.session())    
    {
        session.run("UNWIND $nodeProperties AS np " +
            "MERGE (n:Event {name:np.name, location: np.location, eventDate:np.eventDate}) "
        , parameters("nodeProperties",nodeProperties));
    }
    catch(Exception e){}
}

我现在想要的是能够添加MERGE (n)-[:NEXT_EVENT]->(n+1),但我不知道 Cypher 可以做到这一点

4

2 回答 2

2

使用apoc.coll.pairsMin您可以提取相邻节点属性对:https ://neo4j.com/labs/apoc/4.0/data-structures/collection-list-functions/

所以在他们的例子中,

apoc.coll.pairsMin([1,2,3]) YIELD value

返回:

[[1,2],[2,3]]

因此,为了将其付诸实践并链接从地图列表创建的相邻节点对,我创建了一个类似于您的 $nodeProperties 的列表,并将它们链接起来:

WITH [{a: "foo0", b: "bar0"}, {a: "foo1", b: "bar1"}, {a: "foo2", b: "bar2"}] as allNodes
WITH apoc.coll.pairsMin(allNodes) as nodePairs
UNWIND nodePairs as pair
MERGE (n0:Foo {name: pair[0].a, prop: pair[0].b})
MERGE (n1:Foo {name: pair[1].a, prop: pair[1].b})
MERGE (n0)-[:RELATION]-(n1)
RETURN *

连接在一起的节点

于 2022-01-27T11:27:04.483 回答
1

您可以使用 UNWIND 创建链接节点。首先为您的 nodeProperties 列表创建节点,然后创建 NEXT_EVENT 关系。

下面的查询将在您的列表 $nodeProperties 中创建一个链接到 node2 的 node1。UNWIND 将创建另一个从 0 到结束的索引号列表(最后一项除外)。然后根据名称合并(或匹配,如果存在)节点(假设您的节点主键是名称)。然后创建所需的关系:NEXT_EVENT。展开就像一个 FOR LOOP,因此它将 item1 链接到 item2,然后将 item2 链接到 item3 ...直到 item99 到 item100。

 WITH $nodeProperties AS np 
 UNWIND range(0, size(np) - 2) as idx
 MERGE (node1:Event {name:np[idx].name, location: np[idx].location, eventDate:np[idx].eventDate})
 MERGE (node2:Event {name:np[idx+1].name, location: np[idx+1].location, eventDate:np[idx+1].eventDate})
 CREATE (node1)-[:NEXT_EVENT]->(node2)
于 2022-01-27T17:21:12.107 回答