您将如何找到与文档匹配的最具体的 "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 可以做到这一点?):
- 查找与用户或null值相同的顶级国家节点
- 遍历每个关系(按权重升序排序)
- 找到最长的路径,连接到由权重最低的关系连接的节点(如果连接在与 null/catch-all 节点的关系之间,则空节点丢失)
- 继续这个循环直到我们找到一个段#
很抱歉这么长 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 在同一段上。解决方案是创建具有默认值的中间节点,以防万一您没有浏览器信息。
假设您设置了用户来自某个 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 可以做到这一点?):
- 查找与用户或null值相同的顶级国家节点
- 遍历每个关系(按权重升序排序)
- 找到最长的路径,连接到由权重最低的关系连接的节点(如果连接在与 null/catch-all 节点的关系之间,则空节点丢失)
- 继续这个循环直到我们找到一个段#
很抱歉这么长 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 在同一段上。解决方案是创建具有默认值的中间节点,以防万一您没有浏览器信息。