想象一下,当用户来自某个人口统计/分割市场时,您设置了操作。过滤器的工作方式有点像图表,匹配国家、地区、平台、操作系统和浏览器。
默认情况下,您将匹配任何值(如果指定 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
不行)或者为空(“匹配全部”)。每个关系(由
->
表示)还将存储用于解决关系的权重。来自包罗万象的节点的关系获得最大权重,因为它们总是会输给更具体的过滤器。示例数据库(线上的数字是权重,较低的权重成为首选路径)
潜在查询
所以现在我需要一个查询(也许 neo4j 可以做到这一点?),它执行以下操作:
很抱歉这篇长文,很难通过文字解释我的意思。
我在寻找什么
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
然后您可以使用节点创建您的段并在它们之间创建关系,唯一的问题可能是这种情况:
Chrome
在这种情况下,由于关系 ([*1..]) 上的深度匹配,User1 可以与 User2 在同一段上。解决方案是使用默认值创建中间节点,以防您没有浏览器信息。
关于graph - 您如何找到与文档匹配的最具体的 "filter"? (确定用户适合的分割市场),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31495730/