我有以下问题: 我想选择类型为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类节点中获取中间节点的属性,这在我们的最终模型中是不可能的。为了测试,我向A添加了一个属性,其中包含通常存储在AD中的信息。
结果应该只包含链接到AD类型的节点的类型A的节点,AD.name应该是AD0 ... AD3,但我想要排除链接到AD节点的类型A的节点AD.name =&# 39; 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的AD类型的节点相关的路径?
答案 0 :(得分: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