Neo4j 寻找孤立的关系

Neo4j 寻找孤立的关系,neo4j,cypher,Neo4j,Cypher,我想在图中找到孤立的关系。例如,假设我有7个节点。(n1至n7)。 n1只知道n2,n2只知道n1 n3-n6互相认识。 n7知道n6,n6知道n7 我只想返回n1和n2。(因为它们只相互连接一次,没有其他输出连接。(与n7和n6不同,n6除了n7之外还有输出连接)我搜索堆栈溢出并找到了这个。但是在我的情况下,解决方案似乎不起作用,因为两个节点之间存在双向关系 使用TraverseAPI很容易做到这一点,但我想看看是否可以用cypher实现 这是neo4j控制台。我使用此查询返回只有1个连接的节

我想在图中找到孤立的关系。例如,假设我有7个节点。(n1至n7)。 n1只知道n2,n2只知道n1 n3-n6互相认识。 n7知道n6,n6知道n7

我只想返回n1和n2。(因为它们只相互连接一次,没有其他输出连接。(与n7和n6不同,n6除了n7之外还有输出连接)我搜索堆栈溢出并找到了这个。但是在我的情况下,解决方案似乎不起作用,因为两个节点之间存在双向关系

使用TraverseAPI很容易做到这一点,但我想看看是否可以用cypher实现


这是neo4j控制台。我使用此查询返回只有1个连接的节点

看起来此查询解决了我的问题,但也可以接受其他建议

match (a:Node)-[:KNOWS]-> (b:Node)
with a, count(*) as count
where count = 1
match (a)-[r:KNOWS]->(c)-[r1:KNOWS]->(d:Node)
where id(a)<id(c)
with a,c, collect(r1) as rs
where length(rs)=1
return a,c

我想,如果关系不是对称的,或者如果您想通过在查询中省略关系方向而不是在数据库中使用双重关系来表示对称,那么我会尝试提出一种替代方法,这种方法同样有效(如Jack Bauer所说,数千字节处于危险之中).我的第一个想法是半身像,但我认为这是可行的:

MATCH p=(a:Node)-[:KNOWS]-(b:Node)-[r:KNOWS*0..1]-(c:Node)
WHERE NOT (a)-[:KNOWS*3]-() AND NOT (b)-[:KNOWS*3]-() 
WITH a, reduce(
    allNodes = [], path in collect(p) | allNodes + filter(
        n in nodes(path) WHERE NOT n IN allNodes
    )
) as allNodes
WHERE length(allNodes) = 2
RETURN a
当我在中运行这个查询时,我被告知我正在做一些异常的事情(谢谢!),它说
错误:org.neo4j.kernel.guard.GuardOperationsCountException:max ops(ops=10001)
。也许这是一个改进查询的提示(?),但当我在本地运行它时,它工作得很好

基本上我想,如果不是的话

(a)-[:KNOWS]->(b) => (b)-[:KNOWS]->(a)
然后,当
(b:Node)
只有一个传出关系而不是
(a:Node)
时,您的查询可能会出现误报,而当
(b:Node)
没有传出关系时,则会出现误报

(a)-[:KNOWS]->(b)-[:KNOWS]->(c) AND a<>c    // false positive
(a)-[:KNOWS]->(b) AND NOT (b)-[:KNOWS]->()  // false negative
(a)-[:KNOWS]->(b)-[:KNOWS]->(c)和ac//假阳性
(a) -[:知道]->(b)而不是(b)-[:知道]->()//假阴性

考虑标准的另一种方式是,您想要的模式是A)一个或两个深层关系,b)不是较长模式的一部分,c)只包含两个不同的节点,因此这就是我在上面的替代版本中试图描述的。前两个标准很容易陈述,但第三个标准没有我想象的那么明显。我觉得可能有一种更简单的方法,如果你看到它,就编辑或评论它。(我第一次尝试使用
distinct
而不是
filter()
,但我一定很困惑,因为我无法让它工作)。

如果[:KNOWS]始终是对称的,这很有效。如果有不对称的情况,你可以得到假阳性和假阴性,在我的例子中,知道总是对称的。但你们确实提出了一个很好的观点,当它们不是对称的时候。发布一个解决方案也是很好的。我知道如何消除假阳性,但仍然需要得到假阴性。将(a:Node)-[:KNOWS]->(b:Node)与a匹配,将计数(*)作为计数,其中计数=1匹配(a)-[r:KNOWS]->(c)-[r1:KNOWS]->(d:Node)其中id(a)-[r2:KNOWS]->(e:Node)其中id(a)=id(e)与a匹配,c将id(f)id(c)与a、c匹配,长度(收集(r))作为rs2,其中rs2=0返回a、c
(a)-[:KNOWS]->(b)-[:KNOWS]->(c) AND a<>c    // false positive
(a)-[:KNOWS]->(b) AND NOT (b)-[:KNOWS]->()  // false negative