在从 UNWIND 列表创建的节点之间创建关系
Create relationship between nodes created from UNWIND list
我正在将 List<Map<String, Object>>
传递给 Cypher 查询,我正在使用它根据 Map<String, Object>
.
中包含的键值对创建一系列节点
我现在希望能够 link 这些节点,按照它们展开的顺序。
当前cypher/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 能做到这一点
使用apoc.coll.pairsMin
您可以提取成对的相邻节点属性:https://neo4j.com/labs/apoc/4.0/data-structures/collection-list-functions/
所以在他们的例子中,
apoc.coll.pairsMin([1,2,3]) YIELD value
returns:
[[1,2],[2,3]]
因此,为了将其付诸实践,link 从地图列表创建相邻的节点对,我创建了一个类似于您的 $nodeProperties 的列表,并link编辑了它们:
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 *
您可以使用 UNWIND 创建 linked 节点。首先为您的 nodeProperties 列表创建节点,然后创建 NEXT_EVENT 关系。
下面的查询将在您的列表 $nodeProperties 中创建一个节点 1 linked 到节点 2。 UNWIND 将创建另一个索引号列表,从 0 到结束(最后一项除外)。然后根据名称(假设你的节点主键是名称)合并(或匹配,如果它存在)节点。然后创建所需的关系:NEXT_EVENT。展开就像一个 FOR 循环,所以它将 link 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)
我正在将 List<Map<String, Object>>
传递给 Cypher 查询,我正在使用它根据 Map<String, Object>
.
我现在希望能够 link 这些节点,按照它们展开的顺序。
当前cypher/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 能做到这一点
使用apoc.coll.pairsMin
您可以提取成对的相邻节点属性:https://neo4j.com/labs/apoc/4.0/data-structures/collection-list-functions/
所以在他们的例子中,
apoc.coll.pairsMin([1,2,3]) YIELD value
returns:
[[1,2],[2,3]]
因此,为了将其付诸实践,link 从地图列表创建相邻的节点对,我创建了一个类似于您的 $nodeProperties 的列表,并link编辑了它们:
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 *
您可以使用 UNWIND 创建 linked 节点。首先为您的 nodeProperties 列表创建节点,然后创建 NEXT_EVENT 关系。
下面的查询将在您的列表 $nodeProperties 中创建一个节点 1 linked 到节点 2。 UNWIND 将创建另一个索引号列表,从 0 到结束(最后一项除外)。然后根据名称(假设你的节点主键是名称)合并(或匹配,如果它存在)节点。然后创建所需的关系:NEXT_EVENT。展开就像一个 FOR 循环,所以它将 link 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)