Chr*_*ini 6 tree graph filter neo4j graph-databases
想象一下,当用户来自某个人口统计/市场细分时,您可以设置操作.过滤器有点像图表,匹配国家,地区,平台,操作系统和浏览器.
默认情况下,您将匹配任何值(如果您指定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)
Run Code Online (Sandbox Code Playgroud)
用户来自加拿大的平板电脑
结果:第1段
来自美国纽约的用户在他的平板电脑上访问谷歌浏览器.结果:段#2,因为过滤器更具体地匹配用户(匹配国家,地区和平台)
来自德克萨斯州的用户从他的桌面访问
结果:段#4,与段#1的关系已解决,因为段#4仅匹配美国,因此更具体
我想我可以把每个段加载到一个看起来像这样的图形数据库中
Country -> Region -> Platform --> OS -> Browser -> Segment
Run Code Online (Sandbox Code Playgroud)
每个节点都有一个值(例如:美国,Chrome,Firefox等)以及将其链接到树中它下面的任何节点的关系(Country -> Browser
可以,Browser -> Country
不是)或为空("全部匹配").
每个关系(由表示->
)也将存储用于解决关系的权重.来自全能节点的关系获得最大权重,因为它们总是会丢失到更具体的过滤器.
所以现在我需要一个查询(也许neo4j可以这样做?),它执行以下操作:
对于长篇文章我很抱歉,我很难通过文字解释我的内容.
tl; dr:需要一种方便/高效的方法来查找图形中最长/最特定的路径,如数据结构.非常欢迎提出澄清或任何相关信息/文件/项目/阅读的评论
使用 Neo4j,您可以在关系中存储属性,例如:
(u1:User{name:"foo"})-[:FRIEND_WITH{since : "2015/01/01"}]->(u2:User{name:"bar"})
Run Code Online (Sandbox Code Playgroud)
我认为你应该这样存储国家节点:
(usa:Country{name: "USA", other attributes...})
Run Code Online (Sandbox Code Playgroud)
因此,您可以通过与国家/地区标签匹配来找到每个国家/地区,然后使用名称属性进行过滤以获取您要查找的国家/地区。
对于城市来说也是如此,您可以建立一个简单的关系来存储每个城市:
(usa:Country{ name: "USA"})-[:CONTAINS_CITY]->(n:City{name: "New York", other attributes...})
Run Code Online (Sandbox Code Playgroud)
然后你可以在城市后面添加平台等。
要匹配与特定国家/地区相关的细分,您可以这样做(场景 #1 的示例):
Match (c:Country{name : "Canada"})-[*1..2]->(p:Platform{name : "Tablet"})-[*1..]->(s:Segment) return s
Run Code Online (Sandbox Code Playgroud)
然后您可以使用节点创建段并在它们之间创建关系,唯一的问题可能是在这种情况下:
在这种情况下,由于关系 ([*1..]) 上的深度匹配,User1 可以与 User2 位于同一段上。解决方案是创建具有默认值的中间节点,例如,以防您没有浏览器信息。