从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。
我希望这种语言可能允许更新操纵其属性的大量节点/关系。
任何帮助将不胜感激。
由于您提供的数据中没有任何要获得排名的数据,因此,我尝试使用集合来获得一个数据,如下所示:
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;
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句