2017-09-05 51 views
1

我有以下问题: 我想选择路径类型为A的节点。但我不想要所有路径,只有具有特定属性的路径。问题是,在我们的数据模型中,这些属性存储在类型AD的单独节点中。对于开始和终点一切工作正常。我想我也已经制定了一般结构,因为这个查询在这里工作得很好。根据链接节点的信息选择路径

MATCH (n:A)-->(ad:AD) WHERE ad.name='AD0' 
WITH n AS start 
MATCH (n:A)-->(ad:AD) WHERE ad.name='AD3' 
WITH n AS end, start 
MATCH p = (start) -[:L*0..10]-> (end) 
WHERE ALL (x in nodes(p) [1..-1] WHERE ((x.name STARTS WITH 'ad1' OR x.name STARTS WITH 'ad2'))) 
return p 

这里的问题是,我得到了中间节点的属性出A型的节点,这不会影响我们最终的模型PE可能的。为了测试,我向A中添加了一个属性,其中包含通常存储在AD中的信息。

结果应该只包含类型A的节点链接到类型AD和AD.name的节点应该是AD0 ... AD3,但我想排除与AD节点类型A的节点与AD.name =' AD4'为例。 为此,我尝试了以下查询,但它仅返回包含链接到节点AD的节点A的路径,其中包含AD.name = AD0或AD3。

MATCH (n:A)-->(ad:AD WHERE ad.name='AD0' 
WITH n AS start 
MATCH (n:A)-->(ad:AD) WHERE ad.name='AD3' 
WITH n AS end, start 
MATCH (n:AD) WITH n AS ad, end, start //somehow needed otherwise I cannot use AD in the where clause 
MATCH p = (start) -[:L*0..]-> (end) 
WHERE ALL (
    x in nodes(p) [1..-1] WHERE (
     ((x)-->(ad:AD)) 
     AND 
     (ad.name ='AD1' OR ad.name='AD2') 
    ) 
) 
return p 

知道为什么不返回含有连接到类型AD的节点与AD.name = AD1 AD2或A型的唯一节点路径?

+0

第一件事:在该行'MATCH(N:AD)在n广告,广告片,sources'你不及格'start'和'end'到下一个上下文。我相信你应该把这一行改成'MATCH(n:AD),用n个广告,汇,源,开始,结束,然后再试一次。 –

+0

对不起,有一个混合,汇源是现在开始结束,纠正了上面的代码 – birnenpfluecker

回答

0

我能解决这个问题。不知道是否有更好的方法,但我必须将我的中间节点放在单独的列表中,否则我不能在WHERE ALL子句的where部分使用它。工作代码如下所示:

MATCH (n:A)-->(ad:AD WHERE ad.name='AD0' 
WITH n AS start 
MATCH (n:A)-->(ad:AD) WHERE ad.name='AD3' 
WITH n AS end, start 
MATCH (n:A)-->(ad:AD) WHERE (ad.name IN ['AD1', 'AD2']) 
WITH collect(n) AS intermediates, sinks, sources 
MATCH p = (start) -[:L*0..]-> (end) 
WHERE ALL (
    x IN nodes(p) [1..-1] WHERE (
     x IN intermediates 
    ) 
) 
return p