首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >多链路密码neo4j优化( //面搜索?)

多链路密码neo4j优化( //面搜索?)
EN

Stack Overflow用户
提问于 2014-07-22 14:30:23
回答 1查看 141关注 0票数 1

在进一步研究之前,这里是我的数据模型的一个表象。我现在只能使用Neo4J 1.9.2,并且有一个相当大的数据库(据我所知,大约有100万个节点,可能更少,但随着时间的推移,所有的数据都会被吞并)。既然你已经想好了,让我们来解释一下我所说的分面搜索是什么意思。

My (documentaryUnit)有时链接到关键字(这些关键字可以有不同的类型)。我想要实现的是一种选择少量关键字的方法,看看是否有符合连接到keyword1、keyword2等要求的节点。我不想做什么方面的搜索主要是关于,又名。显示可能的数量,使其无法查询是否有0的结果,并匹配其他可能性。我只想能够做这个“简单”的查询。请记住,我在Neo4J世界是很新的,试图找到一个答案之前,但由于我缺乏一些概念性的东西,可能错过了正确的职位。

下面是我尝试过的查询:

代码语言:javascript
复制
    START 
    facet1 = node:entities("__ID__:keyword-104"),
    facet2 = node:entities("__ID__:place-1"),
    facet3 = node:entities("__ID__:keyword-2"),
    facet4 = node:entities("__ID__:keyword-258")
MATCH
    (elem)<-[:hasLinkTarget]-(link)-[:hasLinkTarget]->(facet1),
    (elem)<-[:hasLinkTarget]-(link)-[:hasLinkTarget]->(facet2),
    (elem)<-[:hasLinkTarget]-(link)-[:hasLinkTarget]->(facet3),
    (elem)<-[:hasLinkTarget]-(link)-[:hasLinkTarget]->(facet4)
WITH distinct elem, facet1, facet2, facet3, facet4, link
RETURN elem

不管有没有不同的,它需要很长时间,基本上有时崩溃。只有两个关键字,它工作良好(< 100 ms)。3是长的,4次崩溃(或多或少)。我需要找到一种不使用任何外部服务的方法(由于升级的原因,solr在这里不是一个选项)。

考虑到我所附的图片,我想要的是找到像#1这样的documentaryUnit,通过链接连接到关键字1、4、5、3。我也尝试过收集,这样做:

代码语言:javascript
复制
START doc = node:entities("__ISA__:documentaryUnit")
MATCH (doc)<-[:hasLinkTarget]-(link)-[:hasLinkTarget]->(accessPoints)
WITH collect(accessPoints.__ID__) AS accessPointsId, doc
WHERE ALL (x IN ['keyword-104', 'place-1', 'keyword-2']
           WHERE x IN accessPointsId)
RETURN doc.__ID__

它不会崩溃,而是以大量basenode作为开始入口点。在1000到2000毫秒之间。

谢谢你阅读这篇文章,当你发帖时会尽快回复。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-07-28 10:01:25

两种解决方案。最好的(大约500毫秒用于缓存,270毫秒之后):

代码语言:javascript
复制
START 
    accessPoints = node:entities("__ID__:kw-1 OR __ID__:kw-2 OR __ID__:kw-3 OR __ID__:kw-4")
MATCH 
    (doc)<-[:hasLinkTarget]-(link)-[:hasLinkTarget]->accessPoints
WHERE doc.__ISA__ = "documentaryUnit"
WITH collect(accessPoints.__ID__) AS accessPointsId, doc
WHERE ALL (x IN ['kw-1', 'kw-2', 'kw-3', 'kw-4']
           WHERE x IN accessPointsId)
RETURN doc

第二个5000毫秒和400毫秒之后

代码语言:javascript
复制
START 
    facet1 = node:entities("__ID__:kw-1"),
    facet2 = node:entities("__ID__:kw-2"),
    facet3 = node:entities("__ID__:kw-3"),
    facet4 = node:entities("__ID__:kw-4")
MATCH
    (elem)<-[:hasLinkTarget]-()-[:hasLinkTarget]->facet1,
    (elem)<-[:hasLinkTarget]-()-[:hasLinkTarget]->facet2,
    (elem)<-[:hasLinkTarget]-()-[:hasLinkTarget]->facet3,
    (elem)<-[:hasLinkTarget]-()-[:hasLinkTarget]->facet4
WHERE elem.__ISA__ = "documentaryUnit"
RETURN elem

移除这个给了我更快的反应。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24890163

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档