【问题标题】:Cypher: Avoid cycle in multiple relationship pathsCypher:避免在多个关系路径中循环
【发布时间】: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?如果是这样,您只能过滤高度节点

标签: neo4j cypher cycle


【解决方案1】:

您可以尝试apoc.path.expandConfig 程序。它有一个uniqueness 属性,您可以将其配置为一个节点不能被多次遍历。

MATCH (n:Event)
CALL apoc.path.expandConfig(n, {
    relationshipFilter: "hasEvent>",
    labelFilter: "/Searched",
    uniqueness: "NODE_GLOBAL"
}) YIELD path
RETURN [n IN nodes(path) WHERE NOT n:Searched] AS upper

但是,此查询仍将返回 A 和 B,因为使用 MATCH (n:Event) 您会从每个节点开始查找(无论 O 和 A 之间的关系如何)。但是,如果我对您的理解正确,您不想从所有节点开始,而是从特定节点开始(“专门用于某些事件的页面”)。因此,您可能希望从仅返回 O 和 C 的 MATCH (n:Event {name: "O"}) 开始。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多