【问题标题】:Cypher query to find difference between sets of related nodes密码查询以查找相关节点集之间的差异
【发布时间】:2015-07-01 15:59:03
【问题描述】:

我正在使用 Neo4J 存储一些夜间自动化测试的测试结果。我有代表可以运行的测试的节点(:Test),代表一组测试的运行的节点(:Run)。每个 (:Run) 都与现有的 (:Test) 节点有关系,以指示“PASS”或“FAIL”,即:

http://console.neo4j.org/?id=9hj4w4

我希望能够构造一个密码查询,它可以查看两个 (:Run) 节点并返回它们之间的差异——具体确定它们之间不同的 (:Test) 节点,并指出关系(通过/失败)这些差异。

我知道它可以在 Neo4J 之外完成,但我希望找到一种解决方案,在 Neo4J 中完成尽可能多的工作。

【问题讨论】:

  • 您的示例数据没有任何测试结果不同的实例。这是故意的吗?
  • 糟糕——你是对的。不打算。由于各种原因,我一直不得不重新创建我的示例,并且似乎最后一个版本有太多的剪切和粘贴。我原本打算让至少其中一个结果有所不同。

标签: neo4j cypher


【解决方案1】:

假设您对 Run1 和 Run2 之间的测试差异感兴趣。你可以这样做:

MATCH (a:Run)-[x]->(t:Test)<-[y]-(b:Run)
WHERE a.name = "Run1" AND b.name = "Run2" AND TYPE(x) <> TYPE(y)
RETURN a.name, TYPE(x), t.name, TYPE(y), b.name
ORDER BY t.name;

不幸的是,您的示例数据没有任何实例(在任何两次运行之间)相同的测试有不同的结果。我制作了一个新的示例数据集,以便我们实际得到结果:http://console.neo4j.org/?id=wlx859

【讨论】:

  • 您的查询不会返回一次运行根本没有连接到测试的情况,对吧?仅当两者都连接时。
  • @MartinPreusse 是的。但这似乎不是OP所要求的。仅用于通过/失败的差异。
  • 也许吧。我考虑了一段时间,并没有想出一个很好的方法来获得这些结果。不过只是好奇。
【解决方案2】:

试穿它的尺寸。
基本上匹配每个测试的路径,并且可以选择匹配另一个运行的相同测试,然后比较关系类型(在这种情况下通过与失败)并输出不同的测试。

这里是控制台borrowed the data from Nicole的链接

MATCH p1 =(a1:Run { name:'Run2' })-[r1]->(t1:Test)
OPTIONAL MATCH p2=(a2:Run { name:'Run1' })-[r2]-(t1)
WITH type(head(relationships(p1))) AS lbl1,type(head(relationships(p2))) AS lbl2, t1
WHERE lbl2 IS NULL OR  lbl1 <> lbl2
RETURN 'Test result mismatched on test: ' + t1.name

一个注释。在后者有更多测试的情况下,当您询问 run1 vs run2 和 run2 vs run1 的反向时,结果会有所不同

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-16
    • 2021-12-27
    • 2014-01-09
    • 1970-01-01
    • 1970-01-01
    • 2017-09-20
    相关资源
    最近更新 更多