2016-08-23 27 views
0

我在Cypher和Neo4j中采取了一些步骤,并理解cypher如何处理“变量”。变量在密码匹配查询中的作用

具体来说,我有一个查询

match (A {name: "A"}) 
match (A)<-[:st*]-(C)-[:hp]->(c) 
match (A)<-[:st*]-(B)-[:hp]->(b) 
match (c)-[:st]->(b) 
return b 

这不会是我想要的工作。现在,在代码中,我使用了两次匹配子句(第2行和第3行),以便变量(c)和(d)在第4行的最终匹配之前基本包含相同的节点。 我可以编写查询而不必重复第二个匹配条款?使用

match (A {name: "A"}) 
match (A)<-[:st*]-(B)-[:hp]->(b) 
match (b)-[:st]->(b) 
return b 

似乎是非常不同的东西,没有返回因为没有:从(B)到自身节点ST类型的关系。我的理解到目前为止,即使(b)和(c)中包含相同的节点,

match (c)-[:st]->(b) 

试图找到的(c)任何节点和(b)任何节点之间的匹配,而

match (b)-[:st]->(b) 

试图从(b)的特定节点查找匹配到自己?还是说,人们必须将3个匹配条款视为一个整体模式?

thanx的任何洞察到内部工作...

回答

0

当你写了2点MATCH声明

match (A)<-[:st*]-(C)-[:hp]->(c) 
match (A)<-[:st*]-(B)-[:hp]->(b) 

他们不依赖于彼此的结果(仅适用于以前的结果MATCH找到A)。 Cypher引擎可以独立执行它们,然后返回一个笛卡尔积的结果,或者它可以执行第一个MATCH,对于每个结果,然后执行第二个MATCH,产生一系列使用当前结果的第一个MATCH并且每个结果的第二个MATCH(实际实现是一个细节)。实际上,它也可以检测到相同的模式匹配两次,只执行一次,并从结果中生成所有可能的配对。

总之,bc从结果的同一集合拍摄,但独立,所以你会得到对,其中bc是同一个节点,也是所有其他对他们都没有。

如果你做一个单一的MATCH,你显然有一个单一的节点。

假设一个MATCH返回2个节点12,用2个中间MATCH最终MATCH将看到所有4双:

 
    1  2 
1 (1, 1) (1, 2) 
2 (2, 1) (2, 2) 

而具有单个中间MATCH和最终MATCH使用b两次,它将只会看到:

 
    1  2 
1 (1, 1) 
2   (2, 2) 

哪些不是有趣的对,如果你没有有自我关系。

请注意,这是在SQL数据库相同的,如果你没有一个SELECT 2表联接:你也可以得到的结果无关笛卡尔积。