Neo4j Cypher,需要一种优化的方式来获得非1度或2度连接的朋友的朋友的朋友
我是Neo4j的新手,我尝试着从朋友的朋友(离我3度远的朋友)那里得到朋友,并且通过不同的途径也没有1度或2度的关系。我正在使用下面的密码,这似乎需要很多时间 匹配p=(源代码:用户{ID:51})-[:链接*3..3](fof:User) 其中非(原点)-[:链接的*.2](fof) 返回fof.Nm 按Nm限购1000 对查询进行分析表明,“WHERE NOT”条件占用了大部分时间,因为它将每个结果节点与所有1度和2度节点交叉检查 我是做错了还是有更优化的方法Neo4j Cypher,需要一种优化的方式来获得非1度或2度连接的朋友的朋友的朋友,neo4j,cypher,graph-databases,Neo4j,Cypher,Graph Databases,我是Neo4j的新手,我尝试着从朋友的朋友(离我3度远的朋友)那里得到朋友,并且通过不同的途径也没有1度或2度的关系。我正在使用下面的密码,这似乎需要很多时间 匹配p=(源代码:用户{ID:51})-[:链接*3..3](fof:User) 其中非(原点)-[:链接的*.2](fof) 返回fof.Nm 按Nm限购1000 对查询进行分析表明,“WHERE NOT”条件占用了大部分时间,因为它将每个结果节点与所有1度和2度节点交叉检查 我是做错了还是有更优化的方法 只需添加一点,label Us
只需添加一点,label 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
MATCH path=(源:用户{ID:51})-[:链接]-(f:User)-[:链接]-(fof:User)-[:链接]-(fofof:User)
其中fof和fof fof
返回FOF.Nm
订购FOF.Nm限值1000
感谢Brian的快速响应,您建议的方法肯定要快得多,但是如果我必须查看3度或以上的角度,并确保它们不是1度或2度连接,您是否也可以说明如何实现同样的效果。对所有节点进行选择,而不是遍历一条开放式路径,不是更好吗?在这种情况下,考虑到没有定义的路径,条件将如何工作。第一个查询应该可以扩展到任何路径长度,因为它只是确保路径中的最后一个节点不是第一个到第二个到最后一个节点之一。在开放式情况下,您可能需要原点
和最后一个节点之间的最短路径。您可以使用Cypher的shortestPath
并在末尾返回length(path)
(shortestPath
:)