Neo4j查询性能标记搜索

Neo4j查询性能标记搜索,neo4j,cypher,Neo4j,Cypher,我想过滤一些单词(标签)上的消息 目前,只有我不想看到包含这两个词的信息 我们制作了一个时间树,这样我们就不必搜索所有的消息。在最好的情况下,我不会搜索一个月(30天) 这个月有57.371条信息 PROFILE MATCH (startleaf:Hour{hash: '2018/04/01/05'}) , (endleaf:Hour{hash: '2018/04/30/05'}) , p = shortestPath((startleaf)-[:NEXT*0..]->(endleaf))

我想过滤一些单词(标签)上的消息

目前,只有我不想看到包含这两个词的信息

我们制作了一个时间树,这样我们就不必搜索所有的消息。在最好的情况下,我不会搜索一个月(30天)

这个月有57.371条信息

PROFILE
MATCH (startleaf:Hour{hash: '2018/04/01/05'})
, (endleaf:Hour{hash: '2018/04/30/05'})
, p = shortestPath((startleaf)-[:NEXT*0..]->(endleaf))
UNWIND nodes(p) AS leaf
MATCH (leaf)<-[:SENDED]-(message:TS_P2000Message)
WITH distinct message
MATCH (message)-[:HAS_WORD]->(TS_Word { name:'someren'})
WITH distinct message AS message
MATCH (message)-[:HAS_WORD]->(TS_Word { name:'kruisbaan'})
WITH distinct message AS message
WITH count(message) AS results, collect(message) AS messages
UNWIND(messages) AS message
WITH results, message AS message
SKIP 0 LIMIT 15
RETURN results, message

Cypher version: CYPHER 3.3, planner: COST, runtime: INTERPRETED. 1065560 total db hits in 2244 ms.
PROFILE
匹配(startEAF:Hour{hash:'2018/04/01/05'})
,(endleaf:Hour{hash:'2018/04/30/05'})
,p=shortestPath((startEAF)-[:NEXT*0..]>(endleaf))
将节点(p)作为叶展开
匹配(叶)(单词{name:'someren})
以不同的消息作为消息
匹配(消息)-[:HAS_WORD]->(TS_WORD{name:'kruisbaan'})
以不同的消息作为消息
将计数(消息)作为结果,将收集(消息)作为消息
作为消息展开(消息)
有了结果,消息就变成了消息
跳过0限制15
返回结果、消息
密码版本:密码3.3,计划员:成本,运行时:解释。2244毫秒内总命中率为1065560分贝。

当我不想在没有单词过滤器的情况下查询所有消息时,查询速度会更快

PROFILE
MATCH (startleaf:Hour{hash: '2018/04/01/05'})
, (endleaf:Hour{hash: '2018/04/30/05'})
, p = shortestPath((startleaf)-[:NEXT*0..]->(endleaf))
UNWIND nodes(p) AS leaf
MATCH (leaf)<-[:SENDED]-(message:TS_P2000Message)
WITH distinct message
WITH count(message) AS results, collect(message) AS messages
UNWIND(messages) AS message
WITH results, message AS message
SKIP 0 LIMIT 15
RETURN results, message

Cypher version: CYPHER 3.3, planner: COST, runtime: INTERPRETED. 115167 total db hits in 268 ms.
PROFILE
匹配(startEAF:Hour{hash:'2018/04/01/05'})
,(endleaf:Hour{hash:'2018/04/30/05'})
,p=shortestPath((startEAF)-[:NEXT*0..]>(endleaf))
将节点(p)作为叶展开
匹配(叶)(端叶))
将节点(p)作为叶展开

匹配(叶)您可以尝试以下查询:

MATCH  p = shortestPath((startleaf:Hour{hash: '2018/04/01/05'})-[:NEXT*0..]->(endleaf:Hour{hash: '2018/04/30/05'}))
WITH NODES(p) AS dates
  MATCH (message:TS_P2000Message)-[:SENDED]->(leaf),
        (message)-[:HAS_WORD]->(TS_Word)
  WHERE leaf IN dates AND
        message.name IN ['kruisbaan', 'someren']
  WITH distinct message AS message
  WITH count(message) AS results, collect(message) AS messages
  UNWIND(messages) AS message
  WITH results, message AS message
  SKIP 0 LIMIT 15
  RETURN results, message

另外,您是否可以在
:TS_p2000 message(name)
上使用索引尝试此查询您忘记了
:TS_Word前面标签的冒号
你应该在
:TS_Word(name)

我认为发送的文字比你的时间过滤器更具限制性

因此,我会:

MATCH (message:TS_P2000Message)-[:HAS_WORD]->(:TS_Word { name:'someren'}),
      (message)-[:HAS_WORD]->(:TS_Word { name:'kruisbaan'})
MATCH (leaf:Hour)<-[:SENDED]-(message)
WHERE '2018/04/01/05' <= leaf.hash <= '2018/04/30/05'
WITH count(message) AS results, collect(message) AS messages
UNWIND messages AS message
RETURN results, message
SKIP 0 LIMIT 15
匹配(消息:TS_P2000Message)-[:HAS_WORD]->(:TS_WORD{name:'someren'}),
(消息)-[:HAS_WORD]->(:TS_WORD{name:'kruisbaan'})

MATCH(leaf:Hour)感谢您的输入,但此查询需要花费大量时间<代码>密码版本:密码3.3,计划员:成本,运行时:解释。5657126在71874毫秒内的总db命中率。
几个月后,我又回到这个问题上。我知道问题出在你的问题上。您使用message.name,我将其更改为word.name,并在(TS_word)中添加一个名称。结果很好,查询速度很快!在接下来的几天里,我将进行更多的测试。谢谢你的回答。(我现在已经将Neo4j更新为3.4)TS_Word(名称)已经有了唯一的索引。在这种情况下,你的查询速度比我的快。但是,当我们只需要带有“a2”的单词时,我们在单词上会有更多的结果。比我的正则表达式查询更快。
MATCH (message:TS_P2000Message)-[:HAS_WORD]->(:TS_Word { name:'someren'}),
      (message)-[:HAS_WORD]->(:TS_Word { name:'kruisbaan'})
MATCH (leaf:Hour)<-[:SENDED]-(message)
WHERE '2018/04/01/05' <= leaf.hash <= '2018/04/30/05'
WITH count(message) AS results, collect(message) AS messages
UNWIND messages AS message
RETURN results, message
SKIP 0 LIMIT 15