【问题标题】:Neo4j: Find all possible combinationsNeo4j:找到所有可能的组合
【发布时间】:2017-03-08 09:41:40
【问题描述】:

我目前正在努力解决有关组合学的问题。
对于原型,我想尝试 neo4j-ogm。

这是我目前设计的领域模型:

@NodeEntity
public class Operand {

    @GraphId
    private Long graphId;

}

@NodeEntity
public class Option extends Operand {

    private Long id;

    private String name;

    @Relationship(type = "CONDITIONED_BY")
    private List<Rule> rules = new ArrayList<>();
}

@NodeEntity
public class Operation extends Operand {

    @Relationship(type = "COMPOSITION", direction = Relationship.INCOMING)
    private Rule composition;

    private Operation superOperation;

    private Boolean not;

    private List<Operand> operands = new ArrayList<>();
}

public class AndOperation extends Operation {
// Relationships named accordingly "AND"
}


public class OrOperation extends Operation {
// Relationships named accordingly "OR"
}


@NodeEntity
public class Rule {

    @GraphId
    private Long graphId;

    @Relationship(type = "COMPOSITION")
    private Operation composition;

    @Relationship(type = "CONDITIONED_BY", direction = Relationship.INCOMING)
    private Option option;
}

这是我的图表的 sn-p:

表示类似(167079 ^ ...) &amp; (167155 ^ ...)

是否可以在密码中形成一个查询,从而产生所有可能的组合?

167079, 167155
167079, 167092
...

到目前为止,我发现这个 resource 正在处理一个相关的问题。

你认为这是 neo4j 的合适用例吗?

您是否建议对域模型进行任何更改?

您有什么其他技术建议吗?

编辑:

示例图只显示了我原始图的一小部分,我必须计算具有各种深度和各种封装操作的排列。

【问题讨论】:

    标签: neo4j spring-data-neo4j neo4j-ogm


    【解决方案1】:

    是的,我们可以通过在方程的每一边收集(两个集合)然后展开每个集合来得到这个。

    假设两个集合作为参数传入:

    UNWIND {first} as first
    UNWIND {second} as second
    RETURN first, second
    

    这应该为您提供两个集合元素之间的笛卡尔积。

    编辑

    如果知道您有多少个 AND 分支(例如 2 个),您可以这样形成查询:

    MATCH (first)<-[:OR*0..]-()<-[:AND]-(root)-[:AND]->()-[:OR*0..]->(second)
    WHERE id(root) = 168153
    RETURN first, second
    

    (编辑,匹配本身会在这里为你生成笛卡尔积)

    对于不知道有多少 AND 分支的操作​​,我认为仅使用 Cypher 无法使用这种方法完成此操作,因为我认为不支持动态列。

    您也许可以使用集合来做到这一点,尽管操作会很棘手。

    在这种情况下,在给定两个集合的情况下执行叉积的自定义过程将非常有用。如果您可以沿 AND 分支收集所有节点集合,则可以在其上运行 REDUCE(),对每个集合应用叉积过程。

    至于具有更多操作的更复杂的树,我认为您无法通过 Cypher 做到这一点。我强烈推荐一个自定义过程,您将拥有更多的控制权并能够使用条件逻辑、递归和方法调用。

    【讨论】:

    • 如何分别获得第一和第二。如果我从根节点 168153 开始。如何将一个叶子收集到变量 first 中,将第二个叶子收集到变量 second 中。如果我不知道我有多少这样的叶子(1-3 或 4),它是如何工作的
    • 感谢您的快速响应,正如上次编辑所代表的那样:我真正想要完成的是生成基于上述不同深度的树的组合
    • 更新了我的答案。底线是纯密码解决方案将无法处理更复杂树的评估。自定义程序是这里的方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-20
    相关资源
    最近更新 更多