如何在大图数据库中使用可选匹配子句优化密码查询?

时间:2017-03-13 21:18:09

标签: c++ database graph neo4j cypher

当我在简单的密码查询中使用可选的匹配子句时,如下所示:

MATCH ()-[R0:relationshipclazz0]-() 
OPTIONAL MATCH ()-[R0:relationshipclazz0]->(N0:entityclazz0)
WITH distinct R0, R0.att0 as AR0att0, N0  
WITH ID(R0) as i,   R0.att0 as O1,  (N0.att0) as O2, R0 
RETURN  O1, O2, count(i) 
ORDER BY  O1, O2

此查询在具有50 000个关系和6000个节点的图形数据库中花费381秒

请知道我怎么能优化这个查询知道我必须匹配,因为我想要在我的数据库中找到空值,因为只使用匹配子句我没有得到空值

提前致谢

1 个答案:

答案 0 :(得分:0)

通过关系而不是使用起始节点或节点标签查找这些类型的查询的一个大问题是,此时不存在通过Neo4j中的类型查找关系的有效方法。目前,您的查询必须查看数据库中的所有节点,并检查它们的所有关系以找到正确类型的节点。

您可以使用APOC Procedures(根据您的Neo4j版本使用正确的APOC版本)在您的关系中添加manual indexes。这确实需要在您的所有关系上使用一些非null属性才能使索引查找起作用(我们可以使用["nature", "love", "instacool", "anothertogether", "likeforlike", "relax", "festival", "aaa", "anotherhashtag"] ,前提是它存在于您的所有:relationshipclazz0关系中)。

我们首先需要手动将所有这些关系添加到索引中:

att0

现在我们可以从索引查询:

MATCH ()-[r:relationshipclazz0]-() 
CALL apoc.index.addRelationship(r,['att0'])
RETURN count(*)