我有一个Cypher查询,目前是depth-first-search(DFS, Neo4j default algorithm)
MATCH p1=(a)--(b)
WHERE a.profileId = '203'
OPTIONAL MATCH p2=(a)--(b)--(c)
WHERE a.profileId = '203'
OPTIONAL MATCH p3=(a)--(b)--(c)--(d)
WHERE a.profileId = '203'
RETURN DISTINCT a,b,c,d
LIMIT 500
我尝试使用SORT(Length(p3))
,其中查询运行速度非常慢。
是否可以使用breadth-first-search(BFS)
?
答案 0 :(得分:1)
你为什么一次又一次地重新匹配?因此,您生成了大量重复的路径。 您还应该使用标签+和索引或约束:User(profileId),以便您查找a足够快。 你可能想要指定一种关系类型和方向。
create index on :User(profileId);
MATCH (a:User)--(b)
WHERE a.profileId = '203'
OPTIONAL MATCH (b)--(c)--(d)
RETURN distinct a,b,c,d limit 500
可选匹配就像外连接
答案 1 :(得分:0)
感谢Michael的回答和教导。 :)
实际上我对Cypher的理解有一些错误,我试图将Cypher查询写成SQL。
事实上这是错误的。
如果我们在匹配中使用路径,如(a) - (b),则无需在子句中再次引用它,即可选匹配。只需直接使用(b) - (c)即可。 (a) - (b) - (c)将返回重复的结果。
这是我当前的查询:
MATCH (a:Profile)-[r1]-(b)
WHERE a.profileId = 'twitter_20357508'
and r1.dateTimePostedMil > 1388534400000
and r1.dateTimePostedMil < 1417392000000
OPTIONAL MATCH (b)-[r2]-(c)
WHERE r2.dateTimePostedMil > 1388534400000
and r2.dateTimePostedMil < 1417392000000
OPTIONAL MATCH (c)-[r3]-(d)
WHERE r3.dateTimePostedMil > 1388534400000
and r3.dateTimePostedMil < 1417392000000
RETURN distinct a,r1,b,r2,c,r3,d limit 100