我在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}}标签(c2
和User
)的所有节点他们(u
到c1
)彼此之间的连接(c2
),然后它会尝试找出哪些不同的上下文(rel
)这些概念节点(ctx
并且c1
)出现在c2
与uid
uid
.context
属性rel
匹配的rel.context
(id
然后在表格中返回它们,我们在其中包含来源name
和id
,目标name
和id
,连接.context
,以及该关系的id
id
属性以及具有该ctx.uid
的上下文的名称。
所以一切正常,但问题是:为什么?
我的意思是Cypher如何巧妙地将rel.context
右侧{{1}}与右侧{{1}}匹配,以便知道它应该恰好插入到结果表的正确位置?
有人能解释一下这背后的魔力吗?
或者我完全错了,只是弄得一团糟?
谢谢!
答案 0 :(得分:1)
它会创建一个表示组合匹配模式的模式图。然后它使用索引来查找它开始应用模式图的绑定节点,并为找到的每个匹配返回结果行。
在应用模式图时,它会使用您的WHERE条件尽可能早地过滤掉您不想要的路径。
如果找不到绑定节点,则必须遍历标签的所有节点(如:Concept)或图形的所有节点(如果未指定任何标签或查找条件)。