graph - 您如何找到与文档匹配的最具体的 "filter"? (确定用户适合的分割市场)

标签 graph filter tree neo4j graph-databases

想象一下,当用户来自某个人口统计/分割市场时,您设置了操作。过滤器的工作方式有点像图表,匹配国家、地区、平台、操作系统和浏览器。

默认情况下,您将匹配任何值(如果指定 US,则匹配来自美国的所有用户,无论区域、平台、操作系统或浏览器如何)

如果您为过滤器的任何属性指定多个值,它的工作方式类似于 OR(可以是您指定的任何值),过滤器要匹配所有属性必须至少有一个匹配项或为空(接受所有),本质上AND 操作。

所以我们可以有:

Segment #1:
Countries: United States, Canada

Segment #2:
Countries: United States
Regions: New York
Platform: Tablets

Segment #3
Countries: United States
Browser: Chrome

Segment #4
Countries: United States

Segment #5
  Match all (all filters left empty)

情景#1

来自加拿大的用户在他的平板电脑上
结果 : 段#1

情景#2

来自美国纽约的用户在其平板电脑上通过 Google Chrome 访问。
结果:段 #2,因为过滤器更具体地匹配用户(匹配国家、地区和平台)

场景#3

来自德克萨斯州的用户从他的桌面访问
结果:第 4 段,与第 1 段的平局已解决,因为第 4 段仅匹配美国,因此更具体

工作至今

我在想我可以把每个片段加载到一个看起来像这样的图形数据库中
Country -> Region -> Platform --> OS -> Browser -> Segment

每个节点要么有一个值(例如:United States、Chrome、Firefox 等)和将它链接到树中它下面的任何节点的关系(Country -> Browser 可以,Browser -> Country 不行)或者为空(“匹配全部”)。

每个关系(由 -> 表示)还将存储用于解决关系的权重。来自包罗万象的节点的关系获得最大权重,因为它们总是会输给更具体的过滤器。

示例数据库(线上的数字是权重,较低的权重成为首选路径)

relationship map

潜在查询

所以现在我需要一个查询(也许 neo4j 可以做到这一点?),它执行以下操作:
  • 查找与用户具有相同值或为空的顶级国家节点
  • 遍历每个关系(按权重升序排序)
  • 找到最长的路径,连接到由权重最低的关系连接的节点(如果关系在与 null/catch-all 节点的关系之间,则 null 节点丢失)
  • 继续这个循环,直到我们找到一个片段#

  • 很抱歉这篇长文,很难通过文字解释我的意思。

    我在寻找什么
  • 我在解决这个问题的正确道路上吗?
  • 有没有更好的方法来解决这个问题?
  • 存储这些关系的最佳方式是什么(图形数据库?)
  • 我怎样才能建立一个做我想要的查询?

  • tl; dr:需要一种体面/高性能的方式来在类似数据结构的图中找到最长/最具体的路径。非常欢迎提出要求澄清或任何相关信息/文档/项目/阅读的评论

    最佳答案

    使用 Neo4j,您可以将属性存储在关系中,例如:

    (u1:User{name:"foo"})-[:FRIEND_WITH{since : "2015/01/01"}]->(u2:User{name:"bar"})
    

    我认为您应该以这种方式存储国家/地区节点:
    (usa:Country{name: "USA", other attributes...})
    

    因此,您可以通过匹配 Country 标签找到每个国家/地区,然后使用 name 属性进行过滤以获取您正在寻找的国家。

    城市也是一样,你可以做一个简单的关系来存储每个城市:
    (usa:Country{ name: "USA"})-[:CONTAINS_CITY]->(n:City{name: "New York", other attributes...})
    

    然后你可以在城市之后添加平台等。

    要匹配与某个国家/地区相关的分割,您可以这样做(以场景 #1 为例):
    Match (c:Country{name : "Canada"})-[*1..2]->(p:Platform{name : "Tablet"})-[*1..]->(s:Segment) return s
    

    然后您可以使用节点创建您的段并在它们之间创建关系,唯一的问题可能是这种情况:
  • User1 在加拿大有一台平板电脑
  • User2 在加拿大有一台平板电脑,使用
    Chrome

  • 在这种情况下,由于关系 ([*1..]) 上的深度匹配,User1 可以与 User2 在同一段上。解决方案是使用默认值创建中间节点,以防您没有浏览器信息。

    关于graph - 您如何找到与文档匹配的最具体的 "filter"? (确定用户适合的分割市场),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31495730/

    相关文章:

    python - 根据给定的输入集实现 n 叉树

    java - 找到尽可能多的对

    scala - 用于生成图中所有拓扑排序的尾递归算法

    css - 最新 Safari 中的 SVG 过滤器

    javascript - 过滤对象数组的性能

    用于递归下降解析的 C++ n 元树实现

    haskell - Haskell 范围内二叉树的子树

    algorithm - 图形问题

    javascript - 如何使用javascript从数组中绘制折线图

    r - 基于 r 中的条件标准进行过滤