如何使用Cypher语言从查询结果创建唯一节点

时间:2016-12-17 20:58:37

标签: graph neo4j cypher

我正在尝试创建一个指向它的挤压的单个节点,来自下面的查询结果:

MATCH (e:EXP)-[s:Was_selected]->
      (g:GNE)-[p:Has_interaction]-(h:GNE)-
      [:Was_clusterized]-(c:CLUSTER)-
      [:Was_represented]-(b:BP) 
WHERE p.combined_score > 800 
WITH DISTINCT g, COUNT(distinct h) AS score WHERE score > 50
CREATE (g)-[:AS_HUBS]->(HUBS)
RETURN g

但结果是每个g(GNE)的一个类型为HUB的节点。

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

您的查询非常复杂,所以让我们为实验创建一个更简单的示例:

CREATE
  (a1:A {name: 'a1'}),
  (a2:A {name: 'a2'})

要在两个节点之间创建集线器,我们使用以下查询:

MATCH (a:A)
WITH collect(a) AS as
CREATE (hub:Hub {name: 'hub'})
WITH as, hub
UNWIND as AS a
CREATE (hub)<-[:AS_HUBS]-(a)
RETURN *

这将为所有Hub个节点创建单个A。说明:我们collect将结果添加到单行(到列表中),创建单个Hub,然后UNWIND该行并为每个A节点创建关系。

enter image description here

如果我们根据您的用例调整方法,我们会得到以下查询:

MATCH (e:EXP)-[s:Was_selected]->
      (g:GNE)-[p:Has_interaction]-(h:GNE)-
      [:Was_clusterized]-(c:CLUSTER)-
      [:Was_represented]-(b:BP) 
WHERE p.combined_score > 800 
WITH DISTINCT g, COUNT(distinct h) AS score
WHERE score > 50
WITH collect(g) AS gs
CREATE (hub:Hub {name: 'hub'})
WITH gs, hub
UNWIND gs AS g
CREATE (g)-[:AS_HUBS]->(hub)
RETURN *