【问题标题】:Neo4J Cypher Query to find common linked nodesNeo4J Cypher 查询以查找常见的链接节点
【发布时间】:2018-11-17 23:52:06
【问题描述】:

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

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

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

用例 1:查找文章中存在的所有实体,这些实体具有列表 ["A", "B"] 中的实体,并且在文章计数顺序。

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

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),性能会下降;尽管结果集越来越小。

【问题讨论】:

  • 你真的想要a所有 一级实体邻居——即使是那些EID 值不是“A”、“B”、“X”的邻居”、“Y”和“Z”?
  • @cybersam 是的,EID 是唯一的。所以 A,B,X,Y,Z 是搜索条件。我们需要在这些文章中找到所有其他实体。

标签: neo4j cypher graph-databases


【解决方案1】:

您对:Entity(EID) 有唯一性约束,因此至少优化已经到位。

以下 Cypher 查询更简单,并生成更简单的执行计划。希望它还能减少 DB 命中数。

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;

【讨论】:

  • 谢谢,我会尝试并提供反馈。
猜你喜欢
  • 1970-01-01
  • 2020-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-04
  • 1970-01-01
相关资源
最近更新 更多