在neo4j中存储临时变量

时间:2015-06-23 10:27:46

标签: neo4j cypher graph-databases

我有一些针对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的查询文件。

我尝试使用来自transactionspy2neo来执行这些查询,但这不可行,因为我的帖子请求长度非常大并且会超时。结果,我虽然使用

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;

1 个答案:

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