密码逻辑门 -> 全部在哪里

问题描述 投票:0回答:1

我正在寻求有关创建逻辑门的语法的帮助。 enter image description here

我想确定哪些模拟人生、哪些门是打开的。

  • 门A:
    • 只需要事件1
    • 在 sim 1,2,3 中打开
  • b门:
    • 需要事件 1 和 2
    • 在 sim 2 和 3 中打开
  • C 门:
    • 需要事件1,2,3
    • 仅在SIM 3中打开

使用以下方式创建数据:

CREATE 
(a:Gate {name: 'gate a'}),
(b:Gate {name: 'gate b'}),
(c:Gate {name: 'gate c'}),
(x1:X {name: 'sim 1'}),(x2:X {name: 'sim 2'}), (x3:X {name: 'sim 3'}),
(e1:E {name: 'event 1'}),(e2:E {name: 'event 2'}), (e3:E {name: 'event 3'}),
(e1)-[:AND]->(a),
(e1)-[:AND]->(b),
(e2)-[:AND]->(b),
(e1)-[:AND]->(c),
(e2)-[:AND]->(c),
(e3)-[:AND]->(c),
(x1)-[:HAS]->(e1),
(x2)-[:HAS]->(e1),
(x2)-[:HAS]->(e2),
(x3)-[:HAS]->(e2),
(x3)-[:HAS]->(e1),
(x3)-[:HAS]->(e3)
neo4j cypher
1个回答
0
投票

假设您的数据库没有重复的

HAS
AND
关系(同一对节点之间),您可以:

  • 计算每个门的事件数量。
  • 创建从每个门的内部 ID 到其计数的映射 (
    gIdCountMap
    )。
  • 计算每个 sim/Gate 对的事件数量。
  • 仅保留事件计数等于同一门
    gIdCountMap
    中计数的 sim/门对。
  • 返回这样的对

例如(这也按 sim 对结果进行排序):

MATCH (e)-[:AND]->(g:Gate)
WITH ELEMENTID(g) as gId, COUNT(e) AS gEventCount
WITH apoc.map.fromPairs(COLLECT([gId, gEventCount])) AS gIdCountMap
MATCH (sim:X)-[:HAS]->(event)-[:AND]->(gate)
WITH sim, gate, gIdCountMap, COUNT(event) AS sgEventCount
WHERE gIdCountMap[ELEMENTID(gate)] = sgEventCount
RETURN sim, gate
ORDER BY sim

结果是:

╒════════════════════╤════════════════════════╕
│sim                 │gate                    │
╞════════════════════╪════════════════════════╡
│(:X {name: "sim 1"})│(:Gate {name: "gate a"})│
├────────────────────┼────────────────────────┤
│(:X {name: "sim 2"})│(:Gate {name: "gate a"})│
├────────────────────┼────────────────────────┤
│(:X {name: "sim 2"})│(:Gate {name: "gate b"})│
├────────────────────┼────────────────────────┤
│(:X {name: "sim 3"})│(:Gate {name: "gate a"})│
├────────────────────┼────────────────────────┤
│(:X {name: "sim 3"})│(:Gate {name: "gate b"})│
├────────────────────┼────────────────────────┤
│(:X {name: "sim 3"})│(:Gate {name: "gate c"})│
└────────────────────┴────────────────────────┘
© www.soinside.com 2019 - 2024. All rights reserved.