【问题标题】:Setting up a decision tree in neo4j在 neo4j 中设置决策树
【发布时间】:2016-05-26 13:45:32
【问题描述】:

假设我有一个如下所示的决策树:

我编写了一个密码查询来创建决策树:

create (_0 {`name`:"Spins?", `type`:"split"})

create (_1a {`name`:"Weight", `type`:"split"})
create (_1b {`name`:"Weight", `type`:"split"})

create (_2a {`name`:"Spider", `type`:"terminal"})
create (_2b {`name`:"Spider Man", `type`:"terminal"})
create (_2c {`name`:"Ant", `type`:"terminal"})
create (_2d {`name`:"Ant Man", `type`:"terminal"})

create (_0)-[:`CON` {`lt`:.5}]->(_1a)
create (_0)-[:`CON` {`gte`:.5}]->(_1b)

create (_1a)-[:`CON` {`lt`:200}]->(_2a)
create (_1a)-[:`CON` {`gte`:200}]->(_2b)

create (_1b)-[:`CON` {`lt`:200}]->(_2c)
create (_1b)-[:`CON` {`gte`:200}]->(_2d)
;

几个问题:

  1. 这是在 neo4j 中设置决策树的最佳方式吗?
  2. 如何编写密码查询以加入图形并获取带有输入数据的结果节点?例如说我有数据{'旋转? : False, 'Weight' : 500},我将如何编写查询以有效地返回“Ant Man”节点?

【问题讨论】:

    标签: neo4j py2neo


    【解决方案1】:

    允许对模型进行小的更改:

    MERGE (_0:DT:Split  {name: 'Spins', l:0, i:0})
    MERGE (_1a:DT:Split {name: 'Weight', l:1, i:0})
    MERGE (_1b:DT:Split {name: 'Weight', l:1, i:1})
    
    MERGE (_2a:DT:Terminal {name:'Spider', l:2, i:0})
    MERGE (_2b:DT:Terminal {name:'Spider Man', l:2, i:0})
    MERGE (_2c:DT:Terminal {name:'Ant', l:2, i:0})
    MERGE (_2d:DT:Terminal {name:'Ant Man', l:2, i:0})
    
    MERGE (_0)-[:DT {type:'Left', value: 0.5, propname:'Spins'}]->(_1a)
    MERGE (_0)-[:DT {type:'Right', value: 0.5, propname:'Spins'}]->(_1b)
    MERGE (_1a)-[:DT {type:'Left', value: 50, propname:'Weight'}]->(_2a)
    MERGE (_1a)-[:DT {type:'Right', value: 50, propname:'Weight'}]->(_2b)
    MERGE (_1b)-[:DT {type:'Left', value: 50, propname:'Weight'}]->(_2c)
    MERGE (_1b)-[:DT {type:'Right', value: 50, propname:'Weight'}]->(_2d)
    

    并查询:

    // Input parameters:
    WITH {Spins: 0.6, Weight: 500} as Cor
    // Get all decision paths:
    MATCH p = (S:DT:Split {l:0,i:0})-[:DT*]->(T:DT:Terminal)
    // Test single decision path:
    WHERE ALL(r in relationships(p) WHERE 
            (r.type='Left' AND Cor[r.propname]<r.value) OR // Left variant
            (r.type='Right' AND Cor[r.propname]>=r.value) // Right variant
          )
    RETURN T
    

    【讨论】:

    • 这太棒了,因为我一直在思考 Neo 中的决策树和模型。唯一让我无法理解的是使用属性i。这是在做什么?
    • @Btibert3 需要l(树的层级)和i(树的特定层级节点的索引)的属性来区分每个节点的同名节点其他:(:DT:Split {name: 'Weight', l:1, i:0}) !== (:DT:Split {name: 'Weight', l:1, i:1})
    猜你喜欢
    • 1970-01-01
    • 2018-01-15
    • 2019-01-02
    • 2021-11-26
    • 1970-01-01
    • 2012-08-20
    • 2015-02-06
    • 2013-08-29
    • 2018-05-04
    相关资源
    最近更新 更多