我有一个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)
通过REST调用此查询?
发布于 2014-07-30 08:39:35
你为什么一次又一次地重新配对?所以你会产生很多重复的路径。您还应该为: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
可选匹配就像外部连接一样。
发布于 2014-08-01 02:10:31
谢谢迈克尔的回答和教诲。:)
实际上,我对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
https://stackoverflow.com/questions/25030610
复制相似问题