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

标签 neo4j cypher social-networking

我是 Neo4j 和 Cypher 的新手。

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

为了实现这一目标,我正在寻找使用 Cypher 为此搜索选项创建最佳查询的方法。

我的 USER 节点的结构如下:

(me:User { mid:"1234", name:"John Doe", email:"<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="d2b8a7b3bcfcb3a0b3bcb5bde3e0e1e692b5bfb3bbbefcb1bdbf" rel="noreferrer noopener nofollow">[email protected]</a>" })

其中“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 )的示例,我尝试通过将 friend 、 friend 的 friend 和其他人的查询与 UNION 操作混合来创建此查询,但是使用 UNION 由于实际情况,我无法对结果进行分页问题 1879 ( https://github.com/neo4j/neo4j/issues/1879 ) 和相关 2725,查询“其他”需要之前查询的结果( friend 和 friend 的 friend )

有什么更好的想法可以让这个查询在 Neo4j 方面更便宜吗?

如何搜索不是 friend 或 friend 的 friend 的用户?

谢谢!

最佳答案

您有一个很好的查询起点。您只需认为 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

如果两个用户之间没有路径,则距离将为,因此您可以在应用程序级别进行检查。

提示:shortestPath 的默认深度限制为 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

关于neo4j - 查询搜索任何用户,首先显示特定用户的 "friends"和 "friends of friends",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32429404/

相关文章:

neo4j - 如何在Neo4J中创建涉及多个属性的唯一约束

java - Neo4j SET 错误 - 变量未定义

neo4j - 组合多个密码匹配语句的结果

neo4j - 在哪里可以找到插件文件夹?

graph - Neo4j 查询具有相同关系的多个节点

ios - 使用 UIActivityViewController 在电子邮件中发送链接

database - 高性能网站

neo4j - 使用Kubernetes Ingress公开Neo4j Bolt

indexing - Neo4j 数据库索引

google-plus - 如何查看谁与 Google Plus 分享了您的网站或如何查看 Google Plus 指标和事件?