您如何找到与文档匹配的最具体的"过滤器"?(确定用户适合的市场细分)

Chr*_*ini 6 tree graph filter 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)
Run Code Online (Sandbox Code Playgroud)

场景#1

用户来自加拿大平板电脑
结果:第1段

场景#2

来自美国纽约的用户在他的平板电脑上访问谷歌浏览器.结果:段#2,因为过滤器更具体地匹配用户(匹配国家,地区和平台)

场景#3

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

到目前为止工作

我想我可以把每个段加载到一个看起来像这样的图形数据库中

Country -> Region -> Platform --> OS -> Browser -> Segment
Run Code Online (Sandbox Code Playgroud)

每个节点都有一个值(例如:美国,Chrome,Firefox等)以及将其链接到树中它下面的任何节点的关系(Country -> Browser可以,Browser -> Country不是)或为空("全部匹配").

每个关系(由表示->)也将存储用于解决关系的权重.来自全能节点的关系获得最大权重,因为它们总是会丢失到更具体的过滤器.

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

关系图

潜在的查询

所以现在我需要一个查询(也许neo4j可以这样做?),它执行以下操作:

  • 查找与用户具有相同值的顶级国家/地区节点或null
  • 浏览每个关系(按重量按升序排序)
  • 找到最长的路径,绑定到通过具有最低权重的关系连接的节点(如果关系在与null/catch-all节点的关系之间,空节点丢失)
  • 继续这个循环,直到我们找到一个段#

对于长篇文章我很抱歉,我很难通过文字解释我的内容.

我正在寻找什么

  • 我是在正确的道路上解决这个问题吗?
  • 有没有更好的方法来解决这个问题?
  • 什么是存储这些关系的最佳方式(图形数据库?)
  • 如何构建一个满足我想要的查询?

tl; dr:需要一种方便/高效的方法来查找图形中最长/最特定的路径,如数据结构.非常欢迎提出澄清或任何相关信息/文件/项目/阅读的评论

Sup*_*miu 1

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

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

我认为你应该这样存储国家节点:

(usa:Country{name: "USA", other attributes...})
Run Code Online (Sandbox Code Playgroud)

因此,您可以通过与国家/地区标签匹配来找到每个国家/地区,然后使用名称属性进行过滤以获取您要查找的国家/地区。

对于城市来说也是如此,您可以建立一个简单的关系来存储每个城市:

(usa:Country{ name: "USA"})-[:CONTAINS_CITY]->(n:City{name: "New York", other attributes...})
Run Code Online (Sandbox Code Playgroud)

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

要匹配与特定国家/地区相关的细分,您可以这样做(场景 #1 的示例):

Match (c:Country{name : "Canada"})-[*1..2]->(p:Platform{name : "Tablet"})-[*1..]->(s:Segment) return s
Run Code Online (Sandbox Code Playgroud)

然后您可以使用节点创建段并在它们之间创建关系,唯一的问题可能是在这种情况下:

  • 用户 1 在加拿大有一台平板电脑
  • 用户 2 在加拿大有一台使用 Chrome 的平板电脑

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