2016-05-26 2 views
0

Скажем, у меня есть дерево решений, которое выглядит следующим образом:Настройка дерева решений в Neo4j

enter image description here

Я написал Cypher запрос для создания этого дерева решений:

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. Как написать запрос cypher для присоединения к графу и получить узел результата с входными данными? например скажем, у меня были данные {«Спины»? : False, 'Weight': 500}, как бы написать запрос для эффективного возврата узла «Ant Man»?

ответ

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 
+0

Это фантастика, потому что я думал о том, деревьев решений и моделей в Neo на некоторое время , Единственное, что я не могу оборачивать, - это использование свойства 'i'. Что это значит? – Btibert3

+0

@ Btibert3 Свойство 'l' (уровень дерева) и' i' (индекс узла на определенном уровне дерева) необходимы для различения узлов с одинаковым именем друг от друга: '(: DT: Split {name: 'Weight', l: 1, i: 0}) '! ==' (: DT: Split {name: 'Weight', l: 1, i: 1}) '. –