Neo4j REST API是否可以在BFS和DFS中选择算法?

时间:2014-07-30 07:04:11

标签: neo4j cypher graph-databases

我有一个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 API调用此查询

2 个答案:

答案 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