Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用可选匹配的NEO4j重复返回_Neo4j_Cypher - Fatal编程技术网

使用可选匹配的NEO4j重复返回

使用可选匹配的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

在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 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中。这是唯一的方法吗?恐怕是这样,如果你不使用
进行拆分,你将得到一个笛卡尔积,如果你不列出所有对象,它们将无法在下一步看到。我将找出一些方法来完成这个列表。我真的很感谢你的帮助!