我有一些针对neo4j数据库执行的密码查询。查询采用这种形式
MATCH p=(j:JOB)-[r:HAS|STARTS]->(s:URL)-[r1:VISITED]->(t:URL)
WHERE j.job_id =5000 and r1.origin='iframe' and r1.job_id=5000 AND NOT (t.netloc =~ 'VERY_LONG_LIST')
RETURN count(r1) AS number_iframes;
如果你无法理解我在做什么。这是一个更简单的查询
MATCH (s:WORD)
WHERE NOT (s.text=~"badword1|badword2|badword3")
RETURN s
我基本上试图将某些单词与特定列表匹配
问题是这个列表非常大,因为你可以看到我的job_id = 5000并且我有20000多个工作,所以如果我的白名单长度是1MB,那么我最终会得到非常大的查询。我尝试了500个作业,最终获得了200 MB的查询文件。
我尝试使用来自transactions的py2neo来执行这些查询,但这不可行,因为我的帖子请求长度非常大并且会超时。结果,我虽然使用
neo4j-shell -file <queries_file>
但是,由于大白名单,您可以看到文件大小非常大。所以我的问题是,无论如何我可以存储这个&#34;白名单&#34;使用cypher在neo4j中的变量? 我希望如果有类似的东西
SAVE $whitelist="word1,word2,word3,word4,word5...."
MATCH p=(j:JOB)-[r:HAS|STARTS]->(s:URL)-[r1:VISITED]->(t:URL)
WHERE j.job_id =5000 and r1.origin='iframe' and r1.job_id=5000 AND NOT (t.netloc =~ $whitelist)
RETURN count(r1) AS number_iframes;
答案 0 :(得分:1)
你的netloc是什么数据类型?
如果你有netloc的索引,你也可以使用t.netloc IN {list}
,其中{list}是从外面提供的参数。
如此大的正则表达式不会很快 你的regexp和netloc格式究竟是什么样的?也许您可以将其更改为拆分+索引列表查找?
通常,对于regexp,您可以提供外部参数。
你也可以使用&#34; IN&#34; + job_ids的索引。
您还可以运行单独的作业,使用标签标记白名单中的作业,并使用该标签进行其他过滤,例如在比赛中已经。
为什么你要两次检查?这项工作的id = 5000还不够吗?
j.job_id =5000 and r1.job_id=5000