【发布时间】:2021-10-23 23:40:47
【问题描述】:
我的网站有专门用于某些事件的页面,由 neo4j 中的节点表示。这些事件具有子事件,这些子事件是neo4j下的关系,对应于源页面到目标页面的链接。我目前有一个搜索引擎,可以突出显示搜索事件的链接,但它存在数据模型中的循环缺陷。实际上,如果此页面包含指向搜索事件的任何链接,它会突出显示所有包含对当前页面的循环引用的链接。
因此,目标是让查询能够标记与搜索事件相关的节点和关系,而不会仅仅因为循环关系而标记路径。
我创建了一个小型数据集,代表您可以使用此查询构建的问题:
CREATE
(r:Event:Searched {name:'R', tag:1}),
(d:Event:Searched {name:'D', tag:1}),
(o:Event {name:'O'}),
(a:Event {name:'A'}),
(b:Event {name:'B'}),
(c:Event {name:'C'}),
(e:Event {name:'E'}),
(o)-[:hasEvent]->(a),
(o)-[:hasEvent]->(e),
(o)-[:hasEvent]->(r),
(o)-[:hasEvent]->(c),
(a)-[:hasEvent]->(b),
(b)-[:hasEvent]->(o),
(c)-[:hasEvent]->(d)
这会产生以下图表:
我的目标是查询只获取节点 C 和 O,而不是 A 或 B,因为它们被标记的唯一原因是 O 已经被标记:
我需要修复的当前查询如下:
MATCH path=(upper:Event)-[:hasEvent*]->(source:Event:Searched)
RETURN upper
我希望你能帮助我,我无法让类似问题的答案适用于我的具体案例。
理想情况下,该解决方案不应该是计算密集型的,因为我的真实模型非常大(2.300.000 个节点和 9.500.000 个关系),并且搜索引擎中的当前索引已经很慢。
提前感谢您的帮助
【问题讨论】:
-
A 和 B 度是否低于 C 和 D?如果是这样,您只能过滤高度节点