2016-04-08 64 views
1

我的数据库包含酒店,酒店评论,评论和主题中的术语(即单词)(例如,可能有一个话题“Staff”,其中包含描述酒店员工的术语)作为节点。所有节点上的索引都存在。关系如下:酒店< - 评论 - >期限 - >主题在neo4j中处理长路径模式

我目前正试图找到一种有效的方式来查询有两个或多个指定酒店路径的主题。换句话说,我对两家酒店的共同话题感兴趣。如果酒店A的路径为主题1,2,3,酒店B的路径为主题2,3,4,则结果应为2,3。

我尝试了以下内容,但这看起来非常低效,这很可能是由于酒店和主题之间的可能路径数量所致。基本上,评论中的每个单词都可能会创建一个必须检查的新路径。

// show all topics that two hotels have in common 
MATCH (h2:Hotel)<--(r2:Review)-->(t2:Term)-->(to:Topic)<--(t1:Term)<--(r1:Review)-->(h1:Hotel) 
WHERE h1.id IN ["id1","id2"] AND h2.id IN ["id1","id2"] AND NOT h1.id=h2.id 
RETURN h1.id,to.topic, count(to) AS topic_mentions 

我想知道是否有处理这种更快的方式,如果我要实现这个Java或类似语言的我可能会尝试做一个BFS开始在每一家酒店,然后走的重叠什么我发现。我相当肯定,将传递边添加为直接边缘酒店 - >主题会加快速度,但是我有限的数据库设计知识告诉我这可能是不必要的冗余,而不是一个好习惯?

我试图在与另一个MATCH和WITH子句进行模式匹配之前做id匹配,但是这没有加速任何事情;我认为问题真的在于模式匹配本身。

回答

1

我为搜索KB创建了类似的内容,酒店和主题之间的直接关系将使搜索变得简单,而且速度会更快。例如,你用普通不止一个酒店的所有主题的搜索,你会使用:

MATCH (h1:Hotel)-[:TOPIC]->(t:Topic) 
MATCH (h2:Hotel)-[:TOPIC]->(t:Topic) 
WHERE h1 <> h2 
RETURN h1.id, h2.id, t.topic, count(t) AS topic_mentions 

注意,这将返回所有主题这两家酒店的共同点,这可能是一个计数可能不是你想要的。

我相当肯定,直接边加入边传递酒店 - 主题将加快这,但我有限的数据库设计 知识告诉我,这可能是不必要的冗余,而不是一个 好的做法呢?

所有这些将会使隐式关系显式化,这是使图形数据库如此强大的一件事情。维护方面需要关注 - 即如果有人更新了评论中的单词,那么您必须确保(酒店) - [:主题] - >(主题)关系仍然有效 - 但是您会无论如何都必须在原来的设计中做到这一点,所以不会有任何损失。