2015-11-25 30 views
1

更具體的屬性值的列表,節點關係的所有節點,我想做到以下幾點(使用節點/ JS,如果這是有幫助的):的Neo4j - 查找具有相匹配x長

假設你有3個工作標準('JavaScript','PHP','MySQL')的列表。

我有一個圖形設置,其中每個Person節點可以連接到許多Skill節點。我希望能夠運行一個查詢,該查詢將返回至少連接到查詢中指定的所有技能節點的所有Person節點,然後按每個用戶有多少正面連接進行排序。如果作業標準是變量,那麼使這個查詢最有效的方法是什麼?

這是我到目前爲止。再次,這個工程,但我如何使OR陳述變量?

MATCH (n:Persons)-[r:KNOWS]-(x:Skill) WHERE x.name = 'PHP' OR x.name = 'JavaScript' OR x.name = 'MySql' RETURN DISTINCT n COUNT(n) ORDER BY COUNT(n) DESC

回答

3

您可以使用IN運算符來測試值是否與列表中的值匹配。

MATCH (n:Persons)-[:KNOWS]-(x:Skill) 
WHERE x.name IN ['PHP', 'JavaScript', 'MySql'] 
RETURN n, COUNT(x) AS nSkills 
ORDER BY nSkills DESC; 

由於返回子句使用過nCOUNT()功能aggregate,它是多餘的使用DISTINCT n,所以查詢忽略DISTINCT

注意:爲了提高效率,您應該將該列表作爲parameter來傳遞。例如,如果needed_skills是含技能列表中的參數,查詢將如下所示:(清單參數的Here is another example

MATCH (n:Persons)-[:KNOWS]-(x:Skill) 
WHERE x.name IN {needed_skills} 
RETURN n, COUNT(x) AS nSkills 
ORDER BY nSkills DESC; 

0

我不明白你所說的「使OR聲明一個變量」的意思,但你可以使用ORDER BYCOUNT實現,另一部分

MATCH (n:Persons)-[r:KNOWS]-(x:Skill) 
WHERE x.name = 'PHP' OR x.name = 'JavaScript' OR x.name = 'MySql' 
RETURN DISTINCT n, COUNT(r) 
ORDER BY COUNT(r) DESC 

您使用計數計數(n),所以它不包括他們擁有的技能數量。一旦計數完成,你只需要點菜,就像你已經做過的那樣。