সম্পর্ক উপস্থিত না থাকলে নোড রিটার্ন করুন


90

আমি সাইফার ব্যবহার করে এমন একটি ক্যোয়ারী তৈরির চেষ্টা করছি যা কোনও শেফের কাছে থাকা অনুপস্থিত উপাদানগুলি "সন্ধান" করবে, আমার গ্রাফটি এভাবে সেট আপ করা হয়েছে:

(ingredient_value)-[:is_part_of]->(ingredient)

(ingredient)নামের একটি কী / মান থাকবে = "রঙ্গিন রং"। (ingredient_value)একটি মান / কী মানের মান হতে পারে = "লাল" এবং "এর" অংশ (ingredient, name="dye colors")

(chef)-[:has_value]->(ingredient_value)<-[:requires_value]-(recipe)-[:requires_ingredient]->(ingredient)

আমি এই ক্যোয়ারীটি সমস্ত ingredientsরেখার জন্য, তবে তাদের আসল মানগুলির জন্য ব্যবহার করছি না, যে কোনও রেসিপিটির প্রয়োজন হয়, তবে আমি চাই ingredientsযে প্রতি রান্নার জন্য প্রয়োজনীয় সমস্ত উপাদানগুলির পরিবর্তে কেবল শেফের কাছে এটির ফিরতে হবে না। আমি চেষ্টা করেছিলাম

(chef)-[:has_value]->(ingredient_value)<-[:requires_value]-(recipe)-[:requires_ingredient]->(ingredient)<-[:has_ingredient*0..0]-chef

কিন্তু এটি কিছুই ফেরেনি।

এটি কি এমন কিছু যা সাইফার / নিও 4 জ দ্বারা সম্পাদন করা যেতে পারে বা এটি এমন কিছু যা সমস্ত উপাদান ফেরত দিয়ে নিজেই পরিচালনা করা হয় এবং সেগুলি নিজেই আমার দ্বারা সাজানো হয়?

বোনাস: একটি শেফের একটি রেসিপি প্রয়োজন এমন সমস্ত মানের সাথে শেফের সমস্ত মান মেলে একটি উপায়ও রয়েছে। এখন পর্যন্ত আমি কেবলমাত্র সমস্ত আংশিক ম্যাচ ফিরে পেয়েছি যা এ দ্বারা ফিরে আসে chef-[:has_value]->ingredient_value<-[:requires_value]-recipeএবং ফলাফলগুলিকে নিজেই একত্রিত করে।



ভবিষ্যতের ব্যবহারকারীদের জন্য; আরও তথ্যের জন্য existsএকটি WHEREধারা (এটিও তুচ্ছ-তাও ) ব্যবহার করতে পারেন , neo4j.com/developer/subqueries/#existential-susqueries
ওজনমুয়েজ

উত্তর:


159

01/10/2013 আপডেট করুন:

Neo4j 2.0 রেফারেন্সে এটি জুড়ে এসেছিল :

Alচ্ছিক সম্পর্ক ব্যবহার না করার চেষ্টা করুন। সর্বোপরি,

এগুলি তাদের মতো ব্যবহার করবেন না:

MATCH a-[r?:LOVES]->() WHERE r IS NULL যেখানে আপনি কেবল নিশ্চিত হন যে তাদের অস্তিত্ব নেই।

পরিবর্তে এটি এর মতো করুন:

MATCH a WHERE NOT (a)-[:LOVES]->()

সম্পর্কের অস্তিত্ব নেই কিনা তা পরীক্ষা করার জন্য সাইফার ব্যবহার:

...
MATCH source-[r?:someType]-target
WHERE r is null
RETURN source

দ্য ? চিহ্ন সম্পর্কটিকে alচ্ছিক করে তোলে।

বা

নিও 4 জ 2 এ:

...
OPTIONAL MATCH source-[r:someType]-target
WHERE r is null
RETURN source

এখন আপনি অ-বিদ্যমান (নাল) সম্পর্কের জন্য পরীক্ষা করতে পারেন।


4
Neo4j 2.0 এ, Inচ্ছিক সম্পর্কের সাথে মেলে তুলতে অপ্টিক্যাল ম্যাচটি ব্যবহার করুন, উদাহরণস্বরূপ প্রথম উদাহরণটি দেখতে পাবেন বিকল্প বিকল্প (উত্স) - [r: কিছু টাইপ] - (টার্গেট) রিটার্ন উত্স, আর
বগল

আমি যেখানে লেবেল নোড রাখার চেষ্টা করছি যেখানে এটি কার্যকর হয় না। পছন্দ: একটি 'যেখানে ক' না (ক) - [: প্রেমগুলি] -> (অপরিচিত) এর সাথে মিল দিন, এটি 'অপরিচিত' একটি নোড লেবেল। আমি নিও ৪ জে সংস্করণ ২.১.২ ব্যবহার করছি
কৃষ্ণ শেঠি

4
কোনও বিষয় নয়, আমি বুঝতে পেরেছি কেন আপনি এই উত্তরটিতে পৌঁছানোর জন্য অগ্রগতিটি প্রদর্শন করতে চান: একটি যেখানে
মেলে

4
MATCH a...উদাহরণস্বরূপ এখন হওয়া উচিতMATCH (a) WHERE NOT (a)-[:LOVES]->()
লিয়াম

4
@ গিল-স্টাল আমি কেন এই প্রশ্নের সাথে নোড নামটি ব্যবহার করতে পারি না। যেখানে (ক) নয় - [: প্রেমগুলি] -> (বি: সামারবেল) সাথে মেলাও। আমি যদি নোড নাম ব্যবহার না করি তবে এটি কার্যকর হয়।
iit2011081

16

কোনও সম্পর্ক নয় নোড আনার জন্য

সম্পর্কের উপস্থিতি আছে কিনা তা যাচাই করার জন্য এটিই ভাল বিকল্প

MATCH (player)
    WHERE NOT(player)-[:played]->()
    RETURN player

আপনি এটির জন্য একাধিক শর্তাদিও পরীক্ষা করতে পারেন এটি সমস্ত নোডকে ফিরিয়ে দেবে, যা "খেলা" বা "নাটকযুক্ত" সম্পর্কযুক্ত নয়।

MATCH (player) 
 WHERE NOT (player)-[:played|notPlayed]->()
 RETURN player

কোনও রিলেশনশিপ নেই এমন নোডগুলি আনতে

MATCH (player) 
WHERE NOT (player)-[r]-()
RETURN player

এটি নোডের কোনও আগমন / বহির্গামী সম্পর্ক না থাকার বিষয়টি পরীক্ষা করবে।


4
MATCH (player) WHERE NOT (player)-[r]-() RETURN playerচলক r সংজ্ঞায়িত ত্রুটি দেয় । আমি কীভাবে সংজ্ঞা দিতে পারি?
চথুরা উইজেউইরা

এটি ঠিক করতে, হয় একটি সম্পর্ক নির্দিষ্ট করুন (উদাঃ (player -[:rel]- ()) বা কোনও সম্পর্কের জন্য খালি ছেড়ে দিন(player -[]- ()
আরচেমার

MATCH (player) WHERE NOT (player)-[]-() RETURN player- এটি দুর্দান্ত কাজ করে
প্রশান্ত তেরাালা

আপনার প্রথম প্রশ্নটি আসলে ভুল। ম্যাচ প্যাটার্ন নিজেই সর্বদা কেবল বিদ্যমান সম্পর্কগুলি ফিরিয়ে দেয়, যার মধ্যে কোনওটিই শুভ নয়। সুতরাং আপনার WHERE লাইন থেকে ফিল্টার করার কিছুই নেই।
ক্রিস্টি এস।

@ ক্রিশটিস আমাকে জানতে দেওয়ার জন্য ধন্যবাদ। এটি যে ক্যোয়ারীটি কাজ করা উচিত তা আপডেট করেছি
সতীশ শিন্ডে

8

আপনার যদি "শর্তসাপেক্ষে বাদ দিন" অর্থপূর্ণ প্রয়োজন হয় তবে আপনি এটিকে এটি অর্জন করতে পারেন।

Neo4j 2.2.1 হিসাবে, আপনি ক্লজটি ব্যবহার করতে পারেন OPTIONAL MATCHএবং তুলনাহীন ফিল্টার করতে পারেন (NULL ) নোডগুলি ।

এবং ধারাগুলির WITHমধ্যে ধারাটি ব্যবহার করাও গুরুত্বপূর্ণ , যাতে প্রথমটি matchচ্ছিক ম্যাচের জন্য একটি শর্তটি নির্ধারণ করে এবং দ্বিতীয়টিOPTIONAL MATCHWHEREWHEREWHERE ফিল্টারটির মতো আচরণ করে।

ধরে নিচ্ছি আমাদের কাছে 2 প্রকারের নোড রয়েছে: Personএবং Communication। যদি আমি এমন সমস্ত ব্যক্তিদের পেতে চাই যা টেলিফোনে কখনও যোগাযোগ করেনি, তবে অন্য উপায়ে যোগাযোগও করতে পেরেছি, তবে আমি এই প্রশ্নটি করব:

MATCH (p: Person) 
OPTIONAL MATCH p--(c: Communication) 
WHERE c.way = 'telephone'
WITH p, c 
WHERE c IS NULL 
RETURN p

মিল ধরণ তাদের যোগাযোগ রয়েছে এমন সব ব্যক্তি যেখানে ম্যাচ হবে cহবে NULLঅ টেলিফোন কমিউনিকেশনস জন্য। তারপরে ফিল্টার ( WHEREপরে)WITH ) টেলিফোন যোগাযোগগুলি সমস্ত অন্যকে রেখে ফিল্টার করে দেবে।

তথ্যসূত্র:

http://neo4j.com/docs/stable/query-optional-match.html#_intr پيداوار_3 http://java.dzone.com/articles/new-neo4j-tiontional


2

আমি সাইফার ২.০ ব্যবহার করে কীভাবে প্রাকৃতিকভাবে এটি করা যায় তা দেখিয়ে একটি সংক্ষেপ লিখেছিলাম

http://gist.neo4j.org/?9171581

মূল বিষয়টি হ'ল উপলভ্য উপাদানগুলির সাথে alচ্ছিক মিলটি ব্যবহার করা এবং তারপরে ভুল মূল্য সহ উপাদানগুলি বা গায়েব (নাল) উপাদানগুলির জন্য ফিল্টারের সাথে তুলনা করা।

মনে রাখবেন যে ধারণাটি ঘোষণামূলক এবং কোনও অ্যালগরিদম বর্ণনা করার দরকার নেই, আপনার যা প্রয়োজন তা কেবল লিখে দিন।


2

গ্রিমলিন ব্যবহার করে আমি এই কাজটি শেষ করেছি। আমি করেছিলাম

x=[]

g.idx('Chef')[[name:'chef1']].as('chef')
.out('has_ingredient').as('alreadyHas').aggregate(x).back('chef')
.out('has_value').as('values')
.in('requires_value').as('recipes')
.out('requires_ingredient').as('ingredients').except(x).path()

এটি সমস্ত নিখোঁজ উপাদানের পাথ ফিরে পেয়েছে। আমি সাইফার ভাষায় এটি কমপক্ষে 1.7 সংস্করণের জন্য তৈরি করতে পারিনি 7


2

শেষ ক্যোয়ারীটি হওয়া উচিত:

START chef = node(..)
MATCH (chef)-[:has_value]->(ingredient_value)<-[:requires_value]-(recipe)-[:requires_ingredient]->(ingredient)
WHERE (ingredient)<-[:has_ingredient]-chef
RETURN ingredient

এই প্যাটার্ন: (ingredient)<-[:has_ingredient*0..0]-chef

কারণ এটি কিছুই ফেরত না। *0..0এর অর্থ এই যে সম্পর্কের দৈর্ঘ্য অবশ্যই শূন্য হতে হবে যার অর্থ উপাদান এবং শেফের অবশ্যই একই নোড হওয়া উচিত যা তারা নয়।


হ্যাঁ, তবে এটি পছন্দসই উপাদানটি ফিরিয়ে দেয় না। এটি শেফের রেসিপিটির সাথে ইতিমধ্যে যে জিনিস রয়েছে তা ফিরিয়ে দেয়, আমি পার্থক্যটি জানতে চাই।
নিকোলাস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.