Neo4J Cypher查询结果背后的神奇之处

时间:2014-02-18 14:31:52

标签: neo4j cypher

我在Neo4J Cypher 2.0中有以下查询:

MATCH (u:User{uid:'1111111'}), (c1:Concept), (c2:Concept),
c1-[:BY]->u, c2-[:BY]->u, c1-[rel:TO]->c2 
WITH c1,c2,rel 
MATCH c1-[:AT]->ctx, c2-[:AT]-ctx 
WHERE ctx.uid = rel.context 
RETURN c1.uid AS source_id, c1.name AS source_name, 
c2.uid AS target_id, c2.name AS target_name, 
rel.uid AS edge_id, 
rel.context AS context_id, ctx.name AS context_name;

它的作用是查找连接到Concept节点c1的{​​{1}}标签(c2User)的所有节点他们(uc1)彼此之间的连接(c2),然后它会尝试找出哪些不同的上下文(rel)这些概念节点(ctx并且c1)出现在c2uid uid .context属性rel匹配的rel.contextid然后在表格中返回它们,我们在其中包含来源nameid,目标nameid,连接.context,以及该关系的id id属性以及具有该ctx.uid的上下文的名称。

所以一切正常,但问题是:为什么?

我的意思是Cypher如何巧妙地将rel.context右侧{{1}}与右侧{{1}}匹配,以便知道它应该恰好插入到结果表的正确位置?

有人能解释一下这背后的魔力吗?

或者我完全错了,只是弄得一团糟?

谢谢!

1 个答案:

答案 0 :(得分:1)

它会创建一个表示组合匹配模式的模式图。然后它使用索引来查找它开始应用模式图的绑定节点,并为找到的每个匹配返回结果行。

在应用模式图时,它会使用您的WHERE条件尽可能早地过滤掉您不想要的路径。

如果找不到绑定节点,则必须遍历标签的所有节点(如:Concept)或图形的所有节点(如果未指定任何标签或查找条件)。