Neo4j Cypher,需要一种优化的方式来获得不在 1 或 2 度连接中的朋友的朋友
Neo4j Cypher, need an optimized way of getting friend of friend of friend who are not in a 1 or 2 degree connection
我是 Neo4j 的新手,正在尝试通过不同的途径结交朋友的朋友的朋友(相差 3 度的人)并且也不处于 1 度或 2 度的关系中。我正在使用下面的密码,这似乎需要很多时间
MATCH p = (origin:User {ID:51})-[:LINKED*3..3]-(fof:User)
WHERE NOT (origin)-[:LINKED*..2]-(fof)
RETURN fof.Nm
ORDER BY Nm LIMIT 1000
分析查询表明,"WHERE NOT" 条件占用了大部分时间,因为它会根据所有 1 度和 2 度节点交叉检查每个结果节点。
我是不是做错了什么,或者有更优化的方法吗?
补充一下,标签 User 中的 属性 UsrID 已编入索引。
您可能有几种方法可以做到这一点。这是一个尝试:
MATCH path = (origin:User {ID:51})-[:LINKED*3..3]-(fofof:User)
WHERE NOT(fofof IN (nodes(path)[0..-1]))
RETURN fofof.Nm
ORDER BY fofof.Nm LIMIT 1000
你也可以更明确一点:
MATCH path = (origin:User {ID:51})-[:LINKED]-(f:User)-[:LINKED]-(fof:User)-[:LINKED]-(fofof:User)
WHERE fofof <> f AND fofof <> fof
RETURN fofof.Nm
ORDER BY fofof.Nm LIMIT 1000
我是 Neo4j 的新手,正在尝试通过不同的途径结交朋友的朋友的朋友(相差 3 度的人)并且也不处于 1 度或 2 度的关系中。我正在使用下面的密码,这似乎需要很多时间
MATCH p = (origin:User {ID:51})-[:LINKED*3..3]-(fof:User)
WHERE NOT (origin)-[:LINKED*..2]-(fof)
RETURN fof.Nm
ORDER BY Nm LIMIT 1000
分析查询表明,"WHERE NOT" 条件占用了大部分时间,因为它会根据所有 1 度和 2 度节点交叉检查每个结果节点。
我是不是做错了什么,或者有更优化的方法吗?
补充一下,标签 User 中的 属性 UsrID 已编入索引。
您可能有几种方法可以做到这一点。这是一个尝试:
MATCH path = (origin:User {ID:51})-[:LINKED*3..3]-(fofof:User)
WHERE NOT(fofof IN (nodes(path)[0..-1]))
RETURN fofof.Nm
ORDER BY fofof.Nm LIMIT 1000
你也可以更明确一点:
MATCH path = (origin:User {ID:51})-[:LINKED]-(f:User)-[:LINKED]-(fof:User)-[:LINKED]-(fofof:User)
WHERE fofof <> f AND fofof <> fof
RETURN fofof.Nm
ORDER BY fofof.Nm LIMIT 1000