Graph 您会如何找到最具体的;“过滤器”;与文档匹配吗?(确定用户适合哪个细分市场)

Graph 您会如何找到最具体的;“过滤器”;与文档匹配吗?(确定用户适合哪个细分市场),graph,filter,tree,neo4j,graph-databases,Graph,Filter,Tree,Neo4j,Graph Databases,想象一下,当用户来自某个人口统计/市场细分市场时,您已经设置了相应的操作。过滤器的工作原理有点像一个图表,匹配国家、地区、平台、操作系统和浏览器 默认情况下,您将匹配任何值(如果您指定我们,则您将匹配来自美国的所有用户,而不考虑地区、平台、操作系统或浏览器) 如果为筛选器的任何属性指定多个值,则其工作方式类似于OR(可以是您指定的任何值),要使筛选器匹配所有属性,必须至少有一个匹配项或为空(全部接受),基本上是AND操作 因此,我们可以: Segment #1: Countries: Unite

想象一下,当用户来自某个人口统计/市场细分市场时,您已经设置了相应的操作。过滤器的工作原理有点像一个图表,匹配国家、地区、平台、操作系统和浏览器

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

如果为筛选器的任何属性指定多个值,则其工作方式类似于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 来自美国纽约的用户通过其平板电脑上的谷歌浏览器进行访问。
结果:分段#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在加拿大有一款平板电脑,使用 铬
在这种情况下,由于关系([*1..])上的深度匹配,User1可以与User2位于同一段上。解决方案是使用默认值创建中间节点,例如,如果没有浏览器信息

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