首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >图数据库技术:发现同余度

图数据库技术:发现同余度
EN

Stack Overflow用户
提问于 2014-03-25 23:45:34
回答 2查看 126关注 0票数 2

假设我们有一个由10万人组成的集合,每个人都有一个属性列表,例如:

代码语言:javascript
复制
height: "between 130 and 140 cm"
eyecolor: "blue"
age_rangee: "16-18"
favorite_music_type: "jazz"
home_city: "NYC"
owns_a_boat: "no"
preferred_flower: "hyacinth"
bathing_frequency_per_month: 60
car_type: "minivan"
house_type: "apartment"
wears_jeans: "often"
wears_sandals: "never"
wears_boots: "sometimes"

属性的集合可能因人而异。属性的数量可以改变,属性的类型可能会改变。当然,属性的值可以是change.However,给定一个人,我们假设他的属性与我们集合中的一些人有一些重叠。

我的问题是:“在图形数据库中表示这些不同属性的最佳方式是什么,这样我就可以最快速地选择一组人,其中50人的属性与特定个体的属性最相似,并将它们从最佳匹配到最差匹配。”

谢谢肯尼

在您的示例Cypher查询中,我是否理解每个功能节点都包含一个键: value对来标识属性及其对应的值?

这里有一个比较复杂的同余匹配问题。

假设我们有一个特征集(A,B,C,D,E,F),并且有10万人的偏好在某种程度上与这个偏好集相匹配。但是每个功能,不仅可能有偏好,而且可能没有偏好。

例如,莉娜的偏好是,(A,B,C,X,Y,Z),而罗伯特的偏好是,(A,B,C,_,_,),(其中underbar,(),表示任何选择都是可以的)

在偏好匹配方面,我们希望罗伯特的评分高于莉娜,因为虽然他和莉娜有相同的匹配偏好,但罗伯特有较少的错误匹配偏好。

下面是一个更具体的例子:

假设我们有10万人对汽车感兴趣,我们知道汽车的哪些特征对他们很重要。我们有,比方说,10辆车,有各种不同的功能,我们想选择一组,比如说,50人,他们想要的汽车功能与10辆车中的每辆最匹配。

有些人将没有偏好的子集,所有的汽车功能。例如,Lester对变速器没有偏好,无论是“自动”还是“手动”,都可以,而丽贝卡对“颜色”、“power_windows”和“power_door”没有偏好。任何颜色都可以,她不在乎汽车是否有电动车窗和门锁。

例如,这里有一辆具有定义的功能集的汽车

engine: '4cylinder' transmission: 'automatic' color: 'dark blue' size: 'subcompact' age: 'less than 4 years' power_windows: 'yes' power_door_locks: 'yes' average_gas_milage: 'greater than 30mpg'

这里我们有两个人,莱斯特和丽贝卡,他们指出了对他们很重要的特性:

莱斯特:engine: '4cylinder' color: 'dark blue' size: 'subcompact' age: 'less than 4 years' power_windows: 'yes' power_door_locks: 'yes' average_gas_milage: 'greater than 30mpg'

丽贝卡:engine: '4cylinder' transmission: 'automatic' size: 'subcompact' age: 'less than 4 years' average_gas_milage: 'greater than 30mpg'

那么,我们如何才能最好地选择和订购一组50人,他们的特征偏好与每辆车最匹配?在这种情况下,我们希望拥有最大匹配功能偏好的人排在第一位,但我们也希望包括那些对任何特定属性的值都很满意的人。

EN

回答 2

Stack Overflow用户

发布于 2014-03-26 01:52:57

问得好。首先,我建议您参加免费的在线培训课程,该课程巧妙地向您介绍了Neo4j和Cypher查询语言的基本概念:http://www.neo4j.org/training

您的问题是一个简单的数据建模练习,我很乐意带您完成。当您将数据建模为图时,类的某些属性或属性(例如person )可以表示为节点。

通过查看类person的一些示例数据,您当然会注意到属性值中的一些冗余。这些重叠允许我们通过共享属性选择该类和组结果。这在大多数数据库中相当容易做到。Neo4j允许您采取一组属于个人的任意特性,然后根据这些共享的特性选择所有类似的人。

代码语言:javascript
复制
MATCH (john:Person {name: "John Doe"})-[:HAS_FEATURE]->(feature),
      (feature)<-[:HAS_FEATURE]-(people)
WITH john, count(DISTINCT feature) as feature_count, people
RETURN john.name, people.name, feature_count
ORDER BY feature_count DESC

此查询找到一个名为John Doe的人以及属于他的所有特性。每个功能都是一个节点,它表示一个可归因于某个人的值。每个功能都是独特的,作为一个单一的节点,并将人聚在一起。

然后,查询查找与people共享feature的所有john。然后,在WITH子句中,查询计算john与每个人共享的特性。最后,查询返回john的名称、与他共享特征的人的姓名以及他们共享的特征数,然后由feature_count降序查询。

这将返回那些与John共享最多功能的人。

票数 0
EN

Stack Overflow用户

发布于 2014-04-02 06:43:48

还可以查看“火柴是新的热点”“与Neo4j相匹配”的博客文章,了解如何将节点的部分子图连接到彼此。

代码语言:javascript
复制
START me=node:users_index(name={user})
MATCH skills<-[:has]-me-[:lives_in]->city<-[:in_location]-job-[:requires]->requirements
WHERE me-[:has]->()<-[:requires]-job
WITH DISTINCT city.name AS city_name, 
   job.name AS job_name,
   LENGTH(me-[:has]->()<-[:requires]-job) AS matching_skills,
   LENGTH(job-[:requires]->()) AS job_requires,
   COLLECT(DISTINCT requirements.name) AS req_names, 
   COLLECT(DISTINCT skills.name) AS skill_names
RETURN city_name, job_name, 
FILTER(name IN req_names WHERE NOT name IN skill_names) AS missing
ORDER BY matching_skills / job_requires DESC, job_requires
LIMIT 10

代码语言:javascript
复制
START me=node:users_index(name={user})
MATCH me-[:lives_in]->city<-[:lives_in]-person
WHERE me.orientation = person.orientation AND
((me.gender <> person.gender AND me.orientation = "straight") OR
 (me.gender = person.gender AND me.orientation = "gay")) AND
  me-[:wants]->()<-[:has]-person AND
  me-[:has]->()<-[:wants]-person 
WITH DISTINCT city.name AS city_name, person, me
MATCH  me-[:wants]->attributes<-[:has]-person-[:wants]->requirements<-[:has]-me
RETURN city_name, person.name AS person_name,
   COLLECT(attributes.name) AS my_interests,
   COLLECT(requirements.name) AS their_interests,
   COUNT(attributes) AS matching_wants, 
  COUNT(requirements) AS matching_has
ORDER BY matching_wants / (1.0 / matching_has) DESC
LIMIT 10
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22648671

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档