1

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

在 Cypher 语句中,是否可以按 H 属性值对 G 节点进行分组,并在每个节点之间创建关系 HR 成为同一组?知道每个组的大小在 2 和 10 之间,并且对于大约 50k 个 G 节点,我拥有超过 15k 个这样的组(15k 个不同的 H 值)。

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

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 个节点在它们之间通过一个新的 : PRECEDES 关系,这样我们就可以更容易更快地找到给定集合上的下一个节点 N。

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

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

任何帮助将不胜感激。

4

2 回答 2

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;
于 2013-08-26T18:08:29.460 回答
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 。

于 2013-08-17T18:58:19.437 回答