我想拉开并组合来自几个不同路径的数据,这些路径在开始时共享路径,而不是所有路径都存在。例如,我想做这样的事情:
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,我不确定是否只是获取所有内容。
答案 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