使用一个Cypher查询,在具有相同属性值的节点之间创建关系

时间:2013-08-17 14:39:46

标签: neo4j cypher

从Neo4j 1.9.2开始,并使用Cypher查询语言,我想在具有共同特定属性值的节点之间创建关系。 我有一组节点G具有属性H,G节点之间当前没有任何关系。

在Cypher声明中,是否可以通过H属性值对G节点进行分组,并在每个节点之间建立关系HR成为同一个组?知道每个组的大小在2& 2之间。 10,我拥有超过15k的这类组(15k不同的H值),用于大约50kG的节点。

我在努力管理此类查询时却没有找到正确的语法。以下是一个小样本数据集:

create 
(G1 {name:'G1', H:'1'}),
(G2 {name:'G2', H:'1'}),
(G3 {name:'G3', H:'1'}),

(G4 {name:'G4', H:'2'}),
(G5 {name:'G5', H:'2'}),
(G6 {name:'G6', H:'2'}),
(G7 {name:'G7', H:'2'})
return * ;

最后,我想要这样的关系:

G1-[:HR]-G2-[:HR]-G3-[:HR]-G1

G4-[:HR]-G5-[:HR]-G6-[:HR]-G7-[:HR]-G4

在另一种情况下,我可能想要使用/比较一些属性来大量更新节点之间的关系。想象一下N型节点和M型节点,其中N个节点与M相关,其关系名为:IS_LOCATED_ON。位置的顺序可以存储为N个节点的属性(N.relativePosition从1到MAX_POSITION为Long),但我们可能需要稍后更新图模型这样一种方式:使N个节点在它们之间通过new连接: PRECEDES关系,这样我们就可以在给定集合上找到更容易,更快的下一个节点N.

我希望这种语言可以允许更新大量的节点/关系来操纵它们的属性。

  • 不可能吗?
  • 如果没有,是计划还是计划?

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:2)

由于您提供的数据中没有任何内容可以获得排名,因此我使用了收藏品 得到一个如下:

START 
    n=node(*), n2=node(*) 
WHERE 
    HAS(n.H) AND HAS(n2.H) AND n.H = n2.H
WITH n, n2 ORDER BY n2.name
WITH n, COLLECT(n2) as others
WITH n, others, LENGTH(FILTER(x IN others : x.name < n.name)) as rank
RETURN n.name, n.H, rank ORDER BY n.H, n.name;

在此基础上,您可以开始确定关系

START 
    n=node(*), n2=node(*) 
WHERE 
    HAS(n.H) AND HAS(n2.H) AND n.H = n2.H
WITH n, n2 ORDER BY n2.name
WITH n, COLLECT(n2) as others
WITH n, others, LENGTH(FILTER(x IN others : x.name < n.name)) as rank
WITH n, others, rank, COALESCE(
    HEAD(FILTER(x IN others : x.name > n.name)),
    HEAD(others)
    ) as next
RETURN n.name, n.H, rank, next ORDER BY n.H, n.name;

最后(稍微更精简)

START 
    n=node(*), n2=node(*) 
WHERE 
    HAS(n.H) AND HAS(n2.H) AND n.H = n2.H
WITH n, n2 ORDER BY n2.name
WITH n, COLLECT(n2) as others
WITH n, others, COALESCE(
    HEAD(FILTER(x IN others : x.name > n.name)),
    HEAD(others)
    ) as next
CREATE n-[:HR]->next
RETURN n, next;

答案 1 :(得分:0)

你可以这样做,也许在你的人际关系中指明方向:

CREATE 
  (G1 { name:'G1', H:'1' }),
  (G2 { name:'G2', H:'1' }),
  (G3 { name:'G3', H:'1' }),
  (G4 { name:'G4', H:'2' }),
  (G5 { name:'G5', H:'2' }),
  (G6 { name:'G6', H:'2' }),
  (G7 { name:'G7', H:'2' }), 
  G1-[:HR]->G2-[:HR]->G3-[:HR]->G1, 
  G4-[:HR]->G5-[:HR]->G6-[:HR]->G7-[:HR]->G1

有关示例,请参阅http://console.neo4j.org/?id=ujns0x