当前位置: 首页 > 知识库问答 >
问题:

使用一个密码查询在具有相同公共属性值的节点之间创建关系

毛德曜
2023-03-14

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

在Cypher语句中,是否可以按H属性值对G节点进行分组,并在成为同一组的每个节点之间创建关系HR?知道每个小组的人数在2人之间

我一直在努力管理这样的查询,但没有找到正确的语法。下面是一个小样本数据集:

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_location_ON。位置的顺序可以存储为N个节点的属性(N.relativePosition从1到MAX_POSITION的长度为N),但我们可能需要稍后更新图形模型,以便通过新的:Prefers关系将N个节点链接在它们之间,这样我们就可以在给定集上更容易、更快地找到下一个节点N。

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

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

任何帮助将不胜感激。

共有2个答案

程项禹
2023-03-14

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

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举个例子。

归翔
2023-03-14

由于您提供的数据中没有用于获取排名的内容,因此我使用了集合来获取排名,如下所示:

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;
 类似资料:
  • 我需要在所有具有相同属性值的节点之间创建关系。 例如,我可以使用以下查询: 但是如果我有大约200K的节点,这个脚本运行的时间相当长。 有没有其他更快的方法来建立这样的关系? 谢谢

  • 我正在创建一个简单的社交图,用户可以在其中创建一个帖子,标记它,并对它进行评论。我用py2neo做模型。该模型具有和作为节点。用户在上、或。在我的例子中,单个用户可以在单个上创建多个或(就像其他任何社交网络一样)。根据我的模型,这需要多个或关系,但具有不同的属性。模型是这样建立的: 我运行以下操作来构建图形: 我希望有两个关系,如下所示: 但我看到事实并非如此: 那么,我的问题是双重的。(1)可以

  • 我有以下图表: 我正在寻找一种方法来计算从a发送到b和从b发送到c/d的金额之间的差异,这取决于referenceId,但不使用特定的referenceId。 所以我在寻找像下面这样的半代码: 有人知道我该怎么做吗?

  • 我是新4J的新手。 (Node1)-[Rel1]->(Node3) (每个节点和发布在'Rights'属性中都有'admin'字符串。) 如果用户具有正确的'user',则路径应为: (Node1)-[Rel2]-(Node2)-[Rel3]-(Node3) (因为Rel1关系在“Rights”属性中没有“user”字符串。) 谢了。

  • 人员节点: 名字 姓氏 地址 电子邮件 电话号码 公司节点: 姓名 地址 电子邮件 电话号码 关系: 个人-[配偶]- 个人和实体: 当我为简创建一个人时,我也添加了与约翰的兄弟姐妹关系。 运行检索节点Jane和对应的同级节点John。 但是,手足关系应该是双向的。运行仅检索节点John。 这就是问题所在。我可以在约翰和简之间添加另一种兄弟姐妹关系。但是,这实际上在两者之间创建了一个无限循环。以及

  • 我现在的解决办法是先保存所有的ArchitectureUnitState节点,从数据库中再次检索它们,将一个节点映射到另一个节点,然后再次保存它。这样,可以创建关系,但我需要保存两次。