Graph 您会如何找到最具体的;“过滤器”;与文档匹配吗?(确定用户适合哪个细分市场)
想象一下,当用户来自某个人口统计/市场细分市场时,您已经设置了相应的操作。过滤器的工作原理有点像一个图表,匹配国家、地区、平台、操作系统和浏览器 默认情况下,您将匹配任何值(如果您指定我们,则您将匹配来自美国的所有用户,而不考虑地区、平台、操作系统或浏览器) 如果为筛选器的任何属性指定多个值,则其工作方式类似于OR(可以是您指定的任何值),要使筛选器匹配所有属性,必须至少有一个匹配项或为空(全部接受),基本上是AND操作 因此,我们可以:Graph 您会如何找到最具体的;“过滤器”;与文档匹配吗?(确定用户适合哪个细分市场),graph,filter,tree,neo4j,graph-databases,Graph,Filter,Tree,Neo4j,Graph Databases,想象一下,当用户来自某个人口统计/市场细分市场时,您已经设置了相应的操作。过滤器的工作原理有点像一个图表,匹配国家、地区、平台、操作系统和浏览器 默认情况下,您将匹配任何值(如果您指定我们,则您将匹配来自美国的所有用户,而不考虑地区、平台、操作系统或浏览器) 如果为筛选器的任何属性指定多个值,则其工作方式类似于OR(可以是您指定的任何值),要使筛选器匹配所有属性,必须至少有一个匹配项或为空(全部接受),基本上是AND操作 因此,我们可以: Segment #1: Countries: Unite
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 来自美国纽约的用户通过其平板电脑上的谷歌浏览器进行访问。
结果:分段#2,因为过滤器更具体地匹配用户(匹配国家、地区和平台) 情景3 来自德克萨斯州的用户从其桌面访问
结果:第4段与第1段的匹配问题已解决,因为第4段仅与美国匹配,因此更具体 工作至今 我在想我可以把每个片段加载到一个类似这样的图形数据库中
Country -> Region -> Platform --> OS -> Browser -> Segment
每个节点都有一个值(例如:美国、Chrome、Firefox等)和将其链接到树中其下任何节点的关系(国家/地区->浏览器
正常,浏览器->国家/地区
不正常),或者为空(“全部匹配”)
每个关系(由->
表示)还将存储用于解析关系的权重。来自“全部捕获”节点的关系将获得最大权重,因为它们将始终丢失到更特定的筛选器
示例数据库(行上的数字表示权重,较低的权重表示首选路径)
潜在疑问
因此,现在我需要一个查询(也许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 label来查找每个国家,然后使用name属性进行筛选以获得您要查找的国家
对于城市也一样,您可以建立一个简单的关系来存储每个城市:
(usa:Country{ name: "USA"})-[:CONTAINS_CITY]->(n:City{name: "New York", other attributes...})
然后你可以在城市后面添加平台等
要匹配与某个国家/地区相关的细分市场,您可以这样做(场景1的示例):
然后,您可以使用节点创建线段并在它们之间创建关系,唯一的问题可能是在这种情况下:
- User1在加拿大有一台平板电脑
- User2在加拿大有一款平板电脑,使用 铬
Match (c:Country{name : "Canada"})-[*1..2]->(p:Platform{name : "Tablet"})-[*1..]->(s:Segment) return s