在Neo4J中过滤关系类型和值

时间:2018-08-13 09:04:02

标签: neo4j

我认为Neo4J是解决我的问题的正确方法,但是我无法针对我的情况进行查询。 我的演示数据是:

CREATE 
(`O1` :O { name:'O1' }) ,
(`E1` :E { name:'E1' }) ,
(`M1` :M { name:'M1' }) ,
(`O2` :O { name:'O2' }) ,
(`L1` :L { name:'L1' }) ,
(`E2` :E { name:'E2' }) ,
(`E1`)-[:`O<->E` {name:'O<->E', T:'T1'}]->(`O1`),
(`M1`)-[:`O<->M` {name:'O<->M',T:'T0'}]->(`O1`),
(`O1`)-[:`O<->L` {name:'O<->L',T:'T0'}]->(`L1`),
(`E1`)-[:`O<->E` {name:'O<->E',T:'T2'}]->(`O2`),
(`O1`)-[:`O<->E` {name:'O<->E',T:'T3'}]->(`E2`)

Sample Data Image

所有关系都是双向的。对于create语句,关系方向是必需的,但对我的情况却没有用。

规则是: 查找距离输入参数最近的节点(关系属性),但仅找到类型的一个关系(语句非常混乱)。

为澄清起见,输入参数是否为:

E1 on T2 the correct answer is: O2 
O1 on T2 the correct answer is: M1, L1
O1 on T1 the correct answer is: M1, E1, L1
O1 on T3 the correct answer is: M1, E2, L1

explanation for E1 on T2

explanation for O1 on T2

explanation for O1 on T1

explanation for O1 on T3

通过查询,我能够检索到所有具有正确T的节点,但是我无法将规则应用于每种关系类型都只有一个关系。

MATCH p=(order:Order {name:'O1'})-[r*0..5]-() 
where ALL(r IN relationships(p) WHERE r.T <= 'T3') 
RETURN nodes(p) 

编辑:

我尝试使用此查询解决“ T2上的O1”问题,但无法使用以下语句创建单个查询(我应为每种关系类型选择“ top 1 where”,然后搜索所有路径) :

MATCH (n)-[r:`O<->E`]-(m) WHERE r.T <= "T2" RETURN ID(r) ORDER BY r.T 
DESC LIMIT 1
UNION ALL
MATCH (n)-[r:`O<->L`]-(m) WHERE r.T <= "T2" RETURN ID(r) ORDER BY r.T 
DESC LIMIT 1
UNION ALL
MATCH (n)-[r:`O<->M`]-(m) WHERE r.T <= "T2" RETURN ID(r) ORDER BY r.T 
DESC LIMIT 1
<-RETRIEVE RESULT (In this example the ids are 47,48,49) AND CREATE SUBQUERY TO EXECUTE FOLLOWING STATEMENT ->
MATCH p = (e:O {name:'O1'})-[r*..5]-(z) WHERE ALL(r IN relationships(p) WHERE ID(r) = 47 OR ID(r) = 48 OR ID(r) = 49)
RETURN z

请帮助我。

谢谢

0 个答案:

没有答案