查询以搜索任何用户,首先显示特定用户的 "friends" 和 "friends of friends"

Query to search for any user showing first those who are "friends" and "friends of friends" of specific user

我刚开始使用 neo4j 和 Cypher。

目前我正在开发一个使用 neo4j 获取数据的社交网站。这将在顶部栏中有一个搜索选项,用于查找社交网络上的其他用户,但对于结果,我想首先显示朋友,然后是朋友的朋友,然后是其他人。所有这一切,分页搜索结果就像在 facebook 中搜索一样。

为此,我正在寻找使用 Cypher 为该搜索选项创建最佳查询的方法。

我的 USER 节点有这样的结构:

(me:User { mid:"1234", name:"John Doe", email:"juan.arango1234@gmail.com" })

其中 "mid" 属性 是自定义 ID。

USER 节点之间的友谊关系在两个方向上都有标签 "FRIENDOF":

(a:User)-[:FRIENDOF]->(b:User) and (a:User)<-[:FRIENDOF]-(b:User)

我为此设计的最有效的查询是:

MATCH p = allShortestPaths((me:User)-[:FRIENDOF*]->(other:User))
WHERE me.mid = "1234"
AND other.name = "Any user name"
RETURN other, length(p) AS Length
ORDER BY length(p) ASC
SKIP 10
LIMIT 10

这个查询似乎运行良好,但我无法理解应该有一个更优化的查询方式的想法。

按照Neo4j文档(http://neo4j.com/docs/stable/cypher-cookbook-friend-finding.html), I tried to create this query by mixing the query of friends, friends of friends and others with a UNION operation, but with UNION I can not page the results due to actual issue 1879 (https://github.com/neo4j/neo4j/issues/1879)和相关2725的例子,查询"others"需要前面查询的结果(朋友的朋友的朋友)

在 neo4j 术语中,有什么更好的想法可以降低此查询的开销吗?

如何搜索不是朋友或朋友的朋友的用户?

谢谢!

您有一个很好的查询起点。您只需要考虑 shortestPath 应该是可选的(因此用户未连接),因此,考虑到这一点,您可以执行以下查询:

MATCH (me:User {mid:"1234"}), (other:User {name:"Any User name"})
OPTIONAL MATCH p=shortestPath((me)-[:FRIEND*1..2]-(other))
RETURN me.mid, other.mid, length(p) as distance
ORDER BY distance DESC

在两个用户之间没有路径的情况下,距离将为 null,因此您可以在应用程序级别进行检查。

提示:最短路径的默认深度限制为 15。

参考演示图:http://console.neo4j.org/r/t2n1qc

编辑

此查询基于用于检索共同好友数量的演示控制台:

MATCH (me:User { login:'randall.tremblay' })
MATCH (search:User { login:'witting.franz' })
OPTIONAL MATCH p=shortestPath((me)-[:FRIEND*]-(search))
WITH me, search, p, size((me)-[:FRIEND]-()-[:FRIEND]-(search)) AS common
RETURN me.login, search.login, length(p) AS distance, common