Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Neo4j 查询以搜索任何首先显示以下内容的用户;“朋友”;及;“朋友之友”;特定用户的_Neo4j_Cypher_Social Networking - Fatal编程技术网

Neo4j 查询以搜索任何首先显示以下内容的用户;“朋友”;及;“朋友之友”;特定用户的

Neo4j 查询以搜索任何首先显示以下内容的用户;“朋友”;及;“朋友之友”;特定用户的,neo4j,cypher,social-networking,Neo4j,Cypher,Social Networking,我是neo4j和Cypher的新同事 目前,我正在开发一个社交网站,使用neo4j获取数据。这将在顶部栏中提供搜索选项,以查找社交网络上的其他用户,但对于搜索结果,我希望首先显示那些是朋友的用户,然后是朋友的朋友,然后是其他用户。所有这些,就像在facebook上搜索一样,对搜索结果进行分页 为了实现这一点,我正在寻找使用Cypher为这个搜索选项创建最佳查询的方法 我的用户节点具有如下结构: (me:User { mid:"1234", name:"John Doe", email:"juan

我是neo4j和Cypher的新同事

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

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

我的用户节点具有如下结构:

(me:User { mid:"1234", name:"John Doe", email:"juan.arango1234@gmail.com" })
其中“mid”属性是一个自定义ID

用户节点之间的友谊关系在两个方向上都有“FRIENDOF”标签:

(a:User)-[:FRIENDOF]->(b:User) and (a:User)<-[:FRIENDOF]-(b:User)
这个查询似乎工作得很好,但我不知道应该有一个更优化的查询方式

按照Neo4j documentation()的示例,我尝试通过将朋友、朋友的朋友和其他人的查询与UNION操作混合来创建此查询,但由于实际问题1879()和相关的2725,使用UNION我无法分页结果,“其他人”的查询需要前面查询的结果(朋友和朋友的朋友)

用neo4j术语来说,有没有更好的办法来降低这个查询的成本

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


谢谢!

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

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

参考演示图:

编辑

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

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

谢谢Christophe!你的建议非常有用,因为可选的最短路径仅在1到2次跳转之间。这是我唯一需要为朋友和朋友的朋友排序的事情。如果是事实,我已经添加了一些对朋友建议更有用的内容:共同朋友的数量…这样行吗?'MATCH(me:User{mid:“1234”}),(其他:User{name:“Any User name”})可选匹配p=shortestPath((me)-[:FRIENDOF*1..2]-(其他))可选匹配c=((me)-[:FRIENDOF]->(common:User)-[:FRIENDOF]->(其他))返回其他,长度(p)作为距离,计数(common)作为朋友按距离ASC'最后一个查询非常有用,克里斯托夫,谢谢!
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