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 - Fatal编程技术网

优化Neo4j密码查询

优化Neo4j密码查询,neo4j,cypher,Neo4j,Cypher,我要做的是获取所有与用户配置文件有特定定向关系的配置文件*,如果这些配置文件有备用配置文件*,则获取这些配置文件,以防用户备用配置文件*与之有关系。我也需要关系的方向 我的问题是,对于大约10000个节点,获取数据大约需要5秒钟。 我对节点和关系进行了自动索引 这就是我的节点的关联方式: 用户-[:配置文件]->ProfileA-[:相关]->ProfileBProfileB2ProfileB 其中用户-->档案A-->档案B 使用ProfileA、rel、ProfileB 匹配ProfileB

我要做的是获取所有与用户配置文件有特定定向关系的配置文件*,如果这些配置文件有备用配置文件*,则获取这些配置文件,以防用户备用配置文件*与之有关系。我也需要关系的方向

我的问题是,对于大约10000个节点,获取数据大约需要5秒钟。 我对节点和关系进行了自动索引

这就是我的节点的关联方式:

用户-[:配置文件]->ProfileA-[:相关]->ProfileBProfileB2ProfileB 其中用户-->档案A-->档案B 使用ProfileA、rel、ProfileB
匹配ProfileBProfileB2ProfileBProfileB2您正在使用的
WHERE
子句,您不需要这样做。让我们来看第一个例子:

WHERE User-->ProfileA-->ProfileB 
本条款规定“仅将结果限制为与ProfileA有关系的用户,而ProfileA本身与ProfileB有关系”。然而,你的匹配条款已经保证了这一点。你在浪费CPU周期,因为你在验证一些已经正确的东西

WITH ProfileA, rel, ProfileB 
您没有进行任何类型的聚合、计算或重新分配,因此不需要使用
WITH
子句。没有它,你可以继续

WHERE relB IS NULL OR User-->ProfileA-->ProfileB<-->ProfileB2<--ProfileA2<--User

试试看,性能是否更好。如果这还不够,那么你可能需要在你的问题中添加更多的信息——就我而言,我并不完全理解你的关系实际上意味着什么(例如,“我”关系是什么?它象征着什么?

你使用的是你不需要的
WHERE
子句。让我们来看第一个例子:

WHERE User-->ProfileA-->ProfileB 
本条款规定“仅将结果限制为与ProfileA有关系的用户,而ProfileA本身与ProfileB有关系”。然而,你的匹配条款已经保证了这一点。你在浪费CPU周期,因为你在验证一些已经正确的东西

WITH ProfileA, rel, ProfileB 
您没有进行任何类型的聚合、计算或重新分配,因此不需要使用
WITH
子句。没有它,你可以继续

WHERE relB IS NULL OR User-->ProfileA-->ProfileB<-->ProfileB2<--ProfileA2<--User

试试看,性能是否更好。如果这还不够,那么你可能需要在你的问题中添加更多的信息——就我而言,我并不完全理解你的关系实际上意味着什么(例如,“我”关系是什么?它象征着什么?

这就是我如何解决它的:

START User=node({source}) 
MATCH User-[:profile]->ProfileA-[rel:related]->ProfileB<-[?:me]->ProfileB2-[relB?:related]-ProfileA2
WHERE relB IS NULL OR User-[:profile]->ProfileA2
RETURN ProfileB, COLLECT(ProfileB2), rel, relB
LIMIT 25
START User=node({source})
匹配用户-[:profile]->ProfileA-[rel:related]->ProfileBProfileB2-[relB?:related]-ProfileA2
其中relB为NULL或User-[:profile]->ProfileA2
返回ProfileB,COLLECT(ProfileB2),rel,relB
限制25

ProfileA2我就是这样解决的:

START User=node({source}) 
MATCH User-[:profile]->ProfileA-[rel:related]->ProfileB<-[?:me]->ProfileB2-[relB?:related]-ProfileA2
WHERE relB IS NULL OR User-[:profile]->ProfileA2
RETURN ProfileB, COLLECT(ProfileB2), rel, relB
LIMIT 25
START User=node({source})
匹配用户-[:profile]->ProfileA-[rel:related]->ProfileBProfileB2-[relB?:related]-ProfileA2
其中relB为NULL或User-[:profile]->ProfileA2
返回ProfileB,COLLECT(ProfileB2),rel,relB
限制25

您的查询的问题是我收到了副本。每个节点之间必须只有一个跃点,据我所知,Neo4j是贪婪的,除非您指定[:profile*.1],但这不适用于可选关系,这就是为什么我需要WHERE。[:me]关系象征着链接到GitHub配置文件的Twitter配置文件。以下是一个示例:由
创建(用户),(UserProfileA)创建,(UserProfileB),(ProfileA),(ProfileB),User-[:profile]->UserProfileA-[:follow]->ProfileA-[:me]->ProfileB,ProfileA-[:follow]->UserProfileA,User-[:profile]->UserProfileB-[:follow]->ProfileB-[:me]->ProfileA,ProfileB-[:follow]->UserProfileB;
@webjay我不确定你在第一条评论中所说的贪婪是什么意思。除非你指定
:profile*
或某个可变长度路径的变体,否则它不会遍历多个深度。我认为Neo4j是贪婪的,因为手动声明minHops和maxHops是可选的,默认分别为1和无穷大,但我认为Neo4j是贪婪的我猜只有在使用*的情况下才会出现这种情况。您的查询的问题是我得到了双副本。每个节点之间必须只有一个跃点,而且据我所知,Neo4j是贪婪的,除非您指定[:profile*.1],但这不适用于可选关系,这就是为什么我需要WHERE.[:me]关系象征链接到GitHub配置文件的Twitter配置文件。下面是一个示例:由以下人员创建:创建(用户),(用户配置文件A),(用户配置文件B),(配置文件A),(配置文件B),用户-[:配置文件A-->用户配置文件A-[:跟随]->配置文件B,配置文件A-[:跟随]->用户配置文件A,用户-[:配置文件]->配置文件B-[:跟随]->配置文件B-[:我]->ProfileA,ProfileB-[:follow]->UserProfileB;
@webjay我不确定你在第一条评论中所说的贪婪是什么意思。除非你指定
:profile*
或某个可变长度路径的变体,否则它不会遍历多个深度。我认为Neo4j是贪婪的,因为手动声明minHops和maxHops是可选的,默认分别为1和无穷大,但我认为Neo4j是贪婪的我猜只有在使用*时才可以。