在多个匹配联合查询中重用路径cypher neo4j

在多个匹配联合查询中重用路径cypher neo4j,neo4j,cypher,Neo4j,Cypher,我想从几个不同的路径中提取和组合数据,这些路径在开始时共享一条路径,但并非所有路径都存在。例如,我想这样做: MATCH (:Complex)-[:PATH]->(s:Somewhere)-[:FETCHING]->(data) RETURN data.attribute UNION ALL MATCH (s)-[:OPTIONAL]->(o:OtherData) RETURN o.attribute; 这样它就不会回溯到s。但是,我实际上不能这样做,因为UN

我想从几个不同的路径中提取和组合数据,这些路径在开始时共享一条路径,但并非所有路径都存在。例如,我想这样做:

MATCH (:Complex)-[:PATH]->(s:Somewhere)-[:FETCHING]->(data)
    RETURN data.attribute
UNION ALL
MATCH (s)-[:OPTIONAL]->(o:OtherData)
    RETURN o.attribute;
这样它就不会回溯到s。但是,我实际上不能这样做,因为UNION分隔查询,第二部分中的(s)-[:OPTIONAL]将匹配任何具有传出可选关系的内容;这辆车的把手松了

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

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,我不确定其范围)只是获取所有内容。

您是否查看了可选匹配的语义?因此,您可以匹配s,超越s和可选组件。比如:

MATCH (:Complex)-[:PATH]->(s:Somewhere)
MATCH (s)-[:FETCHING]->(data)
OPTIONAL MATCH (s)-[:OPTIONAL]->(otherData)
RETURN data.attribute, otherData.attribute
对不起,我错过了一个专栏的重要性,它真的重要吗

您可以将VAUE集合到单个集合中:

但这不适用于单个列:

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

这并不是把事情排成一列。如果数据只有一个匹配项,而其他数据有多个匹配项,那么对于右侧的每个otherData.attribute,我将得到一个两列结果,左侧的data.attribute相同。这两种类型的数据是相同的,所以我尝试获取一个列,就像我的示例查询所给出的那样。您的语法并不完全有效,但我可以使用:`MATCH(:Complex)-[:PATH]->(s:Somewhere)MATCH(s)-[:FETCHING]->(data)可选匹配(s)-[:OPTIONAL]->(otherData)with[data.attribute]+COLLECT(otherData.attribute)as col退绕col as val返回val;`它给出了需要消除的空值,但这并不坏。最后,我认为联合是一条路要走,最好能保存引用并有一个内部作用域可以引用它们,这样我就可以进行顶级匹配,然后有一个内部查询在联合的每个部分引用它。谢谢很好,但是我不明白你的空值是从哪里来的-我假设上面所有的都是理论上的查询,但是我不认为应该有任何空值。但是,如果有,您可以使用过滤器来清除它们。
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