如何比较(子)网?

时间:2013-10-19 21:16:40

标签: algorithm neo4j

为了这个问题,我们可以说有几千个城市的网络和一百万与他们访问过的城市相关的旅行者。平均每个旅行者都访问过50个城市,但极端情况可达1000个。

1)第一个(简单)问题是如何根据所访问城市之间的相似性为特定旅行者找到最相似旅行者的列表?即我们有3位访问过这些城市的旅行者:

A:西雅图(WA),巴尔的摩(MD),达拉斯(德克萨斯州) B:波特兰(OR),DC,奥斯汀(德克萨斯州) C:西雅图(WA),波特兰(OR),DC,巴尔的摩(MD)

如果我们现在比较访问过的城市,那么对于旅行者A,最相似的将是旅行者C.

因为对于每个旅行者而言,有人参与的城市的子网基本上是直接连接节点的列表,即使没有Cypher,也不容易进行比较(不确定是否有通过Cypher进行优雅的方式)。

2)更复杂的比较情景不是通过直接城市,而是它们的特征(州,国家,气候,人口,景点类型等)。在我们的例子中,每个城市都与一个与领土相关的国家相关联。如果我们根据地区寻找A最相似的旅行者,那么旅行者B就是赢家(尽管在城市一级有零匹配)。

您对这两个问题有何看法?

2 个答案:

答案 0 :(得分:0)

那么, 我想你会用Java或任何其他JVM语言编写自己的算法来对抗hte neo4j Java API,并将它暴露给世界,例如:使用neo4j服务器插件,请参阅http://docs.neo4j.org/chunked/milestone/server-plugins.html

有很多资源可以帮助您开始编写这些算法,您可以查看neo4j图算法的实现,请参阅https://github.com/neo4j/neo4j/tree/master/community/graph-algo

答案 1 :(得分:0)

如果您真的想要一个图表方法来解决这个问题,我建议将城市的属性作为节点,并将城市链接到节点。

因此,你会有以下几点:

(user)-[:visited]->(city)-[:has_property]->(property #i)

您可以根据相同属性的链接数量轻松找到类似城市。

你的查询只是一个基本的建议,可以用cypher实现,沿着这些行(未经过测试,但你应该明白这一点):

start A=node:users("")
match A-[:visited]->()-[:has_properties]->p
with distinct p as p
match p<-[r:has_properties]-cities
with distinct cities, count(r) as sim_score
order by sim_score desc limit 10
match cities<-[r:visited]-similar
return count(r) as score, similar
order by score desc limit 5

它分三步进行:

  • 获取用户A访问过的城市的属性(“特征提取”部分)
  • 然后从功能,获得最相似的城市
  • 最后检索具有相同“个人资料”的类似用户

对于性能问题,您可以离线计算城市相似度,因为它不应经常变化,并且只关注用户相似性的“实时”,这是不太可预测的。

另外,不要忘记为服务器安装足够的内存;)