假设我们有一个由10万人组成的集合,每个人都有一个属性列表,例如:
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人,他们的特征偏好与每辆车最匹配?在这种情况下,我们希望拥有最大匹配功能偏好的人排在第一位,但我们也希望包括那些对任何特定属性的值都很满意的人。
发布于 2014-03-26 01:52:57
问得好。首先,我建议您参加免费的在线培训课程,该课程巧妙地向您介绍了Neo4j和Cypher查询语言的基本概念:http://www.neo4j.org/training。
您的问题是一个简单的数据建模练习,我很乐意带您完成。当您将数据建模为图时,类的某些属性或属性(例如person )可以表示为节点。
通过查看类person的一些示例数据,您当然会注意到属性值中的一些冗余。这些重叠允许我们通过共享属性选择该类和组结果。这在大多数数据库中相当容易做到。Neo4j允许您采取一组属于个人的任意特性,然后根据这些共享的特性选择所有类似的人。
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共享最多功能的人。
发布于 2014-04-02 06:43:48
还可以查看“火柴是新的热点”和“与Neo4j相匹配”的博客文章,了解如何将节点的部分子图连接到彼此。
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和
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 10https://stackoverflow.com/questions/22648671
复制相似问题