在Neo4j中,如何从一个查询中排除另一个查询的结果
假设我有两个问题在Neo4j中,如何从一个查询中排除另一个查询的结果,neo4j,cypher,Neo4j,Cypher,假设我有两个问题 匹配(a:用户)-[:喜欢]->(b:对象) 哪里 返回一个 匹配(a:用户)-[:HasVisited]->(c:位置) 哪里 返回一个 我想把两者结合起来。因此,我从查询2中得到的结果不符合查询1 到目前为止,我已经尝试了以下方法 匹配(a:用户)-[:喜欢]->(b:对象) 匹配(a:用户)-[:HasVisited]->(c:位置) 哪里 而不是 返回一个 但这种方法并不排除我想要排除的所有结果 匹配(a:用户)-[:喜欢]->(b:对象) 哪里 以collect(不同
匹配(a:用户)-[:喜欢]->(b:对象)
哪里
返回一个
匹配(a:用户)-[:HasVisited]->(c:位置)
哪里
返回一个
我想把两者结合起来。因此,我从查询2中得到的结果不符合查询1
到目前为止,我已经尝试了以下方法
匹配(a:用户)-[:喜欢]->(b:对象)
匹配(a:用户)-[:HasVisited]->(c:位置)
哪里
而不是
返回一个
但这种方法并不排除我想要排除的所有结果
匹配(a:用户)-[:喜欢]->(b:对象)
哪里
以collect(不同的a)作为exc
匹配(a:用户)-[:HasVisited]->(c:位置)
哪里
而不是在exc
归还
这会给出正确的结果,但一旦查询1和查询2变得更加复杂,效率就会降低
我也试过了
匹配(a:用户)-[:喜欢]->(b:对象)
哪里
以collect(不同的a)作为exc
匹配(a:用户)
不在exc的地方
用一个
匹配匹配(a:用户)-[:HasVisited]->(c:位置)
哪里
返回一个
我曾希望减少a可以与前端相匹配的节点数量可以提高性能,但这种方法似乎没有更好的效果
是否有标准/更好的方法将匹配一个查询的结果从另一个查询中排除?第一个示例的问题是,它仍然可以匹配
(a:User)-[:Likes]->(b:Object)
,其中“b”不满足条件,当“a”与所选“b”相关时,您希望从结果中完全排除它
要实现这一点,您可以使用以下条款:
匹配(a:用户)-[:HasVisited]->(c:位置)
哪里
可选匹配(a)-[:Likes]->(b:对象)
哪里
用a,b,c
其中b为空
归还
您可以尝试以下方法:
MATCH (U1:User)-[:HasVisited]->(L:Location)
WHERE <condition on c>
WITH distinct U1
OPTIONAL MATCH (U2:User)-[:Likes]->(O:Object)
WHERE U2 = U1 AND
<condition on b>
WITH U1,
count(U2) as excl
WHERE excl = 0
RETURN U1
匹配(U1:用户)-[:HasVisited]->(L:位置)
哪里
具有不同的U1
可选匹配(U2:User)-[:Likes]->(O:Object)
其中U2=U1,且
对于U1,
计算(U2)为不包括
其中excl=0
返回U1
我不知道有更好的方法,因为Cypher中没有减号
操作符。使用collect
和IN
似乎是实现这一点的方法。
MATCH (U1:User)-[:HasVisited]->(L:Location)
WHERE <condition on c>
WITH distinct U1
OPTIONAL MATCH (U2:User)-[:Likes]->(O:Object)
WHERE U2 = U1 AND
<condition on b>
WITH U1,
count(U2) as excl
WHERE excl = 0
RETURN U1