代码之家  ›  专栏  ›  技术社区  ›  lapots

如果返回节点具有特定类型,则执行其他匹配

  •  1
  • lapots  · 技术社区  · 6 年前

    我有一个像这样的模型

    enter image description here

    推荐 cypher 查询返回关系 quest -> boots

    MATCH (w:Armor)<-[:WEARS]-(p:Player)
    MATCH (w)-[:PART_OF]->(set:ArmorSet)
    MATCH (missing)-[:PART_OF]->(set)
    MATCH (missing)<--(anything)
    WHERE NOT (p)-[:WEARS]->(missing)
    RETURN missing, anything
    

    但是如何调整此查询以返回 NPC boots 任务的回报是什么?基本上我想检查节点是否为 quest 输入,然后我应该返回 npc

    2 回复  |  直到 6 年前
        1
  •  2
  •   ThirstForKnowledge    6 年前

    原始答案

    创建图形

    CREATE
      (player:Player {name: 'Player'}),
      (shield:Armor {name: 'Shield'}),
      (armor:Armor {name: 'Armor'}),
      (gauntlets:Armor {name: 'Gauntlets'}),
      (boots:Armor {name: 'Boots'}),
      (helmet:Armor {name: 'Helmet'}),
      (dragonSet:ArmorSet {name: 'Dragon Set'}),
      (quest1:Quest {name: 'Quest I'}),
      (quest2:Quest {name: 'Quest II'}),
      (npc1:Npc {name: 'NPC I'}),
      (npc2:Npc {name: 'NPC II'}),
      (player)-[:WEARS]->(shield)-[:PART_OF]->(dragonSet),
      (player)-[:WEARS]->(armor)-[:PART_OF]->(dragonSet),
      (player)-[:WEARS]->(gauntlets)-[:PART_OF]->(dragonSet),
      (npc1)-[:PROVIDES]->(quest1)-[:REWARDS]->(boots)-[:PART_OF]->(dragonSet),
      (npc2)-[:PROVIDES]->(quest2)-[:REWARDS]->(helmet)-[:PART_OF]->(dragonSet);
    

    第2行到第12行创建节点,而第13行到第17行建立节点之间的关系。

    graph2

    解决方案

    MATCH
      (player:Player)-[:WEARS]->(armor:Armor)-[:PART_OF]->(dragonSet:ArmorSet),
      (missing)-[:PART_OF]->(dragonSet)
      WHERE NOT (player)-[:WEARS]->(missing:Armor)
    WITH DISTINCT missing
    MATCH (npc:Npc)-[:PROVIDES]->(quest:Quest)-[:REWARDS]->(missing)
    RETURN npc.name AS npcName, quest.name AS questName, missing.name AS missingArmorName;
    

    解释

    • 第2行定义了模式“A” Player Armor ,这是 ArmorSet ".
    • missing 戴着失踪的帽子 “在第4行

    Neo4j developers manual, WITH clauses chapter )

    • 第6行显示已识别的缺失 让我们取回 Quest 提供 Npc

    结果

    ╒═════════╤═══════════╤══════════════════╕
    │"npcName"│"questName"│"missingArmorName"│
    ╞═════════╪═══════════╪══════════════════╡
    │"NPC II" │"Quest II" │"Helmet"          │
    ├─────────┼───────────┼──────────────────┤
    │"NPC I"  │"Quest I"  │"Boots"           │
    └─────────┴───────────┴──────────────────┘
    

    盔甲 探索 只是,我们必须给你们的型号加上一个标签 Monster RANDOM_DROPS .

    CREATE
      (player:Player {name: 'Player'}),
      (shield:Armor {name: 'Shield'}),
      (armor:Armor {name: 'Armor'}),
      (gauntlets:Armor {name: 'Gauntlets'}),
      (boots:Armor {name: 'Boots'}),
      (helmet:Armor {name: 'Helmet'}),
      (dragonSet:ArmorSet {name: 'Dragon Set'}),
      (quest1:Quest {name: 'Quest I'}),
      (quest2:Quest {name: 'Quest II'}),
      (npc1:Npc {name: 'NPC I'}),
      (npc2:Npc {name: 'NPC II'}),
      (monster1:Monster {name: 'Monster I'}),
      (monster2:Monster {name: 'Monster II'}),
      (player)-[:WEARS]->(shield)-[:PART_OF]->(dragonSet),
      (player)-[:WEARS]->(armor)-[:PART_OF]->(dragonSet),
      (player)-[:WEARS]->(gauntlets)-[:PART_OF]->(dragonSet),
      (npc1)-[:PROVIDES]->(quest1)-[:REWARDS]->(boots)-[:PART_OF]->(dragonSet),
      (npc2)-[:PROVIDES]->(quest2)-[:REWARDS]->(helmet)-[:PART_OF]->(dragonSet),
      (monster2)-[:RANDOM_DROPS]->(boots),
      (monster1)-[:RANDOM_DROPS]->(gauntlets),
      (monster1)-[:RANDOM_DROPS]->(shield),
      (monster1)-[:RANDOM_DROPS]->(armor);
    

    graph3

    解决方案

    MATCH
      (player:Player)-[:WEARS]->(armor:Armor)-[:PART_OF]->(dragonSet:ArmorSet),
      (missing)-[:PART_OF]->(dragonSet)
      WHERE NOT (player)-[:WEARS]->(missing:Armor)
    WITH DISTINCT missing
    MATCH (npc:Npc)-[:PROVIDES]->(quest:Quest)-[:REWARDS]->(missing)
      WHERE NOT (:Monster)-[:RANDOM_DROPS]->(missing)
    RETURN npc.name AS npcName, quest.name AS questName, missing.name AS missingArmorName;
    

    ╒═════════╤═══════════╤══════════════════╕
    │"npcName"│"questName"│"missingArmorName"│
    ╞═════════╪═══════════╪══════════════════╡
    │"NPC II" │"Quest II" │"Helmet"          │
    └─────────┴───────────┴──────────────────┘
    
        2
  •  0
  •   Tezra    6 年前

    这个 coalesce Neo4j中的函数可用于压缩多个变量,以使用最相关的非空值。

    MATCH (w:Armor)<-[:WEARS]-(p:Player)
    MATCH (w)-[:PART_OF]->(set:ArmorSet)
    MATCH (missing)-[:PART_OF]->(set)
    MATCH (missing)<--(anything)
    WHERE NOT (p)-[:WEARS]->(missing)
    OPTIONAL MATCH (anything)<-[:GIVES]-(source)
    RETURN missing, coalesce(source, anything) as source