根据链接节点

时间:2017-09-05 12:01:19

标签: neo4j cypher graph-databases

我有以下问题: 我想选择类型为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类型的节点相关的路径?

1 个答案:

答案 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