代码之家  ›  专栏  ›  技术社区  ›  NeoZoom.lua

一个很难模仿double-for-loop的Neo4j问题?

  •  0
  • NeoZoom.lua  · 技术社区  · 5 年前

    我有三种类型的节点: me (一个节点), myFriend , friendOfFriend ,我想:

    1. 创建之间的关系 myFriend 其中我们有两个相同值的属性。
    2. 创建之间的关系 friend 朋友的朋友 其中它们有两个相同值的属性,但是 朋友的朋友 应排除 .
    3. 创建之间的关系 朋友的朋友 其中我们有两个值相同的属性,但是 朋友的朋友 应排除 朋友 .

    我是neo4j的新手,我发现文档很难阅读,而且提供的信息很少/关于如何使用基本工具的例子,相反,它在广告上冗长地说“是的,我们很好,请资助我们”。无论如何,让我们看看我的需求的伪代码版本:

    match (me) where me.a1="Rain"
    
    for i in range(all_nodes):
        CONSTANT_ME = [me.a2, me.a3]  #  <------- How to #1
        if i.a2 in CONSTANT_ME:
            # create friend relationship between me and i.
    
    for i in range(friend):
        CONSTANT_FRIEND = [friend.a2, friend.a3]
        for j in range(friend):
            if j.a2 in CONSTANT_FRIEND
            AND j.a3 in CONSTANT_FRIEND:
                # create FF relationship between node i and j
    

    我想把以上内容写在 Neo4j 的Cypher langauge,我尝试过的是:

    MATCH (me:Classmate), (c:Classmate)
    WHERE ID(me) < ID(c)
    AND me.a1="Rain" AND c.a1<>"Rain"
    AND ANY(x in [me.a2, me.a3] WHERE x in [c.a2, c.a3])
    CREATE (me)-[:friend]->(c);
    
    MATCH (c1:Classmate), (c2:Classmate)
    WHERE ID(c1) < ID(c2)
    AND c1.a1<>"Rain" AND c2.a1<>"Rain"
    AND ANY(x in [c1.a2, c1.a3] WHERE x in [c2.a2, c2.a3])
    CREATE (c1)-[:friendOfFriend]->(c2);
    
    MATCH (me:Classmate), (c2:Classmate)
    WHERE ID(me) < ID(c2)
    AND c1.a1="Rain" AND c2.a1<>"Rain"
    AND ANY(x in [me.a2, me.a3] WHERE x in [c2.a2, c2.a3])
    CREATE (me)-[:meFF]->(c2);
    

    正如你所看到的,这是非常冗长的,我无法阻止:

    • 重复代码错误: [me.a2, me.a3] 被声明了两次。
    • 我无法阻止创建 [:meFF] 到一个已经 [:friend] 具有 .

    最后,有人推荐一些关于Neo4j的好教程吗?它教授了如何解决我遇到的这个问题的基本组成?

    0 回复  |  直到 5 年前
        1
  •  0
  •   David A Stumpf    5 年前

    你必须学会以不同的方式思考。图表改变你的世界观!

    我、我的朋友和我朋友的朋友都是人。因此,您希望一个节点标签和三个节点链接在一起。试试这个

    create (p1:Person{name:'Me'})
    create (p2:Person{name:'My Friend'})
    create (p3:Person{name:'Friend of my Friend'})
    merge (p1)-[r1:friend]-(p2)
    merge (p2)-[r2:friend]-(p3)
    

    然后

    match p=(a:Person{name:'Me'})-[r:friend*0..5]->(b:Person) return p