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,假设我有两个问题 匹配(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