繁体   English   中英

Neo4J Cypher Query查找公共链接节点

[英]Neo4J Cypher Query to find common linked nodes

我正在Noe4j 3.2.0中制作一个命名实体图。 我有ARTICLEENTITY作为节点类型。 它们之间的关系/边缘是CONTAINS 它表示实体在该文章中发生的次数(如附件图片中的文章和实体的简单图所示)。 因此,如果某商品有一个实体有5次,则该商品与特定实体之间会有5条边。

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

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

用例1:找到文章中存在的所有实体,这些实体具有按列表顺序的列表[“ A”,“ B”]中的实体,以及实体“ X”,实体“ 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

查询配置文件在这里: 查询配置文件

此查询为我提供了具有X,Y,Z和A,B实体中至少一个实体的商品的所有第一级实体邻居(为了内容敏感度,我不得不更改查询中的ID)。

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

另一个观察结果是,如果我继续添加过滤器(更多的X,Y,Z等匹配子句),性能将会下降; 尽管结果集越来越小。

您在: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;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM