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 Cypher:返回与不匹配的节点匹配的节点';不匹配_Neo4j_Cypher - Fatal编程技术网

Neo4j Cypher:返回与不匹配的节点匹配的节点';不匹配

Neo4j Cypher:返回与不匹配的节点匹配的节点';不匹配,neo4j,cypher,Neo4j,Cypher,对于标签A、B和Z,A和B与Z有自己的关系 MATCH (a:A) MATCH (b:B { uuid: {id} }) MATCH (a)-[:rel1]->(z:Z)<-[:rel2]-(b) WITH a, COLLECT(z) AS matched_z RETURN DISTINCT a, matched_z 匹配(a:a) 匹配(b:b{uuid:{id}) 匹配(a)-[:rel1]->(z:z)在我看来,这里最难的部分是,任何失败的匹配都会删除到目前为止您匹配的所有内

对于标签A、B和Z,A和B与Z有自己的关系

MATCH (a:A)
MATCH (b:B { uuid: {id} })
MATCH (a)-[:rel1]->(z:Z)<-[:rel2]-(b)
WITH a, COLLECT(z) AS matched_z
RETURN DISTINCT a, matched_z
匹配(a:a)
匹配(b:b{uuid:{id})

匹配(a)-[:rel1]->(z:z)在我看来,这里最难的部分是,任何失败的匹配都会删除到目前为止您匹配的所有内容。但您的出发点似乎是“所有与B.uuid相关的Z”,所以从收集并从那里过滤/复制开始

与+聚合函数一起使用可复制+筛选列

如果匹配失败不应删除已收集的行,请使用可选匹配

如果我足够了解您正在努力做好的事情,这个密码应该可以完成这项工作,并根据需要调整它(如果您需要帮助了解它的任何部分/调整它,请告诉我)

//匹配基集
匹配(z:z)(n))为匹配,过滤器(n在zs中,其中不是(a)-(rel1]->(n))为不匹配

此查询可能会执行您想要的操作:

MATCH (z:Z)<-[:rel2]-(b:B { uuid: {id} })
WITH COLLECT(z) as all_zs
UNWIND all_zs AS z
MATCH (a)-[:rel1]->(z)
WITH all_zs, COLLECT(DISTINCT z) AS matched_zs
RETURN matched_zs, apoc.coll.subtract(all_zs, matched_zs) AS missing_zs;
匹配(z:z)(z)
对于所有_z,将(不同的z)收集为匹配的_z
返回匹配的_zs,apoc.coll.subtract(所有_zs,匹配的_zs)作为缺少的_zs;
它首先将具有
rel2
关系的
Z
节点从
b
存储在
all_zs
变量中。即使第二个
MATCH
子句与那些
Z
节点的子集匹配,该集合的内容也不会受到影响

然后,它在
matched_zs
中存储与任何
a
节点具有
rel1
关系的不同
所有_zs
节点

最后,它返回:

  • 匹配的_zs
    集合,以及
  • 所有_zs
    中不在
    匹配_zs
    中的唯一节点,如
    缺少_zs

查询使用方便的APOC函数生成后一个返回值。

再看一眼,它并没有像我预期的那样工作。。。。我已经有了一个节点,我需要在上面对其进行更多限定。在Filter()中,我在z.array中添加了n,因为我得到了一个预期的集合not节点错误和(a)而不是(:a),即(n在z.array中,其中not(a)-(rel1]->(z))为unmatchedZ)。matchedZ部分似乎是B和Z之间关系中的所有节点,但是matchedZ应该反映A和B中相同的Z节点。这就是为什么我使用MATCH(A)-[:rel1]->(Z:Z)@ndyr在构建初始密码时,我建议一次使用一个命令。从一个简单的
匹配(z:z)返回开始*
,在每次迭代中,从密码中添加或删除一个内容,直到收集到所需的内容。这有助于了解密码的每个部分实际匹配/过滤的内容。我修复了初始过滤器,但恐怕我太不清楚您需要什么来进一步帮助您。如果您在问题中添加一些示例数据,以及希望查询从这些数据返回什么,我可以更好地帮助您。当然!可能有一些混淆,A和B标签都有与之相关联的Z,在我的初始查询中,我可以在一个区域中找到特定的A,然后通过结果节点找到它们与MATCH(A)-[:rel1]->(Z:Z)有哪些共同点,因此返回将有符合条件的A节点,一个匹配Z到B:B的集合,和一个不匹配Z到b的集合:b开始l=节点:a_位置('withinDistance:[lat,lon,50.0]')匹配(l)-[:a_位置]->(a)其中{WHERE_子句}匹配(a)匹配(b:b{uuid:b_id})匹配(c:c{uuid:c_id})其中{WHERE子句与上述节点}匹配(a)-[:rel1]>(Z:Z)
// Match base set
MATCH (z:Z)<-[:rel2]-(b:B { uuid: {id} })
// Collect into single list
WITH COLLECT(z) as zs
// Match all A (ignore relation to Zs) 
MATCH (a:A)
// For each a, return a, the sub-list of Zs related to a, and the sub-list of Zs not related to a
RETURN a as a, FILTER(n in zs WHERE (a)-[:rel1]->(n)) as matched, FILTER(n in zs WHERE NOT (a)-[:rel1]->(n)) as unmatched
MATCH (z:Z)<-[:rel2]-(b:B { uuid: {id} })
WITH COLLECT(z) as all_zs
UNWIND all_zs AS z
MATCH (a)-[:rel1]->(z)
WITH all_zs, COLLECT(DISTINCT z) AS matched_zs
RETURN matched_zs, apoc.coll.subtract(all_zs, matched_zs) AS missing_zs;