2016-03-01 2 views
1

J'ai écrit une requête Cypher pour montrer la relation entre deux noeuds de film:Comment visualiser la relation entre deux nœuds dans Neo4j en utilisant d3.js?

MATCH (m1:Movie)-[r*1..2]-(m2:Movie) 
where m1.movieID = '1' AND m2.movieID = '2' 
RETURN r 
LIMIT 25 

retours de Il dans le navigateur Neo4j, ce qui est exactement ce que je veux créer dans d3.js. Finalement, les ID de film seront des paramètres, de sorte que les résultats seront différents pour chaque paire de films.

enter image description here

Je l'ai suivi Ruby Neo4j-core exemple seen here pour créer mon propre graphique, mais mon problème est que je ne peux pas RETURN noeuds communs entre les deux mouvements, i.e. Tag/Country nœuds.

Comment est-ce que je devrais résoudre ce problème? Dois-je créer une requête pour renvoyer les deux films, et une autre requête pour renvoyer les nœuds communs entre eux? Comment écrirais-je cette dernière requête? Je suis vraiment coincé sur la façon dont je peux visualiser cette relation ...

Répondre

2

Peut-être que vous devriez essayer de faire correspondre le chemin plutôt que les relations que vous êtes en ce moment. Quelque chose comme:

MATCH p=(m1:Movie { movieID: 1 })-[r*1..2]-(m2:Movie { movieID: 2 }) 
RETURN p; 

Vous pouvez ensuite utiliser collection functions sur l'objet chemin p faire tout ce que vous aimez avec elle. Par exemple, si vous souhaitez obtenir les nœuds internes, vous pouvez utiliser nodes(p) et supprimer simplement les premier et dernier nœuds (qui seraient m1 et m2) et obtenir les nœuds le long du chemin.

0

Vous pouvez retourner les films avec les relations:

MATCH (m1:Movie)-[r*1..2]-(m2:Movie) 
WHERE m1.movieID = '1' AND m2.movieID = '2' 
RETURN m1, m2, r 
LIMIT 25 

Bien que cela pourrait vous donner les doubles emplois. Si vous allez afficher ceci avec D3, ce que vous voulez, c'est probablement toutes les relations impliquées et leurs nœuds de début et de fin. Pour ce faire, vous pouvez faire:

MATCH (m1:Movie)-[rels*1..2]-(m2:Movie) 
WHERE m1.movieID = '1' AND m2.movieID = '2' 
RETURN rels 
UNWIND rels AS r 
WITH DISTINCT r AS rel 
WITH startnode(rel) AS startnode, endnode(rel) AS endnode, rel 
LIMIT 25 

Généralement ce que vous voulez obtenir est une collection de nœuds et de relations impliqués. Ainsi, avec le résultat de cette requête, vous pourriez faire:

result = neo4j_session.query(query_string) 

data = {nodes: [], relationships: []} 
result.each do |row| 
    data[:nodes] << row.startnode 
    data[:nodes] << row.endnode 
    data[:relationships] << row.rel 
end 

data[:nodes].uniq! 
+0

Pour 'data [: relations]' ne auriez-vous pas besoin de la source et du noeud cible? Est-ce que 'row.rel' ne renverra pas seulement la propriété de relation (si elle existe)? – f7n

+0

'rel' renvoie l'objet de relation (si vous êtes en mode serveur qui sera un objet' CypherRelationship') qui devrait avoir les méthodes 'start_node_neo_id' et' end_node_neo_id' –