在多个MATCH UNION查询中重用路径cypher neo4j

时间:2014-10-02 22:01:15

标签: neo4j cypher

我想拉开并组合来自几个不同路径的数据,这些路径在开始时共享路径,而不是所有路径都存在。例如,我想做这样的事情:

MATCH (:Complex)-[:PATH]->(s:Somewhere)-[:FETCHING]->(data)
    RETURN data.attribute
UNION ALL
MATCH (s)-[:OPTIONAL]->(o:OtherData)
    RETURN o.attribute;

这样它就不会回溯到s的路径。但是,我实际上无法做到这一点,因为UNION分离查询,第二部分中的(s) - [:OPTIONAL]将匹配具有传出OPTIONAL关系的任何内容; s是一个松散的手柄。

有没有比重复路径更好的方法:

MATCH (:Complex)-[:PATH]->(s:Somewhere)-[:FETCHING]->(data)
    RETURN data.attribute
UNION ALL
MATCH (:Complex)-[:PATH]->(s:Somewhere)-[:OPTIONAL]->(o:OtherData)
    RETURN o.attribute;

我使用WITH做了一些尝试,但是如果任何部分失败,它们都会导致查询没有返回任何内容,或者我无法让它们排成一列而是获得带有冗余数据的行,或者(带有多个,嵌套的WITH,我不确定是否只是获取所有内容。

1 个答案:

答案 0 :(得分:1)

您是否看过可选匹配的语义?所以你可以匹配s,超越s和你的可选组件。类似的东西:

MATCH (:Complex)-[:PATH]->(s:Somewhere)
MATCH (s)-[:FETCHING]->(data)
OPTIONAL MATCH (s)-[:OPTIONAL]->(otherData)
RETURN data.attribute, otherData.attribute

抱歉,我错过了单一专栏的重要性,这真的很重要吗?

您可以将vaues收集到一个集合中

MATCH (:Complex)-[:PATH]->(s:Somewhere)
MATCH (s)-[:FETCHING]->(data)
OPTIONAL MATCH (s)-[:OPTIONAL]->(otherData)
RETURN [data.attribute] + COLLECT(otherData.attribute)

但是这对单列来说不起作用:

MATCH (:Complex)-[:PATH]->(s:Somewhere)
MATCH (s)-[:FETCHING]->(data)
OPTIONAL MATCH (s)-[:OPTIONAL]->(otherData)
WITH [data.attribute] + COLLECT(otherData.attribute) as col
RETURN UNWIND col AS val