从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.
我希望这种语言可以允许更新大量的节点/关系来操纵它们的属性。
非常感谢任何帮助。
答案 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。