【问题标题】:The magic behind Neo4J Cypher query resultsNeo4J Cypher 查询结果背后的魔力
【发布时间】:2014-02-18 14:31:52
【问题描述】:

我在 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;

它的作用是查找连接到User 节点uConcept 标签(c1c2)的所有节点,找到它们的(c1c2)相互连接(rel),然后它会尝试查找这些概念节点(c1c2)出现在哪些不同的上下文(ctx)中,但只有那些uid 与@987654334 匹配的上下文@ 关系 rel (rel.context) 的 .context 属性,然后在表中返回它们,其中我们有源 idname,目标 idname,连接id,以及该关系的.context id 属性和与id 关联的上下文名称。

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

我的意思是,Cypher 是如何将右侧的 ctx.uid 与右侧的 rel.context 如此巧妙地匹配,以知道它应该准确地插入到结果表的正确位置?

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

或者我完全错了,只是得到了混乱的结果?

谢谢!

【问题讨论】:

  • 您可以将PROFILE 添加到密码查询的开头,以查看有关它在做什么的更多详细信息。

标签: neo4j cypher


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-04-15
    • 1970-01-01
    • 1970-01-01
    • 2015-11-01
    • 2017-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多