在双向关系中,Neo4j cypher查询速度太慢(dbhits太多)
具有流动数据模型:在双向关系中,Neo4j cypher查询速度太慢(dbhits太多),neo4j,cypher,Neo4j,Cypher,具有流动数据模型: (Phone{phoneNumber})-[:CALL]-(Phone{phoneNumber}) (Person{personId})-[:KEEP]-(Phone{personId}) (Case{caseId})-[:INVOLVE]-(Person{personId}) 这三者都使用双向关系。并在phoneNumber/personId/caseId上创建索引 用户可以输入一个或多个字符串,这些字符串可能表示为phoneNumber/ Ca
(Phone{phoneNumber})-[:CALL]-(Phone{phoneNumber})
(Person{personId})-[:KEEP]-(Phone{personId})
(Case{caseId})-[:INVOLVE]-(Person{personId})
这三者都使用双向关系。并在phoneNumber/personId/caseId上创建索引
用户可以输入一个或多个字符串,这些字符串可能表示为phoneNumber/
CaseID/HuffID查询它们的关系(<强>不/强>考虑方向和关系深度可以是1到4)。
以下是密码查询:
match p = n-[r*1..4]-m
with n,m,p
where (n.phoneNumber in ["xxx","yyy"]
or n.caseSjNo in ["xxx","yyy"]
or n.identificationNumber in ["xxx","yyy"])
and (m.phoneNumber in ["xxx","yyy"]
or m.caseSjNo in ["xxx","yyy"]
or m.identificationNumber in ["xxx","yyy"])
and n <> m
return p limit 1000
匹配p=n-[r*1..4]-m
用n,m,p
其中(n.电话号码在[“xxx”,“yyy”]
或[“xxx”,“yyy”]
或n.[“xxx”,“yyy”]中的标识号)
和(m.phoneNumber在[“xxx”,“yyy”]
或[“xxx”,“yyy”]
或[“xxx”、“yyy”]中的m.标识号)
和n m
返回p限制1000
我在shell控制台中分析了这个查询字符串。在neo4j db中有10000个节点,我发现Dbhits非常棒。以下是结果(深度=1和深度=4):
neo4j sh(?)$profile将p=n-[r*1..1]-m与n,m,p匹配,其中(n.phoneNumber in[“XXX”,“YYY”]或n.caseSjNo in[“XXX”,“YYY”]或n.identificationNumber in[“XXX”,“YYY”]和(m.phoneNumber in[“XXX”,“YYY”]或m.caseSjNo in[“XXX”,“YYY”]或m.identificationNumber in[“XXX”,“YYY”]))n m返回p限制1000;
==> +---+
==>| p|
==> +---+
==> +---+
=>0行
==>
==>列过滤器(0)
==> |
==>+片
==> |
==>+滤波器
==> |
==>+列过滤器(1)
==> |
==>+提取路径
==> |
==>+遍历匹配器
==>
==> +------------------+-------+--------+-------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
==>|运算符|行|数据命中数|标识符| 其他|
==> +------------------+-------+--------+-------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
==>|列过滤器(0) | 0 | 0 | | 保留第p列|
==>|切片| 0 | 0 | | {AUTOINT12}|
=>|过滤器| 0 | 480776 | | |((((集合中的任意(-内部-)(列表({AUTOSTRING0},{AUTOSTRING1}))其中属性(n,phoneNumber(3))=-|-内部-|-)或集合中的任意(-内部-|列表({AUTOSTRING2},{AUTOSTRING3
neo4j-sh (?)$ profile match p = n-[r*1..1]-m with n,m,p where (n.phoneNumber in ["XXX","YYY"] or n.caseSjNo in ["XXX","YYY"] or n.identificationNumber in ["XXX","YYY"]) and (m.phoneNumber in ["XXX","YYY"] or m.caseSjNo in ["XXX","YYY"] or m.identificationNumber in ["XXX","YYY"]) and n <> m return p limit 1000;
==> +---+
==> | p |
==> +---+
==> +---+
==> 0 row
==>
==> ColumnFilter(0)
==> |
==> +Slice
==> |
==> +Filter
==> |
==> +ColumnFilter(1)
==> |
==> +ExtractPath
==> |
==> +TraversalMatcher
==>
==> +------------------+-------+--------+-------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
==> | Operator | Rows | DbHits | Identifiers | Other |
==> +------------------+-------+--------+-------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
==> | ColumnFilter(0) | 0 | 0 | | keep columns p |
==> | Slice | 0 | 0 | | { AUTOINT12} |
==> | Filter | 0 | 480776 | | ((((any(-_-INNER-_- in Collection(List({ AUTOSTRING0}, { AUTOSTRING1})) where Property(n,phoneNumber(3)) == -_-INNER-_-) OR any(-_-INNER-_- in Collection(List({ AUTOSTRING2}, { AUTOSTRING3})) where Property(n,caseSjNo(0)) == -_-INNER-_-)) OR any(-_-INNER-_- in Collection(List({ AUTOSTRING4}, { AUTOSTRING5})) where Property(n,identificationNumber(2)) == -_-INNER-_-)) AND ((any(-_-INNER-_- in Collection(List({ AUTOSTRING6}, { AUTOSTRING7})) where Property(m,phoneNumber(3)) == -_-INNER-_-) OR any(-_-INNER-_- in Collection(List({ AUTOSTRING8}, { AUTOSTRING9})) where Property(m,caseSjNo(0)) == -_-INNER-_-)) OR any(-_-INNER-_- in Collection(List({ AUTOSTRING10}, { AUTOSTRING11})) where Property(m,identificationNumber(2)) == -_-INNER-_-))) AND NOT(n == m)) |
==> | ColumnFilter(1) | 20034 | 0 | | keep columns n, m, p |
==> | ExtractPath | 20034 | 0 | p | |
==> | TraversalMatcher | 20034 | 50152 | | m, UNNAMED11, m, r |
==> +------------------+-------+--------+-------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
==>
==> Total database accesses: 530928
------------------------------------------------------
------------------------------------------------------
neo4j-sh (?)$ profile match p = n-[r*1..4]-m with n,m,p where (n.phoneNumber in ["XXX","YYY"] or n.caseSjNo in ["XXX","YYY"] or n.identificationNumber in ["XXX","YYY"]) and (m.phoneNumber in ["XXX","YYY"] or m.caseSjNo in ["XXX","YYY"] or m.identificationNumber in ["XXX","YYY"]) and n <> m return p limit 1000 ;
==> +---+
==> | p |
==> +---+
==> +---+
==> 0 row
==>
==> ColumnFilter(0)
==> |
==> +Slice
==> |
==> +Filter
==> |
==> +ColumnFilter(1)
==> |
==> +ExtractPath
==> |
==> +TraversalMatcher
==>
==> +------------------+---------+-----------+-------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
==> | Operator | Rows | DbHits | Identifiers | Other |
==> +------------------+---------+-----------+-------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
==> | ColumnFilter(0) | 0 | 0 | | keep columns p |
==> | Slice | 0 | 0 | | { AUTOINT12} |
==> | Filter | 0 | 120244220 | | ((((any(-_-INNER-_- in Collection(List({ AUTOSTRING0}, { AUTOSTRING1})) where Property(n,phoneNumber(3)) == -_-INNER-_-) OR any(-_-INNER-_- in Collection(List({ AUTOSTRING2}, { AUTOSTRING3})) where Property(n,caseSjNo(0)) == -_-INNER-_-)) OR any(-_-INNER-_- in Collection(List({ AUTOSTRING4}, { AUTOSTRING5})) where Property(n,identificationNumber(2)) == -_-INNER-_-)) AND ((any(-_-INNER-_- in Collection(List({ AUTOSTRING6}, { AUTOSTRING7})) where Property(m,phoneNumber(3)) == -_-INNER-_-) OR any(-_-INNER-_- in Collection(List({ AUTOSTRING8}, { AUTOSTRING9})) where Property(m,caseSjNo(0)) == -_-INNER-_-)) OR any(-_-INNER-_- in Collection(List({ AUTOSTRING10}, { AUTOSTRING11})) where Property(m,identificationNumber(2)) == -_-INNER-_-))) AND NOT(n == m)) |
==> | ColumnFilter(1) | 5010178 | 0 | | keep columns n, m, p |
==> | ExtractPath | 5010178 | 0 | p | |
==> | TraversalMatcher | 5010178 | 20070774 | | m, UNNAMED11, m, r |
==> +------------------+---------+-----------+-------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
==>
==> Total database accesses: 140314994
create index on :Entity(id);
match (n:Entity),(m:Entity)
where n.id in ["xxx","yyy"] and m.id in ["xxx","yyy"] and n<>m
match p = (n)-[r*1..4]-(m)
return p
limit 1000
match p = (n:Person)-[r*1..4]-(m:Case)
where n.identificationNumber in ["xxx","yyy"] and m.caseSjNo in ["xxx","yyy"]
return p limit 500
UNION
match p = (n:Person)-[r*1..4]-(m:Phone)
where n.identificationNumber in ["xxx","yyy"] and m.phoneNumber in ["xxx","yyy"]
return p limit 500
UNION
...