在neo4j中寻找排除某些特定关系的2跳邻域

在neo4j中寻找排除某些特定关系的2跳邻域,neo4j,cypher,Neo4j,Cypher,我正在尝试查找特定节点的邻居节点。在我的情况下,我会延长到2跳。这是我的情况 这里我对跳跃检测的第一个查询是 Match (c:A{ID:'123'})-[*1..2]->(d) Return Distinct(d) 现在在这里展示。我的数据量非常大,接近800万个节点。因此,为了提高计算性能,我想删除“驱动器”和“费用”,其中一些费用关系是自参考的 经过一些研究,我得到了这些 Match (c:A{ID:'123'})-[r*1..2]->(d) where non

我正在尝试查找特定节点的邻居节点。在我的情况下,我会延长到2跳。这是我的情况

这里我对跳跃检测的第一个查询是

Match (c:A{ID:'123'})-[*1..2]->(d)
Return Distinct(d)
现在在这里展示。我的数据量非常大,接近800万个节点。因此,为了提高计算性能,我想删除“驱动器”和“费用”,其中一些费用关系是自参考的

经过一些研究,我得到了这些

  Match (c:A{ID:'123'})-[r*1..2]->(d)
    where none(x in r WHERE type(x) in ['DRIVES', 'CHARGES'])
    Return Distinct(d)


Match (c:A{ID:'123'})-[:OWNS|:EARN_MONEY*1..2]->(d)
Return Distinct(d)

两个查询返回相同的结果,但最后一个查询提前完成。问题是,我无法通过此代码删除自引用的费用关系,并且一个或两个驱动器关系仍然存在。我是否需要在此处添加一些内容

您需要为查询添加其他约束。自边具有相同的起点和终点,因此这是识别它们的简单方法:

MATCH (c:A{ID:'123'})-[r:OWNS|:EARN_MONEY*1..2]->(d)
WHERE NONE(rel in r WHERE startNode(rel) = endNode(rel))
RETURN Distinct(d)

嗯,很抱歉,结果是一样的。自引用循环仍然存在