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

How would you find the most specific "filter" that matches a document? (determining which market segment a user fits in)

假设您设置了用户来自某个 demographic/market 细分市场时的操作。过滤器的工作方式有点像图表,匹配国家、地区、平台、操作系统和浏览器。

默认情况下,您将匹配任何值(如果您指定美国,您将匹配来自美国的所有用户,而不考虑地区、平台、OS 或浏览器)

如果您为过滤器的任何 属性 指定多个值,它的工作方式类似于 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

每个节点都有一个值(例如:美国、Chrome、Firefox 等)和 link 它与树中它下面的任何节点的关系(Country -> Browser没关系,Browser -> Country 不是) 或为空 ("match all")。

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

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

潜在查询

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

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

我在找什么

tl;dr:需要一种方法 decent/performant 在图形数据结构中找到 longest/most 特定路径。非常欢迎要求澄清或任何相关 information/documentation/projects/reading 的评论

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

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

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

(usa:Country{name: "USA", other attributes...})

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

城市也一样,你可以做一个简单的关系来存储每个城市:

(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

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

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

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