使用可选匹配的NEO4j重复返回
在cypher查询中,我们希望从用户获取各种数据。此时,我们使用可选匹配从用户获取关系使用可选匹配的NEO4j重复返回,neo4j,cypher,Neo4j,Cypher,在cypher查询中,我们希望从用户获取各种数据。此时,我们使用可选匹配从用户获取关系 MATCH (person:Person { Id : xxxx }) OPTIONAL MATCH (person)-[:NEXT*]->(element) OPTIONAL MATCH (person)-[:WROTE_COMMENT]->(comment) RETURN person, collect(element) as element, collect(comment) as comm
MATCH (person:Person { Id : xxxx })
OPTIONAL MATCH (person)-[:NEXT*]->(element)
OPTIONAL MATCH (person)-[:WROTE_COMMENT]->(comment)
RETURN person, collect(element) as element, collect(comment) as comment
问题在于,该查询返回的所有元素对于找到的每个注释都是重复的。我们可以使用一个独特的方法来解决这个问题,但是元素不能再添加到列表中两次
有没有解决此问题的建议?使用
WITH
将查询拆分为两个步骤,以避免在两个列表之间执行笛卡尔乘积:
MATCH (person:Person { Id : xxxx })
OPTIONAL MATCH (person)-[:NEXT*]->(element)
WITH person, collect(element) AS element
OPTIONAL MATCH (person)-[:WROTE_COMMENT]->(comment)
RETURN person, element, collect(comment) as comment
使用
和将查询拆分为两个步骤,以避免在两个列表之间进行笛卡尔乘积:
MATCH (person:Person { Id : xxxx })
OPTIONAL MATCH (person)-[:NEXT*]->(element)
WITH person, collect(element) AS element
OPTIONAL MATCH (person)-[:WROTE_COMMENT]->(comment)
RETURN person, element, collect(comment) as comment
谢谢弗兰克!这似乎奏效了。唯一的问题是,如果我通过10个可选匹配来扩展它,那么每次我都必须将所有对象放在WITH中。这是唯一的方法吗?恐怕是这样,如果你不使用和进行拆分,你将得到一个笛卡尔积,如果你不列出所有对象,它们将无法在下一步看到。我将找出一些方法来完成这个列表。我真的很感谢你的帮助!谢谢弗兰克!这似乎奏效了。唯一的问题是,如果我通过10个可选匹配来扩展它,那么每次我都必须将所有对象放在WITH中。这是唯一的方法吗?恐怕是这样,如果你不使用和进行拆分,你将得到一个笛卡尔积,如果你不列出所有对象,它们将无法在下一步看到。我将找出一些方法来完成这个列表。我真的很感谢你的帮助!