Neo4J Cypher查询查找公共链接节点

时间:2018-06-08 00:31:23

标签: neo4j cypher graph-databases

我在Noe4j 3.2.0中创建一个命名实体图。我有ARTICLEENTITY作为节点类型。它们之间的关系/边缘是CONTAINS;表示实体在该文章中出现的次数(如附图Simple graph for articles and entities所示)。因此,如果一篇文章有​​一个实体5次,那么该文章和特定实体之间将有5条边。

大约有1800万篇文章和4万个独特实体。整个数据大约为20GB(包括ID上的索引),并加载到具有32 GB RAM的计算机上。

我正在使用此图表来推荐/推荐其他实体。但我的查询花了太多时间。

使用案例1:查找文章中存在的所有实体,这些实体具有列表中的实体[" A"," B"]并且还具有实体" X&#34 ;和实体" Y"和实体" Z"按文章计数顺序。

这是我正在运行的密码查询。

MATCH(e:Entity)-[:CONTAINS]-(a:Article)
WHERE e.EID in ["A","B"]
WITH a
MATCH (:Entity {EID:"X"})-[:CONTAINS]-(a)
WITH a
MATCH (:Entity {EID:"Y"})-[:CONTAINS]-(a)
WITH a
MATCH (:Entity {EID:"Z"})-[:CONTAINS]-(a)
WITH a
MATCH (a)-[:CONTAINS]-(e2:Entity)
RETURN e2.EID as EID, e2.Text as Text, e2.Type as Type ,count(distinct(a)) as articleCount
ORDER BY articleCount desc

查询个人资料在此处:Query Profile

此查询为我提供了包含X,Y,Z以及A,B实体中至少一个的文章的所有第一级实体邻居(我必须更改查询中的ID以获取内容敏感度)。

我只是想知道是否有更好/更快的方法吗?

另一个观察是,如果我继续添加过滤器(更多匹配条款,如X,Y,Z),性能会恶化;尽管结果集越来越小。

1 个答案:

答案 0 :(得分:0)

您在:Entity(EID)上有唯一性约束,因此至少已经实施了优化。

以下Cypher查询更简单,并生成更简单的执行计划。希望它也减少了数据库命中数。

MATCH (e:Entity)-[:CONTAINS]-(a)
WHERE e.EID in ['A','B'] AND ALL(x IN ['X','Y','Z'] WHERE (:Entity {EID: x})-[:CONTAINS]-(a))
WITH a
MATCH (a)-[:CONTAINS]-(e2:Entity)
RETURN e2.EID as EID, e2.Text as Text, e2.Type as Type, COUNT(DISTINCT a) as articleCount
ORDER BY articleCount DESC;